diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 5d3e2fd6e..000000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -docs/**/*.md diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 4157294f4..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "root": true, - "ignorePatterns": [ - "app-builds/**/*", - "dist/**", - "node_modules/**/*", - "src/app/t.const.ts", - "src/assets/bundled-plugins/**/*", - "src/app/config/env.generated.ts" - ], - "overrides": [ - { - "files": ["*.ts"], - "parser": "@typescript-eslint/parser", - "excludedFiles": [], - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module", - "createDefaultProgram": true - }, - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@angular-eslint/recommended", - "plugin:prettier/recommended" - ], - "plugins": ["@typescript-eslint", "prettier", "prefer-arrow"], - "rules": { - "@typescript-eslint/no-explicit-any": 0, - "@typescript-eslint/ban-ts-comment": 0, - "@typescript-eslint/no-empty-function": 0, - "@typescript-eslint/explicit-module-boundary-types": 0, - "prettier/prettier": "error", - "@angular-eslint/component-selector": ["off"], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "args": "none" - } - ], - "@typescript-eslint/explicit-function-return-type": [ - "error", - { - "allowExpressions": true, - "allowTypedFunctionExpressions": true, - "allowHigherOrderFunctions": true, - "allowDirectConstAssertionInArrowFunctions": true, - "allowConciseArrowFunctionExpressionsStartingWithVoid": true - } - ], - "@typescript-eslint/explicit-member-accessibility": [ - "off", - { - "accessibility": "explicit" - } - ], - "arrow-parens": ["off", "always"], - "import/order": "off", - "@typescript-eslint/member-ordering": "off", - "@typescript-eslint/no-inferrable-types": "off", - "no-underscore-dangle": "off", - "arrow-body-style": "off", - "@angular-eslint/no-input-rename": "off", - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase", "snake_case", "UPPER_CASE", "PascalCase"], - "leadingUnderscore": "allowSingleOrDouble", - "trailingUnderscore": "allow", - "filter": { - "regex": "(should)|@tags", - "match": false - } - }, - { - "selector": "variable", - "format": ["camelCase", "snake_case", "UPPER_CASE", "PascalCase"], - "leadingUnderscore": "allowSingleOrDouble", - "trailingUnderscore": "allow" - }, - { - "selector": "enum", - "format": ["PascalCase", "UPPER_CASE"] - }, - { - "selector": "typeLike", - "format": ["PascalCase"] - } - ], - "prefer-const": "error", - "@typescript-eslint/no-unused-expressions": "error", - "@typescript-eslint/no-empty-interface": "error", - "max-len": [ - "error", - { - "ignorePattern": "^import \\{.+;$", - "ignoreRegExpLiterals": true, - "ignoreStrings": true, - "ignoreUrls": true, - "code": 150 - } - ], - "id-blacklist": "error", - "@typescript-eslint/member-delimiter-style": "error", - "no-shadow": "off", - "@typescript-eslint/no-shadow": ["error"], - "comma-dangle": ["error", "always-multiline"], - "no-mixed-operators": "error", - "prefer-arrow/prefer-arrow-functions": "error", - "@angular-eslint/directive-selector": [ - "error", - { - "type": "attribute", - "prefix": "", - "style": "camelCase" - } - ], - "@typescript-eslint/ban-types": "error" - } - }, - { - "files": ["*.html"], - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@angular-eslint/template/recommended", - "prettier" - ], - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "processor": "@angular-eslint/template/extract-inline-html", - "plugins": ["prettier"], - "rules": { - "@angular-eslint/template/no-negated-async": "off", - "prettier/prettier": "error" - } - } - ] -} diff --git a/electron/preload.ts b/electron/preload.ts index 8d7650084..76fb91e0a 100644 --- a/electron/preload.ts +++ b/electron/preload.ts @@ -16,7 +16,6 @@ const _invoke: (channel: IPCEventValue, ...args: unknown[]) => Promise ...args ) => ipcRenderer.invoke(channel, ...args); -// eslint-disable-next-line @typescript-eslint/no-unused-vars const ea: ElectronAPI = { on: ( channel: string, diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..ad8a1c730 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,127 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const angular = require('angular-eslint'); +const prettierRecommended = require('eslint-plugin-prettier/recommended'); +const preferArrow = require('eslint-plugin-prefer-arrow'); + +module.exports = tseslint.config( + // Global ignores + { + ignores: [ + 'app-builds/**/*', + 'dist/**', + 'node_modules/**/*', + 'src/app/t.const.ts', + 'src/assets/bundled-plugins/**/*', + 'src/app/config/env.generated.ts', + '.tmp/**/*', + 'packages/**/*', + ], + }, + // TypeScript files + { + files: ['**/*.ts'], + extends: [ + ...tseslint.configs.recommended, + ...angular.configs.tsRecommended, + prettierRecommended, + ], + processor: angular.processInlineTemplates, + plugins: { + 'prefer-arrow': preferArrow, + }, + languageOptions: { + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module', + }, + }, + rules: { + // Disabled rules + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@angular-eslint/component-selector': 'off', + '@angular-eslint/no-input-rename': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + 'no-underscore-dangle': 'off', + 'arrow-body-style': 'off', + '@typescript-eslint/member-ordering': 'off', + 'import/order': 'off', + 'arrow-parens': 'off', + '@typescript-eslint/explicit-member-accessibility': 'off', + + // Enabled rules + 'prettier/prettier': 'error', + '@typescript-eslint/no-unused-vars': [ + 'error', + { args: 'none', caughtErrors: 'none' }, + ], + '@typescript-eslint/explicit-function-return-type': [ + 'error', + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: true, + allowDirectConstAssertionInArrowFunctions: true, + allowConciseArrowFunctionExpressionsStartingWithVoid: true, + }, + ], + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'default', + format: ['camelCase', 'snake_case', 'UPPER_CASE', 'PascalCase'], + leadingUnderscore: 'allowSingleOrDouble', + trailingUnderscore: 'allow', + filter: { regex: '(should)|@tags', match: false }, + }, + { + selector: 'variable', + format: ['camelCase', 'snake_case', 'UPPER_CASE', 'PascalCase'], + leadingUnderscore: 'allowSingleOrDouble', + trailingUnderscore: 'allow', + }, + { selector: 'enum', format: ['PascalCase', 'UPPER_CASE'] }, + { selector: 'typeLike', format: ['PascalCase'] }, + ], + 'prefer-const': 'error', + '@typescript-eslint/no-unused-expressions': 'error', + '@typescript-eslint/no-empty-object-type': 'error', + 'max-len': [ + 'error', + { + ignorePattern: '^import \\{.+;$', + ignoreRegExpLiterals: true, + ignoreStrings: true, + ignoreUrls: true, + code: 150, + }, + ], + 'id-blacklist': 'error', + // @typescript-eslint/member-delimiter-style removed in v8 - Prettier handles this + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'comma-dangle': ['error', 'always-multiline'], + 'no-mixed-operators': 'error', + 'prefer-arrow/prefer-arrow-functions': 'error', + '@angular-eslint/directive-selector': [ + 'error', + { type: 'attribute', prefix: '', style: 'camelCase' }, + ], + // @typescript-eslint/ban-types replaced by specific rules in v8 + '@typescript-eslint/no-unsafe-function-type': 'error', + '@typescript-eslint/no-wrapper-object-types': 'error', + }, + }, + // HTML files + { + files: ['**/*.html'], + extends: [...angular.configs.templateRecommended, prettierRecommended], + rules: { + '@angular-eslint/template/no-negated-async': 'off', + 'prettier/prettier': 'error', + }, + }, +); diff --git a/package-lock.json b/package-lock.json index d59e359a9..1135df7b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,6 +54,7 @@ "@csstools/stylelint-formatter-github": "^1.0.0", "@dotenv-run/cli": "^1.3.6", "@electron/notarize": "^3.1.1", + "@eslint/js": "^9.39.2", "@fontsource/open-sans": "^5.2.6", "@nextcloud/cdav-library": "^1.5.3", "@ngrx/effects": "^21.0.1", @@ -75,10 +76,9 @@ "@types/node": "^22.19.5", "@types/node-fetch": "^2.6.6", "@types/object-path": "^0.11.4", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "7.18.0", "@typescript-eslint/types": "^8.17.0", "@typescript-eslint/utils": "^8.51.0", + "angular-eslint": "^21.1.0", "angular-material-css-vars": "^9.1.1", "baseline-browser-mapping": "^2.9.11", "canvas-confetti": "^1.9.4", @@ -92,7 +92,7 @@ "detect-it": "^4.0.1", "electron": "37.10.3", "electron-builder": "^26.3.3", - "eslint": "^8.57.1", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.5", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsdoc": "61.4.1", @@ -135,6 +135,7 @@ "ts-patch": "^3.3.0", "tslib": "^2.7.0", "typescript": "~5.9.3", + "typescript-eslint": "^8.52.0", "typia": "^11.0.0" }, "optionalDependencies": { @@ -516,34 +517,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", @@ -1392,23 +1365,6 @@ "node": ">=10" } }, - "node_modules/@angular-devkit/build-angular/node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/webpack": { "version": "5.104.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.0.tgz", @@ -1494,7 +1450,7 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "node_modules/@angular-devkit/core": { "version": "21.0.5", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", @@ -1541,34 +1497,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-devkit/schematics/node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1750,34 +1678,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-eslint/bundled-angular-compiler": { "version": "21.1.0", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.1.0.tgz", @@ -1853,34 +1753,6 @@ "@angular/cli": ">= 21.0.0 < 22.0.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular-eslint/schematics/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -2056,34 +1928,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/build/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular/build/node_modules/@babel/core": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", @@ -2660,23 +2504,6 @@ "node": ">=10" } }, - "node_modules/@angular/build/node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, "node_modules/@angular/build/node_modules/vite": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", @@ -3304,34 +3131,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@angular/cli/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -6957,7 +6756,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6974,30 +6775,99 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { "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", + "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" @@ -7005,6 +6875,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -7030,14 +6902,13 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", + "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" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7045,6 +6916,8 @@ }, "node_modules/@eslint/eslintrc/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": { @@ -7053,11 +6926,15 @@ }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/@eslint/eslintrc/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": { @@ -7067,23 +6944,41 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { - "version": "8.57.1", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "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/@floating-ui/core": { @@ -7144,39 +7039,28 @@ "hono": "^4" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", + "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", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -7191,10 +7075,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", + "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/@hutson/parse-repository-url": { "version": "5.0.0", @@ -10439,34 +10332,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "21.0.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.0.5.tgz", - "integrity": "sha512-STDOtPbd8vePqyneQaLR8c9hnu7BieU7aPG5Icgl0pevv7EfCmwZUTqvK5nCpLk0tVFo6D1WHwIDZ3fnyvFW1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.17.1", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.3.1", - "picomatch": "4.0.3", - "rxjs": "7.8.2", - "source-map": "0.7.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^4.0.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, "node_modules/@sideway/address": { "version": "4.1.5", "dev": true, @@ -11420,128 +11285,16 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/project-service": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", - "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.51.0", - "@typescript-eslint/types": "^8.51.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11554,38 +11307,28 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", + "node_modules/@typescript-eslint/project-service/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "ms": "^2.1.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": ">=6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", - "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", "dev": true, "license": "MIT", "engines": { @@ -11600,68 +11343,137 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", + "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" }, "peerDependenciesMeta": { - "typescript": { + "supports-color": { "optional": true } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.18.0", + "node_modules/@typescript-eslint/type-utils/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": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.18.0", + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" }, "peerDependencies": { - "eslint": "^8.56.0" + "typescript": ">=4.8.4" } }, "node_modules/@typescript-eslint/types": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", - "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", "dev": true, "license": "MIT", "engines": { @@ -11672,56 +11484,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", - "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/typescript-estree": "8.51.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11736,14 +11509,14 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", - "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0" + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11754,21 +11527,21 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", - "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.51.0", - "@typescript-eslint/tsconfig-utils": "8.51.0", - "@typescript-eslint/types": "8.51.0", - "@typescript-eslint/visitor-keys": "8.51.0", - "debug": "^4.3.4", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.2.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11782,13 +11555,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", - "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/types": "8.52.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -11799,6 +11572,24 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/utils/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -11812,27 +11603,23 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=10" } }, "node_modules/@typescript-eslint/utils/node_modules/ts-api-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", - "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -11842,39 +11629,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", @@ -12270,6 +12024,30 @@ "node": ">= 14.0.0" } }, + "node_modules/angular-eslint": { + "version": "21.1.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.1.0.tgz", + "integrity": "sha512-qXpIEBNYpfgpBaFblnyFegVSQjWCVUdCXTHvMcvtNtmMgtPwIDKvG8wuJo5BbQ/MNt2d8npmnRUaS2ddzdCzww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/builder": "21.1.0", + "@angular-eslint/eslint-plugin": "21.1.0", + "@angular-eslint/eslint-plugin-template": "21.1.0", + "@angular-eslint/schematics": "21.1.0", + "@angular-eslint/template-parser": "21.1.0", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" + }, + "peerDependencies": { + "@angular/cli": ">= 21.0.0 < 22.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" + } + }, "node_modules/angular-material-css-vars": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/angular-material-css-vars/-/angular-material-css-vars-9.1.1.tgz", @@ -15690,17 +15468,6 @@ "node": ">=6" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-serialize": { "version": "2.2.1", "dev": true, @@ -16540,57 +16307,63 @@ } }, "node_modules/eslint": { - "version": "8.57.1", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "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.2", + "@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": { @@ -16777,37 +16550,6 @@ } } }, - "node_modules/eslint-plugin-jsdoc/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" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/espree": { - "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.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint-plugin-jsdoc/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -16913,7 +16655,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", + "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": { @@ -16921,24 +16665,23 @@ "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/globals": { - "version": "13.24.0", + "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": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ignore": { @@ -16965,28 +16708,32 @@ "node": "*" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "9.6.1", + "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" @@ -17616,14 +17363,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", + "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/file-saver": { @@ -17749,71 +17498,17 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", + "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", - "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", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "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": { @@ -18377,11 +18072,6 @@ "version": "4.2.11", "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, "node_modules/hachure-fill": { "version": "0.5.2", "dev": true, @@ -19435,14 +19125,6 @@ "node": ">=8" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "license": "MIT", @@ -26606,11 +26288,6 @@ "dev": true, "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/thingies": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", @@ -26679,14 +26356,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -26786,17 +26463,6 @@ "utf8-byte-length": "^1.0.1" } }, - "node_modules/ts-api-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, "node_modules/ts-dedent": { "version": "2.2.0", "dev": true, @@ -27098,6 +26764,205 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", + "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", + "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/type-utils": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.52.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/typescript-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" + } + }, + "node_modules/typescript-eslint/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typescript-eslint/node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/typia": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/typia/-/typia-11.0.0.tgz", diff --git a/package.json b/package.json index f1cda5a3c..1a0ea4735 100644 --- a/package.json +++ b/package.json @@ -173,6 +173,7 @@ "@csstools/stylelint-formatter-github": "^1.0.0", "@dotenv-run/cli": "^1.3.6", "@electron/notarize": "^3.1.1", + "@eslint/js": "^9.39.2", "@fontsource/open-sans": "^5.2.6", "@nextcloud/cdav-library": "^1.5.3", "@ngrx/effects": "^21.0.1", @@ -194,10 +195,9 @@ "@types/node": "^22.19.5", "@types/node-fetch": "^2.6.6", "@types/object-path": "^0.11.4", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "7.18.0", "@typescript-eslint/types": "^8.17.0", "@typescript-eslint/utils": "^8.51.0", + "angular-eslint": "^21.1.0", "angular-material-css-vars": "^9.1.1", "baseline-browser-mapping": "^2.9.11", "canvas-confetti": "^1.9.4", @@ -211,7 +211,7 @@ "detect-it": "^4.0.1", "electron": "37.10.3", "electron-builder": "^26.3.3", - "eslint": "^8.57.1", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.5", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsdoc": "61.4.1", @@ -254,6 +254,7 @@ "ts-patch": "^3.3.0", "tslib": "^2.7.0", "typescript": "~5.9.3", + "typescript-eslint": "^8.52.0", "typia": "^11.0.0" }, "overrides": { diff --git a/packages/plugin-dev/automations/.eslintrc.json b/packages/plugin-dev/automations/.eslintrc.json deleted file mode 100644 index 080adb824..000000000 --- a/packages/plugin-dev/automations/.eslintrc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "plugins": ["solid", "@typescript-eslint", "prettier"], - "extends": [ - "eslint:recommended", - "plugin:solid/typescript", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "prettier/prettier": "error", - "@typescript-eslint/no-explicit-any": "warn" - }, - "ignorePatterns": ["dist", "node_modules"] -} diff --git a/packages/plugin-dev/automations/eslint.config.js b/packages/plugin-dev/automations/eslint.config.js new file mode 100644 index 000000000..600cfd413 --- /dev/null +++ b/packages/plugin-dev/automations/eslint.config.js @@ -0,0 +1,16 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const solid = require('eslint-plugin-solid/configs/typescript'); +const prettierRecommended = require('eslint-plugin-prettier/recommended'); + +module.exports = tseslint.config( + { ignores: ['dist', 'node_modules'] }, + { + files: ['**/*.ts', '**/*.tsx'], + extends: [...tseslint.configs.recommended, solid, prettierRecommended], + rules: { + 'prettier/prettier': 'error', + '@typescript-eslint/no-explicit-any': 'warn', + }, + }, +); diff --git a/packages/plugin-dev/boilerplate-solid-js/.eslintrc.json b/packages/plugin-dev/boilerplate-solid-js/.eslintrc.json deleted file mode 100644 index 080adb824..000000000 --- a/packages/plugin-dev/boilerplate-solid-js/.eslintrc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "plugins": ["solid", "@typescript-eslint", "prettier"], - "extends": [ - "eslint:recommended", - "plugin:solid/typescript", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "rules": { - "prettier/prettier": "error", - "@typescript-eslint/no-explicit-any": "warn" - }, - "ignorePatterns": ["dist", "node_modules"] -} diff --git a/packages/plugin-dev/boilerplate-solid-js/eslint.config.js b/packages/plugin-dev/boilerplate-solid-js/eslint.config.js new file mode 100644 index 000000000..600cfd413 --- /dev/null +++ b/packages/plugin-dev/boilerplate-solid-js/eslint.config.js @@ -0,0 +1,16 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const solid = require('eslint-plugin-solid/configs/typescript'); +const prettierRecommended = require('eslint-plugin-prettier/recommended'); + +module.exports = tseslint.config( + { ignores: ['dist', 'node_modules'] }, + { + files: ['**/*.ts', '**/*.tsx'], + extends: [...tseslint.configs.recommended, solid, prettierRecommended], + rules: { + 'prettier/prettier': 'error', + '@typescript-eslint/no-explicit-any': 'warn', + }, + }, +); diff --git a/packages/plugin-dev/sync-md/.eslintrc.json b/packages/plugin-dev/sync-md/.eslintrc.json deleted file mode 100644 index 731a9443b..000000000 --- a/packages/plugin-dev/sync-md/.eslintrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../../../.eslintrc.json", - "parserOptions": { - "project": "./tsconfig.json" - } -} diff --git a/packages/plugin-dev/sync-md/eslint.config.js b/packages/plugin-dev/sync-md/eslint.config.js new file mode 100644 index 000000000..0e37eff3a --- /dev/null +++ b/packages/plugin-dev/sync-md/eslint.config.js @@ -0,0 +1,11 @@ +// @ts-check +const tseslint = require('typescript-eslint'); +const rootConfig = require('../../../eslint.config.js'); + +module.exports = tseslint.config(...rootConfig, { + languageOptions: { + parserOptions: { + project: './tsconfig.json', + }, + }, +}); diff --git a/src/app/core/error-handler/global-error-handler.class.ts b/src/app/core/error-handler/global-error-handler.class.ts index ef6901d96..a98550acd 100644 --- a/src/app/core/error-handler/global-error-handler.class.ts +++ b/src/app/core/error-handler/global-error-handler.class.ts @@ -28,7 +28,6 @@ export class GlobalErrorHandler implements ErrorHandler { return; } - // eslint-disable-next-line let simpleStack = ''; if ( err && diff --git a/src/app/features/config/default-global-config.const.ts b/src/app/features/config/default-global-config.const.ts index 55b7332cb..15cf587d0 100644 --- a/src/app/features/config/default-global-config.const.ts +++ b/src/app/features/config/default-global-config.const.ts @@ -70,7 +70,7 @@ export const DEFAULT_GLOBAL_CONFIG: GlobalConfigState = { isTimedFullScreenBlocker: false, timedFullScreenBlockerDuration: 8000, isFocusWindow: false, - /* eslint-disable-next-line */ + takeABreakMessage: 'You have been working for ${duration} without one. Go away from the computer! Take a short walk! Makes you more productive in the long run!', takeABreakMinWorkingTime: 60 * minute, diff --git a/src/app/features/config/form-cfgs/automatic-backups-form.const.ts b/src/app/features/config/form-cfgs/automatic-backups-form.const.ts index 6e2f123b4..e1e7230dc 100644 --- a/src/app/features/config/form-cfgs/automatic-backups-form.const.ts +++ b/src/app/features/config/form-cfgs/automatic-backups-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, LocalBackupConfig } from '../global-config.model'; import { T } from '../../../t.const'; diff --git a/src/app/features/config/form-cfgs/domina-mode-form.const.ts b/src/app/features/config/form-cfgs/domina-mode-form.const.ts index 8f66867b6..16672ac9f 100644 --- a/src/app/features/config/form-cfgs/domina-mode-form.const.ts +++ b/src/app/features/config/form-cfgs/domina-mode-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, DominaModeConfig } from '../global-config.model'; import { T } from '../../../t.const'; import { speak } from '../../../util/speak'; diff --git a/src/app/features/config/form-cfgs/evaluation-settings-form.const.ts b/src/app/features/config/form-cfgs/evaluation-settings-form.const.ts index a8d6cd997..bf68f2f5e 100644 --- a/src/app/features/config/form-cfgs/evaluation-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/evaluation-settings-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, EvaluationConfig } from '../global-config.model'; import { T } from '../../../t.const'; diff --git a/src/app/features/config/form-cfgs/idle-form.const.ts b/src/app/features/config/form-cfgs/idle-form.const.ts index 99a3f05ba..dd4d81baf 100644 --- a/src/app/features/config/form-cfgs/idle-form.const.ts +++ b/src/app/features/config/form-cfgs/idle-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, IdleConfig } from '../global-config.model'; import { T } from '../../../t.const'; import { HelperClasses } from '../../../app.constants'; diff --git a/src/app/features/config/form-cfgs/imex-form.const.ts b/src/app/features/config/form-cfgs/imex-form.const.ts index e530d3946..0689aec80 100644 --- a/src/app/features/config/form-cfgs/imex-form.const.ts +++ b/src/app/features/config/form-cfgs/imex-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection } from '../global-config.model'; import { T } from '../../../t.const'; diff --git a/src/app/features/config/form-cfgs/keyboard-form.const.ts b/src/app/features/config/form-cfgs/keyboard-form.const.ts index f92940567..6d7fdcd0e 100644 --- a/src/app/features/config/form-cfgs/keyboard-form.const.ts +++ b/src/app/features/config/form-cfgs/keyboard-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, LimitedFormlyFieldConfig } from '../global-config.model'; import { T } from '../../../t.const'; import { IS_ELECTRON } from '../../../app.constants'; @@ -392,4 +391,3 @@ export const KEYBOARD_SETTINGS_FORM_CFG: ConfigFormSection = { }, ], }; -/* eslint-enable max-len */ diff --git a/src/app/features/config/form-cfgs/misc-settings-form.const.ts b/src/app/features/config/form-cfgs/misc-settings-form.const.ts index f44c4dfab..6e681f11b 100644 --- a/src/app/features/config/form-cfgs/misc-settings-form.const.ts +++ b/src/app/features/config/form-cfgs/misc-settings-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, LimitedFormlyFieldConfig, diff --git a/src/app/features/config/form-cfgs/simple-counter-form.const.ts b/src/app/features/config/form-cfgs/simple-counter-form.const.ts index f0170a025..3e17d3038 100644 --- a/src/app/features/config/form-cfgs/simple-counter-form.const.ts +++ b/src/app/features/config/form-cfgs/simple-counter-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection } from '../global-config.model'; import { SimpleCounterConfig, diff --git a/src/app/features/config/form-cfgs/sound-form.const.ts b/src/app/features/config/form-cfgs/sound-form.const.ts index 97e3564dc..8a4abf56f 100644 --- a/src/app/features/config/form-cfgs/sound-form.const.ts +++ b/src/app/features/config/form-cfgs/sound-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, SoundConfig } from '../global-config.model'; import { T } from '../../../t.const'; import { playDoneSound } from '../../tasks/util/play-done-sound'; diff --git a/src/app/features/config/form-cfgs/sync-form.const.ts b/src/app/features/config/form-cfgs/sync-form.const.ts index cab1fd09e..2134435a9 100644 --- a/src/app/features/config/form-cfgs/sync-form.const.ts +++ b/src/app/features/config/form-cfgs/sync-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { T } from '../../../t.const'; import { ConfigFormSection, SyncConfig } from '../global-config.model'; import { LegacySyncProvider } from '../../../imex/sync/legacy-sync-provider.model'; diff --git a/src/app/features/config/form-cfgs/sync-safety-backups-form.const.ts b/src/app/features/config/form-cfgs/sync-safety-backups-form.const.ts index ac921c61e..3fc98f399 100644 --- a/src/app/features/config/form-cfgs/sync-safety-backups-form.const.ts +++ b/src/app/features/config/form-cfgs/sync-safety-backups-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection } from '../global-config.model'; export const SYNC_SAFETY_BACKUPS_FORM: ConfigFormSection<{ [key: string]: any }> = { diff --git a/src/app/features/config/form-cfgs/take-a-break-form.const.ts b/src/app/features/config/form-cfgs/take-a-break-form.const.ts index c7d0f6291..8196c4575 100644 --- a/src/app/features/config/form-cfgs/take-a-break-form.const.ts +++ b/src/app/features/config/form-cfgs/take-a-break-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, TakeABreakConfig } from '../global-config.model'; import { T } from '../../../t.const'; /* eslint-disable @typescript-eslint/naming-convention */ diff --git a/src/app/features/config/form-cfgs/time-tracking-form.const.ts b/src/app/features/config/form-cfgs/time-tracking-form.const.ts index 5f82cb946..7c3a8aa48 100644 --- a/src/app/features/config/form-cfgs/time-tracking-form.const.ts +++ b/src/app/features/config/form-cfgs/time-tracking-form.const.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-len */ import { ConfigFormSection, TimeTrackingConfig } from '../global-config.model'; import { T } from '../../../t.const'; diff --git a/src/app/features/config/store/global-config.effects.ts b/src/app/features/config/store/global-config.effects.ts index edf46297a..24f756bbf 100644 --- a/src/app/features/config/store/global-config.effects.ts +++ b/src/app/features/config/store/global-config.effects.ts @@ -111,13 +111,12 @@ export class GlobalConfigEffects { this._actions$.pipe( ofType(updateGlobalConfigSection), filter(({ sectionKey, sectionCfg }) => sectionKey === 'misc'), - // eslint-disable-next-line + filter( ({ sectionKey, sectionCfg }) => sectionCfg && !!(sectionCfg as MiscConfig).startOfNextDay, ), tap(({ sectionKey, sectionCfg }) => { - // eslint-disable-next-line this._dateService.setStartOfNextDayDiff((sectionCfg as any)['startOfNextDay']); }), ), diff --git a/src/app/features/issue/providers/caldav/caldav-client.service.ts b/src/app/features/issue/providers/caldav/caldav-client.service.ts index 198f195dc..89fdce938 100644 --- a/src/app/features/issue/providers/caldav/caldav-client.service.ts +++ b/src/app/features/issue/providers/caldav/caldav-client.service.ts @@ -163,9 +163,9 @@ export class CaldavClientService { } for (i = 0; i < etag.length; i++) { chr = etag.charCodeAt(i); - hash = (hash << 5) - hash + chr; //eslint-disable-line no-bitwise + hash = (hash << 5) - hash + chr; // Convert to 32bit integer - hash |= 0; //eslint-disable-line no-bitwise + hash |= 0; } return hash; } @@ -295,7 +295,7 @@ export class CaldavClientService { const oldOpen = xhr.open; // override open() method to add headers - // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + xhr.open = function (): void { // @ts-ignore // eslint-disable-next-line prefer-rest-params diff --git a/src/app/features/issue/providers/github/github-api-responses.d.ts b/src/app/features/issue/providers/github/github-api-responses.d.ts index 3fd7adac5..f6ac2da9e 100644 --- a/src/app/features/issue/providers/github/github-api-responses.d.ts +++ b/src/app/features/issue/providers/github/github-api-responses.d.ts @@ -36,7 +36,7 @@ export type GithubOriginalMileStone = Readonly<{ labels_url: string; id: number; node_id: string; - // eslint-disable-next-line id-blacklist + number: number; state: GithubOriginalState; title: string; @@ -150,7 +150,7 @@ export type GithubOriginalIssue = Readonly<{ comments_url: string; events_url: string; html_url: string; - // eslint-disable-next-line id-blacklist + number: number; state: GithubOriginalState; title: string; diff --git a/src/app/features/issue/providers/github/github-cfg-form.const.ts b/src/app/features/issue/providers/github/github-cfg-form.const.ts index e09a6b821..bb39e8ee6 100644 --- a/src/app/features/issue/providers/github/github-cfg-form.const.ts +++ b/src/app/features/issue/providers/github/github-cfg-form.const.ts @@ -59,7 +59,6 @@ export const GITHUB_CONFIG_FORM: LimitedFormlyFieldConfig[] key: 'filterUsernameForIssueUpdates', type: 'input', expressions: { - // eslint-disable-next-line @typescript-eslint/naming-convention // 'props.disabled': '!model.filterUsername', hide: '!model.isAutoPoll', }, @@ -75,7 +74,6 @@ export const GITHUB_CONFIG_FORM: LimitedFormlyFieldConfig[] key: 'backlogQuery', type: 'input', expressions: { - // eslint-disable-next-line @typescript-eslint/naming-convention // 'props.disabled': '!model.filterUsername', hide: '!model.isAutoAddToBacklog || !model.defaultProjectId', }, diff --git a/src/app/features/issue/providers/github/github-issue-map.util.ts b/src/app/features/issue/providers/github/github-issue-map.util.ts index c85be5c36..873fe05ad 100644 --- a/src/app/features/issue/providers/github/github-issue-map.util.ts +++ b/src/app/features/issue/providers/github/github-issue-map.util.ts @@ -13,7 +13,7 @@ export const mapGithubIssue = (issue: GithubOriginalIssue): GithubIssue => { comments_url: issue.comments_url, events_url: issue.events_url, html_url: issue.html_url, - // eslint-disable-next-line id-blacklist + number: issue.number, state: issue.state, title: issue.title, diff --git a/src/app/features/issue/providers/github/github-issue.model.ts b/src/app/features/issue/providers/github/github-issue.model.ts index 5435dfdc5..439217781 100644 --- a/src/app/features/issue/providers/github/github-issue.model.ts +++ b/src/app/features/issue/providers/github/github-issue.model.ts @@ -15,7 +15,6 @@ export type GithubPullRequest = GithubOriginalPullRequest; export type GithubComment = GithubOriginalComment; export type GithubIssueReduced = Readonly<{ - // eslint-disable-next-line id-blacklist state: GithubState; title: string; // to make it consistent with non reduced issue diff --git a/src/app/features/issue/providers/gitlab/gitlab-issue-map.util.ts b/src/app/features/issue/providers/gitlab/gitlab-issue-map.util.ts index c99154d7c..00d6c971b 100644 --- a/src/app/features/issue/providers/gitlab/gitlab-issue-map.util.ts +++ b/src/app/features/issue/providers/gitlab/gitlab-issue-map.util.ts @@ -9,7 +9,7 @@ export const mapGitlabIssue = ( ): GitlabIssue => { return { html_url: issue.web_url, - // eslint-disable-next-line id-blacklist + number: issue.iid, // iid: issue.iid, state: issue.state, diff --git a/src/app/features/issue/providers/gitlab/gitlab-issue.model.ts b/src/app/features/issue/providers/gitlab/gitlab-issue.model.ts index bf53f1037..48bdcddfc 100644 --- a/src/app/features/issue/providers/gitlab/gitlab-issue.model.ts +++ b/src/app/features/issue/providers/gitlab/gitlab-issue.model.ts @@ -15,7 +15,7 @@ export type GitlabIssue = Readonly<{ // comments_url: string; // events_url: string; html_url: string; - // eslint-disable-next-line id-blacklist + number: number; state: GitlabState; title: string; diff --git a/src/app/features/issue/providers/jira/jira-cfg-form.const.ts b/src/app/features/issue/providers/jira/jira-cfg-form.const.ts index b16fbdf54..c44e387f8 100644 --- a/src/app/features/issue/providers/jira/jira-cfg-form.const.ts +++ b/src/app/features/issue/providers/jira/jira-cfg-form.const.ts @@ -77,7 +77,7 @@ export const JIRA_CONFIG_FORM_SECTION: ConfigFormSection = { type: 'input', templateOptions: { type: 'url', - /* eslint-disable-next-line */ + pattern: /^(http(s)?:\/\/)?(localhost|[\w.\-]+(?:\.[\w\.\-]+)+)(:\d+)?(\/[^\s]*)?$/i, required: true, diff --git a/src/app/features/note/note/note.component.ts b/src/app/features/note/note/note.component.ts index f0b789c67..edd694157 100644 --- a/src/app/features/note/note/note.component.ts +++ b/src/app/features/note/note/note.component.ts @@ -61,7 +61,6 @@ export class NoteComponent implements OnChanges { private readonly _projectService = inject(ProjectService); private readonly _workContextService = inject(WorkContextService); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion note!: Note; // TODO: Skipped for migration because: diff --git a/src/app/features/project/project-form-cfg.const.ts b/src/app/features/project/project-form-cfg.const.ts index 9bc0933c3..59eea1608 100644 --- a/src/app/features/project/project-form-cfg.const.ts +++ b/src/app/features/project/project-form-cfg.const.ts @@ -43,9 +43,9 @@ export const CREATE_PROJECT_BASIC_CONFIG_FORM_CONFIG: ConfigFormSection // TODO translate title: 'Project Settings & Theme', key: 'basic', - /* eslint-disable */ + help: `Very basic settings for your project.`, - /* eslint-enable */ + items: [ { key: 'title', diff --git a/src/app/features/schedule/ical/get-relevant-events-from-ical.ts b/src/app/features/schedule/ical/get-relevant-events-from-ical.ts index b49ee0ec2..9be2bc516 100644 --- a/src/app/features/schedule/ical/get-relevant-events-from-ical.ts +++ b/src/app/features/schedule/ical/get-relevant-events-from-ical.ts @@ -348,7 +348,6 @@ const convertVEventToCalendarIntegrationEvent = ( }; }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any const getAllPossibleEventsAfterStartFromIcal = ( ICAL: any, icalData: string, diff --git a/src/app/features/schedule/ical/ical-lazy-loader.ts b/src/app/features/schedule/ical/ical-lazy-loader.ts index 1a01801b2..f586623fd 100644 --- a/src/app/features/schedule/ical/ical-lazy-loader.ts +++ b/src/app/features/schedule/ical/ical-lazy-loader.ts @@ -3,9 +3,8 @@ * The ical.js library is ~76KB and only needed for calendar integration. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any let icalModule: any = null; -// eslint-disable-next-line @typescript-eslint/no-explicit-any + let loadingPromise: Promise | null = null; /** @@ -13,7 +12,7 @@ let loadingPromise: Promise | null = null; * Subsequent calls return the cached module. * Concurrent calls share the same loading promise to prevent race conditions. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any + export const loadIcalModule = async (): Promise => { if (icalModule) { return icalModule; diff --git a/src/app/features/schedule/map-schedule-data/create-blocked-blocks-by-day-map.spec.ts b/src/app/features/schedule/map-schedule-data/create-blocked-blocks-by-day-map.spec.ts index a9db73a0b..5f45e743d 100644 --- a/src/app/features/schedule/map-schedule-data/create-blocked-blocks-by-day-map.spec.ts +++ b/src/app/features/schedule/map-schedule-data/create-blocked-blocks-by-day-map.spec.ts @@ -1,8 +1,6 @@ import { createBlockedBlocksByDayMap } from './create-blocked-blocks-by-day-map'; import { TaskCopy, TaskWithDueTime } from '../../tasks/task.model'; -/* eslint-disable @typescript-eslint/naming-convention */ - const NDS = '1970-01-01'; const H = 60 * 60 * 1000; const TZ_OFFSET = new Date(NDS).getTimezoneOffset() * 60000; @@ -16,7 +14,7 @@ const FAKE_TASK: Partial = { const h = (hr: number): number => hr * 60 * 1000 * 60; // const hTz = (hr: number): number => h(hr) + TZ_OFFSET; -// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-mixed-operators +// eslint-disable-next-line no-mixed-operators const dh = (d: number = 0, hr: number): number => hr * H + d * h(24); const dhTz = (d: number = 0, hr: number): number => dh(d, hr) + TZ_OFFSET; diff --git a/src/app/features/schedule/map-schedule-data/map-schedule-days-to-schedule-events.ts b/src/app/features/schedule/map-schedule-data/map-schedule-days-to-schedule-events.ts index c56a1dbf8..fcb223a6c 100644 --- a/src/app/features/schedule/map-schedule-data/map-schedule-days-to-schedule-events.ts +++ b/src/app/features/schedule/map-schedule-data/map-schedule-days-to-schedule-events.ts @@ -16,7 +16,6 @@ export const mapScheduleDaysToScheduleEvents = ( days.forEach((day, dayIndex) => { beyondBudgetDays[dayIndex] = day.beyondBudgetTasks.map((taskPlannedForDay) => { - // eslint-disable-next-line no-mixed-operators const timeLeft = getTimeLeftForTask(taskPlannedForDay); const timeLeftInHours = timeLeft / 1000 / 60 / 60; const rowSpan = Math.max(Math.round(timeLeftInHours * FH), 1); diff --git a/src/app/features/schedule/map-schedule-data/map-to-schedule-days-extended.spec.ts b/src/app/features/schedule/map-schedule-data/map-to-schedule-days-extended.spec.ts index f619750cd..5e752a566 100644 --- a/src/app/features/schedule/map-schedule-data/map-to-schedule-days-extended.spec.ts +++ b/src/app/features/schedule/map-schedule-data/map-to-schedule-days-extended.spec.ts @@ -1,8 +1,6 @@ import { mapToScheduleDays } from './map-to-schedule-days'; import { getDbDateStr } from '../../../util/get-db-date-str'; -/* eslint-disable @typescript-eslint/naming-convention */ - // Helper function to conditionally skip tests that are timezone-dependent // These tests were written with hardcoded expectations for Europe/Berlin timezone const TZ_OFFSET = new Date('1970-01-01').getTimezoneOffset() * 60000; diff --git a/src/app/features/schedule/map-schedule-data/map-to-schedule-days.spec.ts b/src/app/features/schedule/map-schedule-data/map-to-schedule-days.spec.ts index 1a1a8771d..88bf1ca58 100644 --- a/src/app/features/schedule/map-schedule-data/map-to-schedule-days.spec.ts +++ b/src/app/features/schedule/map-schedule-data/map-to-schedule-days.spec.ts @@ -33,11 +33,10 @@ const FAKE_TASK: Partial = { const h = (hr: number): number => hr * 60 * 1000 * 60; const hTz = (hr: number): number => h(hr) + TZ_OFFSET; -// eslint-disable-next-line @typescript-eslint/no-unused-vars,no-mixed-operators +// eslint-disable-next-line no-mixed-operators const dh = (d: number = 0, hr: number): number => hr * H + d * h(24); const dhTz = (d: number = 0, hr: number): number => dh(d, hr) + TZ_OFFSET; -// eslint-disable-next-line no-mixed-operators const minAfterNow = (min: number): Date => new Date(1970, 0, 1, 0, min, 0, 0); const minAfterNowTs = (min: number): number => minAfterNow(min).getTime(); @@ -404,7 +403,7 @@ describe('mapToScheduleDays()', () => { id: 'N1', // NOTE: the 24h stuff only works if we count from 0 of the current timezone start: h(0), - // eslint-disable-next-line no-mixed-operators + duration: h(23) - 60000, type: 'Task', }, @@ -418,7 +417,7 @@ describe('mapToScheduleDays()', () => { { data: jasmine.any(Object), id: 'N2', - // eslint-disable-next-line no-mixed-operators + start: hTz(24), duration: h(1), type: 'SplitTask', @@ -426,7 +425,7 @@ describe('mapToScheduleDays()', () => { { data: jasmine.any(Object), id: 'R1_1970-01-02', - // eslint-disable-next-line no-mixed-operators + start: hTz(25), duration: h(1), type: 'ScheduledRepeatProjection', @@ -434,7 +433,7 @@ describe('mapToScheduleDays()', () => { { data: jasmine.any(Object), id: 'N2_1970-01-02_0', - // eslint-disable-next-line no-mixed-operators + start: hTz(26), duration: h(1), type: 'SplitTaskContinuedLast', @@ -482,7 +481,7 @@ describe('mapToScheduleDays()', () => { data: jasmine.any(Object), id: 'N1', start: hTz(0), - // eslint-disable-next-line no-mixed-operators + duration: h(23) - 60000, type: 'Task', }, @@ -496,7 +495,7 @@ describe('mapToScheduleDays()', () => { { data: jasmine.any(Object), id: 'R1_1970-01-02', - // eslint-disable-next-line no-mixed-operators + start: hTz(24), duration: h(2), type: 'RepeatProjection', @@ -550,7 +549,7 @@ describe('mapToScheduleDays()', () => { data: jasmine.any(Object), id: 'N1', start: dhTz(0, 9), - // eslint-disable-next-line no-mixed-operators + duration: h(8), type: 'SplitTask', }, diff --git a/src/app/features/schedule/schedule/schedule.component.ts b/src/app/features/schedule/schedule/schedule.component.ts index d5f3815b8..d08cb714a 100644 --- a/src/app/features/schedule/schedule/schedule.component.ts +++ b/src/app/features/schedule/schedule/schedule.component.ts @@ -139,7 +139,7 @@ export class ScheduleComponent { const now = new Date(); const hours = now.getHours(); const minutes = now.getMinutes(); - // eslint-disable-next-line no-mixed-operators + const hoursToday = hours + minutes / 60; return Math.round(hoursToday * FH); }); diff --git a/src/app/features/shepherd/shepherd-steps.const.ts b/src/app/features/shepherd/shepherd-steps.const.ts index 2b03df52d..ebc4eeb7b 100644 --- a/src/app/features/shepherd/shepherd-steps.const.ts +++ b/src/app/features/shepherd/shepherd-steps.const.ts @@ -738,7 +738,7 @@ export const SHEPHERD_STEPS = ( }, { title: 'Moving around', - // eslint-disable-next-line max-len + text: `

