test: switch to node.js test runner
authorJérôme Benoit <jerome.benoit@sap.com>
Fri, 29 Sep 2023 18:00:01 +0000 (20:00 +0200)
committerJérôme Benoit <jerome.benoit@sap.com>
Fri, 29 Sep 2023 18:00:01 +0000 (20:00 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com>
14 files changed:
.cfignore
.eslintrc.json
.mocharc.json [deleted file]
.vscode/extensions.json
.vscode/launch.json
.vscode/settings.json
package.json
pnpm-lock.yaml
test/robohydra/config.json [deleted file]
test/robohydra/messages.txt [deleted file]
test/robohydra/plugins/wsServer/index.js [deleted file]
test/utils/CircularArray.test.ts
test/utils/StatisticUtils.test.ts
test/utils/Utils.test.ts

index 608afbfbb8fd5ea28fe19a83dabad3c7568ffc12..64b72cdf714b7e78e90ad0c4e3a7a406668ff32d 100644 (file)
--- a/.cfignore
+++ b/.cfignore
@@ -22,7 +22,6 @@
 .nycrc.json
 .nyc_output
 .reuse
-.mocharc.json
 .release-it.json
 .xmake.cfg
 # Logs
index 2b20e8ddd73ad7fcd2b093ca2d138550bcb0e12e..ddb47174049aff56a7589146429e75c4e1660902 100644 (file)
@@ -3,8 +3,7 @@
   "root": true,
   "env": {
     "es2022": true,
-    "node": true,
-    "mocha": true
+    "node": true
   },
   "parserOptions": {
     "ecmaVersion": 2022,
diff --git a/.mocharc.json b/.mocharc.json
deleted file mode 100644 (file)
index 916e8a6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-  "$schema": "https://json.schemastore.org/mocharc",
-  "parallel": true,
-  "diff": true,
-  "recursive": true,
-  "extension": ["ts"],
-  "package": "./package.json",
-  "reporter": "mochawesome",
-  "reporter-options": "reportDir=outputs/mochawesome-report,json=false",
-  "slow": 75,
-  "timeout": 2000,
-  "ui": "bdd",
-  "full-trace": true,
-  "enable-source-maps": true,
-  "exit": true,
-  "node-option": [
-    "loader=ts-node/esm",
-    "no-warnings=ExperimentalWarning",
-    "experimental-specifier-resolution=node"
-  ],
-  "require": ["mochawesome/register"]
-}
index 2243f8ccf8370e328135e33b03dc1648bb583153..df91b6165d6b8685dec6ecf524c14983f2a1fee7 100644 (file)
@@ -6,7 +6,6 @@
     "dbaeumer.vscode-eslint",
     "eamodio.gitlens",
     "EditorConfig.EditorConfig",
-    "hbenl.vscode-mocha-test-adapter",
     "ms-azuretools.vscode-docker",
     "sonarsource.sonarlint-vscode",
     "streetsidesoftware.code-spell-checker"
index ee5fd9846ed87ae8e9e672ebbe2008f042f4379d..4f200ec8e7924ad1ca3b3870a11d366175fbec76 100644 (file)
       "continueOnAttach": true,
       "autoAttachChildProcesses": false,
       "timeout": 30000,
-      "resolveSourceMapLocations": [
-        "!**/node_modules/**",
-        "!**/.vscode/extensions/hbenl.vscode-mocha-test-adapter-*/**"
-      ],
+      "resolveSourceMapLocations": ["!**/node_modules/**"],
       "skipFiles": ["<node_internals>/**"]
     }
   ]
index 7d1ba7fd9c40fb6721bdd9bab615440482cbca67..c4fe66830fa6abe0b438ef12dd722c7cad9e5701 100644 (file)
@@ -3,13 +3,6 @@
     "source.fixAll": true
   },
   "testExplorer.useNativeTesting": true,
-  "mochaExplorer.nodeArgv": [
-    "--loader=ts-node/esm",
-    "--no-warnings=ExperimentalWarning",
-    "--experimental-specifier-resolution=node"
-  ],
-  "mochaExplorer.files": ["test/**/*.test.ts"],
-  "mochaExplorer.debuggerConfig": "Debug Simulator Unit Tests",
   "cSpell.words": [
     "backoff",
     "benoit",
@@ -38,7 +31,6 @@
     "measurands",
     "mikro",
     "mnemonist",
-    "mochawesome",
     "ocpp",
     "olivierbagot",
     "parens",
@@ -47,7 +39,6 @@
     "preinstall",
     "Recurrency",
     "RFID",
-    "robohydra",
     "shutdowning",
     "sonarlint",
     "SRPC",
index f3f41ca28be325003be9eb33abd6b9d63842a683..965854acf2a49df0b6701d0c8307c04d7c5d9ed8 100644 (file)
     "lint": "cross-env TIMING=1 eslint --cache src",
     "lint:fix": "cross-env TIMING=1 eslint --cache --fix src",
     "format": "prettier --cache --write .",
-    "test": "c8 mocha test/**/*.test.ts",
-    "test:debug": "mocha --no-parallel --inspect test/**/*.test.ts",
+    "test": "c8 node --loader tsx --no-warnings=ExperimentalWarning --test test/**/*.test.ts",
+    "test:debug": "node --loader tsx --no-warnings=ExperimentalWarning --test --inspect test/**/*.test.ts",
     "coverage": "c8 report --reporter=lcov",
     "coverage:html": "c8 report --reporter=html",
     "clinic:clean": "clinic clean",
-    "robohydra": "robohydra test/robohydra/config.json",
     "git:sinit": "git submodule update --init --recursive --force",
     "git:sdiff": "git diff && git submodule foreach 'git diff'",
     "git:supdate": "git submodule update --remote --recursive --merge",
     "@rollup/plugin-json": "^6.0.0",
     "@rollup/plugin-terser": "^0.4.3",
     "@rollup/plugin-typescript": "^11.1.4",
-    "@types/mocha": "^10.0.2",
     "@types/node": "^20.7.1",
     "@types/sinon": "^10.0.17",
     "@types/tar": "^6.1.6",
     "expect": "^29.7.0",
     "husky": "^8.0.3",
     "lint-staged": "^14.0.1",
-    "mocha": "^10.2.0",
-    "mochawesome": "^7.1.3",
     "prettier": "^3.0.3",
     "release-it": "^16.2.1",
     "rimraf": "^5.0.5",
-    "robohydra": "^0.6.9",
     "rollup": "^3.29.4",
     "rollup-plugin-analyzer": "^4.0.0",
     "rollup-plugin-delete": "^2.0.0",
     "semver": "^7.5.4",
     "sinon": "^16.0.0",
-    "ts-node": "^10.9.1",
+    "tsx": "^3.13.0",
     "typescript": "~5.2.2"
   }
 }
index 3098e78cd9df24a1788fdfcf6cbf723e0ecf2c99..d6b3fdb65ded629d55f894f6f8f8c26aaf814dc5 100644 (file)
@@ -108,9 +108,6 @@ devDependencies:
   '@rollup/plugin-typescript':
     specifier: ^11.1.4
     version: 11.1.4(rollup@3.29.4)(tslib@2.6.2)(typescript@5.2.2)
-  '@types/mocha':
-    specifier: ^10.0.2
-    version: 10.0.2
   '@types/node':
     specifier: ^20.7.1
     version: 20.7.1
@@ -177,12 +174,6 @@ devDependencies:
   lint-staged:
     specifier: ^14.0.1
     version: 14.0.1
