diff options
66 files changed, 3176 insertions, 182 deletions
| diff --git a/.eslintrc.json b/.eslintrc.json index 32bbdaec..30d495d2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -32,7 +32,10 @@          "jsonc",          "unused-imports",          "@typescript-eslint", -        "@stylistic" +        "@stylistic", +        "unicorn", +        "sonarjs", +        "import"      ],      "ignorePatterns": [          "/ext/lib/", @@ -247,7 +250,107 @@          "eslint-comments/no-unused-disable": "error", -        "unused-imports/no-unused-imports": "error" +        "unused-imports/no-unused-imports": "error", + +        "import/extensions": ["error", "ignorePackages"], + +        "unicorn/catch-error-name": ["error", {"ignore": ["^(e|error2?)$"]}], +        "unicorn/custom-error-definition": "error", +        "unicorn/empty-brace-spaces": "error", +        "unicorn/error-message": "error", +        "unicorn/expiring-todo-comments": "error", +        "unicorn/explicit-length-check": "error", +        "unicorn/new-for-builtins": "error", +        "unicorn/no-abusive-eslint-disable": "error", +        "unicorn/no-array-for-each": "error", +        "unicorn/no-array-method-this-argument": "error", +        "unicorn/no-array-push-push": "error", +        "unicorn/no-array-reduce": "error", +        "unicorn/no-console-spaces": "error", +        "unicorn/no-document-cookie": "error", +        "unicorn/no-empty-file": "error", +        "unicorn/no-hex-escape": "error", +        "unicorn/no-instanceof-array": "error", +        "unicorn/no-invalid-remove-event-listener": "error", +        "unicorn/no-lonely-if": "error", +        "unicorn/no-nested-ternary": "error", +        "unicorn/no-new-buffer": "error", +        "unicorn/no-object-as-default-parameter": "error", +        "unicorn/no-static-only-class": "error", +        "unicorn/no-thenable": "error", +        "unicorn/no-unnecessary-await": "error", +        "unicorn/no-unnecessary-polyfills": "error", +        "unicorn/no-unreadable-array-destructuring": "error", +        "unicorn/no-unreadable-iife": "error", +        "unicorn/no-useless-fallback-in-spread": "error", +        "unicorn/no-useless-length-check": "error", +        "unicorn/no-useless-promise-resolve-reject": "error", +        "unicorn/no-useless-spread": "error", +        "unicorn/no-useless-switch-case": "error", +        "unicorn/no-useless-undefined": "error", +        "unicorn/no-zero-fractions": "error", +        "unicorn/prefer-array-find": "error", +        "unicorn/prefer-array-flat": "error", +        "unicorn/prefer-array-flat-map": "error", +        "unicorn/prefer-array-index-of": "error", +        "unicorn/prefer-array-some": "error", +        "unicorn/prefer-date-now": "error", +        "unicorn/prefer-default-parameters": "error", +        "unicorn/prefer-dom-node-dataset": "error", +        "unicorn/prefer-dom-node-text-content": "error", +        "unicorn/prefer-event-target": "error", +        "unicorn/prefer-export-from": "error", +        "unicorn/prefer-includes": "error", +        "unicorn/prefer-keyboard-event-key": "error", +        "unicorn/prefer-logical-operator-over-ternary": "error", +        "unicorn/prefer-modern-math-apis": "error", +        "unicorn/prefer-module": "error", +        "unicorn/prefer-native-coercion-functions": "error", +        "unicorn/prefer-negative-index": "error", +        "unicorn/prefer-number-properties": "error", +        "unicorn/prefer-object-from-entries": "error", +        "unicorn/prefer-prototype-methods": "error", +        "unicorn/prefer-reflect-apply": "error", +        "unicorn/prefer-regexp-test": "error", +        "unicorn/prefer-set-has": "error", +        "unicorn/prefer-set-size": "error", +        "unicorn/prefer-spread": "error", +        "unicorn/prefer-string-starts-ends-with": "error", +        "unicorn/prefer-string-trim-start-end": "error", +        "unicorn/prefer-switch": "error", +        "unicorn/prefer-ternary": "error", +        "unicorn/relative-url-style": "error", +        "unicorn/require-array-join-separator": "error", +        "unicorn/require-number-to-fixed-digits-argument": "error", +        "unicorn/template-indent": "error", +        "unicorn/throw-new-error": "error", + +        "sonarjs/max-switch-cases": "error", +        "sonarjs/no-all-duplicated-branches": "error", +        "sonarjs/no-collapsible-if": "error", +        "sonarjs/no-collection-size-mischeck": "error", +        "sonarjs/no-duplicated-branches": "error", +        "sonarjs/no-element-overwrite": "error", +        "sonarjs/no-empty-collection": "error", +        "sonarjs/no-extra-arguments": "error", +        "sonarjs/no-gratuitous-expressions": "error", +        "sonarjs/no-identical-conditions": "error", +        "sonarjs/no-identical-expressions": "error", +        "sonarjs/no-identical-functions": "error", +        "sonarjs/no-ignored-return": "error", +        "sonarjs/no-inverted-boolean-check": "error", +        "sonarjs/no-one-iteration-loop": "error", +        "sonarjs/no-redundant-boolean": "error", +        "sonarjs/no-redundant-jump": "error", +        "sonarjs/no-same-line-conditional": "error", +        "sonarjs/no-unused-collection": "error", +        "sonarjs/no-use-of-empty-return-value": "error", +        "sonarjs/no-useless-catch": "error", +        "sonarjs/non-existent-operator": "error", +        "sonarjs/prefer-immediate-return": "error", +        "sonarjs/prefer-object-literal": "error", +        "sonarjs/prefer-single-boolean-return": "error", +        "sonarjs/prefer-while": "error"      },      "overrides": [          { diff --git a/dev/bin/build.js b/dev/bin/build.js index bc0a8cb8..e22159d6 100644 --- a/dev/bin/build.js +++ b/dev/bin/build.js @@ -195,12 +195,10 @@ async function build(buildDir, extDir, manifestUtil, variantNames, manifestPath,                  await createZip(extDir, excludeFiles, fullFileName, sevenZipExes, onUpdate, dryRun);              } -            if (!dryRun) { -                if (Array.isArray(fileCopies)) { -                    for (const fileName2 of fileCopies) { -                        const fileName2Safe = path.basename(fileName2); -                        fs.copyFileSync(fullFileName, path.join(buildDir, fileName2Safe)); -                    } +            if (!dryRun && Array.isArray(fileCopies)) { +                for (const fileName2 of fileCopies) { +                    const fileName2Safe = path.basename(fileName2); +                    fs.copyFileSync(fullFileName, path.join(buildDir, fileName2Safe));                  }              }          } diff --git a/dev/build-libs.js b/dev/build-libs.js index 15ab3c8d..f1570fad 100644 --- a/dev/build-libs.js +++ b/dev/build-libs.js @@ -64,6 +64,7 @@ export async function buildLibs() {      const schemaFileNames = fs.readdirSync(schemaDir);      const schemas = schemaFileNames.map((schemaFileName) => {          /** @type {import('ajv').AnySchema} */ +        // eslint-disable-next-line sonarjs/prefer-immediate-return          const result = parseJson(fs.readFileSync(path.join(schemaDir, schemaFileName), {encoding: 'utf8'}));          return result;      }); diff --git a/dev/data-error.js b/dev/data-error.js index 5659245b..eb7f71bc 100644 --- a/dev/data-error.js +++ b/dev/data-error.js @@ -18,12 +18,14 @@  /**   * Schema validation error type.   */ -class DataError extends Error { +export class DataError extends Error {      /**       * @param {string} message       */      constructor(message) {          super(message); +        /** @type {string} */ +        this.name = 'DataError';          /** @type {unknown} */          this._data = void 0;      } @@ -32,7 +34,3 @@ class DataError extends Error {      get data() { return this._data; }      set data(value) { this._data = value; }  } - -module.exports = { -    DataError -}; diff --git a/dev/generate-css-json.js b/dev/generate-css-json.js index 26bdfa64..a837c9e2 100644 --- a/dev/generate-css-json.js +++ b/dev/generate-css-json.js @@ -101,11 +101,11 @@ export function formatRulesJson(rules) {      for (const {selectors, styles} of rules) {          if (ruleIndex > 0) { result += ','; }          result += `\n${indent1}{\n${indent2}"selectors": `; -        if (selectors.length === 1) { -            result += `[${JSON.stringify(selectors[0], null, 4)}]`; -        } else { -            result += JSON.stringify(selectors, null, 4).replace(/\n/g, '\n' + indent2); -        } +        result += ( +            selectors.length === 1 ? +            `[${JSON.stringify(selectors[0], null, 4)}]` : +            JSON.stringify(selectors, null, 4).replace(/\n/g, '\n' + indent2) +        );          result += `,\n${indent2}"styles": [`;          let styleIndex = 0;          for (const [key, value] of styles) { diff --git a/dev/lib/dexie.js b/dev/lib/dexie.js index ffbd2923..83015e25 100644 --- a/dev/lib/dexie.js +++ b/dev/lib/dexie.js @@ -15,7 +15,6 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ -import Dexie from 'dexie'; -import 'dexie-export-import'; +export {default as Dexie} from 'dexie'; -export {Dexie}; +import 'dexie-export-import'; diff --git a/dev/schema-validate.js b/dev/schema-validate.js index d1ffcf82..3ad247d9 100644 --- a/dev/schema-validate.js +++ b/dev/schema-validate.js @@ -18,6 +18,7 @@  import Ajv from 'ajv';  import {readFileSync} from 'fs'; +import {fileURLToPath} from 'url';  import {JsonSchema} from '../ext/js/data/json-schema.js';  import {DataError} from './data-error.js';  import {parseJson} from './json.js'; @@ -32,7 +33,7 @@ class JsonSchemaAjv {              strictTuples: false,              allowUnionTypes: true          }); -        const metaSchemaPath = require.resolve('ajv/dist/refs/json-schema-draft-07.json'); +        const metaSchemaPath = fileURLToPath(import.meta.resolve('ajv/dist/refs/json-schema-draft-07.json'));          /** @type {import('ajv').AnySchemaObject} */          const metaSchema = parseJson(readFileSync(metaSchemaPath, {encoding: 'utf8'}));          ajv.addMetaSchema(metaSchema); diff --git a/dev/util.js b/dev/util.js index 89bd95da..eee16964 100644 --- a/dev/util.js +++ b/dev/util.js @@ -40,10 +40,8 @@ export function getAllFiles(baseDirectory, predicate = null) {                  if (typeof predicate !== 'function' || predicate(relativeFileName, false)) {                      results.push(relativeFileName);                  } -            } else if (stats.isDirectory()) { -                if (typeof predicate !== 'function' || predicate(relativeFileName, true)) { -                    directories.push(fullFileName); -                } +            } else if (stats.isDirectory() && (typeof predicate !== 'function' || predicate(relativeFileName, true))) { +                directories.push(fullFileName);              }          }      } diff --git a/ext/js/accessibility/google-docs-util.js b/ext/js/accessibility/google-docs-util.js index 969e650e..31ae5982 100644 --- a/ext/js/accessibility/google-docs-util.js +++ b/ext/js/accessibility/google-docs-util.js @@ -86,6 +86,8 @@ export class GoogleDocsUtil {          const content = document.createTextNode(text);          const svgText = document.createElementNS('http://www.w3.org/2000/svg', 'text');          const transform = element.getAttribute('transform') || ''; +        // Using getAttribute instead of dataset because element is an SVG element +        // eslint-disable-next-line unicorn/prefer-dom-node-dataset          const font = element.getAttribute('data-font-css') || '';          const elementX = element.getAttribute('x');          const elementY = element.getAttribute('y'); diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 27e7700e..84a8f1e6 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -82,9 +82,9 @@ export class Frontend {          /** @type {?import('settings').ProfileOptions} */          this._options = null;          /** @type {number} */ -        this._pageZoomFactor = 1.0; +        this._pageZoomFactor = 1;          /** @type {number} */ -        this._contentScale = 1.0; +        this._contentScale = 1;          /** @type {Promise<void>} */          this._lastShowPromise = Promise.resolve();          /** @type {TextSourceGenerator} */ @@ -788,7 +788,7 @@ export class Frontend {          }          if (popupScaleRelativeToVisualViewport) {              const {visualViewport} = window; -            const visualViewportScale = (typeof visualViewport !== 'undefined' && visualViewport !== null ? visualViewport.scale : 1.0); +            const visualViewportScale = (typeof visualViewport !== 'undefined' && visualViewport !== null ? visualViewport.scale : 1);              contentScale /= visualViewportScale;          }          if (contentScale === this._contentScale) { return; } diff --git a/ext/js/app/popup.js b/ext/js/app/popup.js index 08ff0661..103a5468 100644 --- a/ext/js/app/popup.js +++ b/ext/js/app/popup.js @@ -68,7 +68,7 @@ export class Popup extends EventDispatcher {          /** @type {?import('settings').OptionsContext} */          this._optionsContext = null;          /** @type {number} */ -        this._contentScale = 1.0; +        this._contentScale = 1;          /** @type {string} */          this._targetOrigin = chrome.runtime.getURL('/').replace(/\/$/, ''); @@ -777,7 +777,7 @@ export class Popup extends EventDispatcher {      _getPosition(sourceRects, writingMode, viewport) {          sourceRects = this._convertSourceRectsCoordinateSpace(sourceRects);          const contentScale = this._contentScale; -        const scaleRatio = this._frameSizeContentScale === null ? 1.0 : contentScale / this._frameSizeContentScale; +        const scaleRatio = this._frameSizeContentScale === null ? 1 : contentScale / this._frameSizeContentScale;          this._frameSizeContentScale = contentScale;          const frameRect = this._frame.getBoundingClientRect();          const frameWidth = Math.max(frameRect.width * scaleRatio, this._initialWidth * contentScale); @@ -1133,6 +1133,8 @@ class PopupError extends ExtensionError {       */      constructor(message, source) {          super(message); +        /** @type {string} */ +        this.name = 'PopupError';          /** @type {Popup} */          this._source = source;      } diff --git a/ext/js/app/theme-controller.js b/ext/js/app/theme-controller.js index 559a6e57..384fbcc8 100644 --- a/ext/js/app/theme-controller.js +++ b/ext/js/app/theme-controller.js @@ -190,9 +190,9 @@ export class ThemeController {          if (color === null) { return; }          const a = color[3]; -        if (a <= 0.0) { return; } +        if (a <= 0) { return; } -        const aInv = 1.0 - a; +        const aInv = 1 - a;          for (let i = 0; i < 3; ++i) {              target[i] = target[i] * aInv + color[i] * a;          } @@ -212,7 +212,7 @@ export class ThemeController {              Number.parseInt(m[1], 10),              Number.parseInt(m[2], 10),              Number.parseInt(m[3], 10), -            m4 ? Math.max(0.0, Math.min(1.0, Number.parseFloat(m4))) : 1.0 +            m4 ? Math.max(0, Math.min(1, Number.parseFloat(m4))) : 1          ];      }  } diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js index 090ba7b3..8ab56232 100644 --- a/ext/js/background/backend.js +++ b/ext/js/background/backend.js @@ -701,7 +701,7 @@ export class Backend {                  typeof chrome.tabs.getZoom === 'function'              )) {                  // Not supported -                resolve({zoomFactor: 1.0}); +                resolve({zoomFactor: 1});                  return;              }              chrome.tabs.getZoom(tabId, (zoomFactor) => { @@ -1701,10 +1701,8 @@ export class Backend {                  // NOP              } -            if (okay && !done) { -                if (add(item)) { -                    done = true; -                } +            if (okay && !done && add(item)) { +                done = true;              }          }; @@ -2294,7 +2292,7 @@ export class Backend {       */      _replaceInvalidFileNameCharacters(fileName) {          // eslint-disable-next-line no-control-regex -        return fileName.replace(/[<>:"/\\|?*\x00-\x1F]/g, '-'); +        return fileName.replace(/[<>:"/\\|?*\u0000-\u001F]/g, '-');      }      /** diff --git a/ext/js/background/offscreen-proxy.js b/ext/js/background/offscreen-proxy.js index 8c3f63c9..2351cb96 100644 --- a/ext/js/background/offscreen-proxy.js +++ b/ext/js/background/offscreen-proxy.js @@ -144,8 +144,7 @@ export class DictionaryDatabaseProxy {       */      async getMedia(targets) {          const serializedMedia = /** @type {import('dictionary-database').Media<string>[]} */ (await this._offscreen.sendMessagePromise({action: 'databaseGetMediaOffscreen', params: {targets}})); -        const media = serializedMedia.map((m) => ({...m, content: base64ToArrayBuffer(m.content)})); -        return media; +        return serializedMedia.map((m) => ({...m, content: base64ToArrayBuffer(m.content)}));      }  } diff --git a/ext/js/background/offscreen.js b/ext/js/background/offscreen.js index 754db517..dbdb9773 100644 --- a/ext/js/background/offscreen.js +++ b/ext/js/background/offscreen.js @@ -109,8 +109,7 @@ export class Offscreen {      /** @type {import('offscreen').ApiHandler<'databaseGetMediaOffscreen'>} */      async _getMediaHandler({targets}) {          const media = await this._dictionaryDatabase.getMedia(targets); -        const serializedMedia = media.map((m) => ({...m, content: arrayBufferToBase64(m.content)})); -        return serializedMedia; +        return media.map((m) => ({...m, content: arrayBufferToBase64(m.content)}));      }      /** @type {import('offscreen').ApiHandler<'translatorPrepareOffscreen'>} */ diff --git a/ext/js/core/extension-error.js b/ext/js/core/extension-error.js index ab1c9dd7..6458f477 100644 --- a/ext/js/core/extension-error.js +++ b/ext/js/core/extension-error.js @@ -26,6 +26,8 @@ export class ExtensionError extends Error {       */      constructor(message) {          super(message); +        /** @type {string} */ +        this.name = 'ExtensionError';          /** @type {unknown} */          this._data = void 0;      } diff --git a/ext/js/data/json-schema.js b/ext/js/data/json-schema.js index 3342e387..9e1497e9 100644 --- a/ext/js/data/json-schema.js +++ b/ext/js/data/json-schema.js @@ -27,6 +27,8 @@ export class JsonSchemaError extends Error {       */      constructor(message, valueStack, schemaStack) {          super(message); +        /** @type {string} */ +        this.name = 'JsonSchemaError';          /** @type {import('ext/json-schema').ValueStackItem[]} */          this._valueStack = valueStack;          /** @type {import('ext/json-schema').SchemaStackItem[]} */ @@ -371,18 +373,16 @@ export class JsonSchema {              return {schema, stack: [{schema, path: null}]};          }          const {prefixItems} = schema; -        if (typeof prefixItems !== 'undefined') { -            if (index >= 0 && index < prefixItems.length) { -                const itemSchema = prefixItems[index]; -                if (typeof itemSchema !== 'undefined') { -                    return { -                        schema: itemSchema, -                        stack: [ -                            {schema: prefixItems, path: 'prefixItems'}, -                            {schema: itemSchema, path: index} -                        ] -                    }; -                } +        if (typeof prefixItems !== 'undefined' && index >= 0 && index < prefixItems.length) { +            const itemSchema = prefixItems[index]; +            if (typeof itemSchema !== 'undefined') { +                return { +                    schema: itemSchema, +                    stack: [ +                        {schema: prefixItems, path: 'prefixItems'}, +                        {schema: itemSchema, path: index} +                    ] +                };              }          }          const {items} = schema; diff --git a/ext/js/data/permissions-util.js b/ext/js/data/permissions-util.js index 837b6d5f..097fe34d 100644 --- a/ext/js/data/permissions-util.js +++ b/ext/js/data/permissions-util.js @@ -113,10 +113,8 @@ export function getRequiredPermissionsForAnkiFieldValue(fieldValue) {  export function hasRequiredPermissionsForOptions(permissions, options) {      const permissionsSet = new Set(permissions.permissions); -    if (!permissionsSet.has('nativeMessaging')) { -        if (options.parsing.enableMecabParser) { -            return false; -        } +    if (!permissionsSet.has('nativeMessaging') && options.parsing.enableMecabParser) { +        return false;      }      if (!permissionsSet.has('clipboardRead')) { diff --git a/ext/js/display/display-anki.js b/ext/js/display/display-anki.js index 4766f1ae..d37efa85 100644 --- a/ext/js/display/display-anki.js +++ b/ext/js/display/display-anki.js @@ -953,6 +953,8 @@ class DisplayAnkiError extends Error {       */      constructor(message) {          super(message); +        /** @type {string} */ +        this.name = 'DisplayAnkiError';          /** @type {?import('anki-note-builder').Requirement[]} */          this._requirements = null;          /** @type {?import('anki-note-builder').Requirement[]} */ diff --git a/ext/js/display/display-audio.js b/ext/js/display/display-audio.js index 7d75d6b0..5f4131d0 100644 --- a/ext/js/display/display-audio.js +++ b/ext/js/display/display-audio.js @@ -33,7 +33,7 @@ export class DisplayAudio {          /** @type {AudioSystem} */          this._audioSystem = new AudioSystem();          /** @type {number} */ -        this._playbackVolume = 1.0; +        this._playbackVolume = 1;          /** @type {boolean} */          this._autoPlay = false;          /** @type {?import('core').Timeout} */ @@ -166,7 +166,7 @@ export class DisplayAudio {      _onOptionsUpdated({options}) {          const {enabled, autoPlay, volume, sources} = options.audio;          this._autoPlay = enabled && autoPlay; -        this._playbackVolume = Number.isFinite(volume) ? Math.max(0.0, Math.min(1.0, volume / 100.0)) : 1.0; +        this._playbackVolume = Number.isFinite(volume) ? Math.max(0, Math.min(1, volume / 100)) : 1;          /** @type {Set<import('settings').AudioSourceType>} */          const requiredAudioSources = new Set([ @@ -534,7 +534,7 @@ export class DisplayAudio {          if (headwordNode !== null) {              const {index} = headwordNode.dataset;              if (typeof index === 'string') { -                const headwordIndex = parseInt(index, 10); +                const headwordIndex = Number.parseInt(index, 10);                  if (Number.isFinite(headwordIndex)) { return headwordIndex; }              }          } diff --git a/ext/js/display/display.js b/ext/js/display/display.js index a5dad2d1..d30ed8a0 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -619,7 +619,7 @@ export class Display extends EventDispatcher {          if (node === null) { return -1; }          const {index} = node.dataset;          if (typeof index !== 'string') { return -1; } -        const indexNumber = parseInt(index, 10); +        const indexNumber = Number.parseInt(index, 10);          return Number.isFinite(indexNumber) ? indexNumber : -1;      } @@ -1020,7 +1020,7 @@ export class Display extends EventDispatcher {          const node = /** @type {HTMLElement} */ (e.currentTarget);          const {index} = node.dataset;          if (typeof index !== 'string') { return; } -        const indexNumber = parseInt(index, 10); +        const indexNumber = Number.parseInt(index, 10);          if (!Number.isFinite(indexNumber)) { return; }          this._entrySetCurrent(indexNumber);      } @@ -1146,8 +1146,7 @@ export class Display extends EventDispatcher {       */      async _findDictionaryEntries(isKanji, source, wildcardsEnabled, optionsContext) {          if (isKanji) { -            const dictionaryEntries = await this._application.api.kanjiFind(source, optionsContext); -            return dictionaryEntries; +            return await this._application.api.kanjiFind(source, optionsContext);          } else {              /** @type {import('api').FindTermsDetails} */              const findDetails = {}; @@ -1555,11 +1554,11 @@ export class Display extends EventDispatcher {       * @returns {boolean}       */      _relativeTermView(next) { -        if (next) { -            return this._history.hasNext() && this._history.forward(); -        } else { -            return this._history.hasPrevious() && this._history.back(); -        } +        return ( +            next ? +            this._history.hasNext() && this._history.forward() : +            this._history.hasPrevious() && this._history.back() +        );      }      /** diff --git a/ext/js/display/element-overflow-controller.js b/ext/js/display/element-overflow-controller.js index e0b9035e..eb83dda4 100644 --- a/ext/js/display/element-overflow-controller.js +++ b/ext/js/display/element-overflow-controller.js @@ -157,11 +157,11 @@ export class ElementOverflowController {       * @returns {number|import('core').Timeout}       */      _requestIdleCallback(callback, timeout) { -        if (typeof requestIdleCallback === 'function') { -            return requestIdleCallback(callback, {timeout}); -        } else { -            return setTimeout(callback, timeout); -        } +        return ( +            typeof requestIdleCallback === 'function' ? +            requestIdleCallback(callback, {timeout}) : +            setTimeout(callback, timeout) +        );      }      /** diff --git a/ext/js/display/sandbox/structured-content-generator.js b/ext/js/display/sandbox/structured-content-generator.js index a04feaf2..1dfde39b 100644 --- a/ext/js/display/sandbox/structured-content-generator.js +++ b/ext/js/display/sandbox/structured-content-generator.js @@ -137,7 +137,7 @@ export class StructuredContentGenerator {              imageContainer.title = title;          } -        aspectRatioSizer.style.paddingTop = `${invAspectRatio * 100.0}%`; +        aspectRatioSizer.style.paddingTop = `${invAspectRatio * 100}%`;          if (this._contentManager !== null) {              this._contentManager.loadMedia( diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js index ed2061e2..6767dce7 100644 --- a/ext/js/display/search-display-controller.js +++ b/ext/js/display/search-display-controller.js @@ -322,7 +322,7 @@ export class SearchDisplayController {       */      async _onProfileSelectChange(event) {          const node = /** @type {HTMLInputElement} */ (event.currentTarget); -        const value = parseInt(node.value, 10); +        const value = Number.parseInt(node.value, 10);          const optionsFull = await this._display.application.api.optionsGetFull();          if (typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= optionsFull.profiles.length) {              this._setPrimaryProfileIndex(value); @@ -574,8 +574,7 @@ export class SearchDisplayController {              case 'select':                  return true;          } -        if (element instanceof HTMLElement && element.isContentEditable) { return true; } -        return false; +        return element instanceof HTMLElement && !!element.isContentEditable;      }      /** diff --git a/ext/js/dom/document-util.js b/ext/js/dom/document-util.js index 1ec699e6..a98bfe86 100644 --- a/ext/js/dom/document-util.js +++ b/ext/js/dom/document-util.js @@ -18,7 +18,9 @@  /**   * This class contains utility functions related to the HTML document. + * TODO : This class should be made non-static   */ +// eslint-disable-next-line unicorn/no-static-only-class  export class DocumentUtil {      /** @type {?boolean} */      static _cssZoomSupported = null; @@ -460,7 +462,7 @@ export class DocumentUtil {              if (typeof value !== 'string' || value.length === 0) {                  return null;              } -            value = parseFloat(value); +            value = Number.parseFloat(value);          }          return !Number.isNaN(value) ? value : null;      } diff --git a/ext/js/dom/dom-text-scanner.js b/ext/js/dom/dom-text-scanner.js index f1dc3661..5b3ea564 100644 --- a/ext/js/dom/dom-text-scanner.js +++ b/ext/js/dom/dom-text-scanner.js @@ -488,8 +488,8 @@ export class DOMTextScanner {      static isStyleVisible(style) {          return !(              style.visibility === 'hidden' || -            parseFloat(style.opacity) <= 0 || -            parseFloat(style.fontSize) <= 0 || +            Number.parseFloat(style.opacity) <= 0 || +            Number.parseFloat(style.fontSize) <= 0 ||              (                  !DOMTextScanner.isStyleSelectable(style) &&                  ( diff --git a/ext/js/dom/panel-element.js b/ext/js/dom/panel-element.js index 9c1289d7..0f2801e6 100644 --- a/ext/js/dom/panel-element.js +++ b/ext/js/dom/panel-element.js @@ -89,16 +89,14 @@ export class PanelElement extends EventDispatcher {       * @param {(details: import('core').EventArgument<import('panel-element').Events, TName>) => void} callback       */      on(eventName, callback) { -        if (eventName === 'visibilityChanged') { -            if (this._mutationObserver === null) { -                this._visible = this.isVisible(); -                this._mutationObserver = new MutationObserver(this._onMutation.bind(this)); -                this._mutationObserver.observe(this._node, { -                    attributes: true, -                    attributeFilter: ['hidden'], -                    attributeOldValue: true -                }); -            } +        if (eventName === 'visibilityChanged' && this._mutationObserver === null) { +            this._visible = this.isVisible(); +            this._mutationObserver = new MutationObserver(this._onMutation.bind(this)); +            this._mutationObserver.observe(this._node, { +                attributes: true, +                attributeFilter: ['hidden'], +                attributeOldValue: true +            });          }          super.on(eventName, callback);      } @@ -111,11 +109,9 @@ export class PanelElement extends EventDispatcher {       */      off(eventName, callback) {          const result = super.off(eventName, callback); -        if (eventName === 'visibilityChanged' && !this.hasListeners(eventName)) { -            if (this._mutationObserver !== null) { -                this._mutationObserver.disconnect(); -                this._mutationObserver = null; -            } +        if (eventName === 'visibilityChanged' && !this.hasListeners(eventName) && this._mutationObserver !== null) { +            this._mutationObserver.disconnect(); +            this._mutationObserver = null;          }          return result;      } diff --git a/ext/js/dom/popup-menu.js b/ext/js/dom/popup-menu.js index 8a8a19ba..28bcc309 100644 --- a/ext/js/dom/popup-menu.js +++ b/ext/js/dom/popup-menu.js @@ -219,8 +219,8 @@ export class PopupMenu extends EventDispatcher {              (bottom - top) * ((-vertical + 1) * -0.5)          ); -        x = Math.max(0.0, Math.min(containerNodeRect.width - menuRect.width, x)); -        y = Math.max(0.0, Math.min(containerNodeRect.height - menuRect.height, y)); +        x = Math.max(0, Math.min(containerNodeRect.width - menuRect.width, x)); +        y = Math.max(0, Math.min(containerNodeRect.height - menuRect.height, y));          menu.style.left = `${x}px`;          menu.style.top = `${y}px`; diff --git a/ext/js/dom/scroll-element.js b/ext/js/dom/scroll-element.js index 8005469b..7cd00f01 100644 --- a/ext/js/dom/scroll-element.js +++ b/ext/js/dom/scroll-element.js @@ -133,10 +133,10 @@ export class ScrollElement {       */      _easeInOutCubic(t) {          if (t < 0.5) { -            return (4.0 * t * t * t); +            return (4 * t * t * t);          } else { -            t = 1.0 - t; -            return 1.0 - (4.0 * t * t * t); +            t = 1 - t; +            return 1 - (4 * t * t * t);          }      } diff --git a/ext/js/dom/selector-observer.js b/ext/js/dom/selector-observer.js index 791ce627..86607130 100644 --- a/ext/js/dom/selector-observer.js +++ b/ext/js/dom/selector-observer.js @@ -170,7 +170,7 @@ export class SelectorObserver {          if (              this._onChildrenUpdated !== null && -            (addedNodes.length !== 0 || addedNodes.length !== 0) +            (removedNodes.length > 0 || addedNodes.length > 0)          ) {              for (let node = /** @type {?Node} */ (target); node !== null; node = node.parentNode) {                  const observer = this._elementMap.get(node); diff --git a/ext/js/dom/text-source-generator.js b/ext/js/dom/text-source-generator.js index a5529779..83c7271c 100644 --- a/ext/js/dom/text-source-generator.js +++ b/ext/js/dom/text-source-generator.js @@ -307,8 +307,8 @@ export class TextSourceGenerator {          // Adjust size          const imposterRect = imposter.getBoundingClientRect();          if (imposterRect.width !== elementRect.width || imposterRect.height !== elementRect.height) { -            const width = parseFloat(elementStyle.width) + (elementRect.width - imposterRect.width); -            const height = parseFloat(elementStyle.height) + (elementRect.height - imposterRect.height); +            const width = Number.parseFloat(elementStyle.width) + (elementRect.width - imposterRect.width); +            const height = Number.parseFloat(elementStyle.height) + (elementRect.height - imposterRect.height);              this._setImposterStyle(imposterStyle, 'width', `${width}px`);              this._setImposterStyle(imposterStyle, 'height', `${height}px`);          } @@ -614,7 +614,7 @@ export class TextSourceGenerator {          }          const style = window.getComputedStyle(element);          return ( -            parseFloat(style.opacity) <= 0 || +            Number.parseFloat(style.opacity) <= 0 ||              style.visibility === 'hidden' ||              (style.backgroundImage === 'none' && this._isColorTransparent(style.backgroundColor))          ); diff --git a/ext/js/general/object-property-accessor.js b/ext/js/general/object-property-accessor.js index d50948d9..ac9e2a54 100644 --- a/ext/js/general/object-property-accessor.js +++ b/ext/js/general/object-property-accessor.js @@ -117,14 +117,14 @@ export class ObjectPropertyAccessor {          /** @type {import('core').SerializableObject} */ (target1)[key1] = value2;          try {              /** @type {import('core').SerializableObject} */ (target2)[key2] = value1; -        } catch (e) { +        } catch (error) {              // Revert              try {                  /** @type {import('core').SerializableObject} */ (target1)[key1] = value1; -            } catch (e2) { +            } catch (error2) {                  // NOP              } -            throw e; +            throw error;          }      } diff --git a/ext/js/input/hotkey-handler.js b/ext/js/input/hotkey-handler.js index 9caedcc2..6d7d3d7a 100644 --- a/ext/js/input/hotkey-handler.js +++ b/ext/js/input/hotkey-handler.js @@ -254,7 +254,7 @@ export class HotkeyHandler extends EventDispatcher {       */      _updateEventHandlers() {          if (this._isPrepared && (this._hotkeys.size > 0 || this._hasEventListeners)) { -            if (this._eventListeners.size !== 0) { return; } +            if (this._eventListeners.size > 0) { return; }              this._eventListeners.addEventListener(document, 'keydown', this._onKeyDown.bind(this), false);          } else {              this._eventListeners.removeAllEventListeners(); diff --git a/ext/js/language/ja/japanese.js b/ext/js/language/ja/japanese.js index a4508040..818daa0b 100644 --- a/ext/js/language/ja/japanese.js +++ b/ext/js/language/ja/japanese.js @@ -92,7 +92,7 @@ const JAPANESE_RANGES = [      [0xffe0, 0xffee] // Currency markers  ]; -const SMALL_KANA_SET = new Set(Array.from('ぁぃぅぇぉゃゅょゎァィゥェォャュョヮ')); +const SMALL_KANA_SET = new Set('ぁぃぅぇぉゃゅょゎァィゥェォャュョヮ');  const HALFWIDTH_KATAKANA_MAPPING = new Map([      ['ヲ', 'ヲヺ-'], diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 811c7987..1cf346a9 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -1294,11 +1294,9 @@ export class TextScanner extends EventDispatcher {      async _searchAtFromMouseMove(x, y, inputInfo) {          if (this._pendingLookup) { return; } -        if (inputInfo.passive) { -            if (!await this._scanTimerWait()) { -                // Aborted -                return; -            } +        if (inputInfo.passive && !await this._scanTimerWait()) { +            // Aborted +            return;          }          await this._searchAt(x, y, inputInfo); diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index 007a7d1e..2ba1ce0d 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -491,11 +491,11 @@ export class Translator {       * @returns {number}       */      _getNextSubstringLength(searchResolution, currentLength, source) { -        if (searchResolution === 'word') { -            return source.search(/[^\p{Letter}][\p{Letter}\p{Number}]*$/u); -        } else { -            return currentLength - 1; -        } +        return ( +            searchResolution === 'word' ? +            source.search(/[^\p{Letter}][\p{Letter}\p{Number}]*$/u) : +            currentLength - 1 +        );      }      /** @@ -620,7 +620,7 @@ export class Translator {              for (const group of groupedDictionaryEntries) {                  this._sortTermDictionaryEntriesById(group.dictionaryEntries);              } -            if (ungroupedDictionaryEntriesMap.size !== 0 || secondarySearchDictionaryMap.size !== 0) { +            if (ungroupedDictionaryEntriesMap.size > 0 || secondarySearchDictionaryMap.size > 0) {                  await this._addSecondaryRelatedDictionaryEntries(groupedDictionaryEntries, ungroupedDictionaryEntriesMap, enabledDictionaryMap, secondarySearchDictionaryMap, tagAggregator);              }          } diff --git a/ext/js/pages/action-popup-main.js b/ext/js/pages/action-popup-main.js index b5728215..f58083a7 100644 --- a/ext/js/pages/action-popup-main.js +++ b/ext/js/pages/action-popup-main.js @@ -238,7 +238,7 @@ class DisplayController {       */      _onProfileSelectChange(event) {          const node = /** @type {HTMLInputElement} */ (event.currentTarget); -        const value = parseInt(node.value, 10); +        const value = Number.parseInt(node.value, 10);          if (typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= /** @type {import('settings').Options} */ (this._optionsFull).profiles.length) {              this._setPrimaryProfileIndex(value);          } diff --git a/ext/js/pages/info-main.js b/ext/js/pages/info-main.js index 7d7d56a5..0bc84d97 100644 --- a/ext/js/pages/info-main.js +++ b/ext/js/pages/info-main.js @@ -108,7 +108,7 @@ async function showDictionaryInfo(api) {      /** @type {HTMLElement} */      const noneElement = querySelectorNotNull(document, '#installed-dictionaries-none'); -    noneElement.hidden = (dictionaryInfos.length !== 0); +    noneElement.hidden = (dictionaryInfos.length > 0);      /** @type {HTMLElement} */      const container = querySelectorNotNull(document, '#installed-dictionaries');      container.textContent = ''; diff --git a/ext/js/pages/permissions-main.js b/ext/js/pages/permissions-main.js index 3092782b..17169c12 100644 --- a/ext/js/pages/permissions-main.js +++ b/ext/js/pages/permissions-main.js @@ -102,6 +102,8 @@ await Application.main(async (application) => {      /** @type {HTMLInputElement} */      const permissionCheckbox2 = querySelectorNotNull(document, '#permission-checkbox-allow-file-url-access');      /** @type {HTMLInputElement[]} */ +    // This collection is actually used, not sure why this eslint-disable is needed. +    // eslint-disable-next-line sonarjs/no-unused-collection      const permissionsCheckboxes = [permissionCheckbox1, permissionCheckbox2];      const permissions = await Promise.all([ diff --git a/ext/js/pages/settings/anki-controller.js b/ext/js/pages/settings/anki-controller.js index 3a6345ed..e161d86b 100644 --- a/ext/js/pages/settings/anki-controller.js +++ b/ext/js/pages/settings/anki-controller.js @@ -401,11 +401,11 @@ export class AnkiController {          if (typeof data !== 'undefined') {              details += `${JSON.stringify(data, null, 4)}\n\n`;          } -        details += `${error.stack}`.trimRight(); +        details += `${error.stack}`.trimEnd();          /** @type {HTMLElement} */ (this._ankiErrorMessageDetailsNode).textContent = details;          /** @type {HTMLElement} */ (this._ankiErrorMessageDetailsContainer).hidden = true; -        /** @type {HTMLElement} */ (this._ankiErrorInvalidResponseInfo).hidden = (errorString.indexOf('Invalid response') < 0); +        /** @type {HTMLElement} */ (this._ankiErrorInvalidResponseInfo).hidden = !errorString.includes('Invalid response');          /** @type {HTMLElement} */ (this._ankiErrorMessageDetailsToggle).hidden = false;      } @@ -762,7 +762,8 @@ class AnkiCardController {          const ELEMENT_NODE = Node.ELEMENT_NODE;          const container = this._ankiCardFieldsContainer;          if (container !== null) { -            for (const node of [...container.childNodes]) { +            const childNodesFrozen = [...container.childNodes]; +            for (const node of childNodesFrozen) {                  if (node.nodeType === ELEMENT_NODE && node instanceof HTMLElement && node.dataset.persistent === 'true') { continue; }                  container.removeChild(node);              } diff --git a/ext/js/pages/settings/audio-controller.js b/ext/js/pages/settings/audio-controller.js index 9633c4b3..5b597d33 100644 --- a/ext/js/pages/settings/audio-controller.js +++ b/ext/js/pages/settings/audio-controller.js @@ -144,7 +144,7 @@ export class AudioController extends EventDispatcher {              const text = input.value || '';              const voiceUri = input.dataset.voice;              const audio = this._audioSystem.createTextToSpeechAudio(text, typeof voiceUri === 'string' ? voiceUri : ''); -            audio.volume = 1.0; +            audio.volume = 1;              audio.play();          } catch (e) {              // NOP diff --git a/ext/js/pages/settings/backup-controller.js b/ext/js/pages/settings/backup-controller.js index 59bcaed9..2bab00e3 100644 --- a/ext/js/pages/settings/backup-controller.js +++ b/ext/js/pages/settings/backup-controller.js @@ -144,7 +144,7 @@ export class BackupController {              }          } -        const data = { +        return {              version: this._currentVersion,              date: this._getSettingsExportDateString(date, '-', ' ', ':', 6),              url: chrome.runtime.getURL('/'), @@ -154,8 +154,6 @@ export class BackupController {              permissions,              options: optionsFull          }; - -        return data;      }      /** diff --git a/ext/js/pages/settings/collapsible-dictionary-controller.js b/ext/js/pages/settings/collapsible-dictionary-controller.js index 5ba61e0c..62f84b96 100644 --- a/ext/js/pages/settings/collapsible-dictionary-controller.js +++ b/ext/js/pages/settings/collapsible-dictionary-controller.js @@ -156,9 +156,7 @@ export class CollapsibleDictionaryController {          const versionNode = querySelectorNotNull(node, '.dictionary-version');          versionNode.textContent = version; -        /** @type {HTMLSelectElement} */ -        const select = querySelectorNotNull(node, '.definitions-collapsible'); -        return select; +        return querySelectorNotNull(node, '.definitions-collapsible');      }      /** */ diff --git a/ext/js/pages/settings/dictionary-controller.js b/ext/js/pages/settings/dictionary-controller.js index 1d3c1730..5020dc7c 100644 --- a/ext/js/pages/settings/dictionary-controller.js +++ b/ext/js/pages/settings/dictionary-controller.js @@ -558,7 +558,7 @@ export class DictionaryController {          const {profiles} = optionsFull;          for (let i = 0, ii = profiles.length; i < ii; ++i) {              let modified = false; -            const missingDictionaries = new Set([...installedDictionaries]); +            const missingDictionaries = new Set(installedDictionaries);              const dictionaryOptionsArray = profiles[i].options.dictionaries;              for (let j = dictionaryOptionsArray.length - 1; j >= 0; --j) {                  const {name} = dictionaryOptionsArray[j]; @@ -871,8 +871,8 @@ export class DictionaryController {              const onProgress = ({processed, count, storeCount, storesProcesed}) => {                  const percent = (                      (count > 0 && storesProcesed > 0) ? -                    (processed / count) * (storesProcesed / storeCount) * 100.0 : -                    0.0 +                    (processed / count) * (storesProcesed / storeCount) * 100 : +                    0                  );                  const cssString = `${percent}%`;                  const statusString = `${percent.toFixed(0)}%`; diff --git a/ext/js/pages/settings/dictionary-import-controller.js b/ext/js/pages/settings/dictionary-import-controller.js index 0484001d..34e21c5d 100644 --- a/ext/js/pages/settings/dictionary-import-controller.js +++ b/ext/js/pages/settings/dictionary-import-controller.js @@ -172,7 +172,7 @@ export class DictionaryImportController {                      for (const label of infoLabels) { label.textContent = labelText; }                  } -                const percent = count > 0 ? (index / count * 100.0) : 0.0; +                const percent = count > 0 ? (index / count * 100) : 0;                  const cssString = `${percent}%`;                  const statusString = `${Math.floor(percent).toFixed(0)}%`;                  for (const progressBar of progressBars) { progressBar.style.width = cssString; } @@ -199,8 +199,8 @@ export class DictionaryImportController {                  await this._importDictionary(files[i], importDetails, onProgress);              } -        } catch (err) { -            this._showErrors([toError(err)]); +        } catch (error) { +            this._showErrors([toError(error)]);          } finally {              prevention.end();              for (const progress of progressContainers) { progress.hidden = true; } diff --git a/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js b/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js index 61eefffa..b9d107ae 100644 --- a/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js +++ b/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js @@ -353,7 +353,7 @@ class ExtensionKeyboardShortcutHotkeyEntry {       * @param {boolean} updateInput       */      async _tryUpdateInput(key, modifiers, updateInput) { -        let okay = (key === null ? (modifiers.length === 0) : (modifiers.length !== 0)); +        let okay = (key === null ? (modifiers.length === 0) : (modifiers.length > 0));          if (okay) {              try {                  await this._parent.updateCommand(this._name, key, modifiers); diff --git a/ext/js/pages/settings/keyboard-shortcuts-controller.js b/ext/js/pages/settings/keyboard-shortcuts-controller.js index 7b28a322..907cf4a1 100644 --- a/ext/js/pages/settings/keyboard-shortcuts-controller.js +++ b/ext/js/pages/settings/keyboard-shortcuts-controller.js @@ -183,7 +183,7 @@ export class KeyboardShortcutController {          const listContainer = /** @type {HTMLElement} */ (this._listContainer);          listContainer.appendChild(fragment);          listContainer.hidden = (hotkeys.length === 0); -        /** @type {HTMLElement} */ (this._emptyIndicator).hidden = (hotkeys.length !== 0); +        /** @type {HTMLElement} */ (this._emptyIndicator).hidden = (hotkeys.length > 0);      }      /** diff --git a/ext/js/pages/settings/profile-controller.js b/ext/js/pages/settings/profile-controller.js index 5a7b5ed4..a82a4b4e 100644 --- a/ext/js/pages/settings/profile-controller.js +++ b/ext/js/pages/settings/profile-controller.js @@ -544,7 +544,7 @@ export class ProfileController {       */      _tryGetValidProfileIndex(stringValue) {          if (typeof stringValue !== 'string') { return null; } -        const intValue = parseInt(stringValue, 10); +        const intValue = Number.parseInt(stringValue, 10);          return (              Number.isFinite(intValue) &&              intValue >= 0 && @@ -573,7 +573,7 @@ export class ProfileController {              suffix = match[5];              if (typeof match[2] === 'string') {                  space = match[3]; -                index = parseInt(match[4], 10) + 1; +                index = Number.parseInt(match[4], 10) + 1;              } else {                  space = ' ';                  index = 2; diff --git a/ext/js/pages/settings/sentence-termination-characters-controller.js b/ext/js/pages/settings/sentence-termination-characters-controller.js index c393aaa1..4ceed22b 100644 --- a/ext/js/pages/settings/sentence-termination-characters-controller.js +++ b/ext/js/pages/settings/sentence-termination-characters-controller.js @@ -125,8 +125,9 @@ export class SentenceTerminationCharactersController {              entry.prepare();          } -        /** @type {HTMLElement} */ (this._listTable).hidden = (terminationCharacters.length === 0); -        /** @type {HTMLElement} */ (this._emptyIndicator).hidden = (terminationCharacters.length !== 0); +        const empty = terminationCharacters.length === 0; +        /** @type {HTMLElement} */ (this._listTable).hidden = empty; +        /** @type {HTMLElement} */ (this._emptyIndicator).hidden = !empty;      }      /** diff --git a/ext/js/pages/settings/settings-controller.js b/ext/js/pages/settings/settings-controller.js index 3f389271..c835f8e6 100644 --- a/ext/js/pages/settings/settings-controller.js +++ b/ext/js/pages/settings/settings-controller.js @@ -195,6 +195,7 @@ export class SettingsController extends EventDispatcher {       */      preventPageExit() {          /** @type {import('settings-controller').PageExitPrevention} */ +        // eslint-disable-next-line sonarjs/prefer-object-literal          const obj = {};          obj.end = this._endPreventPageExit.bind(this, obj);          if (this._pageExitPreventionEventListeners.size === 0) { @@ -226,8 +227,7 @@ export class SettingsController extends EventDispatcher {      async getDefaultOptions() {          const optionsUtil = new OptionsUtil();          await optionsUtil.prepare(); -        const optionsFull = optionsUtil.getDefault(); -        return optionsFull; +        return optionsUtil.getDefault();      }      // Private diff --git a/ext/js/pages/settings/settings-display-controller.js b/ext/js/pages/settings/settings-display-controller.js index 0a729d96..47aa9c9c 100644 --- a/ext/js/pages/settings/settings-display-controller.js +++ b/ext/js/pages/settings/settings-display-controller.js @@ -290,7 +290,7 @@ export class SettingsDisplayController {       */      _getMoreContainer(link) {          const v = link.dataset.parentDistance; -        const distance = v ? parseInt(v, 10) : 1; +        const distance = v ? Number.parseInt(v, 10) : 1;          if (Number.isNaN(distance)) { return null; }          /** @type {?Element} */ @@ -338,7 +338,7 @@ export class SettingsDisplayController {          let indent = '\t';          if (args.length > 1) { -            const count = parseInt(args[1], 10); +            const count = Number.parseInt(args[1], 10);              indent = (Number.isFinite(count) && count >= 0 ? ' '.repeat(count) : args[1]);          } diff --git a/ext/js/templates/sandbox/anki-template-renderer.js b/ext/js/templates/sandbox/anki-template-renderer.js index 2320a0b1..ad2b0042 100644 --- a/ext/js/templates/sandbox/anki-template-renderer.js +++ b/ext/js/templates/sandbox/anki-template-renderer.js @@ -171,11 +171,11 @@ export class AnkiTemplateRenderer {          for (const {text, reading: reading2} of segments) {              const safeText = this._escape(text);              const safeReading = this._escape(reading2); -            if (safeReading.length > 0) { -                result += `<ruby>${safeText}<rt>${safeReading}</rt></ruby>`; -            } else { -                result += safeText; -            } +            result += ( +                safeReading.length > 0 ? +                `<ruby>${safeText}<rt>${safeReading}</rt></ruby>` : +                safeText +            );          }          return this._safeString(result); diff --git a/package-lock.json b/package-lock.json index 336380b0..4a40a16f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,9 +41,12 @@                  "eslint": "^8.56.0",                  "eslint-plugin-eslint-comments": "^3.2.0",                  "eslint-plugin-header": "^3.1.1", +                "eslint-plugin-import": "^2.29.1",                  "eslint-plugin-jsdoc": "^48.0.6",                  "eslint-plugin-jsonc": "^2.13.0",                  "eslint-plugin-no-unsanitized": "^4.0.2", +                "eslint-plugin-sonarjs": "^0.23.0", +                "eslint-plugin-unicorn": "^51.0.1",                  "eslint-plugin-unused-imports": "^3.0.0",                  "eslint-plugin-vitest": "^0.3.22",                  "fake-indexeddb": "^5.0.2", @@ -1639,6 +1642,12 @@              "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",              "dev": true          }, +        "node_modules/@types/json5": { +            "version": "0.0.29", +            "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", +            "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", +            "dev": true +        },          "node_modules/@types/node": {              "version": "20.11.5",              "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", @@ -1648,6 +1657,12 @@                  "undici-types": "~5.26.4"              }          }, +        "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/semver": {              "version": "7.5.6",              "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", @@ -2149,6 +2164,41 @@              "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",              "dev": true          }, +        "node_modules/array-buffer-byte-length": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", +            "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.5", +                "is-array-buffer": "^3.0.4" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/array-includes": { +            "version": "3.1.7", +            "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", +            "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "get-intrinsic": "^1.2.1", +                "is-string": "^1.0.7" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/array-union": {              "version": "2.1.0",              "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2158,6 +2208,102 @@                  "node": ">=8"              }          }, +        "node_modules/array.prototype.filter": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", +            "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "es-array-method-boxes-properly": "^1.0.0", +                "is-string": "^1.0.7" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/array.prototype.findlastindex": { +            "version": "1.2.4", +            "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", +            "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "es-abstract": "^1.22.3", +                "es-errors": "^1.3.0", +                "es-shim-unscopables": "^1.0.2" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/array.prototype.flat": { +            "version": "1.3.2", +            "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", +            "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "es-shim-unscopables": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/array.prototype.flatmap": { +            "version": "1.3.2", +            "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", +            "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "es-shim-unscopables": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/arraybuffer.prototype.slice": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", +            "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", +            "dev": true, +            "dependencies": { +                "array-buffer-byte-length": "^1.0.1", +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "es-abstract": "^1.22.3", +                "es-errors": "^1.2.1", +                "get-intrinsic": "^1.2.3", +                "is-array-buffer": "^3.0.4", +                "is-shared-array-buffer": "^1.0.2" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/assertion-error": {              "version": "1.1.0",              "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2194,6 +2340,18 @@                  "node": ">= 4.5.0"              }          }, +        "node_modules/available-typed-arrays": { +            "version": "1.0.6", +            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", +            "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/axios": {              "version": "1.6.7",              "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", @@ -2233,6 +2391,38 @@                  "node": ">=8"              }          }, +        "node_modules/browserslist": { +            "version": "4.22.3", +            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", +            "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", +            "dev": true, +            "funding": [ +                { +                    "type": "opencollective", +                    "url": "https://opencollective.com/browserslist" +                }, +                { +                    "type": "tidelift", +                    "url": "https://tidelift.com/funding/github/npm/browserslist" +                }, +                { +                    "type": "github", +                    "url": "https://github.com/sponsors/ai" +                } +            ], +            "dependencies": { +                "caniuse-lite": "^1.0.30001580", +                "electron-to-chromium": "^1.4.648", +                "node-releases": "^2.0.14", +                "update-browserslist-db": "^1.0.13" +            }, +            "bin": { +                "browserslist": "cli.js" +            }, +            "engines": { +                "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" +            } +        },          "node_modules/builtin-modules": {              "version": "3.3.0",              "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -2281,6 +2471,24 @@                  "node": ">=14.16"              }          }, +        "node_modules/call-bind": { +            "version": "1.0.6", +            "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", +            "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", +            "dev": true, +            "dependencies": { +                "es-errors": "^1.3.0", +                "function-bind": "^1.1.2", +                "get-intrinsic": "^1.2.3", +                "set-function-length": "^1.2.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/callsites": {              "version": "3.1.0",              "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2290,6 +2498,26 @@                  "node": ">=6"              }          }, +        "node_modules/caniuse-lite": { +            "version": "1.0.30001585", +            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", +            "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", +            "dev": true, +            "funding": [ +                { +                    "type": "opencollective", +                    "url": "https://opencollective.com/browserslist" +                }, +                { +                    "type": "tidelift", +                    "url": "https://tidelift.com/funding/github/npm/caniuse-lite" +                }, +                { +                    "type": "github", +                    "url": "https://github.com/sponsors/ai" +                } +            ] +        },          "node_modules/chai": {              "version": "4.4.1",              "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -2336,6 +2564,42 @@                  "node": "*"              }          }, +        "node_modules/ci-info": { +            "version": "4.0.0", +            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", +            "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", +            "dev": true, +            "funding": [ +                { +                    "type": "github", +                    "url": "https://github.com/sponsors/sibiraj-s" +                } +            ], +            "engines": { +                "node": ">=8" +            } +        }, +        "node_modules/clean-regexp": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", +            "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", +            "dev": true, +            "dependencies": { +                "escape-string-regexp": "^1.0.5" +            }, +            "engines": { +                "node": ">=4" +            } +        }, +        "node_modules/clean-regexp/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/cli-cursor": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -2529,6 +2793,19 @@              "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",              "dev": true          }, +        "node_modules/core-js-compat": { +            "version": "3.35.1", +            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", +            "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", +            "dev": true, +            "dependencies": { +                "browserslist": "^4.22.2" +            }, +            "funding": { +                "type": "opencollective", +                "url": "https://opencollective.com/core-js" +            } +        },          "node_modules/core-util-is": {              "version": "1.0.3",              "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2749,6 +3026,38 @@                  "node": ">=10"              }          }, +        "node_modules/define-data-property": { +            "version": "1.1.2", +            "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", +            "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", +            "dev": true, +            "dependencies": { +                "es-errors": "^1.3.0", +                "get-intrinsic": "^1.2.2", +                "gopd": "^1.0.1", +                "has-property-descriptors": "^1.0.1" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/define-properties": { +            "version": "1.2.1", +            "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", +            "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", +            "dev": true, +            "dependencies": { +                "define-data-property": "^1.0.1", +                "has-property-descriptors": "^1.0.0", +                "object-keys": "^1.1.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/delayed-stream": {              "version": "1.0.0",              "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2825,6 +3134,12 @@              "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",              "dev": true          }, +        "node_modules/electron-to-chromium": { +            "version": "1.4.665", +            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.665.tgz", +            "integrity": "sha512-UpyCWObBoD+nSZgOC2ToaIdZB0r9GhqT2WahPKiSki6ckkSuKhQNso8V2PrFcHBMleI/eqbKgVQgVC4Wni4ilw==", +            "dev": true +        },          "node_modules/emoji-regex": {              "version": "9.2.2",              "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -2866,6 +3181,114 @@                  "is-arrayish": "^0.2.1"              }          }, +        "node_modules/es-abstract": { +            "version": "1.22.3", +            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", +            "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", +            "dev": true, +            "dependencies": { +                "array-buffer-byte-length": "^1.0.0", +                "arraybuffer.prototype.slice": "^1.0.2", +                "available-typed-arrays": "^1.0.5", +                "call-bind": "^1.0.5", +                "es-set-tostringtag": "^2.0.1", +                "es-to-primitive": "^1.2.1", +                "function.prototype.name": "^1.1.6", +                "get-intrinsic": "^1.2.2", +                "get-symbol-description": "^1.0.0", +                "globalthis": "^1.0.3", +                "gopd": "^1.0.1", +                "has-property-descriptors": "^1.0.0", +                "has-proto": "^1.0.1", +                "has-symbols": "^1.0.3", +                "hasown": "^2.0.0", +                "internal-slot": "^1.0.5", +                "is-array-buffer": "^3.0.2", +                "is-callable": "^1.2.7", +                "is-negative-zero": "^2.0.2", +                "is-regex": "^1.1.4", +                "is-shared-array-buffer": "^1.0.2", +                "is-string": "^1.0.7", +                "is-typed-array": "^1.1.12", +                "is-weakref": "^1.0.2", +                "object-inspect": "^1.13.1", +                "object-keys": "^1.1.1", +                "object.assign": "^4.1.4", +                "regexp.prototype.flags": "^1.5.1", +                "safe-array-concat": "^1.0.1", +                "safe-regex-test": "^1.0.0", +                "string.prototype.trim": "^1.2.8", +                "string.prototype.trimend": "^1.0.7", +                "string.prototype.trimstart": "^1.0.7", +                "typed-array-buffer": "^1.0.0", +                "typed-array-byte-length": "^1.0.0", +                "typed-array-byte-offset": "^1.0.0", +                "typed-array-length": "^1.0.4", +                "unbox-primitive": "^1.0.2", +                "which-typed-array": "^1.1.13" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/es-array-method-boxes-properly": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", +            "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", +            "dev": true +        }, +        "node_modules/es-errors": { +            "version": "1.3.0", +            "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", +            "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/es-set-tostringtag": { +            "version": "2.0.2", +            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", +            "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", +            "dev": true, +            "dependencies": { +                "get-intrinsic": "^1.2.2", +                "has-tostringtag": "^1.0.0", +                "hasown": "^2.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/es-shim-unscopables": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", +            "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", +            "dev": true, +            "dependencies": { +                "hasown": "^2.0.0" +            } +        }, +        "node_modules/es-to-primitive": { +            "version": "1.2.1", +            "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", +            "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", +            "dev": true, +            "dependencies": { +                "is-callable": "^1.1.4", +                "is-date-object": "^1.0.1", +                "is-symbol": "^1.0.2" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/esbuild": {              "version": "0.20.0",              "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", @@ -2904,6 +3327,15 @@                  "@esbuild/win32-x64": "0.20.0"              }          }, +        "node_modules/escalade": { +            "version": "3.1.2", +            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", +            "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", +            "dev": true, +            "engines": { +                "node": ">=6" +            } +        },          "node_modules/escape-string-regexp": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2986,6 +3418,52 @@                  "eslint": ">=6.0.0"              }          }, +        "node_modules/eslint-import-resolver-node": { +            "version": "0.3.9", +            "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", +            "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", +            "dev": true, +            "dependencies": { +                "debug": "^3.2.7", +                "is-core-module": "^2.13.0", +                "resolve": "^1.22.4" +            } +        }, +        "node_modules/eslint-import-resolver-node/node_modules/debug": { +            "version": "3.2.7", +            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +            "dev": true, +            "dependencies": { +                "ms": "^2.1.1" +            } +        }, +        "node_modules/eslint-module-utils": { +            "version": "2.8.0", +            "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", +            "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", +            "dev": true, +            "dependencies": { +                "debug": "^3.2.7" +            }, +            "engines": { +                "node": ">=4" +            }, +            "peerDependenciesMeta": { +                "eslint": { +                    "optional": true +                } +            } +        }, +        "node_modules/eslint-module-utils/node_modules/debug": { +            "version": "3.2.7", +            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +            "dev": true, +            "dependencies": { +                "ms": "^2.1.1" +            } +        },          "node_modules/eslint-plugin-eslint-comments": {              "version": "3.2.0",              "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", @@ -3023,6 +3501,67 @@                  "eslint": ">=7.7.0"              }          }, +        "node_modules/eslint-plugin-import": { +            "version": "2.29.1", +            "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", +            "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", +            "dev": true, +            "dependencies": { +                "array-includes": "^3.1.7", +                "array.prototype.findlastindex": "^1.2.3", +                "array.prototype.flat": "^1.3.2", +                "array.prototype.flatmap": "^1.3.2", +                "debug": "^3.2.7", +                "doctrine": "^2.1.0", +                "eslint-import-resolver-node": "^0.3.9", +                "eslint-module-utils": "^2.8.0", +                "hasown": "^2.0.0", +                "is-core-module": "^2.13.1", +                "is-glob": "^4.0.3", +                "minimatch": "^3.1.2", +                "object.fromentries": "^2.0.7", +                "object.groupby": "^1.0.1", +                "object.values": "^1.1.7", +                "semver": "^6.3.1", +                "tsconfig-paths": "^3.15.0" +            }, +            "engines": { +                "node": ">=4" +            }, +            "peerDependencies": { +                "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" +            } +        }, +        "node_modules/eslint-plugin-import/node_modules/debug": { +            "version": "3.2.7", +            "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +            "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +            "dev": true, +            "dependencies": { +                "ms": "^2.1.1" +            } +        }, +        "node_modules/eslint-plugin-import/node_modules/doctrine": { +            "version": "2.1.0", +            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", +            "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", +            "dev": true, +            "dependencies": { +                "esutils": "^2.0.2" +            }, +            "engines": { +                "node": ">=0.10.0" +            } +        }, +        "node_modules/eslint-plugin-import/node_modules/semver": { +            "version": "6.3.1", +            "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", +            "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", +            "dev": true, +            "bin": { +                "semver": "bin/semver.js" +            } +        },          "node_modules/eslint-plugin-jsdoc": {              "version": "48.0.6",              "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.0.6.tgz", @@ -3079,6 +3618,51 @@                  "eslint": "^6 || ^7 || ^8"              }          }, +        "node_modules/eslint-plugin-sonarjs": { +            "version": "0.23.0", +            "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz", +            "integrity": "sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==", +            "dev": true, +            "engines": { +                "node": ">=14" +            }, +            "peerDependencies": { +                "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" +            } +        }, +        "node_modules/eslint-plugin-unicorn": { +            "version": "51.0.1", +            "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz", +            "integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==", +            "dev": true, +            "dependencies": { +                "@babel/helper-validator-identifier": "^7.22.20", +                "@eslint-community/eslint-utils": "^4.4.0", +                "@eslint/eslintrc": "^2.1.4", +                "ci-info": "^4.0.0", +                "clean-regexp": "^1.0.0", +                "core-js-compat": "^3.34.0", +                "esquery": "^1.5.0", +                "indent-string": "^4.0.0", +                "is-builtin-module": "^3.2.1", +                "jsesc": "^3.0.2", +                "pluralize": "^8.0.0", +                "read-pkg-up": "^7.0.1", +                "regexp-tree": "^0.1.27", +                "regjsparser": "^0.10.0", +                "semver": "^7.5.4", +                "strip-indent": "^3.0.0" +            }, +            "engines": { +                "node": ">=16" +            }, +            "funding": { +                "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" +            }, +            "peerDependencies": { +                "eslint": ">=8.56.0" +            } +        },          "node_modules/eslint-plugin-unused-imports": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", @@ -3445,6 +4029,15 @@                  }              }          }, +        "node_modules/for-each": { +            "version": "0.3.3", +            "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", +            "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", +            "dev": true, +            "dependencies": { +                "is-callable": "^1.1.3" +            } +        },          "node_modules/foreground-child": {              "version": "3.1.1",              "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -3504,6 +4097,42 @@                  "node": "^8.16.0 || ^10.6.0 || >=11.0.0"              }          }, +        "node_modules/function-bind": { +            "version": "1.1.2", +            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", +            "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", +            "dev": true, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/function.prototype.name": { +            "version": "1.1.6", +            "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", +            "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "functions-have-names": "^1.2.3" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/functions-have-names": { +            "version": "1.2.3", +            "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", +            "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", +            "dev": true, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/get-east-asian-width": {              "version": "1.2.0",              "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", @@ -3525,6 +4154,25 @@                  "node": "*"              }          }, +        "node_modules/get-intrinsic": { +            "version": "1.2.4", +            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", +            "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", +            "dev": true, +            "dependencies": { +                "es-errors": "^1.3.0", +                "function-bind": "^1.1.2", +                "has-proto": "^1.0.1", +                "has-symbols": "^1.0.3", +                "hasown": "^2.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/get-stdin": {              "version": "5.0.1",              "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -3546,6 +4194,23 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/get-symbol-description": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", +            "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.5", +                "es-errors": "^1.3.0", +                "get-intrinsic": "^1.2.4" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/glob": {              "version": "10.3.10",              "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -3657,6 +4322,21 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/globalthis": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", +            "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", +            "dev": true, +            "dependencies": { +                "define-properties": "^1.1.3" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/globby": {              "version": "11.1.0",              "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3683,6 +4363,18 @@              "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",              "dev": true          }, +        "node_modules/gopd": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", +            "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", +            "dev": true, +            "dependencies": { +                "get-intrinsic": "^1.1.3" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/got": {              "version": "13.0.0",              "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", @@ -3735,6 +4427,15 @@                  "uglify-js": "^3.1.4"              }          }, +        "node_modules/has-bigints": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", +            "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", +            "dev": true, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/has-flag": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3744,6 +4445,75 @@                  "node": ">=8"              }          }, +        "node_modules/has-property-descriptors": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", +            "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", +            "dev": true, +            "dependencies": { +                "get-intrinsic": "^1.2.2" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/has-proto": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", +            "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/has-symbols": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +            "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/has-tostringtag": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", +            "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", +            "dev": true, +            "dependencies": { +                "has-symbols": "^1.0.3" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/hasown": { +            "version": "2.0.1", +            "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", +            "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", +            "dev": true, +            "dependencies": { +                "function-bind": "^1.1.2" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/hosted-git-info": { +            "version": "2.8.9", +            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", +            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", +            "dev": true +        },          "node_modules/html-encoding-sniffer": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -3940,6 +4710,15 @@                  "node": ">=0.8.19"              }          }, +        "node_modules/indent-string": { +            "version": "4.0.0", +            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", +            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", +            "dev": true, +            "engines": { +                "node": ">=8" +            } +        },          "node_modules/inflight": {              "version": "1.0.6",              "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3962,12 +4741,70 @@              "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",              "dev": true          }, +        "node_modules/internal-slot": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", +            "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", +            "dev": true, +            "dependencies": { +                "es-errors": "^1.3.0", +                "hasown": "^2.0.0", +                "side-channel": "^1.0.4" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/is-array-buffer": { +            "version": "3.0.4", +            "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", +            "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "get-intrinsic": "^1.2.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/is-arrayish": {              "version": "0.2.1",              "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",              "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",              "dev": true          }, +        "node_modules/is-bigint": { +            "version": "1.0.4", +            "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", +            "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", +            "dev": true, +            "dependencies": { +                "has-bigints": "^1.0.1" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-boolean-object": { +            "version": "1.1.2", +            "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", +            "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "has-tostringtag": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/is-builtin-module": {              "version": "3.2.1",              "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", @@ -3983,6 +4820,45 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/is-callable": { +            "version": "1.2.7", +            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", +            "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-core-module": { +            "version": "2.13.1", +            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", +            "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", +            "dev": true, +            "dependencies": { +                "hasown": "^2.0.0" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-date-object": { +            "version": "1.0.5", +            "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", +            "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", +            "dev": true, +            "dependencies": { +                "has-tostringtag": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/is-extglob": {              "version": "2.1.1",              "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4013,6 +4889,18 @@                  "node": ">=0.10.0"              }          }, +        "node_modules/is-negative-zero": { +            "version": "2.0.2", +            "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", +            "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/is-number": {              "version": "7.0.0",              "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4022,6 +4910,21 @@                  "node": ">=0.12.0"              }          }, +        "node_modules/is-number-object": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", +            "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", +            "dev": true, +            "dependencies": { +                "has-tostringtag": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/is-path-inside": {              "version": "3.0.3",              "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -4046,6 +4949,34 @@              "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",              "dev": true          }, +        "node_modules/is-regex": { +            "version": "1.1.4", +            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", +            "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "has-tostringtag": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-shared-array-buffer": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", +            "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/is-stream": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -4058,6 +4989,63 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/is-string": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", +            "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", +            "dev": true, +            "dependencies": { +                "has-tostringtag": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-symbol": { +            "version": "1.0.4", +            "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", +            "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", +            "dev": true, +            "dependencies": { +                "has-symbols": "^1.0.2" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-typed-array": { +            "version": "1.1.13", +            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", +            "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", +            "dev": true, +            "dependencies": { +                "which-typed-array": "^1.1.14" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/is-weakref": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", +            "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/isarray": {              "version": "1.0.0",              "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4205,6 +5193,18 @@                  }              }          }, +        "node_modules/jsesc": { +            "version": "3.0.2", +            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", +            "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", +            "dev": true, +            "bin": { +                "jsesc": "bin/jsesc" +            }, +            "engines": { +                "node": ">=6" +            } +        },          "node_modules/json-buffer": {              "version": "3.0.1",              "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -4855,6 +5855,15 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/min-indent": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", +            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", +            "dev": true, +            "engines": { +                "node": ">=4" +            } +        },          "node_modules/minimatch": {              "version": "3.1.2",              "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4954,6 +5963,33 @@                  "node-gyp-build-test": "build-test.js"              }          }, +        "node_modules/node-releases": { +            "version": "2.0.14", +            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", +            "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", +            "dev": true +        }, +        "node_modules/normalize-package-data": { +            "version": "2.5.0", +            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", +            "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", +            "dev": true, +            "dependencies": { +                "hosted-git-info": "^2.1.4", +                "resolve": "^1.10.0", +                "semver": "2 || 3 || 4 || 5", +                "validate-npm-package-license": "^3.0.1" +            } +        }, +        "node_modules/normalize-package-data/node_modules/semver": { +            "version": "5.7.2", +            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", +            "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", +            "dev": true, +            "bin": { +                "semver": "bin/semver" +            } +        },          "node_modules/normalize-path": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5008,6 +6044,89 @@              "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",              "dev": true          }, +        "node_modules/object-inspect": { +            "version": "1.13.1", +            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", +            "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", +            "dev": true, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/object-keys": { +            "version": "1.1.1", +            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", +            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/object.assign": { +            "version": "4.1.5", +            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", +            "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "has-symbols": "^1.0.3", +                "object-keys": "^1.1.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/object.fromentries": { +            "version": "2.0.7", +            "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", +            "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/object.groupby": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", +            "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", +            "dev": true, +            "dependencies": { +                "array.prototype.filter": "^1.0.3", +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "es-abstract": "^1.22.3", +                "es-errors": "^1.0.0" +            } +        }, +        "node_modules/object.values": { +            "version": "1.1.7", +            "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", +            "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/once": {              "version": "1.4.0",              "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5088,6 +6207,15 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/p-try": { +            "version": "2.2.0", +            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", +            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", +            "dev": true, +            "engines": { +                "node": ">=6" +            } +        },          "node_modules/pako": {              "version": "1.0.11",              "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -5162,6 +6290,12 @@                  "node": ">=8"              }          }, +        "node_modules/path-parse": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", +            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", +            "dev": true +        },          "node_modules/path-scurry": {              "version": "1.10.1",              "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", @@ -5273,6 +6407,15 @@                  "node": ">=16"              }          }, +        "node_modules/pluralize": { +            "version": "8.0.0", +            "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", +            "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", +            "dev": true, +            "engines": { +                "node": ">=4" +            } +        },          "node_modules/postcss": {              "version": "8.4.35",              "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", @@ -5519,6 +6662,108 @@              "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",              "dev": true          }, +        "node_modules/read-pkg": { +            "version": "5.2.0", +            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", +            "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", +            "dev": true, +            "dependencies": { +                "@types/normalize-package-data": "^2.4.0", +                "normalize-package-data": "^2.5.0", +                "parse-json": "^5.0.0", +                "type-fest": "^0.6.0" +            }, +            "engines": { +                "node": ">=8" +            } +        }, +        "node_modules/read-pkg-up": { +            "version": "7.0.1", +            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", +            "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", +            "dev": true, +            "dependencies": { +                "find-up": "^4.1.0", +                "read-pkg": "^5.2.0", +                "type-fest": "^0.8.1" +            }, +            "engines": { +                "node": ">=8" +            }, +            "funding": { +                "url": "https://github.com/sponsors/sindresorhus" +            } +        }, +        "node_modules/read-pkg-up/node_modules/find-up": { +            "version": "4.1.0", +            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", +            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", +            "dev": true, +            "dependencies": { +                "locate-path": "^5.0.0", +                "path-exists": "^4.0.0" +            }, +            "engines": { +                "node": ">=8" +            } +        }, +        "node_modules/read-pkg-up/node_modules/locate-path": { +            "version": "5.0.0", +            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", +            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", +            "dev": true, +            "dependencies": { +                "p-locate": "^4.1.0" +            }, +            "engines": { +                "node": ">=8" +            } +        }, +        "node_modules/read-pkg-up/node_modules/p-limit": { +            "version": "2.3.0", +            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", +            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", +            "dev": true, +            "dependencies": { +                "p-try": "^2.0.0" +            }, +            "engines": { +                "node": ">=6" +            }, +            "funding": { +                "url": "https://github.com/sponsors/sindresorhus" +            } +        }, +        "node_modules/read-pkg-up/node_modules/p-locate": { +            "version": "4.1.0", +            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", +            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", +            "dev": true, +            "dependencies": { +                "p-limit": "^2.2.0" +            }, +            "engines": { +                "node": ">=8" +            } +        }, +        "node_modules/read-pkg-up/node_modules/type-fest": { +            "version": "0.8.1", +            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", +            "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", +            "dev": true, +            "engines": { +                "node": ">=8" +            } +        }, +        "node_modules/read-pkg/node_modules/type-fest": { +            "version": "0.6.0", +            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", +            "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", +            "dev": true, +            "engines": { +                "node": ">=8" +            } +        },          "node_modules/readable-stream": {              "version": "2.3.8",              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -5534,6 +6779,54 @@                  "util-deprecate": "~1.0.1"              }          }, +        "node_modules/regexp-tree": { +            "version": "0.1.27", +            "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", +            "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", +            "dev": true, +            "bin": { +                "regexp-tree": "bin/regexp-tree" +            } +        }, +        "node_modules/regexp.prototype.flags": { +            "version": "1.5.2", +            "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", +            "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.6", +                "define-properties": "^1.2.1", +                "es-errors": "^1.3.0", +                "set-function-name": "^2.0.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/regjsparser": { +            "version": "0.10.0", +            "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", +            "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", +            "dev": true, +            "dependencies": { +                "jsesc": "~0.5.0" +            }, +            "bin": { +                "regjsparser": "bin/parser" +            } +        }, +        "node_modules/regjsparser/node_modules/jsesc": { +            "version": "0.5.0", +            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", +            "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", +            "dev": true, +            "bin": { +                "jsesc": "bin/jsesc" +            } +        },          "node_modules/require-from-string": {              "version": "2.0.2",              "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5549,6 +6842,23 @@              "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",              "dev": true          }, +        "node_modules/resolve": { +            "version": "1.22.8", +            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", +            "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", +            "dev": true, +            "dependencies": { +                "is-core-module": "^2.13.0", +                "path-parse": "^1.0.7", +                "supports-preserve-symlinks-flag": "^1.0.0" +            }, +            "bin": { +                "resolve": "bin/resolve" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/resolve-alpn": {              "version": "1.2.1",              "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", @@ -5737,12 +7047,53 @@                  "queue-microtask": "^1.2.2"              }          }, +        "node_modules/safe-array-concat": { +            "version": "1.1.0", +            "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", +            "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.5", +                "get-intrinsic": "^1.2.2", +                "has-symbols": "^1.0.3", +                "isarray": "^2.0.5" +            }, +            "engines": { +                "node": ">=0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/safe-array-concat/node_modules/isarray": { +            "version": "2.0.5", +            "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", +            "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", +            "dev": true +        },          "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/safe-regex-test": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", +            "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.6", +                "es-errors": "^1.3.0", +                "is-regex": "^1.1.4" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/safe-stable-stringify": {              "version": "2.4.3",              "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -5808,6 +7159,37 @@                  "upper-case-first": "^2.0.2"              }          }, +        "node_modules/set-function-length": { +            "version": "1.2.1", +            "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", +            "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", +            "dev": true, +            "dependencies": { +                "define-data-property": "^1.1.2", +                "es-errors": "^1.3.0", +                "function-bind": "^1.1.2", +                "get-intrinsic": "^1.2.3", +                "gopd": "^1.0.1", +                "has-property-descriptors": "^1.0.1" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/set-function-name": { +            "version": "2.0.1", +            "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", +            "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", +            "dev": true, +            "dependencies": { +                "define-data-property": "^1.0.1", +                "functions-have-names": "^1.2.3", +                "has-property-descriptors": "^1.0.0" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        },          "node_modules/setimmediate": {              "version": "1.0.5",              "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -5835,6 +7217,24 @@                  "node": ">=8"              }          }, +        "node_modules/side-channel": { +            "version": "1.0.5", +            "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", +            "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.6", +                "es-errors": "^1.3.0", +                "get-intrinsic": "^1.2.4", +                "object-inspect": "^1.13.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/siginfo": {              "version": "2.0.0",              "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -5914,6 +7314,26 @@                  "decode-uri-component": "^0.2.0"              }          }, +        "node_modules/spdx-correct": { +            "version": "3.2.0", +            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", +            "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", +            "dev": true, +            "dependencies": { +                "spdx-expression-parse": "^3.0.0", +                "spdx-license-ids": "^3.0.0" +            } +        }, +        "node_modules/spdx-correct/node_modules/spdx-expression-parse": { +            "version": "3.0.1", +            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", +            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", +            "dev": true, +            "dependencies": { +                "spdx-exceptions": "^2.1.0", +                "spdx-license-ids": "^3.0.0" +            } +        },          "node_modules/spdx-exceptions": {              "version": "2.3.0",              "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", @@ -6044,6 +7464,51 @@                  "url": "https://github.com/chalk/strip-ansi?sponsor=1"              }          }, +        "node_modules/string.prototype.trim": { +            "version": "1.2.8", +            "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", +            "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/string.prototype.trimend": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", +            "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/string.prototype.trimstart": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", +            "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/strip-ansi": {              "version": "6.0.1",              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6069,6 +7534,15 @@                  "node": ">=8"              }          }, +        "node_modules/strip-bom": { +            "version": "3.0.0", +            "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", +            "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", +            "dev": true, +            "engines": { +                "node": ">=4" +            } +        },          "node_modules/strip-final-newline": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -6081,6 +7555,18 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/strip-indent": { +            "version": "3.0.0", +            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", +            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", +            "dev": true, +            "dependencies": { +                "min-indent": "^1.0.0" +            }, +            "engines": { +                "node": ">=8" +            } +        },          "node_modules/strip-json-comments": {              "version": "3.1.1",              "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6322,6 +7808,18 @@                  "node": ">=14.18"              }          }, +        "node_modules/supports-preserve-symlinks-flag": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", +            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", +            "dev": true, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/svg-tags": {              "version": "1.0.0",              "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -6580,6 +8078,30 @@                  "node": ">=10"              }          }, +        "node_modules/tsconfig-paths": { +            "version": "3.15.0", +            "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", +            "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", +            "dev": true, +            "dependencies": { +                "@types/json5": "^0.0.29", +                "json5": "^1.0.2", +                "minimist": "^1.2.6", +                "strip-bom": "^3.0.0" +            } +        }, +        "node_modules/tsconfig-paths/node_modules/json5": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", +            "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", +            "dev": true, +            "dependencies": { +                "minimist": "^1.2.0" +            }, +            "bin": { +                "json5": "lib/cli.js" +            } +        },          "node_modules/tslib": {              "version": "2.6.2",              "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -6619,6 +8141,71 @@                  "url": "https://github.com/sponsors/sindresorhus"              }          }, +        "node_modules/typed-array-buffer": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", +            "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.6", +                "es-errors": "^1.3.0", +                "is-typed-array": "^1.1.13" +            }, +            "engines": { +                "node": ">= 0.4" +            } +        }, +        "node_modules/typed-array-byte-length": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", +            "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "for-each": "^0.3.3", +                "has-proto": "^1.0.1", +                "is-typed-array": "^1.1.10" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/typed-array-byte-offset": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", +            "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", +            "dev": true, +            "dependencies": { +                "available-typed-arrays": "^1.0.5", +                "call-bind": "^1.0.2", +                "for-each": "^0.3.3", +                "has-proto": "^1.0.1", +                "is-typed-array": "^1.1.10" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/typed-array-length": { +            "version": "1.0.4", +            "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", +            "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "for-each": "^0.3.3", +                "is-typed-array": "^1.1.9" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/typescript": {              "version": "5.3.3",              "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -6651,6 +8238,21 @@                  "node": ">=0.8.0"              }          }, +        "node_modules/unbox-primitive": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", +            "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", +            "dev": true, +            "dependencies": { +                "call-bind": "^1.0.2", +                "has-bigints": "^1.0.2", +                "has-symbols": "^1.0.3", +                "which-boxed-primitive": "^1.0.2" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/undici-types": {              "version": "5.26.5",              "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -6666,6 +8268,36 @@                  "node": ">= 4.0.0"              }          }, +        "node_modules/update-browserslist-db": { +            "version": "1.0.13", +            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", +            "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", +            "dev": true, +            "funding": [ +                { +                    "type": "opencollective", +                    "url": "https://opencollective.com/browserslist" +                }, +                { +                    "type": "tidelift", +                    "url": "https://tidelift.com/funding/github/npm/browserslist" +                }, +                { +                    "type": "github", +                    "url": "https://github.com/sponsors/ai" +                } +            ], +            "dependencies": { +                "escalade": "^3.1.1", +                "picocolors": "^1.0.0" +            }, +            "bin": { +                "update-browserslist-db": "cli.js" +            }, +            "peerDependencies": { +                "browserslist": ">= 4.21.0" +            } +        },          "node_modules/upper-case-first": {              "version": "2.0.2",              "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", @@ -6714,6 +8346,26 @@                  "node": ">=10.12.0"              }          }, +        "node_modules/validate-npm-package-license": { +            "version": "3.0.4", +            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", +            "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", +            "dev": true, +            "dependencies": { +                "spdx-correct": "^3.0.0", +                "spdx-expression-parse": "^3.0.0" +            } +        }, +        "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { +            "version": "3.0.1", +            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", +            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", +            "dev": true, +            "dependencies": { +                "spdx-exceptions": "^2.1.0", +                "spdx-license-ids": "^3.0.0" +            } +        },          "node_modules/visit-values": {              "version": "2.0.0",              "resolved": "https://registry.npmjs.org/visit-values/-/visit-values-2.0.0.tgz", @@ -7361,6 +9013,41 @@                  "node": ">= 8"              }          }, +        "node_modules/which-boxed-primitive": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", +            "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", +            "dev": true, +            "dependencies": { +                "is-bigint": "^1.0.1", +                "is-boolean-object": "^1.1.0", +                "is-number-object": "^1.0.4", +                "is-string": "^1.0.5", +                "is-symbol": "^1.0.3" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        }, +        "node_modules/which-typed-array": { +            "version": "1.1.14", +            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", +            "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", +            "dev": true, +            "dependencies": { +                "available-typed-arrays": "^1.0.6", +                "call-bind": "^1.0.5", +                "for-each": "^0.3.3", +                "gopd": "^1.0.1", +                "has-tostringtag": "^1.0.1" +            }, +            "engines": { +                "node": ">= 0.4" +            }, +            "funding": { +                "url": "https://github.com/sponsors/ljharb" +            } +        },          "node_modules/why-is-node-running": {              "version": "2.2.2",              "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", @@ -8572,6 +10259,12 @@              "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",              "dev": true          }, +        "@types/json5": { +            "version": "0.0.29", +            "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", +            "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", +            "dev": true +        },          "@types/node": {              "version": "20.11.5",              "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", @@ -8581,6 +10274,12 @@                  "undici-types": "~5.26.4"              }          }, +        "@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 +        },          "@types/semver": {              "version": "7.5.6",              "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", @@ -8913,12 +10612,101 @@              "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",              "dev": true          }, +        "array-buffer-byte-length": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", +            "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.5", +                "is-array-buffer": "^3.0.4" +            } +        }, +        "array-includes": { +            "version": "3.1.7", +            "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", +            "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "get-intrinsic": "^1.2.1", +                "is-string": "^1.0.7" +            } +        },          "array-union": {              "version": "2.1.0",              "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",              "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",              "dev": true          }, +        "array.prototype.filter": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", +            "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "es-array-method-boxes-properly": "^1.0.0", +                "is-string": "^1.0.7" +            } +        }, +        "array.prototype.findlastindex": { +            "version": "1.2.4", +            "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", +            "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "es-abstract": "^1.22.3", +                "es-errors": "^1.3.0", +                "es-shim-unscopables": "^1.0.2" +            } +        }, +        "array.prototype.flat": { +            "version": "1.3.2", +            "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", +            "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "es-shim-unscopables": "^1.0.0" +            } +        }, +        "array.prototype.flatmap": { +            "version": "1.3.2", +            "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", +            "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "es-shim-unscopables": "^1.0.0" +            } +        }, +        "arraybuffer.prototype.slice": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", +            "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", +            "dev": true, +            "requires": { +                "array-buffer-byte-length": "^1.0.1", +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "es-abstract": "^1.22.3", +                "es-errors": "^1.2.1", +                "get-intrinsic": "^1.2.3", +                "is-array-buffer": "^3.0.4", +                "is-shared-array-buffer": "^1.0.2" +            } +        },          "assertion-error": {              "version": "1.1.0",              "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -8943,6 +10731,12 @@              "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",              "dev": true          }, +        "available-typed-arrays": { +            "version": "1.0.6", +            "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", +            "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", +            "dev": true +        },          "axios": {              "version": "1.6.7",              "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", @@ -8979,6 +10773,18 @@                  "fill-range": "^7.0.1"              }          }, +        "browserslist": { +            "version": "4.22.3", +            "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", +            "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", +            "dev": true, +            "requires": { +                "caniuse-lite": "^1.0.30001580", +                "electron-to-chromium": "^1.4.648", +                "node-releases": "^2.0.14", +                "update-browserslist-db": "^1.0.13" +            } +        },          "builtin-modules": {              "version": "3.3.0",              "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -9012,12 +10818,30 @@                  "responselike": "^3.0.0"              }          }, +        "call-bind": { +            "version": "1.0.6", +            "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", +            "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", +            "dev": true, +            "requires": { +                "es-errors": "^1.3.0", +                "function-bind": "^1.1.2", +                "get-intrinsic": "^1.2.3", +                "set-function-length": "^1.2.0" +            } +        },          "callsites": {              "version": "3.1.0",              "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",              "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",              "dev": true          }, +        "caniuse-lite": { +            "version": "1.0.30001585", +            "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", +            "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", +            "dev": true +        },          "chai": {              "version": "4.4.1",              "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -9052,6 +10876,29 @@                  "get-func-name": "^2.0.2"              }          }, +        "ci-info": { +            "version": "4.0.0", +            "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", +            "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", +            "dev": true +        }, +        "clean-regexp": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", +            "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", +            "dev": true, +            "requires": { +                "escape-string-regexp": "^1.0.5" +            }, +            "dependencies": { +                "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 +                } +            } +        },          "cli-cursor": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", @@ -9187,6 +11034,15 @@              "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",              "dev": true          }, +        "core-js-compat": { +            "version": "3.35.1", +            "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", +            "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", +            "dev": true, +            "requires": { +                "browserslist": "^4.22.2" +            } +        },          "core-util-is": {              "version": "1.0.3",              "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -9339,6 +11195,29 @@              "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",              "dev": true          }, +        "define-data-property": { +            "version": "1.1.2", +            "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", +            "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", +            "dev": true, +            "requires": { +                "es-errors": "^1.3.0", +                "get-intrinsic": "^1.2.2", +                "gopd": "^1.0.1", +                "has-property-descriptors": "^1.0.1" +            } +        }, +        "define-properties": { +            "version": "1.2.1", +            "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", +            "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", +            "dev": true, +            "requires": { +                "define-data-property": "^1.0.1", +                "has-property-descriptors": "^1.0.0", +                "object-keys": "^1.1.1" +            } +        },          "delayed-stream": {              "version": "1.0.0",              "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -9392,6 +11271,12 @@              "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",              "dev": true          }, +        "electron-to-chromium": { +            "version": "1.4.665", +            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.665.tgz", +            "integrity": "sha512-UpyCWObBoD+nSZgOC2ToaIdZB0r9GhqT2WahPKiSki6ckkSuKhQNso8V2PrFcHBMleI/eqbKgVQgVC4Wni4ilw==", +            "dev": true +        },          "emoji-regex": {              "version": "9.2.2",              "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -9424,6 +11309,96 @@                  "is-arrayish": "^0.2.1"              }          }, +        "es-abstract": { +            "version": "1.22.3", +            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", +            "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", +            "dev": true, +            "requires": { +                "array-buffer-byte-length": "^1.0.0", +                "arraybuffer.prototype.slice": "^1.0.2", +                "available-typed-arrays": "^1.0.5", +                "call-bind": "^1.0.5", +                "es-set-tostringtag": "^2.0.1", +                "es-to-primitive": "^1.2.1", +                "function.prototype.name": "^1.1.6", +                "get-intrinsic": "^1.2.2", +                "get-symbol-description": "^1.0.0", +                "globalthis": "^1.0.3", +                "gopd": "^1.0.1", +                "has-property-descriptors": "^1.0.0", +                "has-proto": "^1.0.1", +                "has-symbols": "^1.0.3", +                "hasown": "^2.0.0", +                "internal-slot": "^1.0.5", +                "is-array-buffer": "^3.0.2", +                "is-callable": "^1.2.7", +                "is-negative-zero": "^2.0.2", +                "is-regex": "^1.1.4", +                "is-shared-array-buffer": "^1.0.2", +                "is-string": "^1.0.7", +                "is-typed-array": "^1.1.12", +                "is-weakref": "^1.0.2", +                "object-inspect": "^1.13.1", +                "object-keys": "^1.1.1", +                "object.assign": "^4.1.4", +                "regexp.prototype.flags": "^1.5.1", +                "safe-array-concat": "^1.0.1", +                "safe-regex-test": "^1.0.0", +                "string.prototype.trim": "^1.2.8", +                "string.prototype.trimend": "^1.0.7", +                "string.prototype.trimstart": "^1.0.7", +                "typed-array-buffer": "^1.0.0", +                "typed-array-byte-length": "^1.0.0", +                "typed-array-byte-offset": "^1.0.0", +                "typed-array-length": "^1.0.4", +                "unbox-primitive": "^1.0.2", +                "which-typed-array": "^1.1.13" +            } +        }, +        "es-array-method-boxes-properly": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", +            "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", +            "dev": true +        }, +        "es-errors": { +            "version": "1.3.0", +            "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", +            "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", +            "dev": true +        }, +        "es-set-tostringtag": { +            "version": "2.0.2", +            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", +            "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", +            "dev": true, +            "requires": { +                "get-intrinsic": "^1.2.2", +                "has-tostringtag": "^1.0.0", +                "hasown": "^2.0.0" +            } +        }, +        "es-shim-unscopables": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", +            "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", +            "dev": true, +            "requires": { +                "hasown": "^2.0.0" +            } +        }, +        "es-to-primitive": { +            "version": "1.2.1", +            "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", +            "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", +            "dev": true, +            "requires": { +                "is-callable": "^1.1.4", +                "is-date-object": "^1.0.1", +                "is-symbol": "^1.0.2" +            } +        },          "esbuild": {              "version": "0.20.0",              "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.0.tgz", @@ -9455,6 +11430,12 @@                  "@esbuild/win32-x64": "0.20.0"              }          }, +        "escalade": { +            "version": "3.1.2", +            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", +            "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", +            "dev": true +        },          "escape-string-regexp": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -9536,6 +11517,48 @@                  "semver": "^7.5.4"              }          }, +        "eslint-import-resolver-node": { +            "version": "0.3.9", +            "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", +            "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", +            "dev": true, +            "requires": { +                "debug": "^3.2.7", +                "is-core-module": "^2.13.0", +                "resolve": "^1.22.4" +            }, +            "dependencies": { +                "debug": { +                    "version": "3.2.7", +                    "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +                    "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +                    "dev": true, +                    "requires": { +                        "ms": "^2.1.1" +                    } +                } +            } +        }, +        "eslint-module-utils": { +            "version": "2.8.0", +            "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", +            "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", +            "dev": true, +            "requires": { +                "debug": "^3.2.7" +            }, +            "dependencies": { +                "debug": { +                    "version": "3.2.7", +                    "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +                    "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +                    "dev": true, +                    "requires": { +                        "ms": "^2.1.1" +                    } +                } +            } +        },          "eslint-plugin-eslint-comments": {              "version": "3.2.0",              "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", @@ -9561,6 +11584,57 @@              "dev": true,              "requires": {}          }, +        "eslint-plugin-import": { +            "version": "2.29.1", +            "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", +            "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", +            "dev": true, +            "requires": { +                "array-includes": "^3.1.7", +                "array.prototype.findlastindex": "^1.2.3", +                "array.prototype.flat": "^1.3.2", +                "array.prototype.flatmap": "^1.3.2", +                "debug": "^3.2.7", +                "doctrine": "^2.1.0", +                "eslint-import-resolver-node": "^0.3.9", +                "eslint-module-utils": "^2.8.0", +                "hasown": "^2.0.0", +                "is-core-module": "^2.13.1", +                "is-glob": "^4.0.3", +                "minimatch": "^3.1.2", +                "object.fromentries": "^2.0.7", +                "object.groupby": "^1.0.1", +                "object.values": "^1.1.7", +                "semver": "^6.3.1", +                "tsconfig-paths": "^3.15.0" +            }, +            "dependencies": { +                "debug": { +                    "version": "3.2.7", +                    "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", +                    "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", +                    "dev": true, +                    "requires": { +                        "ms": "^2.1.1" +                    } +                }, +                "doctrine": { +                    "version": "2.1.0", +                    "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", +                    "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", +                    "dev": true, +                    "requires": { +                        "esutils": "^2.0.2" +                    } +                }, +                "semver": { +                    "version": "6.3.1", +                    "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", +                    "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", +                    "dev": true +                } +            } +        },          "eslint-plugin-jsdoc": {              "version": "48.0.6",              "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.0.6.tgz", @@ -9600,6 +11674,37 @@              "dev": true,              "requires": {}          }, +        "eslint-plugin-sonarjs": { +            "version": "0.23.0", +            "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.23.0.tgz", +            "integrity": "sha512-z44T3PBf9W7qQ/aR+NmofOTyg6HLhSEZOPD4zhStqBpLoMp8GYhFksuUBnCxbnf1nfISpKBVkQhiBLFI/F4Wlg==", +            "dev": true, +            "requires": {} +        }, +        "eslint-plugin-unicorn": { +            "version": "51.0.1", +            "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz", +            "integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==", +            "dev": true, +            "requires": { +                "@babel/helper-validator-identifier": "^7.22.20", +                "@eslint-community/eslint-utils": "^4.4.0", +                "@eslint/eslintrc": "^2.1.4", +                "ci-info": "^4.0.0", +                "clean-regexp": "^1.0.0", +                "core-js-compat": "^3.34.0", +                "esquery": "^1.5.0", +                "indent-string": "^4.0.0", +                "is-builtin-module": "^3.2.1", +                "jsesc": "^3.0.2", +                "pluralize": "^8.0.0", +                "read-pkg-up": "^7.0.1", +                "regexp-tree": "^0.1.27", +                "regjsparser": "^0.10.0", +                "semver": "^7.5.4", +                "strip-indent": "^3.0.0" +            } +        },          "eslint-plugin-unused-imports": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", @@ -9835,6 +11940,15 @@              "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",              "dev": true          }, +        "for-each": { +            "version": "0.3.3", +            "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", +            "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", +            "dev": true, +            "requires": { +                "is-callable": "^1.1.3" +            } +        },          "foreground-child": {              "version": "3.1.1",              "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -9875,6 +11989,30 @@              "dev": true,              "optional": true          }, +        "function-bind": { +            "version": "1.1.2", +            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", +            "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", +            "dev": true +        }, +        "function.prototype.name": { +            "version": "1.1.6", +            "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", +            "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1", +                "functions-have-names": "^1.2.3" +            } +        }, +        "functions-have-names": { +            "version": "1.2.3", +            "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", +            "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", +            "dev": true +        },          "get-east-asian-width": {              "version": "1.2.0",              "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", @@ -9887,6 +12025,19 @@              "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",              "dev": true          }, +        "get-intrinsic": { +            "version": "1.2.4", +            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", +            "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", +            "dev": true, +            "requires": { +                "es-errors": "^1.3.0", +                "function-bind": "^1.1.2", +                "has-proto": "^1.0.1", +                "has-symbols": "^1.0.3", +                "hasown": "^2.0.0" +            } +        },          "get-stdin": {              "version": "5.0.1",              "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", @@ -9899,6 +12050,17 @@              "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",              "dev": true          }, +        "get-symbol-description": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", +            "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.5", +                "es-errors": "^1.3.0", +                "get-intrinsic": "^1.2.4" +            } +        },          "glob": {              "version": "10.3.10",              "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -9981,6 +12143,15 @@                  "type-fest": "^0.20.2"              }          }, +        "globalthis": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", +            "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", +            "dev": true, +            "requires": { +                "define-properties": "^1.1.3" +            } +        },          "globby": {              "version": "11.1.0",              "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -10001,6 +12172,15 @@              "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",              "dev": true          }, +        "gopd": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", +            "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", +            "dev": true, +            "requires": { +                "get-intrinsic": "^1.1.3" +            } +        },          "got": {              "version": "13.0.0",              "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", @@ -10039,12 +12219,63 @@                  "wordwrap": "^1.0.0"              }          }, +        "has-bigints": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", +            "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", +            "dev": true +        },          "has-flag": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",              "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",              "dev": true          }, +        "has-property-descriptors": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", +            "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", +            "dev": true, +            "requires": { +                "get-intrinsic": "^1.2.2" +            } +        }, +        "has-proto": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", +            "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", +            "dev": true +        }, +        "has-symbols": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +            "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", +            "dev": true +        }, +        "has-tostringtag": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", +            "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", +            "dev": true, +            "requires": { +                "has-symbols": "^1.0.3" +            } +        }, +        "hasown": { +            "version": "2.0.1", +            "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", +            "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", +            "dev": true, +            "requires": { +                "function-bind": "^1.1.2" +            } +        }, +        "hosted-git-info": { +            "version": "2.8.9", +            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", +            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", +            "dev": true +        },          "html-encoding-sniffer": {              "version": "4.0.0",              "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", @@ -10170,6 +12401,12 @@              "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",              "dev": true          }, +        "indent-string": { +            "version": "4.0.0", +            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", +            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", +            "dev": true +        },          "inflight": {              "version": "1.0.6",              "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -10192,12 +12429,52 @@              "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",              "dev": true          }, +        "internal-slot": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", +            "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", +            "dev": true, +            "requires": { +                "es-errors": "^1.3.0", +                "hasown": "^2.0.0", +                "side-channel": "^1.0.4" +            } +        }, +        "is-array-buffer": { +            "version": "3.0.4", +            "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", +            "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "get-intrinsic": "^1.2.1" +            } +        },          "is-arrayish": {              "version": "0.2.1",              "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",              "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",              "dev": true          }, +        "is-bigint": { +            "version": "1.0.4", +            "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", +            "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", +            "dev": true, +            "requires": { +                "has-bigints": "^1.0.1" +            } +        }, +        "is-boolean-object": { +            "version": "1.1.2", +            "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", +            "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "has-tostringtag": "^1.0.0" +            } +        },          "is-builtin-module": {              "version": "3.2.1",              "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", @@ -10207,6 +12484,30 @@                  "builtin-modules": "^3.3.0"              }          }, +        "is-callable": { +            "version": "1.2.7", +            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", +            "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", +            "dev": true +        }, +        "is-core-module": { +            "version": "2.13.1", +            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", +            "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", +            "dev": true, +            "requires": { +                "hasown": "^2.0.0" +            } +        }, +        "is-date-object": { +            "version": "1.0.5", +            "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", +            "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", +            "dev": true, +            "requires": { +                "has-tostringtag": "^1.0.0" +            } +        },          "is-extglob": {              "version": "2.1.1",              "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -10228,12 +12529,27 @@                  "is-extglob": "^2.1.1"              }          }, +        "is-negative-zero": { +            "version": "2.0.2", +            "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", +            "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", +            "dev": true +        },          "is-number": {              "version": "7.0.0",              "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",              "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",              "dev": true          }, +        "is-number-object": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", +            "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", +            "dev": true, +            "requires": { +                "has-tostringtag": "^1.0.0" +            } +        },          "is-path-inside": {              "version": "3.0.3",              "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -10252,12 +12568,67 @@              "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",              "dev": true          }, +        "is-regex": { +            "version": "1.1.4", +            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", +            "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "has-tostringtag": "^1.0.0" +            } +        }, +        "is-shared-array-buffer": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", +            "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2" +            } +        },          "is-stream": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",              "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",              "dev": true          }, +        "is-string": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", +            "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", +            "dev": true, +            "requires": { +                "has-tostringtag": "^1.0.0" +            } +        }, +        "is-symbol": { +            "version": "1.0.4", +            "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", +            "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", +            "dev": true, +            "requires": { +                "has-symbols": "^1.0.2" +            } +        }, +        "is-typed-array": { +            "version": "1.1.13", +            "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", +            "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", +            "dev": true, +            "requires": { +                "which-typed-array": "^1.1.14" +            } +        }, +        "is-weakref": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", +            "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2" +            } +        },          "isarray": {              "version": "1.0.0",              "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -10368,6 +12739,12 @@                  "xml-name-validator": "^5.0.0"              }          }, +        "jsesc": { +            "version": "3.0.2", +            "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", +            "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", +            "dev": true +        },          "json-buffer": {              "version": "3.0.1",              "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -10834,6 +13211,12 @@              "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",              "dev": true          }, +        "min-indent": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", +            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", +            "dev": true +        },          "minimatch": {              "version": "3.1.2",              "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10907,6 +13290,32 @@              "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",              "dev": true          }, +        "node-releases": { +            "version": "2.0.14", +            "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", +            "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", +            "dev": true +        }, +        "normalize-package-data": { +            "version": "2.5.0", +            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", +            "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", +            "dev": true, +            "requires": { +                "hosted-git-info": "^2.1.4", +                "resolve": "^1.10.0", +                "semver": "2 || 3 || 4 || 5", +                "validate-npm-package-license": "^3.0.1" +            }, +            "dependencies": { +                "semver": { +                    "version": "5.7.2", +                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", +                    "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", +                    "dev": true +                } +            } +        },          "normalize-path": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10942,6 +13351,65 @@              "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",              "dev": true          }, +        "object-inspect": { +            "version": "1.13.1", +            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", +            "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", +            "dev": true +        }, +        "object-keys": { +            "version": "1.1.1", +            "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", +            "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", +            "dev": true +        }, +        "object.assign": { +            "version": "4.1.5", +            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", +            "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "has-symbols": "^1.0.3", +                "object-keys": "^1.1.1" +            } +        }, +        "object.fromentries": { +            "version": "2.0.7", +            "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", +            "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            } +        }, +        "object.groupby": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", +            "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", +            "dev": true, +            "requires": { +                "array.prototype.filter": "^1.0.3", +                "call-bind": "^1.0.5", +                "define-properties": "^1.2.1", +                "es-abstract": "^1.22.3", +                "es-errors": "^1.0.0" +            } +        }, +        "object.values": { +            "version": "1.1.7", +            "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", +            "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            } +        },          "once": {              "version": "1.4.0",              "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10998,6 +13466,12 @@                  "p-limit": "^3.0.2"              }          }, +        "p-try": { +            "version": "2.2.0", +            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", +            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", +            "dev": true +        },          "pako": {              "version": "1.0.11",              "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -11051,6 +13525,12 @@              "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",              "dev": true          }, +        "path-parse": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", +            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", +            "dev": true +        },          "path-scurry": {              "version": "1.10.1",              "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", @@ -11124,6 +13604,12 @@              "integrity": "sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==",              "dev": true          }, +        "pluralize": { +            "version": "8.0.0", +            "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", +            "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", +            "dev": true +        },          "postcss": {              "version": "8.4.35",              "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", @@ -11281,6 +13767,82 @@              "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",              "dev": true          }, +        "read-pkg": { +            "version": "5.2.0", +            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", +            "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", +            "dev": true, +            "requires": { +                "@types/normalize-package-data": "^2.4.0", +                "normalize-package-data": "^2.5.0", +                "parse-json": "^5.0.0", +                "type-fest": "^0.6.0" +            }, +            "dependencies": { +                "type-fest": { +                    "version": "0.6.0", +                    "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", +                    "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", +                    "dev": true +                } +            } +        }, +        "read-pkg-up": { +            "version": "7.0.1", +            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", +            "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", +            "dev": true, +            "requires": { +                "find-up": "^4.1.0", +                "read-pkg": "^5.2.0", +                "type-fest": "^0.8.1" +            }, +            "dependencies": { +                "find-up": { +                    "version": "4.1.0", +                    "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", +                    "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", +                    "dev": true, +                    "requires": { +                        "locate-path": "^5.0.0", +                        "path-exists": "^4.0.0" +                    } +                }, +                "locate-path": { +                    "version": "5.0.0", +                    "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", +                    "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", +                    "dev": true, +                    "requires": { +                        "p-locate": "^4.1.0" +                    } +                }, +                "p-limit": { +                    "version": "2.3.0", +                    "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", +                    "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", +                    "dev": true, +                    "requires": { +                        "p-try": "^2.0.0" +                    } +                }, +                "p-locate": { +                    "version": "4.1.0", +                    "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", +                    "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", +                    "dev": true, +                    "requires": { +                        "p-limit": "^2.2.0" +                    } +                }, +                "type-fest": { +                    "version": "0.8.1", +                    "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", +                    "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", +                    "dev": true +                } +            } +        },          "readable-stream": {              "version": "2.3.8",              "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -11296,6 +13858,41 @@                  "util-deprecate": "~1.0.1"              }          }, +        "regexp-tree": { +            "version": "0.1.27", +            "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", +            "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", +            "dev": true +        }, +        "regexp.prototype.flags": { +            "version": "1.5.2", +            "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", +            "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.6", +                "define-properties": "^1.2.1", +                "es-errors": "^1.3.0", +                "set-function-name": "^2.0.1" +            } +        }, +        "regjsparser": { +            "version": "0.10.0", +            "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", +            "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", +            "dev": true, +            "requires": { +                "jsesc": "~0.5.0" +            }, +            "dependencies": { +                "jsesc": { +                    "version": "0.5.0", +                    "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", +                    "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", +                    "dev": true +                } +            } +        },          "require-from-string": {              "version": "2.0.2",              "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -11308,6 +13905,17 @@              "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",              "dev": true          }, +        "resolve": { +            "version": "1.22.8", +            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", +            "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", +            "dev": true, +            "requires": { +                "is-core-module": "^2.13.0", +                "path-parse": "^1.0.7", +                "supports-preserve-symlinks-flag": "^1.0.0" +            } +        },          "resolve-alpn": {              "version": "1.2.1",              "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", @@ -11437,12 +14045,43 @@                  "queue-microtask": "^1.2.2"              }          }, +        "safe-array-concat": { +            "version": "1.1.0", +            "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", +            "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.5", +                "get-intrinsic": "^1.2.2", +                "has-symbols": "^1.0.3", +                "isarray": "^2.0.5" +            }, +            "dependencies": { +                "isarray": { +                    "version": "2.0.5", +                    "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", +                    "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", +                    "dev": true +                } +            } +        },          "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          }, +        "safe-regex-test": { +            "version": "1.0.3", +            "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", +            "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.6", +                "es-errors": "^1.3.0", +                "is-regex": "^1.1.4" +            } +        },          "safe-stable-stringify": {              "version": "2.4.3",              "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -11495,6 +14134,31 @@                  "upper-case-first": "^2.0.2"              }          }, +        "set-function-length": { +            "version": "1.2.1", +            "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", +            "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", +            "dev": true, +            "requires": { +                "define-data-property": "^1.1.2", +                "es-errors": "^1.3.0", +                "function-bind": "^1.1.2", +                "get-intrinsic": "^1.2.3", +                "gopd": "^1.0.1", +                "has-property-descriptors": "^1.0.1" +            } +        }, +        "set-function-name": { +            "version": "2.0.1", +            "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", +            "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", +            "dev": true, +            "requires": { +                "define-data-property": "^1.0.1", +                "functions-have-names": "^1.2.3", +                "has-property-descriptors": "^1.0.0" +            } +        },          "setimmediate": {              "version": "1.0.5",              "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -11516,6 +14180,18 @@              "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",              "dev": true          }, +        "side-channel": { +            "version": "1.0.5", +            "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", +            "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.6", +                "es-errors": "^1.3.0", +                "get-intrinsic": "^1.2.4", +                "object-inspect": "^1.13.1" +            } +        },          "siginfo": {              "version": "2.0.0",              "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -11573,6 +14249,28 @@                  "decode-uri-component": "^0.2.0"              }          }, +        "spdx-correct": { +            "version": "3.2.0", +            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", +            "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", +            "dev": true, +            "requires": { +                "spdx-expression-parse": "^3.0.0", +                "spdx-license-ids": "^3.0.0" +            }, +            "dependencies": { +                "spdx-expression-parse": { +                    "version": "3.0.1", +                    "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", +                    "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", +                    "dev": true, +                    "requires": { +                        "spdx-exceptions": "^2.1.0", +                        "spdx-license-ids": "^3.0.0" +                    } +                } +            } +        },          "spdx-exceptions": {              "version": "2.3.0",              "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", @@ -11679,6 +14377,39 @@                  }              }          }, +        "string.prototype.trim": { +            "version": "1.2.8", +            "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", +            "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            } +        }, +        "string.prototype.trimend": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", +            "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            } +        }, +        "string.prototype.trimstart": { +            "version": "1.0.7", +            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", +            "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "define-properties": "^1.2.0", +                "es-abstract": "^1.22.1" +            } +        },          "strip-ansi": {              "version": "6.0.1",              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -11697,12 +14428,27 @@                  "ansi-regex": "^5.0.1"              }          }, +        "strip-bom": { +            "version": "3.0.0", +            "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", +            "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", +            "dev": true +        },          "strip-final-newline": {              "version": "3.0.0",              "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",              "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",              "dev": true          }, +        "strip-indent": { +            "version": "3.0.0", +            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", +            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", +            "dev": true, +            "requires": { +                "min-indent": "^1.0.0" +            } +        },          "strip-json-comments": {              "version": "3.1.1",              "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -11884,6 +14630,12 @@                  "supports-color": "^7.0.0"              }          }, +        "supports-preserve-symlinks-flag": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", +            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", +            "dev": true +        },          "svg-tags": {              "version": "1.0.0",              "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", @@ -12089,6 +14841,29 @@                  }              }          }, +        "tsconfig-paths": { +            "version": "3.15.0", +            "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", +            "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", +            "dev": true, +            "requires": { +                "@types/json5": "^0.0.29", +                "json5": "^1.0.2", +                "minimist": "^1.2.6", +                "strip-bom": "^3.0.0" +            }, +            "dependencies": { +                "json5": { +                    "version": "1.0.2", +                    "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", +                    "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", +                    "dev": true, +                    "requires": { +                        "minimist": "^1.2.0" +                    } +                } +            } +        },          "tslib": {              "version": "2.6.2",              "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -12116,6 +14891,53 @@              "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",              "dev": true          }, +        "typed-array-buffer": { +            "version": "1.0.1", +            "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz", +            "integrity": "sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.6", +                "es-errors": "^1.3.0", +                "is-typed-array": "^1.1.13" +            } +        }, +        "typed-array-byte-length": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", +            "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "for-each": "^0.3.3", +                "has-proto": "^1.0.1", +                "is-typed-array": "^1.1.10" +            } +        }, +        "typed-array-byte-offset": { +            "version": "1.0.0", +            "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", +            "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", +            "dev": true, +            "requires": { +                "available-typed-arrays": "^1.0.5", +                "call-bind": "^1.0.2", +                "for-each": "^0.3.3", +                "has-proto": "^1.0.1", +                "is-typed-array": "^1.1.10" +            } +        }, +        "typed-array-length": { +            "version": "1.0.4", +            "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", +            "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "for-each": "^0.3.3", +                "is-typed-array": "^1.1.9" +            } +        },          "typescript": {              "version": "5.3.3",              "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -12135,6 +14957,18 @@              "dev": true,              "optional": true          }, +        "unbox-primitive": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", +            "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", +            "dev": true, +            "requires": { +                "call-bind": "^1.0.2", +                "has-bigints": "^1.0.2", +                "has-symbols": "^1.0.3", +                "which-boxed-primitive": "^1.0.2" +            } +        },          "undici-types": {              "version": "5.26.5",              "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -12147,6 +14981,16 @@              "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",              "dev": true          }, +        "update-browserslist-db": { +            "version": "1.0.13", +            "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", +            "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", +            "dev": true, +            "requires": { +                "escalade": "^3.1.1", +                "picocolors": "^1.0.0" +            } +        },          "upper-case-first": {              "version": "2.0.2",              "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", @@ -12192,6 +15036,28 @@                  "convert-source-map": "^2.0.0"              }          }, +        "validate-npm-package-license": { +            "version": "3.0.4", +            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", +            "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", +            "dev": true, +            "requires": { +                "spdx-correct": "^3.0.0", +                "spdx-expression-parse": "^3.0.0" +            }, +            "dependencies": { +                "spdx-expression-parse": { +                    "version": "3.0.1", +                    "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", +                    "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", +                    "dev": true, +                    "requires": { +                        "spdx-exceptions": "^2.1.0", +                        "spdx-license-ids": "^3.0.0" +                    } +                } +            } +        },          "visit-values": {              "version": "2.0.0",              "resolved": "https://registry.npmjs.org/visit-values/-/visit-values-2.0.0.tgz", @@ -12507,6 +15373,32 @@                  "isexe": "^2.0.0"              }          }, +        "which-boxed-primitive": { +            "version": "1.0.2", +            "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", +            "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", +            "dev": true, +            "requires": { +                "is-bigint": "^1.0.1", +                "is-boolean-object": "^1.1.0", +                "is-number-object": "^1.0.4", +                "is-string": "^1.0.5", +                "is-symbol": "^1.0.3" +            } +        }, +        "which-typed-array": { +            "version": "1.1.14", +            "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", +            "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", +            "dev": true, +            "requires": { +                "available-typed-arrays": "^1.0.6", +                "call-bind": "^1.0.5", +                "for-each": "^0.3.3", +                "gopd": "^1.0.1", +                "has-tostringtag": "^1.0.1" +            } +        },          "why-is-node-running": {              "version": "2.2.2",              "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", diff --git a/package.json b/package.json index 7c733392..77a19eec 100644 --- a/package.json +++ b/package.json @@ -73,9 +73,12 @@          "eslint": "^8.56.0",          "eslint-plugin-eslint-comments": "^3.2.0",          "eslint-plugin-header": "^3.1.1", +        "eslint-plugin-import": "^2.29.1",          "eslint-plugin-jsdoc": "^48.0.6",          "eslint-plugin-jsonc": "^2.13.0",          "eslint-plugin-no-unsanitized": "^4.0.2", +        "eslint-plugin-sonarjs": "^0.23.0", +        "eslint-plugin-unicorn": "^51.0.1",          "eslint-plugin-unused-imports": "^3.0.0",          "eslint-plugin-vitest": "^0.3.22",          "fake-indexeddb": "^5.0.2", diff --git a/test/css-json.test.js b/test/css-json.test.js index b64419c3..87d24d6c 100644 --- a/test/css-json.test.js +++ b/test/css-json.test.js @@ -18,7 +18,7 @@  import fs from 'fs';  import {describe, expect, test} from 'vitest'; -import {formatRulesJson, generateRules, getTargets} from '../dev/generate-css-json'; +import {formatRulesJson, generateRules, getTargets} from '../dev/generate-css-json.js';  /** */  function main() { diff --git a/test/data/html/js/html-test-utilities.js b/test/data/html/js/html-test-utilities.js index b72b7fca..c3382456 100644 --- a/test/data/html/js/html-test-utilities.js +++ b/test/data/html/js/html-test-utilities.js @@ -16,6 +16,10 @@   * along with this program.  If not, see <https://www.gnu.org/licenses/>.   */ +/** + * This is a static class because this file is not imported as a module. + */ +// eslint-disable-next-line unicorn/no-static-only-class  class HtmlTestUtilities {      /**       * @param {Element} element diff --git a/test/dictionary-data-validate.test.js b/test/dictionary-data-validate.test.js index 4c96cdb0..b09e4ae0 100644 --- a/test/dictionary-data-validate.test.js +++ b/test/dictionary-data-validate.test.js @@ -48,11 +48,11 @@ describe('Dictionary validation', () => {      describe.each(testCases)('Test dictionary $name', ({name, valid}) => {          it(`should be ${valid ? 'valid' : 'invalid'}`, async ({expect}) => {              const archive = createTestDictionaryArchive(name); -            if (valid) { -                await expect(dictionaryValidate.validateDictionary(null, archive, schemas)).resolves.not.toThrow(); -            } else { -                await expect(dictionaryValidate.validateDictionary(null, archive, schemas)).rejects.toThrow(); -            } +            await ( +                valid ? +                expect(dictionaryValidate.validateDictionary(null, archive, schemas)).resolves.not.toThrow() : +                expect(dictionaryValidate.validateDictionary(null, archive, schemas)).rejects.toThrow() +            );          });      });  }); diff --git a/test/document-util.test.js b/test/document-util.test.js index 18a5d42c..c2b2edca 100644 --- a/test/document-util.test.js +++ b/test/document-util.test.js @@ -159,12 +159,13 @@ describe('Document utility tests', () => {                          expect(!!imposter).toStrictEqual(!!hasImposter);                          const range = document.createRange(); -                        range.setStart(/** @type {Node} */ (imposter ? imposter : startNode), startOffset); -                        range.setEnd(/** @type {Node} */ (imposter ? imposter : startNode), endOffset); +                        range.setStart(/** @type {Node} */ (imposter ?? startNode), startOffset); +                        range.setEnd(/** @type {Node} */ (imposter ?? startNode), endOffset);                          // Override getClientRects to return a rect guaranteed to contain (x, y)                          range.getClientRects = () => {                              /** @type {import('test/document-types').PseudoDOMRectList} */ +                            // eslint-disable-next-line sonarjs/prefer-immediate-return                              const domRectList = Object.assign(                                  [new DOMRect(x - 1, y - 1, 2, 2)],                                  { diff --git a/test/dom-text-scanner.test.js b/test/dom-text-scanner.test.js index e86d2980..1ec7cab7 100644 --- a/test/dom-text-scanner.test.js +++ b/test/dom-text-scanner.test.js @@ -34,7 +34,7 @@ function querySelectorTextNode(element, selector) {      let textIndex = -1;      const match = /::text$|::nth-text\((\d+)\)$/.exec(selector);      if (match !== null) { -        textIndex = (match[1] ? parseInt(match[1], 10) - 1 : 0); +        textIndex = (match[1] ? Number.parseInt(match[1], 10) - 1 : 0);          selector = selector.substring(0, selector.length - match[0].length);      }      const result = element.querySelector(selector); @@ -67,13 +67,11 @@ function getComputedFontSizeInPixels(window, getComputedStyle, element) {          if (element.nodeType === window.Node.ELEMENT_NODE) {              const fontSize = getComputedStyle(/** @type {Element} */ (element)).fontSize;              if (fontSize.endsWith('px')) { -                const value = parseFloat(fontSize.substring(0, fontSize.length - 2)); -                return value; +                return Number.parseFloat(fontSize.substring(0, fontSize.length - 2));              }          }      } -    const defaultFontSize = 14; -    return defaultFontSize; +    return 14; // Default font size  }  /** @@ -92,7 +90,7 @@ function createAbsoluteGetComputedStyle(window) {                  if (typeof result === 'string') {                      result = result.replace(/([-+]?\d(?:\.\d)?(?:[eE][-+]?\d+)?)em/g, (g0, g1) => {                          const fontSize = getComputedFontSizeInPixels(window, getComputedStyleOld, element); -                        return `${parseFloat(g1) * fontSize}px`; +                        return `${Number.parseFloat(g1) * fontSize}px`;                      });                  }                  return result; diff --git a/test/fixtures/anki-template-renderer-test.js b/test/fixtures/anki-template-renderer-test.js index de447126..635e0b7d 100644 --- a/test/fixtures/anki-template-renderer-test.js +++ b/test/fixtures/anki-template-renderer-test.js @@ -30,6 +30,7 @@ export async function createAnkiTemplateRendererTest() {      const ankiTemplateRenderer = new AnkiTemplateRenderer();      await ankiTemplateRenderer.prepare();      /** @type {import('vitest').TestAPI<{window: import('jsdom').DOMWindow, ankiTemplateRenderer: AnkiTemplateRenderer}>} */ +    // eslint-disable-next-line sonarjs/prefer-immediate-return      const result = test.extend({          window: async ({window}, use) => { await use(window); },          ankiTemplateRenderer: async ({window}, use) => { diff --git a/test/fixtures/translator-test.js b/test/fixtures/translator-test.js index a4c65b88..f39d832b 100644 --- a/test/fixtures/translator-test.js +++ b/test/fixtures/translator-test.js @@ -81,6 +81,7 @@ export async function createTranslatorTest(htmlFilePath, dictionaryDirectory, di      const test = createDomTest(htmlFilePath);      const translator = await createTranslatorContext(dictionaryDirectory, dictionaryName);      /** @type {import('vitest').TestAPI<{window: import('jsdom').DOMWindow, translator: Translator}>} */ +    // eslint-disable-next-line sonarjs/prefer-immediate-return      const result = test.extend({          window: async ({window}, use) => { await use(window); },          // eslint-disable-next-line no-empty-pattern diff --git a/test/json.test.js b/test/json.test.js index 0689913a..aa12dc09 100644 --- a/test/json.test.js +++ b/test/json.test.js @@ -110,11 +110,11 @@ describe.concurrent('JSON validation', () => {      const existingJsonFiles = getAllFiles(rootDir, (path, isDirectory) => {          const fileNameNormalized = normalizePathDirectorySeparators(path); -        if (isDirectory) { -            return !ignoreDirectories.has(fileNameNormalized); -        } else { -            return /\.json$/i.test(fileNameNormalized); -        } +        return ( +            isDirectory ? +            !ignoreDirectories.has(fileNameNormalized) : +            /\.json$/i.test(fileNameNormalized) +        );      });      /** @type {Set<string>} */      const existingJsonFileSet = new Set(); diff --git a/test/playwright/global.setup.js b/test/playwright/global.setup.js index 8c2f8b50..63452397 100644 --- a/test/playwright/global.setup.js +++ b/test/playwright/global.setup.js @@ -18,8 +18,8 @@  import {test as setup} from '@playwright/test';  import fs from 'fs';  import path from 'path'; -import {ManifestUtil} from '../../dev/manifest-util'; -import {root} from './playwright-util'; +import {ManifestUtil} from '../../dev/manifest-util.js'; +import {root} from './playwright-util.js';  const manifestPath = path.join(root, 'ext/manifest.json');  const copyManifestPath = path.join(root, 'ext/manifest-old.json'); diff --git a/test/playwright/global.teardown.js b/test/playwright/global.teardown.js index f3d8897f..e747e5fd 100644 --- a/test/playwright/global.teardown.js +++ b/test/playwright/global.teardown.js @@ -18,7 +18,7 @@  import {test as teardown} from '@playwright/test';  import fs from 'fs';  import path from 'path'; -import {root} from './playwright-util'; +import {root} from './playwright-util.js';  const manifestPath = path.join(root, 'ext/manifest.json');  const copyManifestPath = path.join(root, 'ext/manifest-old.json'); diff --git a/test/playwright/integration.spec.js b/test/playwright/integration.spec.js index bdcfddf0..170714a1 100644 --- a/test/playwright/integration.spec.js +++ b/test/playwright/integration.spec.js @@ -16,7 +16,7 @@   */  import path from 'path'; -import {createDictionaryArchive} from '../../dev/util'; +import {createDictionaryArchive} from '../../dev/util.js';  import {      expect,      expectedAddNoteBody, @@ -26,7 +26,7 @@ import {      root,      test,      writeToClipboardFromPage -} from './playwright-util'; +} from './playwright-util.js';  test.beforeEach(async ({context}) => {      // Wait for the on-install welcome.html tab to load, which becomes the foreground tab diff --git a/test/playwright/visual.spec.js b/test/playwright/visual.spec.js index cc2a50d0..fc8bb8df 100644 --- a/test/playwright/visual.spec.js +++ b/test/playwright/visual.spec.js @@ -17,7 +17,7 @@  import path from 'path';  import {pathToFileURL} from 'url'; -import {expect, root, test} from './playwright-util'; +import {expect, root, test} from './playwright-util.js';  test.beforeEach(async ({context}) => {      // Wait for the on-install welcome.html tab to load, which becomes the foreground tab |