This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 3937cee5b59640ca8fb38b08cfaffef01682505c
Merge: a855ac9111 d10f8dc7fd
Author: Stephen Mallette <[email protected]>
AuthorDate: Tue Mar 10 13:39:56 2026 -0400

    Merge branch '3.8-dev'

 .../javascript/gremlin-javascript/.eslintrc.cjs    |  153 -
 .../javascript/gremlin-javascript/.prettierrc.cjs  |    2 +
 .../gremlin-javascript/eslint.config.mjs           |  158 +
 .../gremlin-javascript/lib/driver/connection.ts    |   18 +-
 .../lib/structure/io/type-serializers.ts           |    6 +-
 .../gremlin-javascript/package-lock.json           | 7053 ++++----------------
 .../javascript/gremlin-javascript/package.json     |   13 +-
 7 files changed, 1621 insertions(+), 5782 deletions(-)

diff --cc 
gremlin-javascript/src/main/javascript/gremlin-javascript/.prettierrc.cjs
index 0089c99080,0089c99080..ee3649f073
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/.prettierrc.cjs
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/.prettierrc.cjs
@@@ -17,6 -17,6 +17,8 @@@
   *  under the License.
   */
  
++'use strict';
++
  module.exports = {
    singleQuote: true,
    printWidth: 120,
diff --cc 
gremlin-javascript/src/main/javascript/gremlin-javascript/eslint.config.mjs
index 0000000000,ee52caf2f0..21b421951d
mode 000000,100644..100644
--- 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/eslint.config.mjs
+++ 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/eslint.config.mjs
@@@ -1,0 -1,143 +1,158 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *  http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
+ 
+ import js from "@eslint/js";
+ import prettier from "eslint-config-prettier";
+ import prettierPlugin from "eslint-plugin-prettier";
+ import globals from "globals";
+ 
+ export default [
+   js.configs.recommended,
+   prettier,
+   {
+     plugins: {
+       prettier: prettierPlugin,
+     },
+     languageOptions: {
+       ecmaVersion: 2022,
 -      sourceType: "commonjs",
++      sourceType: "module",
+       globals: {
+         ...globals.node,
+         ...globals.commonjs,
+         ...globals.mocha,
+         BigInt: "readonly",
+       },
+     },
+     rules: {
+       "prettier/prettier": ["error", { endOfLine: "auto" }],
+       "linebreak-style": 0,
+       quotes: ["error", "single"],
+       semi: ["error", "always"],
+       "no-constant-condition": ["error", { checkLoops: false }],
+       strict: ["error", "global"],
+       "array-callback-return": "error",
+       curly: "error",
+       "no-unused-vars": ["error", { args: "none" }],
+       "global-require": "error",
+       eqeqeq: ["error", "allow-null"],
+       "guard-for-in": "error",
+       "no-alert": "error",
+       "no-caller": "error",
+       "no-case-declarations": "error",
+       "no-else-return": "error",
+       "no-empty-pattern": "error",
+       "no-eval": "error",
+       "no-extend-native": "error",
+       "no-extra-bind": "error",
+       "no-extra-label": "error",
+       "no-floating-decimal": "error",
+       "no-global-assign": ["error", { exceptions: [] }],
+       "no-implicit-coercion": [
+         "off",
+         {
+           boolean: false,
+           number: true,
+           string: true,
+           allow: [],
+         },
+       ],
+       "no-implied-eval": "error",
+       "no-labels": ["error", { allowLoop: false, allowSwitch: false }],
+       "no-lone-blocks": "error",
+       "no-loop-func": "error",
+       "no-multi-spaces": "error",
+       "no-new": "error",
+       "no-new-func": "error",
+       "no-new-wrappers": "error",
+       "no-octal-escape": "error",
+       "no-proto": "error",
+       "no-prototype-builtins": 0,
+       "no-redeclare": "error",
+       "no-restricted-properties": [
+         "error",
+         {
+           object: "arguments",
+           property: "callee",
+           message: "arguments.callee is deprecated",
+         },
+         {
+           property: "__defineGetter__",
+           message: "Please use Object.defineProperty instead.",
+         },
+         {
+           property: "__defineSetter__",
+           message: "Please use Object.defineProperty instead.",
+         },
+       ],
+       "no-self-assign": "error",
+       "no-self-compare": "error",
+       "no-sequences": "error",
+       "no-throw-literal": "error",
+       "no-unmodified-loop-condition": "off",
+       "no-unused-expressions": [
+         "error",
+         {
+           allowShortCircuit: false,
+           allowTernary: false,
+         },
+       ],
+       "no-useless-call": "off",
+       "no-useless-concat": "error",
+       "no-useless-escape": "error",
+       "no-useless-return": "error",
+       "no-void": "error",
+       "no-with": "error",
+       "no-buffer-constructor": "error",
+       radix: "error",
+       "no-var": "error",
+       "prefer-const": "error",
+       "arrow-body-style": ["error", "as-needed"],
+       "arrow-spacing": "error",
+       "no-confusing-arrow": ["error", { allowParens: true }],
+       yoda: "error",
+       "constructor-super": "error",
+       "require-await": "error",
+       "require-atomic-updates": "off",
+     },
+   },
+   {
 -    ignores: ["test/**/*.js", "doc/**/*.js", "node_modules/**/*", 
".prettierrc.js", "eslint.config.mjs"],
++    ignores: [
++      "build/**/*",
++      "test/**/*.js",
++      "doc/**/*.js",
++      "node_modules/**/*",
++      "eslint.config.mjs",
++    ],
++  },
++  {
++    files: ["**/*.cjs"],
++    languageOptions: {
++      sourceType: "commonjs",
++    },
++    rules: {
++      strict: ["error", "safe"],
++    },
+   },
+   {
+     files: ["eslint.config.mjs"],
+     languageOptions: {
+       sourceType: "module",
+     },
+   },
+ ];
diff --cc 
gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.ts
index dc4c9804b9,b7973b96ae..1041de42fa
--- 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.ts
+++ 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/driver/connection.ts
@@@ -196,15 -148,15 +196,14 @@@ export default class Connection extend
      this._ws = new WebSocket(
        this.url,
        !useGlobalWebSocket
--        ? {
-             // @ts-expect-error
++        ? ({
              headers: headers,
              ca: this.options.ca,
              cert: this.options.cert,
              pfx: this.options.pfx,
              rejectUnauthorized: this.options.rejectUnauthorized,
              agent: this.options.agent,
 -            perMessageDeflate: this._enableCompression,
--          }
++          } as any)
          : undefined,
      );
  
@@@ -212,24 -164,17 +211,19 @@@
        this._ws.binaryType = 'arraybuffer';
      }
  