When a task is focused you can navigate to other tasks by pressing the arrow keys and .

`, when: { show: () => taskService.focusFirstTaskIfVisible(), diff --git a/src/app/features/simple-counter/get-simple-counter-streak-duration.spec.ts b/src/app/features/simple-counter/get-simple-counter-streak-duration.spec.ts index 8486aa135..35c243814 100644 --- a/src/app/features/simple-counter/get-simple-counter-streak-duration.spec.ts +++ b/src/app/features/simple-counter/get-simple-counter-streak-duration.spec.ts @@ -24,7 +24,7 @@ describe('getSimpleCounterStreakDuration()', () => { countOnDay: { [getDbDateStr()]: 1 }, isTrackStreaks: true, streakMinValue: 2, - // eslint-disable-next-line @typescript-eslint/naming-convention + streakWeekDays: { 0: true, 1: true, 2: true, 3: true, 4: true, 5: true, 6: true }, }, { diff --git a/src/app/features/simple-counter/is-equal-simple-counter-cfg.util.ts b/src/app/features/simple-counter/is-equal-simple-counter-cfg.util.ts index 375cd7e03..bb5b31695 100644 --- a/src/app/features/simple-counter/is-equal-simple-counter-cfg.util.ts +++ b/src/app/features/simple-counter/is-equal-simple-counter-cfg.util.ts @@ -19,7 +19,6 @@ export const isEqualSimpleCounterCfg = ( } for (let i = 0; i < a.length; ++i) { if (a[i] !== b[i]) { - // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let j = 0; j < FIELDS_TO_COMPARE.length; j++) { const field = FIELDS_TO_COMPARE[j]; if (a[field] !== b[field]) { diff --git a/src/app/features/task-repeat-cfg/store/get-next-repeat-occurrence.util.spec.ts b/src/app/features/task-repeat-cfg/store/get-next-repeat-occurrence.util.spec.ts index 089bf50fa..19dc37145 100644 --- a/src/app/features/task-repeat-cfg/store/get-next-repeat-occurrence.util.spec.ts +++ b/src/app/features/task-repeat-cfg/store/get-next-repeat-occurrence.util.spec.ts @@ -2,8 +2,6 @@ import { getNextRepeatOccurrence } from './get-next-repeat-occurrence.util'; import { DEFAULT_TASK_REPEAT_CFG, TaskRepeatCfg } from '../task-repeat-cfg.model'; import { getDbDateStr } from '../../../util/get-db-date-str'; -/* eslint-disable no-mixed-operators */ - const FAKE_MONDAY_THE_10TH = new Date(2022, 0, 10).getTime(); const DUMMY_REPEATABLE_TASK: TaskRepeatCfg = { diff --git a/src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts b/src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts index d3694378d..9443497aa 100644 --- a/src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts +++ b/src/app/features/task-repeat-cfg/store/task-repeat-cfg.selectors.spec.ts @@ -122,7 +122,6 @@ describe('selectTaskRepeatCfgsDueOnDay', () => { }); [ - // eslint-disable-next-line no-mixed-operators FAKE_MONDAY_THE_10TH + DAY, // eslint-disable-next-line no-mixed-operators FAKE_MONDAY_THE_10TH + DAY * 11, @@ -150,7 +149,6 @@ describe('selectTaskRepeatCfgsDueOnDay', () => { }); [ - // eslint-disable-next-line no-mixed-operators FAKE_MONDAY_THE_10TH, // eslint-disable-next-line no-mixed-operators FAKE_MONDAY_THE_10TH + DAY * 2, @@ -539,7 +537,6 @@ describe('selectAllUnprocessedTaskRepeatCfgs', () => { }); [ - // eslint-disable-next-line no-mixed-operators FAKE_MONDAY_THE_10TH, // eslint-disable-next-line no-mixed-operators FAKE_MONDAY_THE_10TH + DAY * 2, diff --git a/src/app/features/task-view-customizer/types.ts b/src/app/features/task-view-customizer/types.ts index 90484eb55..37de9ff0a 100644 --- a/src/app/features/task-view-customizer/types.ts +++ b/src/app/features/task-view-customizer/types.ts @@ -27,8 +27,7 @@ export enum SORT_ORDER { // === GROUP === -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface GroupOption extends BaseOption {} +export type GroupOption = BaseOption; export enum GROUP_OPTION_TYPE { tag = 'tag', diff --git a/src/app/features/tasks/store/task.reducer.spec.ts b/src/app/features/tasks/store/task.reducer.spec.ts index 39bab2f4b..9fac25b74 100644 --- a/src/app/features/tasks/store/task.reducer.spec.ts +++ b/src/app/features/tasks/store/task.reducer.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/naming-convention */ import { Task, TaskState } from '../task.model'; import { initialTaskState, taskReducer } from './task.reducer'; import * as fromActions from './task.actions'; diff --git a/src/app/features/tasks/store/task.reducer.transferTask.spec.ts b/src/app/features/tasks/store/task.reducer.transferTask.spec.ts index 2ce5a2efc..073228010 100644 --- a/src/app/features/tasks/store/task.reducer.transferTask.spec.ts +++ b/src/app/features/tasks/store/task.reducer.transferTask.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/naming-convention,@typescript-eslint/explicit-function-return-type */ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ import { Task, TaskState } from '../task.model'; import { initialTaskState, taskReducer } from './task.reducer'; import { PlannerActions } from '../../planner/store/planner.actions'; diff --git a/src/app/features/worklog/worklog-export/worklog-export.util.spec.ts b/src/app/features/worklog/worklog-export/worklog-export.util.spec.ts index f50580a68..616b987f6 100644 --- a/src/app/features/worklog/worklog-export/worklog-export.util.spec.ts +++ b/src/app/features/worklog/worklog-export/worklog-export.util.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable one-var */ import { WorkStartEnd } from 'src/app/features/work-context/work-context.model'; import { WorklogGrouping } from '../worklog.model'; import { createRows } from './worklog-export.util'; diff --git a/src/app/imex/file-imex/privacy-export.ts b/src/app/imex/file-imex/privacy-export.ts index c21d95d47..63b9405e2 100644 --- a/src/app/imex/file-imex/privacy-export.ts +++ b/src/app/imex/file-imex/privacy-export.ts @@ -37,7 +37,6 @@ const maskString = (key: string, val: string, counter: number): string => { const recurse = (obj: unknown): void => { if (typeof obj !== 'object' || obj === null) return; - // eslint-disable-next-line guard-for-in for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { const val = (obj as Record)[key]; diff --git a/src/app/pfapi/api/sync/providers/webdav/webdav-api.ts b/src/app/pfapi/api/sync/providers/webdav/webdav-api.ts index 6bceb8520..8604add69 100644 --- a/src/app/pfapi/api/sync/providers/webdav/webdav-api.ts +++ b/src/app/pfapi/api/sync/providers/webdav/webdav-api.ts @@ -11,8 +11,6 @@ import { } from '../../../errors/errors'; import { WebDavHttpHeader, WebDavHttpMethod, WebDavHttpStatus } from './webdav.const'; -/* eslint-disable @typescript-eslint/naming-convention */ - export class WebdavApi { private static readonly L = 'WebdavApi'; private xmlParser: WebdavXmlParser; diff --git a/src/app/pfapi/repair/auto-fix-typia-errors.ts b/src/app/pfapi/repair/auto-fix-typia-errors.ts index ac6e498ef..57875813a 100644 --- a/src/app/pfapi/repair/auto-fix-typia-errors.ts +++ b/src/app/pfapi/repair/auto-fix-typia-errors.ts @@ -141,9 +141,7 @@ const parsePath = (path: string): (string | number)[] => { const getValueByPath = ( obj: T, path: (string | number)[], -): R | undefined => - // eslint-disable-next-line @typescript-eslint/no-explicit-any - path.reduce((acc, key) => acc?.[key], obj); +): R | undefined => path.reduce((acc, key) => acc?.[key], obj); const setValueByPath = ( obj: T, diff --git a/src/app/plugins/plugin-bridge-counter.service.spec.ts b/src/app/plugins/plugin-bridge-counter.service.spec.ts index b424bfa0e..93449f7f3 100644 --- a/src/app/plugins/plugin-bridge-counter.service.spec.ts +++ b/src/app/plugins/plugin-bridge-counter.service.spec.ts @@ -149,7 +149,7 @@ describe('PluginBridgeService.setCounter()', () => { expect(store.dispatch).toHaveBeenCalled(); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; expect(action.type).toBe('[SimpleCounter] Upsert SimpleCounter'); expect(action.simpleCounter.id).toBe('new-counter'); @@ -166,7 +166,7 @@ describe('PluginBridgeService.setCounter()', () => { expect(store.dispatch).toHaveBeenCalled(); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; expect(action.type).toBe('[SimpleCounter] Upsert SimpleCounter'); expect(action.simpleCounter.id).toBe('zero-counter'); @@ -177,7 +177,7 @@ describe('PluginBridgeService.setCounter()', () => { await service.setCounter('full-counter', 5); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; const counter = action.simpleCounter; @@ -201,7 +201,7 @@ describe('PluginBridgeService.setCounter()', () => { expect(store.dispatch).toHaveBeenCalled(); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; expect(action.type).toBe('[SimpleCounter] Update SimpleCounter'); expect(action.simpleCounter.id).toBe('existing-counter'); @@ -223,7 +223,7 @@ describe('PluginBridgeService.setCounter()', () => { expect(store.dispatch).toHaveBeenCalled(); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; const countOnDay = action.simpleCounter.changes.countOnDay; expect(countOnDay['2024-01-01']).toBe(5); @@ -241,7 +241,7 @@ describe('PluginBridgeService.setCounter()', () => { expect(store.dispatch).toHaveBeenCalled(); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; expect(action.simpleCounter.changes.countOnDay[today]).toBe(100); }); @@ -253,7 +253,7 @@ describe('PluginBridgeService.setCounter()', () => { await service.setCounter('check-action', 1); const call = store.dispatch.calls.mostRecent(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + const action = call.args[0] as any; expect(action.type).toBe('[SimpleCounter] Update SimpleCounter'); }); diff --git a/src/app/plugins/plugin-bridge.service.spec.ts b/src/app/plugins/plugin-bridge.service.spec.ts index 2aa44d021..0a5af570e 100644 --- a/src/app/plugins/plugin-bridge.service.spec.ts +++ b/src/app/plugins/plugin-bridge.service.spec.ts @@ -1,5 +1,5 @@ // TODO: Fix plugin tests after stabilizing task model changes -/* eslint-disable */ + /* import { TestBed } from '@angular/core/testing'; import { MatDialog } from '@angular/material/dialog'; diff --git a/src/app/plugins/plugin.service.spec.ts b/src/app/plugins/plugin.service.spec.ts index dee0c0495..b78c75020 100644 --- a/src/app/plugins/plugin.service.spec.ts +++ b/src/app/plugins/plugin.service.spec.ts @@ -1,5 +1,5 @@ // TODO: Fix plugin tests after stabilizing task model changes -/* eslint-disable */ + // TODO: These tests are disabled due to module resolution issues with @super-productivity/plugin-api describe('PluginService', () => { it('should pass placeholder test', () => { diff --git a/src/app/root-store/meta/task-shared-meta-reducers/planner-shared.reducer.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/planner-shared.reducer.spec.ts index 2d626191d..2b79f6440 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/planner-shared.reducer.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/planner-shared.reducer.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ import { plannerSharedMetaReducer } from './planner-shared.reducer'; import { RootState } from '../../root-state'; import { Task } from '../../../features/tasks/task.model'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/tag-shared.reducer.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/tag-shared.reducer.spec.ts index 5bb25f221..221080dac 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/tag-shared.reducer.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/tag-shared.reducer.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ import { tagSharedMetaReducer } from './tag-shared.reducer'; import { TaskSharedActions } from '../task-shared.actions'; import { RootState } from '../../root-state'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-subtask.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-subtask.spec.ts index a20cb0cd4..bf2c019d9 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-subtask.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-subtask.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/naming-convention */ import { taskBatchUpdateMetaReducer } from './task-batch-update.reducer'; import { TaskSharedActions } from '../task-shared.actions'; import { RootState } from '../../root-state'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-two-subtasks-bug.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-two-subtasks-bug.spec.ts index c61380334..d7d446070 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-two-subtasks-bug.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update-two-subtasks-bug.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ import { taskBatchUpdateMetaReducer } from './task-batch-update.reducer'; import { TaskSharedActions } from '../task-shared.actions'; import { RootState } from '../../root-state'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update.reducer.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update.reducer.spec.ts index d505bcfd4..79a46d886 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update.reducer.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/task-batch-update.reducer.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/naming-convention */ import { taskBatchUpdateMetaReducer } from './task-batch-update.reducer'; import { TaskSharedActions } from '../task-shared.actions'; import { RootState } from '../../root-state'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/task-shared-lifecycle.reducer.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/task-shared-lifecycle.reducer.spec.ts index ac2ec36a7..2601736f4 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/task-shared-lifecycle.reducer.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/task-shared-lifecycle.reducer.spec.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ import { taskSharedLifecycleMetaReducer } from './task-shared-lifecycle.reducer'; import { TaskSharedActions } from '../task-shared.actions'; import { RootState } from '../../root-state'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/test-utils.ts b/src/app/root-store/meta/task-shared-meta-reducers/test-utils.ts index 12af9a7da..3548aa098 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/test-utils.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/test-utils.ts @@ -1,4 +1,4 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ import { RootState } from '../../root-state'; import { TASK_FEATURE_NAME } from '../../../features/tasks/store/task.reducer'; import { TAG_FEATURE_NAME } from '../../../features/tag/store/tag.reducer'; diff --git a/src/app/root-store/meta/task-shared-meta-reducers/validate-and-fix-data-consistency-after-batch-update.spec.ts b/src/app/root-store/meta/task-shared-meta-reducers/validate-and-fix-data-consistency-after-batch-update.spec.ts index 9c1cb873b..ec84b3e78 100644 --- a/src/app/root-store/meta/task-shared-meta-reducers/validate-and-fix-data-consistency-after-batch-update.spec.ts +++ b/src/app/root-store/meta/task-shared-meta-reducers/validate-and-fix-data-consistency-after-batch-update.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ import { validateAndFixDataConsistencyAfterBatchUpdate } from './validate-and-fix-data-consistency-after-batch-update'; import { RootState } from '../../root-state'; import { TASK_FEATURE_NAME } from '../../../features/tasks/store/task.reducer'; diff --git a/src/app/root-store/meta/undo-task-delete.meta-reducer.spec.ts b/src/app/root-store/meta/undo-task-delete.meta-reducer.spec.ts index d99e39133..88d0aa67a 100644 --- a/src/app/root-store/meta/undo-task-delete.meta-reducer.spec.ts +++ b/src/app/root-store/meta/undo-task-delete.meta-reducer.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type,@typescript-eslint/naming-convention */ import { undoTaskDeleteMetaReducer } from './undo-task-delete.meta-reducer'; import { TaskSharedActions } from './task-shared.actions'; import { undoDeleteTask } from '../../features/tasks/store/task.actions'; diff --git a/src/app/rxjs-to-promise.polyfill.ts b/src/app/rxjs-to-promise.polyfill.ts index 92dbf9c64..223d303f7 100644 --- a/src/app/rxjs-to-promise.polyfill.ts +++ b/src/app/rxjs-to-promise.polyfill.ts @@ -15,7 +15,6 @@ const observableProto = (Observable as unknown as { prototype: ObservablePrototy .prototype; if (!observableProto.toPromise) { - // eslint-disable-next-line @typescript-eslint/unbound-method observableProto.toPromise = function (this: Observable): Promise { return lastValueFrom(this); }; diff --git a/src/app/ui/inline-markdown/inline-markdown.component.spec.ts b/src/app/ui/inline-markdown/inline-markdown.component.spec.ts index 60b31f6b9..3a3a2981e 100644 --- a/src/app/ui/inline-markdown/inline-markdown.component.spec.ts +++ b/src/app/ui/inline-markdown/inline-markdown.component.spec.ts @@ -151,4 +151,180 @@ describe('InlineMarkdownComponent', () => { expect(component.changed.emit).toHaveBeenCalledWith(changedValue); }); }); + + describe('_handleCheckboxClick', () => { + let mockPreviewEl: { element: { nativeElement: HTMLElement } }; + + beforeEach(() => { + mockPreviewEl = { + element: { + nativeElement: document.createElement('div'), + }, + }; + spyOn(component, 'previewEl').and.returnValue(mockPreviewEl as any); + spyOn(component.changed, 'emit'); + }); + + it('should toggle first checkbox in simple checklist', () => { + // Arrange + component.model = '- [ ] Task 1\n- [ ] Task 2'; + fixture.detectChanges(); + + // Create mock checkbox wrappers + const wrapper1 = document.createElement('li'); + wrapper1.className = 'checkbox-wrapper'; + wrapper1.innerHTML = + 'check_box_outline_blankTask 1'; + + const wrapper2 = document.createElement('li'); + wrapper2.className = 'checkbox-wrapper'; + wrapper2.innerHTML = + 'check_box_outline_blankTask 2'; + + mockPreviewEl.element.nativeElement.appendChild(wrapper1); + mockPreviewEl.element.nativeElement.appendChild(wrapper2); + + // Act + component['_handleCheckboxClick'](wrapper1); + + // Assert + expect(component.changed.emit).toHaveBeenCalledWith('- [x] Task 1\n- [ ] Task 2'); + }); + + it('should toggle checkbox after blank line', () => { + // Arrange - this is the bug scenario from issue #5950 + component.model = '- [ ] Task 1\n\n- [ ] Task 2'; + fixture.detectChanges(); + + // Create mock checkbox wrappers (blank line doesn't create a wrapper) + const wrapper1 = document.createElement('li'); + wrapper1.className = 'checkbox-wrapper'; + wrapper1.innerHTML = + 'check_box_outline_blankTask 1'; + + const wrapper2 = document.createElement('li'); + wrapper2.className = 'checkbox-wrapper'; + wrapper2.innerHTML = + 'check_box_outline_blankTask 2'; + + mockPreviewEl.element.nativeElement.appendChild(wrapper1); + mockPreviewEl.element.nativeElement.appendChild(wrapper2); + + // Act - click the second checkbox (Task 2) + component['_handleCheckboxClick'](wrapper2); + + // Assert - Task 2 should be toggled, not Task 1 + expect(component.changed.emit).toHaveBeenCalledWith('- [ ] Task 1\n\n- [x] Task 2'); + }); + + it('should toggle checkbox with multiple blank lines', () => { + // Arrange + component.model = '- [ ] Task 1\n\n\n- [ ] Task 2\n\n- [ ] Task 3'; + fixture.detectChanges(); + + const wrapper1 = document.createElement('li'); + wrapper1.className = 'checkbox-wrapper'; + wrapper1.innerHTML = + 'check_box_outline_blankTask 1'; + + const wrapper2 = document.createElement('li'); + wrapper2.className = 'checkbox-wrapper'; + wrapper2.innerHTML = + 'check_box_outline_blankTask 2'; + + const wrapper3 = document.createElement('li'); + wrapper3.className = 'checkbox-wrapper'; + wrapper3.innerHTML = + 'check_box_outline_blankTask 3'; + + mockPreviewEl.element.nativeElement.appendChild(wrapper1); + mockPreviewEl.element.nativeElement.appendChild(wrapper2); + mockPreviewEl.element.nativeElement.appendChild(wrapper3); + + // Act - click the third checkbox (Task 3) + component['_handleCheckboxClick'](wrapper3); + + // Assert + expect(component.changed.emit).toHaveBeenCalledWith( + '- [ ] Task 1\n\n\n- [ ] Task 2\n\n- [x] Task 3', + ); + }); + + it('should uncheck a checked checkbox', () => { + // Arrange + component.model = '- [x] Task 1\n- [ ] Task 2'; + fixture.detectChanges(); + + const wrapper1 = document.createElement('li'); + wrapper1.className = 'checkbox-wrapper'; + wrapper1.innerHTML = 'check_boxTask 1'; + + const wrapper2 = document.createElement('li'); + wrapper2.className = 'checkbox-wrapper'; + wrapper2.innerHTML = + 'check_box_outline_blankTask 2'; + + mockPreviewEl.element.nativeElement.appendChild(wrapper1); + mockPreviewEl.element.nativeElement.appendChild(wrapper2); + + // Act + component['_handleCheckboxClick'](wrapper1); + + // Assert + expect(component.changed.emit).toHaveBeenCalledWith('- [ ] Task 1\n- [ ] Task 2'); + }); + }); + + describe('clickPreview with loose lists (blank lines)', () => { + let mockPreviewEl: { element: { nativeElement: HTMLElement } }; + + beforeEach(() => { + mockPreviewEl = { + element: { + nativeElement: document.createElement('div'), + }, + }; + spyOn(component, 'previewEl').and.returnValue(mockPreviewEl as any); + spyOn(component.changed, 'emit'); + }); + + it('should handle checkbox click when checkbox is wrapped in

tag (loose list)', () => { + // Arrange - simulates loose list HTML:

  • ...Task

  • + component.model = '- [ ] Task 1\n\n- [ ] Task 2'; + fixture.detectChanges(); + + // Build DOM structure for loose list (with

    wrapper) + const wrapper1 = document.createElement('li'); + wrapper1.className = 'checkbox-wrapper undone'; + const p1 = document.createElement('p'); + const checkbox1 = document.createElement('span'); + checkbox1.className = 'checkbox material-icons'; + checkbox1.textContent = 'check_box_outline_blank'; + p1.appendChild(checkbox1); + p1.appendChild(document.createTextNode('Task 1')); + wrapper1.appendChild(p1); + + const wrapper2 = document.createElement('li'); + wrapper2.className = 'checkbox-wrapper undone'; + const p2 = document.createElement('p'); + const checkbox2 = document.createElement('span'); + checkbox2.className = 'checkbox material-icons'; + checkbox2.textContent = 'check_box_outline_blank'; + p2.appendChild(checkbox2); + p2.appendChild(document.createTextNode('Task 2')); + wrapper2.appendChild(p2); + + mockPreviewEl.element.nativeElement.appendChild(wrapper1); + mockPreviewEl.element.nativeElement.appendChild(wrapper2); + + // Act - simulate clicking the second checkbox + const mockEvent = { + target: checkbox2, + } as unknown as MouseEvent; + component.clickPreview(mockEvent); + + // Assert - Task 2 should be toggled + expect(component.changed.emit).toHaveBeenCalledWith('- [ ] Task 1\n\n- [x] Task 2'); + }); + }); }); diff --git a/src/app/ui/mentions/mention-list.component.ts b/src/app/ui/mentions/mention-list.component.ts index cb6a8a66c..f30458009 100644 --- a/src/app/ui/mentions/mention-list.component.ts +++ b/src/app/ui/mentions/mention-list.component.ts @@ -42,8 +42,8 @@ import { Log } from '../../core/log'; > @for (item of items; track item; let i = $index) {

  • => { return new Observable((observer: Subscriber) => { - // eslint-disable-next-line if ((window as any).ResizeObserver) { - // eslint-disable-next-line const resizeObserver = new (window as any).ResizeObserver( (entries: ResizeObserverEntry[]) => { observer.next(entries[0].contentRect.width);