-  mocha:
-    specifier: ^10.2.0
-    version: 10.2.0
-  mochawesome:
-    specifier: ^7.1.3
-    version: 7.1.3(mocha@10.2.0)
   prettier:
     specifier: ^3.0.3
     version: 3.0.3
@@ -192,9 +183,6 @@ devDependencies:
   rimraf:
     specifier: ^5.0.5
     version: 5.0.5
-  robohydra:
-    specifier: ^0.6.9
-    version: 0.6.9(bufferutil@4.0.7)(utf-8-validate@6.0.3)
   rollup:
     specifier: ^3.29.4
     version: 3.29.4
@@ -210,9 +198,9 @@ devDependencies:
   sinon:
     specifier: ^16.0.0
     version: 16.0.0
-  ts-node:
-    specifier: ^10.9.1
-    version: 10.9.1(@types/node@20.7.1)(typescript@5.2.2)
+  tsx:
+    specifier: ^3.13.0
+    version: 3.13.0
   typescript:
     specifier: ~5.2.2
     version: 5.2.2
@@ -229,7 +217,7 @@ packages:
       concat-stream: 2.0.0
       d3-fg: 6.14.0
       debounce: 1.2.1
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       end-of-stream: 1.4.4
       env-string: 1.0.1
       escape-string-regexp: 4.0.0
@@ -358,7 +346,7 @@ packages:
       d3-selection: 1.4.2
       d3-shape: 1.3.7
       d3-time-format: 2.3.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       distributions: 2.1.0
       endpoint: 0.4.5
       hidden-markov-model-tf: 4.0.0(@tensorflow/tfjs-core@3.21.0)
@@ -529,7 +517,7 @@ packages:
       lodash.merge: 4.6.2
       lodash.uniq: 4.5.0
       resolve-from: 5.0.0
-      ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2)
+      ts-node: 10.9.1(@types/node@20.7.1)(typescript@5.2.2)
       typescript: 5.2.2
     transitivePeerDependencies:
       - '@swc/core'
@@ -627,6 +615,204 @@ packages:
       jsdoc-type-pratt-parser: 4.0.0
     dev: true
 
+  /@esbuild/android-arm64@0.18.20:
+    resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.18.20:
+    resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.18.20:
+    resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.18.20:
+    resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.18.20:
+    resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.18.20:
+    resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.18.20:
+    resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.18.20:
+    resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.18.20:
+    resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.18.20:
+    resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.18.20:
+    resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.18.20:
+    resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.18.20:
+    resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.18.20:
+    resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.18.20:
+    resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.18.20:
+    resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.18.20:
+    resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.18.20:
+    resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.18.20:
+    resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.18.20:
+    resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.18.20:
+    resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.18.20:
+    resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0):
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -647,7 +833,7 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dependencies:
       ajv: 6.12.6
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       espree: 9.6.1
       globals: 13.22.0
       ignore: 5.2.4
@@ -674,7 +860,7 @@ packages:
     engines: {node: '>=10.10.0'}
     dependencies:
       '@humanwhocodes/object-schema': 1.2.1
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       minimatch: 3.1.2
     transitivePeerDependencies:
       - supports-color
@@ -1497,10 +1683,6 @@ packages:
     resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==}
     dev: true
 
-  /@types/mocha@10.0.2:
-    resolution: {integrity: sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==}
-    dev: true
-
   /@types/node@17.0.45:
     resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
 
@@ -1600,7 +1782,7 @@ packages:
       '@typescript-eslint/type-utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2)
       '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2)
       '@typescript-eslint/visitor-keys': 6.7.3
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       eslint: 8.50.0
       graphemer: 1.4.0
       ignore: 5.2.4
@@ -1626,7 +1808,7 @@ packages:
       '@typescript-eslint/types': 6.7.3
       '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2)
       '@typescript-eslint/visitor-keys': 6.7.3
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       eslint: 8.50.0
       typescript: 5.2.2
     transitivePeerDependencies:
@@ -1653,7 +1835,7 @@ packages:
     dependencies:
       '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2)
       '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2)
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       eslint: 8.50.0
       ts-api-utils: 1.0.3(typescript@5.2.2)
       typescript: 5.2.2
@@ -1677,7 +1859,7 @@ packages:
     dependencies:
       '@typescript-eslint/types': 6.7.3
       '@typescript-eslint/visitor-keys': 6.7.3
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       globby: 11.1.0
       is-glob: 4.0.3
       semver: 7.5.4
@@ -1790,7 +1972,7 @@ packages:
     resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
     engines: {node: '>= 6.0.0'}
     dependencies:
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
 
@@ -1798,7 +1980,7 @@ packages:
     resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
     engines: {node: '>= 14'}
     dependencies:
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1851,11 +2033,6 @@ packages:
       string-width: 4.2.3
     dev: true
 
-  /ansi-colors@4.1.1:
-    resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
-    engines: {node: '>=6'}
-    dev: true
-
   /ansi-escapes@3.2.0:
     resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==}
     engines: {node: '>=4'}
@@ -1933,14 +2110,6 @@ packages:
     resolution: {integrity: sha512-36j4l5HVkboyRhIWgtMh1I9i8LTdFqVwDEHy1cp+QioJyKgAUG40X0W8s7jakWRta/Sjvm8mUG1fU6Tj8mWagQ==}
     dev: true
 
-  /anymatch@3.1.3:
-    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
-    engines: {node: '>= 8'}
-    dependencies:
-      normalize-path: 3.0.0
-      picomatch: 2.3.1
-    dev: true
-
   /aproba@2.0.0:
     resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
 
@@ -2216,11 +2385,6 @@ packages:
     engines: {node: '>=0.6'}
     dev: true
 
-  /binary-extensions@2.2.0:
-    resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
-    engines: {node: '>=8'}
-    dev: true
-
   /bit-twiddle@1.0.2:
     resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==}
     dev: true
@@ -2338,10 +2502,6 @@ packages:
       resolve: 1.22.6
     dev: true
 
-  /browser-stdout@1.3.1:
-    resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
-    dev: true
-
   /browserify-aes@1.2.0:
     resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
     dependencies:
@@ -2496,6 +2656,7 @@ packages:
     requiresBuild: true
     dependencies:
       node-gyp-build: 4.6.1
+    dev: false
 
   /builtin-modules@3.3.0:
     resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
@@ -2678,21 +2839,6 @@ packages:
     resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
     dev: true
 
-  /chokidar@3.5.3:
-    resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
-    engines: {node: '>= 8.10.0'}
-    dependencies:
-      anymatch: 3.1.3
-      braces: 3.0.2
-      glob-parent: 5.1.2
-      is-binary-path: 2.1.0
-      is-glob: 4.0.3
-      normalize-path: 3.0.0
-      readdirp: 3.6.0
-    optionalDependencies:
-      fsevents: 2.3.3
-    dev: true
-
   /chownr@2.0.0:
     resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
     engines: {node: '>=10'}
@@ -2821,14 +2967,6 @@ packages:
       wrap-ansi: 5.1.0
     dev: true
 
-  /cliui@7.0.4:
-    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
-    dependencies:
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-      wrap-ansi: 7.0.0
-    dev: true
-
   /cliui@8.0.1:
     resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
     engines: {node: '>=12'}
@@ -3094,7 +3232,7 @@ packages:
     dependencies:
       '@types/node': 20.5.1
       cosmiconfig: 8.3.6(typescript@5.2.2)
-      ts-node: 10.9.1(@types/node@20.5.1)(typescript@5.2.2)
+      ts-node: 10.9.1(@types/node@20.7.1)(typescript@5.2.2)
       typescript: 5.2.2
     dev: true
 
@@ -3372,10 +3510,6 @@ packages:
       '@babel/runtime': 7.23.1
     dev: false
 