-     // @ts-expect-error
 -    this._ws.addEventListener('open', this.#handleOpen);
 -    this._ws.addEventListener('error', this.#handleError);
 -    // Only attach unexpected-response listener if WebSocket supports .on() 
method
 +    this._ws!.addEventListener('open', this.#handleOpen);
-     // @ts-expect-error
 +    this._ws!.addEventListener('error', this.#handleError);
 +    // Only attach unexpected-response listener for Node.js WebSocket (ws 
package)
      // Browser WebSocket does not have this event and .on() method
 -    if (this._ws && 'on' in this._ws) {
 +    if (!useGlobalWebSocket) {
        // The following listener needs to use `.on` and `.off` because the 
`ws` package's addEventListener only accepts certain event types
        // Ref: 
https://github.com/websockets/ws/blob/8.16.0/lib/event-target.js#L202-L241
-       // @ts-expect-error
-       this._ws!.on('unexpected-response', this.#handleUnexpectedResponse);
 -      this._ws.on('unexpected-response', this.#handleUnexpectedResponse);
++      (this._ws! as NodeWebSocket).on('unexpected-response', 
this.#handleUnexpectedResponse);
      }
 -    this._ws.addEventListener('message', this.#handleMessage);
 -    this._ws.addEventListener('close', this.#handleClose);
 +
-     // @ts-expect-error
 +    this._ws!.addEventListener('message', this.#handleMessage);
-     // @ts-expect-error
 +    this._ws!.addEventListener('close', this.#handleClose);
 +
      return await this._openPromise;
    }
  
@@@ -468,22 -421,17 +462,18 @@@
          handler.callback(cause);
        }
      });
-     // @ts-expect-error
 -    this._ws.removeEventListener('open', this.#handleOpen);
 -    this._ws.removeEventListener('error', this.#handleError);
 +    this._ws?.removeEventListener('open', this.#handleOpen);
-     // @ts-expect-error
 +    this._ws?.removeEventListener('error', this.#handleError);
      // Only remove unexpected-response listener for Node.js WebSocket (ws 
package)
      // Browser WebSocket does not have this event and .off() method
      if (this._ws && 'off' in this._ws) {
        // The following listener needs to use `.on` and `.off` because the 
`ws` package's addEventListener only accepts certain event types
        // Ref: 
https://github.com/websockets/ws/blob/8.16.0/lib/event-target.js#L202-L241
--      this._ws.off('unexpected-response', this.#handleUnexpectedResponse);
++      (this._ws as NodeWebSocket).off('unexpected-response', 
this.#handleUnexpectedResponse);
      }
 -    this._ws.removeEventListener('message', this.#handleMessage);
 -    this._ws.removeEventListener('close', this.#handleClose);
 +
-     // @ts-expect-error
 +    this._ws?.removeEventListener('message', this.#handleMessage);
-     // @ts-expect-error
 +    this._ws?.removeEventListener('close', this.#handleClose);
      this._openPromise = null;
      this._closePromise = null;
      this.isOpen = false;
diff --cc 
gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.ts
index 352c13582b,7f5a392fd6..f35665c8ef
--- 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.ts
+++ 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.ts
@@@ -402,7 -452,7 +402,7 @@@ class ArraySerializer extends TypeSeria
      };
    }
  
-   canBeUsedFor(value: unknown) {
 -  canBeUsedFor(value) {
++  canBeUsedFor(value: unknown): value is unknown[] {
      return Array.isArray(value);
    }
  }
@@@ -481,7 -531,36 +481,7 @@@ export class SetSerializer extends Arra
      };
    }
  
-   canBeUsedFor(value: unknown) {
 -  canBeUsedFor(value) {
--    return value instanceof Set;
++  canBeUsedFor(value: unknown): value is unknown[] {
++    return value instanceof Set as any;
    }
  }
 -
 -module.exports = {
 -  BulkSetSerializer,
 -  BytecodeSerializer,
 -  ClassSerializer,
 -  DateSerializer,
 -  OffsetDateTimeSerializer,
 -  DirectionSerializer,
 -  EdgeSerializer,
 -  EnumSerializer,
 -  LambdaSerializer,
 -  ListSerializer,
 -  LongSerializer,
 -  MapSerializer,
 -  NumberSerializer,
 -  Path3Serializer,
 -  PathSerializer,
 -  PropertySerializer,
 -  PSerializer,
 -  TextPSerializer,
 -  SetSerializer,
 -  TSerializer,
 -  TraverserSerializer,
 -  TraversalStrategySerializer,
 -  typeKey,
 -  valueKey,
 -  VertexPropertySerializer,
 -  VertexSerializer,
 -};
diff --cc 
gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json
index 9f6f6f6a3a,88ead33c04..b53cd1f839
--- 
a/gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json
+++ 
b/gremlin-javascript/src/main/javascript/gremlin-javascript/package-lock.json
@@@ -1,7 -1,7 +1,7 @@@
  {
    "name": "gremlin",
 -  "version": "3.8.1-alpha1",
 +  "version": "4.0.0-alpha1",
-   "lockfileVersion": 2,
+   "lockfileVersion": 3,
    "requires": true,
    "packages": {
      "": {
@@@ -16,25 -16,20 +16,27 @@@
          "ws": "^8.16.0"
        },
        "devDependencies": {
-         "@cucumber/cucumber": "^10.3.1",
+         "@cucumber/cucumber": "~12.7.0",
+         "@eslint/js": "^9.16.0",
 +        "@knighted/duel": "^1.0.7",
 +        "@tsconfig/node18": "^18.2.2",
 +        "@types/readable-stream": "^4.0.10",
 +        "@types/uuid": "^9.0.8",
 +        "@types/ws": "^8.5.10",
          "chai": "~4.5.0",
          "chai-string": "~1.5.0",
          "colors": "1.4.0",
-         "cross-env": "^7.0.3",
-         "eslint": "^8.42.0",
+         "cross-env": "^10.1.0",
+         "eslint": "^9.36.0",
          "eslint-config-prettier": "^10.0.1",
          "eslint-plugin-prettier": "^5.0.0",
+         "globals": "^15.14.0",
          "js-yaml": "^3.14.2",
-         "jsdoc": "^3.6.3",
-         "mocha": "^10.2.0",
+         "jsdoc": "^4.0.5",
+         "mocha": "^11.7.5",
 -        "prettier": "^3.0.0"
 +        "prettier": "^3.0.0",
 +        "ts-node": "^10.9.2",
 +        "typescript": "^5.4.2"
        },
        "engines": {
          "node": ">=20"
@@@ -62,142 -49,10 +56,35 @@@
          "node": ">=6.9.0"
        }
      },
-     "node_modules/@babel/code-frame/node_modules/ansi-styles": {
-       "version": "3.2.1",
-       "resolved": 
"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";,
-       "integrity": 
"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-       "dev": true,
-       "dependencies": {
-         "color-convert": "^1.9.0"
-       },
-       "engines": {
-         "node": ">=4"
-       }
-     },
-     "node_modules/@babel/code-frame/node_modules/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,
-       "dependencies": {
-         "ansi-styles": "^3.2.1",
-         "escape-string-regexp": "^1.0.5",
-         "supports-color": "^5.3.0"
-       },
-       "engines": {
-         "node": ">=4"
-       }
-     },
-     "node_modules/@babel/code-frame/node_modules/color-convert": {
-       "version": "1.9.3",
-       "resolved": 
"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";,
-       "integrity": 
"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-       "dev": true,
-       "dependencies": {
-         "color-name": "1.1.3"
-       }
-     },
-     "node_modules/@babel/code-frame/node_modules/color-name": {
-       "version": "1.1.3",
-       "resolved": 
"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";,
-       "integrity": 
"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-       "dev": true
-     },
-     "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
-       "version": "1.0.5",
-       "resolved": 
"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";,
-       "integrity": 
"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-       "dev": true,
-       "engines": {
-         "node": ">=0.8.0"
-       }
-     },
-     "node_modules/@babel/code-frame/node_modules/has-flag": {
-       "version": "3.0.0",
-       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";,
-       "integrity": 
"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
-       "dev": true,
-       "engines": {
-         "node": ">=4"
-       }
-     },
-     "node_modules/@babel/code-frame/node_modules/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,
-       "dependencies": {
-         "has-flag": "^3.0.0"
-       },
-       "engines": {
-         "node": ">=4"
-       }
-     },
 +    "node_modules/@babel/generator": {
-       "version": "7.23.6",
-       "resolved": 
"https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz";,
-       "integrity": 
"sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
-       "dev": true,
-       "dependencies": {
-         "@babel/types": "^7.23.6",
-         "@jridgewell/gen-mapping": "^0.3.2",
-         "@jridgewell/trace-mapping": "^0.3.17",
-         "jsesc": "^2.5.1"
-       },
-       "engines": {
-         "node": ">=6.9.0"
-       }
-     },
-     "node_modules/@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,
-       "engines": {
-         "node": ">=6.9.0"
-       }
-     },
-     "node_modules/@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,
-       "dependencies": {
-         "@babel/template": "^7.22.15",
-         "@babel/types": "^7.23.0"
-       },
-       "engines": {
-         "node": ">=6.9.0"
-       }
-     },
-     "node_modules/@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==",
++      "version": "7.29.1",
++      "resolved": 
"https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz";,
++      "integrity": 
"sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
 +      "dev": true,
 +      "dependencies": {
-         "@babel/types": "^7.22.5"
++        "@babel/parser": "^7.29.0",
++        "@babel/types": "^7.29.0",
++        "@jridgewell/gen-mapping": "^0.3.12",
++        "@jridgewell/trace-mapping": "^0.3.28",
++        "jsesc": "^3.0.2"
 +      },
 +      "engines": {
 +        "node": ">=6.9.0"
 +      }
 +    },
-     "node_modules/@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==",
++    "node_modules/@babel/helper-globals": {
++      "version": "7.28.0",
++      "resolved": 
"https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz";,
++      "integrity": 
"sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
 +      "dev": true,
-       "dependencies": {
-         "@babel/types": "^7.22.5"
-       },
 +      "engines": {
 +        "node": ">=6.9.0"
 +      }
 +    },
      "node_modules/@babel/helper-string-parser": {
-       "version": "7.23.4",
-       "resolved": 
"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz";,
-       "integrity": 
"sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+       "version": "7.27.1",
+       "resolved": 
"https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz";,
+       "integrity": 
"sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
        "dev": true,
        "engines": {
          "node": ">=6.9.0"
@@@ -309,59 -82,14 +114,46 @@@
          "node": ">=6.0.0"
        }
      },
 +    "node_modules/@babel/template": {
-       "version": "7.24.0",
-       "resolved": 
"https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz";,
-       "integrity": 
"sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
++      "version": "7.28.6",
++      "resolved": 
"https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz";,
++      "integrity": 
"sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
 +      "dev": true,
 +      "dependencies": {
-         "@babel/code-frame": "^7.23.5",
-         "@babel/parser": "^7.24.0",
-         "@babel/types": "^7.24.0"
++        "@babel/code-frame": "^7.28.6",
++        "@babel/parser": "^7.28.6",
++        "@babel/types": "^7.28.6"
 +      },
 +      "engines": {
 +        "node": ">=6.9.0"
 +      }
 +    },
 +    "node_modules/@babel/traverse": {
-       "version": "7.24.0",
-       "resolved": 
"https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz";,
-       "integrity": 
"sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==",
-       "dev": true,
-       "dependencies": {
-         "@babel/code-frame": "^7.23.5",
-         "@babel/generator": "^7.23.6",
-         "@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.24.0",
-         "@babel/types": "^7.24.0",
-         "debug": "^4.3.1",
-         "globals": "^11.1.0"
++      "version": "7.29.0",
++      "resolved": 
"https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz";,
++      "integrity": 
"sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
++      "dev": true,
++      "dependencies": {
++        "@babel/code-frame": "^7.29.0",
++        "@babel/generator": "^7.29.0",
++        "@babel/helper-globals": "^7.28.0",
++        "@babel/parser": "^7.29.0",
++        "@babel/template": "^7.28.6",
++        "@babel/types": "^7.29.0",
++        "debug": "^4.3.1"
 +      },
 +      "engines": {
 +        "node": ">=6.9.0"
 +      }
 +    },
-     "node_modules/@babel/traverse/node_modules/globals": {
-       "version": "11.12.0",
-       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz";,
-       "integrity": 
"sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-       "dev": true,
-       "engines": {
-         "node": ">=4"
-       }
-     },
      "node_modules/@babel/types": {
-       "version": "7.24.0",
-       "resolved": 
"https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz";,
-       "integrity": 
"sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
+       "version": "7.29.0",
+       "resolved": 
"https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz";,
+       "integrity": 
"sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
        "dev": true,
        "dependencies": {
-         "@babel/helper-string-parser": "^7.23.4",
-         "@babel/helper-validator-identifier": "^7.22.20",
-         "to-fast-properties": "^2.0.0"
+         "@babel/helper-string-parser": "^7.27.1",
+         "@babel/helper-validator-identifier": "^7.28.5"
        },
        "engines": {
          "node": ">=6.9.0"
@@@ -377,32 -105,10 +169,32 @@@
          "node": ">=0.1.90"
        }
      },
 +    "node_modules/@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,
 +      "dependencies": {
 +        "@jridgewell/trace-mapping": "0.3.9"
 +      },
 +      "engines": {
 +        "node": ">=12"
 +      }
 +    },
 +    
"node_modules/@cspotcode/source-map-support/node_modules/@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,
 +      "dependencies": {
 +        "@jridgewell/resolve-uri": "^3.0.3",
 +        "@jridgewell/sourcemap-codec": "^1.4.10"
 +      }
 +    },
      "node_modules/@cucumber/ci-environment": {
-       "version": "10.0.0",
-       "resolved": 
"https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.0.tgz";,
-       "integrity": 
"sha512-lRkiehckosIOdc7p1L44nZsttO5dVHFjpwKKWZ07x8SeoAdV/sPuGe1PISe0AmAowFGza62nMOgG4KaroGzwFQ==",
+       "version": "13.0.0",
+       "resolved": 
"https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-13.0.0.tgz";,
+       "integrity": 
"sha512-cs+3NzfNkGbcmHPddjEv4TKFiBpZRQ6WJEEufB9mw+ExS22V/4R/zpDSEG+fsJ/iSNCd6A2sATdY8PFOyY3YnA==",
        "dev": true
      },
      "node_modules/@cucumber/cucumber": {
@@@ -962,253 -630,18 +716,230 @@@
          "url": "https://github.com/chalk/wrap-ansi?sponsor=1";
        }
      },
 +    "node_modules/@jridgewell/gen-mapping": {
-       "version": "0.3.5",
-       "resolved": 
"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz";,
-       "integrity": 
"sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
++      "version": "0.3.13",
++      "resolved": 
"https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz";,
++      "integrity": 
"sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
 +      "dev": true,
 +      "dependencies": {
-         "@jridgewell/set-array": "^1.2.1",
-         "@jridgewell/sourcemap-codec": "^1.4.10",
++        "@jridgewell/sourcemap-codec": "^1.5.0",
 +        "@jridgewell/trace-mapping": "^0.3.24"
-       },
-       "engines": {
-         "node": ">=6.0.0"
 +      }
 +    },
 +    "node_modules/@jridgewell/resolve-uri": {
 +      "version": "3.1.2",
 +      "resolved": 
"https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz";,
 +      "integrity": 
"sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
 +      "dev": true,
 +      "engines": {
 +        "node": ">=6.0.0"
 +      }
 +    },
-     "node_modules/@jridgewell/set-array": {
-       "version": "1.2.1",
-       "resolved": 
"https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz";,
-       "integrity": 
"sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-       "dev": true,
-       "engines": {
-         "node": ">=6.0.0"
-       }
-     },
 +    "node_modules/@jridgewell/sourcemap-codec": {
-       "version": "1.4.15",
-       "resolved": 
"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz";,
-       "integrity": 
"sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
++      "version": "1.5.5",
++      "resolved": 
"https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz";,
++      "integrity": 
"sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
 +      "dev": true
 +    },
 +    "node_modules/@jridgewell/trace-mapping": {
-       "version": "0.3.25",
-       "resolved": 
"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz";,
-       "integrity": 
"sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
++      "version": "0.3.31",
++      "resolved": 
"https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz";,
++      "integrity": 
"sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
 +      "dev": true,
 +      "dependencies": {
 +        "@jridgewell/resolve-uri": "^3.1.0",
 +        "@jridgewell/sourcemap-codec": "^1.4.14"
 +      }
 +    },
+     "node_modules/@jsdoc/salty": {
+       "version": "0.2.10",
+       "resolved": 
"https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.10.tgz";,
+       "integrity": 
"sha512-VFHSsQAQp8y1NJvAJBpLs9I2shHE6hz9TwukocDObuUgGVAq62yZGbTgJg04Z3Fj0XSMWe0sJqGg5dhKGTV92A==",
+       "dev": true,
+       "dependencies": {
+         "lodash": "^4.17.23"
+       },
+       "engines": {
+         "node": ">=v12.0.0"
+       }
+     },
 +    "node_modules/@knighted/duel": {
-       "version": "1.0.7",
-       "resolved": 
"https://registry.npmjs.org/@knighted/duel/-/duel-1.0.7.tgz";,
-       "integrity": 
"sha512-N/Z/BqKFNwuyPZvrTtcsVtnPABOIfVgyQN58YpTOBBJIWCP/ZrNM4KaMjdWpf5byYjC1LIOzf8Va/9l/buHmig==",
++      "version": "1.0.8",
++      "resolved": 
"https://registry.npmjs.org/@knighted/duel/-/duel-1.0.8.tgz";,
++      "integrity": 
"sha512-qOKDR0mbtH8tL6dgbX8ks8udBytF67TlD3k1QUO/Chj0NX/qXBlrWg7ox33IFwYJP7PDSHd6QjWNG2lYLlN4Rg==",
 +      "dev": true,
 +      "dependencies": {
 +        "@knighted/specifier": "^1.0.1",
 +        "find-up": "^6.3.0",
 +        "glob": "^10.3.3",
 +        "jsonc-parser": "^3.2.0",
 +        "read-package-up": "^11.0.0"
 +      },
 +      "bin": {
 +        "duel": "dist/esm/duel.js"
 +      },
 +      "engines": {
 +        "node": ">=16.19.0"
 +      },
 +      "peerDependencies": {
-         "typescript": ">=4.0.0 || >=4.9.0-dev || >=5.3.0-dev || 5.4.0-dev || 
5.5.0-dev"
++        "typescript": ">=4.0.0 || >=4.9.0-dev || >=5.3.0-dev || >=5.4.0-dev 
|| >=5.5.0-dev || next"
 +      }
 +    },
 +    "node_modules/@knighted/duel/node_modules/brace-expansion": {
-       "version": "2.0.1",
-       "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz";,
-       "integrity": 
"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
++      "version": "2.0.2",
++      "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz";,
++      "integrity": 
"sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
 +      "dev": true,
 +      "dependencies": {
 +        "balanced-match": "^1.0.0"
 +      }
 +    },
-     "node_modules/@knighted/duel/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==",
++    "node_modules/@knighted/duel/node_modules/glob": {
++      "version": "10.5.0",
++      "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz";,
++      "integrity": 
"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
++      "deprecated": "Old versions of glob are not supported, and contain 
widely publicized security vulnerabilities, which have been fixed in the 
current version. Please update. Support for old versions may be purchased (at 
exorbitant rates) by contacting [email protected]",
 +      "dev": true,
 +      "dependencies": {
-         "locate-path": "^7.1.0",
-         "path-exists": "^5.0.0"
++        "foreground-child": "^3.1.0",
++        "jackspeak": "^3.1.2",
++        "minimatch": "^9.0.4",
++        "minipass": "^7.1.2",
++        "package-json-from-dist": "^1.0.0",
++        "path-scurry": "^1.11.1"
 +      },
-       "engines": {
-         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
++      "bin": {
++        "glob": "dist/esm/bin.mjs"
 +      },
 +      "funding": {
-         "url": "https://github.com/sponsors/sindresorhus";
++        "url": "https://github.com/sponsors/isaacs";
 +      }
 +    },
-     "node_modules/@knighted/duel/node_modules/glob": {
-       "version": "10.3.10",
-       "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz";,
-       "integrity": 
"sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
++    "node_modules/@knighted/duel/node_modules/hosted-git-info": {
++      "version": "7.0.2",
++      "resolved": 
"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz";,
++      "integrity": 
"sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
 +      "dev": true,
 +      "dependencies": {
-         "foreground-child": "^3.1.0",
-         "jackspeak": "^2.3.5",
-         "minimatch": "^9.0.1",
-         "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
-         "path-scurry": "^1.10.1"
++        "lru-cache": "^10.0.1"
 +      },
-       "bin": {
-         "glob": "dist/esm/bin.mjs"
++      "engines": {
++        "node": "^16.14.0 || >=18.0.0"
++      }
++    },
++    "node_modules/@knighted/duel/node_modules/lru-cache": {
++      "version": "10.4.3",
++      "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz";,
++      "integrity": 
"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
++      "dev": true
++    },
++    "node_modules/@knighted/duel/node_modules/minimatch": {
++      "version": "9.0.9",
++      "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz";,
++      "integrity": 
"sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
++      "dev": true,
++      "dependencies": {
++        "brace-expansion": "^2.0.2"
 +      },
 +      "engines": {
 +        "node": ">=16 || 14 >=14.17"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/isaacs";
 +      }
 +    },
-     "node_modules/@knighted/duel/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==",
++    "node_modules/@knighted/duel/node_modules/normalize-package-data": {
++      "version": "6.0.2",
++      "resolved": 
"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz";,
++      "integrity": 
"sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
 +      "dev": true,
 +      "dependencies": {
-         "p-locate": "^6.0.0"
++        "hosted-git-info": "^7.0.0",
++        "semver": "^7.3.5",
++        "validate-npm-package-license": "^3.0.4"
 +      },
 +      "engines": {
-         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-       },
-       "funding": {
-         "url": "https://github.com/sponsors/sindresorhus";
++        "node": "^16.14.0 || >=18.0.0"
 +      }
 +    },
-     "node_modules/@knighted/duel/node_modules/minimatch": {
-       "version": "9.0.3",
-       "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz";,
-       "integrity": 
"sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
++    "node_modules/@knighted/duel/node_modules/path-scurry": {
++      "version": "1.11.1",
++      "resolved": 
"https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz";,
++      "integrity": 
"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
 +      "dev": true,
 +      "dependencies": {
-         "brace-expansion": "^2.0.1"
++        "lru-cache": "^10.2.0",
++        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
 +      },
 +      "engines": {
-         "node": ">=16 || 14 >=14.17"
++        "node": ">=16 || 14 >=14.18"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/isaacs";
 +      }
 +    },
-     "node_modules/@knighted/duel/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==",
++    "node_modules/@knighted/duel/node_modules/read-package-up": {
++      "version": "11.0.0",
++      "resolved": 
"https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz";,
++      "integrity": 
"sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==",
 +      "dev": true,
 +      "dependencies": {
-         "yocto-queue": "^1.0.0"
++        "find-up-simple": "^1.0.0",
++        "read-pkg": "^9.0.0",
++        "type-fest": "^4.6.0"
 +      },
 +      "engines": {
-         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
++        "node": ">=18"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/@knighted/duel/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==",
++    "node_modules/@knighted/duel/node_modules/read-pkg": {
++      "version": "9.0.1",
++      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz";,
++      "integrity": 
"sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==",
 +      "dev": true,
 +      "dependencies": {
-         "p-limit": "^4.0.0"
++        "@types/normalize-package-data": "^2.4.3",
++        "normalize-package-data": "^6.0.0",
++        "parse-json": "^8.0.0",
++        "type-fest": "^4.6.0",
++        "unicorn-magic": "^0.1.0"
 +      },
 +      "engines": {
-         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
++        "node": ">=18"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/@knighted/duel/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"
-       }
-     },
-     "node_modules/@knighted/duel/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==",
++    "node_modules/@knighted/duel/node_modules/unicorn-magic": {
++      "version": "0.1.0",
++      "resolved": 
"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz";,
++      "integrity": 
"sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
 +      "dev": true,
 +      "engines": {
-         "node": ">=12.20"
++        "node": ">=18"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
 +    "node_modules/@knighted/specifier": {
 +      "version": "1.0.1",
 +      "resolved": 
"https://registry.npmjs.org/@knighted/specifier/-/specifier-1.0.1.tgz";,
 +      "integrity": 
"sha512-LArFWJN7wGGLU1P3TeEHgO6wGKWEYq/o4/Yij7rnKk0ng1HbQn1wythI0E9Q7B3+7LRnposEtaeY9AZlE3Cg+Q==",
 +      "dev": true,
 +      "dependencies": {
 +        "@babel/parser": "^7.22.7",
 +        "@babel/traverse": "^7.23.2",
 +        "magic-string": "^0.30.1"
 +      },
 +      "engines": {
 +        "node": ">=14"
 +      }
 +    },
-     "node_modules/@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,
-       "dependencies": {
-         "@nodelib/fs.stat": "2.0.5",
-         "run-parallel": "^1.1.9"
-       },
-       "engines": {
-         "node": ">= 8"
-       }
-     },
-     "node_modules/@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,
-       "engines": {
-         "node": ">= 8"
-       }
-     },
-     "node_modules/@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,
-       "dependencies": {
-         "@nodelib/fs.scandir": "2.1.5",
-         "fastq": "^1.6.0"
-       },
-       "engines": {
-         "node": ">= 8"
-       }
-     },
      "node_modules/@pkgjs/parseargs": {
        "version": "0.11.0",
        "resolved": 
"https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz";,
@@@ -1240,34 -673,16 +971,46 @@@
          "node": ">=14"
        }
      },
 +    "node_modules/@tsconfig/node10": {
-       "version": "1.0.9",
-       "resolved": 
"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz";,
-       "integrity": 
"sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
++      "version": "1.0.12",
++      "resolved": 
"https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz";,
++      "integrity": 
"sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
 +      "dev": true
 +    },
 +    "node_modules/@tsconfig/node12": {
 +      "version": "1.0.11",
 +      "resolved": 
"https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz";,
 +      "integrity": 
"sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
 +      "dev": true
 +    },
 +    "node_modules/@tsconfig/node14": {
 +      "version": "1.0.3",
 +      "resolved": 
"https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz";,
 +      "integrity": 
"sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
 +      "dev": true
 +    },
 +    "node_modules/@tsconfig/node16": {
 +      "version": "1.0.4",
 +      "resolved": 
"https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz";,
 +      "integrity": 
"sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
 +      "dev": true
 +    },
 +    "node_modules/@tsconfig/node18": {
-       "version": "18.2.2",
-       "resolved": 
"https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.2.tgz";,
-       "integrity": 
"sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==",
++      "version": "18.2.6",
++      "resolved": 
"https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.6.tgz";,
++      "integrity": 
"sha512-eAWQzAjPj18tKnDzmWstz4OyWewLUNBm9tdoN9LayzoboRktYx3Enk1ZXPmThj55L7c4VWYq/Bzq0A51znZfhw==",
++      "dev": true
++    },
+     "node_modules/@types/estree": {
+       "version": "1.0.8",
+       "resolved": 
"https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz";,
+       "integrity": 
"sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+       "dev": true
+     },
+     "node_modules/@types/json-schema": {
+       "version": "7.0.15",
+       "resolved": 
"https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz";,
+       "integrity": 
"sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
        "dev": true
      },
      "node_modules/@types/linkify-it": {
@@@ -1287,63 -702,17 +1030,50 @@@
        }
      },
      "node_modules/@types/mdurl": {
-       "version": "1.0.2",
-       "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz";,
-       "integrity": 
"sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
+       "version": "2.0.0",
+       "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz";,
+       "integrity": 
"sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
        "dev": true
      },
 +    "node_modules/@types/node": {
-       "version": "20.11.26",
-       "resolved": 
"https://registry.npmjs.org/@types/node/-/node-20.11.26.tgz";,
-       "integrity": 
"sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==",
++      "version": "25.4.0",
++      "resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz";,
++      "integrity": 
"sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==",
 +      "dev": true,
 +      "dependencies": {
-         "undici-types": "~5.26.4"
++        "undici-types": "~7.18.0"
 +      }
 +    },
      "node_modules/@types/normalize-package-data": {
        "version": "2.4.4",
        "resolved": 
"https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz";,
        "integrity": 
"sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
        "dev": true
      },
 +    "node_modules/@types/readable-stream": {
-       "version": "4.0.10",
-       "resolved": 
"https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.10.tgz";,
-       "integrity": 
"sha512-AbUKBjcC8SHmImNi4yK2bbjogQlkFSg7shZCcicxPQapniOlajG8GCc39lvXzCWX4lLRRs7DM3VAeSlqmEVZUA==",
++      "version": "4.0.23",
++      "resolved": 
"https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz";,
++      "integrity": 
"sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==",
 +      "dev": true,
 +      "dependencies": {
-         "@types/node": "*",
-         "safe-buffer": "~5.1.1"
++        "@types/node": "*"
 +      }
 +    },
-     "node_modules/@types/readable-stream/node_modules/safe-buffer": {
-       "version": "5.1.2",
-       "resolved": 
"https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";,
-       "integrity": 
"sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-       "dev": true
-     },
 +    "node_modules/@types/uuid": {
 +      "version": "9.0.8",
 +      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz";,
 +      "integrity": 
"sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
 +      "dev": true
 +    },
 +    "node_modules/@types/ws": {
-       "version": "8.5.10",
-       "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz";,
-       "integrity": 
"sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
++      "version": "8.18.1",
++      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz";,
++      "integrity": 
"sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
 +      "dev": true,
 +      "dependencies": {
 +        "@types/node": "*"
 +      }
 +    },
-     "node_modules/@ungap/structured-clone": {
-       "version": "1.2.0",
-       "resolved": 
"https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz";,
-       "integrity": 
"sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
-       "dev": true
-     },
      "node_modules/abort-controller": {
        "version": "3.0.0",
        "resolved": 
"https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz";,
@@@ -1376,19 -745,10 +1106,22 @@@
          "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
        }
      },
 +    "node_modules/acorn-walk": {
-       "version": "8.3.2",
-       "resolved": 
"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz";,
-       "integrity": 
"sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
++      "version": "8.3.5",
++      "resolved": 
"https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz";,
++      "integrity": 
"sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
 +      "dev": true,
++      "dependencies": {
++        "acorn": "^8.11.0"
++      },
 +      "engines": {
 +        "node": ">=0.4.0"
 +      }
 +    },
      "node_modules/ajv": {
-       "version": "6.12.6",
-       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";,
-       "integrity": 
"sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+       "version": "6.14.0",
+       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz";,
+       "integrity": 
"sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
        "dev": true,
        "dependencies": {
          "fast-deep-equal": "^3.1.1",
@@@ -1440,25 -788,6 +1161,12 @@@
        "integrity": 
"sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
        "dev": true
      },
-     "node_modules/anymatch": {
-       "version": "3.1.2",
-       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz";,
-       "integrity": 
"sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
-       "dev": true,
-       "dependencies": {
-         "normalize-path": "^3.0.0",
-         "picomatch": "^2.0.4"
-       },
-       "engines": {
-         "node": ">= 8"
-       }
-     },
 +    "node_modules/arg": {
 +      "version": "4.1.3",
 +      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz";,
 +      "integrity": 
"sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
 +      "dev": true
 +    },
      "node_modules/argparse": {
        "version": "1.0.10",
        "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";,
@@@ -1828,31 -1108,24 +1487,30 @@@
      "node_modules/concat-map": {
        "version": "0.0.1",
        "resolved": 
"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";,
-       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+       "integrity": 
"sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
        "dev": true
      },
 +    "node_modules/create-require": {
 +      "version": "1.1.1",
 +      "resolved": 
"https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz";,
 +      "integrity": 
"sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
 +      "dev": true
 +    },
      "node_modules/cross-env": {
-       "version": "7.0.3",
-       "resolved": 
"https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz";,
-       "integrity": 
"sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+       "version": "10.1.0",
+       "resolved": 
"https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz";,
+       "integrity": 
"sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==",
        "dev": true,
        "dependencies": {
-         "cross-spawn": "^7.0.1"
+         "@epic-web/invariant": "^1.0.0",
+         "cross-spawn": "^7.0.6"
        },
        "bin": {
-         "cross-env": "src/bin/cross-env.js",
-         "cross-env-shell": "src/bin/cross-env-shell.js"
+         "cross-env": "dist/bin/cross-env.js",
+         "cross-env-shell": "dist/bin/cross-env-shell.js"
        },
        "engines": {
-         "node": ">=10.14",
-         "npm": ">=6",
-         "yarn": ">=1"
+         "node": ">=20"
        }
      },
      "node_modules/cross-spawn": {
@@@ -2116,82 -1384,40 +1769,122 @@@
          "url": "https://opencollective.com/eslint";
        }
      },
-     "node_modules/eslint/node_modules/argparse": {
-       "version": "2.0.1",
-       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz";,
-       "integrity": 
"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-       "dev": true
-     },
-     "node_modules/eslint/node_modules/escape-string-regexp": {
-       "version": "4.0.0",
-       "resolved": 
"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz";,
-       "integrity": 
"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
++    "node_modules/eslint/node_modules/find-up": {
++      "version": "5.0.0",
++      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz";,
++      "integrity": 
"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
 +      "dev": true,
++      "dependencies": {
++        "locate-path": "^6.0.0",
++        "path-exists": "^4.0.0"
++      },
 +      "engines": {
 +        "node": ">=10"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/eslint/node_modules/glob-parent": {
-       "version": "6.0.2",
-       "resolved": 
"https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz";,
-       "integrity": 
"sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
++    "node_modules/eslint/node_modules/locate-path": {
++      "version": "6.0.0",
++      "resolved": 
"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz";,
++      "integrity": 
"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
 +      "dev": true,
 +      "dependencies": {
-         "is-glob": "^4.0.3"
++        "p-locate": "^5.0.0"
 +      },
 +      "engines": {
-         "node": ">=10.13.0"
++        "node": ">=10"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/eslint/node_modules/js-yaml": {
-       "version": "4.1.0",
-       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz";,
-       "integrity": 
"sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
++    "node_modules/eslint/node_modules/p-limit": {
++      "version": "3.1.0",
++      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz";,
++      "integrity": 
"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
 +      "dev": true,
 +      "dependencies": {
-         "argparse": "^2.0.1"
++        "yocto-queue": "^0.1.0"
 +      },
-       "bin": {
-         "js-yaml": "bin/js-yaml.js"
++      "engines": {
++        "node": ">=10"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/espree": {
-       "version": "9.6.1",
-       "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz";,
-       "integrity": 
"sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
++    "node_modules/eslint/node_modules/p-locate": {
++      "version": "5.0.0",
++      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz";,
++      "integrity": 
"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
 +      "dev": true,
 +      "dependencies": {
-         "acorn": "^8.9.0",
-         "acorn-jsx": "^5.3.2",
-         "eslint-visitor-keys": "^3.4.1"
++        "p-limit": "^3.0.2"
 +      },
 +      "engines": {
-         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
++        "node": ">=10"
 +      },
 +      "funding": {
-         "url": "https://opencollective.com/eslint";
++        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/esprima": {
-       "version": "4.0.1",
-       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";,
-       "integrity": 
"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
++    "node_modules/eslint/node_modules/path-exists": {
++      "version": "4.0.0",
++      "resolved": 
"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz";,
++      "integrity": 
"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
 +      "dev": true,
-       "bin": {
-         "esparse": "bin/esparse.js",
-         "esvalidate": "bin/esvalidate.js"
-       },
 +      "engines": {
-         "node": ">=4"
++        "node": ">=8"
 +      }
 +    },
-     "node_modules/esquery": {
-       "version": "1.5.0",
-       "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz";,
-       "integrity": 
"sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
++    "node_modules/eslint/node_modules/yocto-queue": {
++      "version": "0.1.0",
++      "resolved": 
"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz";,
++      "integrity": 
"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
++      "dev": true,
++      "engines": {
++        "node": ">=10"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus";
++      }
++    },
+     "node_modules/espree": {
+       "version": "10.4.0",
+       "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz";,
+       "integrity": 
"sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+       "dev": true,
+       "dependencies": {
+         "acorn": "^8.15.0",
+         "acorn-jsx": "^5.3.2",
+         "eslint-visitor-keys": "^4.2.1"
+       },
+       "engines": {
+         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+       },
+       "funding": {
+         "url": "https://opencollective.com/eslint";
+       }
+     },
+     "node_modules/esprima": {
+       "version": "4.0.1",
+       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";,
+       "integrity": 
"sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+       "dev": true,
+       "bin": {
+         "esparse": "bin/esparse.js",
+         "esvalidate": "bin/esvalidate.js"
+       },
+       "engines": {
+         "node": ">=4"
+       }
+     },
+     "node_modules/esquery": {
+       "version": "1.7.0",
+       "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz";,
+       "integrity": 
"sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
        "dev": true,
        "dependencies": {
          "estraverse": "^5.1.0"
@@@ -2321,16 -1538,16 +2005,16 @@@
        }
      },
      "node_modules/find-up": {
--      "version": "5.0.0",
--      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz";,
--      "integrity": 
"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
++      "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,
        "dependencies": {
--        "locate-path": "^6.0.0",
--        "path-exists": "^4.0.0"
++        "locate-path": "^7.1.0",
++        "path-exists": "^5.0.0"
        },
        "engines": {
--        "node": ">=10"
++        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
        },
        "funding": {
          "url": "https://github.com/sponsors/sindresorhus";
@@@ -2907,99 -2025,22 +2492,34 @@@
          "node": ">=8"
        }
      },
-     "node_modules/jsdoc/node_modules/js2xmlparser": {
-       "version": "4.0.2",
-       "resolved": 
"https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz";,
-       "integrity": 
"sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==",
-       "dev": true,
-       "dependencies": {
-         "xmlcreate": "^2.0.4"
-       }
-     },
-     "node_modules/jsdoc/node_modules/klaw": {
-       "version": "4.0.1",
-       "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.0.1.tgz";,
-       "integrity": 
"sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw==",
-       "dev": true,
-       "engines": {
-         "node": ">=14.14.0"
-       }
-     },
-     "node_modules/jsdoc/node_modules/linkify-it": {
-       "version": "3.0.3",
-       "resolved": 
"https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz";,
-       "integrity": 
"sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
-       "dev": true,
-       "dependencies": {
-         "uc.micro": "^1.0.1"
-       }
-     },
-     "node_modules/jsdoc/node_modules/markdown-it": {
-       "version": "12.3.2",
-       "resolved": 
"https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz";,
-       "integrity": 
"sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
-       "dev": true,
-       "dependencies": {
-         "argparse": "^2.0.1",
-         "entities": "~2.1.0",
-         "linkify-it": "^3.0.1",
-         "mdurl": "^1.0.1",
-         "uc.micro": "^1.0.5"
-       },
-       "bin": {
-         "markdown-it": "bin/markdown-it.js"
-       }
-     },
-     "node_modules/jsdoc/node_modules/markdown-it-anchor": {
-       "version": "8.4.1",
-       "resolved": 
"https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.4.1.tgz";,
-       "integrity": 
"sha512-sLODeRetZ/61KkKLJElaU3NuU2z7MhXf12Ml1WJMSdwpngeofneCRF+JBbat8HiSqhniOMuTemXMrsI7hA6XyA==",
-       "dev": true,
-       "peerDependencies": {
-         "@types/markdown-it": "*",
-         "markdown-it": "*"
-       }
-     },
-     "node_modules/jsdoc/node_modules/marked": {
-       "version": "4.0.12",
-       "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz";,
-       "integrity": 
"sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+     "node_modules/jsdoc/node_modules/mkdirp": {
+       "version": "1.0.4",
+       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz";,
+       "integrity": 
"sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
        "dev": true,
        "bin": {
-         "marked": "bin/marked.js"
+         "mkdirp": "bin/cmd.js"
        },
        "engines": {
-         "node": ">= 12"
+         "node": ">=10"
        }
      },
-     "node_modules/jsdoc/node_modules/underscore": {
-       "version": "1.13.2",
-       "resolved": 
"https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz";,
-       "integrity": 
"sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==",
-       "dev": true
-     },
-     "node_modules/jsdoc/node_modules/xmlcreate": {
-       "version": "2.0.4",
-       "resolved": 
"https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz";,
-       "integrity": 
"sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==",
-       "dev": true
-     },
 +    "node_modules/jsesc": {
-       "version": "2.5.2",
-       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz";,
-       "integrity": 
"sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
++      "version": "3.1.0",
++      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz";,
++      "integrity": 
"sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
 +      "dev": true,
 +      "bin": {
 +        "jsesc": "bin/jsesc"
 +      },
 +      "engines": {
-         "node": ">=4"
++        "node": ">=6"
 +      }
 +    },
-     "node_modules/json-parse-even-better-errors": {
-       "version": "2.3.1",
-       "resolved": 
"https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz";,
-       "integrity": 
"sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+     "node_modules/json-buffer": {
+       "version": "3.0.1",
+       "resolved": 
"https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz";,
+       "integrity": 
"sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
        "dev": true
      },
      "node_modules/json-schema-traverse": {
@@@ -3014,12 -2055,24 +2534,30 @@@
        "integrity": 
"sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
        "dev": true
      },
 +    "node_modules/jsonc-parser": {
-       "version": "3.2.1",
-       "resolved": 
"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz";,
-       "integrity": 
"sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
++      "version": "3.3.1",
++      "resolved": 
"https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz";,
++      "integrity": 
"sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
 +      "dev": true
 +    },
+     "node_modules/keyv": {
+       "version": "4.5.4",
+       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz";,
+       "integrity": 
"sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+       "dev": true,
+       "dependencies": {
+         "json-buffer": "3.0.1"
+       }
+     },
+     "node_modules/klaw": {
+       "version": "3.0.0",
+       "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz";,
+       "integrity": 
"sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==",
+       "dev": true,
+       "dependencies": {
+         "graceful-fs": "^4.1.9"
+       }
+     },
      "node_modules/knuth-shuffle-seeded": {
        "version": "1.0.6",
        "resolved": 
"https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz";,
@@@ -3042,22 -2095,25 +2580,25 @@@
          "node": ">= 0.8.0"
        }
      },
-     "node_modules/lines-and-columns": {
-       "version": "1.2.4",
-       "resolved": 
"https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz";,
-       "integrity": 
"sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-       "dev": true
+     "node_modules/linkify-it": {
+       "version": "5.0.0",
+       "resolved": 
"https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz";,
+       "integrity": 
"sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+       "dev": true,
+       "dependencies": {
+         "uc.micro": "^2.0.0"
+       }
      },
      "node_modules/locate-path": {
--      "version": "6.0.0",
--      "resolved": 
"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz";,
--      "integrity": 
"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
++      "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,
        "dependencies": {
--        "p-locate": "^5.0.0"
++        "p-locate": "^6.0.0"
        },
        "engines": {
--        "node": ">=10"
++        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
        },
        "funding": {
          "url": "https://github.com/sponsors/sindresorhus";
@@@ -3097,131 -2159,109 +2644,124 @@@
          "url": "https://github.com/sponsors/sindresorhus";
        }
      },
-     "node_modules/log-symbols/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==",
+     "node_modules/loupe": {
+       "version": "2.3.7",
+       "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz";,
+       "integrity": 
"sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
        "dev": true,
        "dependencies": {
-         "color-convert": "^2.0.1"
-       },
-       "engines": {
-         "node": ">=8"
-       },
-       "funding": {
-         "url": "https://github.com/chalk/ansi-styles?sponsor=1";
+         "get-func-name": "^2.0.1"
        }
      },
-     "node_modules/log-symbols/node_modules/chalk": {
-       "version": "4.1.2",
-       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz";,
-       "integrity": 
"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+     "node_modules/lower-case": {
+       "version": "2.0.2",
+       "resolved": 
"https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz";,
+       "integrity": 
"sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
        "dev": true,
        "dependencies": {
-         "ansi-styles": "^4.1.0",
-         "supports-color": "^7.1.0"
-       },
-       "engines": {
-         "node": ">=10"
-       },
-       "funding": {
-         "url": "https://github.com/chalk/chalk?sponsor=1";
+         "tslib": "^2.0.3"
        }
      },
-     "node_modules/log-symbols/node_modules/color-convert": {
-       "version": "2.0.1",
-       "resolved": 
"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz";,
-       "integrity": 
"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+     "node_modules/lru-cache": {
+       "version": "11.2.6",
+       "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz";,
+       "integrity": 
"sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==",
        "dev": true,
-       "dependencies": {
-         "color-name": "~1.1.4"
-       },
        "engines": {
-         "node": ">=7.0.0"
+         "node": "20 || >=22"
        }
      },
-     "node_modules/log-symbols/node_modules/color-name": {
-       "version": "1.1.4",
-       "resolved": 
"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz";,
-       "integrity": 
"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-       "dev": true
-     },
-     "node_modules/log-symbols/node_modules/has-flag": {
-       "version": "4.0.0",
-       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz";,
-       "integrity": 
"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+     "node_modules/luxon": {
+       "version": "3.7.2",
+       "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz";,
+       "integrity": 
"sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==",
        "dev": true,
        "engines": {
-         "node": ">=8"
+         "node": ">=12"
        }
      },
-     "node_modules/log-symbols/node_modules/supports-color": {
-       "version": "7.2.0",
-       "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz";,
-       "integrity": 
"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
++    "node_modules/magic-string": {
++      "version": "0.30.21",
++      "resolved": 
"https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz";,
++      "integrity": 
"sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
 +      "dev": true,
 +      "dependencies": {
-         "has-flag": "^4.0.0"
-       },
-       "engines": {
-         "node": ">=8"
++        "@jridgewell/sourcemap-codec": "^1.5.5"
 +      }
 +    },
-     "node_modules/loupe": {
-       "version": "2.3.6",
-       "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz";,
-       "integrity": 
"sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
++    "node_modules/make-error": {
++      "version": "1.3.6",
++      "resolved": 
"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz";,
++      "integrity": 
"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
++      "dev": true
++    },
+     "node_modules/markdown-it": {
+       "version": "14.1.1",
+       "resolved": 
"https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz";,
+       "integrity": 
"sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
        "dev": true,
        "dependencies": {
-         "get-func-name": "^2.0.0"
+         "argparse": "^2.0.1",
+         "entities": "^4.4.0",
+         "linkify-it": "^5.0.0",
+         "mdurl": "^2.0.0",
+         "punycode.js": "^2.3.1",
+         "uc.micro": "^2.1.0"
+       },
+       "bin": {
+         "markdown-it": "bin/markdown-it.mjs"
        }
      },
-     "node_modules/lru-cache": {
-       "version": "10.2.0",
-       "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz";,
-       "integrity": 
"sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
+     "node_modules/markdown-it-anchor": {
+       "version": "8.6.7",
+       "resolved": 
"https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz";,
+       "integrity": 
"sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
        "dev": true,
-       "engines": {
-         "node": "14 || >=16.14"
+       "peerDependencies": {
+         "@types/markdown-it": "*",
+         "markdown-it": "*"
        }
      },
-     "node_modules/luxon": {
-       "version": "3.2.1",
-       "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz";,
-       "integrity": 
"sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==",
-       "dev": true,
-       "engines": {
-         "node": ">=12"
-       }
+     "node_modules/markdown-it/node_modules/argparse": {
+       "version": "2.0.1",
+       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz";,
+       "integrity": 
"sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+       "dev": true
      },
-     "node_modules/magic-string": {
-       "version": "0.30.8",
-       "resolved": 
"https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz";,
-       "integrity": 
"sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==",
+     "node_modules/marked": {
+       "version": "4.3.0",
+       "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz";,
+       "integrity": 
"sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
        "dev": true,
-       "dependencies": {
-         "@jridgewell/sourcemap-codec": "^1.4.15"
+       "bin": {
+         "marked": "bin/marked.js"
        },
        "engines": {
-         "node": ">=12"
+         "node": ">= 12"
        }
      },
-     "node_modules/make-error": {
-       "version": "1.3.6",
-       "resolved": 
"https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz";,
-       "integrity": 
"sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
-       "dev": true
-     },
      "node_modules/mdurl": {
-       "version": "1.0.1",
-       "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz";,
-       "integrity": 
"sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+       "version": "2.0.0",
+       "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz";,
+       "integrity": 
"sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
        "dev": true
      },
+     "node_modules/mime": {
+       "version": "3.0.0",
+       "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz";,
+       "integrity": 
"sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+       "dev": true,
+       "bin": {
+         "mime": "cli.js"
+       },
+       "engines": {
+         "node": ">=10.0.0"
+       }
+     },
      "node_modules/minimatch": {
-       "version": "3.1.2",
-       "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz";,
-       "integrity": 
"sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+       "version": "3.1.5",
+       "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz";,
+       "integrity": 
"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
        "dev": true,
        "dependencies": {
          "brace-expansion": "^1.1.7"
@@@ -3301,32 -2354,22 +2854,38 @@@
          "node": ">=0.3.1"
        }
      },
-     "node_modules/mocha/node_modules/escape-string-regexp": {
-       "version": "4.0.0",
-       "resolved": 
"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz";,
-       "integrity": 
"sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
++    "node_modules/mocha/node_modules/find-up": {
++      "version": "5.0.0",
++      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz";,
++      "integrity": 
"sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
 +      "dev": true,
++      "dependencies": {
++        "locate-path": "^6.0.0",
++        "path-exists": "^4.0.0"
++      },
 +      "engines": {
 +        "node": ">=10"
 +      },
 +      "funding": {
 +        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
      "node_modules/mocha/node_modules/glob": {
-       "version": "8.1.0",
-       "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz";,
-       "integrity": 
"sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+       "version": "10.5.0",
+       "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz";,
+       "integrity": 
"sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+       "deprecated": "Old versions of glob are not supported, and contain 
widely publicized security vulnerabilities, which have been fixed in the 
current version. Please update. Support for old versions may be purchased (at 
exorbitant rates) by contacting [email protected]",
        "dev": true,
        "dependencies": {
-         "fs.realpath": "^1.0.0",
-         "inflight": "^1.0.4",
-         "inherits": "2",
-         "minimatch": "^5.0.1",
-         "once": "^1.3.0"
+         "foreground-child": "^3.1.0",
+         "jackspeak": "^3.1.2",
+         "minimatch": "^9.0.4",
+         "minipass": "^7.1.2",
+         "package-json-from-dist": "^1.0.0",
+         "path-scurry": "^1.11.1"
        },
-       "engines": {
-         "node": ">=12"
+       "bin": {
+         "glob": "dist/esm/bin.mjs"
        },
        "funding": {
          "url": "https://github.com/sponsors/isaacs";
@@@ -3344,52 -2387,47 +2903,113 @@@
          "js-yaml": "bin/js-yaml.js"
        }
      },
++    "node_modules/mocha/node_modules/locate-path": {
++      "version": "6.0.0",
++      "resolved": 
"https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz";,
++      "integrity": 
"sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
++      "dev": true,
++      "dependencies": {
++        "p-locate": "^5.0.0"
++      },
++      "engines": {
++        "node": ">=10"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus";
++      }
++    },
+     "node_modules/mocha/node_modules/lru-cache": {
+       "version": "10.4.3",
+       "resolved": 
"https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz";,
+       "integrity": 
"sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+       "dev": true
+     },
      "node_modules/mocha/node_modules/minimatch": {
-       "version": "5.1.6",
-       "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz";,
-       "integrity": 
"sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+       "version": "9.0.9",
+       "resolved": 
"https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz";,
+       "integrity": 
"sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+       "dev": true,
+       "dependencies": {
+         "brace-expansion": "^2.0.2"
+       },
+       "engines": {
+         "node": ">=16 || 14 >=14.17"
+       },
+       "funding": {
+         "url": "https://github.com/sponsors/isaacs";
+       }
+     },
++    "node_modules/mocha/node_modules/p-limit": {
++      "version": "3.1.0",
++      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz";,
++      "integrity": 
"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
 +      "dev": true,
 +      "dependencies": {
-         "brace-expansion": "^2.0.1"
++        "yocto-queue": "^0.1.0"
 +      },
 +      "engines": {
 +        "node": ">=10"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": 
{
-       "version": "2.0.1",
-       "resolved": 
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz";,
-       "integrity": 
"sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
++    "node_modules/mocha/node_modules/p-locate": {
++      "version": "5.0.0",
++      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz";,
++      "integrity": 
"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
 +      "dev": true,
 +      "dependencies": {
-         "balanced-match": "^1.0.0"
++        "p-limit": "^3.0.2"
++      },
++      "engines": {
++        "node": ">=10"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
-     "node_modules/mocha/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
++    "node_modules/mocha/node_modules/path-exists": {
++      "version": "4.0.0",
++      "resolved": 
"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz";,
++      "integrity": 
"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
++      "dev": true,
++      "engines": {
++        "node": ">=8"
++      }
 +    },
-     "node_modules/mocha/node_modules/supports-color": {
-       "version": "8.1.1",
-       "resolved": 
"https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz";,
-       "integrity": 
"sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+     "node_modules/mocha/node_modules/path-scurry": {
+       "version": "1.11.1",
+       "resolved": 
"https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz";,
+       "integrity": 
"sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
        "dev": true,
        "dependencies": {
-         "has-flag": "^4.0.0"
+         "lru-cache": "^10.2.0",
+         "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
        },
+       "engines": {
+         "node": ">=16 || 14 >=14.18"
+       },
+       "funding": {
+         "url": "https://github.com/sponsors/isaacs";
+       }
+     },
++    "node_modules/mocha/node_modules/yocto-queue": {
++      "version": "0.1.0",
++      "resolved": 
"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz";,
++      "integrity": 
"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
++      "dev": true,
 +      "engines": {
 +        "node": ">=10"
 +      },
 +      "funding": {
-         "url": "https://github.com/chalk/supports-color?sponsor=1";
++        "url": "https://github.com/sponsors/sindresorhus";
 +      }
 +    },
      "node_modules/ms": {
-       "version": "2.1.2",
-       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";,
-       "integrity": 
"sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+       "version": "2.1.3",
+       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz";,
+       "integrity": 
"sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
        "dev": true
      },
      "node_modules/mz": {
@@@ -3469,30 -2498,30 +3080,30 @@@
        }
      },
      "node_modules/p-limit": {
--      "version": "3.1.0",
--      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz";,
--      "integrity": 
"sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-       "dev": true,
-       "dependencies": {
-         "yocto-queue": "^0.1.0"
++      "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,
+       "dependencies": {
 -        "yocto-queue": "^0.1.0"
++        "yocto-queue": "^1.0.0"
        },
        "engines": {
--        "node": ">=10"
++        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
        },
        "funding": {
          "url": "https://github.com/sponsors/sindresorhus";
        }
      },
      "node_modules/p-locate": {
--      "version": "5.0.0",
--      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz";,
--      "integrity": 
"sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
++      "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,
        "dependencies": {
--        "p-limit": "^3.0.2"
++        "p-limit": "^4.0.0"
        },
        "engines": {
--        "node": ">=10"
++        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
        },
        "funding": {
          "url": "https://github.com/sponsors/sindresorhus";
@@@ -3548,34 -2574,13 +3156,13 @@@
          "url": "https://github.com/sponsors/sindresorhus";
        }
      },
-     "node_modules/parse-json/node_modules/type-fest": {
-       "version": "4.12.0",
-       "resolved": 
"https://registry.npmjs.org/type-fest/-/type-fest-4.12.0.tgz";,
-       "integrity": 
"sha512-5Y2/pp2wtJk8o08G0CMkuFPCO354FGwk/vbidxrdhRGZfd0tFnb4Qb8anp9XxXriwBgVPjdWbKpGl4J9lJY2jQ==",
-       "dev": true,
-       "engines": {
-         "node": ">=16"
-       },
-       "funding": {
-         "url": "https://github.com/sponsors/sindresorhus";
-       }
-     },
      "node_modules/path-exists": {
--      "version": "4.0.0",
--      "resolved": 
"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz";,
--      "integrity": 
"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-       "dev": true,
-       "engines": {
-         "node": ">=8"
-       }
-     },
-     "node_modules/path-is-absolute": {
-       "version": "1.0.1",
-       "resolved": 
"https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";,
-       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
++      "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": ">=0.10.0"
 -        "node": ">=8"
++        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
        }
      },
      "node_modules/path-key": {
@@@ -4428,53 -3181,19 +3763,62 @@@
        "integrity": 
"sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==",
        "dev": true
      },
+     "node_modules/ts-dedent": {
+       "version": "2.2.0",
+       "resolved": 
"https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz";,
+       "integrity": 
"sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+       "dev": true,
+       "engines": {
+         "node": ">=6.10"
+       }
+     },
 +    "node_modules/ts-node": {
 +      "version": "10.9.2",
 +      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz";,
 +      "integrity": 
"sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
 +      "dev": true,
 +      "dependencies": {
 +        "@cspotcode/source-map-support": "^0.8.0",
 +        "@tsconfig/node10": "^1.0.7",
 +        "@tsconfig/node12": "^1.0.7",
 +        "@tsconfig/node14": "^1.0.0",
 +        "@tsconfig/node16": "^1.0.2",
 +        "acorn": "^8.4.1",
 +        "acorn-walk": "^8.1.1",
 +        "arg": "^4.1.0",
 +        "create-require": "^1.1.0",
 +        "diff": "^4.0.1",
 +        "make-error": "^1.1.1",
 +        "v8-compile-cache-lib": "^3.0.1",
 +        "yn": "3.1.1"
 +      },
 +      "bin": {
 +        "ts-node": "dist/bin.js",
 +        "ts-node-cwd": "dist/bin-cwd.js",
 +        "ts-node-esm": "dist/bin-esm.js",
 +        "ts-node-script": "dist/bin-script.js",
 +        "ts-node-transpile-only": "dist/bin-transpile.js",
 +        "ts-script": "dist/bin-script-deprecated.js"
 +      },
 +      "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
 +        }
 +      }
 +    },
      "node_modules/tslib": {
-       "version": "2.7.0",
-       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz";,
-       "integrity": 
"sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+       "version": "2.8.1",
+       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz";,
+       "integrity": 
"sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
        "dev": true
      },
      "node_modules/type-check": {
@@@ -4498,38 -3217,37 +3842,56 @@@
          "node": ">=4"
        }
      },
+     "node_modules/type-fest": {
+       "version": "4.41.0",
+       "resolved": 
"https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz";,
+       "integrity": 
"sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+       "dev": true,
+       "engines": {
+         "node": ">=16"
+       },
+       "funding": {
+         "url": "https://github.com/sponsors/sindresorhus";
+       }
+     },
 +    "node_modules/typescript": {
-       "version": "5.4.2",
-       "resolved": 
"https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz";,
-       "integrity": 
"sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==",
++      "version": "5.9.3",
++      "resolved": 
"https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz";,
++      "integrity": 
"sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
 +      "dev": true,
 +      "bin": {
 +        "tsc": "bin/tsc",
 +        "tsserver": "bin/tsserver"
 +      },
 +      "engines": {
 +        "node": ">=14.17"
 +      }
 +    },
      "node_modules/uc.micro": {
-       "version": "1.0.6",
-       "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz";,
-       "integrity": 
"sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+       "version": "2.1.0",
+       "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz";,
+       "integrity": 
"sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+       "dev": true
+     },
+     "node_modules/underscore": {
+       "version": "1.13.8",
+       "resolved": 
"https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz";,
+       "integrity": 
"sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==",
        "dev": true
      },
 +    "node_modules/undici-types": {
-       "version": "5.26.5",
-       "resolved": 
"https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz";,
-       "integrity": 
"sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
++      "version": "7.18.2",
++      "resolved": 
"https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz";,
++      "integrity": 
"sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
 +      "dev": true
 +    },
      "node_modules/unicorn-magic": {
-       "version": "0.1.0",
-       "resolved": 
"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz";,
-       "integrity": 
"sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+       "version": "0.4.0",
+       "resolved": 
"https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz";,
+       "integrity": 
"sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==",
        "dev": true,
        "engines": {
-         "node": ">=18"
+         "node": ">=20"
        },
        "funding": {
          "url": "https://github.com/sponsors/sindresorhus";
@@@ -4765,22 -3495,13 +4145,22 @@@
          "node": ">=10"
        }
      },
 +    "node_modules/yn": {
 +      "version": "3.1.1",
 +      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz";,
 +      "integrity": 
"sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
 +      "dev": true,
 +      "engines": {
 +        "node": ">=6"
 +      }
 +    },
      "node_modules/yocto-queue": {
--      "version": "0.1.0",
--      "resolved": 
"https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz";,
--      "integrity": 
"sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
++      "version": "1.2.2",
++      "resolved": 
"https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz";,
++      "integrity": 
"sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
        "dev": true,
        "engines": {
--        "node": ">=10"
++        "node": ">=12.20"
        },
        "funding": {
          "url": "https://github.com/sponsors/sindresorhus";
diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
index 7ee2337610,4790f466b5..159446a187
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
@@@ -43,16 -28,17 +43,19 @@@
      "chai": "~4.5.0",
      "chai-string": "~1.5.0",
      "colors": "1.4.0",
-     "cross-env": "^7.0.3",
-     "eslint": "^8.42.0",
+     "cross-env": "^10.1.0",
+     "@cucumber/cucumber": "~12.7.0",
+     "@eslint/js": "^9.16.0",
+     "eslint": "^9.36.0",
      "eslint-config-prettier": "^10.0.1",
      "eslint-plugin-prettier": "^5.0.0",
-     "jsdoc": "^3.6.3",
+     "globals": "^15.14.0",
+     "jsdoc": "^4.0.5",
      "js-yaml": "^3.14.2",
-     "mocha": "^10.2.0",
+     "mocha": "^11.7.5",
 -    "prettier": "^3.0.0"
 +    "prettier": "^3.0.0",
 +    "ts-node": "^10.9.2",
 +    "typescript": "^5.4.2"
    },
    "repository": {
      "type": "git",
@@@ -63,21 -49,19 +66,21 @@@
      "url": "https://issues.apache.org/jira/browse/TINKERPOP";
    },
    "scripts": {
 +    "build": "rm -rf build && duel --dirs",
 +    "prepare": "npm run build",
      "test": "npm run unit-test && npm run integration-test",
 -    "unit-test": "mocha test/unit/*",
 +    "unit-test": "cross-env TS_NODE_PROJECT='tsconfig.test.json' mocha 
test/unit/*",
      "integration-test": "npm run integration-test-graphson30 && npm run 
integration-test-graphbinary",
 -    "integration-test-graphson30": "cross-env 
CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' 
./node_modules/mocha/bin/mocha.js test/integration -t 5000",
 -    "integration-test-graphbinary": "cross-env 
CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' 
./node_modules/mocha/bin/mocha.js test/integration -t 5000",
 +    "integration-test-graphson30": "cross-env 
TS_NODE_PROJECT='tsconfig.test.json' 
CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' 
./node_modules/mocha/bin/mocha.js test/integration -t 5000",
 +    "integration-test-graphbinary": "cross-env 
TS_NODE_PROJECT='tsconfig.test.json' 
CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' 
./node_modules/mocha/bin/mocha.js test/integration -t 5000",
      "TODO": "# test other mime types like graphbinary stringd",
      "features": "npm run features-graphson30 && npm run features-graphbinary",
 -    "features-graphson30": "cross-env 
CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not 
@DataUUID and not @DataLong\" --require test/cucumber 
../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/",
 -    "features-graphbinary": "cross-env 
CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not 
@DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" 
--require test/cucumber 
../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/",
 +    "features-graphson30": "cross-env NODE_OPTIONS='--loader ts-node/esm' 
TS_NODE_PROJECT='tsconfig.test.json' 
CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not 
@DataUUID and not @DataLong\" --import test/cucumber 
../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/",
 +    "features-graphbinary": "cross-env NODE_OPTIONS='--loader ts-node/esm' 
TS_NODE_PROJECT='tsconfig.test.json' 
CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not 
@DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" 
--import test/cucumber 
../../../../../gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/",
      "features-docker": "npm run features-graphson30-docker && npm run 
features-graphbinary-docker",
 -    "features-graphson30-docker": "cross-env 
CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not 
@DataUUID and not @DataLong\" --require test/cucumber ../gremlin-test/",
 -    "features-graphbinary-docker": "cross-env 
CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not 
@DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" 
--require test/cucumber ../gremlin-test/",
 +    "features-graphson30-docker": "cross-env NODE_OPTIONS='--loader 
ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' 
CLIENT_MIMETYPE='application/vnd.gremlin-v3.0+json' cucumber-js --tags \"not 
@DataUUID and not @DataLong\" --import test/cucumber ../gremlin-test/",
 +    "features-graphbinary-docker": "cross-env NODE_OPTIONS='--loader 
ts-node/esm' TS_NODE_PROJECT='tsconfig.test.json' 
CLIENT_MIMETYPE='application/vnd.graphbinary-v1.0' cucumber-js --tags \"not 
@DataBigDecimal and not @DataBigInt and not @DataUUID and not @DataLong\" 
--import test/cucumber ../gremlin-test/",
-     "lint": "eslint --ext .js .",
+     "lint": "eslint .",
      "doc": "jsdoc -r -d doc -R README.md lib/"
    },
    "engines": {

Reply via email to