eslint: Migrate to flat configuration.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2024-11-26 16:44:33 -08:00
committed by Tim Abbott
parent 7950696081
commit 9a4728425d
6 changed files with 383 additions and 312 deletions

View File

@@ -1,15 +0,0 @@
# This is intended for generated files and vendored third-party files.
# For our source code, instead of adding files here, consider using
# specific eslint-disable comments in the files themselves.
/docs/_build
/static/generated
/static/webpack-bundles
/var/*
!/var/puppeteer
/var/puppeteer/*
!/var/puppeteer/test_credentials.d.ts
/web/generated
/web/third
/zulip-current-venv
/zulip-py3-venv

View File

@@ -1,296 +0,0 @@
"use strict";
const confusingBrowserGlobals = require("confusing-browser-globals");
module.exports = {
root: true,
env: {
es2020: true,
node: true,
},
extends: [
"eslint:recommended",
"plugin:import/errors",
"plugin:import/warnings",
"plugin:no-jquery/recommended",
"plugin:no-jquery/deprecated",
"plugin:unicorn/recommended",
"prettier",
],
parserOptions: {
warnOnUnsupportedTypeScriptVersion: false,
},
plugins: ["formatjs", "no-jquery"],
settings: {
formatjs: {
additionalFunctionNames: ["$t", "$t_html"],
},
"no-jquery": {
collectionReturningPlugins: {
expectOne: "always",
},
variablePattern: "^\\$(?!t$|t_html$).",
},
},
reportUnusedDisableDirectives: true,
rules: {
"array-callback-return": "error",
"arrow-body-style": "error",
"block-scoped-var": "error",
"consistent-return": "error",
curly: "error",
"dot-notation": "error",
eqeqeq: "error",
"formatjs/enforce-default-message": ["error", "literal"],
"formatjs/enforce-placeholders": [
"error",
{ignoreList: ["b", "code", "em", "i", "kbd", "p", "strong"]},
],
"formatjs/no-id": "error",
"guard-for-in": "error",
"import/extensions": ["error", "ignorePackages"],
"import/first": "error",
"import/newline-after-import": "error",
"import/no-cycle": ["error", {ignoreExternal: true}],
"import/no-duplicates": "error",
"import/no-self-import": "error",
"import/no-unresolved": "off",
"import/no-useless-path-segments": "error",
"import/order": ["error", {alphabetize: {order: "asc"}, "newlines-between": "always"}],
"import/unambiguous": "error",
"lines-around-directive": "error",
"new-cap": "error",
"no-alert": "error",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-caller": "error",
"no-catch-shadow": "error",
"no-constant-condition": ["error", {checkLoops: false}],
"no-div-regex": "error",
"no-else-return": "error",
"no-eq-null": "error",
"no-eval": "error",
"no-implicit-coercion": "error",
"no-implied-eval": "error",
"no-inner-declarations": "off",
"no-iterator": "error",
"no-jquery/no-append-html": "error",
"no-jquery/no-constructor-attributes": "error",
"no-jquery/no-parse-html-literal": "error",
"no-label-var": "error",
"no-labels": "error",
"no-loop-func": "error",
"no-multi-str": "error",
"no-native-reassign": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-new-wrappers": "error",
"no-octal-escape": "error",
"no-plusplus": "error",
"no-proto": "error",
"no-restricted-globals": ["error", ...confusingBrowserGlobals],
"no-return-assign": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sync": "error",
"no-throw-literal": "error",
"no-undef-init": "error",
"no-unneeded-ternary": ["error", {defaultAssignment: false}],
"no-unused-expressions": "error",
"no-unused-vars": [
"error",
{args: "all", argsIgnorePattern: "^_", ignoreRestSiblings: true},
],
"no-use-before-define": ["error", {functions: false, variables: false}],
"no-useless-concat": "error",
"no-useless-constructor": "error",
"no-var": "error",
"object-shorthand": ["error", "always", {avoidExplicitReturnArrows: true}],
"one-var": ["error", "never"],
"prefer-arrow-callback": "error",
"prefer-const": ["error", {ignoreReadBeforeAssign: true}],
radix: "error",
"sort-imports": ["error", {ignoreDeclarationSort: true}],
"spaced-comment": ["error", "always", {markers: ["/"]}],
strict: "error",
"unicorn/consistent-function-scoping": "off",
"unicorn/explicit-length-check": "off",
"unicorn/filename-case": "off",
"unicorn/no-await-expression-member": "off",
"unicorn/no-negated-condition": "off",
"unicorn/no-null": "off",
"unicorn/no-process-exit": "off",
"unicorn/no-useless-undefined": "off",
"unicorn/numeric-separators-style": "off",
"unicorn/prefer-global-this": "off",
"unicorn/prefer-module": "off",
"unicorn/prefer-string-raw": "off",
"unicorn/prefer-ternary": "off",
"unicorn/prefer-top-level-await": "off",
"unicorn/prevent-abbreviations": "off",
"unicorn/switch-case-braces": "off",
"valid-typeof": ["error", {requireStringLiterals: true}],
yoda: "error",
},
overrides: [
{
files: ["*.cjs"],
parserOptions: {
sourceType: "script",
},
},
{
files: ["web/tests/**"],
rules: {
"no-jquery/no-selector-prop": "off",
},
},
{
files: ["web/e2e-tests/**"],
globals: {
zulip_test: false,
},
},
{
files: ["web/src/**"],
globals: {
StripeCheckout: false,
},
},
{
files: ["**/*.cts", "**/*.mts", "**/*.ts"],
extends: [
"plugin:@typescript-eslint/strict-type-checked",
"plugin:@typescript-eslint/stylistic-type-checked",
"plugin:import/typescript",
],
parserOptions: {
project: true,
tsconfigRootDir: __dirname,
},
settings: {
"import/resolver": {
node: {
extensions: [".ts", ".d.ts", ".js"], // https://github.com/import-js/eslint-plugin-import/issues/2267
},
},
},
globals: {
JQuery: false,
},
rules: {
// Disable base rule to avoid conflict
"no-use-before-define": "off",
"@typescript-eslint/consistent-type-assertions": [
"error",
{assertionStyle: "never"},
],
"@typescript-eslint/consistent-type-definitions": ["error", "type"],
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/explicit-function-return-type": [
"error",
{allowExpressions: true},
],
"@typescript-eslint/member-ordering": "error",
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unnecessary-condition": "off",
"@typescript-eslint/no-unnecessary-qualifier": "error",
"@typescript-eslint/no-unused-vars": [
"error",
{args: "all", argsIgnorePattern: "^_", ignoreRestSiblings: true},
],
"@typescript-eslint/no-use-before-define": [
"error",
{functions: false, variables: false},
],
"@typescript-eslint/parameter-properties": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/restrict-plus-operands": ["error", {}],
"@typescript-eslint/restrict-template-expressions": ["error", {}],
"no-undef": "error",
},
},
{
files: ["**/*.d.ts"],
rules: {
"import/unambiguous": "off",
},
},
{
files: ["web/e2e-tests/**", "web/tests/**"],
globals: {
CSS: false,
document: false,
navigator: false,
window: false,
},
rules: {
"formatjs/no-id": "off",
"new-cap": "off",
"no-sync": "off",
"unicorn/prefer-prototype-methods": "off",
},
},
{
files: ["web/debug-require.cjs"],
env: {
browser: true,
es2020: false,
},
rules: {
// Dont require ES features that PhantomJS doesnt support
// TODO: Toggle these settings now that we don't use PhantomJS
"no-var": "off",
"object-shorthand": "off",
"prefer-arrow-callback": "off",
},
},
{
files: ["web/shared/**", "web/src/**"],
env: {
browser: true,
node: false,
},
globals: {
DEVELOPMENT: false,
ZULIP_VERSION: false,
},
rules: {
"no-console": "error",
},
settings: {
"import/resolver": "webpack",
},
},
{
files: ["web/shared/**"],
env: {
browser: false,
"shared-node-browser": true,
},
rules: {
"import/no-restricted-paths": [
"error",
{
zones: [
{
target: "./web/shared",
from: ".",
except: ["./node_modules", "./web/shared"],
},
],
},
],
"unicorn/prefer-string-replace-all": "off",
},
},
{
files: ["web/server/**"],
env: {
node: true,
},
},
],
};