-  /dateformat@4.6.3:
-    resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==}
-    dev: true
-
   /debounce-fn@4.0.0:
     resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==}
     engines: {node: '>=10'}
@@ -3398,7 +3532,7 @@ packages:
       ms: 2.1.3
     dev: true
 
-  /debug@4.3.4(supports-color@8.1.1):
+  /debug@4.3.4:
     resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
     engines: {node: '>=6.0'}
     peerDependencies:
@@ -3408,7 +3542,6 @@ packages:
         optional: true
     dependencies:
       ms: 2.1.2
-      supports-color: 8.1.1
 
   /decamelize-keys@1.1.1:
     resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
@@ -3423,11 +3556,6 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /decamelize@4.0.0:
-    resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
-    engines: {node: '>=10'}
-    dev: true
-
   /decompress-response@6.0.0:
     resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
     engines: {node: '>=10'}
@@ -3585,11 +3713,6 @@ packages:
     engines: {node: '>=0.3.1'}
     dev: true
 
-  /diff@5.0.0:
-    resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
-    engines: {node: '>=0.3.1'}
-    dev: true
-
   /diff@5.1.0:
     resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
     engines: {node: '>=0.3.1'}
@@ -3682,14 +3805,6 @@ packages:
       safer-buffer: 2.1.2
     dev: true
 
-  /ejs@3.1.9:
-    resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-    dependencies:
-      jake: 10.8.7
-    dev: true
-
   /elliptic@6.5.4:
     resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==}
     dependencies:
@@ -3903,6 +4018,36 @@ packages:
       ext: 1.7.0
     dev: true
 
+  /esbuild@0.18.20:
+    resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.18.20
+      '@esbuild/android-arm64': 0.18.20
+      '@esbuild/android-x64': 0.18.20
+      '@esbuild/darwin-arm64': 0.18.20
+      '@esbuild/darwin-x64': 0.18.20
+      '@esbuild/freebsd-arm64': 0.18.20
+      '@esbuild/freebsd-x64': 0.18.20
+      '@esbuild/linux-arm': 0.18.20
+      '@esbuild/linux-arm64': 0.18.20
+      '@esbuild/linux-ia32': 0.18.20
+      '@esbuild/linux-loong64': 0.18.20
+      '@esbuild/linux-mips64el': 0.18.20
+      '@esbuild/linux-ppc64': 0.18.20
+      '@esbuild/linux-riscv64': 0.18.20
+      '@esbuild/linux-s390x': 0.18.20
+      '@esbuild/linux-x64': 0.18.20
+      '@esbuild/netbsd-x64': 0.18.20
+      '@esbuild/openbsd-x64': 0.18.20
+      '@esbuild/sunos-x64': 0.18.20
+      '@esbuild/win32-arm64': 0.18.20
+      '@esbuild/win32-ia32': 0.18.20
+      '@esbuild/win32-x64': 0.18.20
+    dev: true
+
   /escalade@3.1.1:
     resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
     engines: {node: '>=6'}
@@ -3917,10 +4062,6 @@ packages:
     engines: {node: '>=12'}
     dev: true
 
-  /escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-    dev: true
-
   /escape-string-regexp@1.0.5:
     resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
     engines: {node: '>=0.8.0'}
@@ -3992,7 +4133,7 @@ packages:
       eslint: '*'
       eslint-plugin-import: '*'
     dependencies:
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       enhanced-resolve: 5.15.0
       eslint: 8.50.0
       eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0)
@@ -4093,7 +4234,7 @@ packages:
       '@es-joy/jsdoccomment': 0.40.1
       are-docs-informative: 0.0.2
       comment-parser: 1.4.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       escape-string-regexp: 4.0.0
       eslint: 8.50.0
       esquery: 1.5.0
@@ -4178,7 +4319,7 @@ packages:
       ajv: 6.12.6
       chalk: 4.1.2
       cross-spawn: 7.0.3
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       doctrine: 3.0.0
       escape-string-regexp: 4.0.0
       eslint-scope: 7.2.2
@@ -4463,12 +4604,6 @@ packages:
       moment: 2.29.4
     dev: false
 
-  /filelist@1.0.4:
-    resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
-    dependencies:
-      minimatch: 5.1.6
-    dev: true
-
   /fill-range@7.0.1:
     resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
     engines: {node: '>=8'}
@@ -4513,11 +4648,6 @@ packages:
       rimraf: 3.0.2
     dev: true
 
-  /flat@5.0.2:
-    resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
-    hasBin: true
-    dev: true
-
   /flatstr@1.0.12:
     resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==}
     dev: true
@@ -4642,10 +4772,6 @@ packages:
     dev: true
     optional: true
 
-  /fsu@1.1.1:
-    resolution: {integrity: sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==}
-    dev: true
-
   /function-bind@1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
 
@@ -4758,7 +4884,7 @@ packages:
     dependencies:
       basic-ftp: 5.0.3
       data-uri-to-buffer: 5.0.1
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       fs-extra: 8.1.0
     transitivePeerDependencies:
       - supports-color
@@ -4823,17 +4949,6 @@ packages:
       path-scurry: 1.10.1
     dev: true
 
-  /glob@7.2.0:
-    resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
-    dependencies:
-      fs.realpath: 1.0.0
-      inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 3.1.2
-      once: 1.4.0
-      path-is-absolute: 1.0.1
-    dev: true
-
   /glob@7.2.3:
     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
     dependencies:
@@ -4997,6 +5112,7 @@ packages:
   /has-flag@4.0.0:
     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
     engines: {node: '>=8'}
+    dev: true
 
   /has-property-descriptors@1.0.0:
     resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
@@ -5069,11 +5185,6 @@ packages:
     resolution: {integrity: sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==}
     dev: true
 
-  /he@1.2.0:
-    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
-    hasBin: true
-    dev: true
-
   /hidden-markov-model-tf@4.0.0(@tensorflow/tfjs-core@3.21.0):
     resolution: {integrity: sha512-q8VeBNCyQ5CNsUlbt4T5JXc+pUeKqq7LEGjs4HiH+thgZ2fuyJ9pf/V66ZFx9jZobXkwxVuQRWKZa3TwOFW+zw==}
     peerDependencies:
@@ -5135,7 +5246,7 @@ packages:
     dependencies:
       '@tootallnate/once': 1.1.2
       agent-base: 6.0.2
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
     optional: true
@@ -5145,7 +5256,7 @@ packages:
     engines: {node: '>= 14'}
     dependencies:
       agent-base: 7.1.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -5180,7 +5291,7 @@ packages:
     engines: {node: '>= 6'}
     dependencies:
       agent-base: 6.0.2
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
 
@@ -5189,7 +5300,7 @@ packages:
     engines: {node: '>= 14'}
     dependencies:
       agent-base: 7.1.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -5463,13 +5574,6 @@ packages:
       has-bigints: 1.0.2
     dev: true
 
-  /is-binary-path@2.1.0:
-    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
-    engines: {node: '>=8'}
-    dependencies:
-      binary-extensions: 2.2.0
-    dev: true
-
   /is-boolean-attribute@0.0.1:
     resolution: {integrity: sha512-0kXT52Scokg2Miscvsn5UVqg6y1691vcLJcagie1YHJB4zOEuAhMERLX992jtvaStGy2xQTqOtJhvmG/MK1T5w==}
     dev: true
@@ -5661,11 +5765,6 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
-  /is-plain-obj@2.1.0:
-    resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
-    engines: {node: '>=8'}
-    dev: true
-
   /is-plain-object@5.0.0:
     resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
     engines: {node: '>=0.10.0'}
