diff --git a/.gitignore b/.gitignore index 5dc38c1c2..4e4d8652a 100644 --- a/.gitignore +++ b/.gitignore @@ -127,7 +127,8 @@ bdd/*-test-result.txt # pre-runner sample-package packages/pre-runner/sample-package/ - +packages/python-runner/tecemux/build/ +*.egg-info # sample packages *.tar.gz diff --git a/.vscode/settings.json b/.vscode/settings.json index c2e6effdb..fbc0848fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,5 +13,17 @@ "markdown", "latex", "plaintext" - ] + ], + "python.testing.pytestArgs": [ + "packages" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.linting.flake8Enabled": true, + "python.linting.enabled": true, + "flake8.args": [ + "--max-line-length=120", + "--ignore=F401", + ], + } diff --git a/bdd/features/e2e/E2E-014-python.feature b/bdd/features/e2e/E2E-014-python.feature index f306c0853..30f8bdf70 100644 --- a/bdd/features/e2e/E2E-014-python.feature +++ b/bdd/features/e2e/E2E-014-python.feature @@ -33,6 +33,7 @@ Feature: Test our shiny new Python runner Given host is running When sequence "../packages/python-unhealthy-sequence.tar.gz" loaded And instance started + And wait for "3000" ms Then instance health is "false" And host is still running @@ -52,9 +53,11 @@ Feature: Test our shiny new Python runner When I execute CLI with "seq send ../packages/python-topic-producer.tar.gz" When I execute CLI with "seq start - --output-topic names3" Then I send input data "topic test input" with options "--end" + And wait for "100" ms When I execute CLI with "seq send ../packages/python-topic-consumer.tar.gz" When I execute CLI with "seq start - --input-topic names3" And I execute CLI with "inst output -" without waiting for the end + And wait for "100" ms Then I confirm data named "python-topics" will be received And host is still running diff --git a/bdd/features/e2e/E2E-015-unified.feature b/bdd/features/e2e/E2E-015-unified.feature index 46f9338a1..839f3cc0a 100644 --- a/bdd/features/e2e/E2E-015-unified.feature +++ b/bdd/features/e2e/E2E-015-unified.feature @@ -6,6 +6,7 @@ Feature: Test our shiny new Python runner When find and upload sequence "hello.tar.gz" And instance started And send "python runner" to input + And wait for "100" ms Then "output" is "Hello python runner!" And host is still running @@ -15,6 +16,7 @@ Feature: Test our shiny new Python runner When find and upload sequence "stdinout.tar.gz" And instance started And send "python runner" to stdin + And wait for "100" ms Then "stdout" is "Got on stdin: python runner" And host is still running @@ -62,6 +64,7 @@ Feature: Test our shiny new Python runner When find and upload sequence "topic-producer.tar.gz" And instance started And send "topic test input" to input + And wait for "100" ms And find and upload sequence "topic-consumer.tar.gz" And instance started Then "output" will be data named "python-topics" @@ -73,6 +76,7 @@ Feature: Test our shiny new Python runner When find and upload sequence "events.tar.gz" And instance started And send event "test-event" to instance with message "foo" + And wait for "100" ms Then instance emits event "test-response" with body """ "reply to foo" diff --git a/package-lock.json b/package-lock.json index ca9d196be..a96f5ef62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2274,27 +2274,17 @@ "link": true }, "node_modules/@scramjet/client-utils": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/client-utils/-/client-utils-0.38.0.tgz", - "integrity": "sha512-DzxwgcSCEtIxdG+GsIReL1Zhkh9zKnPDIq3zbVt9Svvsq/UuP94KGg25KVelvr0OTM/yEEovJw9/yOMDWLiXbQ==", - "dependencies": { - "@scramjet/model": "^0.38.0", - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/sth-config": "^0.38.0", - "@scramjet/symbols": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "n-readlines": "^1.0.1", - "node-fetch": "^2.6.7", - "normalize-url": "4", - "scramjet": "^4.36.9" - } + "resolved": "packages/client-utils", + "link": true }, "node_modules/@scramjet/host": { "resolved": "packages/host", "link": true }, + "node_modules/@scramjet/load-check": { + "resolved": "packages/load-check", + "link": true + }, "node_modules/@scramjet/logger": { "resolved": "packages/logger", "link": true @@ -2303,16 +2293,17 @@ "resolved": "packages/manager-api-client", "link": true }, + "node_modules/@scramjet/middleware-api-client": { + "resolved": "packages/middleware-api-client", + "link": true + }, "node_modules/@scramjet/model": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/model/-/model-0.38.0.tgz", - "integrity": "sha512-KaIqZi6tbNnBZcc7TmvJhki+oO3k+EKUuH7h044LGatVcS5tbMrIki3w5BX41OCi5neigDCoOla/nJraod6IcQ==", - "dependencies": { - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/symbols": "^0.38.0", - "scramjet": "^4.36.9", - "uuid": "^8.3.2" - } + "resolved": "packages/model", + "link": true + }, + "node_modules/@scramjet/module-loader": { + "resolved": "packages/module-loader", + "link": true }, "node_modules/@scramjet/monitoring-server": { "resolved": "packages/monitoring-server", @@ -2323,13 +2314,20 @@ "link": true }, "node_modules/@scramjet/obj-logger": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/obj-logger/-/obj-logger-0.38.0.tgz", - "integrity": "sha512-2RLYiGnVbt1rGN74yvhqocz3PDxjYdO2Rb0GKlxYZJ2JQB/hIVAJSE47wUjKmPkG39anH6UrfGV8T73paH9qgg==", - "dependencies": { - "@scramjet/utility": "^0.38.0", - "scramjet": "^4.36.9" - } + "resolved": "packages/obj-logger", + "link": true + }, + "node_modules/@scramjet/pre-runner": { + "resolved": "packages/pre-runner", + "link": true + }, + "node_modules/@scramjet/python-runner": { + "resolved": "packages/python-runner", + "link": true + }, + "node_modules/@scramjet/runner": { + "resolved": "packages/runner", + "link": true }, "node_modules/@scramjet/stdio-sequence": { "resolved": "packages/stdio-sequence", @@ -2340,35 +2338,32 @@ "link": true }, "node_modules/@scramjet/sth-config": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/sth-config/-/sth-config-0.38.0.tgz", - "integrity": "sha512-Glm/lXMK3UsdAwnWnINlxGm7UFaJfGCnDgjwtI8DVHOL3+52SujFbO0fNb/ye0htR77vNg6GTydbK8sEFdTbkw==", - "dependencies": { - "@scramjet/utility": "^0.38.0" - } + "resolved": "packages/sth-config", + "link": true }, "node_modules/@scramjet/symbols": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/symbols/-/symbols-0.38.0.tgz", - "integrity": "sha512-Wjg0JUFybp++ngDUovkoBb3IrfVAjo3OeK6d7JodCOVlgrPsOs2jvmINhGhTfbB/WZx0/sRHeG6Yr9zmpDY3Cg==" + "resolved": "packages/symbols", + "link": true + }, + "node_modules/@scramjet/tecemux": { + "resolved": "packages/tecemux", + "link": true + }, + "node_modules/@scramjet/telemetry": { + "resolved": "packages/telemetry", + "link": true }, "node_modules/@scramjet/types": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/types/-/types-0.38.0.tgz", - "integrity": "sha512-6PlWPgdP5ot65Zr17d01rf9m6rgL9xgsliFw2yhikEPflLV8c2ohSGSsptR+faM+x+pNyN/O9TnxbSzwwWBNVA==", - "dependencies": { - "@scramjet/symbols": "^0.38.0", - "http-status-codes": "^2.2.0" - } + "resolved": "packages/types", + "link": true }, "node_modules/@scramjet/utility": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/utility/-/utility-0.38.0.tgz", - "integrity": "sha512-jSxeqm1BJ/ZczZAlcXP8tiU4k0cRTF4oVFsrczSw07sxliHbKSh7FaYsRfDKrO53xOlyD5FGLER/3IJckFlPpQ==", - "dependencies": { - "normalize-url": "4", - "yaml": "^2.2.2" - } + "resolved": "packages/utility", + "link": true + }, + "node_modules/@scramjet/verser": { + "resolved": "packages/verser", + "link": true }, "node_modules/@sinclair/typebox": { "version": "0.27.8", @@ -2636,6 +2631,7 @@ "version": "2.6.10", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz", "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==", + "dev": true, "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -4331,6 +4327,18 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5223,6 +5231,12 @@ "node": ">=0.10.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -6307,9 +6321,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6560,6 +6574,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -9650,6 +9665,15 @@ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "engines": { + "node": ">=12.19" + } + }, "node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -10066,6 +10090,8 @@ }, "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "inBundle": true, "license": "ISC", "dependencies": { @@ -10225,6 +10251,8 @@ }, "node_modules/npm/node_modules/agentkeepalive": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "inBundle": true, "license": "MIT", "dependencies": { @@ -10338,6 +10366,8 @@ }, "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "inBundle": true, "license": "ISC", "engines": { @@ -10469,7 +10499,9 @@ } }, "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "inBundle": true, "license": "MIT", "dependencies": { @@ -10603,6 +10635,8 @@ }, "node_modules/npm/node_modules/debug/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==", "inBundle": true, "license": "MIT" }, @@ -10633,6 +10667,8 @@ }, "node_modules/npm/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "inBundle": true, "license": "MIT", "engines": { @@ -10748,7 +10784,9 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "8.0.3", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "inBundle": true, "license": "ISC", "dependencies": { @@ -11280,7 +11318,9 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "inBundle": true, "license": "ISC", "dependencies": { @@ -11447,15 +11487,18 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "inBundle": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -11466,7 +11509,7 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { @@ -11482,6 +11525,8 @@ }, "node_modules/npm/node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "inBundle": true, "license": "ISC", "dependencies": { @@ -11526,6 +11571,22 @@ "node": ">=6" } }, + "node_modules/npm/node_modules/node-gyp/node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm/node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -11586,6 +11647,8 @@ }, "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "inBundle": true, "license": "ISC", "engines": { @@ -11647,6 +11710,8 @@ }, "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "inBundle": true, "license": "ISC", "engines": { @@ -11671,6 +11736,8 @@ }, "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "inBundle": true, "license": "ISC", "engines": { @@ -11963,6 +12030,8 @@ }, "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "inBundle": true, "license": "ISC", "engines": { @@ -12036,6 +12105,8 @@ }, "node_modules/npm/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==", "inBundle": true, "license": "ISC", "dependencies": { @@ -12096,7 +12167,9 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "inBundle": true, "license": "ISC", "dependencies": { @@ -12111,6 +12184,8 @@ }, "node_modules/npm/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "inBundle": true, "license": "ISC", "dependencies": { @@ -14395,6 +14470,46 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -15451,6 +15566,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-emitter": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz", + "integrity": "sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==", + "dev": true + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -16276,18 +16397,6 @@ "typescript": "~4.7.4" } }, - "packages/adapters/node_modules/@scramjet/pre-runner": { - "resolved": "packages/pre-runner", - "link": true - }, - "packages/adapters/node_modules/@scramjet/python-runner": { - "resolved": "packages/python-runner", - "link": true - }, - "packages/adapters/node_modules/@scramjet/runner": { - "resolved": "packages/runner", - "link": true - }, "packages/api-client": { "name": "@scramjet/api-client", "version": "0.38.0", @@ -16372,10 +16481,6 @@ "typescript": "~4.7.4" } }, - "packages/cli/node_modules/@scramjet/middleware-api-client": { - "resolved": "packages/middleware-api-client", - "link": true - }, "packages/cli/node_modules/commander": { "version": "9.5.0", "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", @@ -16388,7 +16493,6 @@ "packages/client-utils": { "name": "@scramjet/client-utils", "version": "0.38.0", - "extraneous": true, "license": "MIT", "dependencies": { "@scramjet/model": "^0.38.0", @@ -16427,10 +16531,10 @@ "@scramjet/obj-logger": "^0.38.0", "@scramjet/sth-config": "^0.38.0", "@scramjet/symbols": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", "@scramjet/telemetry": "^0.38.0", "@scramjet/utility": "^0.38.0", "@scramjet/verser": "^0.38.0", - "bpmux": "^8.2.1", "ext-ip": "^0.3.9", "find-package-json": "^1.2.0", "http-status-codes": "^2.2.0", @@ -16453,22 +16557,6 @@ "typescript": "~4.7.4" } }, - "packages/host/node_modules/@scramjet/load-check": { - "resolved": "packages/load-check", - "link": true - }, - "packages/host/node_modules/@scramjet/module-loader": { - "resolved": "packages/module-loader", - "link": true - }, - "packages/host/node_modules/@scramjet/telemetry": { - "resolved": "packages/telemetry", - "link": true - }, - "packages/host/node_modules/@scramjet/verser": { - "resolved": "packages/verser", - "link": true - }, "packages/load-check": { "name": "@scramjet/load-check", "version": "0.38.0", @@ -16552,7 +16640,6 @@ "packages/model": { "name": "@scramjet/model", "version": "0.38.0", - "extraneous": true, "license": "AGPL-3.0", "dependencies": { "@scramjet/obj-logger": "^0.38.0", @@ -16628,7 +16715,6 @@ "packages/obj-logger": { "name": "@scramjet/obj-logger", "version": "0.38.0", - "extraneous": true, "license": "AGPL-3.0", "dependencies": { "@scramjet/utility": "^0.38.0", @@ -16666,8 +16752,8 @@ "@scramjet/model": "^0.38.0", "@scramjet/obj-logger": "^0.38.0", "@scramjet/symbols": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", "@scramjet/utility": "^0.38.0", - "bpmux": "^8.2.1", "scramjet": "^4.36.9" }, "devDependencies": { @@ -16685,6 +16771,7 @@ } }, "packages/stdio-sequence": { + "name": "@scramjet/stdio-sequence", "version": "0.22.0", "license": "ISC", "dependencies": { @@ -16730,7 +16817,6 @@ "packages/sth-config": { "name": "@scramjet/sth-config", "version": "0.38.0", - "extraneous": true, "license": "ISC", "dependencies": { "@scramjet/utility": "^0.38.0" @@ -16754,7 +16840,6 @@ "packages/symbols": { "name": "@scramjet/symbols", "version": "0.38.0", - "extraneous": true, "license": "AGPL-3.0", "devDependencies": { "@types/node": "15.12.5", @@ -16763,6 +16848,43 @@ "typescript": "~4.7.4" } }, + "packages/tecemux": { + "version": "0.38.0", + "license": "AGPL-3.0", + "dependencies": { + "@scramjet/obj-logger": "^0.36.1", + "@scramjet/utility": "^0.36.1", + "bpmux": "^8.2.1" + }, + "devDependencies": { + "@scramjet/api-server": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + }, + "packages/tecemux/node_modules/@scramjet/obj-logger": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@scramjet/obj-logger/-/obj-logger-0.36.1.tgz", + "integrity": "sha512-3yDell8/QKf+W4lGCgm74tf+bNS/S0U0//xO/7FyZbiE69ajJhd3f9C70Q2Xf9xYBMyhpJuK+vTteGAJiJCtdQ==", + "dependencies": { + "@scramjet/utility": "^0.36.1", + "scramjet": "^4.36.9" + } + }, + "packages/tecemux/node_modules/@scramjet/utility": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@scramjet/utility/-/utility-0.36.1.tgz", + "integrity": "sha512-sDanZi5evXaTs+LsR/O1znCZuAa7sJv5EDwGLEF2RpW5fBFOWGhtcCJJ3yJN4qQeyMtjTu/J6c4wnBiZNK4JHQ==", + "dependencies": { + "normalize-url": "4", + "yaml": "^2.2.2" + } + }, "packages/telemetry": { "name": "@scramjet/telemetry", "version": "0.38.0", @@ -16783,7 +16905,6 @@ "packages/types": { "name": "@scramjet/types", "version": "0.38.0", - "extraneous": true, "license": "AGPL-3.0", "dependencies": { "@scramjet/symbols": "^0.38.0", @@ -16800,7 +16921,6 @@ "packages/utility": { "name": "@scramjet/utility", "version": "0.38.0", - "extraneous": true, "license": "ISC", "dependencies": { "normalize-url": "4", @@ -16814,1787 +16934,2750 @@ "typedoc-plugin-markdown": "3.13.6" } }, - "packages/verser": { - "name": "@scramjet/verser", - "version": "0.38.0", - "license": "AGPL-3.0", + "packages/utility/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, "dependencies": { - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "bpmux": "^8.2.1" + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" }, - "devDependencies": { - "@scramjet/api-server": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "packages/utility/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "engines": { + "node": ">=12" }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "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 - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "@babel/compat-data": { - "version": "7.20.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", - "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "packages/utility/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "engines": { + "node": ">=12" }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "packages/utility/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "sprintf-js": "~1.0.2" } }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "packages/utility/node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/utility/node_modules/ava": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ava/-/ava-4.3.3.tgz", + "integrity": "sha512-9Egq/d9R74ExrWohHeqUlexjDbgZJX5jA1Wq4KCTqc3wIfpGEK79zVy4rBtofJ9YKIxs4PzhJ8BgbW5PlAYe6w==", + "dev": true, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "acorn": "^8.7.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.1.0", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.0.1", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.3.1", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "del": "^6.1.1", + "emittery": "^0.11.0", + "figures": "^4.0.1", + "globby": "^13.1.1", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.4.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^7.0.1", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.5", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^2.0.0", + "write-file-atomic": "^4.0.1", + "yargs": "^17.5.1" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=12.22 <13 || >=14.17 <15 || >=16.4 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true } } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true + "packages/utility/node_modules/callsites": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz", + "integrity": "sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "packages/utility/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "packages/utility/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "packages/utility/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, - "requires": { - "@babel/types": "^7.18.6" + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "packages/utility/node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "packages/utility/node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "requires": { - "@babel/types": "^7.20.2" + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "packages/utility/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "requires": { - "@babel/types": "^7.22.5" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true + "packages/utility/node_modules/cliui/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==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true + "packages/utility/node_modules/cliui/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true + "packages/utility/node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "packages/utility/node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "packages/utility/node_modules/emittery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.11.0.tgz", + "integrity": "sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==", "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "engines": { + "node": ">=12" }, - "dependencies": { - "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, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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, - "requires": { - "color-name": "1.1.3" - } - }, - "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 - }, - "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 - }, - "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 - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "packages/utility/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "packages/utility/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "packages/utility/node_modules/figures": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", + "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "packages/utility/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "packages/utility/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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "packages/utility/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "packages/utility/node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "packages/utility/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "packages/utility/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "packages/utility/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, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "packages/utility/node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "packages/utility/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "packages/utility/node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "packages/utility/node_modules/mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "packages/utility/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "packages/utility/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "packages/utility/node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "packages/utility/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, "dependencies": { - "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 - } + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "packages/utility/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@balena/dockerignore": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", - "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "packages/utility/node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@brillout/import": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@brillout/import/-/import-0.2.1.tgz", - "integrity": "sha512-4qA9sNtQZCY02MeLjTP+O9LfY9T6d2ajYS7whyvgBklJzWzLUNbJp940ClxK64hbDPqag9AQZt45beEAGcSYYA==" + "packages/utility/node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + "packages/utility/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, - "@concordance/react": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", - "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", + "packages/utility/node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", "dev": true, - "requires": { - "arrify": "^1.0.1" - }, "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - } + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "packages/utility/node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/utility/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "@cucumber/create-meta": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/create-meta/-/create-meta-5.0.0.tgz", - "integrity": "sha512-Z5kMZkUff00S3/KSnKzB/KOm2UIxMXY1xXmj2dQMlD49lV6v/W8EEvgDMNtQotQNSOQU5bDupmWQpk+o16tXIw==", + "packages/utility/node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", "dev": true, - "requires": { - "@cucumber/messages": "^16.0.0" + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "packages/utility/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { - "@cucumber/messages": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", - "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", - "dev": true, - "requires": { - "@types/uuid": "8.3.0", - "class-transformer": "0.4.0", - "reflect-metadata": "0.1.13", - "uuid": "8.3.2" - } - }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", - "dev": true - }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "dev": true - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "@cucumber/cucumber": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-7.3.2.tgz", - "integrity": "sha512-qqptM9w+UqXEYBAkrIGpIVPXDWv+zp0LrS89LiwHZwBp0cJg00su/iPMZ4j8TvCJiKfAwJXsAI1yjrd1POtU+w==", + "packages/utility/node_modules/wrap-ansi/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==", "dev": true, - "requires": { - "@cucumber/create-meta": "^5.0.0", - "@cucumber/cucumber-expressions": "^12.1.1", - "@cucumber/gherkin": "^19.0.3", - "@cucumber/gherkin-streams": "^2.0.2", - "@cucumber/html-formatter": "^15.0.2", - "@cucumber/messages": "^16.0.1", - "@cucumber/tag-expressions": "^3.0.1", - "assertion-error-formatter": "^3.0.0", - "bluebird": "^3.7.2", - "capital-case": "^1.0.4", - "cli-table3": "0.6.1", - "colors": "1.4.0", - "commander": "^7.0.0", - "create-require": "^1.1.1", - "duration": "^0.2.2", - "durations": "^3.4.2", - "figures": "^3.2.0", - "glob": "^7.1.6", - "indent-string": "^4.0.0", - "is-generator": "^1.0.3", - "is-stream": "^2.0.0", - "knuth-shuffle-seeded": "^1.0.6", - "lodash": "^4.17.21", - "mz": "^2.7.0", - "progress": "^2.0.3", - "resolve": "^1.19.0", - "resolve-pkg": "^2.0.0", - "stack-chain": "^2.0.0", - "stacktrace-js": "^2.0.2", - "string-argv": "^0.3.1", - "tmp": "^0.2.1", - "util-arity": "^1.1.0", - "verror": "^1.10.0" + "engines": { + "node": ">=8" + } + }, + "packages/utility/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/utility/node_modules/wrap-ansi/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==", + "dev": true, "dependencies": { - "@cucumber/messages": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", - "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", - "dev": true, - "requires": { - "@types/uuid": "8.3.0", - "class-transformer": "0.4.0", - "reflect-metadata": "0.1.13", - "uuid": "8.3.2" - } - }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", - "dev": true - }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - } + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "@cucumber/cucumber-expressions": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-12.1.3.tgz", - "integrity": "sha512-LB8MAzE4F/t2KIgsDEz4gZH0xSI4aG0/LmYUPyISPPjUS1pI/yGWWyeX2WsiUQxpSs765WcNIq5Bggt7gGGO3Q==", + "packages/utility/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/utility/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "packages/utility/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "packages/utility/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "packages/utility/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/verser": { + "name": "@scramjet/verser", + "version": "0.38.0", + "license": "AGPL-3.0", + "dependencies": { + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", + "@scramjet/utility": "^0.38.0" + }, + "devDependencies": { + "@scramjet/api-server": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "regexp-match-indices": "1.0.2" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, - "@cucumber/gherkin": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-19.0.3.tgz", - "integrity": "sha512-gWdMm8mfRk3P+VugJWvNALaQV5QnT+5RkqWy3tO+4NsMSQZPo5p4V4vXwriQZ/sZR1Wni5TDRztuRsKLgZ3XHA==", + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "requires": { - "@cucumber/message-streams": "^2.0.0", - "@cucumber/messages": "^16.0.1" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "dependencies": { - "@cucumber/messages": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", - "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "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, "requires": { - "@types/uuid": "8.3.0", - "class-transformer": "0.4.0", - "reflect-metadata": "0.1.13", - "uuid": "8.3.2" + "color-convert": "^1.9.0" } }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "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 }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "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 + }, + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, - "@cucumber/gherkin-streams": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-2.0.2.tgz", - "integrity": "sha512-cKmXOBz4OwGlrHMBCc4qCC3KzLaqcEZ11nWWskIbv6jyfvlIRuM2OgEF6VLcNVewczifW1p6DrDj0OO+BeXocA==", + "@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==", + "dev": true + }, + "@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dev": true, "requires": { - "@cucumber/gherkin": "^19.0.1", - "@cucumber/message-streams": "^2.0.0", - "@cucumber/messages": "^16.0.0", - "commander": "7.2.0", - "source-map-support": "0.5.19" + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" }, "dependencies": { - "@cucumber/messages": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", - "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", - "dev": true, - "requires": { - "@types/uuid": "8.3.0", - "class-transformer": "0.4.0", - "reflect-metadata": "0.1.13", - "uuid": "8.3.2" - } - }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", - "dev": true - }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, - "@cucumber/html-formatter": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-15.0.2.tgz", - "integrity": "sha512-j+YGY4ytj78G/v1gZo53D+vuKXlTg/oxNwSCCGvRQo75+AqYDJSkm/vexXJQ5lY1rXAvlbZ9KI6jhg6LDs0YdQ==", + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "requires": { - "@cucumber/messages": "^16.0.1", - "commander": "7.2.0", - "source-map-support": "0.5.19" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "dependencies": { - "@cucumber/messages": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", - "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "@types/uuid": "8.3.0", - "class-transformer": "0.4.0", - "reflect-metadata": "0.1.13", - "uuid": "8.3.2" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } - }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", - "dev": true - }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true } } }, - "@cucumber/message-streams": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-2.1.0.tgz", - "integrity": "sha512-Yh3mw3qv6QL9NI/ihkZF8V9MX2GbnR6oktv34kC3uAbrQy9d/b2SZ3HNjG3J9JQqpV4B7Om3SPElJYIeo66TrA==", + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "requires": { - "@cucumber/messages": "^16.0.1" + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" }, "dependencies": { - "@cucumber/messages": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", - "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "@types/uuid": "8.3.0", - "class-transformer": "0.4.0", - "reflect-metadata": "0.1.13", - "uuid": "8.3.2" + "yallist": "^3.0.2" } }, - "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "class-transformer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", - "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, - "@cucumber/messages": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-21.0.1.tgz", - "integrity": "sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g==", + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "peer": true, "requires": { - "@types/uuid": "8.3.4", - "class-transformer": "0.5.1", - "reflect-metadata": "0.1.13", - "uuid": "9.0.0" - }, - "dependencies": { - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "peer": true - } + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, - "@cucumber/pretty-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.0.tgz", - "integrity": "sha512-wcnIMN94HyaHGsfq72dgCvr1d8q6VGH4Y6Gl5weJ2TNZw1qn2UY85Iki4c9VdaLUONYnyYH3+178YB+9RFe/Hw==", + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "ansi-styles": "^5.0.0", - "cli-table3": "^0.6.0", - "figures": "^3.2.0", - "ts-dedent": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } + "@babel/types": "^7.22.5" } }, - "@cucumber/tag-expressions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-3.0.1.tgz", - "integrity": "sha512-OGCXaJ1BQXmQ5b9pw+JYsBGumK2/LPZiLmbj1o1JFVeSNs2PY8WPQFSyXrskhrHz5Nd/6lYg7lvGMtFHOncC4w==", - "dev": true - }, - "@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@babel/types": "^7.18.6" } }, - "@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, "requires": { - "eslint-visitor-keys": "^3.3.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" } }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/types": "^7.20.2" } }, - "@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@babel/types": "^7.22.5" } }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, - "@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dev": true, "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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, "requires": { - "sprintf-js": "~1.0.2" + "color-convert": "^1.9.0" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "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==", + "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, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "color-name": "1.1.3" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } + "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 }, - "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, - "requires": { - "p-try": "^2.0.0" - } + "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 }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "has-flag": "^3.0.0" } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true } } }, - "@istanbuljs/nyc-config-typescript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { - "@istanbuljs/schema": "^0.1.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", - "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { - "@jest/types": "^29.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jest/core": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", - "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@jest/console": "^29.6.2", - "@jest/reporters": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.2", - "jest-haste-map": "^29.6.2", - "jest-message-util": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.2", - "jest-resolve-dependencies": "^29.6.2", - "jest-runner": "^29.6.2", - "jest-runtime": "^29.6.2", - "jest-snapshot": "^29.6.2", - "jest-util": "^29.6.2", - "jest-validate": "^29.6.2", - "jest-watcher": "^29.6.2", - "micromatch": "^4.0.4", - "pretty-format": "^29.6.2", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.12.13" } }, - "@jest/environment": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", - "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@jest/fake-timers": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/node": "*", - "jest-mock": "^29.6.2" + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jest/expect": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", - "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { - "expect": "^29.6.2", - "jest-snapshot": "^29.6.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jest/expect-utils": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", - "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { - "jest-get-type": "^29.4.3" + "@babel/helper-plugin-utils": "^7.22.5" } }, - "@jest/fake-timers": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", - "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { - "@jest/types": "^29.6.1", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.6.2", - "jest-mock": "^29.6.2", - "jest-util": "^29.6.2" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - } - } + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jest/globals": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", - "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { - "@jest/environment": "^29.6.2", - "@jest/expect": "^29.6.2", - "@jest/types": "^29.6.1", - "jest-mock": "^29.6.2" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jest/reporters": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", - "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.2", - "@jest/test-result": "^29.6.2", - "@jest/transform": "^29.6.2", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.2", - "jest-util": "^29.6.2", - "jest-worker": "^29.6.2", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } + "@babel/helper-plugin-utils": "^7.10.4" } }, - "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { - "@sinclair/typebox": "^0.27.8" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jest/source-map": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", - "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jest/test-result": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", - "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { - "@jest/console": "^29.6.2", - "@jest/types": "^29.6.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, - "@jest/test-sequencer": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", - "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@jest/test-result": "^29.6.2", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.14.5" } }, - "@jest/transform": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", - "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.2", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.2", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "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 - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } } } }, - "@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "requires": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" } }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } + "@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==" }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "@brillout/import": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@brillout/import/-/import-0.2.1.tgz", + "integrity": "sha512-4qA9sNtQZCY02MeLjTP+O9LfY9T6d2ajYS7whyvgBklJzWzLUNbJp940ClxK64hbDPqag9AQZt45beEAGcSYYA==" }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" }, - "@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "@concordance/react": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", + "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "arrify": "^1.0.1" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + } } }, - "@kubernetes/client-node": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.17.1.tgz", - "integrity": "sha512-qXANjukuTq/drb1hq1NCYZafpdRTvbyTzbliWO6RwW7eEb2b9qwINbw0DiVHpBQg3e9DeQd8+brI1sR1Fck5kQ==", + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "requires": { - "byline": "^5.0.0", - "execa": "5.0.0", - "isomorphic-ws": "^4.0.1", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^0.19.0", - "openid-client": "^5.1.6", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "shelljs": "^0.8.5", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^1.9.3", - "underscore": "^1.9.1", - "ws": "^7.3.1" + "@jridgewell/trace-mapping": "0.3.9" }, "dependencies": { - "execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + } + } + }, + "@cucumber/create-meta": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/create-meta/-/create-meta-5.0.0.tgz", + "integrity": "sha512-Z5kMZkUff00S3/KSnKzB/KOm2UIxMXY1xXmj2dQMlD49lV6v/W8EEvgDMNtQotQNSOQU5bDupmWQpk+o16tXIw==", + "dev": true, + "requires": { + "@cucumber/messages": "^16.0.0" + }, + "dependencies": { + "@cucumber/messages": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", + "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "dev": true, "requires": { - "path-key": "^3.0.0" + "@types/uuid": "8.3.0", + "class-transformer": "0.4.0", + "reflect-metadata": "0.1.13", + "uuid": "8.3.2" } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "dev": true } } }, - "@napi-rs/snappy-android-arm-eabi": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.1.1.tgz", - "integrity": "sha512-NKd/ztuVEgQaAaNVQ5zZaCB9VV+7+uBXBHqhaE5iSapQhLc41szTlT0s68FCee75OoT3vhqdA6Jp5TrzZ2WOaw==", - "optional": true - }, - "@napi-rs/snappy-android-arm64": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.1.1.tgz", - "integrity": "sha512-DktruMAO0K0toTnxNHg2GWNIAPJqdvIchCsdsRaKyuEnG101qBg0mYiRCAhxHgbT6RJlOGbUPKkbA9KKRhEJUg==", - "optional": true - }, - "@napi-rs/snappy-darwin-arm64": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.1.1.tgz", - "integrity": "sha512-3LZyoAw3Qa5F7sCCTkSkhmGlydwUKU6L3Jl46eKHO2Ctm8Gcjxww6T7MfwlwGZ6JqAM6d1d++WLzUZPCGXVmag==", - "optional": true - }, - "@napi-rs/snappy-darwin-x64": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.1.1.tgz", - "integrity": "sha512-X1D2F67bQkPwr5iSR29/RnOrLwAkB55YO6t41toABzla3mflLDpzZcakz6FokIukykf7ey31/t73v/4pbgaBkg==", - "optional": true - }, - "@napi-rs/snappy-freebsd-x64": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.1.1.tgz", - "integrity": "sha512-vSeuf+An8jFVHPAn5IbWE9hTGU9PFAaZLj/X7rKTQQtZstnDsHgWe6u4g7FHLuOdwQ8TvhcxAEpNlYIXIk4AJg==", - "optional": true - }, - "@napi-rs/snappy-linux-arm-gnueabihf": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.1.1.tgz", - "integrity": "sha512-/yyN6QsnOs3D1+jI3SfRX+gtnD86rbixdfmgxv9g40+FrDaDTLAu/3VuZIqH02qqq/xiWbDnkO+42RGxXDzTCw==", - "optional": true - }, - "@napi-rs/snappy-linux-arm64-gnu": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.1.1.tgz", - "integrity": "sha512-StEeUCSwUoajgrBtiCQPTkHu+0Q4QlYndghGZNdbN1zJ1ny70YzPpevaFBUyjI/eJ+FN9uICKtwTPtQNSILS5g==", - "optional": true - }, + "@cucumber/cucumber": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-7.3.2.tgz", + "integrity": "sha512-qqptM9w+UqXEYBAkrIGpIVPXDWv+zp0LrS89LiwHZwBp0cJg00su/iPMZ4j8TvCJiKfAwJXsAI1yjrd1POtU+w==", + "dev": true, + "requires": { + "@cucumber/create-meta": "^5.0.0", + "@cucumber/cucumber-expressions": "^12.1.1", + "@cucumber/gherkin": "^19.0.3", + "@cucumber/gherkin-streams": "^2.0.2", + "@cucumber/html-formatter": "^15.0.2", + "@cucumber/messages": "^16.0.1", + "@cucumber/tag-expressions": "^3.0.1", + "assertion-error-formatter": "^3.0.0", + "bluebird": "^3.7.2", + "capital-case": "^1.0.4", + "cli-table3": "0.6.1", + "colors": "1.4.0", + "commander": "^7.0.0", + "create-require": "^1.1.1", + "duration": "^0.2.2", + "durations": "^3.4.2", + "figures": "^3.2.0", + "glob": "^7.1.6", + "indent-string": "^4.0.0", + "is-generator": "^1.0.3", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash": "^4.17.21", + "mz": "^2.7.0", + "progress": "^2.0.3", + "resolve": "^1.19.0", + "resolve-pkg": "^2.0.0", + "stack-chain": "^2.0.0", + "stacktrace-js": "^2.0.2", + "string-argv": "^0.3.1", + "tmp": "^0.2.1", + "util-arity": "^1.1.0", + "verror": "^1.10.0" + }, + "dependencies": { + "@cucumber/messages": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", + "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "dev": true, + "requires": { + "@types/uuid": "8.3.0", + "class-transformer": "0.4.0", + "reflect-metadata": "0.1.13", + "uuid": "8.3.2" + } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@cucumber/cucumber-expressions": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-12.1.3.tgz", + "integrity": "sha512-LB8MAzE4F/t2KIgsDEz4gZH0xSI4aG0/LmYUPyISPPjUS1pI/yGWWyeX2WsiUQxpSs765WcNIq5Bggt7gGGO3Q==", + "dev": true, + "requires": { + "regexp-match-indices": "1.0.2" + } + }, + "@cucumber/gherkin": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-19.0.3.tgz", + "integrity": "sha512-gWdMm8mfRk3P+VugJWvNALaQV5QnT+5RkqWy3tO+4NsMSQZPo5p4V4vXwriQZ/sZR1Wni5TDRztuRsKLgZ3XHA==", + "dev": true, + "requires": { + "@cucumber/message-streams": "^2.0.0", + "@cucumber/messages": "^16.0.1" + }, + "dependencies": { + "@cucumber/messages": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", + "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "dev": true, + "requires": { + "@types/uuid": "8.3.0", + "class-transformer": "0.4.0", + "reflect-metadata": "0.1.13", + "uuid": "8.3.2" + } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "dev": true + } + } + }, + "@cucumber/gherkin-streams": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-2.0.2.tgz", + "integrity": "sha512-cKmXOBz4OwGlrHMBCc4qCC3KzLaqcEZ11nWWskIbv6jyfvlIRuM2OgEF6VLcNVewczifW1p6DrDj0OO+BeXocA==", + "dev": true, + "requires": { + "@cucumber/gherkin": "^19.0.1", + "@cucumber/message-streams": "^2.0.0", + "@cucumber/messages": "^16.0.0", + "commander": "7.2.0", + "source-map-support": "0.5.19" + }, + "dependencies": { + "@cucumber/messages": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", + "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "dev": true, + "requires": { + "@types/uuid": "8.3.0", + "class-transformer": "0.4.0", + "reflect-metadata": "0.1.13", + "uuid": "8.3.2" + } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "@cucumber/html-formatter": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-15.0.2.tgz", + "integrity": "sha512-j+YGY4ytj78G/v1gZo53D+vuKXlTg/oxNwSCCGvRQo75+AqYDJSkm/vexXJQ5lY1rXAvlbZ9KI6jhg6LDs0YdQ==", + "dev": true, + "requires": { + "@cucumber/messages": "^16.0.1", + "commander": "7.2.0", + "source-map-support": "0.5.19" + }, + "dependencies": { + "@cucumber/messages": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", + "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "dev": true, + "requires": { + "@types/uuid": "8.3.0", + "class-transformer": "0.4.0", + "reflect-metadata": "0.1.13", + "uuid": "8.3.2" + } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "dev": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "@cucumber/message-streams": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-2.1.0.tgz", + "integrity": "sha512-Yh3mw3qv6QL9NI/ihkZF8V9MX2GbnR6oktv34kC3uAbrQy9d/b2SZ3HNjG3J9JQqpV4B7Om3SPElJYIeo66TrA==", + "dev": true, + "requires": { + "@cucumber/messages": "^16.0.1" + }, + "dependencies": { + "@cucumber/messages": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz", + "integrity": "sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ==", + "dev": true, + "requires": { + "@types/uuid": "8.3.0", + "class-transformer": "0.4.0", + "reflect-metadata": "0.1.13", + "uuid": "8.3.2" + } + }, + "@types/uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "dev": true + }, + "class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==", + "dev": true + } + } + }, + "@cucumber/messages": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-21.0.1.tgz", + "integrity": "sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g==", + "dev": true, + "peer": true, + "requires": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "peer": true + } + } + }, + "@cucumber/pretty-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.0.tgz", + "integrity": "sha512-wcnIMN94HyaHGsfq72dgCvr1d8q6VGH4Y6Gl5weJ2TNZw1qn2UY85Iki4c9VdaLUONYnyYH3+178YB+9RFe/Hw==", + "dev": true, + "requires": { + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "@cucumber/tag-expressions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-3.0.1.tgz", + "integrity": "sha512-OGCXaJ1BQXmQ5b9pw+JYsBGumK2/LPZiLmbj1o1JFVeSNs2PY8WPQFSyXrskhrHz5Nd/6lYg7lvGMtFHOncC4w==", + "dev": true + }, + "@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "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, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/nyc-config-typescript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", + "dev": true, + "requires": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", + "dev": true, + "requires": { + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.2", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true + } + } + }, + "@jest/environment": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", + "dev": true, + "requires": { + "@jest/fake-timers": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/node": "*", + "jest-mock": "^29.6.2" + } + }, + "@jest/expect": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", + "dev": true, + "requires": { + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" + } + }, + "@jest/expect-utils": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", + "dev": true, + "requires": { + "jest-get-type": "^29.4.3" + } + }, + "@jest/fake-timers": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", + "dev": true, + "requires": { + "@jest/types": "^29.6.1", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" + }, + "dependencies": { + "@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.0" + } + } + } + }, + "@jest/globals": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", + "dev": true, + "requires": { + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.2" + } + }, + "@jest/reporters": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", + "dev": true, + "requires": { + "@jest/console": "^29.6.2", + "@jest/types": "^29.6.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", + "dev": true, + "requires": { + "@jest/test-result": "^29.6.2", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.2", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.2", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + } + } + }, + "@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@kubernetes/client-node": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.17.1.tgz", + "integrity": "sha512-qXANjukuTq/drb1hq1NCYZafpdRTvbyTzbliWO6RwW7eEb2b9qwINbw0DiVHpBQg3e9DeQd8+brI1sR1Fck5kQ==", + "requires": { + "byline": "^5.0.0", + "execa": "5.0.0", + "isomorphic-ws": "^4.0.1", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^0.19.0", + "openid-client": "^5.1.6", + "request": "^2.88.0", + "rfc4648": "^1.3.0", + "shelljs": "^0.8.5", + "stream-buffers": "^3.0.2", + "tar": "^6.1.11", + "tmp-promise": "^3.0.2", + "tslib": "^1.9.3", + "underscore": "^1.9.1", + "ws": "^7.3.1" + }, + "dependencies": { + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "@napi-rs/snappy-android-arm-eabi": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.1.1.tgz", + "integrity": "sha512-NKd/ztuVEgQaAaNVQ5zZaCB9VV+7+uBXBHqhaE5iSapQhLc41szTlT0s68FCee75OoT3vhqdA6Jp5TrzZ2WOaw==", + "optional": true + }, + "@napi-rs/snappy-android-arm64": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.1.1.tgz", + "integrity": "sha512-DktruMAO0K0toTnxNHg2GWNIAPJqdvIchCsdsRaKyuEnG101qBg0mYiRCAhxHgbT6RJlOGbUPKkbA9KKRhEJUg==", + "optional": true + }, + "@napi-rs/snappy-darwin-arm64": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.1.1.tgz", + "integrity": "sha512-3LZyoAw3Qa5F7sCCTkSkhmGlydwUKU6L3Jl46eKHO2Ctm8Gcjxww6T7MfwlwGZ6JqAM6d1d++WLzUZPCGXVmag==", + "optional": true + }, + "@napi-rs/snappy-darwin-x64": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.1.1.tgz", + "integrity": "sha512-X1D2F67bQkPwr5iSR29/RnOrLwAkB55YO6t41toABzla3mflLDpzZcakz6FokIukykf7ey31/t73v/4pbgaBkg==", + "optional": true + }, + "@napi-rs/snappy-freebsd-x64": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.1.1.tgz", + "integrity": "sha512-vSeuf+An8jFVHPAn5IbWE9hTGU9PFAaZLj/X7rKTQQtZstnDsHgWe6u4g7FHLuOdwQ8TvhcxAEpNlYIXIk4AJg==", + "optional": true + }, + "@napi-rs/snappy-linux-arm-gnueabihf": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.1.1.tgz", + "integrity": "sha512-/yyN6QsnOs3D1+jI3SfRX+gtnD86rbixdfmgxv9g40+FrDaDTLAu/3VuZIqH02qqq/xiWbDnkO+42RGxXDzTCw==", + "optional": true + }, + "@napi-rs/snappy-linux-arm64-gnu": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.1.1.tgz", + "integrity": "sha512-StEeUCSwUoajgrBtiCQPTkHu+0Q4QlYndghGZNdbN1zJ1ny70YzPpevaFBUyjI/eJ+FN9uICKtwTPtQNSILS5g==", + "optional": true + }, "@napi-rs/snappy-linux-arm64-musl": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.1.1.tgz", "integrity": "sha512-jWEBRzj+lswZVYf0b5eY0fjMlBL9L9yqjmTuv2UIMjJNHPuR282LK/s3Fm9sYIXQtKkiCo5JyhmIcoghZ3v0Eg==", "optional": true }, - "@napi-rs/snappy-linux-x64-gnu": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.1.1.tgz", - "integrity": "sha512-41DPoAUFAU9VNrj/96qKfStH2Xq88ZYIsSz8BlITDm2ScoeDGOGbmaWguCXU7I+bC2uKWTmUVMXKqk6tVY6LEg==", - "optional": true + "@napi-rs/snappy-linux-x64-gnu": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.1.1.tgz", + "integrity": "sha512-41DPoAUFAU9VNrj/96qKfStH2Xq88ZYIsSz8BlITDm2ScoeDGOGbmaWguCXU7I+bC2uKWTmUVMXKqk6tVY6LEg==", + "optional": true + }, + "@napi-rs/snappy-linux-x64-musl": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.1.1.tgz", + "integrity": "sha512-xR4hzFQqVq6J8Zf6XyUVtFJBaRgDyAQYUoBsCr92tZ7gI/0RlWCV6Q6JMO/wP5CSsvyFJIAtSUXXqlzIpw0GPA==", + "optional": true + }, + "@napi-rs/snappy-win32-arm64-msvc": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.1.1.tgz", + "integrity": "sha512-2mHPadctsaYtrfSV5Na8ooTdI5rflPxP1pceY4us6vbjeWrfgB+KQCuEFOHsGXqFNfsi6L9nWH8nB9swnxnSyw==", + "optional": true + }, + "@napi-rs/snappy-win32-ia32-msvc": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.1.1.tgz", + "integrity": "sha512-FOMgs9W71hdgjyl3T9F7b/WEIuoryfgBqsyhtHjAaa/98R0BUHl0bOoHg8ka0b5GgnhLBHkX2Yd6VD+Si9Q2ww==", + "optional": true + }, + "@napi-rs/snappy-win32-x64-msvc": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.1.1.tgz", + "integrity": "sha512-Mu3yELySvzhBcNTVCq+hYxVh+lH3/KjoQ5HIEb3DDPoX0AGRTm3XZa+usq8pFWjl91Cgp9nWK+9lVSkCCIRaKA==", + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^2.0.0", + "@npmcli/promise-spawn": "^3.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^2.0.3", + "which": "^2.0.2" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, - "@napi-rs/snappy-linux-x64-musl": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.1.1.tgz", - "integrity": "sha512-xR4hzFQqVq6J8Zf6XyUVtFJBaRgDyAQYUoBsCr92tZ7gI/0RlWCV6Q6JMO/wP5CSsvyFJIAtSUXXqlzIpw0GPA==", - "optional": true + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, - "@napi-rs/snappy-win32-arm64-msvc": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.1.1.tgz", - "integrity": "sha512-2mHPadctsaYtrfSV5Na8ooTdI5rflPxP1pceY4us6vbjeWrfgB+KQCuEFOHsGXqFNfsi6L9nWH8nB9swnxnSyw==", - "optional": true + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } }, - "@napi-rs/snappy-win32-ia32-msvc": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.1.1.tgz", - "integrity": "sha512-FOMgs9W71hdgjyl3T9F7b/WEIuoryfgBqsyhtHjAaa/98R0BUHl0bOoHg8ka0b5GgnhLBHkX2Yd6VD+Si9Q2ww==", - "optional": true + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, - "@napi-rs/snappy-win32-x64-msvc": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.1.1.tgz", - "integrity": "sha512-Mu3yELySvzhBcNTVCq+hYxVh+lH3/KjoQ5HIEb3DDPoX0AGRTm3XZa+usq8pFWjl91Cgp9nWK+9lVSkCCIRaKA==", - "optional": true + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@scramjet/adapters": { + "version": "file:packages/adapters", "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@kubernetes/client-node": "^0.17.1", + "@scramjet/model": "^0.38.0", + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/pre-runner": "^0.38.0", + "@scramjet/python-runner": "^0.38.0", + "@scramjet/runner": "^0.38.0", + "@scramjet/sth-config": "^0.38.0", + "@scramjet/symbols": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/dockerode": "<=3.3.3", + "@types/js-yaml": "4.0.5", + "@types/node": "15.12.5", + "@types/request": "2.48.8", + "@types/shell-escape": "^0.2.1", + "@types/ws": "8.5.3", + "ava": "^3.15.0", + "dockerode": "^3.3.4", + "scramjet": "^4.36.9", + "shell-escape": "^0.2.0", + "ts-node": "^10.9.1", + "ts.data.json": "^2.2.0", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" } }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "@scramjet/api-client": { + "version": "file:packages/api-client", + "requires": { + "@scramjet/client-utils": "^0.38.0", + "@scramjet/sth-config": "^0.38.0", + "@scramjet/symbols": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "n-readlines": "^1.0.1", + "scramjet": "^4.36.9", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "@scramjet/api-server": { + "version": "file:packages/api-server", "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@scramjet/model": "^0.38.0", + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/symbols": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/node": "15.12.5", + "@types/sinon": "^10.0.13", + "@types/trouter": "^3.1.1", + "0http": "^3.4.1", + "ava": "^3.15.0", + "http-status-codes": "^2.2.0", + "scramjet": "^4.36.9", + "sinon": "^14.0.1", + "trouter": "^3.2.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + }, + "@scramjet/cli": { + "version": "file:packages/cli", + "requires": { + "@scramjet/api-client": "^0.38.0", + "@scramjet/client-utils": "^0.38.0", + "@scramjet/middleware-api-client": "^0.38.0", + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/find-package-json": "^1.2.3", + "@types/minimatch": "^3.0.5", + "@types/node": "15.12.5", + "@types/tar": "^6.1.3", + "@types/validator": "^13.7.8", + "ava": "^3.15.0", + "chalk": "^4.1.2", + "commander": "^9.5.0", + "find-package-json": "^1.2.0", + "minimatch": "^3.1.2", + "scramjet": "^4.36.9", + "tar": "^6.1.11", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4", + "validator": "^13.7.0" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + } + } + }, + "@scramjet/client-utils": { + "version": "file:packages/client-utils", + "requires": { + "@scramjet/model": "^0.38.0", + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/sth-config": "^0.38.0", + "@scramjet/symbols": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/node": "15.12.5", + "@types/node-fetch": "^2.6.2", + "abort-controller": "^3.0.0", + "ava": "^3.15.0", + "n-readlines": "^1.0.1", + "node-fetch": "^2.6.7", + "normalize-url": "4", + "scramjet": "^4.36.9", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + }, + "@scramjet/host": { + "version": "file:packages/host", + "requires": { + "@scramjet/adapters": "^0.38.0", + "@scramjet/api-server": "^0.38.0", + "@scramjet/load-check": "^0.38.0", + "@scramjet/model": "^0.38.0", + "@scramjet/module-loader": "^0.38.0", + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/sth-config": "^0.38.0", + "@scramjet/symbols": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", + "@scramjet/telemetry": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@scramjet/verser": "^0.38.0", + "@types/find-package-json": "^1.2.3", + "@types/jest": "^29.4.4", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "ext-ip": "^0.3.9", + "find-package-json": "^1.2.0", + "http-status-codes": "^2.2.0", + "jest": "^29.5.0", + "minimist": "^1.2.6", + "pico-s3": "^2.0.0", + "rereadable-stream": "^1.4.14", + "scramjet": "^4.36.9", + "ts-jest": "^29.0.5", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + }, + "@scramjet/load-check": { + "version": "file:packages/load-check", + "requires": { + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/node": "15.12.5", + "@types/node-os-utils": "^1.2.0", + "@types/uuid": "^8.3.4", + "ava": "^3.15.0", + "diskusage-ng": "1.0.2", + "node-os-utils": "1.3.7", + "scramjet": "^4.36.9", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4", + "uuid": "^8.3.2" } }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, + "@scramjet/logger": { + "version": "file:packages/logger", "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "nyc": "^15.1.0", + "scramjet": "^4.36.9", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" } }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, + "@scramjet/manager-api-client": { + "version": "file:packages/manager-api-client", "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "@scramjet/api-client": "^0.38.0", + "@scramjet/client-utils": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" } }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "dev": true - }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", - "dev": true, + "@scramjet/middleware-api-client": { + "version": "file:packages/middleware-api-client", "requires": { - "infer-owner": "^1.0.4" + "@scramjet/api-client": "^0.38.0", + "@scramjet/client-utils": "^0.38.0", + "@scramjet/manager-api-client": "^0.38.0", + "@scramjet/multi-manager-api-client": "^0.38.0", + "@scramjet/types": "^0.38.0", + "ava": "^3.15.0", + "esbuild": "^0.14.54", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" } }, - "@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", - "dev": true, + "@scramjet/model": { + "version": "file:packages/model", "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/symbols": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "@types/uuid": "^8.3.4", + "ava": "^3.15.0", + "scramjet": "^4.36.9", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4", + "uuid": "^8.3.2" } }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "@scramjet/module-loader": { + "version": "file:packages/module-loader", "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@scramjet/obj-logger": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" } }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@scramjet/adapters": { - "version": "file:packages/adapters", + "@scramjet/monitoring-server": { + "version": "file:packages/monitoring-server", "requires": { - "@kubernetes/client-node": "^0.17.1", - "@scramjet/model": "^0.38.0", - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/pre-runner": "^0.38.0", - "@scramjet/python-runner": "^0.38.0", - "@scramjet/runner": "^0.38.0", - "@scramjet/sth-config": "^0.38.0", - "@scramjet/symbols": "^0.38.0", "@scramjet/types": "^0.38.0", "@scramjet/utility": "^0.38.0", - "@types/dockerode": "<=3.3.3", - "@types/js-yaml": "4.0.5", "@types/node": "15.12.5", - "@types/request": "2.48.8", - "@types/shell-escape": "^0.2.1", - "@types/ws": "8.5.3", "ava": "^3.15.0", - "dockerode": "^3.3.4", - "scramjet": "^4.36.9", - "shell-escape": "^0.2.0", + "nyc": "^15.1.0", "ts-node": "^10.9.1", - "ts.data.json": "^2.2.0", "typedoc": "0.23.17", "typedoc-plugin-markdown": "3.13.6", "typescript": "~4.7.4" - }, - "dependencies": { - "@scramjet/pre-runner": { - "version": "file:packages/pre-runner" - }, - "@scramjet/python-runner": { - "version": "file:packages/python-runner" - }, - "@scramjet/runner": { - "version": "file:packages/runner", - "requires": { - "@scramjet/api-client": "^0.38.0", - "@scramjet/client-utils": "^0.38.0", - "@scramjet/manager-api-client": "^0.38.0", - "@scramjet/model": "^0.38.0", - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/symbols": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@types/node": "15.12.5", - "@types/sinon": "^10.0.13", - "ava": "^3.15.0", - "bpmux": "^8.2.1", - "nyc": "^15.1.0", - "proxyquire": "^2.1.3", - "scramjet": "^4.36.9", - "sinon": "^14.0.1", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" - } - } } }, - "@scramjet/api-client": { - "version": "file:packages/api-client", + "@scramjet/multi-manager-api-client": { + "version": "file:packages/multi-manager-api-client", "requires": { + "@scramjet/api-client": "^0.38.0", "@scramjet/client-utils": "^0.38.0", - "@scramjet/sth-config": "^0.38.0", - "@scramjet/symbols": "^0.38.0", + "@scramjet/manager-api-client": "^0.38.0", "@scramjet/types": "^0.38.0", "@types/node": "15.12.5", "ava": "^3.15.0", - "n-readlines": "^1.0.1", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + }, + "@scramjet/obj-logger": { + "version": "file:packages/obj-logger", + "requires": { + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "nyc": "^15.1.0", "scramjet": "^4.36.9", "ts-node": "^10.9.1", "typedoc": "0.23.17", @@ -18602,334 +19685,660 @@ "typescript": "~4.7.4" } }, - "@scramjet/api-server": { - "version": "file:packages/api-server", + "@scramjet/pre-runner": { + "version": "file:packages/pre-runner" + }, + "@scramjet/python-runner": { + "version": "file:packages/python-runner" + }, + "@scramjet/runner": { + "version": "file:packages/runner", "requires": { + "@scramjet/api-client": "^0.38.0", + "@scramjet/client-utils": "^0.38.0", + "@scramjet/manager-api-client": "^0.38.0", "@scramjet/model": "^0.38.0", "@scramjet/obj-logger": "^0.38.0", "@scramjet/symbols": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", "@scramjet/types": "^0.38.0", "@scramjet/utility": "^0.38.0", "@types/node": "15.12.5", "@types/sinon": "^10.0.13", - "@types/trouter": "^3.1.1", - "0http": "^3.4.1", "ava": "^3.15.0", - "http-status-codes": "^2.2.0", + "nyc": "^15.1.0", + "proxyquire": "^2.1.3", "scramjet": "^4.36.9", "sinon": "^14.0.1", - "trouter": "^3.2.0", "ts-node": "^10.9.1", "typedoc": "0.23.17", "typedoc-plugin-markdown": "3.13.6", "typescript": "~4.7.4" } }, - "@scramjet/cli": { - "version": "file:packages/cli", + "@scramjet/stdio-sequence": { + "version": "file:packages/stdio-sequence", "requires": { - "@scramjet/api-client": "^0.38.0", - "@scramjet/client-utils": "^0.38.0", - "@scramjet/middleware-api-client": "^0.38.0", + "scramjet": "^4.36.6" + } + }, + "@scramjet/sth": { + "version": "file:packages/sth", + "requires": { + "@scramjet/host": "^0.38.0", + "@scramjet/model": "^0.38.0", "@scramjet/obj-logger": "^0.38.0", + "@scramjet/sth-config": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "commander": "^8.3.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } + } + }, + "@scramjet/sth-config": { + "version": "file:packages/sth-config", + "requires": { + "@scramjet/types": "^0.38.0", + "@scramjet/utility": "^0.38.0", + "ava": "^3.15.0", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6" + } + }, + "@scramjet/symbols": { + "version": "file:packages/symbols", + "requires": { + "@types/node": "15.12.5", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + } + }, + "@scramjet/tecemux": { + "version": "file:packages/tecemux", + "requires": { + "@scramjet/api-server": "^0.38.0", + "@scramjet/obj-logger": "^0.36.1", "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@types/find-package-json": "^1.2.3", - "@types/minimatch": "^3.0.5", + "@scramjet/utility": "^0.36.1", "@types/node": "15.12.5", - "@types/tar": "^6.1.3", - "@types/validator": "^13.7.8", "ava": "^3.15.0", - "chalk": "^4.1.2", - "commander": "^9.5.0", - "find-package-json": "^1.2.0", - "minimatch": "^3.1.2", - "scramjet": "^4.36.9", - "tar": "^6.1.11", + "bpmux": "^8.2.1", "ts-node": "^10.9.1", "typedoc": "0.23.17", "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4", - "validator": "^13.7.0" + "typescript": "~4.7.4" }, "dependencies": { - "@scramjet/middleware-api-client": { - "version": "file:packages/middleware-api-client", + "@scramjet/obj-logger": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@scramjet/obj-logger/-/obj-logger-0.36.1.tgz", + "integrity": "sha512-3yDell8/QKf+W4lGCgm74tf+bNS/S0U0//xO/7FyZbiE69ajJhd3f9C70Q2Xf9xYBMyhpJuK+vTteGAJiJCtdQ==", "requires": { - "@scramjet/api-client": "^0.38.0", - "@scramjet/client-utils": "^0.38.0", - "@scramjet/manager-api-client": "^0.38.0", - "@scramjet/multi-manager-api-client": "^0.38.0", - "@scramjet/types": "^0.38.0", - "ava": "^3.15.0", - "esbuild": "^0.14.54", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" + "@scramjet/utility": "^0.36.1", + "scramjet": "^4.36.9" } }, - "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + "@scramjet/utility": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@scramjet/utility/-/utility-0.36.1.tgz", + "integrity": "sha512-sDanZi5evXaTs+LsR/O1znCZuAa7sJv5EDwGLEF2RpW5fBFOWGhtcCJJ3yJN4qQeyMtjTu/J6c4wnBiZNK4JHQ==", + "requires": { + "normalize-url": "4", + "yaml": "^2.2.2" + } } } }, - "@scramjet/client-utils": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/client-utils/-/client-utils-0.38.0.tgz", - "integrity": "sha512-DzxwgcSCEtIxdG+GsIReL1Zhkh9zKnPDIq3zbVt9Svvsq/UuP94KGg25KVelvr0OTM/yEEovJw9/yOMDWLiXbQ==", + "@scramjet/telemetry": { + "version": "file:packages/telemetry", "requires": { - "@scramjet/model": "^0.38.0", "@scramjet/obj-logger": "^0.38.0", - "@scramjet/sth-config": "^0.38.0", - "@scramjet/symbols": "^0.38.0", + "@scramjet/types": "^0.38.0", "@scramjet/utility": "^0.38.0", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "n-readlines": "^1.0.1", - "node-fetch": "^2.6.7", - "normalize-url": "4", - "scramjet": "^4.36.9" + "ava": "^3.15.0", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "winston": "^3.8.2", + "winston-loki": "^6.0.6" } }, - "@scramjet/host": { - "version": "file:packages/host", + "@scramjet/types": { + "version": "file:packages/types", "requires": { - "@scramjet/adapters": "^0.38.0", - "@scramjet/api-server": "^0.38.0", - "@scramjet/load-check": "^0.38.0", - "@scramjet/model": "^0.38.0", - "@scramjet/module-loader": "^0.38.0", - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/sth-config": "^0.38.0", "@scramjet/symbols": "^0.38.0", - "@scramjet/telemetry": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@scramjet/verser": "^0.38.0", - "@types/find-package-json": "^1.2.3", - "@types/jest": "^29.4.4", "@types/node": "15.12.5", - "ava": "^3.15.0", - "bpmux": "^8.2.1", - "ext-ip": "^0.3.9", - "find-package-json": "^1.2.0", "http-status-codes": "^2.2.0", - "jest": "^29.5.0", - "minimist": "^1.2.6", - "pico-s3": "^2.0.0", - "rereadable-stream": "^1.4.14", "scramjet": "^4.36.9", - "ts-jest": "^29.0.5", - "ts-node": "^10.9.1", "typedoc": "0.23.17", "typedoc-plugin-markdown": "3.13.6", "typescript": "~4.7.4" + } + }, + "@scramjet/utility": { + "version": "file:packages/utility", + "requires": { + "@scramjet/types": "^0.38.0", + "ava": "^4.3.3", + "normalize-url": "4", + "typed-emitter": "^1.4.0", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "yaml": "^2.2.2" }, "dependencies": { - "@scramjet/load-check": { - "version": "file:packages/load-check", + "aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "requires": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + } + }, + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true + }, + "ava": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/ava/-/ava-4.3.3.tgz", + "integrity": "sha512-9Egq/d9R74ExrWohHeqUlexjDbgZJX5jA1Wq4KCTqc3wIfpGEK79zVy4rBtofJ9YKIxs4PzhJ8BgbW5PlAYe6w==", + "dev": true, + "requires": { + "acorn": "^8.7.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.1.0", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.0.1", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.3.1", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "del": "^6.1.1", + "emittery": "^0.11.0", + "figures": "^4.0.1", + "globby": "^13.1.1", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.4.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^7.0.1", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.5", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^2.0.0", + "write-file-atomic": "^4.0.1", + "yargs": "^17.5.1" + } + }, + "callsites": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz", + "integrity": "sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==", + "dev": true + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, + "clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "requires": { + "escape-string-regexp": "5.0.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + } + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "requires": { + "convert-to-spaces": "^2.0.1" + } + }, + "convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "dev": true + }, + "emittery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.11.0.tgz", + "integrity": "sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "figures": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz", + "integrity": "sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w==", + "dev": true, + "requires": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "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 + }, + "globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + }, + "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, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dev": true, + "requires": { + "escape-string-regexp": "^5.0.0" + } + }, + "mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + } + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dev": true, + "requires": { + "p-timeout": "^5.0.2" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, "requires": { - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@types/node": "15.12.5", - "@types/node-os-utils": "^1.2.0", - "@types/uuid": "^8.3.4", - "ava": "^3.15.0", - "diskusage-ng": "1.0.2", - "node-os-utils": "1.3.7", - "scramjet": "^4.36.9", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4", - "uuid": "^8.3.2" + "p-limit": "^4.0.0" } }, - "@scramjet/module-loader": { - "version": "file:packages/module-loader", + "p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "requires": { + "aggregate-error": "^4.0.0" + } + }, + "p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "requires": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + } + }, + "plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "requires": { + "irregular-plurals": "^3.3.0" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "requires": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "requires": { - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, - "@scramjet/telemetry": { - "version": "file:packages/telemetry", + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "requires": { - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "ava": "^3.15.0", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "winston": "^3.8.2", - "winston-loki": "^6.0.6" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" } }, - "@scramjet/verser": { - "version": "file:packages/verser", + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "requires": { - "@scramjet/api-server": "^0.38.0", - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "bpmux": "^8.2.1", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true } } }, - "@scramjet/logger": { - "version": "file:packages/logger", - "requires": { - "@scramjet/types": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "nyc": "^15.1.0", - "scramjet": "^4.36.9", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" - } - }, - "@scramjet/manager-api-client": { - "version": "file:packages/manager-api-client", - "requires": { - "@scramjet/api-client": "^0.38.0", - "@scramjet/client-utils": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" - } - }, - "@scramjet/model": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/model/-/model-0.38.0.tgz", - "integrity": "sha512-KaIqZi6tbNnBZcc7TmvJhki+oO3k+EKUuH7h044LGatVcS5tbMrIki3w5BX41OCi5neigDCoOla/nJraod6IcQ==", - "requires": { - "@scramjet/obj-logger": "^0.38.0", - "@scramjet/symbols": "^0.38.0", - "scramjet": "^4.36.9", - "uuid": "^8.3.2" - } - }, - "@scramjet/monitoring-server": { - "version": "file:packages/monitoring-server", - "requires": { - "@scramjet/types": "^0.38.0", - "@scramjet/utility": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "nyc": "^15.1.0", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" - } - }, - "@scramjet/multi-manager-api-client": { - "version": "file:packages/multi-manager-api-client", - "requires": { - "@scramjet/api-client": "^0.38.0", - "@scramjet/client-utils": "^0.38.0", - "@scramjet/manager-api-client": "^0.38.0", - "@scramjet/types": "^0.38.0", - "@types/node": "15.12.5", - "ava": "^3.15.0", - "ts-node": "^10.9.1", - "typedoc": "0.23.17", - "typedoc-plugin-markdown": "3.13.6", - "typescript": "~4.7.4" - } - }, - "@scramjet/obj-logger": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/obj-logger/-/obj-logger-0.38.0.tgz", - "integrity": "sha512-2RLYiGnVbt1rGN74yvhqocz3PDxjYdO2Rb0GKlxYZJ2JQB/hIVAJSE47wUjKmPkG39anH6UrfGV8T73paH9qgg==", - "requires": { - "@scramjet/utility": "^0.38.0", - "scramjet": "^4.36.9" - } - }, - "@scramjet/stdio-sequence": { - "version": "file:packages/stdio-sequence", - "requires": { - "scramjet": "^4.36.6" - } - }, - "@scramjet/sth": { - "version": "file:packages/sth", + "@scramjet/verser": { + "version": "file:packages/verser", "requires": { - "@scramjet/host": "^0.38.0", - "@scramjet/model": "^0.38.0", + "@scramjet/api-server": "^0.38.0", "@scramjet/obj-logger": "^0.38.0", - "@scramjet/sth-config": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", "@scramjet/types": "^0.38.0", "@scramjet/utility": "^0.38.0", "@types/node": "15.12.5", "ava": "^3.15.0", - "commander": "^8.3.0", "ts-node": "^10.9.1", "typedoc": "0.23.17", "typedoc-plugin-markdown": "3.13.6", "typescript": "~4.7.4" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - } - } - }, - "@scramjet/sth-config": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/sth-config/-/sth-config-0.38.0.tgz", - "integrity": "sha512-Glm/lXMK3UsdAwnWnINlxGm7UFaJfGCnDgjwtI8DVHOL3+52SujFbO0fNb/ye0htR77vNg6GTydbK8sEFdTbkw==", - "requires": { - "@scramjet/utility": "^0.38.0" - } - }, - "@scramjet/symbols": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/symbols/-/symbols-0.38.0.tgz", - "integrity": "sha512-Wjg0JUFybp++ngDUovkoBb3IrfVAjo3OeK6d7JodCOVlgrPsOs2jvmINhGhTfbB/WZx0/sRHeG6Yr9zmpDY3Cg==" - }, - "@scramjet/types": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/types/-/types-0.38.0.tgz", - "integrity": "sha512-6PlWPgdP5ot65Zr17d01rf9m6rgL9xgsliFw2yhikEPflLV8c2ohSGSsptR+faM+x+pNyN/O9TnxbSzwwWBNVA==", - "requires": { - "@scramjet/symbols": "^0.38.0", - "http-status-codes": "^2.2.0" - } - }, - "@scramjet/utility": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@scramjet/utility/-/utility-0.38.0.tgz", - "integrity": "sha512-jSxeqm1BJ/ZczZAlcXP8tiU4k0cRTF4oVFsrczSw07sxliHbKSh7FaYsRfDKrO53xOlyD5FGLER/3IJckFlPpQ==", - "requires": { - "normalize-url": "4", - "yaml": "^2.2.2" } }, "@sinclair/typebox": { @@ -19191,6 +20600,7 @@ "version": "2.6.10", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz", "integrity": "sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==", + "dev": true, "requires": { "@types/node": "*", "form-data": "^4.0.0" @@ -20457,6 +21867,15 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "requires": { + "nofilter": "^3.1.0" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -21137,6 +22556,12 @@ "integrity": "sha512-V/lf7y33dGaypZZetVI1eu7BmvkbC4dItq12OElLRpKuaU5JxQstV2zHwLv8P7cNbQ+KL1WD80zMCTx5dNC4dg==", "dev": true }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -21889,9 +23314,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -22081,6 +23506,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -24390,6 +25816,12 @@ "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", "dev": true }, + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true + }, "nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -24644,6 +26076,8 @@ "dependencies": { "npm-bundled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "bundled": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -24762,6 +26196,8 @@ }, "agentkeepalive": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", "bundled": true, "requires": { "debug": "^4.1.0", @@ -24844,6 +26280,8 @@ "dependencies": { "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "bundled": true } } @@ -24940,7 +26378,9 @@ } }, "cli-table3": { - "version": "0.6.2", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "bundled": true, "requires": { "@colors/colors": "1.5.0", @@ -25028,6 +26468,8 @@ "dependencies": { "ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "bundled": true } } @@ -25053,6 +26495,8 @@ }, "depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "bundled": true }, "dezalgo": { @@ -25141,7 +26585,9 @@ } }, "glob": { - "version": "8.0.3", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "bundled": true, "requires": { "fs.realpath": "^1.0.0", @@ -25533,7 +26979,9 @@ } }, "minimatch": { - "version": "5.1.0", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "bundled": true, "requires": { "brace-expansion": "^2.0.1" @@ -25648,14 +27096,17 @@ "bundled": true }, "node-gyp": { - "version": "9.1.0", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "bundled": true, "requires": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -25675,6 +27126,8 @@ }, "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "bundled": true, "requires": { "fs.realpath": "^1.0.0", @@ -25700,6 +27153,15 @@ "requires": { "abbrev": "1" } + }, + "semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -25744,6 +27206,8 @@ "dependencies": { "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "bundled": true } } @@ -25787,6 +27251,8 @@ "dependencies": { "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "bundled": true } } @@ -25805,6 +27271,8 @@ "dependencies": { "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "bundled": true } } @@ -26004,6 +27472,8 @@ "dependencies": { "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "bundled": true } } @@ -26068,6 +27538,8 @@ }, "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "bundled": true, "requires": { "fs.realpath": "^1.0.0", @@ -26103,7 +27575,9 @@ "optional": true }, "semver": { - "version": "7.3.7", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "bundled": true, "requires": { "lru-cache": "^6.0.0" @@ -26111,6 +27585,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "bundled": true, "requires": { "yallist": "^4.0.0" @@ -27841,6 +29317,30 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + } + } + }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -28638,6 +30138,12 @@ "is-typed-array": "^1.1.9" } }, + "typed-emitter": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz", + "integrity": "sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==", + "dev": true + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", diff --git a/packages/host/package.json b/packages/host/package.json index e1572e297..d9ae83dc4 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -28,8 +28,8 @@ "@scramjet/symbols": "^0.38.0", "@scramjet/telemetry": "^0.38.0", "@scramjet/utility": "^0.38.0", + "@scramjet/tecemux": "^0.38.0", "@scramjet/verser": "^0.38.0", - "bpmux": "^8.2.1", "ext-ip": "^0.3.9", "find-package-json": "^1.2.0", "http-status-codes": "^2.2.0", diff --git a/packages/host/src/lib/cpm-connector.ts b/packages/host/src/lib/cpm-connector.ts index 00e1ea0fd..53417adc8 100644 --- a/packages/host/src/lib/cpm-connector.ts +++ b/packages/host/src/lib/cpm-connector.ts @@ -172,10 +172,10 @@ export class CPMConnector extends TypedEmitter { headers: { "x-sth-description": typeof this.config.description !== "undefined" ? this.config.description : "", "x-sth-tags": JSON.stringify(typeof this.config.tags !== "undefined" ? this.config.tags : []), - "x-manager-id": cpmId, "x-sth-id": this.config.id || "", - ...orgId && { "x-org-id": orgId }, - ...sthKey && { Authorization: `Digest cnonce="${sthKey}"` } + "x-manager-id": cpmId, + ...orgId ? { "x-org-id": orgId } : {}, + ...sthKey ? { Authorization: `Digest cnonce="${sthKey}"` } : {} }, server, https: this.isHttps @@ -353,10 +353,10 @@ export class CPMConnector extends TypedEmitter { connection.socket .once("close", async () => { - this.logger.warn("Space request close status", connection.res.statusCode); - this.logger.warn("Space request close message", connection.res.statusMessage); + this.logger.warn("Space request close status", connection.response.statusCode); + this.logger.warn("Space request close message", connection.response.statusMessage); - await this.handleConnectionClose(connection.res.statusCode || -1); + await this.handleConnectionClose(connection.response.statusCode || -1); }); } catch (error: any) { this.logger.error("Can not connect to Manager", this.cpmUrl, this.cpmId, error.message); @@ -375,7 +375,7 @@ export class CPMConnector extends TypedEmitter { this.connected = true; this.connectionAttempts = 0; - connection.res.once("error", async (error: any) => { + connection.response.once("error", async (error: any) => { this.logger.error("Request error", error); try { diff --git a/packages/host/src/lib/csi-controller.ts b/packages/host/src/lib/csi-controller.ts index abb572933..af3053e36 100644 --- a/packages/host/src/lib/csi-controller.ts +++ b/packages/host/src/lib/csi-controller.ts @@ -45,6 +45,7 @@ import { DuplexStream, getRouter } from "@scramjet/api-server"; import { getInstanceAdapter } from "@scramjet/adapters"; import { cancellableDefer, CancellablePromise, defer, promiseTimeout, TypedEmitter } from "@scramjet/utility"; import { ObjLogger } from "@scramjet/obj-logger"; +import { TeceMux } from "@scramjet/tecemux"; import { ReasonPhrases } from "http-status-codes"; /** @@ -64,8 +65,6 @@ type Events = { terminated: (code: number) => void; }; -const BPMux = require("bpmux").BPMux; - /** * Handles all Instance lifecycle, exposes instance's HTTP API. */ @@ -76,7 +75,6 @@ export class CSIController extends TypedEmitter { private keepAliveRequested?: boolean; private _lastStats?: MonitoringMessageData; - private bpmux: any; private adapter: string; get lastStats(): InstanceStats { @@ -487,6 +485,7 @@ export class CSIController extends TypedEmitter { }); this.communicationHandler.addMonitoringHandler(RunnerMessageCode.PANG, async (message) => { + this.logger.info("PANG"); const pangData = message[1]; this.provides ||= this.outputTopic || pangData.provides; @@ -546,7 +545,7 @@ export class CSIController extends TypedEmitter { msgCode: RunnerMessageCode.PONG, appConfig: this.appConfig, args: this.args - }; + } as HandshakeAcknowledgeMessage; await this.controlDataStream.whenWrote(MessageUtilities.serializeMessage(pongMsg)); } else { @@ -557,18 +556,16 @@ export class CSIController extends TypedEmitter { this.logger.info("Instance started", this.info); } - async handleInstanceConnect(streams: DownstreamStreamsConfig) { + async handleInstanceConnect(streams: DownstreamStreamsConfig, protocol: TeceMux) { try { this.hookupStreams(streams); this.createInstanceAPIRouter(); - this.bpmux = new BPMux(streams[8]); - this.bpmux.on("error", (e: any) => { - this.logger.warn("Instance client multiplex connection errored", e.message); - streams[8]?.end(); - }); - this.bpmux.on("peer_multiplex", (socket: Duplex, _data: any) => this.hostProxy.onInstanceRequest(socket)); + protocol + .on("channel", (socket: Duplex) => this.hostProxy.onInstanceRequest(socket)); + await once(this, "pang"); + this.initResolver?.res(); } catch (e: any) { this.initResolver?.rej(e); diff --git a/packages/host/src/lib/host.ts b/packages/host/src/lib/host.ts index e5b9e60fd..22238a733 100644 --- a/packages/host/src/lib/host.ts +++ b/packages/host/src/lib/host.ts @@ -161,11 +161,12 @@ export class Host implements IComponent { * Sets listener for connections to socket server. */ private attachListeners() { - this.socketServer.on("connect", async (id, streams) => { + this.socketServer.on("connect", async (id, streams, protocol) => { this.logger.debug("Instance connected", id); await this.instancesStore[id].handleInstanceConnect( - streams + streams, + protocol ); }); } diff --git a/packages/host/src/lib/socket-server.ts b/packages/host/src/lib/socket-server.ts index ac48cc069..c9e38b11b 100644 --- a/packages/host/src/lib/socket-server.ts +++ b/packages/host/src/lib/socket-server.ts @@ -1,21 +1,26 @@ -import { IComponent, DownstreamStreamsConfig, IObjectLogger } from "@scramjet/types"; +import { IComponent, IObjectLogger } from "@scramjet/types"; -import net from "net"; +import net, { Socket } from "net"; import { isDefined, TypedEmitter } from "@scramjet/utility"; import { ObjLogger } from "@scramjet/obj-logger"; +import { TeceMux, TeceMuxChannel } from "@scramjet/tecemux"; + +type MaybeChannel = TeceMuxChannel | Socket | null; + +type RunnerChannels = [ + TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, + TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, TeceMuxChannel +]; -type MaybeSocket = net.Socket | null type RunnerConnectionsInProgress = [ - MaybeSocket, MaybeSocket, MaybeSocket, MaybeSocket, MaybeSocket, MaybeSocket, MaybeSocket, MaybeSocket, MaybeSocket -] -type RunnerOpenConnections = [ - net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket -] + MaybeChannel, MaybeChannel, MaybeChannel, MaybeChannel, MaybeChannel, + MaybeChannel, MaybeChannel, MaybeChannel, MaybeChannel +]; type Events = { - connect: (id: string, streams: DownstreamStreamsConfig) => void -} + connect: (id: string, streams: RunnerChannels, protocol: TeceMux) => void +}; /** * Server for incoming connections from Runners @@ -37,37 +42,44 @@ export class SocketServer extends TypedEmitter implements IComponent { async start(): Promise { this.server = net.createServer(); - this.server - .on("connection", async (connection) => { - connection.setNoDelay(true); - connection.on("error", (err) => { - this.logger.error("Error on connection from runner", err); - }); + let protocol: TeceMux; - const id = await new Promise((resolve) => { - connection.once("readable", () => { - resolve(connection.read(36).toString()); - }); - }); + this.server.on("connection", async (runnerConnection: net.Socket) => { + runnerConnection.setNoDelay(true); + runnerConnection.on("error", (err) => { + this.logger.error("Error on connection from runner", err); + }); - const channel = await new Promise((resolve) => { - connection.once("readable", () => { - resolve(parseInt(connection.read(1).toString(), 10)); + protocol = new TeceMux(runnerConnection); + + protocol.on("channel", async (channel: TeceMuxChannel) => { + const { instanceId, channelId } = + await new Promise<{ instanceId: string, channelId: number }>((resolve) => { + channel.once("readable", () => { + const payload = channel.read(37).toString(); + const instId = payload.substring(0, 36); + const chanId = parseInt(payload.substring(36, 37), 10); + + resolve({ + instanceId: instId, + channelId: chanId + }); + }); }); - }); - connection - .on("error", (err) => this.logger.error("Error on Instance in stream", id, channel, err)) - .on("end", () => this.logger.debug(`Channel [${id}:${channel}] ended`)); + channel + .on("error", (err: any) => this.logger.error("Error on Instance in stream", instanceId, channelId, err)) + .on("end", () => this.logger.debug(`Channel [${instanceId}:${channelId}] ended`)); try { - await this.handleConnection(id, channel, connection); + await this.handleCommunicationChannel(instanceId, channelId, channel as unknown as Socket, protocol); } catch (err: any) { - connection.destroy(); + channel.destroy(); } }); + }); - return new Promise((res, rej) => { + return new Promise((res, rej) => { this.server! .listen(this.port, this.hostname, () => { this.logger.info("SocketServer on", this.server?.address()); @@ -77,7 +89,7 @@ export class SocketServer extends TypedEmitter implements IComponent { }); } - async handleConnection(id: string, channel: number, connection: net.Socket) { + async handleCommunicationChannel(id: string, channel: number, connection: net.Socket, protocol: TeceMux) { let runner = this.runnerConnectionsInProgress.get(id); if (!runner) { @@ -90,11 +102,15 @@ export class SocketServer extends TypedEmitter implements IComponent { } else { throw new Error(`Runner(${id}) wanted to connect on already initialized channel ${channel}`); } + if (runner.every(isDefined)) { + protocol.removeAllListeners("channel"); + this.runnerConnectionsInProgress.delete(id); - this.emit("connect", id, runner as RunnerOpenConnections); + this.emit("connect", id, runner as RunnerChannels, protocol); } } + close() { this.server?.close((err: any) => { if (err) { diff --git a/packages/obj-logger/src/obj-logger.ts b/packages/obj-logger/src/obj-logger.ts index 826f12a67..885805b23 100644 --- a/packages/obj-logger/src/obj-logger.ts +++ b/packages/obj-logger/src/obj-logger.ts @@ -202,7 +202,6 @@ export class ObjLogger implements IObjectLogger { }) // eslint-disable-next-line no-console .catch((e: any) => { console.error(e?.cause); }); - return this._stringifiedOutput; } diff --git a/packages/python-runner/Dockerfile b/packages/python-runner/Dockerfile index 8b5f58636..7e9908ac2 100644 --- a/packages/python-runner/Dockerfile +++ b/packages/python-runner/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9-slim-bullseye +FROM python:3.10-slim-bullseye ENV PACKAGE_DIR=/package \ HUB_DIR=/opt/transform-hub @@ -15,6 +15,7 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* COPY packages/python-runner/*.py ./ +COPY packages/python-runner/tecemux ./tecemux COPY packages/python-runner/requirements.txt ./requirements.txt COPY packages/python-runner/docker-entrypoint.sh /usr/local/bin/ COPY packages/runner/unpack.sh /usr/local/bin/ diff --git a/packages/python-runner/logging_setup.py b/packages/python-runner/logging_setup.py index 39a265e02..3a7ba7a2a 100644 --- a/packages/python-runner/logging_setup.py +++ b/packages/python-runner/logging_setup.py @@ -9,7 +9,7 @@ def formatMessage(self, record): # record.created is a float in seconds, we want ms. # Note that using timestamp gives us UTC, as desired. return json.dumps({ - "ts": round(record.created*1000), + "ts": round(record.created * 1000), "level": record.levelname, "from": record.name, "msg": record.message, @@ -29,7 +29,6 @@ def __init__(self, target, min_loglevel=logging.DEBUG) -> None: self.create_handlers(min_loglevel) self.adjust_levels() - def create_handlers(self, min_loglevel): formatter = JsonFormatter() @@ -43,7 +42,6 @@ def create_handlers(self, min_loglevel): self._temp_handler.setFormatter(formatter) self.logger.addHandler(self._temp_handler) - def adjust_levels(self): # Adjust level names according to transform hub convention. logging.addLevelName(logging.WARNING, "WARN") @@ -52,14 +50,12 @@ def adjust_levels(self): # Un-deprecate "warn", as transform-hub uses "warn" rather than "warning". self.logger.warn = self.logger.warning - def switch_target(self, new_target): old_target = self._target self._main_handler.setStream(new_target) self._target = new_target old_target.close() - def flush_temp_handler(self): self._temp_handler.setTarget(self._main_handler) self._temp_handler.close() diff --git a/packages/python-runner/package.json b/packages/python-runner/package.json index ec56f95b9..434d90ebf 100644 --- a/packages/python-runner/package.json +++ b/packages/python-runner/package.json @@ -12,7 +12,6 @@ "build:docker-tf": "docker build -t scramjetorg/runner-py-tf:$(git rev-parse HEAD) -f Dockerfile-tf-gpu ../../" }, "assets": [ - "hardcoded_magic_values.py", "logging_setup.py", "runner.py" ], diff --git a/packages/python-runner/pytest.ini b/packages/python-runner/pytest.ini new file mode 100644 index 000000000..864639716 --- /dev/null +++ b/packages/python-runner/pytest.ini @@ -0,0 +1,3 @@ +# pytest.ini +[pytest] +asyncio_mode = auto diff --git a/packages/python-runner/requirements.txt b/packages/python-runner/requirements.txt index 0d96bca35..c370aa528 100644 --- a/packages/python-runner/requirements.txt +++ b/packages/python-runner/requirements.txt @@ -1,2 +1,5 @@ +attrs==23.1.0 pyee==9.0.4 -scramjet-framework-py \ No newline at end of file +scramjet-framework-py +scramjet-api-client +tecemux/ \ No newline at end of file diff --git a/packages/python-runner/runner.py b/packages/python-runner/runner.py index b3ae136e1..6e12131c9 100644 --- a/packages/python-runner/runner.py +++ b/packages/python-runner/runner.py @@ -3,20 +3,22 @@ import os import codecs import json +import logging from pyee.asyncio import AsyncIOEventEmitter import importlib.util from io import DEFAULT_BUFFER_SIZE as CHUNK_SIZE import types from scramjet.streams import Stream from logging_setup import LoggingSetup -from hardcoded_magic_values import CommunicationChannels as CC -from hardcoded_magic_values import RunnerMessageCodes as msg_codes +from tecemux.multiplexer import Tecemux +from tecemux.hardcoded_magic_values import CommunicationChannels as CC +from tecemux.hardcoded_magic_values import RunnerMessageCodes as msg_codes +from client.host_client import HostClient - -sequence_path = os.getenv('SEQUENCE_PATH') -server_port = os.getenv('INSTANCES_SERVER_PORT') -server_host = os.getenv('INSTANCES_SERVER_HOST') or 'localhost' -instance_id = os.getenv('INSTANCE_ID') +SEQUENCE_PATH = os.getenv('SEQUENCE_PATH') +SERVER_PORT = os.getenv('INSTANCES_SERVER_PORT') +SERVER_HOST = os.getenv('INSTANCES_SERVER_HOST') or 'localhost' +INSTANCE_ID = os.getenv('INSTANCE_ID') def send_encoded_msg(stream, msg_code, data={}): @@ -48,74 +50,79 @@ def __init__(self, instance_id, sequence_path, log_setup) -> None: self.health_check = lambda: {'healthy': True} self.emitter = AsyncIOEventEmitter() self.keep_alive_requested = False - + self.multiplexer = None async def main(self, server_host, server_port): - self.logger.info('Connecting to host...') - await self.init_connections(server_host, server_port) - + asyncio.current_task().set_name('RUNNER_MAIN') + input_stream = Stream() + await self.init_tecemux(server_host, server_port) # Do this early to have access to any thrown exceptions and logs. self.connect_stdio() self.connect_log_stream() - + await self.multiplexer.sync() config, args = await self.handshake() self.logger.info('Communication established.') - asyncio.create_task(self.connect_control_stream()) - asyncio.create_task(self.setup_heartbeat()) - self.load_sequence() - await self.run_instance(config, args) + control_stream_task = asyncio.create_task(self.connect_control_stream()) + heartbeat_task = asyncio.create_task(self.setup_heartbeat()) + await self.multiplexer.sync() + connect_input_stream_task = asyncio.create_task(self.connect_input_stream(input_stream)) + self.load_sequence() - async def init_connections(self, host, port): - async def connect(channel): - self.logger.debug(f'Connecting to {host}:{port}...') - reader, writer = await asyncio.open_connection(host, port) - self.logger.debug('Connected.') + await self.multiplexer.sync() + await self.run_instance(config, input_stream, args) + await self.multiplexer.sync() - writer.write(self.instance_id.encode()) - writer.write(channel.value.encode()) - await writer.drain() - self.logger.debug(f'Sent ID {self.instance_id} on {channel.name}.') + heartbeat_task.cancel() + control_stream_task.cancel() - return (channel, reader, writer) + if not connect_input_stream_task.done(): + connect_input_stream_task.cancel() - conn_futures = [connect(channel) for channel in CC] - connections = await asyncio.gather(*conn_futures) + await asyncio.gather(*[heartbeat_task]) + await asyncio.gather(*[control_stream_task]) + await asyncio.gather(*[connect_input_stream_task]) - def is_incoming(channel): - return channel in [CC.STDIN, CC.IN, CC.CONTROL] + await self.multiplexer.stop() + self.cancel_tasks() - # Pick read or write stream depending on channel. - self.streams = { - channel: reader if is_incoming(channel) else writer - for channel, reader, writer in connections - } + def cancel_tasks(self): + [task.cancel() if task.get_name() != 'RUNNER_MAIN' else None for task in asyncio.all_tasks()] + async def init_tecemux(self, server_host, server_port): + self.logger.info('Connecting to host with TeceMux...') + self.multiplexer = Tecemux(instance_id=self.instance_id) + await self.multiplexer.connect(*await Tecemux.prepare_tcp_connection(server_host, server_port)) + await self.multiplexer.prepare(force_open=True) + await self.multiplexer.loop() def connect_stdio(self): - sys.stdout = codecs.getwriter('utf-8')(self.streams[CC.STDOUT]) - sys.stderr = StderrRedirector(codecs.getwriter('utf-8')(self.streams[CC.STDERR])) - sys.stdin = Stream.read_from(self.streams[CC.STDIN]).decode('utf-8') + sys.stdout = codecs.getwriter('utf-8')(self.multiplexer.get_channel(CC.STDOUT)) + sys.stderr = StderrRedirector(codecs.getwriter('utf-8')(self.multiplexer.get_channel(CC.STDERR))) + sys.stdin = Stream.read_from(self.multiplexer.get_channel(CC.STDIN)).decode('utf-8') + # pretend to have API compatibiliy sys.stdout.flush = lambda: True sys.stderr.flush = lambda: True self.logger.info('Stdio connected.') - def connect_log_stream(self): self.logger.info('Switching to main log stream...') - log_stream = codecs.getwriter('utf-8')(self.streams[CC.LOG]) + log_stream = codecs.getwriter('utf-8')(self.multiplexer.get_channel(CC.LOG)) self._logging_setup.switch_target(log_stream) self._logging_setup.flush_temp_handler() - self.logger.info('Log stream connected.') + self.multiplexer.set_logger(self.logger) + [channel._set_logger(self.logger) for channel in self.multiplexer.get_required_channels()] + + self.logger.info('Log stream connected.') async def handshake(self): - monitoring = self.streams[CC.MONITORING] - control = self.streams[CC.CONTROL] + monitoring = self.multiplexer.get_channel(CC.MONITORING) + control = self.multiplexer.get_channel(CC.CONTROL) - self.logger.info(f'Sending PING') + self.logger.info('Sending PING') send_encoded_msg(monitoring, msg_codes.PING) message = await control.readuntil(b'\n') @@ -123,13 +130,13 @@ async def handshake(self): code, data = json.loads(message.decode()) if not data: - data = {"appConfig":{},"args":[]} + data = {"appConfig": {}, "args": []} if 'appConfig' not in data: data['appConfig'] = {} if 'args' not in data: data['args'] = [] - self.logger.info(f'Sending PANG') + self.logger.info('Sending PANG') pang_requires_data = { 'requires': '', 'contentType': '' @@ -140,53 +147,59 @@ async def handshake(self): self.logger.info(f'Got configuration: {data}') return data['appConfig'], data['args'] - async def connect_control_stream(self): # Control stream carries ndjson, so it's enough to split into lines. control_messages = ( - Stream - # 128 kB is the typical size of TCP buffer. - .read_from(self.streams[CC.CONTROL], chunk_size=131072) - .decode('utf-8').split('\n').map(json.loads) + # 128 kB is the typical size of TCP buffer. + Stream.read_from(self.multiplexer.get_channel(CC.CONTROL), chunk_size=131072) + .decode('utf-8').split('\n').map(json.loads) ) - async for code, data in control_messages: - self.logger.debug(f'Control message received: {code} {data}') - if code == msg_codes.KILL.value: - self.exit_immediately() - if code == msg_codes.STOP.value: - await self.handle_stop(data) - if code == msg_codes.EVENT.value: - self.emitter.emit(data['eventName'], data['message'] if 'message' in data else None) - + try: + async for code, data in control_messages: + self.logger.debug(f'Control message received: {code} {data}') + if code == msg_codes.KILL.value: + await self.exit_immediately() + if code == msg_codes.STOP.value: + await self.handle_stop(data) + if code == msg_codes.EVENT.value: + self.emitter.emit(data['eventName'], data['message'] if 'message' in data else None) + + except asyncio.CancelledError: + task = self.multiplexer.get_channel(CC.CONTROL)._outcoming_process_task + task.cancel() + await asyncio.sleep(0) + await asyncio.gather(*[task]) + return async def handle_stop(self, data): self.logger.info(f'Gracefully shutting down...{data}') self.keep_alive_requested = False timeout = data.get('timeout') / 1000 can_keep_alive = data.get('canCallKeepalive') - try: + try: for handler in self.stop_handlers: await handler(timeout, can_keep_alive) except Exception as e: self.logger.error('Error stopping sequence', e) - send_encoded_msg(self.streams[CC.MONITORING], msg_codes.SEQUENCE_STOPPED, e) + send_encoded_msg(self.multiplexer.get_channel(CC.MONITORING), msg_codes.SEQUENCE_STOPPED, e) if not can_keep_alive or not self.keep_alive_requested: - send_encoded_msg(self.streams[CC.MONITORING], msg_codes.SEQUENCE_STOPPED, {}) - self.exit_immediately() - - await self.cleanup() - + send_encoded_msg(self.multiplexer.get_channel(CC.MONITORING), msg_codes.SEQUENCE_STOPPED, {}) + await self.exit_immediately() async def setup_heartbeat(self): while True: - send_encoded_msg( - self.streams[CC.MONITORING], - msg_codes.MONITORING, - self.health_check(), - ) - await asyncio.sleep(1) - + try: + send_encoded_msg( + self.multiplexer.get_channel(CC.MONITORING), + msg_codes.MONITORING, + self.health_check(), + ) + await self.multiplexer.get_channel(CC.MONITORING).sync() + await asyncio.sleep(1) + except asyncio.CancelledError: + await self.multiplexer.get_channel(CC.MONITORING).sync() + return def load_sequence(self): # Add sequence directory to sys.path @@ -201,16 +214,23 @@ def load_sequence(self): # switch to sequence dir so that relative paths will work os.chdir(os.path.dirname(self.seq_path)) - async def run_instance(self, config, args): + async def run_instance(self, config, input, args): context = AppContext(self, config) - input_stream = Stream() - asyncio.create_task(self.connect_input_stream(input_stream)) - + custom_conn = self.multiplexer.setup_connector() + context.hub = HostClient('http://scramjet-host/api/v1') # (url, connector=custom_conn) self.logger.info('Running instance...') - result = self.sequence.run(context, input_stream, *args) + try: + result = self.sequence.run(context, input, *args) + except Exception: + import traceback + self.multiplexer.get_channel(CC.STDERR).write(traceback.format_exc()) + await self.multiplexer.sync() + await self.exit_immediately() + + self.logger.info('Sending PANG') + + monitoring = self.multiplexer.get_channel(CC.MONITORING) - self.logger.info(f'Sending PANG') - monitoring = self.streams[CC.MONITORING] produces = getattr(result, 'provides', None) or getattr(self.sequence, 'provides', None) if produces: self.logger.info(f'Sending PANG with {produces}') @@ -231,36 +251,40 @@ async def run_instance(self, config, args): self.logger.debug('Sequence returned no output.') self.logger.info('Finished.') - await self.cleanup() - - async def cleanup(self): - self.streams[CC.LOG].write_eof() async def connect_input_stream(self, input_stream): - if hasattr(self.sequence, "requires"): - input_type = self.sequence.requires.get('contentType') - else: - raw_headers = await self.streams[CC.IN].readuntil(b'\r\n\r\n') - header_list = raw_headers.decode().rstrip().split('\r\n') - headers = { - key.lower(): val for key, val in [el.split(': ') for el in header_list] - } - self.logger.info(f'Input headers: {repr(headers)}') - input_type = headers.get('content-type') - - if input_type == 'text/plain': - input = Stream.read_from(self.streams[CC.IN]) - self.logger.debug('Decoding input stream...') - input = input.decode('utf-8') - elif input_type == 'application/octet-stream': - self.logger.debug('Opening input in binary mode...') - input = Stream.read_from(self.streams[CC.IN], chunk_size=CHUNK_SIZE) - else: - raise TypeError(f'Unsupported input type: {repr(input_type)}') + try: + if hasattr(self.sequence, "requires"): + input_type = self.sequence.requires.get('contentType') + else: + raw_headers = await self.multiplexer.get_channel(CC.IN).readuntil(b'\r\n\r\n') + header_list = raw_headers.decode().rstrip().split('\r\n') + headers = { + key.lower(): val for key, val in [el.split(': ') for el in header_list] + } + self.logger.info(f'Input headers: {repr(headers)}') + input_type = headers.get('content-type') + + if input_type == 'text/plain': + input = Stream.read_from(self.multiplexer.get_channel(CC.IN)) + + self.logger.debug('Decoding input stream...') + input = input.decode('utf-8') + elif input_type == 'application/octet-stream': + self.logger.debug('Opening input in binary mode...') + input = Stream.read_from(self.multiplexer.get_channel(CC.IN), chunk_size=CHUNK_SIZE) - input.pipe(input_stream) - self.logger.debug('Input stream forwarded to the instance.') + else: + raise TypeError(f'Unsupported input type: {repr(input_type)}') + input.pipe(input_stream) + self.logger.debug('Input stream forwarded to the instance.') + except asyncio.CancelledError: + task = self.multiplexer.get_channel(CC.IN)._outcoming_process_task + task.cancel() + await asyncio.sleep(0) + await asyncio.gather(*[task]) + return async def forward_output_stream(self, output): @@ -281,19 +305,18 @@ async def forward_output_stream(self, output): output = output.map(lambda s: s.encode()) if content_type == 'application/x-ndjson': self.logger.debug('Output will be converted to JSON') - output = output.map(lambda chunk: (json.dumps(chunk)+'\n').encode()) + output = output.map(lambda chunk: (json.dumps(chunk) + '\n').encode()) - await output.write_to(self.streams[CC.OUT]) + await output.write_to(self.multiplexer.get_channel(CC.OUT)) - async def send_keep_alive(self, timeout: int = 0, can_keep_alive: bool = False): - monitoring = self.streams[CC.MONITORING] + monitoring = self.multiplexer.get_channel(CC.MONITORING) send_encoded_msg(monitoring, msg_codes.ALIVE) self.keep_alive_requested = True await asyncio.sleep(timeout) - - def exit_immediately(self): + async def exit_immediately(self): + await self.multiplexer.sync() sys.exit(1) @@ -301,9 +324,10 @@ class AppContext: def __init__(self, runner, config) -> None: self.logger = runner.logger self.config = config - self.monitoring = runner.streams[CC.MONITORING] + self.monitoring = runner.multiplexer.get_channel(CC.MONITORING) self.runner = runner self.emitter = runner.emitter + self.hub = None def set_stop_handler(self, handler, *args): self.runner.stop_handlers.append(handler) @@ -320,22 +344,23 @@ def emit(self, event_name, message=''): msg_codes.EVENT, {'eventName': event_name, 'message': message} ) - + async def keep_alive(self, timeout: int = 0): await self.runner.send_keep_alive(timeout) -log_target = open(sys.argv[1], 'a+') if len(sys.argv) > 1 else sys.stdout -log_setup = LoggingSetup(log_target) -log_setup.logger.info('Starting up...') -log_setup.logger.debug(f'server_host: {server_host}') -log_setup.logger.debug(f'server_port: {server_port}') -log_setup.logger.debug(f'instance_id: {instance_id}') -log_setup.logger.debug(f'sequence_path: {sequence_path}') +LOG_TARGET = open(sys.argv[1], 'a+', encoding='utf-8') if len(sys.argv) > 1 else sys.stdout +LOG_SETUP = LoggingSetup(LOG_TARGET, min_loglevel=logging.DEBUG) + +LOG_SETUP.logger.info('Starting up...') +LOG_SETUP.logger.debug(f'server_host: {SERVER_HOST}') +LOG_SETUP.logger.debug(f'server_port: {SERVER_PORT}') +LOG_SETUP.logger.debug(f'instance_id: {INSTANCE_ID}') +LOG_SETUP.logger.debug(f'sequence_path: {SEQUENCE_PATH}') -if not sequence_path or not server_port or not instance_id: - log_setup.logger.error('Undefined config variable! ') +if not SEQUENCE_PATH or not SERVER_PORT or not INSTANCE_ID: + LOG_SETUP.logger.error('Undefined config variable! ') sys.exit(2) -runner = Runner(instance_id, sequence_path, log_setup) -asyncio.run(runner.main(server_host, server_port)) +runner = Runner(INSTANCE_ID, SEQUENCE_PATH, LOG_SETUP) +asyncio.run(runner.main(SERVER_HOST, SERVER_PORT)) diff --git a/packages/verser/test/.keep b/packages/python-runner/tecemux/__init__.py similarity index 100% rename from packages/verser/test/.keep rename to packages/python-runner/tecemux/__init__.py diff --git a/packages/python-runner/tecemux/barrier.py b/packages/python-runner/tecemux/barrier.py new file mode 100644 index 000000000..42a3fe1ac --- /dev/null +++ b/packages/python-runner/tecemux/barrier.py @@ -0,0 +1,119 @@ +import enum +from asyncio import Condition + +# asyncio.barrier - only for compatibility with Python older than 3.11 + + +class BrokenBarrierError(RuntimeError): + """Barrier is broken by barrier.abort() call.""" + + +class _BarrierState(enum.Enum): + FILLING = 'filling' + DRAINING = 'draining' + RESETTING = 'resetting' + BROKEN = 'broken' + + +class Barrier(): + def __init__(self, parties): + """Create a barrier, initialised to 'parties' tasks.""" + if parties < 1: + raise ValueError('parties must be > 0') + + self._cond = Condition() # notify all tasks when state changes + + self._parties = parties + self._state = _BarrierState.FILLING + self._count = 0 # count tasks in Barrier + + def __repr__(self): + res = super().__repr__() + extra = f'{self._state.value}' + if not self.broken: + extra += f', waiters:{self.n_waiting}/{self.parties}' + return f'<{res[1:-1]} [{extra}]>' + + async def __aenter__(self): + return await self.wait() + + async def __aexit__(self, *args): + pass + + async def wait(self): + async with self._cond: + await self._block() # Block while the barrier drains or resets. + try: + index = self._count + self._count += 1 + if index + 1 == self._parties: + # We release the barrier + await self._release() + else: + await self._wait() + return index + finally: + self._count -= 1 + # Wake up any tasks waiting for barrier to drain. + self._exit() + + async def _block(self): + await self._cond.wait_for( + lambda: self._state not in ( + _BarrierState.DRAINING, _BarrierState.RESETTING + ) + ) + + # see if the barrier is in a broken state + if self._state is _BarrierState.BROKEN: + raise BrokenBarrierError("Barrier aborted") + + async def _release(self): + self._state = _BarrierState.DRAINING + self._cond.notify_all() + + async def _wait(self): + await self._cond.wait_for(lambda: self._state is not _BarrierState.FILLING) + + if self._state in (_BarrierState.BROKEN, _BarrierState.RESETTING): + raise BrokenBarrierError("Abort or reset of barrier") + + def _exit(self): + # If we are the last tasks to exit the barrier, signal any tasks + # waiting for the barrier to drain. + if self._count == 0: + if self._state in (_BarrierState.RESETTING, _BarrierState.DRAINING): + self._state = _BarrierState.FILLING + self._cond.notify_all() + + async def reset(self): + async with self._cond: + if self._count > 0: + if self._state is not _BarrierState.RESETTING: + # reset the barrier, waking up tasks + self._state = _BarrierState.RESETTING + else: + self._state = _BarrierState.FILLING + self._cond.notify_all() + + async def abort(self): + async with self._cond: + self._state = _BarrierState.BROKEN + self._cond.notify_all() + + @property + def parties(self): + """Return the number of tasks required to trip the barrier.""" + return self._parties + + @property + def n_waiting(self): + """Return the number of tasks currently waiting at the barrier.""" + if self._state is _BarrierState.FILLING: + return self._count + return 0 + + @property + def broken(self): + """Return True if the barrier is in a broken state.""" + return self._state is _BarrierState.BROKEN diff --git a/packages/python-runner/tecemux/channel.py b/packages/python-runner/tecemux/channel.py new file mode 100644 index 000000000..02ef824bd --- /dev/null +++ b/packages/python-runner/tecemux/channel.py @@ -0,0 +1,433 @@ +""" channel.py - contains Tecemux channel management in Python +""" + +import asyncio +import logging + + +from attrs import define +from enum import Enum + +from .barrier import Barrier +from .inet import IPPacket, TCPSegment, SequenceOrder +from .hardcoded_magic_values import CommunicationChannels as CC + +SequenceOrder().use_little_endian() + +TECEMUX_INTERNAL_VERBOSE_DEBUG = False + + +class ChannelState(Enum): + """Internal class describes possible channel state + """ + + CREATED = 1 + OPENED = 2 + PAUSED = 3 + ENDED = 4 + + +class ChannelGuard: + """Internal class to open/close channels for external usage + """ + + def __init__(self, multiplexer): + """Inits channel guard + + Args: + multiplexer (Tecemux): Tecemux object + """ + + self._multiplexer = multiplexer + self._channel_name = None + + async def __aenter__(self): + """Opens new channel and returns guard + + Returns: + _ChannelGuard: async guard object + """ + + channel = await self._multiplexer.open_channel(force_open=True) + self._channel_name = channel._channel_enum + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Closes channel + + Args: + exc_type: Unused + exc_val: Unused + exc_tb: Unused + """ + await self._multiplexer.get_channel(self._channel_name).end() + await self._multiplexer.get_channel(self._channel_name).close() + del self._multiplexer._extra_channels[self._channel_name] + + def inject_tecemux_details_as(self, provider): + """Retuns channel details for external lib + + Args: + provider (Any): External provider + + Returns: + Any: External provider object with channel details + """ + + return provider('tecemux', self._channel_name) + + def get_proxy_uri(self): + """Returns proxy config URI for aiohttp + + Returns: + str: aiohttp config + """ + + return self._multiplexer._get_proxy_uri() + + +@define +class ChannelContext: + """Internal class to manage single channel + """ + + _channel_enum: CC + + _global_queue: asyncio.Queue + _global_instance_id: str + + _logger: logging.Logger + _internal_outcoming_queue: asyncio.Queue + _internal_incoming_queue: asyncio.Queue + + _stop_channel_event: asyncio.Event + _sync_channel_event: asyncio.Event + _sync_barrier: Barrier + + _read_buffer: bytearray + _outcoming_process_task: asyncio.Task + + _state: ChannelState + + def __init__(self, channel, + queue: asyncio.Queue, + instance_id: str, + logger: logging.Logger, + stop_event: asyncio.Event, + sync_event: asyncio.Event, + sync_barrier: Barrier, + state: ChannelState): + + self._channel_enum = channel + self._global_queue = queue + self._global_instance_id = instance_id + self._logger = logger + self._internal_outcoming_queue = asyncio.Queue() + self._internal_incoming_queue = asyncio.Queue() + self._stop_channel_event = stop_event + self._sync_channel_event = sync_event + self._sync_barrier = sync_barrier + self._outcoming_process_task = asyncio.create_task(self._outcoming_process_tasks(), + name=f'{self._get_channel_name()}_PROCESS_TASK') + self._read_buffer = bytearray() + self._state = state + + async def sync(self) -> None: + """Waits until internal queues will be empty (packets will be processed) + """ + + if self._is_incoming(): + await self._internal_incoming_queue.join() + + await self._internal_outcoming_queue.join() + + def _is_incoming(self) -> bool: + """Returns whether channel is mostly read by Tememux + + Returns: + bool: True is mostly read by Runner, False otherwise + """ + return self._channel_enum in [CC.STDIN, CC.IN, CC.CONTROL] + + async def _outcoming_process_tasks(self) -> None: + """ Internal loop for outcoming data from channel + """ + while True: + try: + await self._queue_up_outcoming() + await asyncio.sleep(0) + + if self._stop_channel_event.is_set(): + return + except asyncio.CancelledError: + return + + def _debug(self, msg): + """Wrapper for printing debug messages + + Args: + msg (str): Debug message + """ + if TECEMUX_INTERNAL_VERBOSE_DEBUG: + self._logger.debug(msg) + + def _get_channel_name(self) -> str: + """Returns channel name + + Returns: + str: Channel name + """ + + if isinstance(self._channel_enum, CC): + return str(self._channel_enum.name) + else: + return str(self._channel_enum) + + def _get_channel_id(self) -> int: + """Return channel id + + Returns: + int: Channel id + """ + if isinstance(self._channel_enum, CC): + return int(self._channel_enum.value) + else: + return int(self._channel_enum) + + def _set_logger(self, logger: logging.Logger) -> None: + """Sets new logger + + Args: + logger (logging.Logger): Logger object + """ + self._logger = logger + + async def readline(self) -> bytes: + """Reads data from current channel until '\n' appears + + Returns: + bytes: Bufer data from channel + """ + sep = b'\n' + line = await self.readuntil(sep) + return line + + async def readuntil(self, separator=b'\n') -> bytes: + """Reads data from current channel until provided separator appears + + Args: + separator (bytes, optional): Defaults to b'\n'. + + Returns: + bytes: Buffer data from channel + """ + seplen = len(separator) + + offset = 0 + isep = 0 + while True: + buflen = len(self._read_buffer) + + if buflen - offset >= seplen: + isep = self._read_buffer.find(separator, offset) + + if isep != -1: + break + + offset = buflen + 1 - seplen + + if (not await self._get_data()): + break + + if self._state == ChannelState.ENDED and isep == -1: + chunk = self._read_buffer.copy() + self._read_buffer.clear() + else: + chunk = self._read_buffer[:isep + seplen] + + del self._read_buffer[:isep + seplen] + return bytes(chunk) + + async def _get_data(self) -> bool: + """Internal method, returns True if data are moved from queue to _read_buffer, false otherwise + + Returns: + bool: True if data are moved from queue to _read_buffer, false otherwise + """ + if self._state == ChannelState.ENDED and self._internal_incoming_queue.empty(): + return False + + while True: + try: + buf = self._internal_incoming_queue.get_nowait() + + if buf == b'': + return False + + self._read_buffer.extend(buf) + break + except asyncio.QueueEmpty: + + await asyncio.sleep(0) + + if self._state == ChannelState.ENDED and self._internal_incoming_queue.empty(): + return False + + except asyncio.CancelledError: + return False + + await asyncio.sleep(0) + return True + + async def read(self, n: int = -1) -> bytes: + """Reads up to 'n' bytes of data from current channel + + Args: + n (int, optional): Number of bytes. Defaults to -1. + + Returns: + bytes: Buffer data from channel + """ + if n == 0: + return b'' + + if not self._read_buffer: + await self._get_data() + + data = bytes(memoryview(self._read_buffer)[:n]) + del self._read_buffer[:n] + return data + + def __aiter__(self): + return self + + async def __anext__(self): + val = await self.readline() + + if val == b'': + raise StopAsyncIteration + return val + + async def send_ACK(self, sequence_number: int) -> None: + """Adds to global queue an ACK packet to send. + + Args: + sequence_number (int): Value for Acknowledge field + """ + + await self._global_queue.put(IPPacket(segment=TCPSegment(dst_port=self._get_channel_id(), + flags=['ACK'], ack=sequence_number))) + + async def _send_pause_ACK(self, sequence_number: int) -> None: + """"Add to global queue an pause packet to send + + Args: + sequence_number (int): Value for Acknowledge field + """ + + await self._global_queue.put(IPPacket(segment=TCPSegment(dst_port=self._get_channel_id(), + flags=['ACK', 'SYN'], ack=sequence_number))) + + async def open(self) -> None: + """Open channel + """ + + if self._state == ChannelState.CREATED: + # Channels with ids 0 - 8 are have special opening procedure: send intance id with channel number + + if self._get_channel_id() < 9: + buf = b'' if self._global_instance_id is None else ( + self._global_instance_id.encode() + str(self._get_channel_id()).encode()) + else: + buf = b'' + + await self._global_queue.put(IPPacket(segment=TCPSegment(dst_port=self._get_channel_id(), + data=buf, flags=['PSH']))) + + self._state = ChannelState.OPENED + + async def end(self) -> None: + """Send EOF on current channel + """ + + await self._internal_outcoming_queue.join() + await self._global_queue.put(IPPacket(segment=TCPSegment(dst_port=self._get_channel_id(), + data=b'', flags=['PSH']))) + self._state = ChannelState.ENDED + + async def close(self) -> None: + """Close current channel + """ + + self._debug(f'Tecemux/{self._get_channel_name()}: [-] Channel close request is send') + await self._global_queue.put(IPPacket(segment=TCPSegment(dst_port=self._get_channel_id(), + data=b'' if self._global_instance_id is None + else self._global_instance_id, flags=['FIN']))) + + async def queue_up_incoming(self, pkt: IPPacket) -> None: + """Redirects incoming data from provided packet to current channel + + Args: + pkt (IPPacket): Redirected packet from outside + """ + # if SYN & ACK flag is up, pause channel + if pkt.get_segment().is_flag('SYN') and pkt.get_segment().is_flag('ACK'): + self._debug(f'Tecemux/{self._get_channel_name()}: [-] Channel pause request received') + self._state = ChannelState.PAUSED + await self.send_ACK(pkt.get_segment().seq) + return + + # if ACK flag is up, reasume channel + if not pkt.get_segment().is_flag('SYN') and pkt.get_segment().is_flag('ACK'): + self._state = ChannelState.OPENED + return + + # if PSH flag is up, confirm + if pkt.segment.is_flag('PSH'): + await self.send_ACK(pkt.get_segment().seq) + + if pkt.segment.is_flag('FIN'): + self._state = ChannelState.ENDED + return + await self._internal_incoming_queue.put(pkt.get_segment().data) + self._internal_incoming_queue.task_done() + + async def _queue_up_outcoming(self) -> None: + """Redirects raw data from currect channel to global queue. + + Args: + data (bytes): Buffer to send_incoming_process_task + """ + def wrap(channel_id, buf): + return IPPacket(segment=TCPSegment(dst_port=channel_id, flags=['PSH'], data=buf)) + + if self._state is not ChannelState.PAUSED: + while not self._internal_outcoming_queue.empty(): + try: + buf = await asyncio.wait_for(self._internal_outcoming_queue.get(), 1) + await self._global_queue.put(wrap(self._get_channel_id(), buf)) + self._internal_outcoming_queue.task_done() + except asyncio.QueueEmpty: + self._debug(f'Tecemux/{self._get_channel_name()}:' + '[-] All data stored during pause were redirected to global queue') + break + except asyncio.TimeoutError: + pass + else: + self._debug(f'Tecemux/{self._get_channel_name()}: [-] Channel paused. Data queued up internally for future') + + if self._sync_channel_event.is_set(): + await self._sync_barrier.wait() + + await asyncio.sleep(0) + + def write(self, data: bytes) -> None: + """Writes data to channel + + Args: + data (bytes): Buffer to send to channel + """ + if data == b'': + return + + self._internal_outcoming_queue.put_nowait(data) diff --git a/packages/python-runner/tecemux/connector.py b/packages/python-runner/tecemux/connector.py new file mode 100644 index 000000000..c427e4e09 --- /dev/null +++ b/packages/python-runner/tecemux/connector.py @@ -0,0 +1,18 @@ +import aiohttp + + +class Connector(aiohttp.BaseConnector): + """Custom connector class so that the Tecemux can be used in aiohttp requests. + """ + def __init__(self, tecemux: "Tecemux"): + self.tecemux = tecemux + super().__init__() + + async def _create_connection(self, req, traces, timeout) -> "ChannelContext": + # TODO: adjust duplex_channel to be an equivalent to aiohttp's 'ResponseHandler' + channel = await self.tecemux.open_channel(force_open=True) + channel_name = channel._channel_enum + await self.tecemux.sync() + duplex_channel = self.tecemux.get_channel(channel_name) + return duplex_channel # should be an equivalent to aiohttp's 'ResponseHandler' + diff --git a/packages/python-runner/hardcoded_magic_values.py b/packages/python-runner/tecemux/hardcoded_magic_values.py similarity index 99% rename from packages/python-runner/hardcoded_magic_values.py rename to packages/python-runner/tecemux/hardcoded_magic_values.py index 12625a6f8..639c69932 100644 --- a/packages/python-runner/hardcoded_magic_values.py +++ b/packages/python-runner/tecemux/hardcoded_magic_values.py @@ -1,5 +1,6 @@ from enum import Enum + # See packages/symbols/src/communication-channel.ts class CommunicationChannels(Enum): STDIN = "0" @@ -12,6 +13,7 @@ class CommunicationChannels(Enum): LOG = "7" HOST = "8" + # See packages/symbols/src/runner-message-code.ts class RunnerMessageCodes(Enum): PING = 3000 diff --git a/packages/python-runner/tecemux/inet.py b/packages/python-runner/tecemux/inet.py new file mode 100644 index 000000000..ae6d9649d --- /dev/null +++ b/packages/python-runner/tecemux/inet.py @@ -0,0 +1,550 @@ +""" inet.py - contains TCP Segment, IP Packet and Ethernet Frame support for Tecemux in Python runner +""" + +import struct +from binascii import hexlify, unhexlify +from socket import inet_ntoa, inet_aton +from attrs import define, field + + +class _Singleton(type): + """Metaclass for Singleton pattern + """ + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super( + _Singleton, cls).__call__(*args, **kwargs) + return cls._instances[cls] + + +class SequenceOrder(metaclass=_Singleton): + """Sets sequence order for buffer analysis + """ + class _Order: + """ Contains suported orders. For internal usage only + """ + LITTLE_ENDIAN = '<' + BIG_ENDIAN = '>' + + endianess = _Order.LITTLE_ENDIAN + + def use_big_endian(self): + """ Sets Big-Endian order + """ + self.endianess = SequenceOrder._Order.BIG_ENDIAN + + def use_little_endian(self): + """ Sets Little-endian order + """ + self.endianess = SequenceOrder._Order.LITTLE_ENDIAN + + def get(self): + """ Returns order struct module format + '<' is little-endian + '>' is big-endian + + Returns: + str: return endianess for struct module + """ + return self.endianess + + +@define +class TCPSegment: + """ Class for manage TCP segment data + """ + + class Options: + """ TCP Segments options, at the end of TCP Header + """ + + EOL = 0 + NOP = 1 + MSS = 2 + WSOPT = 3 + SACKPERM = 4 + SACK = 5 + TSOPT = 8 + + @staticmethod + def parse_options(val): + """Returns TCP option in readable format + + Args: + val (bytes): Part of TCP Header + + Returns: + str: Options in readable format + """ + return val + + class Flags: + """TCP Segments flags + """ + + FIN = 0x01 # end of data + SYN = 0x02 # synchronize sequence numbers + RST = 0x04 # reset connection + PSH = 0x08 # push + ACK = 0x10 # acknowledgment number set + URG = 0x20 # urgent pointer set + ECE = 0x40 # ECN echo, RFC 3168 + CWR = 0x80 # congestion window reduced + NS = 0x100 # nonce sum, RFC 3540 + + @staticmethod + def flags_to_str(val): + """Returns TCP flags in readable format + + Args: + val (bytes): Part of TCP segment header + + Returns: + list: List of setted flags in segment + """ + flags = [] + if val & TCPSegment.Flags.FIN: + flags.append('FIN') + if val & TCPSegment.Flags.SYN: + flags.append('SYN') + if val & TCPSegment.Flags.RST: + flags.append('RST') + if val & TCPSegment.Flags.PSH: + flags.append('PSH') + if val & TCPSegment.Flags.ACK: + flags.append('ACK') + if val & TCPSegment.Flags.URG: + flags.append('URG') + if val & TCPSegment.Flags.ECE: + flags.append('ECE') + if val & TCPSegment.Flags.CWR: + flags.append('CWR') + if val & TCPSegment.Flags.NS: + flags.append('NS') + return '+'.join(flags) + + @staticmethod + def parse_flags(value): + """Checks Bit state of each flag int TCP Header + + Args: + value (None,int,bytes): TCP Header part to analyze + + Returns: + int: Integer values represents bit state of each flag + """ + res = 0 + if value is None: + return 0 + if isinstance(value, int): + return value + + for flag in value: + res = res | getattr(TCPSegment.Flags, flag) + return res + + src_port: int = field(default=0) + dst_port: int = field(default=0) + seq: int = field(default=0) + ack: int = field(default=0) + offset: int = field(default=0, converter=lambda value: value >> 4) + flags: int = field(default=0, repr=lambda value: TCPSegment.Flags.flags_to_str(value), + converter=lambda value: TCPSegment.Flags.parse_flags(value)) + win: int = field(default=8192) + checksum: int = field(default=0, repr=lambda value: hex(value)) + urp: int = field(default=0) + data: bytes = field(default=b'', repr=lambda value: f'{value[0:5]}... ' + if len(value) > 5 else f'{value}') + + opt: bytes = field( + default=b'', converter=lambda value: TCPSegment.Options.parse_options(value)) + + @classmethod + def from_buffer(cls, buffer: bytes): + """Creates TCP Segment object from provided raw buffer + + Args: + buffer (bytes): Data from socket + + Returns: + TCPSegment: Object of TCP Segment + """ + + TCP_MIN = 20 + src_port, dst_port, seq, ack, offres, flags, win, checksum, urp = struct.unpack( + SequenceOrder().get() + "HHIIBBHHH", buffer[0:TCP_MIN]) + hdr_len = (offres >> 4) * 4 + + if hdr_len <= TCP_MIN: + return cls(src_port, dst_port, seq, ack, offres, flags, win, checksum, urp, buffer[TCP_MIN:], b'') + + if hdr_len > TCP_MIN: + return cls(src_port, dst_port, seq, ack, offres, flags, win, + checksum, urp, buffer[hdr_len:], buffer[TCP_MIN:hdr_len]) + + def to_buffer(self): + """Build raw buffer from TCP Segment object + + Returns: + bytes: Raw buffer + """ + return struct.pack(SequenceOrder().get() + 'HHIIBBHHH', + self.src_port, + self.dst_port, + self.seq, + self.ack, + self.offset << 4, + self.flags, + self.win, + self.checksum, + self.urp) + (self.data.encode("utf-8") if isinstance(self.data, str) else self.data) + + def set_flags(self, list_of_flags: int): + """Enables flags in segment + + Args: + list_of_flags (int): Single integer value represents all flag bits + + Returns: + TCPObject: Retuns self + """ + self.flags = list_of_flags + return self + + def is_flag(self, flag: Flags) -> bool: + """Checks whether provided flag is enabled in segment + + Args: + flag (TCPSegment.Flags): Specific flag to check + + Returns: + bool: State of provided flag + """ + + return (self.flags & getattr(TCPSegment.Flags, flag)) > 0 + + +@define +class IPPacket: + """ Class for manage IP Packet data + """ + + class Flags: + """TCP Segments flags + """ + RF = 0x4 # reserved + DF = 0x2 # don't fragment + MF = 0x1 # more fragments + + @staticmethod + def flags_to_str(val): + """Returns IP flags in readable format + + Args: + val (bytes): Part of IP Packet header + + Returns: + list: List of setted flags in packet + """ + flags = [] + if val & IPPacket.Flags.RF == 0: + if val & IPPacket.Flags.MF != 0: + flags.append('MF') + if val & IPPacket.Flags.DF != 0: + flags.append('DF') + else: + flags.append('UNKNOWN') + return '+'.join(flags) + + @staticmethod + def parse_flags(value): + """Checks bit state of each flag in IP Header + + Args: + value (None,int,bytes): IP Header part to analyze + + Returns: + int: Integer values represents bit state of each flag + """ + res = 0 + if value is None: + return 0 + if isinstance(value, int): + return value + + for flag in value: + res = res | getattr(IPPacket.Flags, flag) + return res + + ihl: int = 5 + version: int = field(default=69, converter=lambda value: value >> 4) + tos: int = field(default=0) + len: int = field(default=0) + ids: int = field(default=1) + flags_offset: int = field(default=0) + flags: int = field(default=0, init=False, repr=lambda value: IPPacket.Flags.flags_to_str(value), + converter=lambda value: IPPacket.Flags.parse_flags(value)) + offset: int = field(default=0, init=False) + ttl: int = field(default=64) + protocol: int = field(default=6) + checksum: int = field(default=0, repr=lambda value: hex(value)) + src_addr: str = field(default='10.0.0.1', converter=lambda value: inet_ntoa( + value) if isinstance(value, bytes) else value) + dst_addr: str = field(default='10.0.0.2', converter=lambda value: inet_ntoa( + value) if isinstance(value, bytes) else value) + segment: TCPSegment = None + + def __attrs_post_init__(self): + """Internal function executes after constructor + """ + + self.offset = self.flags_offset & 0x1FFF + self.flags = self.flags_offset >> 13 + + # Cut data buffer to IP packet length + if self.len > 0 and self.segment: + self.get_segment().data = self.get_segment( + ).data[:self.len - (self.ihl * 4) - 20] + + @staticmethod + def calc_checksum(pkt: bytes) -> int: + """Calculates checksum for provited packet + + Args: + pkt (bytes): Raw buffer + + Returns: + int: Calculated checsum + """ + if len(pkt) % 2 == 1: + pkt += b"\0" + s = sum(struct.unpack(('<' if SequenceOrder().get() == '>' + else '>') + str(len(pkt) // 2) + 'H', pkt)) + + # source: https://github.com/secdev/scapy + s = (s >> 16) + (s & 0xffff) + s += s >> 16 + s = ~s + return (((s >> 8) & 0xff) | s << 8) & 0xffff + + @staticmethod + def calc_checksum_for_STH(pkt: bytes) -> int: + """Calculates checksum for provited packet in ormat valid for Transform Hub + + Args: + pkt (bytes): Raw buffer + + Returns: + int: Calculated checksum + """ + if len(pkt) % 2 == 1: + pkt += b"\0" + elements = list(struct.unpack( + SequenceOrder().get() + str(len(pkt) // 2) + 'H', pkt)) + elements = elements[:14] + elements[15:] + s = sum(elements) + return s % 0x10000 + + @classmethod + def from_buffer_with_pseudoheader(cls, buffer: bytes): + """Creates IP Packet object and TCP Segment object + from provided raw buffer with pseudo TCP Header + + Args: + buffer (bytes): Raw buffer + + Returns: + IPPacket: IPPacket object + """ + src_addr, dst_addr, _, proto, length = struct.unpack( + SequenceOrder().get() + "4s4sBBH", bytes(buffer[0:12])) + pkt = cls(0, 0, 0, length, 0, 0, 0, proto, 0, src_addr, dst_addr, + TCPSegment.from_buffer(buffer[12:]) if len(buffer) > 12 else None) + return pkt + + @classmethod + def from_buffer(cls, buffer: bytes): + """Creates IP Packet object and TCP Segment object + from provided raw buffer with + + Args: + buffer (bytes): Raw buffer + + Returns: + IPPacket: IPPacket object + """ + ihl = (buffer[0] & 0xf) + pkt = cls(ihl, *struct.unpack(SequenceOrder().get() + "BBHHHBBH4s4s", + buffer[0:ihl * 4]), TCPSegment.from_buffer(buffer[ihl * 4:]) if len(buffer) > ihl * 4 else None) + + # Cut data buffer to IP packet length + if pkt.segment: + pkt.get_segment().data = pkt.get_segment( + ).data[:pkt.len - (ihl * 4) - 20] + + return pkt + + def is_flag(self, flag: Flags) -> bool: + """Checks whether provided flag is enabled in packet + """ + return (self.flags & getattr(IPPacket.Flags, flag)) > 0 + + def prepare_pseudoheader(self, protocol: int, length: int) -> bytes: + """Prepare TCP pseudoheader to calulate checksum + + Args: + protocol (int): Packet protocol value + length (int): Length of data (without header) + + Returns: + bytes: TCP Pseudoheader + """ + return struct.pack(SequenceOrder().get() + "4s4sBBH", + inet_aton(self.src_addr), + inet_aton(self.dst_addr), + 0, + protocol, + length + 12) + + def to_buffer_with_tcp_pseudoheader(self) -> bytes: + """Build raw buffer from IP Packet with pseudo TCP header + + Returns: + bytes: Raw buffer + """ + data = self.get_segment().to_buffer() if self.segment else b'' + + return self.prepare_pseudoheader(self.protocol, len(data)) + data + + def to_buffer(self): + """Build raw buffer from IP Packet + + Returns: + bytes: Raw buffer + """ + + ihl_ver = (int(self.version) << 4) + int(self.ihl) + + data = self.get_segment().to_buffer() if self.segment else b'' + self.len = 20 + len(data) + return struct.pack(SequenceOrder().get() + 'BBHHHBBH4s4s', + ihl_ver, + self.tos, + self.len, + self.ids, + self.flags_offset, + self.ttl, + self.protocol, + self.checksum, + inet_aton(self.src_addr), + inet_aton(self.dst_addr)) + data + + def _validate_tcp(self): + """ Calculates checksum for TCP segment part only + """ + tcp_hdr_len = 5 + self.segment.offset = tcp_hdr_len << 4 + self.segment.checksum = 0 + + tcp_segment = self.segment.to_buffer() + + pseudo_hdr = self.prepare_pseudoheader(self.protocol, len(tcp_segment)) + + self.segment.checksum = IPPacket.calc_checksum( + pseudo_hdr + tcp_segment) + + return self + + def _validate_tcp_for_STH(self): + """ Calculates checksum with format valid for Transform Hub + """ + tcp_hdr_len = 5 + self.segment.offset = tcp_hdr_len << 4 + self.segment.checksum = 0 + self.protocol = 1 + + tcp_segment = self.segment.to_buffer() + + pseudo_hdr = self.prepare_pseudoheader(self.protocol, len(tcp_segment)) + + self.segment.checksum = IPPacket.calc_checksum_for_STH( + pseudo_hdr + tcp_segment) + + return self + + def _validate_ip(self): + """ Calculates checksum IP Packet part only + """ + + self.checksum = 0 + + self.checksum = IPPacket.calc_checksum(self.to_buffer()[0:self.ihl * 4]) + + return self + + def build(self, for_STH=False): + """Calculates all checksums + + Args: + for_STH (bool, optional): If True, cheksums calculates with format valid for Transform Hub. + Otherise it is calcuated with RFC. Defaults to False. + """ + if for_STH: + if self.segment: + self._validate_tcp_for_STH() + else: + if self.segment: + self._validate_tcp() + self._validate_ip() + + return self + + def get_segment(self): + """Return TCP Segment + + Returns: + TCPSegment: TCP Segment object + """ + return self.segment + + +@define +class EthernetFrame: + """ Class for manage Ethernet frame data + """ + + src_mac: str = field(converter=lambda value: hexlify(value)) + dst_mac: str = field(converter=lambda value: hexlify(value)) + eth_type: bytes = field(repr=lambda value: hexlify(value)) + packet: IPPacket + + @classmethod + def from_buffer(cls, buffer: bytes): + """Creates Ethernet frame object from provided raw buffer + + Args: + buffer (bytes): Raw buffer + + Returns: + EthernetFrame: Ethernet frame object + """ + return cls(*struct.unpack(SequenceOrder().get() + "6s6s2s", buffer[0:14]), IPPacket.from_buffer(buffer[14:])) + + def to_buffer(self) -> bytes: + """Build raw buffer from Ethernet frame object + + Returns: + bytes: Raw buffer + """ + return struct.pack(SequenceOrder().get() + "6s6s2s", unhexlify(self.src_mac), + unhexlify(self.dst_mac), self.eth_type) + self.packet.to_buffer() + + def get_packet(self): + """Return IP Packet object + + Returns: + IPPacket: IP Packet object + """ + return self.packet diff --git a/packages/python-runner/tecemux/multiplexer.py b/packages/python-runner/tecemux/multiplexer.py new file mode 100644 index 000000000..ff38cb257 --- /dev/null +++ b/packages/python-runner/tecemux/multiplexer.py @@ -0,0 +1,442 @@ +""" multiplexer.py - entry point for tecemux implementation for Python +""" + +import asyncio +import logging +import random +import socket + +from attrs import define, field +from .barrier import Barrier +from .inet import IPPacket +from .hardcoded_magic_values import CommunicationChannels as CC +from .channel import ChannelContext, ChannelGuard, ChannelState +from .connector import Connector +from .proxy import HTTPProxy +TECEMUX_INTERNAL_VERBOSE_DEBUG = False + + +@define +class Tecemux: + """Tecemux protocol implementation for Scramjet Transform Hub Python Runner + """ + _connector = field(default=None) + + _queue: asyncio.Queue = field(default=None) + _reader: asyncio.StreamReader = field(default=None) + _writer: asyncio.StreamWriter = field(default=None) + + _incoming_data_forwarder: asyncio.coroutine = field(default=None) + _outcoming_data_forwarder: asyncio.coroutine = field(default=None) + + _instance_id: str = field(default=None) + _required_channels: dict = field(default={}) + _extra_channels: dict = field(default={}) + + _logger: logging.Logger = field(default=None) + + _global_stop_channel_event: asyncio.Event = asyncio.Event() + + _global_sync_channel_event: asyncio.Event = asyncio.Event() + _global_sync_barrier: Barrier = field(default=None, init=False) + + _global_stop_outcoming_event: asyncio.Event = asyncio.Event() + _global_stop_incoming_event: asyncio.Event = asyncio.Event() + + _sequence_number: int = field(default=0) + _last_sequence_received: int = field(default=0) + + _proxy = field(default=None) + _proxy_task = asyncio.coroutine = field(default=None) + + def _get_proxy_uri(self): + """Returns proxy config URI for aiohttp + + Returns: + str: aiohttp proxy config + """ + return self._proxy.get_proxy_uri() + + def get_channel_guard(self): + return ChannelGuard(self) + + def _debug(self, msg): + if TECEMUX_INTERNAL_VERBOSE_DEBUG: + self._logger.debug(msg) + + def _warning(self, msg): + if TECEMUX_INTERNAL_VERBOSE_DEBUG: + self._logger.warning(msg) + + async def connect(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: + """Connects to Transform Hub via provided reader and writer objects + + Args: + reader (asyncio.StreamReader): Main stream reader + writer (asyncio.StreamWriter): Main stream writer + """ + self._reader = reader + self._writer = writer + self._sequence_number = abs(int((random.random() * (2 ** 32)) / 2)) + self._global_stop_channel_event.clear() + self._global_stop_incoming_event.clear() + self._global_stop_outcoming_event.clear() + + @staticmethod + async def prepare_tcp_connection(server_host: str, server_port: str) -> tuple: + """Prepares TCP connection to server_host:server:port + + Args: + server_host (str): Server address + server_port (str): Server port + + Returns: + tuple: Pair of StreamReader, StreamWriter + """ + return await asyncio.open_connection(server_host, server_port) + + @staticmethod + async def prepare_socket_connection() -> tuple: + """Prepares Unix socket pair to create connection. + + Returns: + tuple: Pair of StreamReader, StreamWriter + """ + rsock, wsock = socket.socketpair() + reader, _ = await asyncio.open_unix_connection(sock=rsock) + _, writer = await asyncio.open_unix_connection(sock=wsock) + return reader, writer + + async def prepare(self, force_open: bool = False) -> None: + """Opens all channels to Transform Hub + + Args: + force_open (bool, optional): If True, all channels will be opened immediately, + Otherwise, will be opened on demand. Defaults to False. + """ + self._extra_channels = {} + self._queue = asyncio.Queue() + self._global_sync_barrier = Barrier(len(CC)) + self._required_channels = {channel: ChannelContext(channel, + self._queue, + self._instance_id, + self._logger, + self._global_stop_channel_event, + self._global_sync_channel_event, + self._global_sync_barrier, + ChannelState.CREATED) for channel in CC} + if force_open: + [await channel.open() for channel in self.get_required_channels()] + + self._proxy = HTTPProxy() + self._proxy_task = asyncio.create_task(self._proxy.run(self)) + + def _get_unused_extra_channel_id(self, used_channel_ids, start_from=10): + """Returns lowest, unused channel number + + Args: + used_channel_ids (list): List of *USED* channel ids + start_from (int, optional): Minimal channel id. Defaults to 10. + + Returns: + int: lowest, unused channel number + """ + used_channel_ids = sorted(set(used_channel_ids)) + if len(used_channel_ids) == 0 or used_channel_ids[0] != start_from: + return start_from + for i, v in enumerate(used_channel_ids, start_from): + if i != v: + return i + return i + 1 + + async def open_channel(self, channel_id=None, force_open=False, + initial_state: ChannelState = ChannelState.CREATED) -> ChannelContext: + """Opens additional channel in Tecemux + + Args: + channel_id (CC, str, optional): Name for new channel. Defaults to None. + force_open (bool, optional): Sends empty PSH packet right now. Defaults to False. + initial_state (_ChannelState., optional): Initial channel state. Defaults to ChannelState.CREATED. + + Returns: + ChannelContext: Openned channel + """ + + channel = str(channel_id) if channel_id is not None else None + + if channel not in self._extra_channels.keys(): + + channel = str(self._get_unused_extra_channel_id( + [int(id) for id in self._extra_channels.keys()])) if channel is None else channel + + self._extra_channels[channel] = ChannelContext(channel, + self._queue, + self._instance_id, + self._logger, + self._global_stop_channel_event, + self._global_sync_channel_event, + self._global_sync_barrier, + initial_state) + + if force_open: + await self._extra_channels[channel].open() + + self._global_sync_barrier._parties = len(self.get_required_channels()) + len(self.get_extra_channels()) + + return self._extra_channels[channel] + + def set_logger(self, logger: logging.Logger) -> None: + """Sets logger + + Args: + logger (logging.Logger): Logger object + """ + self._logger = logger + + def get_channel(self, channel) -> ChannelContext: + """Returns single channel context + + Args: + channel (str, CC): Channel name + + Returns: + ChannelContext: Channel context + """ + if isinstance(channel, CC): + return self._required_channels[channel] + else: + return self._extra_channels[channel] + + async def sync(self) -> None: + """Waits until all write tasks will be done + """ + self._global_sync_channel_event.set() + await self._global_sync_channel_event.wait() + await self._global_sync_barrier.wait() + self._global_sync_channel_event.clear() + + if not self._queue.empty(): + await self._queue.join() + + def get_required_channels(self) -> dict: + """Returns only required channels by STH + + Returns: + dict: Dict of channel's contexts + """ + return self._required_channels.values() + + def get_extra_channels(self) -> dict: + """Returns only extra initiated channels by runner + + Returns: + dict: Dict of channel's contexts + """ + return self._extra_channels.values() + + @staticmethod + def _chunk_preview(value: bytes) -> str: + """Returns small string preview of byte chunk. For logs + + Args: + value (bytes): Bytes to preview + + Returns: + str: String preview + """ + return f'{value[0:5]}... ' if len(value) > 5 else f'{value}' + + async def stop(self) -> None: + """ Stops protocol + """ + + await self._finish_proxy() + await self._finish_channels() + await self._finish_incoming() + await self._finish_outcoming() + + async def _finish_proxy(self) -> None: + """ Stops proxy + """ + try: + self._proxy_task.cancel() + await asyncio.gather(*[self._proxy_task]) + except asyncio.CancelledError: + pass + + async def _finish_channels(self) -> None: + """ Close all channels + """ + + for channel in self.get_required_channels(): + await channel.end() + await channel.close() + + for channel in self.get_extra_channels(): + await channel.end() + await channel.close() + + for channel in self.get_required_channels(): + await channel._internal_outcoming_queue.join() + + for channel in self.get_extra_channels(): + await channel._internal_outcoming_queue.join() + + self._global_stop_channel_event.set() + await self._global_stop_channel_event.wait() + for channel in self.get_required_channels(): + try: + await asyncio.wait_for(channel._outcoming_process_task, timeout=1) + except asyncio.TimeoutError: + pass + except TypeError: + pass + + async def _finish_outcoming(self) -> None: + """ Finish outcoming forwarder and main writer to STH + """ + + self._global_stop_outcoming_event.set() + await asyncio.sleep(0) + await self._global_stop_outcoming_event.wait() + await asyncio.gather(*[self._outcoming_data_forwarder]) + await self._writer.drain() + self._writer.close() + await self._writer.wait_closed() + + async def _finish_incoming(self) -> None: + """ Finish incoming forwarder + """ + + self._global_stop_incoming_event.set() + await self._global_stop_incoming_event.wait() + await asyncio.gather(*[self._incoming_data_forwarder]) + + async def loop(self) -> None: + """Main loop of Tecemux protocol. Starts forwarders tasks + """ + loop = asyncio.get_event_loop() + + self._incoming_data_forwarder = loop.create_task( + self.incoming_data_forward()) + self._outcoming_data_forwarder = loop.create_task( + self.outcoming_data_forward()) + + async def incoming_data_forward(self) -> None: + """Loop for incoming data from Transform Hub + """ + buffer = b'' + + incoming_parser_finish_loop = asyncio.Event() + + MINIMAL_IP_PACKET_LENGTH = 20 + READ_CHUNK_SIZE = 1024 + + while not self._global_stop_channel_event.is_set(): + try: + chunk = await asyncio.wait_for(self._reader.read(READ_CHUNK_SIZE), 1) + + if not chunk: + incoming_parser_finish_loop.set() + + buffer = buffer + chunk + + buffer_len = len(buffer) + + if incoming_parser_finish_loop.is_set() and buffer_len > 0 and buffer_len < MINIMAL_IP_PACKET_LENGTH: + + self._warning('Tecemux/MAIN: [<] Too few data is waiting in global buffer but stream finished') + break + elif incoming_parser_finish_loop.is_set() and buffer_len == 0: + break + + while not (len(buffer) < MINIMAL_IP_PACKET_LENGTH): + + current_packet_size = IPPacket().from_buffer_with_pseudoheader(buffer).len + + if len(buffer) >= current_packet_size: + + single_packet_buffer = buffer[:current_packet_size] + pkt = IPPacket().from_buffer_with_pseudoheader(single_packet_buffer) + self._last_sequence_received = pkt.get_segment().seq + self._debug(f'Tecemux/MAIN: [<] Full incoming packet with sequence number' + f'{self._last_sequence_received} from Transform Hub was received') + + dst_port = pkt.get_segment().dst_port + + if dst_port < 9: + channel = CC(str(dst_port)) + channel_name = channel.name + await self._required_channels[channel].queue_up_incoming(pkt) + else: + channel = str(dst_port) + channel_name = f'EXTRA_CHANNEL_{channel}' + try: + await self._extra_channels[channel].queue_up_incoming(pkt) + except KeyError: + await self.open_channel(channel, initial_state=ChannelState.OPENED) + try: + await self._extra_channels[channel].queue_up_incoming(pkt) + except KeyError: + self._debug('Tecemux/MAIN: [<] Unknown channel') + + self._debug(f'Tecemux/MAIN: [<] Packet {Tecemux._chunk_preview(single_packet_buffer)}' + f' forwarded to {channel_name} stream') + buffer = buffer[current_packet_size:] + else: + self._warning('Tecemux/MAIN: [<] Not full packet received. Getting additional data chunk') + break + except asyncio.TimeoutError: + if self._global_stop_channel_event.is_set(): + break + await asyncio.sleep(0) + + except asyncio.CancelledError: + break + + self._debug('Tecemux/MAIN: Incoming data forwarder finished') + + async def outcoming_data_forward(self) -> None: + """Loop for outcoming data to Transform Hub + """ + + while True: + try: + pkt = await asyncio.wait_for(self._queue.get(), timeout=1) + self._queue.task_done() + + # inject sequence number + if pkt.segment.seq == 0: + pkt.segment.seq = self._sequence_number + self._sequence_number += 1 + + chunk = pkt.build( + for_STH=True).to_buffer_with_tcp_pseudoheader() + + self._debug(f'Tecemux/MAIN: [>] Outcoming chunk {Tecemux._chunk_preview(chunk)}' + ' is waiting to send to Transform Hub') + self._writer.write(chunk) + await self._writer.drain() + self._debug(f'Tecemux/MAIN: [>] Chunk {Tecemux._chunk_preview(chunk)} with sequence number:' + f' {pkt.segment.seq} was sent to Transform Hub') + except asyncio.QueueEmpty: + if self._global_stop_outcoming_event.is_set(): + break + await asyncio.sleep(0) + + except asyncio.TimeoutError: + if self._queue.empty() and self._global_stop_outcoming_event.is_set(): + return + await asyncio.sleep(0) + + except asyncio.CancelledError: + break + + self._debug('Tecemux/MAIN: Outcoming data forwarder finished') + + def setup_connector(self) -> Connector: + """Sets connector for aiohttp + """ + self._connector = Connector(self) + return self._connector + diff --git a/packages/python-runner/tecemux/proxy.py b/packages/python-runner/tecemux/proxy.py new file mode 100644 index 000000000..1fb18f2b3 --- /dev/null +++ b/packages/python-runner/tecemux/proxy.py @@ -0,0 +1,113 @@ +""" proxy.py - contains Tecemux HTTP proxy to connect with 3rd party Python packages +""" + +import asyncio +import base64 +import socket + + +class HTTPProxy: + """ Simple HTTP proxy implementation for internal usage by Tecemux procotol + """ + + def __init__(self): + """Initialize HTTP proxy + """ + + self._host = '127.0.0.1' + self._proxy_socket = None + self._port = None + + @staticmethod + def _get_headers_as_dict(request_headers, convert_keys_to_lowercase=False): + headers_list = request_headers.decode().strip().split('\r\n') + + return {(key.strip().lower() if convert_keys_to_lowercase + else key.strip()): val.strip() for key, val in [el.split(': ') for el in headers_list]} + + @staticmethod + def _extract_tecemux_details(request_headers): + + headers = HTTPProxy._get_headers_as_dict(request_headers) + + tecemux_params = base64.b64decode(headers['Proxy-Authorization'].split(' ')[1]).decode().split(':') + + del headers['Proxy-Authorization'] + + new_headers = ('\r\n'.join(key + ': ' + str(val) for key, val in headers.items()) + '\r\n\r\n').encode('utf-8') + + return type('TecemuxDetails', (object,), {'user': tecemux_params[0], + 'channel_id': tecemux_params[1]})(), new_headers + + @staticmethod + async def handle_request(reader, writer, multiplexer): + """Process single request to server + + Args: + reader (asyncio.StreamReader): Stream reader provides access to HTTP request data + writer (asyncio.StreamWriter): Stream writer give posibility to send response + multiplexer (Tecemux): Tecemux object + """ + + request_status = await reader.readuntil(b'\r\n') + # Workaround... + request_status = bytes('GET /', encoding='utf-8' )+'/'.join(request_status.decode().split('/')[3:]).encode('utf-8') + tecemux_params, request_headers = HTTPProxy._extract_tecemux_details(await reader.readuntil(b'\r\n\r\n')) + + channel = multiplexer.get_channel(tecemux_params.channel_id) + + channel.write(request_status) + channel.write(request_headers) + + raw_response_status = await channel.readuntil(b'\r\n') + writer.write(raw_response_status) + + raw_response_headers = await channel.readuntil(b'\r\n\r\n') + writer.write(raw_response_headers) + + headers = HTTPProxy._get_headers_as_dict(raw_response_headers, convert_keys_to_lowercase=True) + if 'content-length' in headers: + writer.write(await channel.read(int(headers['content-length']))) + elif 'transfer-encoding' in headers and headers['transfer-encoding'] == 'chunked': + while True: + try: + raw_response_data = await asyncio.wait_for(channel.read(8), timeout=3) + if not raw_response_data: + break + writer.write(raw_response_data) + except asyncio.TimeoutError: + break + + writer.write(b'\r\n') + await writer.drain() + + async def run(self, multiplexer): + """Starts server on random local TCP port + + Args: + multiplexer (Tecemux): Tecemux object + """ + + self._proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._proxy_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._proxy_socket.bind((self._host, 0)) + self._proxy_socket.listen() + + self._port = int(self._proxy_socket.getsockname()[1]) + + server = await asyncio.start_server(lambda r, w: HTTPProxy.handle_request(r, w, multiplexer), + sock=self._proxy_socket) + + async with server: + await server.serve_forever() + + self._proxy_socket.close() + + def get_proxy_uri(self): + """Returns proxy config URI for aiohttp + + Returns: + str: aiohttp proxy config + """ + + return f'http://{self._host}:{self._port}' diff --git a/packages/python-runner/tecemux/setup.py b/packages/python-runner/tecemux/setup.py new file mode 100644 index 000000000..b8efb2267 --- /dev/null +++ b/packages/python-runner/tecemux/setup.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python + +from setuptools import setup, find_packages + +setup(name='tecemux', + version='0.8', + description='Scramjet Tecemux for Python', + author='Scramjet', + author_email='opensource@scramjet.org', + packages=["tecemux"], + package_dir={"tecemux": "."}) diff --git a/packages/python-runner/tecemux/test/__init__.py b/packages/python-runner/tecemux/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/python-runner/tecemux/test/conftest.py b/packages/python-runner/tecemux/test/conftest.py new file mode 100644 index 000000000..8b797ea6f --- /dev/null +++ b/packages/python-runner/tecemux/test/conftest.py @@ -0,0 +1,33 @@ +import pytest +import sys +from logging_setup import LoggingSetup +from tecemux.multiplexer import Tecemux + + +def get_logger(): + if not hasattr(get_logger, "log_setup"): + get_logger.log_setup = LoggingSetup(sys.stdout) + return get_logger.log_setup.logger + + +@pytest.fixture() +async def local_socket_connection(): + client_a = Tecemux() + client_a.set_logger(get_logger()) + + client_b = Tecemux() + client_b.set_logger(get_logger()) + + rsock_a, wsock_a = await Tecemux.prepare_socket_connection() + rsock_b, wsock_b = await Tecemux.prepare_socket_connection() + + await client_a.connect(rsock_a, wsock_b) + await client_b.connect(rsock_b, wsock_a) + + await client_a.prepare() + await client_b.prepare() + + await client_a.loop() + await client_b.loop() + + return client_a, client_b diff --git a/packages/python-runner/tecemux/test/test_channels.py b/packages/python-runner/tecemux/test/test_channels.py new file mode 100644 index 000000000..df619d105 --- /dev/null +++ b/packages/python-runner/tecemux/test/test_channels.py @@ -0,0 +1,250 @@ +import asyncio +import codecs +import pytest +import sys +from tecemux.channel import ChannelState +from tecemux.inet import IPPacket, TCPSegment +from tecemux.hardcoded_magic_values import CommunicationChannels as CC + + +class TestChannels: + + async def _close_clients(self, a, b): + await a.stop() + await b.stop() + + @pytest.mark.asyncio + async def test_forward_from_main_to_channel(self, local_socket_connection): + client_a, client_b = local_socket_connection + + data_to_send = "{'foo':'bar'}" + destination_channel = CC.CONTROL + + pkt = IPPacket(src_addr='172.25.44.3', dst_addr='172.25.44.254', + segment=TCPSegment(dst_port=int(destination_channel.value), flags=['PSH'], data=data_to_send)) + + client_a._writer.write(pkt.to_buffer_with_tcp_pseudoheader()) + await client_a._writer.drain() + + assert (await client_b.get_channel(destination_channel).read(100)).decode() == data_to_send + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_forward_channel_between_a_b(self, local_socket_connection): + client_a, client_b = local_socket_connection + + channel_alpha = CC.CONTROL + channel_beta = CC.IN + + client_a.get_channel(channel_alpha).write("{'foo':'bar'}") + await client_a._writer.drain() + + client_a.get_channel(channel_beta).write("{'bar':'foo2'}") + await client_a._writer.drain() + + assert (await client_b.get_channel(channel_alpha).read(100)).decode() == "{'foo':'bar'}" + assert (await client_b.get_channel(channel_beta).read(100)).decode() == "{'bar':'foo2'}" + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_write_and_read_from_the_same_side(self, local_socket_connection): + client_a, client_b = local_socket_connection + + channel_alpha = CC.CONTROL + + client_a.get_channel(channel_alpha).write("{'foo':'bar'}") + await client_a._writer.drain() + + data = None + + with pytest.raises(asyncio.TimeoutError): + data = await asyncio.wait_for(client_a.get_channel(channel_alpha).read(1), + timeout=0.5) + + assert data is None + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_stream_write_redirection(self, local_socket_connection): + client_a, client_b = local_socket_connection + + stream = codecs.getwriter('utf-8')(client_a.get_channel(CC.HOST)) + + print("Hi!", end='', file=stream) + + assert (await client_b.get_channel(CC.HOST).read(100)).decode() == "Hi!" + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_stream_read_redirection(self, local_socket_connection): + + from scramjet.streams import Stream + + client_a, client_b = local_socket_connection + + input_stream = codecs.getwriter('utf-8')(client_a.get_channel(CC.HOST)) + output_stream = Stream.read_from(client_b.get_channel(CC.HOST)).decode('utf-8') + + print("Test", file=input_stream) + assert await output_stream.read() == 'Test\n' + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_stderr_write_redirection(self, local_socket_connection): + client_a, client_b = local_socket_connection + + sys.stderr = codecs.getwriter('utf-8')(client_a.get_channel(CC.STDERR)) + sys.stderr.flush = lambda: True + + print("Error", end='\n', file=sys.stderr) + + sys.stderr = sys.__stderr__ + + assert (await client_b.get_channel(CC.STDERR).read(100)).decode() == "Error" + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_extra_channel(self, local_socket_connection): + client_a, client_b = local_socket_connection + + test_channel = await client_a.open_channel(initial_state=ChannelState.OPENED) + test_channel.write("{'foo':'bar'}\n") + + await asyncio.sleep(1) + + data = await client_b.get_channel(test_channel._get_channel_name()).readuntil() + + assert data.decode() == "{'foo':'bar'}\n" + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_many_extra_channels(self, local_socket_connection): + client_a, client_b = local_socket_connection + + def test_func(c): + return str(c._get_unused_extra_channel_id([int(id) for id in client_a._extra_channels.keys()])) + + [await client_a.open_channel(initial_state=ChannelState.OPENED) for _ in range(5)] + + assert len(client_a._extra_channels) == 5 + + assert test_func(client_a) == '15' + + del client_a._extra_channels['13'] + + assert len(client_a._extra_channels) == 4 + + assert test_func(client_a) == '13' + + await client_a.open_channel(initial_state=ChannelState.OPENED) + + assert len(client_a._extra_channels) == 5 + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_write_and_read_from_the_same_side_on_extra_channel(self, local_socket_connection): + client_a, client_b = local_socket_connection + + channel = await client_a.open_channel(initial_state=ChannelState.OPENED) + + channel.write("{'foo':'bar'}") + + await client_a.sync() + await client_a._writer.drain() + + data = None + + with pytest.raises(asyncio.TimeoutError): + data = await asyncio.wait_for(channel.read(1), timeout=0.5) + + assert data is None + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_readuntil(self, local_socket_connection): + client_a, client_b = local_socket_connection + + channel = CC.CONTROL + separator = '\r\n\r\n' + + client_a.get_channel(channel).write("{'foo':'bar'}") + await client_a._writer.drain() + + client_a.get_channel(channel).write("{'foo':'bar'}") + await client_a._writer.drain() + + client_a.get_channel(channel).write(separator + "{'should-not-be-returned'}") + await client_a._writer.drain() + + data = (await client_b.get_channel(channel).readuntil(separator.encode())).decode() + + assert data == "{'foo':'bar'}{'foo':'bar'}\r\n\r\n" + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_wih_scramjet_framework_to_list(self, local_socket_connection): + client_a, client_b = local_socket_connection + channel = CC.CONTROL + + from scramjet.streams import Stream + + client_a.get_channel(channel).write("foo\n") + client_a.get_channel(channel).write("bar\n") + client_a.get_channel(channel).write("baz\n") + await client_a.get_channel(channel).end() + + output_list = await Stream.read_from(client_b.get_channel(channel)).to_list() + + assert output_list == [b'foo\n', b'bar\n', b'baz\n'] + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_wih_scramjet_framework_to_pipe(self, local_socket_connection): + client_a, client_b = local_socket_connection + channel = CC.CONTROL + + from scramjet.streams import Stream + + client_a.get_channel(channel).write("foo") + client_a.get_channel(channel).write("bar\n") + client_a.get_channel(channel).write("foz") + client_a.get_channel(channel).write("baz\n") + await client_a.get_channel(channel).end() + + final_stream = Stream() + + Stream.read_from(client_b.get_channel(channel)).pipe(final_stream) + + output_list = await final_stream.to_list() + + assert output_list == [b'foobar\n', b'fozbaz\n'] + + await self._close_clients(client_a, client_b) + + @pytest.mark.asyncio + async def test_wih_scramjet_framework_write_to(self, local_socket_connection): + client_a, client_b = local_socket_connection + channel = CC.CONTROL + + data = [b'foo\n', b'bar\n', b'baz\n'] + + from scramjet.streams import Stream + + await Stream.read_from(data).write_to(client_a.get_channel(channel)) + await client_a.get_channel(channel).end() + + output = Stream.read_from(client_b.get_channel(channel)) + assert await output.to_list() == data + + await self._close_clients(client_a, client_b) diff --git a/packages/python-runner/tecemux/test/test_inet.py b/packages/python-runner/tecemux/test/test_inet.py new file mode 100644 index 000000000..69d85c728 --- /dev/null +++ b/packages/python-runner/tecemux/test/test_inet.py @@ -0,0 +1,227 @@ +import pytest +from tecemux.inet import TCPSegment, IPPacket, EthernetFrame, SequenceOrder + + +class TestIP: + def test_mf_df_flags(self): + + SequenceOrder().use_big_endian() + + data = b'E\x00\x00\x14\x00\x01`\x00@\x00\x1c\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01' + pkt = IPPacket.from_buffer(data) + assert pkt.flags == (IPPacket.Flags.MF | IPPacket.Flags.DF) & ~IPPacket.Flags.RF + assert pkt.is_flag('MF') is True + assert pkt.is_flag('DF') is True + assert pkt.is_flag('RF') is False + + def test_mf_flags(self): + + SequenceOrder().use_big_endian() + + data = b'E\x00\x00\x14\x00\x01 \x00@\x00\\\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01' + pkt = IPPacket.from_buffer(data) + assert pkt.flags == IPPacket.Flags.MF & ~IPPacket.Flags.RF + assert pkt.is_flag('MF') is True + assert pkt.is_flag('DF') is False + assert pkt.is_flag('RF') is False + + def test_df_flags(self): + + SequenceOrder().use_big_endian() + + data = (b'\x00\x23\x20\xd4\x2a\x8c\x00\x23\x20\xd4\x2a\x8c\x08\x00\x45\x00\x00\x54\x00\x00\x40\x00' + b'\x40\x01\x25\x8d\x0a\x00\x00\x8f\x0a\x00\x00\x8e\x08\x00\x2e\xa0\x01\xff\x23\x73\x20\x48' + b'\x4a\x4d\x00\x00\x00\x00\x78\x85\x02\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17' + b'\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d' + b'\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37') + + pkt = EthernetFrame.from_buffer(data).get_packet() + + assert pkt.flags == IPPacket.Flags.DF + assert pkt.flags == (IPPacket.Flags.DF & (~IPPacket.Flags.MF & ~IPPacket.Flags.RF)) + + assert pkt.is_flag('DF') is True + assert pkt.is_flag('MF') is False + assert pkt.is_flag('RF') is False + + assert pkt.offset == 0 + + def test_checksum_calc(self): + + SequenceOrder().use_big_endian() + + data = b'E\x00\x00\x14\x00\x01\x00\x00@\x00j\xd6\x01\x02\x03\x04\x05\x06\x07\x08' + checksum = 27350 + pkt = IPPacket.from_buffer(data) + pkt.checksum = 0 + + assert pkt.checksum == 0 + + pkt.build() + + assert pkt.checksum == checksum + + def test_checksum_calc_as_sth_expected(self): + checksum_from_sth = 64434 + data = bytes([10, 0, 0, 1, 10, 0, 0, 2, 0, 1, 69, 0, 0, 0, 0, 0, 32, 89, 3, 38, 0, 0, 0, 0, 0, 8, 0, 32, + 178, 251, 0, 0, 97, 102, 54, 98, 50, 51, 52, 56, 45, 102, 51, 56, 56, 45, 52, 54, 56, 48, + 45, 98, 54, 48, 97, 45, 97, 53, 102, 98, 50, 102, 98, 100, 100, 102, 50, 97, 48]) + + SequenceOrder().use_little_endian() + + pkt = IPPacket.from_buffer_with_pseudoheader(data) + assert pkt.to_buffer_with_tcp_pseudoheader() == data + + pkt.segment.checksum = 0 + assert pkt.segment.checksum == 0 + + new_pkt = pkt.build(for_STH=True) + assert new_pkt.segment.checksum == checksum_from_sth + + def test_packet_creation(self): + + SequenceOrder().use_big_endian() + + pkt = IPPacket(src_addr='172.25.44.3', dst_addr='172.25.44.254', + segment=TCPSegment(dst_port=3, flags=['ACK'])) + + assert pkt.src_addr == '172.25.44.3' + assert pkt.dst_addr == '172.25.44.254' + + def test_pakcet_creation_with_endstring(self): + buf = IPPacket(src_addr='172.25.44.3', dst_addr='172.25.44.254', + segment=TCPSegment(dst_port=6, flags=['PSH'], + data=b'\0')).build(for_STH=True).to_buffer_with_tcp_pseudoheader() + + pkt = IPPacket.from_buffer_with_pseudoheader(buf) + + assert pkt.src_addr == '172.25.44.3' + assert pkt.segment.data == b'\0' + assert pkt.dst_addr == '172.25.44.254' + + def test_pseudoheader(self): + + SequenceOrder().use_little_endian() + + data = bytes([10, 0, 0, 1, 10, 0, 0, 2, 0, 1, 32, 0, 0, 0, 0, 0, 249, 252, 104, 127, + 0, 0, 0, 0, 0, 8, 0, 0, 149, 136, 0, 0]) + res = IPPacket.from_buffer_with_pseudoheader(data) + + assert res.src_addr == '10.0.0.1' + assert res.dst_addr == '10.0.0.2' + assert res.len == 32 + assert res.protocol == 1 + + assert res.segment.seq == 2137586937 + assert res.segment.ack == 0 + + psh = res.prepare_pseudoheader(1, len(data[12:])) + + assert psh == data[0:12] + + +class TestTCP: + def test_tcp_offset(self): + + SequenceOrder().use_big_endian() + + data = b'\x01\xbb\xc0\xd7\xb6\x56\xa8\xb9\xd1\xac\xaa\xb1\x50\x18\x40\x00\x56\xf8\x00\x00' + segment = TCPSegment.from_buffer(data) + assert segment.offset == 5 + + def test_prepare_segment_with_flags(self): + + SequenceOrder().use_big_endian() + + segment = TCPSegment(flags=['FIN', 'SYN', 'ACK']) + + assert segment.is_flag('FIN') is True + assert segment.is_flag('SYN') is True + assert segment.is_flag('ACK') is True + assert segment.is_flag('PSH') is False + + segment = TCPSegment(flags=['SYN', 'PSH']) + + assert segment.is_flag('FIN') is False + assert segment.is_flag('SYN') is True + assert segment.is_flag('ACK') is False + assert segment.is_flag('PSH') is True + + segment = TCPSegment().set_flags(['FIN', 'SYN', 'ACK']) + + assert segment.is_flag('FIN') is True + assert segment.is_flag('SYN') is True + assert segment.is_flag('ACK') is True + assert segment.is_flag('PSH') is False + + segment = TCPSegment().set_flags(['SYN', 'PSH']) + + assert segment.is_flag('FIN') is False + assert segment.is_flag('SYN') is True + assert segment.is_flag('ACK') is False + assert segment.is_flag('PSH') is True + + def test_basic_details(self): + + SequenceOrder().use_big_endian() + + data = (b'E\x00\x00(\x00\x01@\x00@\x06,\xbe\x01\x02\x03\x04\x04\x05\x06\x07' + b'\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x81m\x00\x00') + pkt = IPPacket.from_buffer(data) + assert pkt.segment.dst_port == 80 + assert pkt.segment.flags & TCPSegment.Flags.SYN + assert pkt.segment.is_flag('SYN') is True + assert pkt.segment.is_flag('PSH') is False + + def test_checksum(self): + + SequenceOrder().use_big_endian() + + data = (b'E\x00\x00(\x00\x01@\x00@\x06,\xbe\x01\x02\x03\x04\x04\x05\x06\x07\x00' + b'\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x81m\x00\x00') + pkt = IPPacket.from_buffer(data) + assert pkt.segment.checksum == 33133 + + def test_checksum_calc(self): + + SequenceOrder().use_big_endian() + + data = (b'E\x00\x00*\x00\x01\x00\x00@\x06N\x9d\n\x0b\x0c\x0e\n\x0b\x0c\r\x00\x14' + b'\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00Hi') + pkt = IPPacket.from_buffer(data) + + assert pkt.segment.checksum == 0 + + pkt = IPPacket.from_buffer(data).build() + + assert pkt.segment.checksum == 6871 + + def test_unpack(self): + + SequenceOrder().use_big_endian() + + data = (b'\x00\x50\x0d\x2c\x11\x4c\x61\x8b\x38\xaf\xfe\x14\x70\x12\x16\xd0' + b'\x5b\xdc\x00\x00\x02\x04\x05\x64\x01\x01\x04\x02') + pkt = TCPSegment.from_buffer(data) + assert pkt.flags == (TCPSegment.Flags.SYN | TCPSegment.Flags.ACK) + assert pkt.offset == 7 + assert pkt.win == 5840 + assert pkt.dst_port == 3372 + assert pkt.seq == 290218379 + assert pkt.ack == 951057940 + + def test_parse_only_first_packet(self): + + SequenceOrder().use_big_endian() + + data = (b"\x05\x00\x005\x00\x00\x00\x00\xff\x06\xfb\xc3\x00\x00\x00\x00\x00" + b"\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00" + b"\x00\x00\x00#g\x00\x00{'foo':'bar'}\x05\x00\x006\x00\x00\x00\x00" + b"\xff\x06\xfb\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05" + b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\xdc\x00" + b"\x00{'bar':'foo2'}") + + pkt = IPPacket.from_buffer(data) + + assert pkt.len == 53 + assert pkt.get_segment().data == b"{'foo':'bar'}" diff --git a/packages/python-runner/tecemux/test/test_multiplexer.py b/packages/python-runner/tecemux/test/test_multiplexer.py new file mode 100644 index 000000000..e7c7b6007 --- /dev/null +++ b/packages/python-runner/tecemux/test/test_multiplexer.py @@ -0,0 +1,28 @@ +import asyncio +import pytest +from tecemux.multiplexer import Tecemux + + +class TestMultiplexer: + async def _close_clients(self, a, b): + await a.stop() + await b.stop() + + def test_default_init(self): + protocol = Tecemux() + assert isinstance(protocol, Tecemux) + assert protocol._sequence_number == 0 + + @pytest.mark.asyncio + async def test_socket_connection(self): + + protocol = Tecemux() + + assert protocol._reader is None + assert protocol._writer is None + + await protocol.connect(*await Tecemux.prepare_socket_connection()) + + assert isinstance(protocol._reader, asyncio.StreamReader) + assert isinstance(protocol._writer, asyncio.StreamWriter) + assert protocol._sequence_number > 0 diff --git a/packages/python-runner/tecemux/test/test_proxy.py b/packages/python-runner/tecemux/test/test_proxy.py new file mode 100644 index 000000000..2fc39a427 --- /dev/null +++ b/packages/python-runner/tecemux/test/test_proxy.py @@ -0,0 +1,42 @@ +import asyncio +import pytest + + +class TestProxy: + + async def _close_clients(self, a, b): + await a.stop() + await b.stop() + + @pytest.mark.asyncio + async def test_extra_channel_with_proxy(self, local_socket_connection): + client_a, client_b = local_socket_connection + + async def _wait_for_channel(client_b): + while True: + if len(client_b._extra_channels) > 0: + opened_channel_name = list(client_b._extra_channels.keys())[0] + channel = client_b.get_channel(opened_channel_name) + _ = await channel.readuntil(b'\r\n\r\n') + await asyncio.sleep(0.5) + channel.write(b'HTTP/1.1 200 OK\r\nContent-Length: 12\r\n' + b'Content-Type: text/html\r\n\r\nHello World!\r\n') + await client_b.sync() + break + await asyncio.sleep(0) + + task = asyncio.create_task(_wait_for_channel(client_b)) + + import aiohttp + + async with client_a.get_channel_guard() as guard: + async with aiohttp.ClientSession() as session: + async with session.get("http://_/api/version", + proxy_auth=guard.inject_tecemux_details_as(aiohttp.BasicAuth), + proxy=guard.get_proxy_uri()) as resp: + data = await resp.text() + + await asyncio.gather(task) + + assert data == 'Hello World!' + await self._close_clients(client_a, client_b) diff --git a/packages/runner/Dockerfile b/packages/runner/Dockerfile index 324405474..c14704636 100644 --- a/packages/runner/Dockerfile +++ b/packages/runner/Dockerfile @@ -27,6 +27,8 @@ COPY ./dist/symbols ./dist/symbols COPY ./dist/obj-logger ./dist/obj-logger COPY ./dist/model ./dist/model COPY ./dist/runner ./dist/runner +COPY ./dist/verser ./dist/verser +COPY ./dist/tecemux ./dist/tecemux COPY ./dist/package.json ./dist/package.json FROM target diff --git a/packages/runner/package.json b/packages/runner/package.json index 40cfbc5e2..f4c02afaf 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -23,7 +23,7 @@ "@scramjet/obj-logger": "^0.38.0", "@scramjet/symbols": "^0.38.0", "@scramjet/utility": "^0.38.0", - "bpmux": "^8.2.1", + "@scramjet/tecemux": "^0.38.0", "scramjet": "^4.36.9" }, "devDependencies": { diff --git a/packages/runner/src/host-client.ts b/packages/runner/src/host-client.ts index 5635b6dd0..a66472589 100644 --- a/packages/runner/src/host-client.ts +++ b/packages/runner/src/host-client.ts @@ -4,13 +4,13 @@ import { CommunicationChannel as CC } from "@scramjet/symbols"; import net, { createConnection, Socket } from "net"; import { ObjLogger } from "@scramjet/obj-logger"; import { Agent } from "http"; +import { TeceMux, TeceMuxChannel } from "@scramjet/tecemux"; type HostOpenConnections = [ - net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket, net.Socket + TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, + TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, TeceMuxChannel, TeceMuxChannel ] -const BPMux = require("bpmux").BPMux; - /** * Connects to Host and exposes streams per channel (stdin, monitor etc.) */ @@ -18,7 +18,8 @@ class HostClient implements IHostClient { private _streams?: UpstreamStreamsConfig; public agent?: Agent; logger: IObjectLogger; - bpmux: any; + hubTunnel!: TeceMux; + constructor(private instancesServerPort: number, private instancesServerHost: string) { this.logger = new ObjLogger(this); } @@ -40,52 +41,40 @@ class HostClient implements IHostClient { } async init(id: string): Promise { - const openConnections = await Promise.all( - Array.from(Array(9)) - .map(() => { - // Error handling for each connection is process crash for now - const connection = net.createConnection(this.instancesServerPort, this.instancesServerHost); + const hostSocket = net.createConnection(this.instancesServerPort, this.instancesServerHost); + const protocol = new TeceMux(hostSocket); - connection.setNoDelay(true); + //protocol.logger.pipe(this.logger); + hostSocket.setNoDelay(true); - return new Promise(res => { - connection.on("connect", () => res(connection)); - }); - }) - .map((connPromised, index) => { - return connPromised.then((connection) => { - // Assuming id is exactly 36 bytes - connection.write(id); - // Assuming number is from 0-7, sending 1 byte - connection.write(index.toString()); - - return connection; - }); + const openConnections = await Promise.all( + Array.from(Array(9)).map((_c, index) => protocol.multiplex({ channel: index })) + ).then(async res => { + return Promise.all( + res.map(async (channel, index) => { + // Assuming id is exactly 36 bytes + Assuming number is from 0-8, sending 1 byte + channel.write(id + "" + index); + + return channel; }) - ); + ); + }); this._streams = openConnections as HostOpenConnections; - try { - this.bpmux = new BPMux(this._streams[CC.PACKAGE]); - } catch (e) { - // eslint-disable-next-line no-console - console.error(e); - } - const agent = new Agent() as Agent & { createConnection: typeof createConnection }; // lack of types?; agent.createConnection = () => { try { - const socket = this.bpmux!.multiplex() as Socket; + const socket = protocol.multiplex() as unknown as Socket; socket.on("error", () => { this.logger.error("Muxed stream error"); }); - // some libs call it but it is not here, in BPMux. + // mock Socket's setKeepAlive in TeceMuxChannel. socket.setKeepAlive ||= (_enable?: boolean, _initialDelay?: number | undefined) => socket; this.logger.info("Creating connection to verser server"); @@ -107,22 +96,12 @@ class HostClient implements IHostClient { async disconnect() { this.logger.trace("Disconnecting from host"); - const streamsExitedPromised: Promise[] = this.streams.map((stream, i) => + const streamsExitedPromised: Promise[] = this.streams.map((stream, _i) => new Promise( (res) => { - if ("writable" in stream!) { - stream - .on("error", (e) => { - console.error("Error on stream", i, e.stack); - }) - .on("close", () => { - res(); - }) - .end(); - } else { - stream!.destroy(); - res(); - } + // now we have readable and writable always + stream!.destroy(); + res(); } )); diff --git a/packages/runner/src/runner-app-context.ts b/packages/runner/src/runner-app-context.ts index 848f828ac..f05b22a0a 100644 --- a/packages/runner/src/runner-app-context.ts +++ b/packages/runner/src/runner-app-context.ts @@ -46,7 +46,6 @@ implements AppContext { this.space = spaceClient; this.instanceId = id; } - private handleSave(_state: any): void { throw new Error("Method not implemented."); } diff --git a/packages/runner/src/runner.ts b/packages/runner/src/runner.ts index 358696556..a8779bae4 100644 --- a/packages/runner/src/runner.ts +++ b/packages/runner/src/runner.ts @@ -302,7 +302,9 @@ export class Runner implements IComponent { this.logger.debug("Streams initialized"); - this.sendHandshakeMessage(); + //await defer(15); + + await this.sendHandshakeMessage(); const { appConfig, args } = await this.waitForHandshakeResponse(); @@ -455,7 +457,8 @@ export class Runner implements IComponent { // TODO: what if it fails? } - sendHandshakeMessage() { + async sendHandshakeMessage() { + await defer(1000); MessageUtils.writeMessageOnStream([RunnerMessageCode.PING, {}], this.hostClient.monitorStream); this.logger.trace("Handshake sent"); @@ -507,12 +510,16 @@ export class Runner implements IComponent { try { this.logger.debug("Processing function on index", sequence.length - itemsLeftInSequence - 1); + // eslint-disable-next-line no-loop-func + await new Promise((res) => { + process.nextTick(res); + }); + out = func.call( this.context, stream, ...args ); - this.logger.debug("Function called", sequence.length - itemsLeftInSequence - 1); } catch (error: any) { this.logger.error("Function errored", sequence.length - itemsLeftInSequence, error.stack); diff --git a/packages/sth/Dockerfile b/packages/sth/Dockerfile index 67228e6d3..e3e0960da 100644 --- a/packages/sth/Dockerfile +++ b/packages/sth/Dockerfile @@ -18,6 +18,7 @@ COPY ./dist/types ./dist/types COPY ./dist/load-check ./dist/load-check COPY ./dist/utility ./dist/utility COPY ./dist/verser ./dist/verser +COPY ./dist/tecemux ./dist/tecemux COPY ./dist/telemetry ./dist/telemetry COPY ./dist/package.json ./dist/package.json COPY LICENSE ./ diff --git a/packages/tecemux/.eslintrc.js b/packages/tecemux/.eslintrc.js new file mode 100644 index 000000000..fc7819a8a --- /dev/null +++ b/packages/tecemux/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + ignorePatterns: [".eslintrc.js", "types.ts"], + parserOptions:{ + project: "./tsconfig.json", + tsconfigRootDir: __dirname + } +}; diff --git a/packages/tecemux/README.md b/packages/tecemux/README.md new file mode 100644 index 000000000..f5f2ec3d0 --- /dev/null +++ b/packages/tecemux/README.md @@ -0,0 +1,62 @@ +# Scramjet Verser + +![Scramjet Transform Hub](https://assets.scramjet.org/sth-logo.svg "Scramjet Transform Hub Logo") + +This package provides a reverse server functionality. + +```bash +npm install -g @scramjet/verser +``` + +## Docs + +See the code documentation here: [scramjetorg/transform-hub/docs/verser/modules.md](https://github.com/scramjetorg/transform-hub/tree/HEAD/docs/verser/modules.md) + +## Scramjet Transform Hub + +This package is part of [Scramjet Transform Hub](https://www.npmjs.org/package/@scramjet/sth). + +Scramjet Transform Hub is a deployment and execution platform. Once installed on a server, it will allow you to start your programs and keep them running on a remote machine. You will be able to start programs in the background or connect to them and see their output directly on your terminal. You will be able to pipe your local data to the program, as if it was running from your terminal. You can start your server in AWS, Google Cloud or Azure, start it on your local machine, install it on a Raspberry Pi or wherever else you'd like. + +## Use cases + +There's no limit what you can use it for. You want a stock checker? A chat bot? Maybe you'd like to automate your home? Retrieve sensor data? Maybe you have a lot of data and want to transfer and wrangle it? You have a database of cities and you'd like to enrich your data? You do machine learning and you want to train your set while the data is fetched in real time? Hey, you want to use it for something else and ask us if that's a good use? Ask us [via email](mailto:get@scramjet.org) or hop on our [Scramjet Discord](https://scr.je/join-community-mg1)! + +## Some important links + +* Scramjet, the company behind [Transform Hub](https://scramjet.org) +* The [Scramjet Framework - functional reactive stream processing framework](https://framework.scramjet.org) +* The [Transform Hub repo on github](https://github.com/scramjetorg/transform-hub) +* You can see the [Scramjet Transform Hub API docs here](https://github.com/scramjetorg/transform-hub/tree/HEAD/docs/api-client/README.md) +* You can see the [CLI documentation here](https://github.com/scramjetorg/transform-hub/tree/HEAD/packages/cli/README.md), but `si help` should also be quite effective. +* Don't forget to ⭐ this repo if you like it, `subscribe` to releases and keep visiting us for new versions and updates. +* You can [open an issue - file a bug report or a feature request here](https://github.com/scramjetorg/transform-hub/issues/new/choose) + +## License and contributions + +This module is licensed under AGPL-3.0 license. + +The Scramjet Transform Hub project is dual-licensed under the AGPL-3.0 and MIT licenses. Parts of the project that are linked with your programs are MIT licensed, the rest is AGPL. + +## Contributions + +We accept valid contributions and we will be publishing a more specific project roadmap so contributors can propose features and also help us implement them. We kindly ask you that contributed commits are Signed-Off `git commit --sign-off`. + +We provide support for contributors via test cases. If you expect a certain type of workflow to be officially supported, please specify and implement a test case in `Gherkin` format in `bdd` directory and include it in your pull request. More info about our BDD test you will find [here](https://github.com/scramjetorg/transform-hub/tree/HEAD/bdd/README.md). + +### Help wanted 👩‍🎓🧑👱‍♀️ + +The project need's your help! There's lots of work to do and we have a lot of plans. If you want to help and be part of the Scramjet team, please reach out to us, [on discord](https://scr.je/join-community-mg1) or email us: [opensource@scramjet.org](mailto:opensource@scramjet.org). + +### Donation 💸 + +Do you like this project? It helped you to reduce time spent on delivering your solution? You are welcome to buy us a coffee ☕ Thanks a lot! 😉 + +[You can sponsor us on github](https://github.com/sponsors/scramjetorg) + +* There's also a Paypal donation link if you prefer that: + +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=7F7V65C43EBMW) + + + diff --git a/packages/tecemux/package.json b/packages/tecemux/package.json new file mode 100644 index 000000000..baf5b7237 --- /dev/null +++ b/packages/tecemux/package.json @@ -0,0 +1,46 @@ +{ + "name": "@scramjet/tecemux", + "version": "0.38.0", + "description": "This package is part of Scramjet Transform Hub. The package provides a communication protocol used among Scramjet modules.", + "main": "./src/index.ts", + "scripts": { + "start": "ts-node ./src/bin/index", + "build": "../../scripts/build-all.js --config-name=tsconfig.build.json --copy-dist", + "build:docs": "typedoc", + "clean": "rm -rf ./dist .bic_cache", + "test": "npm run test:ava", + "test:ava": "ava" + }, + "author": "Scramjet ", + "license": "AGPL-3.0", + "dependencies": { + "@scramjet/obj-logger": "^0.36.1", + "@scramjet/utility": "^0.36.1", + "bpmux": "^8.2.1" + }, + "devDependencies": { + "@scramjet/api-server": "^0.38.0", + "@scramjet/types": "^0.38.0", + "@types/node": "15.12.5", + "ava": "^3.15.0", + "ts-node": "^10.9.1", + "typedoc": "0.23.17", + "typedoc-plugin-markdown": "3.13.6", + "typescript": "~4.7.4" + }, + "ava": { + "extensions": [ + "ts" + ], + "files": [ + "**/*.spec.ts" + ], + "require": [ + "ts-node/register" + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/scramjetorg/transform-hub.git" + } +} diff --git a/packages/tecemux/src/codecs/frame-decoder.ts b/packages/tecemux/src/codecs/frame-decoder.ts new file mode 100644 index 000000000..5801390dc --- /dev/null +++ b/packages/tecemux/src/codecs/frame-decoder.ts @@ -0,0 +1,125 @@ +import { ObjLogger } from "@scramjet/obj-logger"; +import { Duplex, Transform, TransformCallback, TransformOptions } from "stream"; +import { parseFlags } from "../utils"; +import { HEADER_LENGTH } from "../constants"; +import { calculateChecksum, getChecksum } from "./utils"; +import { FrameData } from "../types"; + +export class FrameDecoder extends Transform { + buffer: Buffer; + logger: ObjLogger; + + _streams = new Map(); + + constructor(opts: TransformOptions = {}, params: { name: string } = { name: "FrameDecoder" }) { + super(Object.assign({}, opts, { readableObjectMode: true })); + + this.buffer = Buffer.alloc(0); + this.logger = new ObjLogger(params.name); + + this.on("pipe", () => { + this.logger.debug("onPipe"); + }).on("close", () => { + this.logger.debug("onClose"); + }); + } + + _transform(chunk: Buffer, encoding: BufferEncoding, callback: TransformCallback): void { + try { + if (!Buffer.isBuffer(chunk)) { + this.push(JSON.stringify({ error: "not a buffer" }), undefined); + + callback(); + return; + } + + if (Buffer.isBuffer(chunk)) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.logger.error("Decoding buffer...", chunk); + this.emit("error", "Chunk is not a buffer"); + + callback(); + return; + } + + let frameSize = 0; + + this.logger.trace("Decoding buffer...", /* toHex(this.buffer) */ "Size:", this.buffer.length); + + if (this.buffer.length === 0) { + callback(null); + return; + } + + if (this.buffer.length >= HEADER_LENGTH) { + frameSize = this.buffer.readInt32LE(10); + } else { + this.logger.trace("To few data"); + callback(null); + return; + } + + if (this.buffer.length < frameSize) { + this.logger.trace("To few data"); + callback(null); + return; + } + + const checksum = getChecksum(this.buffer.subarray(0, frameSize)); + + this.logger.debug("getChecksum", checksum.toString()); + + const payload = { + sourceAddress: [ + this.buffer.readInt8(0), this.buffer.readInt8(1), this.buffer.readInt8(2), this.buffer.readInt8(3) + ], + destinationAddress: [ + this.buffer.readInt8(4), this.buffer.readInt8(5), this.buffer.readInt8(6), this.buffer.readInt8(7) + ], + chunk: this.buffer.subarray(32, this.buffer.readInt32LE(10)), + flags: parseFlags(this.buffer.readInt8(25)), + sourcePort: this.buffer.readInt16LE(12), + destinationPort: this.buffer.readInt16LE(14), + dataLength: frameSize - HEADER_LENGTH, + chunkLength: frameSize, + sequenceNumber: this.buffer.readInt32LE(16), + acknowledgeNumber: this.buffer.readInt32LE(20), + checksum + //stringified: this.buffer.subarray(32, frameSize).toString() + } as Partial; + + const expectedChecksum = calculateChecksum(this.buffer.subarray(0, frameSize)); + + if (checksum !== expectedChecksum) { + this.emit("error", { code: "INVALID_CHECKSUM", payload, expectedChecksum }); + payload.error = "checksum"; + } else { + this.logger.info("Checksum match!", expectedChecksum); + } + + if (payload.dataLength && payload.dataLength < 0) { + this.emit("error", "Data length incorrect"); + return; + } + + this.push(JSON.stringify(payload), "utf-8"); + + this.buffer = this.buffer.subarray(frameSize); + + this.logger.trace("Decoded", { ...payload, stringified: "N/A" });//payload.chunk?.toString() }); + + if (this.buffer.length === 0) { + this.logger.info("No remaining data!"); + callback(); + return; + } + + this.logger.trace("More than one frame in chunk. processing", this.buffer.length); + this._transform(Buffer.alloc(0), encoding, callback); + } catch (error) { + this.logger.error("ERROR", error); + this.emit("error", error); + } + } +} diff --git a/packages/tecemux/src/codecs/frame-encoder.ts b/packages/tecemux/src/codecs/frame-encoder.ts new file mode 100644 index 000000000..91191bf00 --- /dev/null +++ b/packages/tecemux/src/codecs/frame-encoder.ts @@ -0,0 +1,203 @@ +/* eslint-disable no-console */ + +import { PassThrough, Transform, TransformCallback, TransformOptions } from "stream"; +import { ObjLogger } from "@scramjet/obj-logger"; + +import { FrameTarget, HEADER_LENGTH, binaryFlags, frameFlags } from "../constants"; +import { FrameData, ITeCeMux } from "../types"; +import { calculateChecksum } from "./utils"; + +export class FrameEncoder extends Transform { + MAX_CHUNK_SIZE = 64 * 1024 - HEADER_LENGTH - 1; + + tecemux: ITeCeMux; + total = 0; + logger = new ObjLogger("FrameEncoder"); + out = Object.assign(new PassThrough({ readableObjectMode: true }) + /*.on("data", (data) => { + this.logger.trace( + "output to socket: " + (data.length === HEADER_LENGTH ? "HEADER ONLY" : ""), + toHex(data), data.length, this.readableFlowing); + })*/ + .on("pause", () => { + this.logger.trace("OUT paused!"); + }) + .on("end", () => { + this.logger.trace("OUT ended!", this.frameTarget); + }) + .on("resume", () => { + this.logger.trace("OUT resumed"); + }) + .on("error", (error) => { + this.logger.error("OUT error", error); + })//.pause() + , { + _id: this.frameTarget + }); + + constructor( + private frameTarget: FrameTarget, + tecemux: ITeCeMux, + opts: TransformOptions = {}, + params: { name: string } = { name: "FrameEncoder" } + ) { + super(Object.assign(opts, { + readableObjectMode: true, + writableObjectMode: true + })); + + this.tecemux = tecemux; + this.logger = new ObjLogger(params.name, { id: this.frameTarget.toString() }); + + this + .on("pipe", () => { + this.logger.debug("onPipe"); + }) + .on("end", () => { + this.logger.debug("onEnd"); + }) + .on("pause", () => { + this.logger.debug("onPause"); + }) + .on("resume", () => { + this.logger.debug("onResume"); + }); + + this.pipe(this.out); + } + + setFlags(flag: (keyof typeof binaryFlags)[] = [], flags: Uint8Array = new Uint8Array([0])) { + for (const f in flag) { + if (Object.prototype.hasOwnProperty.call(flag, f)) { + flags[0] |= 1 << frameFlags.indexOf(flag[f]); + } + } + + this.logger.debug("settingFlag", flag, flags[0].toString(2).padStart(8, "0")); + + return flags; + } + + async establishChannel(channelId: number) { + this.logger.debug("Establishing channel", channelId); + + const frame = this.createFrame([], { + flagsArray: ["PSH"], + destinationPort: channelId + }); + + this.out.write(frame); + + const sn = +this.tecemux.sequenceNumber; + + return new Promise((resolve, _reject) => { + const ackTempHandler = (sequenceNumber: number) => { + this.logger.debug("ACK RECEIVED", sequenceNumber, sn); + + if (sequenceNumber === sn) { + this.tecemux.framesKeeper.off("ack", ackTempHandler); + this.logger.debug("channel established", channelId); + resolve(); + } + }; + + this.tecemux.framesKeeper.on("ack", ackTempHandler); + }); + } + + onChannelEnd(channelId: number) { + this.logger.debug("sending FIN for channel", channelId); + this.out.write( + this.createFrame([], { + flagsArray: ["FIN"], + destinationPort: channelId + }) + ); + } + + getChecksum() { + return 255; + } + + createFrame(chunk: any = new Uint8Array([]), frame: Partial) { + const buffer = Buffer.concat([ + // 0: source address 0 - 3 + new Uint8Array([10, 0, 0, 1]), + // 32: destination address 4 - 7 + new Uint8Array([10, 0, 0, 2]), + + // 64: zeroes (8bit), protocol (8bit), 8 - 9 + new Uint8Array([0, 1]), + + // tcp length (16bit) 10 - 11 + new Uint8Array(new Uint16Array([chunk.length + HEADER_LENGTH]).buffer), + + // 96: Source port, destination port 12 - 15 + new Uint8Array(new Uint16Array([0, frame.destinationPort || this.frameTarget]).buffer), + + // 128: sequenceNumber(32 bit, acnowledge number) 16 - 19 + new Uint8Array(new Uint32Array([this.tecemux.sequenceNumber]).buffer), + + // 160: Acknowledgement number 20-23 + new Uint8Array(new Uint32Array([frame.acknowledgeNumber || 0]).buffer), + + // 192: data offset (4bit), reserved (4bit), 24 + new Uint8Array([0b00000000]), + + // 224: flags (8bit), 25 + this.setFlags(frame.flagsArray, new Uint8Array([0b00000000])), + // window(16bit) 26 - 27, ZEROes before calculation + new Uint8Array(new Uint16Array([0]).buffer), + + // checksum(16bit) 28 - 29 + new Uint8Array(new Uint16Array([0]).buffer), + // pointer (16bit) 30 - 31 + new Uint8Array(new Uint16Array([0]).buffer), + + // 256: data 32 - + new Uint8Array(chunk) + ]); + + buffer.writeUInt16LE( + calculateChecksum(buffer), 28 + ); + + return buffer; + } + + async _transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback): Promise { + this.total += chunk.length; + + this.logger.debug("TRANSFORM IN", /* toHex(chunk), */ chunk.length, this.total); + + let remaining = Buffer.alloc(0); + + if (chunk.length > this.MAX_CHUNK_SIZE) { + this.logger.debug("TRANSFORM big chunk, splitting", chunk.length); + + remaining = (chunk as Buffer).subarray(this.MAX_CHUNK_SIZE); + chunk = chunk.subarray(0, this.MAX_CHUNK_SIZE); + + this.logger.debug("TRANSFORM processing part/remaining", chunk.length, remaining.length); + } + + const buffer = this.createFrame(chunk, { destinationPort: this.frameTarget, flagsArray: ["PSH"] }); + + this.logger.debug("Awaiting keeper"); + await this.tecemux.framesKeeper.generator.next(this.tecemux.sequenceNumber); + this.logger.debug("Awaiting keeper DONE"); + + this.tecemux.framesKeeper.handlePSH(this.tecemux.sequenceNumber); + + this.tecemux.framesSent++; + this.tecemux.sequenceNumber++; + this.logger.debug("TRANSFORM OUT", /*getHexString(buffer), */ "Size: ", buffer.length); + + if (remaining.length) { + this.push(buffer); + await this._transform(remaining, encoding, callback); + } else { + callback(null, buffer); + } + } +} diff --git a/packages/tecemux/src/codecs/index.ts b/packages/tecemux/src/codecs/index.ts new file mode 100644 index 000000000..2a0fcd378 --- /dev/null +++ b/packages/tecemux/src/codecs/index.ts @@ -0,0 +1,2 @@ +export * from "./frame-decoder"; +export * from "./frame-encoder"; diff --git a/packages/tecemux/src/codecs/utils.ts b/packages/tecemux/src/codecs/utils.ts new file mode 100644 index 000000000..153524689 --- /dev/null +++ b/packages/tecemux/src/codecs/utils.ts @@ -0,0 +1,24 @@ +export const calculateChecksum = (buffer: Buffer) => { + let tempFrame = Buffer.concat([buffer, Buffer.alloc(0)]); + + if (buffer.length % 2) { + tempFrame = Buffer.concat([buffer, Buffer.alloc(1, 0)]); + } + + let checksum = 0; + let i = 0; + + while (i <= tempFrame.length - 2) { + if (i !== 28) { + checksum += tempFrame.readUInt16LE(i); + } + + i += 2; + } + + return checksum % 0x10000; +}; + +export const getChecksum = (buffer: Buffer) => { + return buffer.readUInt16LE(28); +}; diff --git a/packages/tecemux/src/constants.ts b/packages/tecemux/src/constants.ts new file mode 100644 index 000000000..17e8362a3 --- /dev/null +++ b/packages/tecemux/src/constants.ts @@ -0,0 +1,21 @@ +export const binaryFlags = { + FIN: 0b00000001, + SYN: 0b00000010, + RST: 0b00000100, + PSH: 0b00001000, + ACK: 0b00010000, + URG: 0b00100000, + ECE: 0b01000000, + CWR: 0b10000000 +}; + +export const frameFlags = Object.keys(binaryFlags); + +export const HEADER_LENGTH = 32; + +export enum FrameTarget { + API, + INPUT = 1001 +} + +export const ACK_FRAME_DELTA = -5; diff --git a/packages/tecemux/src/frames-keeper.ts b/packages/tecemux/src/frames-keeper.ts new file mode 100644 index 000000000..142c974bc --- /dev/null +++ b/packages/tecemux/src/frames-keeper.ts @@ -0,0 +1,63 @@ +import { ObjLogger } from "@scramjet/obj-logger"; +import { TypedEmitter } from "@scramjet/utility"; +import { FramesKeeperEvents, FramesKeeperFrame, IFramesKeeper } from "./types"; + +export class FramesKeeper extends TypedEmitter implements IFramesKeeper { + #MAX_FRAMES_DIFFERENCE = 3; + + #framesSent = new Map(); + + lastSequenceSent: number = -1; + lastSequenceReceived: number = -1; + + logger = new ObjLogger(this); + + generator: AsyncGenerator = async function* (this: FramesKeeper) { + while (true) { + if (this.lastSequenceSent - this.lastSequenceReceived < this.#MAX_FRAMES_DIFFERENCE) { + this.logger.debug("Write allowed"); + yield Promise.resolve(this.lastSequenceReceived); + continue; + } + + this.logger.warn("Write NOT allowed"); + yield new Promise((res) => { + this.logger.info("waiting for ACK..."); + + this.once("ack", (acknowledgeNumber: number) => { + this.logger.info("ACK processed"); + res(acknowledgeNumber); + }); + }); + } + }.apply(this); + + handlePSH(sequenceNumber: number) { + this.lastSequenceSent = sequenceNumber; + } + + handleACK(acknowledgeNumber: number) { + this.logger.debug("onACK", acknowledgeNumber); + + const storedFrame = this.#framesSent.get(acknowledgeNumber); + + if (storedFrame) { + this.#framesSent.set(acknowledgeNumber, { ...storedFrame, received: true }); + } + + this.lastSequenceReceived = acknowledgeNumber; + this.emit("ack", acknowledgeNumber); + } + + isReceived(sequenceNumber: number) { + const frame = this.#framesSent.get(sequenceNumber); + + // received or not stored + return frame === undefined || !!frame.received; + } + + getFrame(sequenceNumber: number) { + return this.#framesSent.get(sequenceNumber); + } +} + diff --git a/packages/tecemux/src/index.ts b/packages/tecemux/src/index.ts new file mode 100644 index 000000000..802a3f900 --- /dev/null +++ b/packages/tecemux/src/index.ts @@ -0,0 +1 @@ +export * from "./tecemux"; diff --git a/packages/tecemux/src/readme.mtpl b/packages/tecemux/src/readme.mtpl new file mode 100644 index 000000000..781404c6d --- /dev/null +++ b/packages/tecemux/src/readme.mtpl @@ -0,0 +1,19 @@ +# Scramjet Verser + +![Scramjet Transform Hub](https://assets.scramjet.org/sth-logo.svg "Scramjet Transform Hub Logo") + +This package provides a reverse server functionality. + +```bash +npm install -g @scramjet/verser +``` + +## Docs + +>!docs verser/modules.md & + +>@sth +>@use-cases +>@links +>@license-agpl +>@contrib diff --git a/packages/tecemux/src/tecemux-channel.ts b/packages/tecemux/src/tecemux-channel.ts new file mode 100644 index 000000000..5e75f2446 --- /dev/null +++ b/packages/tecemux/src/tecemux-channel.ts @@ -0,0 +1,71 @@ +import { ObjLogger } from "@scramjet/obj-logger"; +import { Duplex } from "stream"; +import { IFrameEncoder, ITeCeMux } from "./types"; +import { FrameEncoder } from "./codecs"; + +export class TeceMuxChannel extends Duplex { + _id: number; + logger: ObjLogger; + allowHalfOpen: boolean; + encoder: IFrameEncoder; + closedByFIN = false; + + constructor(duplexOptions: ConstructorParameters[0], id: number, teceMux: ITeCeMux) { + super(duplexOptions); + this.logger = new ObjLogger(this); + this.allowHalfOpen = true; + this._id = id; + this.encoder = new FrameEncoder(id, teceMux, { encoding: undefined }); + } + + _write(chunk: any, encoding: BufferEncoding, next: (error?: Error | null | undefined) => void) { + this.logger.debug("WRITE channel", this._id, chunk); + + if (chunk === null) { + this.logger.info("NULL ON CHANNEL"); + + this.end(); + return false; + } + + return this.encoder.write(chunk, encoding, next); + } + + _read(_size?: number) { + this.logger.debug("READ channel", this._id); + } + + sendACK(sequenceNumber: number) { + this.encoder.push( + this.encoder.createFrame(undefined, { + flagsArray: ["ACK"], + acknowledgeNumber: sequenceNumber, + destinationPort: this._id + }) + ); + } + + sendPauseACK(sequenceNumber: number) { + //console.log("Cant write more. Send pause command"); + this.encoder.push( + this.encoder.createFrame(undefined, { + flagsArray: ["ACK", "SYN"], + acknowledgeNumber: sequenceNumber, + destinationPort: this._id + }) + ); + } + + handlerFIN() { + this.closedByFIN = true; + + if (!this.writableEnded) { + this.push(null); + } + + if (this.writableEnded && this.readableEnded) { + this.destroy(); + this.logger.info("Channel destroy"); + } + } +} diff --git a/packages/tecemux/src/tecemux.ts b/packages/tecemux/src/tecemux.ts new file mode 100644 index 000000000..279341108 --- /dev/null +++ b/packages/tecemux/src/tecemux.ts @@ -0,0 +1,229 @@ +/* eslint-disable no-console */ + +import { TypedEmitter } from "@scramjet/utility"; +import { FrameDecoder } from "./codecs"; +import { Duplex } from "stream"; +import { Socket } from "net"; +import { ObjLogger } from "@scramjet/obj-logger"; +import { FrameData, TeceMuxEvents } from "./types"; +import { FramesKeeper } from "./frames-keeper"; +import { TeceMuxChannel } from "./tecemux-channel"; + +export class TeceMux extends TypedEmitter { + id: string; + carrierSocket: Duplex; + channelCount = 1; + framesSent = 0; + carrierDecoder: FrameDecoder; + framesKeeper = new FramesKeeper(); + sequenceNumber = Math.abs(Math.random() * 2 ** 32 / 2 | 0); + channels = new Map(); + + logger: ObjLogger; + + private createChannel(destinationPort?: number): TeceMuxChannel { + const port = destinationPort !== undefined ? destinationPort : this.channelCount; + + this.logger.debug("Create Channel", port); + + const channel = new TeceMuxChannel({ allowHalfOpen: true }, port, this); + + channel.encoder.out + .pipe(this.carrierSocket, { end: false }); + + channel + .on("error", (error) => { + this.logger.error("CHANNEL ERROR", error); + this.emit("error", { error, source: channel }); + }) + .on("close", () => { + this.logger.info("CHANNEL close", channel._id); + this.sendFIN(channel._id); + }) + .on("finish", () => { + this.logger.info("CHANNEL finish", channel._id); + this.sendFIN(channel._id); + }); + + return channel; + } + + constructor(socket: Socket, id = "") { + super(); + this.id = id; + this.logger = new ObjLogger(this, { id: this.id }); + this.carrierSocket = socket; + + this.carrierDecoder = new FrameDecoder({ emitClose: false }) + .on("error", (error) => { + this.logger.error("Decoder error", error); + }); + + this.carrierDecoder.logger.updateBaseLog({ id: this.id }); + this.carrierDecoder.logger.pipe(this.logger); + + this.carrierSocket.pipe(this.carrierDecoder, { end: false }); + + this.framesKeeper.logger.pipe(this.logger); + + this.main().catch((error) => { + this.emit("error", error); + }); + } + + async main() { + for await (const chunk of this.carrierDecoder) { + if (await this.handleDecodedFrame(chunk)) break; + } + } + + async handleDecodedFrame(chunk: any) { + let frame: FrameData; + + try { + frame = JSON.parse(chunk); + } catch (err) { + this.logger.error("error Parsing data from decoder", err, chunk, chunk.length, chunk.toString()); + this.emit("error", { chunk }); + return 1; + } + + const { flags, sequenceNumber, dataLength, destinationPort, acknowledgeNumber, error } = frame; + + if (error) { + this.emit("error", { frame, chunk }); + return 2; + } + + let channel = this.channels.get(destinationPort); + + if (flags.ACK && flags.SYN) { + channel?.encoder.pause(); + this.framesKeeper.handleACK(acknowledgeNumber); + //console.log("Pause channel command received", channel?._id); + return 0; + } + + if (flags.ACK) { + if (channel?.encoder.isPaused()) { + //console.log("Pause and receive ack", channel._id); + } + this.logger.trace("Received ACK flag for sequenceNumber", acknowledgeNumber); + this.framesKeeper.handleACK(acknowledgeNumber); + channel?.encoder.resume(); + channel?.resume(); + + return 0; + } + + if (flags.FIN) { + this.logger.trace(`Received FIN flag [C: ${destinationPort}]`, dataLength, frame.chunk, !!channel, channel?._id); + + if (channel) { + channel.handlerFIN(); + channel.sendACK(sequenceNumber); + } else { + this.logger.error("FIN for unknown channel"); + } + + return 0; + } + + if (flags.PSH) { + this.logger.trace(`Received PSH command [C: ${destinationPort}, SIZE: ${dataLength}]`); + + if (!channel) { + this.logger.warn("Unknown channel"); + channel = this.createChannel(destinationPort); + + this.addChannel(channel, true); + } + + if (dataLength) { + this.logger.warn("writing to channel [channel, length]", channel._id, dataLength); + this.logger.warn("writing to channel [flowing, isPaused]", channel.readableFlowing, channel.isPaused()); + + const canWrite = channel.push(new Uint8Array((frame.chunk as any).data), undefined); + + if (!canWrite) { + //console.log("cant write", channel._id); + channel.sendPauseACK(sequenceNumber); + + channel.once("resume", () => { + //console.log("resumed, send ack to resume"); + //channel?.encoder.resume(); + channel?.sendACK(sequenceNumber); + }); + channel.once("drain", () => { + //console.log("drained, send ack to resume"); + //channel?.encoder.resume(); + channel?.sendACK(sequenceNumber); + }); + return 0; + } + } + + channel.sendACK(sequenceNumber); + } + + return 0; + } + + sendACK(sequenceNumber: number, channelId: number) { + this.logger.debug("Write acknowledge frame for sequenceNumber", sequenceNumber); + const channel = this.channels.get(channelId); + + channel?.encoder.push( + channel.encoder.createFrame(undefined, { + flagsArray: ["ACK"], + acknowledgeNumber: sequenceNumber, + destinationPort: channelId + }) + ); + } + + addChannel(channel: TeceMuxChannel, emit: boolean) { + this.logger.debug("adding channel", channel._id); + this.channels.set(channel._id, channel); + + if (emit) { + this.emit("channel", channel); + this.logger.debug("channel event emitted", channel._id); + } + + this.channelCount++; + } + + sendFIN(channelId: number) { + this.logger.debug("Write FIN frame for channel", channelId); + + const channel = this.channels.get(channelId)!; + + channel.encoder.push( + channel.encoder.createFrame(undefined, { + flagsArray: ["FIN"], + destinationPort: channelId + }) + ); + } + + multiplex(opts: { channel?: number } = {}): TeceMuxChannel { + const id = opts.channel !== undefined ? opts.channel : this.channelCount; + const channel = this.createChannel(id); + + this.logger.trace("Multiplex", id); + + this.addChannel(channel, true); + + channel.encoder.establishChannel(id).then(() => { + this.logger.debug("Channel established", id); + }, (err) => { + this.logger.error("Channel establish error", err); + }); + + this.logger.trace("Multiplex ready", channel._id); + return channel; + } +} + +export { TeceMuxChannel }; diff --git a/packages/tecemux/src/types.ts b/packages/tecemux/src/types.ts new file mode 100644 index 000000000..43321ec75 --- /dev/null +++ b/packages/tecemux/src/types.ts @@ -0,0 +1,78 @@ +import { Duplex, Readable, Transform } from "stream"; + +export type TeceMuxEvents = { + channel(socket: Duplex): void; + error(error: any): void; + peer(payload: { channelId: number }): void; +} + +export type FramesKeeperEvents = { + ack: (acknowledgeNumber: number) => void; +} + +export type BinaryFlags = "FIN" | "SYN" | "RST" | "PSH" | "ACK" | "URG" | "ECE" | "CWR"; + +export type flagsObjectType = Partial<{ + FIN: boolean, + SYN: boolean, + RST: boolean, + PSH: boolean, + ACK: boolean, + URG: boolean, + ECE: boolean, + CWR: boolean +}> + +export type FramesKeeperFrame = { + buffer: Buffer; + received: boolean; + sequenceNumber: number; + destinationPort: number; + flags: any +}; + +export interface IFramesKeeper { + handleACK(acknowledgeNumber: number): void; + isReceived(sequenceNumber: number): boolean; + handlePSH(sequenceNumber: number): void; + getFrame(sequenceNumber: number): FramesKeeperFrame | undefined; + generator: AsyncGenerator; + on(event: string, handler: (sequenceNumber: number) => void): void; + off(event: string, handler: (sequenceNumber: number) => void): void; +} + +export interface ITeCeMux { + sequenceNumber: number; + framesSent: number; + framesKeeper: IFramesKeeper; +} + +export interface IFrameEncoder extends Transform { + establishChannel(id: number): Promise; + createFrame(chunk: any, frame: Partial): Buffer; + out: Readable; +} + +export type TeceMuxChannel = Duplex & { + _id: number; + encoder: IFrameEncoder; + closedByFIN: boolean; + sendACK(sequenceNumber: number): void; + handlerFIN(): void; +}; + +export type FrameData = { + sourceAddress: [number, number, number, number]; + destinationAddress: [number, number, number, number]; + destinationPort: number; + sequenceNumber: number; + acknowledgeNumber: number; + chunk: Buffer; + dataLength: number; + chunkLength: number; + stringified: string; + flags: flagsObjectType; + flagsArray: BinaryFlags[]; + error?: "checksum"; + received: boolean; +}; diff --git a/packages/tecemux/src/utils/index.ts b/packages/tecemux/src/utils/index.ts new file mode 100644 index 000000000..86fa4a9cf --- /dev/null +++ b/packages/tecemux/src/utils/index.ts @@ -0,0 +1,11 @@ +import { frameFlags } from "../constants"; +import { flagsObjectType } from "../types"; + +export function toHex(chunk: Buffer) { + return chunk.toString("hex").match(/../g)?.join(" "); +} + +export const parseFlags = (byte: number): flagsObjectType => { + return frameFlags.filter((_flag, index) => byte >>> index & 1) + .reduce((p, c) => ({ ...p, [c]: true }), {}); +}; diff --git a/packages/tecemux/test/cert/cleanup-localhost-cert.sh b/packages/tecemux/test/cert/cleanup-localhost-cert.sh new file mode 100755 index 000000000..ca6e7a044 --- /dev/null +++ b/packages/tecemux/test/cert/cleanup-localhost-cert.sh @@ -0,0 +1,2 @@ +#!/bin/bash +rm {localhost,myCA}.* \ No newline at end of file diff --git a/packages/tecemux/test/cert/gen-localhost-cert.sh b/packages/tecemux/test/cert/gen-localhost-cert.sh new file mode 100755 index 000000000..b66eb005f --- /dev/null +++ b/packages/tecemux/test/cert/gen-localhost-cert.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Private key for root CA +openssl genrsa -des3 -out myCA.key -passout pass:test 2048 + +# root CA +openssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem -passin pass:test -subj '/CN=www.mydom.com/O=My Company Name LTD./C=US' + +# key for cert +openssl genrsa -out localhost.key 2048 + +# cert +openssl req -new -key localhost.key -out localhost.csr -subj '/CN=localhost/O=My Company Name LTD./C=US' + +>localhost.ext cat <<-EOF +authorityKeyIdentifier = keyid,issuer +basicConstraints = CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment +subjectAltName = @alt_names + +[alt_names] +DNS.1 = localhost +IP.1 = 127.0.0.1 +EOF + +# sign cert +openssl x509 -req -in localhost.csr -CA myCA.pem -CAkey myCA.key -passin pass:test -CAcreateserial -out localhost.crt -days 825 -sha256 -extfile localhost.ext + diff --git a/packages/tecemux/test/playgrounds/playground-tecemux.ts b/packages/tecemux/test/playgrounds/playground-tecemux.ts new file mode 100644 index 000000000..95cbced9f --- /dev/null +++ b/packages/tecemux/test/playgrounds/playground-tecemux.ts @@ -0,0 +1,144 @@ +/*eslint no-unused-vars: ["error", { "args": "none" }]*/ +/* eslint-disable @typescript-eslint/no-floating-promises */ +/* eslint-disable no-console */ + +import { ObjLogger } from "@scramjet/obj-logger"; +import { IncomingMessage, createServer } from "http"; + +import { Socket, createConnection } from "net"; +import { TeceMux } from "../.."; +import { TeceMuxChannel } from "../../src/types"; +import { createReadStream, createWriteStream } from "fs"; +import path from "path"; + +(async () => { + const logger = new ObjLogger("Sandbox"); + + logger.pipe(process.stdout); + + /**********************************************/ + /* SERVER + /**********************************************/ + + const PORT = 6660; + const server = createServer({}); + + server.on("timeout", (_socket) => { + logger.warn("Server on timeout"); + }); + server.requestTimeout = 0; + + server.on("connect", async (req: IncomingMessage, socket: Socket) => { + socket.setNoDelay(true); + + logger.info("Incoming request", req.method, req.headers); + + socket + .on("pipe", () => { + logger.info("Carrier Socket piped"); + }) + .on("unpipe", (c: any) => { + logger.info("Carrier Socket unpiped", c); + }) + .on("pause", () => { + logger.fatal("Carrier Socket paused"); + }) + .on("resume", () => { + logger.info("Carrier Socket resumed"); + }) + .on("error", (error) => { + logger.error("Carrier Socket error", error); + }) + .on("close", () => { + logger.info("Carrier Socket closed"); + }) + .on("timeout", () => { + logger.info("Carrier Socket timeout"); + }); + + const tcmux = new TeceMux(socket, "Server") + .on("error", (err) => { + logger.error("TCMUX err", err); + }); + + tcmux.logger.pipe(logger); + + const channel1 = tcmux.multiplex(); + + channel1.pipe(createWriteStream(path.join(__dirname, "output-server.tar.gz"))); + + createReadStream(path.join(__dirname, "../../../forever.tar.gz")) + .on("end", () => { + logger.info("FILE END"); + }) + .pipe(channel1); + }); + + server.listen(PORT, "0.0.0.0"); + + /**********************************************/ + /* CLIENT + /**********************************************/ + + const socket = createConnection({ port: PORT, allowHalfOpen: true, host: "0.0.0.0" }, () => {}); + + await new Promise((resolve, reject) => { + socket + .on("connect", resolve) + .on("error", reject); + }); + + socket.setNoDelay(true); + + const reqLogger = new ObjLogger("Req", { id: "Client" }); + + reqLogger.pipe(logger); + + socket.write("CONNECT HTTP/1.1\r\n\r\n\r\n"); + + socket.on("error", (error) => { + reqLogger.error("ERROR", error); + }); + + reqLogger.info("connected to server!"); + + const tcmux = new TeceMux(socket, "Request"); + + tcmux.logger.updateBaseLog({ id: reqLogger.baseLog.id }); + + tcmux.logger.pipe(logger); + + tcmux.on("channel", async (channel: TeceMuxChannel) => { + reqLogger.debug("New channel", channel._id); + + let total = 0; + + channel + .on("finish", () => { + tcmux.logger.info("Channel finish", channel._id); + }) + .on("end", () => { + tcmux.logger.info("Channel readable end [id, readableEnded, writableEnded]", channel._id, channel.readableEnded, channel.writableEnded); + }) + .on("data", (d) => { + total += d.length; + tcmux.logger.info("-------------------- data", channel._id, d.length, total); + }) + .on("pause", () => { + tcmux.logger.info("-------------------- paused", channel._id); + }) + .on("resume", () => { + tcmux.logger.info("-------------------- resumed", channel._id); + }) + .pause(); + + createReadStream(path.join(__dirname, "../../../forever.tar.gz")).pipe(channel); + channel.pipe(createWriteStream(path.join(__dirname, "output-client.tar.gz"))); + }); + + socket.on("error", (err) => { + console.error(err); + }); + + await new Promise((_res, _rej) => {}); +})(); diff --git a/packages/tecemux/test/playgrounds/start-test-server.ts b/packages/tecemux/test/playgrounds/start-test-server.ts new file mode 100644 index 000000000..65b8e5e1b --- /dev/null +++ b/packages/tecemux/test/playgrounds/start-test-server.ts @@ -0,0 +1,86 @@ +#!/usr/bin/env ts-node +/* eslint-disable no-console */ + +import net, { Socket, createConnection } from "net"; + +import { TeceMux, TeceMuxChannel } from "../../src"; +import { Agent, createServer, request } from "http"; + +const httpServer = createServer((req, res) => { + console.log("Headers", req.headers); + + res.writeHead(200); + res.write("OK"); + res.end(); +}); + +const connectServer = net.createServer() + .on("connection", async (conn: net.Socket) => { + conn.setNoDelay(true); + conn.on("error", (err) => { + console.error("Error on connection from runner", err); + }); + + const protocol = new TeceMux(conn); + + protocol.on("channel", async (channel: TeceMuxChannel) => { + httpServer.emit("connection", channel); + }); + }) + .listen(9000, "0.0.0.0", () => { + console.log("SocketServer on", connectServer.address()); + }) + .on("error", (error) => { console.error(error); }); + +const connectionSocket = createConnection({ + host: "0.0.0.0", + port: 9000 +}); + +const multiplexer = new TeceMux(connectionSocket); + +class CustomAgent extends Agent { + createConnection = () => { + try { + const socket = multiplexer.multiplex() as unknown as Socket; + + socket.on("error", () => { + console.error("Muxed stream error"); + }); + + socket.setKeepAlive ||= (_enable?: boolean, _initialDelay?: number | undefined) => socket; + socket.unref ||= () => socket; + socket.setTimeout ||= (_timeout: number, _callback?: () => void) => socket; + + console.log("Creating muxed channel in verser connection"); + + return socket; + } catch (error) { + const ret = new Socket(); + + setImmediate(() => ret.emit("error", error)); + return ret; + } + }; +} + +request({ + method: "get", + host: "scramjet", + port: "9999", + agent: new CustomAgent(), + path: "/get" +}).on("response", (response) => { + response.on("data", (d) => { console.log("1 Req response", d.toString()); }); +}).flushHeaders(); + +request({ + method: "post", + host: "scramjet", + port: "9999", + agent: new CustomAgent(), + path: "/get" +}).on("response", (response) => { + response.on("data", (d) => { console.log("2 Req response", d.toString()); }); +}).flushHeaders(); + diff --git a/packages/tecemux/test/tecemux-transfer.spec.ts b/packages/tecemux/test/tecemux-transfer.spec.ts new file mode 100644 index 000000000..35b129b7e --- /dev/null +++ b/packages/tecemux/test/tecemux-transfer.spec.ts @@ -0,0 +1,86 @@ +/* eslint-disable no-console */ +import test from "ava"; +import { IncomingMessage, Server, createServer } from "http"; +import { TeceMux, TeceMuxChannel } from "../src/tecemux"; +import * as crypto from "crypto"; +import { Socket, createConnection } from "net"; +import { Readable } from "stream"; + +let serverTeceMux: TeceMux; + +const PORT = 6660; + +async function startServer() { + const server = createServer({}); + + return new Promise((resolve) => { + server.listen(PORT, () => { resolve(server); }); + }); +} + +test.serial("Protocol send file over http connection", async (t) => { + const server = await startServer(); + + const hashReceived = crypto.createHash("md5"); + const hashSent = crypto.createHash("md5"); + + const serverSideChannelPromise = new Promise((resolve) => { + server.on("connect", async (req: IncomingMessage, socket: Socket) => { + console.log("server on connect!"); + socket.setNoDelay(true); + + serverTeceMux = new TeceMux(socket, "Server") + .on("error", (error) => { + console.error("TeceMux error", error.code); + }); + + resolve(serverTeceMux.multiplex({ channel: 1 })); + }); + }); + + const socket = createConnection({ port: PORT, allowHalfOpen: true, host: "0.0.0.0" }, () => {}); + + await new Promise((resolve, reject) => { + socket + .on("connect", resolve) + .on("error", reject); + }); + + socket.write("CONNECT HTTP/1.1\r\n\r\n\r\n"); + + const clientTeceMux = new TeceMux(socket, "Request"); + + await new Promise(resolve => { + clientTeceMux.on("channel", async (clientSideChannel: TeceMuxChannel) => { + console.log("TEST: on channel", clientSideChannel._id); + function* gen() { + for (let i = 0; i < 1e3; i++) { + const str = crypto.randomBytes(1024).toString("hex"); + + hashSent.update(str); + yield str; + } + } + + Readable.from(gen()).pipe(clientSideChannel); + resolve(clientSideChannel); + }); + }); + + const serverSideChannel = await serverSideChannelPromise; + + console.log("Serverside channel", serverSideChannel._id); + + for await (const d of serverSideChannel) { + hashReceived.update(d); + } + + const res = { + txHash: hashSent.digest("hex"), + rxHash: hashReceived.digest("hex") + }; + + console.dir(res); + + t.assert(res.txHash === res.rxHash, "Unequal hashes"); +}); diff --git a/packages/tecemux/tsconfig.build.json b/packages/tecemux/tsconfig.build.json new file mode 100644 index 000000000..e0848624e --- /dev/null +++ b/packages/tecemux/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "src/**/*" + ] +} diff --git a/packages/tecemux/tsconfig.json b/packages/tecemux/tsconfig.json new file mode 100644 index 000000000..2891ea005 --- /dev/null +++ b/packages/tecemux/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "outDir": "./dist" + }, + "extends": "../../tsconfig.base.json", + "include": [ + "./src/**/*.ts", + "./test" + ], + "exclude": [ + "node_modules" + ], + "typedocOptions": { + "entryPoints": [ + "src/index.ts" + ], + "out": "../../docs/tecemux", + "plugin": "typedoc-plugin-markdown", + "excludePrivate": "true", + "gitRevision": "HEAD", + "sort": "alphabetical" + } +} diff --git a/packages/types/src/sth-configuration.ts b/packages/types/src/sth-configuration.ts index ad2397afb..e0670336e 100644 --- a/packages/types/src/sth-configuration.ts +++ b/packages/types/src/sth-configuration.ts @@ -158,7 +158,7 @@ export type STHConfiguration = { apiVersion: string; api: string; space: string; - hostType: "hub" | "federation" + hostType: "hub" | "federation"; }; /** diff --git a/packages/verser/package.json b/packages/verser/package.json index af8e28475..5ffdae054 100644 --- a/packages/verser/package.json +++ b/packages/verser/package.json @@ -16,7 +16,7 @@ "dependencies": { "@scramjet/obj-logger": "^0.38.0", "@scramjet/utility": "^0.38.0", - "bpmux": "^8.2.1" + "@scramjet/tecemux": "^0.38.0" }, "devDependencies": { "@scramjet/api-server": "^0.38.0", diff --git a/packages/verser/src/lib/verser-client.ts b/packages/verser/src/lib/verser-client.ts index 568007edd..226b1997b 100644 --- a/packages/verser/src/lib/verser-client.ts +++ b/packages/verser/src/lib/verser-client.ts @@ -3,13 +3,11 @@ import { Agent as HttpsAgent, request } from "https"; import { merge, TypedEmitter } from "@scramjet/utility"; import { IObjectLogger } from "@scramjet/types"; import { VerserClientOptions, VerserClientConnection, RegisteredChannels, RegisteredChannelCallback } from "../types"; -import { Duplex } from "stream"; import { createConnection, Socket } from "net"; import { ObjLogger } from "@scramjet/obj-logger"; import { defaultVerserClientOptions } from "./verser-client-default-config"; import { URL } from "url"; - -const BPMux = require("bpmux").BPMux; +import { TeceMux, TeceMuxChannel } from "@scramjet/tecemux"; type Events = { error: (err: Error) => void; @@ -25,7 +23,7 @@ export class VerserClient extends TypedEmitter { /** * BPMux instance. */ - private bpmux: any; + private teceMux: any; /** * VerserClient options. @@ -113,12 +111,11 @@ export class VerserClient extends TypedEmitter { reject(err); }); - connectRequest.once("connect", (res, socket, head) => { - this.logger.info("HEAD", head.toString()); + connectRequest.on("connect", (response, socket) => { this.socket = socket; this.mux(); - resolve({ res, socket }); + resolve({ response, socket }); }); connectRequest.flushHeaders(); @@ -132,14 +129,14 @@ export class VerserClient extends TypedEmitter { * otherwise stream will be passed to the server. */ private mux() { - this.bpmux = new BPMux(this.socket) - .on("peer_multiplex", async (mSocket: Duplex & { _chan: number }) => { - const registeredChannelCallback = this.registeredChannels.get(mSocket._chan); + this.teceMux = new TeceMux(this.socket!, "client") + .on("channel", async (channel: TeceMuxChannel) => { + const registeredChannelCallback = this.registeredChannels.get(channel._id); if (registeredChannelCallback) { - await registeredChannelCallback(mSocket); + await registeredChannelCallback(channel); } else { - this.opts.server?.emit("connection", mSocket); + this.opts.server?.emit("connection", channel); } }) .on("error", (err: Error) => { @@ -152,7 +149,7 @@ export class VerserClient extends TypedEmitter { this._verserAgent.createConnection = () => { try { - const socket = this.bpmux!.multiplex() as Socket; + const socket = this.teceMux!.multiplex() as Socket; socket.on("error", () => { this.logger.error("Muxed stream error"); diff --git a/packages/verser/src/lib/verser-connection.ts b/packages/verser/src/lib/verser-connection.ts index 36e285ad2..3d173b58d 100644 --- a/packages/verser/src/lib/verser-connection.ts +++ b/packages/verser/src/lib/verser-connection.ts @@ -10,8 +10,7 @@ import { import { ObjLogger } from "@scramjet/obj-logger"; import { createConnection, Socket } from "net"; import { VerserRequestResult } from "../types"; - -const BPMux = require("bpmux").BPMux; +import { TeceMux } from "@scramjet/tecemux"; /** * VerserConnection class. @@ -22,21 +21,21 @@ export class VerserConnection { logger = new ObjLogger(this); private request: IncomingMessage; - private bpmux?: { [key: string]: any }; + private teceMux?: TeceMux; - private _socket: Duplex; + private _socket: Socket; private agent?: Agent & { createConnection: typeof createConnection }; private channelListeners: ((socket: Duplex, data?: any) => any)[] = []; get connected() { - return !(this._socket.destroyed && this.bpmux); + return !(this._socket.destroyed && this.teceMux); } - get socket(): Duplex { + get socket(): Socket { return this._socket; } - constructor(request: IncomingMessage, socket: Duplex) { + constructor(request: IncomingMessage, socket: Socket) { this.request = request; this._socket = socket; @@ -101,9 +100,9 @@ export class VerserConnection { * @param res {ServerResponse} Response object. */ async forward(req: IncomingMessage, res: ServerResponse) { - if (!this.connected) throw new Error("BPMux not connected"); + if (!this.connected) throw new Error("Not connected"); - const channel = this.bpmux?.multiplex() as Duplex; + const channel = await this.teceMux?.multiplex() as Duplex; channel .on("error", (error: Error) => { @@ -200,23 +199,24 @@ export class VerserConnection { * @param id {number} Channel id. * @returns Duplex stream. */ - createChannel(id: number): Duplex { - if (!this.bpmux) throw new Error("BPMux not connected"); + createChannel(id: number) { + if (!this.teceMux) throw new Error("TeCeMux not connected"); - return this.bpmux.multiplex({ channel: id }); + return this.teceMux.multiplex({ channel: id }); } reconnect() { this.logger.debug("Reconnecting..."); - this.bpmux = this.bpmux = new BPMux(this.socket).on("error", (error: Error) => { - this.logger.error("BPMux Error", error.message); + this.teceMux = new TeceMux(this.socket, "client").on("error", (error: Error) => { + this.logger.error("TeCeMux Error", error.message); // TODO: Error handling? }); this.agent = new Agent() as Agent & { createConnection: typeof createConnection }; // lack of types? + this.agent.createConnection = () => { try { - const socket = this.bpmux!.multiplex() as Socket; + const socket = this.teceMux!.multiplex() as unknown as Socket; socket.on("error", () => { this.logger.error("Muxed stream error"); @@ -228,8 +228,10 @@ export class VerserConnection { socket.setTimeout ||= (_timeout: number, _callback?: () => void) => socket; this.logger.debug("Created new muxed stream"); + return socket; } catch (e) { + this.logger.error("Create connection error", e); const ret = new Socket(); setImmediate(() => ret.emit("error", e)); @@ -237,9 +239,9 @@ export class VerserConnection { } }; - this.bpmux!.on("peer_multiplex", (socket: Duplex, data: any) => { + this.teceMux!.on("channel", (socket: Duplex) => { this.channelListeners.forEach((listener) => { - listener(socket, data); + listener(socket); }); }); } diff --git a/packages/verser/src/lib/verser.ts b/packages/verser/src/lib/verser.ts index bf694d137..322dff97f 100644 --- a/packages/verser/src/lib/verser.ts +++ b/packages/verser/src/lib/verser.ts @@ -24,11 +24,15 @@ export class Verser extends TypedEmitter { super(); this.server = server; + this.server.timeout = 0; + this.server.on("connect", (req, socket: Socket) => { this.logger.info("New connection:", req.url); const connection = new VerserConnection(req, socket); + connection.logger.pipe(this.logger); + this.connections.push(connection); this.logger.info("Total connections:", this.connections.length); diff --git a/packages/verser/src/types/index.ts b/packages/verser/src/types/index.ts index d6d8c195f..9c9ecb1c9 100644 --- a/packages/verser/src/types/index.ts +++ b/packages/verser/src/types/index.ts @@ -40,7 +40,7 @@ export type VerserClientConnection = { /** * Connection request object. */ - res: IncomingMessage; + response: IncomingMessage; }; export type VerserRequestResult = { incomingMessage: IncomingMessage; clientRequest: ClientRequest } diff --git a/packages/verser/test/http-connection.spec.ts b/packages/verser/test/http-connection.spec.ts index ba90dc211..c0c4b0a71 100644 --- a/packages/verser/test/http-connection.spec.ts +++ b/packages/verser/test/http-connection.spec.ts @@ -45,7 +45,7 @@ function getJSONResponseFromRequest(request: http.ClientRequest): Promise { test("Connect VerserClient A to Verser B and send HTTP GET Request to VerserClient A", async (t) => { const SERVER_B_PORT = 1999; - const apiB = createServer(); + const apiB = createServer({ }); apiB.server.listen(SERVER_B_PORT); @@ -56,7 +56,7 @@ test("Connect VerserClient A to Verser B and send HTTP GET Request to VerserClie const verserClientA = new VerserClient({ headers: { city: "Valencia" }, - verserUrl: `http://127.0.0.1:${SERVER_B_PORT}`, + verserUrl: `http://0.0.0.0:${SERVER_B_PORT}`, server: apiA.server }); @@ -123,7 +123,7 @@ test("Connect VerserClient A to Verser B over SSL and send HTTPS GET Request to ca: [readFileSync(path.join(certDir, "myCA.pem"))] }); - requestToAThroughB.end(); + requestToAThroughB.flushHeaders(); const responseFromAToB = await getJSONResponseFromRequest(requestToAThroughB); @@ -132,3 +132,4 @@ test("Connect VerserClient A to Verser B over SSL and send HTTPS GET Request to spawnSync("./cleanup-localhost-cert.sh", { cwd: certDir }); }); + diff --git a/packages/verser/tsconfig.json b/packages/verser/tsconfig.json index 6027e8072..55c8006d1 100644 --- a/packages/verser/tsconfig.json +++ b/packages/verser/tsconfig.json @@ -5,7 +5,7 @@ "extends": "../../tsconfig.base.json", "include": [ "./src/**/*.ts", - "./test/**/*.ts", + "./test/**/*.ts", "src/types" ], "exclude": [ diff --git a/yarn.lock b/yarn.lock index cb3a5a8d1..255566256 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,15 +2,6 @@ # yarn lockfile v1 -"0http@^3.4.1": - version "3.4.2" - resolved "https://registry.npmjs.org/0http/-/0http-3.4.2.tgz" - integrity sha512-zDbvsof0hqUdtHjcXE8pCzAmBGhNjwhypDfMKQf4sJz9QB9CMphgQzo/te2bGz7GjEuqiwXss7z7DJMt7IQo3Q== - dependencies: - lru-cache "^7.14.1" - regexparam "^2.0.1" - trouter "^3.2.0" - "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" @@ -37,7 +28,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz" integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.7.5": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": version "7.20.12" resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== @@ -357,7 +348,7 @@ dependencies: regexp-match-indices "1.0.2" -"@cucumber/cucumber@^7.3.2": +"@cucumber/cucumber@^7.3.2", "@cucumber/cucumber@>=7.0.0": version "7.3.2" resolved "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-7.3.2.tgz" integrity sha512-qqptM9w+UqXEYBAkrIGpIVPXDWv+zp0LrS89LiwHZwBp0cJg00su/iPMZ4j8TvCJiKfAwJXsAI1yjrd1POtU+w== @@ -431,7 +422,27 @@ dependencies: "@cucumber/messages" "^16.0.1" -"@cucumber/messages@^16.0.0", "@cucumber/messages@^16.0.1": +"@cucumber/messages@*": + version "21.0.1" + resolved "https://registry.npmjs.org/@cucumber/messages/-/messages-21.0.1.tgz" + integrity sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g== + dependencies: + "@types/uuid" "8.3.4" + class-transformer "0.5.1" + reflect-metadata "0.1.13" + uuid "9.0.0" + +"@cucumber/messages@^16.0.0": + version "16.0.1" + resolved "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz" + integrity sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ== + dependencies: + "@types/uuid" "8.3.0" + class-transformer "0.4.0" + reflect-metadata "0.1.13" + uuid "8.3.2" + +"@cucumber/messages@^16.0.1": version "16.0.1" resolved "https://registry.npmjs.org/@cucumber/messages/-/messages-16.0.1.tgz" integrity sha512-80JcaAfQragFqR1rMhRwiqWL9HcR6Z4LDD2mfF0Lxg/lFkCNvmWa9Jl10NUNfFXYD555NKPzP/8xFo55abw8TQ== @@ -465,11 +476,6 @@ enabled "2.0.x" kuler "^2.0.0" -"@esbuild/linux-loong64@0.14.54": - version "0.14.54" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" - integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -734,7 +740,7 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.6.1": +"@jest/types@^29.0.0", "@jest/types@^29.6.1": version "29.6.1" resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== @@ -778,14 +784,6 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": version "0.3.19" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" @@ -794,6 +792,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@kubernetes/client-node@^0.17.1": version "0.17.1" resolved "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.17.1.tgz" @@ -816,46 +822,6 @@ optionalDependencies: openid-client "^5.1.6" -"@napi-rs/snappy-android-arm-eabi@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-android-arm-eabi/-/snappy-android-arm-eabi-7.1.1.tgz#9e514082e9588da9cf569a9eece3336ba858d903" - integrity sha512-NKd/ztuVEgQaAaNVQ5zZaCB9VV+7+uBXBHqhaE5iSapQhLc41szTlT0s68FCee75OoT3vhqdA6Jp5TrzZ2WOaw== - -"@napi-rs/snappy-android-arm64@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-android-arm64/-/snappy-android-arm64-7.1.1.tgz#ec9b7b70bd8b3a589511cd0cd903a4acf339747d" - integrity sha512-DktruMAO0K0toTnxNHg2GWNIAPJqdvIchCsdsRaKyuEnG101qBg0mYiRCAhxHgbT6RJlOGbUPKkbA9KKRhEJUg== - -"@napi-rs/snappy-darwin-arm64@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-darwin-arm64/-/snappy-darwin-arm64-7.1.1.tgz#4b0a95783cea97daef80057d2e060b311dc376a5" - integrity sha512-3LZyoAw3Qa5F7sCCTkSkhmGlydwUKU6L3Jl46eKHO2Ctm8Gcjxww6T7MfwlwGZ6JqAM6d1d++WLzUZPCGXVmag== - -"@napi-rs/snappy-darwin-x64@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-darwin-x64/-/snappy-darwin-x64-7.1.1.tgz#d9eb124c6169fdbc3a8389c88f1962a4dad728ff" - integrity sha512-X1D2F67bQkPwr5iSR29/RnOrLwAkB55YO6t41toABzla3mflLDpzZcakz6FokIukykf7ey31/t73v/4pbgaBkg== - -"@napi-rs/snappy-freebsd-x64@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-freebsd-x64/-/snappy-freebsd-x64-7.1.1.tgz#bff06d3c5644d15da18dfaaad8fd33e198b3b7ef" - integrity sha512-vSeuf+An8jFVHPAn5IbWE9hTGU9PFAaZLj/X7rKTQQtZstnDsHgWe6u4g7FHLuOdwQ8TvhcxAEpNlYIXIk4AJg== - -"@napi-rs/snappy-linux-arm-gnueabihf@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm-gnueabihf/-/snappy-linux-arm-gnueabihf-7.1.1.tgz#f8451e9738811a62baa97661a8ef1647c34ae580" - integrity sha512-/yyN6QsnOs3D1+jI3SfRX+gtnD86rbixdfmgxv9g40+FrDaDTLAu/3VuZIqH02qqq/xiWbDnkO+42RGxXDzTCw== - -"@napi-rs/snappy-linux-arm64-gnu@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm64-gnu/-/snappy-linux-arm64-gnu-7.1.1.tgz#24fe19bc4dc3008316645ff52cd42771a501ee13" - integrity sha512-StEeUCSwUoajgrBtiCQPTkHu+0Q4QlYndghGZNdbN1zJ1ny70YzPpevaFBUyjI/eJ+FN9uICKtwTPtQNSILS5g== - -"@napi-rs/snappy-linux-arm64-musl@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-linux-arm64-musl/-/snappy-linux-arm64-musl-7.1.1.tgz#0b270227725b40be81b8e3aadcf64dd520f37bc6" - integrity sha512-jWEBRzj+lswZVYf0b5eY0fjMlBL9L9yqjmTuv2UIMjJNHPuR282LK/s3Fm9sYIXQtKkiCo5JyhmIcoghZ3v0Eg== - "@napi-rs/snappy-linux-x64-gnu@7.1.1": version "7.1.1" resolved "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-gnu/-/snappy-linux-x64-gnu-7.1.1.tgz" @@ -866,21 +832,6 @@ resolved "https://registry.npmjs.org/@napi-rs/snappy-linux-x64-musl/-/snappy-linux-x64-musl-7.1.1.tgz" integrity sha512-xR4hzFQqVq6J8Zf6XyUVtFJBaRgDyAQYUoBsCr92tZ7gI/0RlWCV6Q6JMO/wP5CSsvyFJIAtSUXXqlzIpw0GPA== -"@napi-rs/snappy-win32-arm64-msvc@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-arm64-msvc/-/snappy-win32-arm64-msvc-7.1.1.tgz#7c53b6327ca55e6a7998a1b38f11e81563ccdcfc" - integrity sha512-2mHPadctsaYtrfSV5Na8ooTdI5rflPxP1pceY4us6vbjeWrfgB+KQCuEFOHsGXqFNfsi6L9nWH8nB9swnxnSyw== - -"@napi-rs/snappy-win32-ia32-msvc@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-ia32-msvc/-/snappy-win32-ia32-msvc-7.1.1.tgz#a7b3ace9468e79fc1065309dcdbfff494eaaa6c0" - integrity sha512-FOMgs9W71hdgjyl3T9F7b/WEIuoryfgBqsyhtHjAaa/98R0BUHl0bOoHg8ka0b5GgnhLBHkX2Yd6VD+Si9Q2ww== - -"@napi-rs/snappy-win32-x64-msvc@7.1.1": - version "7.1.1" - resolved "https://registry.yarnpkg.com/@napi-rs/snappy-win32-x64-msvc/-/snappy-win32-x64-msvc-7.1.1.tgz#d30667e62057b8ec60a117722cc0662617330691" - integrity sha512-Mu3yELySvzhBcNTVCq+hYxVh+lH3/KjoQ5HIEb3DDPoX0AGRTm3XZa+usq8pFWjl91Cgp9nWK+9lVSkCCIRaKA== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -889,7 +840,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1063,7 +1014,18 @@ postcss-selector-parser "^6.0.10" semver "^7.3.7" -"@npmcli/run-script@4.2.1", "@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.2.0", "@npmcli/run-script@^4.2.1": +"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.2.0", "@npmcli/run-script@^4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz" + integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== + dependencies: + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^2.0.3" + which "^2.0.2" + +"@npmcli/run-script@4.2.1": version "4.2.1" resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz" integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== @@ -1127,6 +1089,275 @@ resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@scramjet/adapters@^0.38.0", "@scramjet/adapters@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/adapters": + version "0.38.0" + resolved "file:packages/adapters" + dependencies: + "@kubernetes/client-node" "^0.17.1" + "@scramjet/model" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/pre-runner" "^0.38.0" + "@scramjet/python-runner" "^0.38.0" + "@scramjet/runner" "^0.38.0" + "@scramjet/sth-config" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + "@scramjet/utility" "^0.38.0" + dockerode "^3.3.4" + scramjet "^4.36.9" + shell-escape "^0.2.0" + ts.data.json "^2.2.0" + +"@scramjet/api-client@^0.38.0", "@scramjet/api-client@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/api-client": + version "0.38.0" + resolved "file:packages/api-client" + dependencies: + "@scramjet/client-utils" "^0.38.0" + "@scramjet/sth-config" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + n-readlines "^1.0.1" + scramjet "^4.36.9" + +"@scramjet/api-server@^0.38.0", "@scramjet/api-server@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/api-server": + version "0.38.0" + resolved "file:packages/api-server" + dependencies: + "@scramjet/model" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + "@scramjet/utility" "^0.38.0" + "0http" "^3.4.1" + http-status-codes "^2.2.0" + scramjet "^4.36.9" + +"@scramjet/cli@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/cli": + version "0.38.0" + resolved "file:packages/cli" + dependencies: + "@scramjet/api-client" "^0.38.0" + "@scramjet/client-utils" "^0.38.0" + "@scramjet/middleware-api-client" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/utility" "^0.38.0" + chalk "^4.1.2" + commander "^9.5.0" + find-package-json "^1.2.0" + minimatch "^3.1.2" + scramjet "^4.36.9" + tar "^6.1.11" + validator "^13.7.0" + +"@scramjet/client-utils@^0.38.0", "@scramjet/client-utils@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/client-utils": + version "0.38.0" + resolved "file:packages/client-utils" + dependencies: + "@scramjet/model" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/sth-config" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + "@scramjet/utility" "^0.38.0" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + n-readlines "^1.0.1" + node-fetch "^2.6.7" + normalize-url "4" + scramjet "^4.36.9" + +"@scramjet/host@^0.38.0", "@scramjet/host@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/host": + version "0.38.0" + resolved "file:packages/host" + dependencies: + "@scramjet/adapters" "^0.38.0" + "@scramjet/api-server" "^0.38.0" + "@scramjet/load-check" "^0.38.0" + "@scramjet/model" "^0.38.0" + "@scramjet/module-loader" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/sth-config" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + "@scramjet/telemetry" "^0.38.0" + "@scramjet/utility" "^0.38.0" + "@scramjet/verser" "^0.38.0" + bpmux "^8.2.1" + ext-ip "^0.3.9" + find-package-json "^1.2.0" + http-status-codes "^2.2.0" + minimist "^1.2.6" + pico-s3 "^2.0.0" + rereadable-stream "^1.4.14" + scramjet "^4.36.9" + +"@scramjet/load-check@^0.38.0", "@scramjet/load-check@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/load-check": + version "0.38.0" + resolved "file:packages/load-check" + dependencies: + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/utility" "^0.38.0" + diskusage-ng "1.0.2" + node-os-utils "1.3.7" + scramjet "^4.36.9" + uuid "^8.3.2" + +"@scramjet/logger@^0.38.0", "@scramjet/logger@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/logger": + version "0.38.0" + resolved "file:packages/logger" + dependencies: + scramjet "^4.36.9" + +"@scramjet/manager-api-client@^0.38.0", "@scramjet/manager-api-client@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/manager-api-client": + version "0.38.0" + resolved "file:packages/manager-api-client" + dependencies: + "@scramjet/api-client" "^0.38.0" + "@scramjet/client-utils" "^0.38.0" + +"@scramjet/middleware-api-client@^0.38.0", "@scramjet/middleware-api-client@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/middleware-api-client": + version "0.38.0" + resolved "file:packages/middleware-api-client" + dependencies: + "@scramjet/api-client" "^0.38.0" + "@scramjet/client-utils" "^0.38.0" + "@scramjet/manager-api-client" "^0.38.0" + "@scramjet/multi-manager-api-client" "^0.38.0" + +"@scramjet/model@^0.38.0", "@scramjet/model@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/model": + version "0.38.0" + resolved "file:packages/model" + dependencies: + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + scramjet "^4.36.9" + uuid "^8.3.2" + +"@scramjet/module-loader@^0.38.0", "@scramjet/module-loader@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/module-loader": + version "0.38.0" + resolved "file:packages/module-loader" + dependencies: + "@scramjet/obj-logger" "^0.38.0" + +"@scramjet/monitoring-server@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/monitoring-server": + version "0.38.0" + resolved "file:packages/monitoring-server" + dependencies: + "@scramjet/utility" "^0.38.0" + +"@scramjet/multi-manager-api-client@^0.38.0", "@scramjet/multi-manager-api-client@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/multi-manager-api-client": + version "0.38.0" + resolved "file:packages/multi-manager-api-client" + dependencies: + "@scramjet/api-client" "^0.38.0" + "@scramjet/client-utils" "^0.38.0" + "@scramjet/manager-api-client" "^0.38.0" + +"@scramjet/obj-logger@^0.36.1": + version "0.36.1" + resolved "https://registry.npmjs.org/@scramjet/obj-logger/-/obj-logger-0.36.1.tgz" + integrity sha512-3yDell8/QKf+W4lGCgm74tf+bNS/S0U0//xO/7FyZbiE69ajJhd3f9C70Q2Xf9xYBMyhpJuK+vTteGAJiJCtdQ== + dependencies: + "@scramjet/utility" "^0.36.1" + scramjet "^4.36.9" + +"@scramjet/obj-logger@^0.38.0", "@scramjet/obj-logger@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/obj-logger": + version "0.38.0" + resolved "file:packages/obj-logger" + dependencies: + "@scramjet/utility" "^0.38.0" + scramjet "^4.36.9" + +"@scramjet/pre-runner@^0.38.0", "@scramjet/pre-runner@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/pre-runner": + version "0.38.0" + resolved "file:packages/pre-runner" + +"@scramjet/python-runner@^0.38.0", "@scramjet/python-runner@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/python-runner": + version "0.38.0" + resolved "file:packages/python-runner" + +"@scramjet/runner@^0.38.0", "@scramjet/runner@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/runner": + version "0.38.0" + resolved "file:packages/runner" + dependencies: + "@scramjet/api-client" "^0.38.0" + "@scramjet/client-utils" "^0.38.0" + "@scramjet/manager-api-client" "^0.38.0" + "@scramjet/model" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/symbols" "^0.38.0" + "@scramjet/tecemux" "^0.38.0" + "@scramjet/utility" "^0.38.0" + scramjet "^4.36.9" + +"@scramjet/stdio-sequence@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/stdio-sequence": + version "0.22.0" + resolved "file:packages/stdio-sequence" + dependencies: + scramjet "^4.36.6" + +"@scramjet/sth-config@^0.38.0", "@scramjet/sth-config@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/sth-config": + version "0.38.0" + resolved "file:packages/sth-config" + dependencies: + "@scramjet/utility" "^0.38.0" + +"@scramjet/sth@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/sth": + version "0.38.0" + resolved "file:packages/sth" + dependencies: + "@scramjet/host" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/sth-config" "^0.38.0" + "@scramjet/utility" "^0.38.0" + commander "^8.3.0" + +"@scramjet/symbols@^0.38.0", "@scramjet/symbols@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/symbols": + version "0.38.0" + resolved "file:packages/symbols" + +"@scramjet/tecemux@^0.38.0", "@scramjet/tecemux@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/tecemux": + version "0.38.0" + resolved "file:packages/tecemux" + dependencies: + "@scramjet/obj-logger" "^0.36.1" + "@scramjet/utility" "^0.36.1" + bpmux "^8.2.1" + +"@scramjet/telemetry@^0.38.0", "@scramjet/telemetry@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/telemetry": + version "0.38.0" + resolved "file:packages/telemetry" + dependencies: + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/utility" "^0.38.0" + winston "^3.8.2" + winston-loki "^6.0.6" + +"@scramjet/types@^0.38.0", "@scramjet/types@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/types": + version "0.38.0" + resolved "file:packages/types" + dependencies: + "@scramjet/symbols" "^0.38.0" + http-status-codes "^2.2.0" + +"@scramjet/utility@^0.36.1": + version "0.36.1" + resolved "https://registry.npmjs.org/@scramjet/utility/-/utility-0.36.1.tgz" + integrity sha512-sDanZi5evXaTs+LsR/O1znCZuAa7sJv5EDwGLEF2RpW5fBFOWGhtcCJJ3yJN4qQeyMtjTu/J6c4wnBiZNK4JHQ== + dependencies: + normalize-url "4" + yaml "^2.2.2" + +"@scramjet/utility@^0.38.0", "@scramjet/utility@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/utility": + version "0.38.0" + resolved "file:packages/utility" + dependencies: + normalize-url "4" + yaml "^2.2.2" + +"@scramjet/verser@^0.38.0", "@scramjet/verser@file:/home/pfalba/github/scramjet-cpm-dev/sth/packages/verser": + version "0.38.0" + resolved "file:packages/verser" + dependencies: + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/tecemux" "^0.38.0" + "@scramjet/utility" "^0.38.0" + "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" @@ -1343,7 +1574,7 @@ resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== -"@types/node-fetch@^2.6.4": +"@types/node-fetch@^2.6.2": version "2.6.10" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz" integrity sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA== @@ -1356,7 +1587,7 @@ resolved "https://registry.npmjs.org/@types/node-os-utils/-/node-os-utils-1.3.4.tgz" integrity sha512-BCUYrbdoO4FUbx6MB9atLNFnkxdliFaxdiTJMIPPiecXIApc5zf4NIqV5G1jWv/ReZvtYyHLs40RkBjHX+vykA== -"@types/node@*", "@types/node@15.12.5", "@types/node@>=13.7.0": +"@types/node@*", "@types/node@>=13.7.0", "@types/node@15.12.5": version "15.12.5" resolved "https://registry.npmjs.org/@types/node/-/node-15.12.5.tgz" integrity sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg== @@ -1433,16 +1664,16 @@ resolved "https://registry.npmjs.org/@types/trouter/-/trouter-3.1.1.tgz" integrity sha512-XTpWPg/bsGt2oHRmNFfq6kjXDJgeX14pPVFq/PutOe83OFiwrSNP9pV0V2j5O+L/r2XiXRlOZPJtyaOAX5fCBQ== +"@types/uuid@^8.3.4", "@types/uuid@8.3.4": + version "8.3.4" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/uuid@8.3.0": version "8.3.0" resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@types/validator@^13.7.8": version "13.7.11" resolved "https://registry.npmjs.org/@types/validator/-/validator-13.7.11.tgz" @@ -1484,7 +1715,7 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^6.14.0": +"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.14.0": version "6.18.1" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.18.1.tgz" integrity sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA== @@ -1558,7 +1789,16 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== -abbrev@^1.0.0, abbrev@~1.1.1: +"0http@^3.4.1": + version "3.4.2" + resolved "https://registry.npmjs.org/0http/-/0http-3.4.2.tgz" + integrity sha512-zDbvsof0hqUdtHjcXE8pCzAmBGhNjwhypDfMKQf4sJz9QB9CMphgQzo/te2bGz7GjEuqiwXss7z7DJMt7IQo3Q== + dependencies: + lru-cache "^7.14.1" + regexparam "^2.0.1" + trouter "^3.2.0" + +abbrev@^1.0.0, abbrev@~1.1.1, abbrev@1: version "1.1.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -1575,22 +1815,17 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.0.0, acorn-walk@^8.1.1: +acorn-walk@^8.0.0, acorn-walk@^8.1.1, acorn-walk@^8.2.0: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn-walk@^8.2.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" - integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== - -acorn@^8.0.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.9.0: version "8.11.3" resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -agent-base@6, agent-base@^6.0.2: +agent-base@^6.0.2, agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -1616,7 +1851,7 @@ aggregate-error@^3.0.0: aggregate-error@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz" integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== dependencies: clean-stack "^4.0.0" @@ -1663,7 +1898,7 @@ ansi-regex@^5.0.1: ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: @@ -1685,9 +1920,14 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0, ansi-styles@^6.1.0: +ansi-styles@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: @@ -1715,7 +1955,12 @@ append-transform@^2.0.0: resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== -archy@^1.0.0, archy@~1.0.0: +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +archy@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== @@ -1835,7 +2080,7 @@ arrify@^2.0.1: arrify@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc" + resolved "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz" integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw== asap@^2.0.0: @@ -1850,7 +2095,7 @@ asn1@^0.2.4, asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -1953,7 +2198,7 @@ ava@^3.15.0: ava@^4.3.3: version "4.3.3" - resolved "https://registry.yarnpkg.com/ava/-/ava-4.3.3.tgz#4ddcb650ed059e4e999a4b640de53ff00f4a008b" + resolved "https://registry.npmjs.org/ava/-/ava-4.3.3.tgz" integrity sha512-9Egq/d9R74ExrWohHeqUlexjDbgZJX5jA1Wq4KCTqc3wIfpGEK79zVy4rBtofJ9YKIxs4PzhJ8BgbW5PlAYe6w== dependencies: acorn "^8.7.1" @@ -2024,7 +2269,7 @@ axios@^0.26.1: dependencies: follow-redirects "^1.14.8" -babel-jest@^29.6.2: +babel-jest@^29.0.0, babel-jest@^29.6.2: version "29.6.2" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz" integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== @@ -2113,7 +2358,12 @@ bin-links@^3.0.3: rimraf "^3.0.0" write-file-atomic "^4.0.0" -binary-extensions@^2.0.0, binary-extensions@^2.2.0: +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +binary-extensions@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== @@ -2180,7 +2430,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3: +browserslist@^4.21.3, "browserslist@>= 4.21.0": version "4.21.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -2302,7 +2552,7 @@ callsites@^3.0.0, callsites@^3.1.0: callsites@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" + resolved "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz" integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== camelcase@^5.0.0, camelcase@^5.3.1: @@ -2336,7 +2586,7 @@ caseless@~0.12.0: cbor@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: nofilter "^3.1.0" @@ -2360,7 +2610,7 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: chalk@^5.0.1: version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== char-regex@^1.0.2: @@ -2410,7 +2660,7 @@ ci-info@^3.2.0: ci-info@^3.3.1: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== ci-parallel-vars@^1.0.1: @@ -2435,6 +2685,11 @@ class-transformer@0.4.0: resolved "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz" integrity sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA== +class-transformer@0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz" + integrity sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" @@ -2442,7 +2697,7 @@ clean-stack@^2.0.0: clean-stack@^4.0.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz" integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== dependencies: escape-string-regexp "5.0.0" @@ -2477,7 +2732,7 @@ cli-spinners@^2.5.0: resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz" integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== -cli-table3@0.6.1, cli-table3@^0.6.0: +cli-table3@^0.6.0, cli-table3@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz" integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== @@ -2488,7 +2743,7 @@ cli-table3@0.6.1, cli-table3@^0.6.0: cli-table3@^0.6.2: version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: string-width "^4.2.0" @@ -2505,7 +2760,7 @@ cli-truncate@^2.1.0: cli-truncate@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: slice-ansi "^5.0.0" @@ -2585,7 +2840,7 @@ code-excerpt@^3.0.0: code-excerpt@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-4.0.0.tgz#2de7d46e98514385cb01f7b3b741320115f4c95e" + resolved "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz" integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== dependencies: convert-to-spaces "^2.0.1" @@ -2600,7 +2855,14 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -color-convert@^1.9.0, color-convert@^1.9.3: +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^1.9.3: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2614,16 +2876,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-string@^1.6.0: version "1.9.1" resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" @@ -2673,16 +2935,16 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@7.2.0, commander@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^2.9.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^8.3.0: version "8.3.0" resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" @@ -2693,6 +2955,11 @@ commander@^9.5.0: resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== +commander@7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz" @@ -2761,7 +3028,7 @@ convert-to-spaces@^1.0.1: convert-to-spaces@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" + resolved "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz" integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== core-util-is@1.0.2: @@ -2819,7 +3086,7 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -d@1, d@^1.0.1: +d@^1.0.1, d@1: version "1.0.1" resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== @@ -2849,13 +3116,6 @@ date-time@^3.1.0: dependencies: time-zone "^1.0.0" -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - 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" - debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -2863,6 +3123,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4: + 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" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz" @@ -2989,7 +3256,12 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diff@^5.0.0, diff@^5.1.0: +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + +diff@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== @@ -3066,7 +3338,7 @@ durations@^3.4.2: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ecc-jsbn@~0.1.1: @@ -3084,7 +3356,7 @@ electron-to-chromium@^1.4.251: emittery@^0.11.0: version "0.11.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.11.0.tgz#eb5f756a200d3431de2c6e850cb2d8afd97a03b9" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.11.0.tgz" integrity sha512-S/7tzL6v5i+4iJd627Nhv9cLFIo5weAIlGccqJFpnBoDB8U1TF2k5tez4J/QNuxyyhWuFqHg1L84Kd3m7iXg6g== emittery@^0.13.1: @@ -3104,7 +3376,7 @@ emoji-regex@^8.0.0: emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enabled@2.0.x: @@ -3112,7 +3384,7 @@ enabled@2.0.x: resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encoding@^0.1.13: +encoding@^0.1.0, encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -3256,106 +3528,11 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.1" ext "^1.1.2" -esbuild-android-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" - integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== - -esbuild-android-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" - integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== - -esbuild-darwin-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" - integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== - -esbuild-darwin-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" - integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== - -esbuild-freebsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" - integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== - -esbuild-freebsd-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" - integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== - -esbuild-linux-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" - integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== - esbuild-linux-64@0.14.54: version "0.14.54" resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz" integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== -esbuild-linux-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" - integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== - -esbuild-linux-arm@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" - integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== - -esbuild-linux-mips64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" - integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== - -esbuild-linux-ppc64le@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" - integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== - -esbuild-linux-riscv64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" - integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== - -esbuild-linux-s390x@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" - integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== - -esbuild-netbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" - integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== - -esbuild-openbsd-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" - integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== - -esbuild-sunos-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" - integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== - -esbuild-windows-32@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" - integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== - -esbuild-windows-64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" - integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== - -esbuild-windows-arm64@0.14.54: - version "0.14.54" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" - integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== - esbuild@^0.14.54: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz" @@ -3393,11 +3570,6 @@ escape-goat@^2.0.0: resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -3413,6 +3585,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0, escape-string-regexp@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + eslint-import-resolver-node@^0.3.9: version "0.3.9" resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" @@ -3473,7 +3650,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.55.0: +"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.55.0, eslint@>=2.0.0: version "8.56.0" resolved "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz" integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== @@ -3560,21 +3737,6 @@ event-target-shim@^5.0.0: resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -execa@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz" - integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" @@ -3603,6 +3765,21 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -3620,11 +3797,6 @@ expect@^29.0.0, expect@^29.6.2: jest-message-util "^29.6.2" jest-util "^29.6.2" -exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== - ext-ip@^0.3.9: version "0.3.9" resolved "https://registry.npmjs.org/ext-ip/-/ext-ip-0.3.9.tgz" @@ -3645,7 +3817,7 @@ extend@~3.0.2: resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== @@ -3660,20 +3832,9 @@ fast-diff@^1.2.0: resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-glob@^3.3.0: +fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -3682,7 +3843,7 @@ fast-glob@^3.3.0: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: 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== @@ -3693,9 +3854,7 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastest-levenshtein@^1.0.12: - version "1.0.16" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + version "1.0.12" fastq@^1.6.0: version "1.15.0" @@ -3725,7 +3884,7 @@ figures@^3.2.0: figures@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/figures/-/figures-4.0.1.tgz#27b26609907bc888b3e3b0ef5403643f80aa2518" + resolved "https://registry.npmjs.org/figures/-/figures-4.0.1.tgz" integrity sha512-rElJwkA/xS04Vfg+CaZodpso7VqBknOYbzi6I76hI4X80RUjkSxO2oAyPmGbuXUppywjqndOrQDl817hDnI++w== dependencies: escape-string-regexp "^5.0.0" @@ -3783,7 +3942,15 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -3801,7 +3968,7 @@ find-up@^5.0.0: find-up@^6.0.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: locate-path "^7.1.0" @@ -3919,10 +4086,10 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function-bind@^1.1.2: version "1.1.2" @@ -3968,7 +4135,12 @@ get-caller-file@^1.0.1: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1, get-caller-file@^2.0.5: +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -4022,7 +4194,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -4036,6 +4208,13 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -4099,7 +4278,7 @@ globby@^11.0.1, globby@^11.1.0: globby@^13.1.1: version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" @@ -4221,6 +4400,13 @@ has-yarn@^2.1.0: resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hasha@^5.0.0: version "5.2.2" resolved "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz" @@ -4382,7 +4568,7 @@ indent-string@^4.0.0: indent-string@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== infer-owner@^1.0.4: @@ -4398,16 +4584,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^3.0.0, ini@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" @@ -4418,6 +4599,11 @@ ini@~1.3.0: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + init-package-json@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz" @@ -4460,16 +4646,11 @@ ip@^2.0.0: resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== -irregular-plurals@^3.2.0: +irregular-plurals@^3.2.0, irregular-plurals@^3.3.0: version "3.4.0" resolved "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.4.0.tgz" integrity sha512-YXxECO/W6N9aMBVKMKKZ8TXESgq7EFrp3emCGGUcrYY1cgJIeZjoB75MTu8qi+NAKntS9NwPU8VdcQ3r6E6aWQ== -irregular-plurals@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" - integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ== - is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" @@ -4530,13 +4711,18 @@ is-cidr@^4.0.2: dependencies: cidr-regex "^3.1.1" -is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.8.1: +is-core-module@^2.13.0, is-core-module@^2.13.1: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" +is-core-module@^2.8.1: + version "2.10.0" + dependencies: + has "^1.0.3" + is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" @@ -4573,7 +4759,7 @@ is-fullwidth-code-point@^3.0.0: is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-generator-fn@^2.0.0: @@ -4721,7 +4907,7 @@ is-unicode-supported@^0.1.0: is-unicode-supported@^1.2.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== is-weakref@^1.0.2: @@ -4741,16 +4927,16 @@ is-yarn-global@^0.3.0: resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -4788,7 +4974,18 @@ istanbul-lib-instrument@^4.0.0: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^5.1.0: version "5.2.1" resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -5041,7 +5238,7 @@ jest-resolve-dependencies@^29.6.2: jest-regex-util "^29.4.3" jest-snapshot "^29.6.2" -jest-resolve@^29.6.2: +jest-resolve@*, jest-resolve@^29.6.2: version "29.6.2" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz" integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== @@ -5185,7 +5382,7 @@ jest-worker@^29.6.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.5.0: +jest@^29.0.0, jest@^29.5.0: version "29.6.2" resolved "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz" integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== @@ -5210,7 +5407,23 @@ js-tokens@^4.0.0: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1, js-yaml@^3.14.0, js-yaml@^3.14.1: +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.14.0: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.14.1: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -5322,14 +5535,10 @@ jsprim@^1.2.2: verror "1.10.0" just-diff-apply@^5.2.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" - integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== + version "5.4.1" just-diff@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" - integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== + version "5.1.1" just-extend@^4.0.2: version "4.2.1" @@ -5518,7 +5727,7 @@ load-json-file@^5.2.0: load-json-file@^7.0.0: version "7.0.1" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz" integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ== locate-path@^3.0.0: @@ -5545,7 +5754,7 @@ locate-path@^6.0.0: locate-path@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: p-locate "^6.0.0" @@ -5636,9 +5845,7 @@ lru-cache@^7.14.1, lru-cache@^7.7.1: integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== lru-cache@^7.4.4, lru-cache@^7.5.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + version "7.13.2" lunr@^2.3.9: version "2.3.9" @@ -5652,7 +5859,7 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: +make-error@^1.1.1, make-error@1.x: version "1.3.6" resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -5707,7 +5914,7 @@ matcher@^3.0.0: matcher@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + resolved "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz" integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== dependencies: escape-string-regexp "^5.0.0" @@ -5738,7 +5945,7 @@ mem@^8.0.0: mem@^9.0.2: version "9.0.2" - resolved "https://registry.yarnpkg.com/mem/-/mem-9.0.2.tgz#bbc2d40be045afe30749681e8f5d554cee0c0354" + resolved "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz" integrity sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A== dependencies: map-age-cleaner "^0.1.3" @@ -5796,7 +6003,7 @@ mimic-fn@^3.1.0: mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-response@^1.0.0, mimic-response@^1.0.1: @@ -5804,13 +6011,6 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -5825,6 +6025,20 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" @@ -5891,11 +6105,6 @@ minipass@^4.0.0: dependencies: yallist "^4.0.0" -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" @@ -5928,12 +6137,17 @@ module-not-found-error@^1.0.1: resolved "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz" integrity sha512-pEk4ECWQXV6z2zjhRZUongnLJNUeGQJ3w6OQ5ctGwD+i5o93qjRQUk2Rt6VdNeu3sEP0AB4LcfvdebpxBRVr4g== -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.2, ms@^2.1.3: +ms@^2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -6031,7 +6245,7 @@ node-gyp@^9.0.0: node-gyp@^9.1.0: version "9.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz" integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== dependencies: env-paths "^2.2.0" @@ -6070,7 +6284,7 @@ node-releases@^2.0.6: nofilter@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@^6.0.0: @@ -6105,7 +6319,7 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@4, normalize-url@^4.1.0: +normalize-url@^4.1.0, normalize-url@4: version "4.5.1" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== @@ -6119,7 +6333,7 @@ npm-audit-report@^3.0.0: npm-bundled@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" @@ -6145,13 +6359,11 @@ npm-normalize-package-bin@^1.0.1: npm-normalize-package-bin@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz" integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@^9.1.0: - version "9.1.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" - integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== + version "9.1.0" dependencies: hosted-git-info "^5.0.0" proc-log "^2.0.1" @@ -6312,7 +6524,7 @@ number-is-nan@^1.0.0: resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nyc@^15.1.0: +nyc@^15.1.0, nyc@>=15: version "15.1.0" resolved "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz" integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== @@ -6504,7 +6716,7 @@ p-event@^4.2.0: p-event@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/p-event/-/p-event-5.0.1.tgz#614624ec02ae7f4f13d09a721c90586184af5b0c" + resolved "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz" integrity sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ== dependencies: p-timeout "^5.0.2" @@ -6519,7 +6731,14 @@ p-is-promise@^2.0.0: resolved "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -6535,7 +6754,7 @@ p-limit@^3.0.2, p-limit@^3.1.0: p-limit@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: yocto-queue "^1.0.0" @@ -6563,7 +6782,7 @@ p-locate@^5.0.0: p-locate@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: p-limit "^4.0.0" @@ -6584,7 +6803,7 @@ p-map@^4.0.0: p-map@^5.4.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" + resolved "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz" integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== dependencies: aggregate-error "^4.0.0" @@ -6598,7 +6817,7 @@ p-timeout@^3.1.0: p-timeout@^5.0.2: version "5.1.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-5.1.0.tgz#b3c691cf4415138ce2d9cfe071dba11f0fee085b" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz" integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== p-try@^2.0.0: @@ -6716,7 +6935,7 @@ path-exists@^4.0.0: path-exists@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== path-is-absolute@^1.0.0: @@ -6724,7 +6943,12 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== @@ -6803,7 +7027,7 @@ pkg-conf@^3.1.0: pkg-conf@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-4.0.0.tgz#63ace00cbacfa94c2226aee133800802d3e3b80c" + resolved "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz" integrity sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w== dependencies: find-up "^6.0.0" @@ -6825,15 +7049,13 @@ plur@^4.0.0: plur@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-5.1.0.tgz#bff58c9f557b9061d60d8ebf93959cf4b08594ae" + resolved "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz" integrity sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg== dependencies: irregular-plurals "^3.3.0" postcss-selector-parser@^6.0.10: - version "6.0.15" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" - integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + version "6.0.10" dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -6887,9 +7109,7 @@ promise-all-reject-late@^1.0.0: integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== promise-call-limit@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" - integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== + version "1.0.1" promise-inflight@^1.0.1: version "1.0.1" @@ -6999,7 +7219,7 @@ queue@6.0.2: dependencies: inherits "~2.0.3" -rc@1.2.8, rc@^1.2.8: +rc@^1.2.8, rc@1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7015,9 +7235,7 @@ react-is@^18.0.0: integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== read-cmd-shim@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" - integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== + version "3.0.0" read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: version "2.0.3" @@ -7047,7 +7265,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@1, read@^1.0.7, read@~1.0.7: +read@^1.0.7, read@~1.0.7, read@1: version "1.0.7" resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== @@ -7318,20 +7536,34 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz" integrity sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA== -"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +"scramjet-bdd@file:/home/pfalba/github/scramjet-cpm-dev/sth/bdd": + version "0.38.0" + resolved "file:bdd" + dependencies: + "@scramjet/api-client" "^0.38.0" + "@scramjet/logger" "^0.38.0" + "@scramjet/obj-logger" "^0.38.0" + "@scramjet/sth-config" "^0.38.0" + dockerode "^3.3.4" + find-package-json "^1.2.0" + freeport "^1.0.5" + n-readlines "^1.0.1" + scramjet "^4.36.9" + scramjet-core@^4.32.10: version "4.32.10" resolved "https://registry.npmjs.org/scramjet-core/-/scramjet-core-4.32.10.tgz" integrity sha512-B4xYXl8+sT3Fy/DAKmGE1TJafHm+U46AUY3w0v4XseNwhy94C+JfzKR/9+F1gmEihn+E7tDPXnqlquGDmQ6o8Q== -scramjet@^4.36.6, scramjet@^4.36.9, scramjet@^4.37.0: - version "4.37.0" - resolved "https://registry.yarnpkg.com/scramjet/-/scramjet-4.37.0.tgz#2e89f07cbaffd1f9cdd5a3da64aba250745aac13" - integrity sha512-Y6b59qGsulkr5MxiVn9CABnL9pE/sPKihCcWSUhzZc6W0YWbfLWRXc1fE1M40QKfOQUBxks81efzJ7WpEuFmlQ== +scramjet@^4.36.6, scramjet@^4.36.9: + version "4.36.9" + resolved "https://registry.npmjs.org/scramjet/-/scramjet-4.36.9.tgz" + integrity sha512-vHRQy3hE1gC3tYDKPLGmvQgEQV4oL3JpOA7tP07eGcez+Py2mX8yFu81OeSBPwSwjHX5BrAe8pXVkgT3CMkC/g== dependencies: papaparse "^5.3.2" rereadable-stream "^1.4.14" @@ -7349,12 +7581,22 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0: +semver@^5.5.0: version "5.7.1" resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: version "6.3.0" resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -7364,9 +7606,9 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.7: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -7378,6 +7620,25 @@ semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.2: dependencies: lru-cache "^6.0.0" +semver@^7.5.3: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz" @@ -7501,7 +7762,7 @@ slash@^3.0.0: slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== slice-ansi@^3.0.0: @@ -7515,7 +7776,7 @@ slice-ansi@^3.0.0: slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -7562,6 +7823,14 @@ socks@^2.6.2: ip "^2.0.0" smart-buffer "^4.2.0" +source-map-support@^0.5.19, source-map-support@0.5.19: + version "0.5.19" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -7570,24 +7839,16 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@0.5.19, source-map-support@^0.5.19: - version "0.5.19" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@0.5.6: version "0.5.6" resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - spawn-wrap@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz" @@ -7720,6 +7981,13 @@ stream-buffers@^3.0.2: resolved "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz" integrity sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string-argv@^0.3.1: version "0.3.1" resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz" @@ -7751,7 +8019,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.0.0, string-width@^2.1.1: +string-width@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7761,7 +8037,7 @@ string-width@^2.0.0, string-width@^2.1.1: string-width@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -7795,13 +8071,6 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" @@ -7825,7 +8094,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -7881,7 +8150,7 @@ supertap@^2.0.0: supertap@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/supertap/-/supertap-3.0.1.tgz#aa89e4522104402c6e8fe470a7d2db6dc4037c6a" + resolved "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz" integrity sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw== dependencies: indent-string "^5.0.0" @@ -7937,13 +8206,11 @@ tar-stream@^2.0.0: readable-stream "^3.1.1" tar@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" - integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + version "6.1.11" dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^5.0.0" + minipass "^3.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -7979,7 +8246,12 @@ text-hex@1.0.x: resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== -text-table@^0.2.0, text-table@~0.2.0: +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +text-table@~0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== @@ -8015,7 +8287,14 @@ tmp-promise@^3.0.2: dependencies: tmp "^0.2.0" -tmp@^0.2.0, tmp@^0.2.1: +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -8116,7 +8395,7 @@ ts-jest@^29.0.5: semver "^7.5.3" yargs-parser "^21.0.1" -ts-node@^10.9.1: +ts-node@^10.9.1, ts-node@>=9.0.0: version "10.9.1" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== @@ -8179,7 +8458,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8, type-detect@^4.0.8: +type-detect@^4.0.8, type-detect@4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -8265,7 +8544,7 @@ typed-array-length@^1.0.4: typed-emitter@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/typed-emitter/-/typed-emitter-1.4.0.tgz#38c6bf1224e764906bb20cb0b458fa914100607c" + resolved "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz" integrity sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg== typedarray-to-buffer@^3.1.5: @@ -8282,7 +8561,7 @@ typedoc-plugin-markdown@3.13.6: dependencies: handlebars "^4.7.7" -typedoc@0.23.17: +typedoc@>=0.23.0, typedoc@0.23.17: version "0.23.17" resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.23.17.tgz" integrity sha512-3rtNubo1dK0pvs6ixpMAq4pESULd5/JNUqJbdyZoeilI14reb1RNVomN4fMgIadd0RMX1aenYjJSSMBOJ+/+0Q== @@ -8292,7 +8571,7 @@ typedoc@0.23.17: minimatch "^5.1.0" shiki "^0.11.1" -typescript@~4.7.4: +typescript@>=2.7, typescript@>=4.2.0, "typescript@>=4.3 <6", typescript@~4.7.4, "typescript@4.6.x || 4.7.x || 4.8.x": version "4.7.4" resolved "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== @@ -8402,16 +8681,21 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@8.3.2, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^3.3.2: version "3.4.0" resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2, uuid@8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" @@ -8426,7 +8710,15 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: +validate-npm-package-license@^3.0.1: + 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== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-license@^3.0.4: 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== @@ -8446,19 +8738,19 @@ validator@^13.7.0: resolved "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -verror@^1.10.0: - version "1.10.1" - resolved "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz" - integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -8486,7 +8778,14 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -wcwidth@^1.0.0, wcwidth@^1.0.1: +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== @@ -8650,7 +8949,15 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.0, write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: +write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -8658,7 +8965,7 @@ write-file-atomic@^4.0.0, write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -ws@^7.3.1: +ws@*, ws@^7.3.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -8714,7 +9021,12 @@ yargs-parser@^20.2.2: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@^21.0.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== @@ -8767,7 +9079,20 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.5.1: +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yargs@^17.5.1: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -8797,5 +9122,5 @@ yocto-queue@^0.1.0: yocto-queue@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==