315
eslint.config.js Normal file
View File

@@ -0,0 +1,315 @@
import {FlatCompat} from "@eslint/eslintrc";
import js from "@eslint/js";
import confusingBrowserGlobals from "confusing-browser-globals";
import prettier from "eslint-config-prettier";
import formatjs from "eslint-plugin-formatjs";
import importPlugin from "eslint-plugin-import";
import noJquery from "eslint-plugin-no-jquery";
import unicorn from "eslint-plugin-unicorn";
import globals from "globals";
import tseslint from "typescript-eslint";
const compat = new FlatCompat({baseDirectory: import.meta.dirname});
export default [
{
files: ["tools/check-openapi"],
},
{
// This is intended for generated files and vendored third-party files.
// For our source code, instead of adding files here, consider using
// specific eslint-disable comments in the files themselves.
ignores: [
"docs/_build",
"static/generated",
"static/webpack-bundles",
"var/*",
"!var/puppeteer",
"var/puppeteer/*",
"!var/puppeteer/test_credentials.d.ts",
"web/generated",
"web/third",
"zulip-current-venv",
"zulip-py3-venv",
],
},
js.configs.recommended,
importPlugin.flatConfigs.recommended,
...compat.extends("plugin:no-jquery/recommended", "plugin:no-jquery/deprecated"),
unicorn.configs["flat/recommended"],
prettier,
{
plugins: {
formatjs,
"no-jquery": noJquery,
},
linterOptions: {
reportUnusedDisableDirectives: true,
},
languageOptions: {
ecmaVersion: "latest",
parserOptions: {
warnOnUnsupportedTypeScriptVersion: false,
},
},
settings: {
formatjs: {
additionalFunctionNames: ["$t", "$t_html"],
},
"no-jquery": {
collectionReturningPlugins: {expectOne: "always"},
variablePattern: "^\\$(?!t$|t_html$).",
},
},
rules: {
"array-callback-return": "error",
"arrow-body-style": "error",
"block-scoped-var": "error",
"consistent-return": "error",
curly: "error",
"dot-notation": "error",
eqeqeq: "error",
"formatjs/enforce-default-message": ["error", "literal"],
"formatjs/enforce-placeholders": [
"error",
{ignoreList: ["b", "code", "em", "i", "kbd", "p", "strong"]},
],
"formatjs/no-id": "error",
"guard-for-in": "error",
"import/extensions": ["error", "ignorePackages"],
"import/first": "error",
"import/newline-after-import": "error",
"import/no-cycle": ["error", {ignoreExternal: true}],
"import/no-duplicates": "error",
"import/no-self-import": "error",
"import/no-unresolved": "off",
"import/no-useless-path-segments": "error",
"import/order": ["error", {alphabetize: {order: "asc"}, "newlines-between": "always"}],
"import/unambiguous": "error",
"lines-around-directive": "error",
"new-cap": "error",
"no-alert": "error",
"no-array-constructor": "error",
"no-bitwise": "error",
"no-caller": "error",
"no-catch-shadow": "error",
"no-constant-condition": ["error", {checkLoops: false}],
"no-div-regex": "error",
"no-else-return": "error",
"no-eq-null": "error",
"no-eval": "error",
"no-implicit-coercion": "error",
"no-implied-eval": "error",
"no-inner-declarations": "off",
"no-iterator": "error",
"no-jquery/no-append-html": "error",
"no-jquery/no-constructor-attributes": "error",
"no-jquery/no-parse-html-literal": "error",
"no-label-var": "error",
"no-labels": "error",
"no-loop-func": "error",
"no-multi-str": "error",
"no-native-reassign": "error",
"no-new-func": "error",
"no-new-object": "error",
"no-new-wrappers": "error",
"no-octal-escape": "error",
"no-plusplus": "error",
"no-proto": "error",
"no-restricted-globals": ["error", ...confusingBrowserGlobals],
"no-return-assign": "error",
"no-script-url": "error",
"no-self-compare": "error",
"no-sync": "error",
"no-throw-literal": "error",
"no-undef-init": "error",
"no-unneeded-ternary": ["error", {defaultAssignment: false}],
"no-unused-expressions": "error",
"no-unused-vars": [
"error",
{args: "all", argsIgnorePattern: "^_", ignoreRestSiblings: true},
],
"no-use-before-define": ["error", {functions: false, variables: false}],
"no-useless-concat": "error",
"no-useless-constructor": "error",
"no-var": "error",
"object-shorthand": ["error", "always", {avoidExplicitReturnArrows: true}],
"one-var": ["error", "never"],
"prefer-arrow-callback": "error",
"prefer-const": ["error", {ignoreReadBeforeAssign: true}],
radix: "error",
"sort-imports": ["error", {ignoreDeclarationSort: true}],
"spaced-comment": ["error", "always", {markers: ["/"]}],
strict: "error",
"unicorn/consistent-function-scoping": "off",
"unicorn/explicit-length-check": "off",
"unicorn/filename-case": "off",
"unicorn/no-await-expression-member": "off",
"unicorn/no-negated-condition": "off",
"unicorn/no-null": "off",
"unicorn/no-process-exit": "off",
"unicorn/no-useless-undefined": "off",
"unicorn/numeric-separators-style": "off",
"unicorn/prefer-global-this": "off",
"unicorn/prefer-module": "off",
"unicorn/prefer-string-raw": "off",
"unicorn/prefer-ternary": "off",
"unicorn/prefer-top-level-await": "off",
"unicorn/prevent-abbreviations": "off",
"unicorn/switch-case-braces": "off",
"valid-typeof": ["error", {requireStringLiterals: true}],
yoda: "error",
},
},
{
files: ["**/*.cjs"],
languageOptions: {
sourceType: "commonjs",
},
},
{
files: ["web/tests/**"],
rules: {
"no-jquery/no-selector-prop": "off",
},
},
{
files: ["web/e2e-tests/**"],
languageOptions: {
globals: {
zulip_test: "readonly",
},
},
},
...[
...tseslint.configs.strictTypeChecked,
...tseslint.configs.stylisticTypeChecked,
importPlugin.flatConfigs.typescript,
].map((config) => ({
...config,
files: ["**/*.cts", "**/*.mts", "**/*.ts"],
})),
{
files: ["**/*.cts", "**/*.mts", "**/*.ts"],
languageOptions: {
globals: {
JQuery: "readonly",
},
parserOptions: {
project: true,
tsConfigRootDir: import.meta.dirname,
},
},
settings: {
"import/resolver": {
node: {
extensions: [".ts", ".d.ts", ".js"],
},
},
},
rules: {
"no-use-before-define": "off",
"@typescript-eslint/consistent-type-assertions": ["error", {assertionStyle: "never"}],
"@typescript-eslint/consistent-type-definitions": ["error", "type"],
"@typescript-eslint/consistent-type-imports": "error",
"@typescript-eslint/explicit-function-return-type": ["error", {allowExpressions: true}],
"@typescript-eslint/member-ordering": "error",
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unnecessary-condition": "off",
"@typescript-eslint/no-unnecessary-qualifier": "error",
"@typescript-eslint/no-unused-vars": [
"error",
{args: "all", argsIgnorePattern: "^_", ignoreRestSiblings: true},
],
"@typescript-eslint/no-use-before-define": [
"error",
{functions: false, variables: false},
],
"@typescript-eslint/parameter-properties": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/restrict-plus-operands": ["error", {}],
"@typescript-eslint/restrict-template-expressions": ["error", {}],
"no-undef": "error",
},
},
{
files: ["**/*.d.ts"],
rules: {
"import/unambiguous": "off",
},
},
{
files: ["**"],
ignores: ["web/shared/**", "web/src/**"],
languageOptions: {
globals: globals.node,
},
},
{
files: ["web/e2e-tests/**", "web/tests/**"],
languageOptions: {
globals: {
CSS: "readonly",
document: "readonly",
navigator: "readonly",
window: "readonly",
},
},
rules: {
"formatjs/no-id": "off",
"new-cap": "off",
"no-sync": "off",
"unicorn/prefer-prototype-methods": "off",
},
},
{
files: ["web/debug-require.cjs"],
rules: {
"no-var": "off",
"object-shorthand": "off",
"prefer-arrow-callback": "off",
},
},
{
files: ["web/shared/**", "web/src/**"],
settings: {
"import/resolver": "webpack",
},
rules: {
"no-console": "error",
},
},
{
files: ["web/src/**"],
languageOptions: {
globals: {
...globals.browser,
DEVELOPMENT: "readonly",
StripeCheckout: "readonly",
ZULIP_VERSION: "readonly",
},
},
},
{
files: ["web/shared/**"],
languageOptions: {
globals: globals["shared-node-browser"],
},
rules: {
"import/no-restricted-paths": [
"error",
{
zones: [
{
target: "./web/shared",
from: ".",
except: ["./node_modules", "./web/shared"],
},
],
},
],
"unicorn/prefer-string-replace-all": "off",
},
},
];