@@ -5850,17 +5949,6 @@ packages:
       '@pkgjs/parseargs': 0.11.0
     dev: true
 
-  /jake@10.8.7:
-    resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dependencies:
-      async: 3.2.4
-      chalk: 4.1.2
-      filelist: 1.0.4
-      minimatch: 3.1.2
-    dev: true
-
   /jest-diff@29.7.0:
     resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -6068,7 +6156,7 @@ packages:
     dependencies:
       colorette: 2.0.19
       commander: 10.0.1
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       escalade: 3.1.1
       esm: 3.2.25
       get-package-type: 0.1.0
@@ -6146,7 +6234,7 @@ packages:
     dependencies:
       chalk: 5.3.0
       commander: 11.0.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       execa: 7.2.0
       lilconfig: 2.1.0
       listr2: 6.6.1
@@ -6234,18 +6322,10 @@ packages:
     resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
     dev: true
 
-  /lodash.isempty@4.4.0:
-    resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==}
-    dev: true
-
   /lodash.isfunction@3.0.9:
     resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==}
     dev: true
 
-  /lodash.isobject@3.0.2:
-    resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==}
-    dev: true
-
   /lodash.isplainobject@4.0.6:
     resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
     dev: true
@@ -6461,11 +6541,6 @@ packages:
       moment-timezone: 0.5.43
       please-upgrade-node: 3.2.0
 
-  /markdown@0.3.1:
-    resolution: {integrity: sha512-bf3LyP/7Y5WviTbaJvNtD1OXt07qn5HflK1boIpw4yCxNH1/apZBZ6wn2SkLtZ79U1lSltcQ+56PJDdUuwWYBQ==}
-    hasBin: true
-    dev: true
-
   /md5.js@1.3.5:
     resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
     dependencies:
@@ -6541,12 +6616,6 @@ packages:
       mime-db: 1.52.0
     dev: true
 
-  /mime@1.6.0:
-    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
-
   /mimic-fn@1.2.0:
     resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
     engines: {node: '>=4'}
@@ -6607,20 +6676,6 @@ packages:
     dependencies:
       brace-expansion: 1.1.11
 
-  /minimatch@5.0.1:
-    resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==}
-    engines: {node: '>=10'}
-    dependencies:
-      brace-expansion: 2.0.1
-    dev: true
-
-  /minimatch@5.1.6:
-    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
-    engines: {node: '>=10'}
-    dependencies:
-      brace-expansion: 2.0.1
-    dev: true
-
   /minimatch@7.4.6:
     resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==}
     engines: {node: '>=10'}
@@ -6797,70 +6852,6 @@ packages:
       obliterator: 2.0.4
     dev: false
 
-  /mocha@10.2.0:
-    resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==}
-    engines: {node: '>= 14.0.0'}
-    hasBin: true
-    dependencies:
-      ansi-colors: 4.1.1
-      browser-stdout: 1.3.1
-      chokidar: 3.5.3
-      debug: 4.3.4(supports-color@8.1.1)
-      diff: 5.0.0
-      escape-string-regexp: 4.0.0
-      find-up: 5.0.0
-      glob: 7.2.0
-      he: 1.2.0
-      js-yaml: 4.1.0
-      log-symbols: 4.1.0
-      minimatch: 5.0.1
-      ms: 2.1.3
-      nanoid: 3.3.3
-      serialize-javascript: 6.0.0
-      strip-json-comments: 3.1.1
-      supports-color: 8.1.1
-      workerpool: 6.2.1
-      yargs: 16.2.0
-      yargs-parser: 20.2.4
-      yargs-unparser: 2.0.0
-    dev: true
-
-  /mochawesome-report-generator@6.2.0:
-    resolution: {integrity: sha512-Ghw8JhQFizF0Vjbtp9B0i//+BOkV5OWcQCPpbO0NGOoxV33o+gKDYU0Pr2pGxkIHnqZ+g5mYiXF7GMNgAcDpSg==}
-    hasBin: true
-    dependencies:
-      chalk: 4.1.2
-      dateformat: 4.6.3
-      escape-html: 1.0.3
-      fs-extra: 10.1.0
-      fsu: 1.1.1
-      lodash.isfunction: 3.0.9
-      opener: 1.5.2
-      prop-types: 15.8.1
-      tcomb: 3.2.29
-      tcomb-validation: 3.4.1
-      validator: 13.11.0
-      yargs: 17.7.2
-    dev: true
-
-  /mochawesome@7.1.3(mocha@10.2.0):
-    resolution: {integrity: sha512-Vkb3jR5GZ1cXohMQQ73H3cZz7RoxGjjUo0G5hu0jLaW+0FdUxUwg3Cj29bqQdh0rFcnyV06pWmqmi5eBPnEuNQ==}
-    peerDependencies:
-      mocha: '>=7'
-    dependencies:
-      chalk: 4.1.2
-      diff: 5.1.0
-      json-stringify-safe: 5.0.1
-      lodash.isempty: 4.4.0
-      lodash.isfunction: 3.0.9
-      lodash.isobject: 3.0.2
-      lodash.isstring: 4.0.1
-      mocha: 10.2.0
-      mochawesome-report-generator: 6.2.0
-      strip-ansi: 6.0.1
-      uuid: 9.0.1
-    dev: true
-
   /module-deps@6.2.3:
     resolution: {integrity: sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==}
     engines: {node: '>= 0.8.0'}
@@ -6992,12 +6983,6 @@ packages:
       transform-ast: 2.4.4
     dev: true
 
-  /nanoid@3.3.3:
-    resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==}
-    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
-    hasBin: true
-    dev: true
-
   /nanoid@3.3.6:
     resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -7153,6 +7138,7 @@ packages:
     resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==}
     hasBin: true
     requiresBuild: true
+    dev: false
 
   /node-gyp@8.4.1:
     resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==}
@@ -7206,11 +7192,6 @@ packages:
       validate-npm-package-license: 3.0.4
     dev: true
 
-  /normalize-path@3.0.0:
-    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
   /normalize-url@8.0.0:
     resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
     engines: {node: '>=14.16'}
@@ -7372,11 +7353,6 @@ packages:
       is-wsl: 2.2.0
     dev: true
 
-  /opener@1.5.2:
-    resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
-    hasBin: true
-    dev: true
-
   /opn@5.5.0:
     resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==}
     engines: {node: '>=4'}
@@ -7408,11 +7384,6 @@ packages:
       type-check: 0.4.0
     dev: true
 
-  /options@0.0.6:
-    resolution: {integrity: sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==}
-    engines: {node: '>=0.4.0'}
-    dev: true
-
   /ora@5.4.1:
     resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
     engines: {node: '>=10'}
@@ -7534,7 +7505,7 @@ packages:
     dependencies:
       '@tootallnate/quickjs-emscripten': 0.23.0
       agent-base: 7.1.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       get-uri: 6.0.1
       http-proxy-agent: 7.0.0
       https-proxy-agent: 7.0.2
@@ -7853,14 +7824,6 @@ packages:
       iterate-value: 1.0.2
     dev: true
 
-  /prop-types@15.8.1:
-    resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
-    dependencies:
-      loose-envify: 1.4.0
-      object-assign: 4.1.1
-      react-is: 16.13.1
-    dev: true
-
   /proto-list@1.2.4:
     resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
     dev: true
@@ -7898,7 +7861,7 @@ packages:
     engines: {node: '>= 14'}
     dependencies:
       agent-base: 7.1.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       http-proxy-agent: 7.0.0
       https-proxy-agent: 7.0.2
       lru-cache: 7.18.3
