diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f079026d77..0000000000 --- a/.eslintignore +++ /dev/null @@ -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 diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 4467b70ccb..0000000000 --- a/.eslintrc.cjs +++ /dev/null @@ -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: { - // Don’t require ES features that PhantomJS doesn’t 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, - }, - }, - ], -}; diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000..3ec6528e47 --- /dev/null +++ b/eslint.config.js @@ -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", + }, + }, +]; diff --git a/package.json b/package.json index b631e1b6cd..f01d435038 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a92ad18271..c543361671 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: diff --git a/version.py b/version.py index 2d79d49896..4018fb8b28 100644 --- a/version.py +++ b/version.py @@ -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