diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index cbcaffc1..00000000 --- a/.eslintignore +++ /dev/null @@ -1,10 +0,0 @@ -dist -build -build-cli -webpack.cli.js -webpack.main.js -webpack.renderer.js - -**/node_modules - -**/jest.config.js diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 07e0dac9..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "root": true, - "env": { - "browser": true, - "node": true - }, - "overrides": [ - { - "files": ["*.ts", "*.js"], - "plugins": ["@typescript-eslint", "rxjs", "rxjs-angular", "import"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "project": ["./tsconfig.eslint.json"], - "sourceType": "module", - "ecmaVersion": 2020 - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - "prettier", - "plugin:rxjs/recommended" - ], - "settings": { - "import/parsers": { - "@typescript-eslint/parser": [".ts"] - }, - "import/resolver": { - "typescript": { - "alwaysTryTypes": true - } - } - }, - "rules": { - "@typescript-eslint/explicit-member-accessibility": [ - "error", - { "accessibility": "no-public" } - ], - "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled - "@typescript-eslint/no-misused-promises": ["error", { "checksVoidReturn": false }], - "@typescript-eslint/no-this-alias": ["error", { "allowedNames": ["self"] }], - "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], - "no-console": "error", - "import/no-unresolved": "off", // TODO: Look into turning off once each package is an actual package. - "import/order": [ - "error", - { - "alphabetize": { - "order": "asc" - }, - "newlines-between": "always", - "pathGroups": [ - { - "pattern": "@/jslib/**/*", - "group": "external", - "position": "after" - }, - { - "pattern": "@/src/**/*", - "group": "parent", - "position": "before" - } - ], - "pathGroupsExcludedImportTypes": ["builtin"] - } - ], - "rxjs-angular/prefer-takeuntil": "error", - "rxjs/no-exposed-subjects": ["error", { "allowProtected": true }], - "no-restricted-syntax": [ - "error", - { - "message": "Calling `svgIcon` directly is not allowed", - "selector": "CallExpression[callee.name='svgIcon']" - }, - { - "message": "Accessing FormGroup using `get` is not allowed, use `.value` instead", - "selector": "ChainExpression[expression.object.callee.property.name='get'][expression.property.name='value']" - } - ], - "curly": ["error", "all"], - "import/namespace": ["off"], // This doesn't resolve namespace imports correctly, but TS will throw for this anyway - "no-restricted-imports": ["error", { "patterns": ["src/**/*"] }] - } - }, - { - "files": ["*.html"], - "parser": "@angular-eslint/template-parser", - "plugins": ["@angular-eslint/template"], - "rules": { - "@angular-eslint/template/button-has-type": "error" - } - } - ] -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..c081f5a5 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,149 @@ +// @ts-check +import eslint from "@eslint/js"; +import tsParser from "@typescript-eslint/parser"; +import tsPlugin from "@typescript-eslint/eslint-plugin"; +import prettierConfig from "eslint-config-prettier"; +import importPlugin from "eslint-plugin-import"; +import rxjsX from "eslint-plugin-rxjs-x"; +import rxjsAngularX from "eslint-plugin-rxjs-angular-x"; +import angularEslint from "@angular-eslint/eslint-plugin-template"; +import angularParser from "@angular-eslint/template-parser"; +import globals from "globals"; + +export default [ + // Global ignores (replaces .eslintignore) + { + ignores: [ + "dist/**", + "dist-cli/**", + "build/**", + "build-cli/**", + "coverage/**", + "**/*.cjs", + "eslint.config.mjs", + "scripts/**/*.js", + "**/node_modules/**", + ], + }, + + // Base config for all JavaScript/TypeScript files + { + files: ["**/*.ts", "**/*.js"], + languageOptions: { + ecmaVersion: 2020, + sourceType: "module", + parser: tsParser, + parserOptions: { + project: ["./tsconfig.eslint.json"], + }, + globals: { + ...globals.browser, + ...globals.node, + }, + }, + plugins: { + "@typescript-eslint": tsPlugin, + import: importPlugin, + "rxjs-x": rxjsX, + "rxjs-angular-x": rxjsAngularX, + }, + settings: { + "import/parsers": { + "@typescript-eslint/parser": [".ts"], + }, + "import/resolver": { + typescript: { + alwaysTryTypes: true, + }, + }, + }, + rules: { + // ESLint recommended rules + ...eslint.configs.recommended.rules, + + // TypeScript ESLint recommended rules + ...tsPlugin.configs.recommended.rules, + + // Import plugin recommended rules + ...importPlugin.flatConfigs.recommended.rules, + + // RxJS recommended rules + ...rxjsX.configs.recommended.rules, + + // Custom project rules + "@typescript-eslint/explicit-member-accessibility": ["error", { accessibility: "no-public" }], + "@typescript-eslint/no-explicit-any": "off", // TODO: This should be re-enabled + "@typescript-eslint/no-misused-promises": ["error", { checksVoidReturn: false }], + "@typescript-eslint/no-this-alias": ["error", { allowedNames: ["self"] }], + "@typescript-eslint/no-unused-vars": ["error", { args: "none" }], + "no-console": "error", + "import/no-unresolved": "off", // TODO: Look into turning on once each package is an actual package. + "import/order": [ + "error", + { + alphabetize: { + order: "asc", + }, + "newlines-between": "always", + pathGroups: [ + { + pattern: "@/jslib/**/*", + group: "external", + position: "after", + }, + { + pattern: "@/src/**/*", + group: "parent", + position: "before", + }, + ], + pathGroupsExcludedImportTypes: ["builtin"], + }, + ], + "rxjs-angular-x/prefer-takeuntil": "error", + "rxjs-x/no-exposed-subjects": ["error", { allowProtected: true }], + "no-restricted-syntax": [ + "error", + { + message: "Calling `svgIcon` directly is not allowed", + selector: "CallExpression[callee.name='svgIcon']", + }, + { + message: "Accessing FormGroup using `get` is not allowed, use `.value` instead", + selector: + "ChainExpression[expression.object.callee.property.name='get'][expression.property.name='value']", + }, + ], + curly: ["error", "all"], + "import/namespace": ["off"], // This doesn't resolve namespace imports correctly, but TS will throw for this anyway + "no-restricted-imports": ["error", { patterns: ["src/**/*"] }], + }, + }, + + // Jest test files (includes any test-related files) + { + files: ["**/*.spec.ts", "**/test.setup.ts", "**/spec/**/*.ts", "**/utils/**/*fixtures*.ts"], + languageOptions: { + globals: { + ...globals.jest, + }, + }, + }, + + // Angular HTML templates + { + files: ["**/*.html"], + languageOptions: { + parser: angularParser, + }, + plugins: { + "@angular-eslint/template": angularEslint, + }, + rules: { + "@angular-eslint/template/button-has-type": "error", + }, + }, + + // Prettier config (must be last to override other configs) + prettierConfig, +]; diff --git a/jest.config.js b/jest.config.cjs similarity index 99% rename from jest.config.js rename to jest.config.cjs index 94b2cd7e..a7784446 100644 --- a/jest.config.js +++ b/jest.config.cjs @@ -26,7 +26,6 @@ module.exports = { modulePaths: [compilerOptions.baseUrl], moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: "/" }), setupFilesAfterEnv: ["/test.setup.ts"], - // Workaround for a memory leak that crashes tests in CI: // https://github.com/facebook/jest/issues/9430#issuecomment-1149882002 // Also anecdotally improves performance when run locally diff --git a/jslib/angular/src/components/modal/modal.ref.ts b/jslib/angular/src/components/modal/modal.ref.ts index a80acebb..76416a1f 100644 --- a/jslib/angular/src/components/modal/modal.ref.ts +++ b/jslib/angular/src/components/modal/modal.ref.ts @@ -1,5 +1,4 @@ -import { Observable, Subject } from "rxjs"; -import { first } from "rxjs/operators"; +import { lastValueFrom, Observable, Subject } from "rxjs"; export class ModalRef { onCreated: Observable; // Modal added to the DOM. @@ -45,6 +44,6 @@ export class ModalRef { } onClosedPromise(): Promise { - return this.onClosed.pipe(first()).toPromise(); + return lastValueFrom(this.onClosed); } } diff --git a/jslib/angular/src/directives/autofocus.directive.ts b/jslib/angular/src/directives/autofocus.directive.ts index 17d3c973..7f12db88 100644 --- a/jslib/angular/src/directives/autofocus.directive.ts +++ b/jslib/angular/src/directives/autofocus.directive.ts @@ -1,5 +1,5 @@ import { Directive, ElementRef, Input, NgZone } from "@angular/core"; -import { take } from "rxjs/operators"; +import { take } from "rxjs"; import { Utils } from "@/jslib/common/src/misc/utils"; diff --git a/jslib/angular/src/services/modal.service.ts b/jslib/angular/src/services/modal.service.ts index cde6d055..3da423e7 100644 --- a/jslib/angular/src/services/modal.service.ts +++ b/jslib/angular/src/services/modal.service.ts @@ -9,7 +9,7 @@ import { Type, ViewContainerRef, } from "@angular/core"; -import { first } from "rxjs/operators"; +import { first, firstValueFrom } from "rxjs"; import { DynamicModalComponent } from "../components/modal/dynamic-modal.component"; import { ModalInjector } from "../components/modal/modal-injector"; @@ -58,7 +58,7 @@ export class ModalService { viewContainerRef.insert(modalComponentRef.hostView); - await modalRef.onCreated.pipe(first()).toPromise(); + await firstValueFrom(modalRef.onCreated); return [modalRef, modalComponentRef.instance.componentRef.instance]; } diff --git a/jslib/common/spec/services/consoleLog.service.spec.ts b/jslib/common/spec/services/consoleLog.service.spec.ts index 59c08882..c07d9b19 100644 --- a/jslib/common/spec/services/consoleLog.service.spec.ts +++ b/jslib/common/spec/services/consoleLog.service.spec.ts @@ -8,15 +8,12 @@ declare let console: any; export function interceptConsole(interceptions: any): object { console = { log: function () { - // eslint-disable-next-line interceptions.log = arguments; }, warn: function () { - // eslint-disable-next-line interceptions.warn = arguments; }, error: function () { - // eslint-disable-next-line interceptions.error = arguments; }, }; diff --git a/jslib/common/src/misc/utils.ts b/jslib/common/src/misc/utils.ts index f65fe0d1..5016181a 100644 --- a/jslib/common/src/misc/utils.ts +++ b/jslib/common/src/misc/utils.ts @@ -1,9 +1,11 @@ /* eslint-disable no-useless-escape */ +import * as url from "url"; + import { I18nService } from "../abstractions/i18n.service"; import * as tldjs from "tldjs"; -const nodeURL = typeof window === "undefined" ? require("url") : null; +const nodeURL = typeof window === "undefined" ? url : null; export class Utils { static inited = false; @@ -247,7 +249,7 @@ export class Utils { const urlDomain = tldjs != null && tldjs.getDomain != null ? tldjs.getDomain(url.hostname) : null; return urlDomain != null ? urlDomain : url.hostname; - } catch (e) { + } catch { // Invalid domain, try another approach below. } } @@ -395,7 +397,7 @@ export class Utils { anchor.href = uriString; return anchor as any; } - } catch (e) { + } catch { // Ignore error } diff --git a/jslib/common/src/models/domain/encString.ts b/jslib/common/src/models/domain/encString.ts index 87bd035a..2e73808d 100644 --- a/jslib/common/src/models/domain/encString.ts +++ b/jslib/common/src/models/domain/encString.ts @@ -53,7 +53,7 @@ export class EncString { try { this.encryptionType = parseInt(headerPieces[0], null); encPieces = headerPieces[1].split("|"); - } catch (e) { + } catch { return; } } else { @@ -114,7 +114,7 @@ export class EncString { key = await cryptoService.getOrgKey(orgId); } this.decryptedValue = await cryptoService.decryptToUtf8(this, key); - } catch (e) { + } catch { this.decryptedValue = "[error: cannot decrypt]"; } return this.decryptedValue; diff --git a/jslib/common/src/models/request/identityToken/passwordTokenRequest.ts b/jslib/common/src/models/request/identityToken/passwordTokenRequest.ts index c40e053c..60dbcd22 100644 --- a/jslib/common/src/models/request/identityToken/passwordTokenRequest.ts +++ b/jslib/common/src/models/request/identityToken/passwordTokenRequest.ts @@ -1,5 +1,4 @@ import { ClientType } from "../../../enums/clientType"; -import { Utils } from "../../../misc/utils"; import { CaptchaProtectedRequest } from "../captchaProtectedRequest"; import { DeviceRequest } from "../deviceRequest"; @@ -30,5 +29,4 @@ export class PasswordTokenRequest extends TokenRequest implements CaptchaProtect return obj; } - } diff --git a/jslib/common/src/models/request/identityToken/tokenRequest.ts b/jslib/common/src/models/request/identityToken/tokenRequest.ts index 1dc1d4ce..7cf54e3a 100644 --- a/jslib/common/src/models/request/identityToken/tokenRequest.ts +++ b/jslib/common/src/models/request/identityToken/tokenRequest.ts @@ -12,7 +12,6 @@ export abstract class TokenRequest { this.device = device != null ? device : null; } - // eslint-disable-next-line alterIdentityTokenHeaders(headers: Headers) { // Implemented in subclass if required } diff --git a/jslib/common/src/services/crypto.service.ts b/jslib/common/src/services/crypto.service.ts index 28b13c5d..451721c5 100644 --- a/jslib/common/src/services/crypto.service.ts +++ b/jslib/common/src/services/crypto.service.ts @@ -335,9 +335,11 @@ export class CryptoService implements CryptoServiceAbstraction { } async clearStoredKey(keySuffix: KeySuffixOptions) { - keySuffix === KeySuffixOptions.Auto - ? await this.stateService.setCryptoMasterKeyAuto(null) - : await this.stateService.setCryptoMasterKeyBiometric(null); + if (keySuffix === KeySuffixOptions.Auto) { + await this.stateService.setCryptoMasterKeyAuto(null); + } else { + await this.stateService.setCryptoMasterKeyBiometric(null); + } } async clearKeyHash(userId?: string): Promise { @@ -717,7 +719,7 @@ export class CryptoService implements CryptoServiceAbstraction { const privateKey = await this.decryptToBytes(new EncString(encPrivateKey), encKey); await this.cryptoFunctionService.rsaExtractPublicKey(privateKey); - } catch (e) { + } catch { return false; } diff --git a/jslib/common/src/services/state.service.ts b/jslib/common/src/services/state.service.ts index ea9824fe..d1b40929 100644 --- a/jslib/common/src/services/state.service.ts +++ b/jslib/common/src/services/state.service.ts @@ -38,8 +38,7 @@ const partialKeys = { export class StateService< TGlobalState extends GlobalState = GlobalState, TAccount extends Account = Account, -> implements StateServiceAbstraction -{ +> implements StateServiceAbstraction { protected accountsSubject = new BehaviorSubject<{ [userId: string]: TAccount }>({}); accounts$ = this.accountsSubject.asObservable(); diff --git a/jslib/electron/src/tray.main.ts b/jslib/electron/src/tray.main.ts index 2854bc5b..62dec7de 100644 --- a/jslib/electron/src/tray.main.ts +++ b/jslib/electron/src/tray.main.ts @@ -1,6 +1,14 @@ import * as path from "path"; -import { app, BrowserWindow, Menu, MenuItemConstructorOptions, nativeImage, Tray } from "electron"; +import { + app, + BrowserWindow, + Menu, + MenuItemConstructorOptions, + NativeImage, + nativeImage, + Tray, +} from "electron"; import { I18nService } from "@/jslib/common/src/abstractions/i18n.service"; import { StateService } from "@/jslib/common/src/abstractions/state.service"; @@ -12,8 +20,8 @@ export class TrayMain { private appName: string; private tray: Tray; - private icon: string | Electron.NativeImage; - private pressedIcon: Electron.NativeImage; + private icon: string | NativeImage; + private pressedIcon: NativeImage; constructor( private windowMain: WindowMain, diff --git a/jslib/electron/src/window.main.ts b/jslib/electron/src/window.main.ts index 9592ff86..83445a0e 100644 --- a/jslib/electron/src/window.main.ts +++ b/jslib/electron/src/window.main.ts @@ -1,7 +1,7 @@ import * as path from "path"; import * as url from "url"; -import { app, BrowserWindow, screen } from "electron"; +import { app, BrowserWindow, Rectangle, screen } from "electron"; import { LogService } from "@/jslib/common/src/abstractions/log.service"; import { StateService } from "@/jslib/common/src/abstractions/state.service"; @@ -14,7 +14,7 @@ export class WindowMain { win: BrowserWindow; isQuitting = false; - private windowStateChangeTimer: NodeJS.Timeout; + private windowStateChangeTimer: ReturnType; private windowStates: { [key: string]: any } = {}; private enableAlwaysOnTop = false; @@ -37,7 +37,6 @@ export class WindowMain { app.quit(); return; } else { - // eslint-disable-next-line app.on("second-instance", (event, argv, workingDirectory) => { // Someone tried to run a second instance, we should focus our window. if (this.win != null) { @@ -241,7 +240,7 @@ export class WindowMain { const state = await this.stateService.getWindow(); const isValid = state != null && (this.stateHasBounds(state) || state.isMaximized); - let displayBounds: Electron.Rectangle = null; + let displayBounds: Rectangle = null; if (!isValid) { state.width = defaultWidth; state.height = defaultHeight; diff --git a/package-lock.json b/package-lock.json index 9d005b84..8a935bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,6 +59,7 @@ "@types/node-fetch": "2.6.12", "@types/node-forge": "1.3.11", "@types/proper-lockfile": "4.1.4", + "@types/semver": "7.7.1", "@types/tldjs": "2.3.4", "@typescript-eslint/eslint-plugin": "8.48.0", "@typescript-eslint/parser": "8.48.0", @@ -75,12 +76,12 @@ "electron-reload": "2.0.0-alpha.1", "electron-store": "8.2.0", "electron-updater": "6.6.2", - "eslint": "8.57.1", + "eslint": "9.39.1", "eslint-config-prettier": "10.1.5", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import": "2.32.0", - "eslint-plugin-rxjs": "5.0.3", - "eslint-plugin-rxjs-angular": "2.0.1", + "eslint-plugin-rxjs-angular-x": "0.1.0", + "eslint-plugin-rxjs-x": "0.8.3", "form-data": "4.0.4", "glob": "13.0.0", "html-loader": "5.1.0", @@ -3965,25 +3966,90 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -4048,13 +4114,40 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@fluffy-spoon/substitute": { @@ -4071,44 +4164,28 @@ "url": "https://opencollective.com/substitute-js#section-contribute" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -4125,13 +4202,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@inquirer/ansi": { "version": "1.0.2", @@ -8063,196 +8146,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/@typescript-eslint/parser": { "version": "8.48.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.48.0.tgz", @@ -8521,7 +8414,6 @@ "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.48.1", @@ -8546,7 +8438,6 @@ "integrity": "sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.48.1", "@typescript-eslint/types": "^8.48.1", @@ -8569,7 +8460,6 @@ "integrity": "sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "8.48.1", "@typescript-eslint/visitor-keys": "8.48.1" @@ -8588,7 +8478,6 @@ "integrity": "sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -8606,7 +8495,6 @@ "integrity": "sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/project-service": "8.48.1", "@typescript-eslint/tsconfig-utils": "8.48.1", @@ -8635,7 +8523,6 @@ "integrity": "sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "8.48.1", "eslint-visitor-keys": "^4.2.1" @@ -8654,7 +8541,6 @@ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -8668,7 +8554,6 @@ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8685,7 +8570,6 @@ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" @@ -8742,13 +8626,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", @@ -10528,18 +10405,6 @@ "node": ">=14.0.0" } }, - "node_modules/bent": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", - "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bytesish": "^0.4.1", - "caseless": "~0.12.0", - "is-stream": "^2.0.0" - } - }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -10917,13 +10782,6 @@ "node": ">= 0.8" } }, - "node_modules/bytesish": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", - "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==", - "dev": true, - "license": "(Apache-2.0 AND MIT)" - }, "node_modules/cacache": { "version": "19.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", @@ -11194,13 +11052,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -12750,19 +12601,6 @@ "node": "*" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dmg-builder": { "version": "24.13.3", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", @@ -12875,19 +12713,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -13846,60 +13671,63 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { @@ -13918,22 +13746,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-etc": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-etc/-/eslint-etc-5.2.1.tgz", - "integrity": "sha512-lFJBSiIURdqQKq9xJhvSJFyPA+VeTh5xvk24e8pxVL7bwLBtGF60C/KRkLTMrvCZ6DA3kbPuYhLWY0TZMlqTsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0", - "tsutils": "^3.17.1", - "tsutils-etc": "^1.4.1" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "typescript": ">=4.0.0" - } - }, "node_modules/eslint-import-context": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz", @@ -14135,44 +13947,58 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-rxjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-rxjs/-/eslint-plugin-rxjs-5.0.3.tgz", - "integrity": "sha512-fcVkqLmYLRfRp+ShafjpUKuaZ+cw/sXAvM5dfSxiEr7M28QZ/NY7vaOr09FB4rSaZsQyLBnNPh5SL+4EgKjh8Q==", + "node_modules/eslint-plugin-rxjs-angular-x": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-rxjs-angular-x/-/eslint-plugin-rxjs-angular-x-0.1.0.tgz", + "integrity": "sha512-WtDAWqGhi3v6aISxYUMPk3az89GKN469+bZGpoCy31oUEpvLJSi+oCQZNTjLVfIj/K5Ihh7xtJemldnq6ZMgAQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0", + "@typescript-eslint/utils": "^8.19.1", "common-tags": "^1.8.0", - "decamelize": "^5.0.0", - "eslint-etc": "^5.1.0", - "requireindex": "~1.2.0", - "rxjs-report-usage": "^1.0.4", - "tslib": "^2.0.0", - "tsutils": "^3.0.0", - "tsutils-etc": "^1.4.1" + "ts-api-utils": "^2.0.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^8.0.0", - "typescript": ">=4.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "rxjs": ">=7.2.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + } } }, - "node_modules/eslint-plugin-rxjs-angular": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-rxjs-angular/-/eslint-plugin-rxjs-angular-2.0.1.tgz", - "integrity": "sha512-HJ/JHhjDJKyFUmM8o7rS91WNkNv7W7Z/okR5X3hqG7tKVMLOJi4T63Aa74ECuCdowmdfW75p2RrW4R8WeoZIKQ==", + "node_modules/eslint-plugin-rxjs-x": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-rxjs-x/-/eslint-plugin-rxjs-x-0.8.3.tgz", + "integrity": "sha512-zbORImnBYgBQ/DJ6yGVIpBLXwoeD5HU1MGfeja+xhU2Lr6+1SQR+eOvTpCaBZTAwmt2G7gb7GFGXQdl7Tz3+jA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0", + "@typescript-eslint/scope-manager": "^8.19.1", + "@typescript-eslint/utils": "^8.19.1", "common-tags": "^1.8.0", - "eslint-etc": "^5.0.0", - "requireindex": "~1.2.0", - "tslib": "^2.0.0" + "decamelize": "^5.0.1", + "ts-api-utils": "^2.0.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >= 21.1.0" }, "peerDependencies": { - "eslint": "^8.0.0", - "typescript": ">=4.0.0" + "eslint": "^8.57.0 || ^9.0.0", + "rxjs": ">=7.2.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "rxjs": { + "optional": true + } } }, "node_modules/eslint-scope": { @@ -14234,9 +14060,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14244,7 +14070,20 @@ "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -14281,18 +14120,31 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -14777,16 +14629,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/filelist": { @@ -14857,81 +14709,17 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { @@ -15488,29 +15276,13 @@ } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17095,16 +16867,6 @@ "node": ">=6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", @@ -21712,16 +21474,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -22886,16 +22638,6 @@ "node": ">=0.10.0" } }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.5" - } - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -23315,71 +23057,6 @@ "tslib": "^2.1.0" } }, - "node_modules/rxjs-report-usage": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/rxjs-report-usage/-/rxjs-report-usage-1.0.6.tgz", - "integrity": "sha512-omv1DIv5z1kV+zDAEjaDjWSkx8w5TbFp5NZoPwUipwzYVcor/4So9ZU3bUyQ1c8lxY5Q0Es/ztWW7PGjY7to0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.10.3", - "@babel/traverse": "^7.10.3", - "@babel/types": "^7.10.3", - "bent": "~7.3.6", - "chalk": "~4.1.0", - "glob": "~7.2.0", - "prompts": "~2.4.2" - }, - "bin": { - "rxjs-report-usage": "bin/rxjs-report-usage" - } - }, - "node_modules/rxjs-report-usage/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rxjs-report-usage/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rxjs-report-usage/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -25051,13 +24728,6 @@ "node": "*" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/thingies": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", @@ -25479,100 +25149,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils-etc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/tsutils-etc/-/tsutils-etc-1.4.2.tgz", - "integrity": "sha512-2Dn5SxTDOu6YWDNKcx1xu2YUy6PUeKrWZB/x2cQ8vY2+iz3JRembKn/iZ0JLT1ZudGNwQQvtFX9AwvRHbXuPUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs": "^17.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "ts-flags": "bin/ts-flags", - "ts-kind": "bin/ts-kind" - }, - "peerDependencies": { - "tsutils": "^3.0.0", - "typescript": ">=4.0.0" - } - }, - "node_modules/tsutils-etc/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tsutils-etc/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/tsutils-etc/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/tuf-js": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz", diff --git a/package.json b/package.json index 9fd19008..4a8bd902 100644 --- a/package.json +++ b/package.json @@ -31,14 +31,14 @@ "lint": "eslint . && prettier --check .", "lint:fix": "eslint . --fix", "build": "concurrently -n Main,Rend -c yellow,cyan \"npm run build:main\" \"npm run build:renderer\"", - "build:main": "webpack --config webpack.main.js", - "build:renderer": "webpack --config webpack.renderer.js", - "build:renderer:watch": "webpack --config webpack.renderer.js --watch", + "build:main": "webpack --config webpack.main.cjs", + "build:renderer": "webpack --config webpack.renderer.cjs", + "build:renderer:watch": "webpack --config webpack.renderer.cjs --watch", "build:dist": "npm run reset && npm run rebuild && npm run build", - "build:cli": "webpack --config webpack.cli.js", - "build:cli:watch": "webpack --config webpack.cli.js --watch", - "build:cli:prod": "cross-env NODE_ENV=production webpack --config webpack.cli.js", - "build:cli:prod:watch": "cross-env NODE_ENV=production webpack --config webpack.cli.js --watch", + "build:cli": "webpack --config webpack.cli.cjs", + "build:cli:watch": "webpack --config webpack.cli.cjs --watch", + "build:cli:prod": "cross-env NODE_ENV=production webpack --config webpack.cli.cjs", + "build:cli:prod:watch": "cross-env NODE_ENV=production webpack --config webpack.cli.cjs --watch", "electron": "npm run build:main && concurrently -k -n Main,Rend -c yellow,cyan \"electron --inspect=5858 ./build --watch\" \"npm run build:renderer:watch\"", "electron:ignore": "npm run build:main && concurrently -k -n Main,Rend -c yellow,cyan \"electron --inspect=5858 --ignore-certificate-errors ./build --watch\" \"npm run build:renderer:watch\"", "clean:dist": "rimraf --glob ./dist/*", @@ -89,6 +89,7 @@ "@types/node-fetch": "2.6.12", "@types/node-forge": "1.3.11", "@types/proper-lockfile": "4.1.4", + "@types/semver": "7.7.1", "@types/tldjs": "2.3.4", "@typescript-eslint/eslint-plugin": "8.48.0", "@typescript-eslint/parser": "8.48.0", @@ -105,12 +106,12 @@ "electron-reload": "2.0.0-alpha.1", "electron-store": "8.2.0", "electron-updater": "6.6.2", - "eslint": "8.57.1", + "eslint": "9.39.1", "eslint-config-prettier": "10.1.5", "eslint-import-resolver-typescript": "4.4.4", "eslint-plugin-import": "2.32.0", - "eslint-plugin-rxjs": "5.0.3", - "eslint-plugin-rxjs-angular": "2.0.1", + "eslint-plugin-rxjs-angular-x": "0.1.0", + "eslint-plugin-rxjs-x": "0.8.3", "form-data": "4.0.4", "glob": "13.0.0", "html-loader": "5.1.0", diff --git a/src/app/accounts/apiKey.component.ts b/src/app/accounts/apiKey.component.ts index 6a55dcdc..345971e3 100644 --- a/src/app/accounts/apiKey.component.ts +++ b/src/app/accounts/apiKey.component.ts @@ -23,7 +23,7 @@ import { EnvironmentComponent } from "./environment.component"; // The only subscription in this component is closed from a child component, confusing eslint. // https://github.com/cartant/eslint-plugin-rxjs-angular/blob/main/docs/rules/prefer-takeuntil.md // -// eslint-disable-next-line rxjs-angular/prefer-takeuntil +// eslint-disable-next-line rxjs-angular-x/prefer-takeuntil export class ApiKeyComponent { @ViewChild("environment", { read: ViewContainerRef, static: true }) environmentModal: ViewContainerRef; @@ -100,7 +100,7 @@ export class ApiKeyComponent { this.environmentModal, ); - // eslint-disable-next-line rxjs-angular/prefer-takeuntil + // eslint-disable-next-line rxjs-angular-x/prefer-takeuntil childComponent.onSaved.pipe(takeUntil(modalRef.onClosed)).subscribe(() => { modalRef.close(); }); diff --git a/src/app/main.ts b/src/app/main.ts index 985222bb..da1cc2a3 100644 --- a/src/app/main.ts +++ b/src/app/main.ts @@ -3,8 +3,7 @@ import { platformBrowserDynamic } from "@angular/platform-browser-dynamic"; import { isDev } from "@/jslib/electron/src/utils"; -// tslint:disable-next-line -require("../scss/styles.scss"); +import "../scss/styles.scss"; import { AppModule } from "./app.module"; diff --git a/src/main/messaging.main.ts b/src/main/messaging.main.ts index 59c75dc6..f3dee4d4 100644 --- a/src/main/messaging.main.ts +++ b/src/main/messaging.main.ts @@ -9,7 +9,7 @@ import { MenuMain } from "./menu.main"; const SyncCheckInterval = 60 * 1000; // 1 minute export class MessagingMain { - private syncTimeout: NodeJS.Timeout; + private syncTimeout: ReturnType; constructor( private windowMain: WindowMain, diff --git a/src/services/directory-services/entra-id-directory.service.ts b/src/services/directory-services/entra-id-directory.service.ts index d76f57a5..1e828935 100644 --- a/src/services/directory-services/entra-id-directory.service.ts +++ b/src/services/directory-services/entra-id-directory.service.ts @@ -132,7 +132,7 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi } const setFilter = this.createCustomUserSet(this.syncConfig.userFilter); - // eslint-disable-next-line + while (true) { const users: graphType.User[] = res.value; if (users != null) { @@ -211,7 +211,7 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi let auMembers = await this.client .api(`${this.getGraphApiEndpoint()}/v1.0/directory/administrativeUnits/${p}/members`) .get(); - // eslint-disable-next-line + while (true) { for (const auMember of auMembers.value) { const groupId = auMember.id; @@ -328,7 +328,7 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi const entries: GroupEntry[] = []; const groupsReq = this.client.api("/groups"); let res = await groupsReq.get(); - // eslint-disable-next-line + while (true) { const groups: graphType.Group[] = res.value; if (groups != null) { @@ -421,7 +421,7 @@ export class EntraIdDirectoryService extends BaseDirectoryService implements IDi const memReq = this.client.api("/groups/" + group.id + "/members"); let memRes = await memReq.get(); - // eslint-disable-next-line + while (true) { const members: any = memRes.value; if (members != null) { diff --git a/src/services/directory-services/gsuite-directory.service.ts b/src/services/directory-services/gsuite-directory.service.ts index 95714fb4..4e8be9a5 100644 --- a/src/services/directory-services/gsuite-directory.service.ts +++ b/src/services/directory-services/gsuite-directory.service.ts @@ -71,7 +71,7 @@ export class GSuiteDirectoryService extends BaseDirectoryService implements IDir let nextPageToken: string = null; const filter = this.createCustomSet(this.syncConfig.userFilter); - // eslint-disable-next-line + while (true) { this.logService.info("Querying users - nextPageToken:" + nextPageToken); const p = Object.assign({ query: query, pageToken: nextPageToken }, this.authParams); @@ -99,7 +99,7 @@ export class GSuiteDirectoryService extends BaseDirectoryService implements IDir } nextPageToken = null; - // eslint-disable-next-line + while (true) { this.logService.info("Querying deleted users - nextPageToken:" + nextPageToken); const p = Object.assign( @@ -154,7 +154,6 @@ export class GSuiteDirectoryService extends BaseDirectoryService implements IDir const query = this.createDirectoryQuery(this.syncConfig.groupFilter); let nextPageToken: string = null; - // eslint-disable-next-line while (true) { this.logService.info("Querying groups - nextPageToken:" + nextPageToken); let p = null; @@ -194,7 +193,6 @@ export class GSuiteDirectoryService extends BaseDirectoryService implements IDir entry.externalId = group.id; entry.name = group.name; - // eslint-disable-next-line while (true) { const p = Object.assign({ groupKey: group.id, pageToken: nextPageToken }, this.authParams); const memRes = await this.service.members.list(p); diff --git a/src/services/sync.service.integration.spec.ts b/src/services/sync.service.integration.spec.ts index 241d5f0b..fa7f0f97 100644 --- a/src/services/sync.service.integration.spec.ts +++ b/src/services/sync.service.integration.spec.ts @@ -116,6 +116,7 @@ describe("SyncService", () => { stateService.getLastSyncHash.mockResolvedValue("unique hash"); // @ts-expect-error This is a workaround to make the batchsize smaller to trigger the batching logic since its a const. + // eslint-disable-next-line no-import-assign constants.batchSize = 4; const syncResult = await syncService.sync(false, false); @@ -130,6 +131,7 @@ describe("SyncService", () => { expect(apiService.postPublicImportDirectory).toHaveBeenCalledTimes(7); // @ts-expect-error Reset batch size to original state. + // eslint-disable-next-line no-import-assign constants.batchSize = originalBatchSize; }); }); diff --git a/src/services/sync.service.spec.ts b/src/services/sync.service.spec.ts index 46a111db..3cff089c 100644 --- a/src/services/sync.service.spec.ts +++ b/src/services/sync.service.spec.ts @@ -97,6 +97,7 @@ describe("SyncService", () => { stateService.getLastSyncHash.mockResolvedValue("unique hash"); // @ts-expect-error This is a workaround to make the batchsize smaller to trigger the batching logic since its a const. + // eslint-disable-next-line no-import-assign constants.batchSize = 4; const mockRequests = new Array(6).fill({ @@ -119,6 +120,7 @@ describe("SyncService", () => { expect(apiService.postPublicImportDirectory).toHaveBeenCalledWith(mockRequests[5]); // @ts-expect-error Reset batch size back to original value. + // eslint-disable-next-line no-import-assign constants.batchSize = originalBatchSize; }); diff --git a/webpack.cli.js b/webpack.cli.cjs similarity index 100% rename from webpack.cli.js rename to webpack.cli.cjs diff --git a/webpack.main.js b/webpack.main.cjs similarity index 100% rename from webpack.main.js rename to webpack.main.cjs diff --git a/webpack.renderer.js b/webpack.renderer.cjs similarity index 100% rename from webpack.renderer.js rename to webpack.renderer.cjs