@@ -8035,10 +7998,6 @@ packages:
       strip-json-comments: 2.0.1
     dev: true
 
-  /react-is@16.13.1:
-    resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
-    dev: true
-
   /react-is@18.2.0:
     resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
     dev: true
@@ -8094,13 +8053,6 @@ packages:
       string_decoder: 1.3.0
       util-deprecate: 1.0.2
 
-  /readdirp@3.6.0:
-    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
-    engines: {node: '>=8.10.0'}
-    dependencies:
-      picomatch: 2.3.1
-    dev: true
-
   /rechoir@0.6.2:
     resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
     engines: {node: '>= 0.10'}
@@ -8366,21 +8318,6 @@ packages:
       inherits: 2.0.4
     dev: true
 
-  /robohydra@0.6.9(bufferutil@4.0.7)(utf-8-validate@6.0.3):
-    resolution: {integrity: sha512-kSLoeDBfnGnIkln+nmyfWPHsQSOPz9K/Lb0CDWvCj70Af6K4R5qM54q6DW/IeUUxJY7pI6zi5rHNQZCZnWgfgw==}
-    hasBin: true
-    dependencies:
-      commander: 2.20.3
-      ejs: 3.1.9
-      markdown: 0.3.1
-      mime: 1.6.0
-      qs: 6.11.2
-      ws: 1.1.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)
-    transitivePeerDependencies:
-      - bufferutil
-      - utf-8-validate
-    dev: true
-
   /rollup-plugin-analyzer@4.0.0:
     resolution: {integrity: sha512-LL9GEt3bkXp6Wa19SNR5MWcvHNMvuTFYg+eYBZN2OIFhSWN+pEJUQXEKu5BsOeABob3x9PDaLKW7w5iOJnsESQ==}
     engines: {node: '>=8.0.0'}
@@ -8509,12 +8446,6 @@ packages:
     dependencies:
       lru-cache: 6.0.0
 
-  /serialize-javascript@6.0.0:
-    resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
-    dependencies:
-      randombytes: 2.1.0
-    dev: true
-
   /serialize-javascript@6.0.1:
     resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==}
     dependencies:
@@ -8669,7 +8600,7 @@ packages:
     requiresBuild: true
     dependencies:
       agent-base: 6.0.2
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       socks: 2.7.1
     transitivePeerDependencies:
       - supports-color
@@ -8680,7 +8611,7 @@ packages:
     engines: {node: '>= 14'}
     dependencies:
       agent-base: 7.1.0
-      debug: 4.3.4(supports-color@8.1.1)
+      debug: 4.3.4
       socks: 2.7.1
     transitivePeerDependencies:
       - supports-color
@@ -9107,12 +9038,6 @@ packages:
       has-flag: 4.0.0
     dev: true
 
-  /supports-color@8.1.1:
-    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
-    engines: {node: '>=10'}
-    dependencies:
-      has-flag: 4.0.0
-
   /supports-preserve-symlinks-flag@1.0.0:
     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
     engines: {node: '>= 0.4'}
@@ -9155,16 +9080,6 @@ packages:
     resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==}
     engines: {node: '>=8.0.0'}
 
-  /tcomb-validation@3.4.1:
-    resolution: {integrity: sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==}
-    dependencies:
-      tcomb: 3.2.29
-    dev: true
-
-  /tcomb@3.2.29:
-    resolution: {integrity: sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==}
-    dev: true
-
   /terser@4.8.1:
     resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==}
     engines: {node: '>=6.0.0'}
@@ -9329,37 +9244,6 @@ packages:
       code-block-writer: 12.0.0
     dev: false
 
-  /ts-node@10.9.1(@types/node@20.5.1)(typescript@5.2.2):
-    resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
-    hasBin: true
-    peerDependencies:
-      '@swc/core': '>=1.2.50'
-      '@swc/wasm': '>=1.2.50'
-      '@types/node': '*'
-      typescript: '>=2.7'
-    peerDependenciesMeta:
-      '@swc/core':
-        optional: true
-      '@swc/wasm':
-        optional: true
-    dependencies:
-      '@cspotcode/source-map-support': 0.8.1
-      '@tsconfig/node10': 1.0.9
-      '@tsconfig/node12': 1.0.11
-      '@tsconfig/node14': 1.0.3
-      '@tsconfig/node16': 1.0.4
-      '@types/node': 20.5.1
-      acorn: 8.10.0
-      acorn-walk: 8.2.0
-      arg: 4.1.3
-      create-require: 1.1.1
-      diff: 4.0.2
-      make-error: 1.3.6
-      typescript: 5.2.2
-      v8-compile-cache-lib: 3.0.1
-      yn: 3.1.1
-    dev: true
-
   /ts-node@10.9.1(@types/node@20.7.1)(typescript@5.2.2):
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
@@ -9416,6 +9300,17 @@ packages:
   /tslib@2.6.2:
     resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
 
+  /tsx@3.13.0:
+    resolution: {integrity: sha512-rjmRpTu3as/5fjNq/kOkOtihgLxuIz6pbKdj9xwP4J5jOLkBxw/rjN5ANw+KyrrOXV5uB7HC8+SrrSJxT65y+A==}
+    hasBin: true
+    dependencies:
+      esbuild: 0.18.20
+      get-tsconfig: 4.7.2
+      source-map-support: 0.5.21
+    optionalDependencies:
+      fsevents: 2.3.3
+    dev: true
+
   /ttest@3.0.0:
     resolution: {integrity: sha512-bLo+LdYokiDZHVFIWJmC5afoh7wZ+o1h++0XXKh01+yprzz8CnaiGNcbcbqP0e3+iyDqclLI+rM0j/9AwmRljw==}
     dependencies:
@@ -9578,10 +9473,6 @@ packages:
     dev: true
     optional: true
 
-  /ultron@1.0.2:
-    resolution: {integrity: sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==}
-    dev: true
-
   /umd@3.0.3:
     resolution: {integrity: sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==}
     hasBin: true
@@ -9736,6 +9627,7 @@ packages:
     requiresBuild: true
     dependencies:
       node-gyp-build: 4.6.1
+    dev: false
 
   /util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -9789,11 +9681,6 @@ packages:
       spdx-expression-parse: 3.0.1
     dev: true
 
-  /validator@13.11.0:
-    resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==}
-    engines: {node: '>= 0.10'}
-    dev: true
-
   /varint@5.0.0:
     resolution: {integrity: sha512-gC13b/bWrqQoKY2EmROCZ+AR0jitc6DnDGaQ6Ls9QpKmuSgJB1eQ7H3KETtQm7qSdMWMKCmsshyCmUwMLh3OAA==}
     dev: true
@@ -9969,10 +9856,6 @@ packages:
     resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
     dev: true
 
-  /workerpool@6.2.1:
-    resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==}
-    dev: true
-
   /wrap-ansi@5.1.0:
     resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==}
     engines: {node: '>=6'}
@@ -10022,23 +9905,6 @@ packages:
       typedarray-to-buffer: 3.1.5
     dev: true
 
-  /ws@1.1.5(bufferutil@4.0.7)(utf-8-validate@6.0.3):
-    resolution: {integrity: sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: ^5.0.2
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
-    dependencies:
-      bufferutil: 4.0.7
-      options: 0.0.6
-      ultron: 1.0.2
-      utf-8-validate: 6.0.3
-    dev: true
-
   /ws@8.14.2(bufferutil@4.0.7)(utf-8-validate@6.0.3):
     resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==}
     engines: {node: '>=10.0.0'}
@@ -10094,11 +9960,6 @@ packages:
       decamelize: 1.2.0
     dev: true
 