View File

@@ -97,11 +97,16 @@
"devDependencies": {
"@babel/eslint-parser": "^7.11.3",
"@babel/plugin-transform-modules-commonjs": "^7.19.6",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "^8.57.1",
"@formatjs/cli": "^6.0.0",
"@giphy/js-types": "^5.1.0",
"@types/autosize": "^4.0.1",
"@types/blueimp-md5": "^2.18.0",
"@types/co-body": "^6.1.3",
"@types/confusing-browser-globals": "^1.0.3",
"@types/eslint__eslintrc": "^2.1.2",
"@types/eslint__js": "^8.42.3",
"@types/gtag.js": "^0.0.20",
"@types/is-url": "^1.2.32",
"@types/jquery": "^3.3.31",
@@ -139,6 +144,7 @@
"eslint-plugin-import": "^2.22.0",
"eslint-plugin-no-jquery": "^3.0.2",
"eslint-plugin-unicorn": "^56.0.0",
"globals": "^13.24.0",
"jsdom": "^25.0.0",
"mockdate": "^3.0.2",
"nyc": "^17.0.0",
@@ -152,6 +158,7 @@
"svgo": "^3.0.0",
"swagger-parser": "^10.0.0",
"typescript": "^5.0.2",
"typescript-eslint": "^8.13.0",
"vnu-jar": "^24.10.17",
"webpack-dev-server": "^5.0.2",
"xvfb": "^0.4.0",

60
pnpm-lock.yaml generated
View File

@@ -302,6 +302,12 @@ importers:
'@babel/plugin-transform-modules-commonjs':
specifier: ^7.19.6
version: 7.25.9(@babel/core@7.26.0)
'@eslint/eslintrc':
specifier: ^2.1.4
version: 2.1.4
'@eslint/js':
specifier: ^8.57.1
version: 8.57.1
'@formatjs/cli':
specifier: ^6.0.0
version: 6.3.8
@@ -317,6 +323,15 @@ importers:
'@types/co-body':
specifier: ^6.1.3
version: 6.1.3
'@types/confusing-browser-globals':
specifier: ^1.0.3
version: 1.0.3
'@types/eslint__eslintrc':
specifier: ^2.1.2
version: 2.1.2
'@types/eslint__js':
specifier: ^8.42.3
version: 8.42.3
'@types/gtag.js':
specifier: ^0.0.20
version: 0.0.20
@@ -428,6 +443,9 @@ importers:
eslint-plugin-unicorn:
specifier: ^56.0.0
version: 56.0.0(eslint@8.57.1)
globals:
specifier: ^13.24.0
version: 13.24.0
jsdom:
specifier: ^25.0.0
version: 25.0.1
@@ -467,6 +485,9 @@ importers:
typescript:
specifier: ^5.0.2
version: 5.6.3
typescript-eslint:
specifier: ^8.13.0
version: 8.13.0(eslint@8.57.1)(typescript@5.6.3)
vnu-jar:
specifier: ^24.10.17
version: 24.10.17
@@ -2283,6 +2304,9 @@ packages:
'@types/co-body@6.1.3':
resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==}
'@types/confusing-browser-globals@1.0.3':
resolution: {integrity: sha512-q+6axdE3RyjrSsy2ONE4UpF89rwOfpoMBP3lqJ+OzLuOeYHwP+o2GITzuleKb1UT3FSYybO8QmeACgyHleu2CA==}
'@types/connect-history-api-fallback@1.5.4':
resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==}
@@ -2307,6 +2331,12 @@ packages:
'@types/eslint@9.6.1':
resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
'@types/eslint__eslintrc@2.1.2':
resolution: {integrity: sha512-qXvzPFY7Rz05xD8ZApXJ3S8xStQD2Ibzu3EFIF0UMNOAfLY5xUu3H61q0JrHo2OXD6rcFG75yUxNQbkKtFKBSw==}
'@types/eslint__js@8.42.3':
resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==}
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
@@ -8333,6 +8363,15 @@ packages:
typescript-auto-import-cache@0.3.5:
resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==}
typescript-eslint@8.13.0:
resolution: {integrity: sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
typescript@5.6.3:
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
@@ -11099,6 +11138,8 @@ snapshots:
'@types/node': 22.9.0
'@types/qs': 6.9.17
'@types/confusing-browser-globals@1.0.3': {}
'@types/connect-history-api-fallback@1.5.4':
dependencies:
'@types/express-serve-static-core': 5.0.1
@@ -11133,6 +11174,14 @@ snapshots:
'@types/estree': 1.0.6
'@types/json-schema': 7.0.15
'@types/eslint__eslintrc@2.1.2':
dependencies:
'@types/eslint': 9.6.1
'@types/eslint__js@8.42.3':
dependencies:
'@types/eslint': 9.6.1
'@types/estree-jsx@1.0.5':
dependencies:
'@types/estree': 1.0.6
@@ -18625,6 +18674,17 @@ snapshots:
dependencies:
semver: 7.6.3
typescript-eslint@8.13.0(eslint@8.57.1)(typescript@5.6.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)
'@typescript-eslint/parser': 8.13.0(eslint@8.57.1)(typescript@5.6.3)
'@typescript-eslint/utils': 8.13.0(eslint@8.57.1)(typescript@5.6.3)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- eslint
- supports-color
typescript@5.6.3: {}
uglify-js@3.19.3:

View File

@@ -49,4 +49,4 @@ API_FEATURE_LEVEL = 322 # Last bumped for adding users to groups using invitati
# historical commits sharing the same major version, in which case a
# minor version bump suffices.
PROVISION_VERSION = (303, 0) # bumped 2024-11-18 for types-defusedxml
PROVISION_VERSION = (303, 1) # bumped 2024-11-26 for flat ESLint config