From 7954d7b6d6d8b476f1595240625b31f2b50fd405 Mon Sep 17 00:00:00 2001 From: Aleksandar Grbic Date: Tue, 26 May 2026 22:03:55 +0200 Subject: [PATCH] feat: support ESLint 10 in react-component-architecture, resource-architecture, tanstack-query-cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ESLint 10 removed context.getFilename() (deprecated since v9). Replaced the 15 call sites across these three plugins with context.filename — the property API that has worked since ESLint 9. Widened the eslint peer to '^8.57.0 || ^9.0.0 || ^10.0.0'. No behavior change for v8/v9 consumers; v10 consumers stop hitting: TypeError: context.getFilename is not a function Build clean, tests green: 92 + 37 + 5 = 134 tests across the three plugins. Changeset attached for minor bumps. Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/eslint-10-support.md | 14 ++++++++++++++ .../package.json | 2 +- .../src/rules/componentFolderStructure.ts | 2 +- .../src/rules/githubActionsPermissions.ts | 2 +- .../src/rules/indexMustReexportDefault.ts | 2 +- .../src/rules/noCrossFeatureImports.ts | 2 +- .../src/rules/noInlineJsxFunctions.ts | 2 +- .../src/rules/noJsxComputation.ts | 2 +- .../src/rules/noStateInComponentBody.ts | 2 +- .../src/rules/noUntranslatedJsxText.ts | 2 +- .../src/rules/packageJsonExactDeps.ts | 2 +- .../src/rules/storiesRequireDefaultExport.ts | 2 +- eslint-plugin-resource-architecture/package.json | 2 +- .../src/rules/concernImportBoundaries.ts | 2 +- .../src/rules/filesMustBeResourcePrefixed.ts | 2 +- .../src/rules/noCrossResourceInternalImports.ts | 2 +- .../src/rules/pluggableProvidersMustHaveNoop.ts | 2 +- .../src/rules/serviceMustExportSingleton.ts | 2 +- eslint-plugin-tanstack-query-cache/package.json | 2 +- 19 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 .changeset/eslint-10-support.md diff --git a/.changeset/eslint-10-support.md b/.changeset/eslint-10-support.md new file mode 100644 index 0000000..8406e63 --- /dev/null +++ b/.changeset/eslint-10-support.md @@ -0,0 +1,14 @@ +--- +"@boring-stack-pkg/eslint-plugin-react-component-architecture": minor +"@boring-stack-pkg/eslint-plugin-resource-architecture": minor +"@boring-stack-pkg/eslint-plugin-tanstack-query-cache": minor +--- + +Support ESLint 10. + +ESLint 10 removed `context.getFilename()` (deprecated since v9). Switched +all rules in these three plugins to use the `context.filename` property +introduced in ESLint 9. + +Peer dependency widened to `^8.57.0 || ^9.0.0 || ^10.0.0`. ESLint 8.x +and 9.x consumers see no behavior change. diff --git a/eslint-plugin-react-component-architecture/package.json b/eslint-plugin-react-component-architecture/package.json index d332bdf..aba10b5 100644 --- a/eslint-plugin-react-component-architecture/package.json +++ b/eslint-plugin-react-component-architecture/package.json @@ -49,7 +49,7 @@ ], "peerDependencies": { "@typescript-eslint/parser": ">=8.0.0", - "eslint": "8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=5.0.0" }, "dependencies": { diff --git a/eslint-plugin-react-component-architecture/src/rules/componentFolderStructure.ts b/eslint-plugin-react-component-architecture/src/rules/componentFolderStructure.ts index b9ea6c4..0a3d730 100644 --- a/eslint-plugin-react-component-architecture/src/rules/componentFolderStructure.ts +++ b/eslint-plugin-react-component-architecture/src/rules/componentFolderStructure.ts @@ -71,7 +71,7 @@ export const componentFolderStructureRule = createRule< } ], create(context, [options]) { - const filename = context.getFilename(); + const filename = context.filename; if (!isComponentFile(filename)) { return {}; diff --git a/eslint-plugin-react-component-architecture/src/rules/githubActionsPermissions.ts b/eslint-plugin-react-component-architecture/src/rules/githubActionsPermissions.ts index 307e1aa..002653c 100644 --- a/eslint-plugin-react-component-architecture/src/rules/githubActionsPermissions.ts +++ b/eslint-plugin-react-component-architecture/src/rules/githubActionsPermissions.ts @@ -36,7 +36,7 @@ export const githubActionsPermissionsRule = createRule( }, defaultOptions: [], create(context) { - const filename = context.getFilename(); + const filename = context.filename; if ( !filename.endsWith(".yml") && diff --git a/eslint-plugin-react-component-architecture/src/rules/indexMustReexportDefault.ts b/eslint-plugin-react-component-architecture/src/rules/indexMustReexportDefault.ts index f6dd8e4..dd4e063 100644 --- a/eslint-plugin-react-component-architecture/src/rules/indexMustReexportDefault.ts +++ b/eslint-plugin-react-component-architecture/src/rules/indexMustReexportDefault.ts @@ -48,7 +48,7 @@ export const indexMustReexportDefaultRule = createRule( }, defaultOptions: [], create(context) { - const filename = context.getFilename(); + const filename = context.filename; if (!isIndexFile(filename)) { return {}; diff --git a/eslint-plugin-react-component-architecture/src/rules/noCrossFeatureImports.ts b/eslint-plugin-react-component-architecture/src/rules/noCrossFeatureImports.ts index a926a78..f4f2154 100644 --- a/eslint-plugin-react-component-architecture/src/rules/noCrossFeatureImports.ts +++ b/eslint-plugin-react-component-architecture/src/rules/noCrossFeatureImports.ts @@ -111,7 +111,7 @@ export const noCrossFeatureImportsRule = createRule< (options.allowList ?? []).map((pair) => pair.join("→")) ); - const filename = context.getFilename(); + const filename = context.filename; const currentFeature = extractFeatureName(filename, featuresDir); // Only check files inside features diff --git a/eslint-plugin-react-component-architecture/src/rules/noInlineJsxFunctions.ts b/eslint-plugin-react-component-architecture/src/rules/noInlineJsxFunctions.ts index 34e4b79..8e8adc8 100644 --- a/eslint-plugin-react-component-architecture/src/rules/noInlineJsxFunctions.ts +++ b/eslint-plugin-react-component-architecture/src/rules/noInlineJsxFunctions.ts @@ -42,7 +42,7 @@ export const noInlineJsxFunctionsRule = createRule< }, defaultOptions: [{ allowSpreadPassthrough: false }], create(context, [options]) { - const filename = context.getFilename(); + const filename = context.filename; if (isStoryFile(filename)) { return {}; diff --git a/eslint-plugin-react-component-architecture/src/rules/noJsxComputation.ts b/eslint-plugin-react-component-architecture/src/rules/noJsxComputation.ts index 358e68b..2348827 100644 --- a/eslint-plugin-react-component-architecture/src/rules/noJsxComputation.ts +++ b/eslint-plugin-react-component-architecture/src/rules/noJsxComputation.ts @@ -46,7 +46,7 @@ export const noJsxComputationRule = createRule< }, defaultOptions: [{ allowSimpleTernary: true }], create(context, [options]) { - const filename = context.getFilename(); + const filename = context.filename; if (isStoryFile(filename)) { return {}; diff --git a/eslint-plugin-react-component-architecture/src/rules/noStateInComponentBody.ts b/eslint-plugin-react-component-architecture/src/rules/noStateInComponentBody.ts index 951b62a..7125b46 100644 --- a/eslint-plugin-react-component-architecture/src/rules/noStateInComponentBody.ts +++ b/eslint-plugin-react-component-architecture/src/rules/noStateInComponentBody.ts @@ -55,7 +55,7 @@ export const noStateInComponentBodyRule = createRule< }, defaultOptions: [{ allowedHooks: DEFAULT_ALLOWED_HOOKS }], create(context, [options]) { - const filename = context.getFilename(); + const filename = context.filename; if (!isComponentFile(filename)) { return {}; diff --git a/eslint-plugin-react-component-architecture/src/rules/noUntranslatedJsxText.ts b/eslint-plugin-react-component-architecture/src/rules/noUntranslatedJsxText.ts index 26f4693..cfe7954 100644 --- a/eslint-plugin-react-component-architecture/src/rules/noUntranslatedJsxText.ts +++ b/eslint-plugin-react-component-architecture/src/rules/noUntranslatedJsxText.ts @@ -104,7 +104,7 @@ export const noUntranslatedJsxTextRule = createRule< const ignoreFiles = options.ignoreFiles ?? DEFAULT_IGNORE_FILES; // Check if this file should be ignored - const filename = context.getFilename(); + const filename = context.filename; if (shouldIgnoreFile(filename, ignoreFiles)) { return {}; } diff --git a/eslint-plugin-react-component-architecture/src/rules/packageJsonExactDeps.ts b/eslint-plugin-react-component-architecture/src/rules/packageJsonExactDeps.ts index 7a5e2fa..f2ac8dd 100644 --- a/eslint-plugin-react-component-architecture/src/rules/packageJsonExactDeps.ts +++ b/eslint-plugin-react-component-architecture/src/rules/packageJsonExactDeps.ts @@ -33,7 +33,7 @@ export const packageJsonExactDepsRule = createRule({ }, defaultOptions: [], create(context) { - const filename = context.getFilename(); + const filename = context.filename; if (!filename.endsWith("package.json")) { return {}; diff --git a/eslint-plugin-react-component-architecture/src/rules/storiesRequireDefaultExport.ts b/eslint-plugin-react-component-architecture/src/rules/storiesRequireDefaultExport.ts index 7e908f9..bdba2b6 100644 --- a/eslint-plugin-react-component-architecture/src/rules/storiesRequireDefaultExport.ts +++ b/eslint-plugin-react-component-architecture/src/rules/storiesRequireDefaultExport.ts @@ -25,7 +25,7 @@ export const storiesRequireDefaultExportRule = createRule< }, defaultOptions: [], create(context) { - const filename = context.getFilename(); + const filename = context.filename; if (!filename.endsWith(".stories.tsx")) { return {}; diff --git a/eslint-plugin-resource-architecture/package.json b/eslint-plugin-resource-architecture/package.json index eb1798c..db7e85e 100644 --- a/eslint-plugin-resource-architecture/package.json +++ b/eslint-plugin-resource-architecture/package.json @@ -49,7 +49,7 @@ ], "peerDependencies": { "@typescript-eslint/parser": ">=8.0.0", - "eslint": "8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=5.0.0" }, "dependencies": { diff --git a/eslint-plugin-resource-architecture/src/rules/concernImportBoundaries.ts b/eslint-plugin-resource-architecture/src/rules/concernImportBoundaries.ts index f69d8a4..53d9c93 100644 --- a/eslint-plugin-resource-architecture/src/rules/concernImportBoundaries.ts +++ b/eslint-plugin-resource-architecture/src/rules/concernImportBoundaries.ts @@ -83,7 +83,7 @@ export const concernImportBoundariesRule = createRule({ const orm = rawOptions?.orm ?? ["drizzle-orm"]; const dbClientPattern = rawOptions?.dbClientPattern ?? "**/clients/postgres/**"; - const filename = context.getFilename(); + const filename = context.filename; if (!filename || filename === "") { return {}; } diff --git a/eslint-plugin-resource-architecture/src/rules/filesMustBeResourcePrefixed.ts b/eslint-plugin-resource-architecture/src/rules/filesMustBeResourcePrefixed.ts index 51ee342..b5524b8 100644 --- a/eslint-plugin-resource-architecture/src/rules/filesMustBeResourcePrefixed.ts +++ b/eslint-plugin-resource-architecture/src/rules/filesMustBeResourcePrefixed.ts @@ -72,7 +72,7 @@ export const filesMustBeResourcePrefixedRule = createRule({ const suffixes = rawOptions?.suffixes ?? [...DEFAULT_SUFFIXES]; const allowExceptions = rawOptions?.allowExceptions ?? ["index.ts"]; - const filename = context.getFilename(); + const filename = context.filename; if (!filename || filename === "") { return {}; } diff --git a/eslint-plugin-resource-architecture/src/rules/noCrossResourceInternalImports.ts b/eslint-plugin-resource-architecture/src/rules/noCrossResourceInternalImports.ts index 2a13235..4135218 100644 --- a/eslint-plugin-resource-architecture/src/rules/noCrossResourceInternalImports.ts +++ b/eslint-plugin-resource-architecture/src/rules/noCrossResourceInternalImports.ts @@ -137,7 +137,7 @@ export const noCrossResourceInternalImportsRule = createRule") { return {}; } diff --git a/eslint-plugin-resource-architecture/src/rules/pluggableProvidersMustHaveNoop.ts b/eslint-plugin-resource-architecture/src/rules/pluggableProvidersMustHaveNoop.ts index ae9b18e..ab7b1a7 100644 --- a/eslint-plugin-resource-architecture/src/rules/pluggableProvidersMustHaveNoop.ts +++ b/eslint-plugin-resource-architecture/src/rules/pluggableProvidersMustHaveNoop.ts @@ -147,7 +147,7 @@ export const pluggableProvidersMustHaveNoopRule = createRule") { return {}; } diff --git a/eslint-plugin-resource-architecture/src/rules/serviceMustExportSingleton.ts b/eslint-plugin-resource-architecture/src/rules/serviceMustExportSingleton.ts index d7aaccc..c5a3d7c 100644 --- a/eslint-plugin-resource-architecture/src/rules/serviceMustExportSingleton.ts +++ b/eslint-plugin-resource-architecture/src/rules/serviceMustExportSingleton.ts @@ -135,7 +135,7 @@ export const serviceMustExportSingletonRule = createRule({ const singletonNameRegex = new RegExp(singletonNamePattern); const requireClass = rawOptions?.requireClass ?? false; - const filename = context.getFilename(); + const filename = context.filename; if (!filename || filename === "") { return {}; } diff --git a/eslint-plugin-tanstack-query-cache/package.json b/eslint-plugin-tanstack-query-cache/package.json index f13e136..16250b1 100644 --- a/eslint-plugin-tanstack-query-cache/package.json +++ b/eslint-plugin-tanstack-query-cache/package.json @@ -44,7 +44,7 @@ ], "peerDependencies": { "@typescript-eslint/parser": ">=8.0.0", - "eslint": "8.57.0 || ^9.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=5.0.0" }, "dependencies": {