-  /yargs-parser@20.2.4:
-    resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
-    engines: {node: '>=10'}
-    dev: true
-
   /yargs-parser@20.2.9:
     resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
     engines: {node: '>=10'}
@@ -10109,16 +9970,6 @@ packages:
     engines: {node: '>=12'}
     dev: true
 
-  /yargs-unparser@2.0.0:
-    resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
-    engines: {node: '>=10'}
-    dependencies:
-      camelcase: 6.3.0
-      decamelize: 4.0.0
-      flat: 5.0.2
-      is-plain-obj: 2.1.0
-    dev: true
-
   /yargs@14.2.3:
     resolution: {integrity: sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==}
     dependencies:
@@ -10135,19 +9986,6 @@ packages:
       yargs-parser: 15.0.3
     dev: true
 
-  /yargs@16.2.0:
-    resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
-    engines: {node: '>=10'}
-    dependencies:
-      cliui: 7.0.4
-      escalade: 3.1.1
-      get-caller-file: 2.0.5
-      require-directory: 2.1.1
-      string-width: 4.2.3
-      y18n: 5.0.8
-      yargs-parser: 20.2.9
-    dev: true
-
   /yargs@17.7.2:
     resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
     engines: {node: '>=12'}
diff --git a/test/robohydra/config.json b/test/robohydra/config.json
deleted file mode 100644 (file)
index abd684f..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "pluginLoadPaths": ["test/robohydra/plugins"],
-  "plugins": ["logger", "wsServer"]
-}
diff --git a/test/robohydra/messages.txt b/test/robohydra/messages.txt
deleted file mode 100644 (file)
index 88e1218..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-GetDiagnostics:
-  curl -d '[2,"123456789","GetDiagnostics",{"location":"ftp://localhost"}]' -H "Content-Type: application/json" -X POST http://localhost:3000/message
-TriggerMessage:
-  curl -d '[2,"123456789","TriggerMessage",{"requestedMessage":"BootNotification"}]' -H "Content-Type: application/json" -X POST http://localhost:3000/message
-  curl -d '[2,"123456789","TriggerMessage",{"requestedMessage":"HeartBeat"}]' -H "Content-Type: application/json" -X POST http://localhost:3000/message
-UpdateFirmware:
-  curl -d '[2,"123456789","UpdateFirmware",{"location":"ftp://localhost","retrieveDate":"2019-01-01T00:00:00.000Z"}]' -H "Content-Type: application/json" -X POST http://localhost:3000/message
diff --git a/test/robohydra/plugins/wsServer/index.js b/test/robohydra/plugins/wsServer/index.js
deleted file mode 100644 (file)
index dfb4268..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// eslint-disable-next-line n/no-unpublished-require
-const RoboHydra = require('robohydra');
-const RoboHydraHead = RoboHydra.heads.RoboHydraHead;
-const RoboHydraWebSocketHead = RoboHydra.heads.RoboHydraWebSocketHead;
-const RoboHydraWebSocketHeadProxy = RoboHydra.heads.RoboHydraWebSocketHeadProxy;
-
-// eslint-disable-next-line no-unused-vars
-exports.getBodyParts = function (conf) {
-  let wsSocket;
-  return {
-    heads: [
-      new RoboHydraHead({
-        name: 'message',
-        path: '/message',
-        method: 'POST',
-        handler: function (req, res) {
-          const msg = JSON.stringify(req.body);
-          if (wsSocket) {
-            wsSocket.send(msg);
-            res.send('Message sent');
-          } else {
-            res.send('Cannot send message, no opened websocket found');
-          }
-        },
-      }),
-
-      new RoboHydraHead({
-        name: 'close',
-        path: '/close',
-        method: 'GET',
-        handler: function (req, res) {
-          if (wsSocket) {
-            wsSocket.close();
-            res.send('Websocket closed');
-          } else {
-            res.send('Cannot close websocket, no opened websocket found');
-          }
-        },
-      }),
-
-      new RoboHydraWebSocketHeadProxy({
-        name: 'proxy',
-        mountPath: '/proxy',
-        proxyTo: 'ws://server.example.com',
-        preProcessor: function (data) {
-          console.info(`From the client: ${data}`);
-        },
-        postProcessor: function (data) {
-          console.info(`From the server: ${data}`);
-        },
-      }),
-
-      new RoboHydraWebSocketHead({
-        name: 'WS Server',
-        path: '/.*',
-        handler: function (req, socket) {
-          wsSocket = socket;
-        },
-      }),
-    ],
-  };
-};
index 34839dcb7b90b0dafe2c6837ebd092cdfb3858b7..90404f87c7541844767923ed5cf7e9d1fb7baa09 100644 (file)
@@ -1,24 +1,26 @@
+import { describe, it } from 'node:test';
+
 import { expect } from 'expect';
 
 import { CircularArray, DEFAULT_CIRCULAR_ARRAY_SIZE } from '../../src/utils/CircularArray';
 
