From 8afcc54fcea93a080e563fb7aa67a6e583bcc7e5 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Thu, 9 Oct 2025 17:11:07 -0700 Subject: [PATCH 1/7] build(eslint-config-fluid): migrate from eslint-plugin-import to eslint-plugin-import-x Migrate to eslint-plugin-import-x as eslint-plugin-import is no longer maintained. Updated all references in config files and dependencies. --- common/build/eslint-config-fluid/base.js | 34 ++++---- .../eslint-config-fluid/minimal-deprecated.js | 34 ++++---- common/build/eslint-config-fluid/package.json | 2 +- .../build/eslint-config-fluid/pnpm-lock.yaml | 81 +++++++------------ .../printed-configs/default.json | 59 +++++++------- .../printed-configs/minimal.json | 59 +++++++------- .../printed-configs/react.json | 59 +++++++------- .../printed-configs/recommended.json | 59 +++++++------- .../printed-configs/strict-biome.json | 59 +++++++------- .../printed-configs/strict.json | 59 +++++++------- .../printed-configs/test.json | 59 +++++++------- .../scripts/cleanup-printed-configs.js | 8 +- 12 files changed, 294 insertions(+), 278 deletions(-) diff --git a/common/build/eslint-config-fluid/base.js b/common/build/eslint-config-fluid/base.js index 49bd60432559..259020892ded 100644 --- a/common/build/eslint-config-fluid/base.js +++ b/common/build/eslint-config-fluid/base.js @@ -19,9 +19,9 @@ module.exports = { "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended-type-checked", "plugin:@typescript-eslint/stylistic-type-checked", - // import/recommended is the combination of import/errors and import/warnings - "plugin:import/recommended", - "plugin:import/typescript", + // import-x/recommended is the combination of import-x/errors and import-x/warnings + "plugin:import-x/recommended", + "plugin:import-x/typescript", ], globals: { Atomics: "readonly", @@ -36,7 +36,7 @@ module.exports = { sourceType: "module", project: "./tsconfig.json", }, - plugins: ["import", "unicorn"], + plugins: ["import-x", "unicorn"], reportUnusedDisableDirectives: true, rules: { // These rules were deprecated, then removed in `@typescript-eslint/eslint-plugin` v8. @@ -167,21 +167,21 @@ module.exports = { }, ], - // #region eslint-plugin-import + // #region eslint-plugin-import-x - "import/no-default-export": "error", - "import/no-deprecated": "off", - "import/no-extraneous-dependencies": "error", - "import/no-internal-modules": "error", - "import/no-unassigned-import": "error", - "import/no-unresolved": [ + "import-x/no-default-export": "error", + "import-x/no-deprecated": "off", + "import-x/no-extraneous-dependencies": "error", + "import-x/no-internal-modules": "error", + "import-x/no-unassigned-import": "error", + "import-x/no-unresolved": [ "error", { caseSensitive: true, }, ], - "import/no-unused-modules": "error", - "import/order": [ + "import-x/no-unused-modules": "error", + "import-x/order": [ "error", { "newlines-between": "always", @@ -372,12 +372,12 @@ module.exports = { }, ], settings: { - "import/extensions": [".ts", ".tsx", ".d.ts", ".js", ".jsx"], - "import/parsers": { + "import-x/extensions": [".ts", ".tsx", ".d.ts", ".js", ".jsx"], + "import-x/parsers": { "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts"], }, - "import/resolver": { - // See remark in minimal-deprecated.js on the importance of import/resolver key order. + "import-x/resolver": { + // See remark in minimal-deprecated.js on the importance of import-x/resolver key order. node: { extensions: [".ts", ".tsx", ".d.ts", ".js", ".jsx"], }, diff --git a/common/build/eslint-config-fluid/minimal-deprecated.js b/common/build/eslint-config-fluid/minimal-deprecated.js index 14859f9da05d..e2c54fc65ecb 100644 --- a/common/build/eslint-config-fluid/minimal-deprecated.js +++ b/common/build/eslint-config-fluid/minimal-deprecated.js @@ -72,9 +72,9 @@ module.exports = { extends: [ "./base", "plugin:eslint-comments/recommended", - "plugin:import/errors", - "plugin:import/warnings", - "plugin:import/typescript", + "plugin:import-x/errors", + "plugin:import-x/warnings", + "plugin:import-x/typescript", "prettier", ], globals: { @@ -181,7 +181,7 @@ module.exports = { ], "eqeqeq": ["error", "smart"], - "import/no-deprecated": "error", + "import-x/no-deprecated": "error", "max-len": [ "error", { @@ -411,13 +411,13 @@ module.exports = { * By default, libraries should not take dependencies on node libraries. * This rule can be disabled at the project level for libraries that are intended to be used only in node. */ - "import/no-nodejs-modules": ["error"], + "import-x/no-nodejs-modules": ["error"], /** * Allow Fluid Framework to import from its own internal packages. - * https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/no-internal-modules.md + * https://github.com/un-ts/eslint-plugin-import-x/blob/master/docs/rules/no-internal-modules.md */ - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { allow: permittedImports, @@ -467,8 +467,8 @@ module.exports = { rules: { "@typescript-eslint/no-invalid-this": "off", "@typescript-eslint/unbound-method": "off", // This rule has false positives in many of our test projects. - "import/no-nodejs-modules": "off", // Node libraries are OK for test files. - "import/no-deprecated": "off", // Deprecated APIs are OK to use in test files. + "import-x/no-nodejs-modules": "off", // Node libraries are OK for test files. + "import-x/no-deprecated": "off", // Deprecated APIs are OK to use in test files. // Disabled for test files "@typescript-eslint/consistent-type-exports": "off", @@ -482,7 +482,7 @@ module.exports = { ], // For test files only, additionally allow import of '/test*' and '/internal/test*' exports. - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { allow: ["@fluid*/*/test*", "@fluid*/*/internal/test*"].concat( @@ -492,23 +492,23 @@ module.exports = { ], // Test code may leverage dev dependencies - "import/no-extraneous-dependencies": ["error", { devDependencies: true }], + "import-x/no-extraneous-dependencies": ["error", { devDependencies: true }], }, }, ], settings: { - "import/extensions": [".ts", ".tsx", ".d.ts", ".js", ".jsx"], - "import/parsers": { + "import-x/extensions": [".ts", ".tsx", ".d.ts", ".js", ".jsx"], + "import-x/parsers": { "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts"], }, - "import/resolver": { + "import-x/resolver": { /** - * Note: the key order of import/resolver is relevant in the completely resolved eslint config (see ./printed-configs). + * Note: the key order of import-x/resolver is relevant in the completely resolved eslint config (see ./printed-configs). * Resolvers are tried in key order, and the first one to successfully resolve the import wins. See: - * https://github.com/import-js/eslint-plugin-import/blob/c0ac54b8a721c2b1c9048838acc4d6282f4fe7a7/utils/resolve.js#L196 + * https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/utils/resolve.ts * * It's important that the typescript resolver is first, as the node resolver legitimately resolves some imports to modules - * with stripped type information, which can cause silent negatives in lint rules. For example, import/no-deprecated fails + * with stripped type information, which can cause silent negatives in lint rules. For example, import-x/no-deprecated fails * to lint against import and usage of deprecated types when the import is resolvable and resolved using the node resolver. */ typescript: { diff --git a/common/build/eslint-config-fluid/package.json b/common/build/eslint-config-fluid/package.json index ff749f14779d..372399c2ce2c 100644 --- a/common/build/eslint-config-fluid/package.json +++ b/common/build/eslint-config-fluid/package.json @@ -39,7 +39,7 @@ "eslint-config-prettier": "~10.1.8", "eslint-import-resolver-typescript": "~4.4.4", "eslint-plugin-eslint-comments": "~3.2.0", - "eslint-plugin-import": "npm:eslint-plugin-i@~2.29.1", + "eslint-plugin-import-x": "~4.16.1", "eslint-plugin-jsdoc": "~55.0.2", "eslint-plugin-promise": "~7.2.1", "eslint-plugin-react": "~7.37.5", diff --git a/common/build/eslint-config-fluid/pnpm-lock.yaml b/common/build/eslint-config-fluid/pnpm-lock.yaml index 3e830d90f8ef..254a823eb49c 100644 --- a/common/build/eslint-config-fluid/pnpm-lock.yaml +++ b/common/build/eslint-config-fluid/pnpm-lock.yaml @@ -37,13 +37,13 @@ importers: version: 10.1.8(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ~4.4.4 - version: 4.4.4(eslint-plugin-i@2.29.1)(eslint@8.57.1) + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.31.1(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-eslint-comments: specifier: ~3.2.0 version: 3.2.0(eslint@8.57.1) - eslint-plugin-import: - specifier: npm:eslint-plugin-i@~2.29.1 - version: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) + eslint-plugin-import-x: + specifier: ~4.16.1 + version: 4.16.1(@typescript-eslint/utils@8.31.1(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) eslint-plugin-jsdoc: specifier: ~55.0.2 version: 55.0.2(eslint@8.57.1) @@ -907,39 +907,24 @@ packages: eslint-plugin-import-x: optional: true - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-plugin-eslint-comments@3.2.0: resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' - eslint-plugin-i@2.29.1: - resolution: {integrity: sha512-ORizX37MelIWLbMyqI7hi8VJMf7A0CskMmYkB+lkCX3aF4pkGV7kwx5bSEb4qx7Yce2rAf9s34HqDRPjGRZPNQ==} - engines: {node: '>=12'} - deprecated: Please migrate to the brand new `eslint-plugin-import-x` instead + eslint-plugin-import-x@4.16.1: + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.2.0 || ^8 + '@typescript-eslint/utils': ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true eslint-plugin-jsdoc@55.0.2: resolution: {integrity: sha512-0ydpGUvxEhMNEKofmlBRgo2VFA4oBMF5TDOwG/LocQOW+dyOLuM/Hzvd3QAHVzTiK0KO4Dq/PLt3XXWiGXar+Q==} @@ -3040,6 +3025,7 @@ snapshots: debug@3.2.7: dependencies: ms: 2.1.3 + optional: true debug@4.3.4(supports-color@8.1.1): dependencies: @@ -3268,8 +3254,9 @@ snapshots: resolve: 1.22.6 transitivePeerDependencies: - supports-color + optional: true - eslint-import-resolver-typescript@4.4.4(eslint-plugin-i@2.29.1)(eslint@8.57.1): + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.31.1(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 4.4.1 eslint: 8.57.1 @@ -3280,18 +3267,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.4.5) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 4.4.4(eslint-plugin-i@2.29.1)(eslint@8.57.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.31.1(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -3301,21 +3277,22 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.31.1(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: + '@typescript-eslint/types': 8.42.0 + comment-parser: 1.4.1 debug: 4.4.1 - doctrine: 3.0.0 eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@8.57.1) - get-tsconfig: 4.10.1 + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 9.0.5 semver: 7.7.2 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + '@typescript-eslint/utils': 8.31.1(eslint@8.57.1)(typescript@5.4.5) + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - supports-color eslint-plugin-jsdoc@55.0.2(eslint@8.57.1): diff --git a/common/build/eslint-config-fluid/printed-configs/default.json b/common/build/eslint-config-fluid/printed-configs/default.json index e8c40438c22c..893372224e3f 100644 --- a/common/build/eslint-config-fluid/printed-configs/default.json +++ b/common/build/eslint-config-fluid/printed-configs/default.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1154,31 +1154,31 @@ "implicit-arrow-linebreak": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "error" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error" ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1193,29 +1193,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "error" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1225,6 +1227,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -2315,27 +2319,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2361,9 +2367,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/printed-configs/minimal.json b/common/build/eslint-config-fluid/printed-configs/minimal.json index 337ab0ce38a4..199455ecd1e6 100644 --- a/common/build/eslint-config-fluid/printed-configs/minimal.json +++ b/common/build/eslint-config-fluid/printed-configs/minimal.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unicorn", "unused-imports", @@ -1135,31 +1135,31 @@ "implicit-arrow-linebreak": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "error" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error" ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1174,29 +1174,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "error" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1206,6 +1208,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -1985,27 +1989,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2031,9 +2037,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/printed-configs/react.json b/common/build/eslint-config-fluid/printed-configs/react.json index c9a0ea222368..c235aacbe7a4 100644 --- a/common/build/eslint-config-fluid/printed-configs/react.json +++ b/common/build/eslint-config-fluid/printed-configs/react.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1156,31 +1156,31 @@ "implicit-arrow-linebreak": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "error" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error" ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1195,29 +1195,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "error" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1227,6 +1229,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -2389,27 +2393,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2435,9 +2441,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/printed-configs/recommended.json b/common/build/eslint-config-fluid/printed-configs/recommended.json index e8c40438c22c..893372224e3f 100644 --- a/common/build/eslint-config-fluid/printed-configs/recommended.json +++ b/common/build/eslint-config-fluid/printed-configs/recommended.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1154,31 +1154,31 @@ "implicit-arrow-linebreak": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "error" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error" ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1193,29 +1193,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "error" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1225,6 +1227,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -2315,27 +2319,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2361,9 +2367,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/printed-configs/strict-biome.json b/common/build/eslint-config-fluid/printed-configs/strict-biome.json index 837673b1bd67..86fa2e44c974 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict-biome.json +++ b/common/build/eslint-config-fluid/printed-configs/strict-biome.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1233,31 +1233,31 @@ "import-access/eslint-plugin-import-access": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "error" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error" ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1272,29 +1272,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "error" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1304,6 +1306,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -2630,27 +2634,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2676,9 +2682,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/printed-configs/strict.json b/common/build/eslint-config-fluid/printed-configs/strict.json index 17d4ad1e3fd9..ce0923a268ce 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict.json +++ b/common/build/eslint-config-fluid/printed-configs/strict.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1164,31 +1164,31 @@ "implicit-arrow-linebreak": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "error" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error" ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1203,29 +1203,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "error" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1235,6 +1237,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -2354,27 +2358,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2400,9 +2406,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/printed-configs/test.json b/common/build/eslint-config-fluid/printed-configs/test.json index 7d0c284e0209..88f05b220991 100644 --- a/common/build/eslint-config-fluid/printed-configs/test.json +++ b/common/build/eslint-config-fluid/printed-configs/test.json @@ -22,7 +22,7 @@ }, "plugins": [ "eslint-comments", - "import", + "import-x", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1145,34 +1145,34 @@ "implicit-arrow-linebreak": [ "off" ], - "import/default": [ + "import-x/default": [ 2 ], - "import/export": [ + "import-x/export": [ 2 ], - "import/named": [ + "import-x/named": [ "off" ], - "import/namespace": [ + "import-x/namespace": [ 2 ], - "import/no-default-export": [ + "import-x/no-default-export": [ "error" ], - "import/no-deprecated": [ + "import-x/no-deprecated": [ "off" ], - "import/no-duplicates": [ + "import-x/no-duplicates": [ 1 ], - "import/no-extraneous-dependencies": [ + "import-x/no-extraneous-dependencies": [ "error", { "devDependencies": true } ], - "import/no-internal-modules": [ + "import-x/no-internal-modules": [ "error", { "allow": [ @@ -1189,29 +1189,31 @@ ] } ], - "import/no-named-as-default": [ + "import-x/no-named-as-default": [ 1 ], - "import/no-named-as-default-member": [ + "import-x/no-named-as-default-member": [ 1 ], - "import/no-nodejs-modules": [ + "import-x/no-nodejs-modules": [ "off" ], - "import/no-unassigned-import": [ + "import-x/no-rename-default": [ + 1 + ], + "import-x/no-unassigned-import": [ "error" ], - "import/no-unresolved": [ + "import-x/no-unresolved": [ 2, { - "caseSensitive": true, - "caseSensitiveStrict": false + "caseSensitive": true } ], - "import/no-unused-modules": [ + "import-x/no-unused-modules": [ "error" ], - "import/order": [ + "import-x/order": [ "error", { "newlines-between": "always", @@ -1221,6 +1223,8 @@ "orderImportKind": "ignore" }, "distinctGroup": true, + "sortTypesGroup": false, + "named": false, "warnOnUnassignedImports": false } ], @@ -2311,27 +2315,29 @@ ] }, "settings": { - "import/extensions": [ + "import-x/extensions": [ ".ts", ".tsx", ".d.ts", ".js", ".jsx", - ".jsx" + ".jsx", + ".cjs", + ".mjs" ], - "import/external-module-folders": [ + "import-x/external-module-folders": [ "node_modules", "node_modules/@types" ], - "import/parsers": { + "import-x/parsers": { "@typescript-eslint/parser": [ ".ts", ".tsx", ".d.ts", - ".tsx" + ".mts" ] }, - "import/resolver": { + "import-x/resolver": { "typescript": { "extensions": [ ".ts", @@ -2357,9 +2363,8 @@ "node": { "extensions": [ ".ts", - ".cts", - ".mts", ".tsx", + ".d.ts", ".js", ".jsx" ] diff --git a/common/build/eslint-config-fluid/scripts/cleanup-printed-configs.js b/common/build/eslint-config-fluid/scripts/cleanup-printed-configs.js index 070519966457..0f336066911c 100644 --- a/common/build/eslint-config-fluid/scripts/cleanup-printed-configs.js +++ b/common/build/eslint-config-fluid/scripts/cleanup-printed-configs.js @@ -14,6 +14,10 @@ const sortJson = require("sort-json"); for (const file of files) { const filePath = path.join(sourcePath, file); + const stat = await fs.promises.stat(filePath); + if (stat.isDirectory()) { + continue; + } const content = fs.readFileSync(filePath); const json = JSON.parse(content); @@ -27,8 +31,8 @@ const sortJson = require("sort-json"); // Sorting at all is desirable as otherwise changes in the order of common config references may cause large diffs // with little semantic meaning. // On the other hand, fully sorting the json can be misleading: - // some eslint settings depend on object key order ("import/resolver" being a known one, see - // https://github.com/import-js/eslint-plugin-import/blob/c0ac54b8a721c2b1c9048838acc4d6282f4fe7a7/utils/resolve.js). + // some eslint settings depend on object key order ("import-x/resolver" being a known one, see + // https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/utils/resolve.ts). // Using depth 2 is a nice compromise. sortJson.overwrite(filePath, { indentSize: 4, depth: 2 }); } From e9e0016311e5dc2f69206e596cc8ca13a50c1da0 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Thu, 9 Oct 2025 17:37:15 -0700 Subject: [PATCH 2/7] changelog --- common/build/eslint-config-fluid/CHANGELOG.md | 8 ++++++++ common/build/eslint-config-fluid/package.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/common/build/eslint-config-fluid/CHANGELOG.md b/common/build/eslint-config-fluid/CHANGELOG.md index 148824237470..99b9f9dd76b0 100644 --- a/common/build/eslint-config-fluid/CHANGELOG.md +++ b/common/build/eslint-config-fluid/CHANGELOG.md @@ -1,5 +1,13 @@ # @fluidframework/eslint-config-fluid Changelog +## [8.0.0](https://github.com/microsoft/FluidFramework/releases/tag/eslint-config-fluid_v8.0_0) + +### eslint-plugin-eslint-comments replaced by @eslint-community/eslint-plugin-eslint-comments + +The package now uses rules from [eslint-plugin-import-x](https://github.com/un-ts/eslint-plugin-import-x) instead of +eslint-plugin-import. Integrating this change will require renaming eslint disable comments and overrides, but the +changes are mechanical. + ## [7.0.0](https://github.com/microsoft/FluidFramework/releases/tag/eslint-config-fluid_v7.0_0) ### New Rules diff --git a/common/build/eslint-config-fluid/package.json b/common/build/eslint-config-fluid/package.json index 372399c2ce2c..0e12697a5f33 100644 --- a/common/build/eslint-config-fluid/package.json +++ b/common/build/eslint-config-fluid/package.json @@ -1,6 +1,6 @@ { "name": "@fluidframework/eslint-config-fluid", - "version": "7.0.0", + "version": "8.0.0", "description": "Shareable ESLint config for the Fluid Framework", "homepage": "https://fluidframework.com", "repository": { From e068f3d67f208cb371bb5145a2426823da313d20 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Mon, 13 Oct 2025 14:47:38 -0700 Subject: [PATCH 3/7] feedback --- common/build/eslint-config-fluid/CHANGELOG.md | 2 +- common/build/eslint-config-fluid/base.js | 44 +++++++++++++++-- .../eslint-config-fluid/minimal-deprecated.js | 48 +------------------ .../printed-configs/default.json | 34 ++++++------- .../printed-configs/minimal.json | 34 ++++++------- .../printed-configs/react.json | 34 ++++++------- .../printed-configs/recommended.json | 34 ++++++------- .../printed-configs/strict-biome.json | 34 ++++++------- .../printed-configs/strict.json | 34 ++++++------- .../printed-configs/test.json | 34 ++++++------- 10 files changed, 142 insertions(+), 190 deletions(-) diff --git a/common/build/eslint-config-fluid/CHANGELOG.md b/common/build/eslint-config-fluid/CHANGELOG.md index 99b9f9dd76b0..8fb56f59e658 100644 --- a/common/build/eslint-config-fluid/CHANGELOG.md +++ b/common/build/eslint-config-fluid/CHANGELOG.md @@ -2,7 +2,7 @@ ## [8.0.0](https://github.com/microsoft/FluidFramework/releases/tag/eslint-config-fluid_v8.0_0) -### eslint-plugin-eslint-comments replaced by @eslint-community/eslint-plugin-eslint-comments +### eslint-plugin-import replaced by eslint-plugin-import-x The package now uses rules from [eslint-plugin-import-x](https://github.com/un-ts/eslint-plugin-import-x) instead of eslint-plugin-import. Integrating this change will require renaming eslint disable comments and overrides, but the diff --git a/common/build/eslint-config-fluid/base.js b/common/build/eslint-config-fluid/base.js index 259020892ded..d35b688291de 100644 --- a/common/build/eslint-config-fluid/base.js +++ b/common/build/eslint-config-fluid/base.js @@ -3,6 +3,8 @@ * Licensed under the MIT License. */ +const { createTypeScriptImportResolver } = require("eslint-import-resolver-typescript"); + /** * Base configuration from which all of our exported configs extends. */ @@ -376,10 +378,46 @@ module.exports = { "import-x/parsers": { "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts"], }, + "import-x/resolver-next": [createTypeScriptImportResolver()], "import-x/resolver": { - // See remark in minimal-deprecated.js on the importance of import-x/resolver key order. - node: { - extensions: [".ts", ".tsx", ".d.ts", ".js", ".jsx"], + /** + * Note: the key order of import-x/resolver is relevant in the completely resolved eslint config (see ./printed-configs). + * Resolvers are tried in key order, and the first one to successfully resolve the import wins. See: + * https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/utils/resolve.ts + * + * It's important that the typescript resolver is first, as the node resolver legitimately resolves some imports to modules + * with stripped type information, which can cause silent negatives in lint rules. For example, import-x/no-deprecated fails + * to lint against import and usage of deprecated types when the import is resolvable and resolved using the node resolver. + */ + typescript: { + extensions: [ + // `.mts`, `.cts`, `.d.mts`, `.d.cts`, `.mjs`, `.cjs` are not included because `.cjs` and `.mjs` must be used + // explicitly in imports + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ], + conditionNames: [ + // This supports the test-only conditional export pattern used in merge-tree and id-compressor. + "allow-ff-test-exports", + + // Default condition names below, see https://github.com/import-js/eslint-import-resolver-typescript#conditionnames + "types", + "import", + + // APF: https://angular.io/guide/angular-package-format + "esm2020", + "es2020", + "es2015", + + "require", + "node", + "node-addons", + "browser", + "default", + ], }, }, }, diff --git a/common/build/eslint-config-fluid/minimal-deprecated.js b/common/build/eslint-config-fluid/minimal-deprecated.js index e2c54fc65ecb..cbe955554a6c 100644 --- a/common/build/eslint-config-fluid/minimal-deprecated.js +++ b/common/build/eslint-config-fluid/minimal-deprecated.js @@ -69,14 +69,7 @@ module.exports = { es2024: false, node: true, }, - extends: [ - "./base", - "plugin:eslint-comments/recommended", - "plugin:import-x/errors", - "plugin:import-x/warnings", - "plugin:import-x/typescript", - "prettier", - ], + extends: ["./base", "plugin:eslint-comments/recommended", "prettier"], globals: { Atomics: "readonly", SharedArrayBuffer: "readonly", @@ -497,44 +490,7 @@ module.exports = { }, ], settings: { - "import-x/extensions": [".ts", ".tsx", ".d.ts", ".js", ".jsx"], - "import-x/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts"], - }, - "import-x/resolver": { - /** - * Note: the key order of import-x/resolver is relevant in the completely resolved eslint config (see ./printed-configs). - * Resolvers are tried in key order, and the first one to successfully resolve the import wins. See: - * https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/utils/resolve.ts - * - * It's important that the typescript resolver is first, as the node resolver legitimately resolves some imports to modules - * with stripped type information, which can cause silent negatives in lint rules. For example, import-x/no-deprecated fails - * to lint against import and usage of deprecated types when the import is resolvable and resolved using the node resolver. - */ - typescript: { - extensions: [".ts", ".tsx", ".d.ts", ".js", ".jsx"], - conditionNames: [ - // This supports the test-only conditional export pattern used in merge-tree and id-compressor. - "allow-ff-test-exports", - - // Default condition names below, see https://www.npmjs.com/package/eslint-import-resolver-typescript#conditionnames - "types", - "import", - - // APF: https://angular.io/guide/angular-package-format - "esm2020", - "es2020", - "es2015", - - "require", - "node", - "node-addons", - "browser", - "default", - ], - }, - }, - "jsdoc": { + jsdoc: { // The following are intended to keep js/jsx JSDoc comments in line with TSDoc syntax used in ts/tsx code. tagNamePreference: { arg: { diff --git a/common/build/eslint-config-fluid/printed-configs/default.json b/common/build/eslint-config-fluid/printed-configs/default.json index 893372224e3f..05b9ba2ba66a 100644 --- a/common/build/eslint-config-fluid/printed-configs/default.json +++ b/common/build/eslint-config-fluid/printed-configs/default.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1155,16 +1155,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1173,7 +1173,7 @@ "error" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error" @@ -1194,22 +1194,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "error" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2363,17 +2360,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/minimal.json b/common/build/eslint-config-fluid/printed-configs/minimal.json index 199455ecd1e6..93fa719103b6 100644 --- a/common/build/eslint-config-fluid/printed-configs/minimal.json +++ b/common/build/eslint-config-fluid/printed-configs/minimal.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unicorn", "unused-imports", @@ -1136,16 +1136,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1154,7 +1154,7 @@ "error" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error" @@ -1175,22 +1175,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "error" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2033,17 +2030,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/react.json b/common/build/eslint-config-fluid/printed-configs/react.json index c235aacbe7a4..02d26dc146b7 100644 --- a/common/build/eslint-config-fluid/printed-configs/react.json +++ b/common/build/eslint-config-fluid/printed-configs/react.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1157,16 +1157,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1175,7 +1175,7 @@ "error" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error" @@ -1196,22 +1196,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "error" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2437,17 +2434,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/recommended.json b/common/build/eslint-config-fluid/printed-configs/recommended.json index 893372224e3f..05b9ba2ba66a 100644 --- a/common/build/eslint-config-fluid/printed-configs/recommended.json +++ b/common/build/eslint-config-fluid/printed-configs/recommended.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1155,16 +1155,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1173,7 +1173,7 @@ "error" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error" @@ -1194,22 +1194,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "error" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2363,17 +2360,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/strict-biome.json b/common/build/eslint-config-fluid/printed-configs/strict-biome.json index 86fa2e44c974..6d413c0e00b7 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict-biome.json +++ b/common/build/eslint-config-fluid/printed-configs/strict-biome.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1234,16 +1234,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1252,7 +1252,7 @@ "error" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error" @@ -1273,22 +1273,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "error" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2678,17 +2675,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/strict.json b/common/build/eslint-config-fluid/printed-configs/strict.json index ce0923a268ce..64553c457ab2 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict.json +++ b/common/build/eslint-config-fluid/printed-configs/strict.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1165,16 +1165,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1183,7 +1183,7 @@ "error" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error" @@ -1204,22 +1204,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "error" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2402,17 +2399,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/test.json b/common/build/eslint-config-fluid/printed-configs/test.json index 88f05b220991..954186faa4ee 100644 --- a/common/build/eslint-config-fluid/printed-configs/test.json +++ b/common/build/eslint-config-fluid/printed-configs/test.json @@ -21,8 +21,8 @@ "sourceType": "module" }, "plugins": [ - "eslint-comments", "import-x", + "eslint-comments", "@fluid-internal/fluid", "unused-imports", "promise", @@ -1146,16 +1146,16 @@ "off" ], "import-x/default": [ - 2 + "error" ], "import-x/export": [ - 2 + "error" ], "import-x/named": [ "off" ], "import-x/namespace": [ - 2 + "error" ], "import-x/no-default-export": [ "error" @@ -1164,7 +1164,7 @@ "off" ], "import-x/no-duplicates": [ - 1 + "warn" ], "import-x/no-extraneous-dependencies": [ "error", @@ -1190,22 +1190,19 @@ } ], "import-x/no-named-as-default": [ - 1 + "warn" ], "import-x/no-named-as-default-member": [ - 1 + "warn" ], "import-x/no-nodejs-modules": [ "off" ], - "import-x/no-rename-default": [ - 1 - ], "import-x/no-unassigned-import": [ "error" ], "import-x/no-unresolved": [ - 2, + "error", { "caseSensitive": true } @@ -2359,17 +2356,14 @@ "browser", "default" ] - }, - "node": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" - ] } }, + "import-x/resolver-next": [ + { + "interfaceVersion": 3, + "name": "eslint-import-resolver-typescript" + } + ], "jsdoc": { "mode": "typescript", "tagNamePreference": { From 68eaf171b2fde2b92ecfeccbcaceae49411bd1d3 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Mon, 13 Oct 2025 16:20:57 -0700 Subject: [PATCH 4/7] updates --- common/build/eslint-config-fluid/base.js | 68 +++++----- .../eslint-config-fluid/minimal-deprecated.js | 2 +- .../printed-configs/default.json | 127 +++++++++++++++--- .../printed-configs/minimal.json | 127 +++++++++++++++--- .../printed-configs/react.json | 127 +++++++++++++++--- .../printed-configs/recommended.json | 127 +++++++++++++++--- .../printed-configs/strict-biome.json | 127 +++++++++++++++--- .../printed-configs/strict.json | 127 +++++++++++++++--- .../printed-configs/test.json | 127 +++++++++++++++--- 9 files changed, 802 insertions(+), 157 deletions(-) diff --git a/common/build/eslint-config-fluid/base.js b/common/build/eslint-config-fluid/base.js index d35b688291de..b3279cf72f39 100644 --- a/common/build/eslint-config-fluid/base.js +++ b/common/build/eslint-config-fluid/base.js @@ -3,7 +3,7 @@ * Licensed under the MIT License. */ -const { createTypeScriptImportResolver } = require("eslint-import-resolver-typescript"); +const tsResolver = require("eslint-import-resolver-typescript"); /** * Base configuration from which all of our exported configs extends. @@ -378,47 +378,41 @@ module.exports = { "import-x/parsers": { "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts"], }, - "import-x/resolver-next": [createTypeScriptImportResolver()], "import-x/resolver": { - /** - * Note: the key order of import-x/resolver is relevant in the completely resolved eslint config (see ./printed-configs). - * Resolvers are tried in key order, and the first one to successfully resolve the import wins. See: - * https://github.com/un-ts/eslint-plugin-import-x/blob/master/src/utils/resolve.ts - * - * It's important that the typescript resolver is first, as the node resolver legitimately resolves some imports to modules - * with stripped type information, which can cause silent negatives in lint rules. For example, import-x/no-deprecated fails - * to lint against import and usage of deprecated types when the import is resolvable and resolved using the node resolver. - */ - typescript: { - extensions: [ - // `.mts`, `.cts`, `.d.mts`, `.d.cts`, `.mjs`, `.cjs` are not included because `.cjs` and `.mjs` must be used - // explicitly in imports - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx", - ], - conditionNames: [ - // This supports the test-only conditional export pattern used in merge-tree and id-compressor. - "allow-ff-test-exports", + name: "tsResolver", + options: { + typescript: { + extensions: [ + // `.mts`, `.cts`, `.d.mts`, `.d.cts`, `.mjs`, `.cjs` are not included because `.cjs` and `.mjs` must be used + // explicitly in imports + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ], + conditionNames: [ + // This supports the test-only conditional export pattern used in merge-tree and id-compressor. + "allow-ff-test-exports", - // Default condition names below, see https://github.com/import-js/eslint-import-resolver-typescript#conditionnames - "types", - "import", + // Default condition names below, see https://github.com/import-js/eslint-import-resolver-typescript#conditionnames + "types", + "import", - // APF: https://angular.io/guide/angular-package-format - "esm2020", - "es2020", - "es2015", + // APF: https://angular.io/guide/angular-package-format + "esm2020", + "es2020", + "es2015", - "require", - "node", - "node-addons", - "browser", - "default", - ], + "require", + "node", + "node-addons", + "browser", + "default", + ], + }, }, + resolver: tsResolver, // required }, }, }; diff --git a/common/build/eslint-config-fluid/minimal-deprecated.js b/common/build/eslint-config-fluid/minimal-deprecated.js index cbe955554a6c..d1e4e10f1b32 100644 --- a/common/build/eslint-config-fluid/minimal-deprecated.js +++ b/common/build/eslint-config-fluid/minimal-deprecated.js @@ -4,7 +4,7 @@ */ /** - * Shared list of permitted imports for configuring and override the `import/no-internal-modules` rule. + * Shared list of permitted imports for configuring and override the `import-x/no-internal-modules` rule. */ const permittedImports = [ // Within Fluid Framework allow import of '/internal' from other FF packages. diff --git a/common/build/eslint-config-fluid/printed-configs/default.json b/common/build/eslint-config-fluid/printed-configs/default.json index 05b9ba2ba66a..70fd0e806b1a 100644 --- a/common/build/eslint-config-fluid/printed-configs/default.json +++ b/common/build/eslint-config-fluid/printed-configs/default.json @@ -2339,16 +2339,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2359,15 +2392,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/minimal.json b/common/build/eslint-config-fluid/printed-configs/minimal.json index 93fa719103b6..689d0cf05787 100644 --- a/common/build/eslint-config-fluid/printed-configs/minimal.json +++ b/common/build/eslint-config-fluid/printed-configs/minimal.json @@ -2009,16 +2009,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2029,15 +2062,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/react.json b/common/build/eslint-config-fluid/printed-configs/react.json index 02d26dc146b7..aeea57948b16 100644 --- a/common/build/eslint-config-fluid/printed-configs/react.json +++ b/common/build/eslint-config-fluid/printed-configs/react.json @@ -2413,16 +2413,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2433,15 +2466,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/recommended.json b/common/build/eslint-config-fluid/printed-configs/recommended.json index 05b9ba2ba66a..70fd0e806b1a 100644 --- a/common/build/eslint-config-fluid/printed-configs/recommended.json +++ b/common/build/eslint-config-fluid/printed-configs/recommended.json @@ -2339,16 +2339,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2359,15 +2392,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/strict-biome.json b/common/build/eslint-config-fluid/printed-configs/strict-biome.json index 6d413c0e00b7..85a13178f947 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict-biome.json +++ b/common/build/eslint-config-fluid/printed-configs/strict-biome.json @@ -2654,16 +2654,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2674,15 +2707,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/strict.json b/common/build/eslint-config-fluid/printed-configs/strict.json index 64553c457ab2..a55a89d94ea3 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict.json +++ b/common/build/eslint-config-fluid/printed-configs/strict.json @@ -2378,16 +2378,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2398,15 +2431,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { diff --git a/common/build/eslint-config-fluid/printed-configs/test.json b/common/build/eslint-config-fluid/printed-configs/test.json index 954186faa4ee..bb3cbbe6dd16 100644 --- a/common/build/eslint-config-fluid/printed-configs/test.json +++ b/common/build/eslint-config-fluid/printed-configs/test.json @@ -2335,16 +2335,49 @@ ] }, "import-x/resolver": { - "typescript": { - "extensions": [ - ".ts", - ".tsx", - ".d.ts", - ".js", - ".jsx" + "name": "tsResolver", + "options": { + "typescript": { + "extensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx" + ], + "conditionNames": [ + "allow-ff-test-exports", + "types", + "import", + "esm2020", + "es2020", + "es2015", + "require", + "node", + "node-addons", + "browser", + "default" + ] + } + }, + "resolver": { + "DEFAULT_CONFIGS": [ + "tsconfig.json", + "jsconfig.json" + ], + "DEFAULT_IGNORE": "**/node_modules/**", + "DEFAULT_JSCONFIG": "jsconfig.json", + "DEFAULT_TRY_PATHS": [ + "", + "tsconfig.json", + "jsconfig.json" ], - "conditionNames": [ - "allow-ff-test-exports", + "DEFAULT_TSCONFIG": "tsconfig.json", + "IMPORT_RESOLVER_NAME": "eslint-import-resolver-typescript", + "JS_EXT_PATTERN": {}, + "MATCH_ALL": "**", + "TSCONFIG_NOT_FOUND_REGEXP": {}, + "defaultConditionNames": [ "types", "import", "esm2020", @@ -2355,15 +2388,75 @@ "node-addons", "browser", "default" - ] - } + ], + "defaultExtensionAlias": { + ".js": [ + ".ts", + ".tsx", + ".d.ts", + ".js" + ], + ".ts": [ + ".ts", + ".d.ts", + ".js" + ], + ".jsx": [ + ".tsx", + ".d.ts", + ".jsx" + ], + ".tsx": [ + ".tsx", + ".d.ts", + ".jsx", + ".js" + ], + ".cjs": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".cts": [ + ".cts", + ".d.cts", + ".cjs" + ], + ".mjs": [ + ".mts", + ".d.mts", + ".mjs" + ], + ".mts": [ + ".mts", + ".d.mts", + ".mjs" + ] + }, + "defaultExtensions": [ + ".ts", + ".tsx", + ".d.ts", + ".js", + ".jsx", + ".json", + ".node" + ], + "defaultMainFields": [ + "types", + "typings", + "fesm2020", + "fesm2015", + "esm2020", + "es2020", + "module", + "jsnext:main", + "main" + ], + "interfaceVersion": 2 + }, + "typescript": true }, - "import-x/resolver-next": [ - { - "interfaceVersion": 3, - "name": "eslint-import-resolver-typescript" - } - ], "jsdoc": { "mode": "typescript", "tagNamePreference": { From 13cd01139b23728fe73faac45857aa31e810aed3 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Mon, 13 Oct 2025 16:30:38 -0700 Subject: [PATCH 5/7] add cts --- .../printed-configs/default.json | 1 + .../printed-configs/minimal.json | 1 + .../printed-configs/react.json | 1 + .../printed-configs/recommended.json | 1 + .../printed-configs/strict-biome.json | 1 + .../printed-configs/strict.json | 1 + .../printed-configs/test.json | 1 + package.json | 18 +++++++++++++++++- 8 files changed, 24 insertions(+), 1 deletion(-) diff --git a/common/build/eslint-config-fluid/printed-configs/default.json b/common/build/eslint-config-fluid/printed-configs/default.json index 70fd0e806b1a..c42f683dbc7d 100644 --- a/common/build/eslint-config-fluid/printed-configs/default.json +++ b/common/build/eslint-config-fluid/printed-configs/default.json @@ -2335,6 +2335,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/common/build/eslint-config-fluid/printed-configs/minimal.json b/common/build/eslint-config-fluid/printed-configs/minimal.json index 689d0cf05787..a81755cd7e01 100644 --- a/common/build/eslint-config-fluid/printed-configs/minimal.json +++ b/common/build/eslint-config-fluid/printed-configs/minimal.json @@ -2005,6 +2005,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/common/build/eslint-config-fluid/printed-configs/react.json b/common/build/eslint-config-fluid/printed-configs/react.json index aeea57948b16..4a84304af8ce 100644 --- a/common/build/eslint-config-fluid/printed-configs/react.json +++ b/common/build/eslint-config-fluid/printed-configs/react.json @@ -2409,6 +2409,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/common/build/eslint-config-fluid/printed-configs/recommended.json b/common/build/eslint-config-fluid/printed-configs/recommended.json index 70fd0e806b1a..c42f683dbc7d 100644 --- a/common/build/eslint-config-fluid/printed-configs/recommended.json +++ b/common/build/eslint-config-fluid/printed-configs/recommended.json @@ -2335,6 +2335,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/common/build/eslint-config-fluid/printed-configs/strict-biome.json b/common/build/eslint-config-fluid/printed-configs/strict-biome.json index 85a13178f947..403ac0a11557 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict-biome.json +++ b/common/build/eslint-config-fluid/printed-configs/strict-biome.json @@ -2650,6 +2650,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/common/build/eslint-config-fluid/printed-configs/strict.json b/common/build/eslint-config-fluid/printed-configs/strict.json index a55a89d94ea3..a73b22262417 100644 --- a/common/build/eslint-config-fluid/printed-configs/strict.json +++ b/common/build/eslint-config-fluid/printed-configs/strict.json @@ -2374,6 +2374,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/common/build/eslint-config-fluid/printed-configs/test.json b/common/build/eslint-config-fluid/printed-configs/test.json index bb3cbbe6dd16..51019cca88bd 100644 --- a/common/build/eslint-config-fluid/printed-configs/test.json +++ b/common/build/eslint-config-fluid/printed-configs/test.json @@ -2331,6 +2331,7 @@ ".ts", ".tsx", ".d.ts", + ".cts", ".mts" ] }, diff --git a/package.json b/package.json index 8eeb9195872e..83c114f2695c 100644 --- a/package.json +++ b/package.json @@ -369,7 +369,23 @@ "@fluentui/react-positioning>@floating-ui/dom": "~1.5.4", "oclif>@aws-sdk/client-cloudfront": "npm:empty-npm-package@1.0.0", "oclif>@aws-sdk/client-s3": "npm:empty-npm-package@1.0.0", - "axios@<0.30.0": "^0.30.0" + "axios@<0.30.0": "^0.30.0", + "@fluidframework/eslint-config-fluid": "file:./common/build/eslint-config-fluid/fluidframework-eslint-config-fluid-8.0.0.tgz", + "eslint-config-biome": "~2.1.3", + "eslint-config-prettier": "~10.1.8", + "eslint-import-resolver-typescript": "~4.4.4", + "eslint-plugin-eslint-comments": "~3.2.0", + "eslint-plugin-import-x": "~4.16.1", + "eslint-plugin-jsdoc": "~55.0.2", + "eslint-plugin-promise": "~7.2.1", + "eslint-plugin-react": "~7.37.5", + "eslint-plugin-react-hooks": "~5.2.0", + "eslint-plugin-tsdoc": "~0.4.0", + "eslint-plugin-unicorn": "~48.0.1", + "eslint-plugin-unused-imports": "~4.2.0", + "@typescript-eslint/eslint-plugin": "~7.18.0", + "@typescript-eslint/parser": "~7.18.0", + "eslint": "~8.57.0" }, "peerDependencyComments": [ "The react-split-pane package used by devtools-view has a peer dependency on React 16, but it doesn't seem to be maintained and it works fine with React 18. TODO: AB#18876", From 0b10df540e66c55161aec382d63a26a9111dcb72 Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Mon, 13 Oct 2025 16:35:31 -0700 Subject: [PATCH 6/7] missed file --- common/build/eslint-config-fluid/base.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build/eslint-config-fluid/base.js b/common/build/eslint-config-fluid/base.js index b3279cf72f39..49af6f018cf8 100644 --- a/common/build/eslint-config-fluid/base.js +++ b/common/build/eslint-config-fluid/base.js @@ -376,7 +376,7 @@ module.exports = { settings: { "import-x/extensions": [".ts", ".tsx", ".d.ts", ".js", ".jsx"], "import-x/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts"], + "@typescript-eslint/parser": [".ts", ".tsx", ".d.ts", ".cts", ".mts"], }, "import-x/resolver": { name: "tsResolver", From 56f801c933e9521420e307f80aa8b8e7e50f4efc Mon Sep 17 00:00:00 2001 From: Tyler Butler Date: Mon, 13 Oct 2025 17:10:39 -0700 Subject: [PATCH 7/7] Apply suggestion from @tylerbutler --- package.json | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/package.json b/package.json index 83c114f2695c..8eeb9195872e 100644 --- a/package.json +++ b/package.json @@ -369,23 +369,7 @@ "@fluentui/react-positioning>@floating-ui/dom": "~1.5.4", "oclif>@aws-sdk/client-cloudfront": "npm:empty-npm-package@1.0.0", "oclif>@aws-sdk/client-s3": "npm:empty-npm-package@1.0.0", - "axios@<0.30.0": "^0.30.0", - "@fluidframework/eslint-config-fluid": "file:./common/build/eslint-config-fluid/fluidframework-eslint-config-fluid-8.0.0.tgz", - "eslint-config-biome": "~2.1.3", - "eslint-config-prettier": "~10.1.8", - "eslint-import-resolver-typescript": "~4.4.4", - "eslint-plugin-eslint-comments": "~3.2.0", - "eslint-plugin-import-x": "~4.16.1", - "eslint-plugin-jsdoc": "~55.0.2", - "eslint-plugin-promise": "~7.2.1", - "eslint-plugin-react": "~7.37.5", - "eslint-plugin-react-hooks": "~5.2.0", - "eslint-plugin-tsdoc": "~0.4.0", - "eslint-plugin-unicorn": "~48.0.1", - "eslint-plugin-unused-imports": "~4.2.0", - "@typescript-eslint/eslint-plugin": "~7.18.0", - "@typescript-eslint/parser": "~7.18.0", - "eslint": "~8.57.0" + "axios@<0.30.0": "^0.30.0" }, "peerDependencyComments": [ "The react-split-pane package used by devtools-view has a peer dependency on React 16, but it doesn't seem to be maintained and it works fine with React 18. TODO: AB#18876",