-describe('CircularArray test suite', () => {
-  it('Verify that circular array can be instantiated', () => {
+await describe('CircularArray test suite', async () => {
+  await it('Verify that circular array can be instantiated', () => {
     const circularArray = new CircularArray();
     expect(circularArray).toBeInstanceOf(CircularArray);
   });
 
-  it('Verify circular array default size at instance creation', () => {
+  await it('Verify circular array default size at instance creation', () => {
     const circularArray = new CircularArray();
     expect(circularArray.size).toBe(DEFAULT_CIRCULAR_ARRAY_SIZE);
   });
 
-  it('Verify that circular array size can be set at instance creation', () => {
+  await it('Verify that circular array size can be set at instance creation', () => {
     const circularArray = new CircularArray(1000);
     expect(circularArray.size).toBe(1000);
   });
 
-  it('Verify that circular array size and items can be set at instance creation', () => {
+  await it('Verify that circular array size and items can be set at instance creation', () => {
     let circularArray = new CircularArray(1000, 1, 2, 3, 4, 5);
     expect(circularArray.size).toBe(1000);
     expect(circularArray.length).toBe(5);
@@ -27,7 +29,7 @@ describe('CircularArray test suite', () => {
     expect(circularArray.length).toBe(4);
   });
 
-  it('Verify that circular array size is valid at instance creation', () => {
+  await it('Verify that circular array size is valid at instance creation', () => {
     expect(() => new CircularArray(0.25)).toThrowError(
       new TypeError('Invalid circular array size: 0.25 is not a safe integer'),
     );
@@ -41,17 +43,17 @@ describe('CircularArray test suite', () => {
     );
   });
 
-  it('Verify that circular array empty works as intended', () => {
+  await it('Verify that circular array empty works as intended', () => {
     const circularArray = new CircularArray();
     expect(circularArray.empty()).toBe(true);
   });
 
-  it('Verify that circular array full works as intended', () => {
+  await it('Verify that circular array full works as intended', () => {
     const circularArray = new CircularArray(5, 1, 2, 3, 4, 5);
     expect(circularArray.full()).toBe(true);
   });
 
-  it('Verify that circular array push works as intended', () => {
+  await it('Verify that circular array push works as intended', () => {
     let circularArray = new CircularArray(4);
     let arrayLength = circularArray.push(1, 2, 3, 4, 5);
     expect(arrayLength).toBe(circularArray.size);
@@ -69,7 +71,7 @@ describe('CircularArray test suite', () => {
     expect(circularArray).toStrictEqual(new CircularArray(100, 1, 2, 3, 4, 5));
   });
 
-  it('Verify that circular array splice works as intended', () => {
+  await it('Verify that circular array splice works as intended', () => {
     let circularArray = new CircularArray(1000, 1, 2, 3, 4, 5);
     let deletedItems = circularArray.splice(2);
     expect(deletedItems).toStrictEqual(new CircularArray(3, 3, 4, 5));
@@ -87,7 +89,7 @@ describe('CircularArray test suite', () => {
     expect(circularArray).toStrictEqual(new CircularArray(4, 2, 5, 6, 4));
   });
 
-  it('Verify that circular array concat works as intended', () => {
+  await it('Verify that circular array concat works as intended', () => {
     let circularArray = new CircularArray(5, 1, 2, 3, 4, 5);
     circularArray = circularArray.concat(6, 7);
     expect(circularArray.length).toBe(5);
@@ -98,7 +100,7 @@ describe('CircularArray test suite', () => {
     expect(circularArray).toStrictEqual(new CircularArray(1, 7));
   });
 
-  it('Verify that circular array unshift works as intended', () => {
+  await it('Verify that circular array unshift works as intended', () => {
     let circularArray = new CircularArray(5, 1, 2, 3, 4, 5);
     let arrayLength = circularArray.unshift(6, 7);
     expect(arrayLength).toBe(5);
@@ -111,7 +113,7 @@ describe('CircularArray test suite', () => {
     expect(circularArray).toStrictEqual(new CircularArray(1, 6));
   });
 
-  it('Verify that circular array resize works as intended', () => {
+  await it('Verify that circular array resize works as intended', () => {
     expect(() => new CircularArray().resize(0.25)).toThrowError(
       new TypeError('Invalid circular array size: 0.25 is not a safe integer'),
     );
index 6fb3048873608ae896cfb23ecace504f00f7c7b6..d9aadf0c5e77426f6170104799048ba79533c426 100644 (file)
@@ -1,23 +1,25 @@
+import { describe, it } from 'node:test';
+
 import { expect } from 'expect';
 
 import { average, median, nthPercentile, stdDeviation } from '../../src/utils/StatisticUtils';
 
-describe('StatisticUtils test suite', () => {
-  it('Verify average()', () => {
+await describe('StatisticUtils test suite', async () => {
+  await it('Verify average()', () => {
     expect(average([])).toBe(0);
     expect(average([0.08])).toBe(0.08);
     expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.1642857142857146);
     expect(average([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.8533333333333335);
   });
 
-  it('Verify median()', () => {
+  await it('Verify median()', () => {
     expect(median([])).toBe(0);
     expect(median([0.08])).toBe(0.08);
     expect(median([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(3.05);
     expect(median([0.25, 4.75, 3.05, 6.04, 1.01, 2.02])).toBe(2.535);
   });
 
-  it('Verify nthPercentile()', () => {
+  await it('Verify nthPercentile()', () => {
     expect(nthPercentile([], 25)).toBe(0);
     expect(nthPercentile([0.08], 50)).toBe(0.08);
     const array0 = [0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03];
@@ -30,7 +32,7 @@ describe('StatisticUtils test suite', () => {
     expect(nthPercentile(array0, 100)).toBe(6.04);
   });
 
-  it('Verify stdDeviation()', () => {
+  await it('Verify stdDeviation()', () => {
     expect(stdDeviation([0.25, 4.75, 3.05, 6.04, 1.01, 2.02, 5.03])).toBe(2.0256064851429216);
   });
 });
index 1e0cff5a9d2a77ad7704e29d2387321aa32ee08c..5592e68f3800d40ea888af761b5a4d1e98fb48d8 100644 (file)
@@ -1,3 +1,5 @@
+import { describe, it } from 'node:test';
+
 import { hoursToMilliseconds, hoursToSeconds } from 'date-fns';
 import { expect } from 'expect';
 
@@ -35,8 +37,8 @@ import {
   validateUUID,
 } from '../../src/utils/Utils';
 
-describe('Utils test suite', () => {
-  it('Verify generateUUID()/validateUUID()', () => {
+await describe('Utils test suite', async () => {
+  await it('Verify generateUUID()/validateUUID()', () => {
     const uuid = generateUUID();
     expect(uuid).toBeDefined();
     expect(uuid.length).toEqual(36);
@@ -48,26 +50,26 @@ describe('Utils test suite', () => {
     expect(validateUUID('987FBC9-4BED-3078-CF07A-9141BA07C9F3')).toBe(false);
   });
 
-  it('Verify sleep()', async () => {
+  await it('Verify sleep()', async () => {
     const start = performance.now();
     await sleep(1000);
     const stop = performance.now();
     expect(stop - start).toBeGreaterThanOrEqual(1000);
   });
 
-  it('Verify formatDurationMilliSeconds()', () => {
+  await it('Verify formatDurationMilliSeconds()', () => {
     expect(formatDurationMilliSeconds(0)).toBe('');
     expect(formatDurationMilliSeconds(1000)).toBe('1 second');
     expect(formatDurationMilliSeconds(hoursToMilliseconds(4380))).toBe('182 days 12 hours');
   });
 
-  it('Verify formatDurationSeconds()', () => {
+  await it('Verify formatDurationSeconds()', () => {
     expect(formatDurationSeconds(0)).toBe('');
     expect(formatDurationSeconds(1)).toBe('1 second');
     expect(formatDurationSeconds(hoursToSeconds(4380))).toBe('182 days 12 hours');
   });
 
-  it('Verify isValidTime()', () => {
+  await it('Verify isValidTime()', () => {
     expect(isValidTime(undefined)).toBe(false);
     expect(isValidTime(null)).toBe(false);
     expect(isValidTime('')).toBe(false);
@@ -85,7 +87,7 @@ describe('Utils test suite', () => {
     expect(isValidTime(new Date())).toBe(true);
   });
 
-  it('Verify convertToDate()', () => {
+  await it('Verify convertToDate()', () => {
     expect(convertToDate(undefined)).toBe(undefined);
     expect(() => convertToDate('')).toThrowError(new Error("Cannot convert to date: ''"));
     expect(() => convertToDate('00:70:61')).toThrowError(
@@ -102,7 +104,7 @@ describe('Utils test suite', () => {
     expect(date).toStrictEqual(new Date(dateStr));
   });
 
-  it('Verify convertToInt()', () => {
+  await it('Verify convertToInt()', () => {
     expect(convertToInt(undefined)).toBe(0);
     expect(convertToInt(null)).toBe(0);
     expect(convertToInt(0)).toBe(0);
@@ -123,7 +125,7 @@ describe('Utils test suite', () => {
     }).toThrow("Cannot convert to integer: 'NaN'");
   });
 
-  it('Verify convertToFloat()', () => {
+  await it('Verify convertToFloat()', () => {
     expect(convertToFloat(undefined)).toBe(0);
     expect(convertToFloat(null)).toBe(0);
     expect(convertToFloat(0)).toBe(0);
@@ -144,7 +146,7 @@ describe('Utils test suite', () => {
     }).toThrow("Cannot convert to float: 'NaN'");
   });
 
-  it('Verify convertToBoolean()', () => {
+  await it('Verify convertToBoolean()', () => {
     expect(convertToBoolean(undefined)).toBe(false);
     expect(convertToBoolean(null)).toBe(false);
     expect(convertToBoolean('true')).toBe(true);
@@ -161,14 +163,14 @@ describe('Utils test suite', () => {
     expect(convertToBoolean('NoNBoolean')).toBe(false);
   });
 
-  it('Verify secureRandom()', () => {
+  await it('Verify secureRandom()', () => {
     const random = secureRandom();
     expect(typeof random === 'number').toBe(true);
     expect(random).toBeGreaterThanOrEqual(0);
     expect(random).toBeLessThan(1);
   });
 
-  it('Verify getRandomInteger()', () => {
+  await it('Verify getRandomInteger()', () => {
     let randomInteger = getRandomInteger();
     expect(Number.isSafeInteger(randomInteger)).toBe(true);
     expect(randomInteger).toBeGreaterThanOrEqual(0);
@@ -198,7 +200,7 @@ describe('Utils test suite', () => {
     expect(randomInteger).toBeGreaterThanOrEqual(Math.ceil(minimum));
   });
 
-  it('Verify roundTo()', () => {
+  await it('Verify roundTo()', () => {
     expect(roundTo(0, 2)).toBe(0);
     expect(roundTo(0.5, 0)).toBe(1);
     expect(roundTo(0.5, 2)).toBe(0.5);
@@ -213,7 +215,7 @@ describe('Utils test suite', () => {
     expect(roundTo(-5.015, 2)).toBe(-5.02);
   });
 
-  it('Verify getRandomFloat()', () => {
+  await it('Verify getRandomFloat()', () => {
     let randomFloat = getRandomFloat();
     expect(typeof randomFloat === 'number').toBe(true);
     expect(randomFloat).toBeGreaterThanOrEqual(0);
@@ -228,7 +230,7 @@ describe('Utils test suite', () => {
     expect(randomFloat).toBeLessThanOrEqual(0);
   });
 
-  it('Verify extractTimeSeriesValues()', () => {
+  await it('Verify extractTimeSeriesValues()', () => {
     expect(extractTimeSeriesValues([])).toEqual([]);
     expect(extractTimeSeriesValues([{ timestamp: Date.now(), value: 1.1 }])).toEqual([1.1]);
     expect(
@@ -239,7 +241,7 @@ describe('Utils test suite', () => {
     ).toEqual([1.1, 2.2]);
   });
 
-  it('Verify isObject()', () => {
+  await it('Verify isObject()', () => {
     expect(isObject('test')).toBe(false);
     expect(isObject(undefined)).toBe(false);
     expect(isObject(null)).toBe(false);
@@ -256,7 +258,7 @@ describe('Utils test suite', () => {
     expect(isObject(new WeakSet())).toBe(true);
   });
 
-  it('Verify cloneObject()', () => {
+  await it('Verify cloneObject()', () => {
     const obj = { 1: 1 };
     expect(cloneObject(obj)).toStrictEqual(obj);
     expect(cloneObject(obj) === obj).toBe(false);
@@ -285,7 +287,7 @@ describe('Utils test suite', () => {
     expect(cloneObject(weakSet)).toStrictEqual({});
   });
 
-  it('Verify hasOwnProp()', () => {
+  await it('Verify hasOwnProp()', () => {
     expect(hasOwnProp('test', '')).toBe(false);
     expect(hasOwnProp(undefined, '')).toBe(false);
     expect(hasOwnProp(null, '')).toBe(false);
@@ -301,7 +303,7 @@ describe('Utils test suite', () => {
     expect(hasOwnProp({ '1': '1' }, 2)).toBe(false);
   });
 
-  it('Verify isIterable()', () => {
+  await it('Verify isIterable()', () => {
     expect(isIterable('')).toBe(true);
     expect(isIterable(' ')).toBe(true);
     expect(isIterable('test')).toBe(true);
@@ -316,7 +318,7 @@ describe('Utils test suite', () => {
     expect(isIterable(new WeakSet())).toBe(false);
   });
 
-  it('Verify isEmptyString()', () => {
+  await it('Verify isEmptyString()', () => {
     expect(isEmptyString('')).toBe(true);
     expect(isEmptyString(' ')).toBe(true);
     expect(isEmptyString('     ')).toBe(true);
@@ -334,7 +336,7 @@ describe('Utils test suite', () => {
     expect(isEmptyString(new WeakSet())).toBe(false);
   });
 
-  it('Verify isNotEmptyString()', () => {
+  await it('Verify isNotEmptyString()', () => {
     expect(isNotEmptyString('')).toBe(false);
     expect(isNotEmptyString(' ')).toBe(false);
     expect(isNotEmptyString('     ')).toBe(false);
@@ -352,7 +354,7 @@ describe('Utils test suite', () => {
     expect(isNotEmptyString(new WeakSet())).toBe(false);
   });
 
-  it('Verify isUndefined()', () => {
+  await it('Verify isUndefined()', () => {
     expect(isUndefined(undefined)).toBe(true);
     expect(isUndefined(null)).toBe(false);
     expect(isUndefined('')).toBe(false);
@@ -365,7 +367,7 @@ describe('Utils test suite', () => {
     expect(isUndefined(new WeakSet())).toBe(false);
   });
 
-  it('Verify isNullOrUndefined()', () => {
+  await it('Verify isNullOrUndefined()', () => {
     expect(isNullOrUndefined(undefined)).toBe(true);
     expect(isNullOrUndefined(null)).toBe(true);
     expect(isNullOrUndefined('')).toBe(false);
@@ -378,7 +380,7 @@ describe('Utils test suite', () => {
     expect(isNullOrUndefined(new WeakSet())).toBe(false);
   });
 
-  it('Verify isEmptyArray()', () => {
+  await it('Verify isEmptyArray()', () => {
     expect(isEmptyArray([])).toBe(true);
     expect(isEmptyArray([1, 2])).toBe(false);
     expect(isEmptyArray(['1', '2'])).toBe(false);
@@ -394,7 +396,7 @@ describe('Utils test suite', () => {
     expect(isEmptyArray(new WeakSet())).toBe(false);
   });
 
-  it('Verify isNotEmptyArray()', () => {
+  await it('Verify isNotEmptyArray()', () => {
     expect(isNotEmptyArray([])).toBe(false);
     expect(isNotEmptyArray([1, 2])).toBe(true);
     expect(isNotEmptyArray(['1', '2'])).toBe(true);
@@ -410,7 +412,7 @@ describe('Utils test suite', () => {
     expect(isNotEmptyArray(new WeakSet())).toBe(false);
   });
 
-  it('Verify isEmptyObject()', () => {
+  await it('Verify isEmptyObject()', () => {
     expect(isEmptyObject({})).toBe(true);
     expect(isEmptyObject({ 1: 1, 2: 2 })).toBe(false);
     expect(isEmptyObject(new Map())).toBe(false);
@@ -419,7 +421,7 @@ describe('Utils test suite', () => {
     expect(isEmptyObject(new WeakSet())).toBe(false);
   });
 
-  it('Verify isArraySorted()', () => {
+  await it('Verify isArraySorted()', () => {
     expect(
       isArraySorted([], (a, b) => {
         return a - b;
@@ -435,7 +437,7 @@ describe('Utils test suite', () => {
     expect(isArraySorted<number>([2, 1, 3, 4, 5], (a, b) => a - b)).toBe(false);
   });
 
-  it('Verify once()', () => {
+  await it('Verify once()', () => {
     let called = 0;
     const fn = () => ++called;
     const onceFn = once(fn, this);
@@ -450,7 +452,7 @@ describe('Utils test suite', () => {
     expect(result3).toBe(1);
   });
 
-  it('Verify min()', () => {
+  await it('Verify min()', () => {
     expect(min()).toBe(Infinity);
     expect(min(0, 1)).toBe(0);
     expect(min(1, 0)).toBe(0);
@@ -458,7 +460,7 @@ describe('Utils test suite', () => {
     expect(min(-1, 0)).toBe(-1);
   });
 
-  it('Verify max()', () => {
+  await it('Verify max()', () => {
     expect(max()).toBe(-Infinity);
     expect(max(0, 1)).toBe(1);
     expect(max(1, 0)).toBe(1);