Override tsconfig in templates - DAV-1000/react-material GitHub Wiki
Created: 7/31/2025 14:17
Updated: 7/31/2025 15:43
Exported: 8/14/2025 11:11
Link: https://chatgpt.com/c/688b6cf2-5628-8001-99a3-a6fff0a8e340
Prompt:
How can I override the tsconfig value noUnusedLocals for code existing in the in the templates subfolder (and child folders) of my typescript vite react app
Response:
To override the noUnusedLocals
TypeScript setting only for files under a specific directory (like templates/
), TypeScript does not support per-folder overrides in tsconfig.json
itself. However, there are a few practical workarounds depending on your goals:
tsconfig
file for the templates
folder
✅ Workaround: Use a separate You can create a separate tsconfig
for the templates/
folder and exclude it from the main one.
Step-by-step:
- Exclude
templates/
from the maintsconfig.json
:
// tsconfig.json
{
"compilerOptions": {
"noUnusedLocals": true,
// other options
},
"exclude": ["templates"]
}
- Create a separate
tsconfig.templates.json
in the root or insidetemplates/
:
// templates/tsconfig.templates.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"noUnusedLocals": false
},
"include": ["**/*"]
}
- Make sure your tooling (e.g., IDEs or
tsc
) recognizes both configs.
You may need to run TypeScript with both configs, like:
tsc -p tsconfig.json
tsc -p templates/tsconfig.templates.json
If you're using Vite, you can integrate this into your build tooling or use conditional scripts.
overrides
in tsconfig?
❌ Why not just use Unlike ESLint, TypeScript's tsconfig.json
does not support path-based overrides
. There's no official way to conditionally change settings like noUnusedLocals
based on file paths within the same config.
Optional: Use ESLint Instead
If your goal is just to catch unused locals for code quality (not during type checking), you could turn off noUnusedLocals
in TypeScript, and enforce it via ESLint with per-folder overrides:
// .eslintrc.json
{
"overrides": [
{
"files": ["templates/**/*.{ts,tsx}"],
"rules": {
"@typescript-eslint/no-unused-vars": "off"
}
},
{
"files": ["src/**/*.{ts,tsx}"],
"rules": {
"@typescript-eslint/no-unused-vars": "error"
}
}
]
}
Summary
Approach | Good For | How |
---|---|---|
Separate tsconfig |
Type-level enforcement | Use multiple tsconfig files and exclude/include accordingly |
ESLint override | Linting | Use ESLint overrides to selectively apply unused var checks |
Let me know if you want help automating the multi-config setup or integrating it into Vite.
Prompt:
The readme.md in the root of this app contains the following re eslint. Break it down into steps for implementing eslint: If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
js export default tseslint.config([ globalIgnores(['dist']), { files: ['**/*.{ts,tsx}'], extends: [ // Other configs...
// Remove tseslint.configs.recommended and replace with this
...tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
...tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
...tseslint.configs.stylisticTypeChecked,
// Other configs...
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
}, ])
You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:
js // eslint.config.js import reactX from 'eslint-plugin-react-x' import reactDom from 'eslint-plugin-react-dom'
export default tseslint.config([ globalIgnores(['dist']), { files: ['**/*.{ts,tsx}'], extends: [ // Other configs... // Enable lint rules for React reactX.configs['recommended-typescript'], // Enable lint rules for React DOM reactDom.configs.recommended, ], languageOptions: { parserOptions: { project: ['./tsconfig.node.json', './tsconfig.app.json'], tsconfigRootDir: import.meta.dirname, }, // other options... }, }, ])
Response:
Here’s a step-by-step breakdown to implement type-aware ESLint configuration and React-specific rules based on the README.md
instructions:
✅ Step-by-Step ESLint Setup
1. Install ESLint and dependencies
Run this in your project root:
npm install --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser @eslint/js typescript-eslint eslint-plugin-react-x eslint-plugin-react-dom
Or with pnpm
:
pnpm add -D eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser @eslint/js typescript-eslint eslint-plugin-react-x eslint-plugin-react-dom
eslint.config.js
in the root
2. Create Use the tseslint.config
helper and apply type-aware settings.
// eslint.config.js
import { tseslint } from 'typescript-eslint'
import { globalIgnores } from '@eslint/js'
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'
export default tseslint.config([
globalIgnores(['dist']), // Ignore build output
{
files: ['**/*.{ts,tsx}'],
extends: [
// Type-aware ESLint rules
...tseslint.configs.recommendedTypeChecked, // Use 'strictTypeChecked' for stricter rules
// Optional: stylistic formatting rules (spacing, quotes, etc.)
...tseslint.configs.stylisticTypeChecked,
// React-specific rules
reactX.configs['recommended-typescript'],
reactDom.configs.recommended,
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
])
tsconfig.app.json
and tsconfig.node.json
3. Add Make sure these exist and cover all the relevant files.
For example:
// tsconfig.app.json
{
"extends": "./tsconfig.json",
"include": ["src", "templates"]
}
// tsconfig.node.json
{
"extends": "./tsconfig.json",
"include": ["scripts", "vite.config.ts"]
}
4. Run ESLint
If you're using the latest ESLint (v9+ with flat config), run:
npx eslint . --ext .ts,.tsx
For Vite projects, you can optionally add a script in package.json
:
"scripts": {
"lint": "eslint . --ext .ts,.tsx"
}
✅ Summary
Step | What You Did |
---|---|
1 | Installed ESLint + TypeScript + React plugins |
2 | Created eslint.config.js using tseslint.config |
3 | Ensured tsconfig files are configured correctly |
4 | Ran ESLint using the new config |
Let me know if you want stricter rule suggestions or auto-fix/prettier integration next.
Prompt:
Why eslint.config.js and not eslint.config.ts
Response:
Great question. Whether to use eslint.config.js
or eslint.config.ts
depends on which ESLint version you're using and your tooling setup. Here's a breakdown of why eslint.config.js
is used and when you can use eslint.config.ts
instead:
eslint.config.js
is used by default
🧠 Why 1. ESLint v9+ uses the "Flat Config" format
- ESLint switched to the "flat config" system starting in v8.21, fully stable in v9.
- The
eslint.config.js
file is the new standard for this system. - Flat config must be in
.js
,.mjs
, or.cjs
unless you're using an extra build step.
.ts
config files
2. ESLint doesn't compile - ESLint does not run TypeScript natively for its config file.
- If you write
eslint.config.ts
, you’ll need to transpile it yourself before ESLint can use it.- This requires a build step (e.g., with
ts-node
,vite-node
, or a manual build viatsc
). - It's not officially supported out-of-the-box.
- This requires a build step (e.g., with
eslint.config.ts
if...
✅ You can use If you’re okay with the complexity, you can use eslint.config.ts
by:
- Installing
ts-node
:npm install --save-dev ts-node
- Creating a
eslint.config.ts
file, and then running ESLint like this:
Or configure a custom runner vianode --loader ts-node/esm ./node_modules/.bin/eslint .
vite
,turbo
, or your task runner of choice.
🟨 Recommendation
Use case | Use eslint.config.js ? |
Use eslint.config.ts ? |
---|---|---|
Simplicity, zero config | ✅ Yes | ❌ No |
You want to write config in TypeScript | 🔶 Possible, but needs setup | ✅ Yes, with ts-node |
Running ESLint in CI/build | ✅ Less error-prone | 🔶 OK if build step is solid |
TL;DR
Use eslint.config.js
because:
- It’s the default and fully supported format for ESLint flat config.
- ESLint doesn't natively support
.ts
config files. eslint.config.ts
requires manual setup, which adds overhead and complexity.
Let me know if you want a ready-to-go eslint.config.ts
+ ts-node
setup—happy to walk you through it.
Prompt:
How to add a lint rule for noUnusedLocals
Response:
To add a lint rule that enforces no unused locals (like variables, functions, etc. that are declared but not used), you have two main options depending on whether you want type-aware checking via TypeScript or just linting via ESLint.
noUnusedLocals
)
✅ Option 1: Enforce via TypeScript (This is a compiler option, not an ESLint rule.
tsconfig.json
:
🔧 Add to {
"compilerOptions": {
"noUnusedLocals": true
}
}
🔎 Behavior:
- Works at compile-time (
tsc
). - Fully type-aware.
- Doesn't require ESLint.
- Cannot be overridden per file/folder (unless using multiple
tsconfig
files).
@typescript-eslint/no-unused-vars
)
✅ Option 2: Enforce via ESLint (This works as a lint rule and is customizable.
eslint.config.js
or eslint.config.ts
:
🔧 Add to If you're using the flat config format:
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-unused-vars': ['error', { vars: 'all', args: 'after-used', ignoreRestSiblings: true }],
},
// include parserOptions etc. here
}
])
🔎 Behavior:
- Works in ESLint, can be run in editors, CI, etc.
- Allows per-folder or per-file overrides.
- Can be customized: ignore function args, ignore rest patterns, etc.
🧠 Which Should You Use?
Feature | TypeScript (noUnusedLocals ) |
ESLint (@typescript-eslint/no-unused-vars ) |
---|---|---|
Type-aware | ✅ Yes | ✅ Yes (if type-aware config is set) |
Per-folder override | ❌ No | ✅ Yes (via files in flat config) |
Fixable | ❌ No | ✅ Often fixable with --fix |
Error on compile | ✅ Yes | ❌ No (but can block CI via lint) |
Use both? | ✅ Yes, but avoid duplication of effort |
🎯 Best Practice
Use both:
- Use
noUnusedLocals: true
intsconfig.json
for strict compile-time errors. - Use
@typescript-eslint/no-unused-vars
ineslint.config.js
for lint flexibility and per-folder customization.
Let me know if you'd like an example with folder-based overrides (like disabling unused checks in templates/
) using ESLint.
Prompt:
How do I override no-empty-object-type in folder templates and all its subfolders
Response:
To override the no-empty-object-type
rule only in the templates/
folder and all its subfolders, you’ll need to use the ESLint flat config files
pattern matching system.
Assuming you’re using the flat config (eslint.config.js
), here’s how to do it:
no-empty-object-type
in templates/
✅ Step-by-Step: Override @typescript-eslint
rules
1. Make sure you're using If not installed already:
npm install --save-dev @typescript-eslint/eslint-plugin
eslint.config.js
, add an override for the templates
folder:
2. In your import { tseslint } from 'typescript-eslint'
export default tseslint.config([
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'error', // default behavior
},
languageOptions: {
parserOptions: {
project: ['./tsconfig.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
// Override for templates folder
{
files: ['templates/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
},
},
])
🧠 How it works
- ESLint applies the rules in order.
- The second block applies to all
.ts
and.tsx
files undertemplates/
and overrides the earlier config. - The rule is now disabled only in that folder.
✅ Notes
- The file paths are relative to the ESLint working directory (usually the project root).
- If you're using
.eslintignore
, make sure it doesn't excludetemplates/
. - The same approach works for any other rule you'd like to override by folder.
Let me know if you'd like to also override this based on specific filename patterns (like *.generated.ts
) or to enable other rule differences in templates/
.
Prompt:
It's not working
Response:
Thanks for the update—let’s get it working.
Here’s a checklist and refined setup for overriding the @typescript-eslint/no-empty-object-type
rule only in templates/
and its subfolders, assuming you are using ESLint flat config with TypeScript-aware rules.
✅ 1. Make sure the folder pattern is correct
Your override block must come after the global rules, and the files
glob must match:
// eslint.config.js
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
// Global config (applies to all TS/TSX files)
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'error', // default rule
},
languageOptions: {
parserOptions: {
project: ['./tsconfig.app.json', './tsconfig.node.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
// Override for templates/
{
files: ['templates/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
},
},
])
✅ 2. Check rule name
There’s no official rule named @typescript-eslint/no-empty-object-type
. The correct name is:
@typescript-eslint/ban-types
You likely meant to disable this warning for empty object types {}
or object
.
So change:
'@typescript-eslint/no-empty-object-type': 'off'
To:
'@typescript-eslint/ban-types': [
'error',
{
types: {
'{}': false, // allow empty object types
},
extendDefaults: true,
},
]
Or disable it altogether in the templates
folder:
rules: {
'@typescript-eslint/ban-types': 'off',
}
✅ 3. Test override
Create a test file:
// templates/test.ts
function foo(bar: {}) {
console.log(bar)
}
This should not report a ban-types
violation if the override is working.
✅ 4. Clear ESLint cache (if any)
If ESLint is using cache, try:
npx eslint . --ext .ts,.tsx --no-cache
✅ 5. Debug with ESLint CLI
Run ESLint with debug logging to see what config applies:
npx eslint templates/test.ts --print-config
Look for @typescript-eslint/ban-types
in the output and verify that it is set to 'off'
.
✅ Summary
What to check | Fix |
---|---|
Rule name | Use @typescript-eslint/ban-types |
Folder match | Use templates/**/*.{ts,tsx} |
Rule position | Ensure overrides come after the global rule |
Debug | Use --print-config to verify ESLint applies the override |
Let me know if you want me to check your full eslint.config.js
—just paste it here.
Prompt:
no-empty-object-type does exist and is detailed here: https://typescript-eslint.io/rules/no-empty-object-type/
Response:
You're absolutely right — and thank you for the correction.
✅ @typescript-eslint/no-empty-object-type
is a valid, real rule. It was introduced to specifically ban empty object types like {}
or object
because they're usually too broad and often incorrect. It's separate from ban-types
, which is more general.
🧩 Why your override might not be working
Now that we’ve clarified that no-empty-object-type
is a real rule, here’s how to properly override it for the templates/
folder using ESLint Flat Config:
no-empty-object-type
✅ Correct Setup for Overriding // eslint.config.js
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
// 1. Default/global config for all TS files
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'error', // apply globally
},
languageOptions: {
parserOptions: {
project: ['./tsconfig.app.json', './tsconfig.node.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
// 2. Override for the templates folder and its subfolders
{
files: ['templates/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
},
},
])
🧪 Test it
Make sure to create a test file like templates/foo.ts
with:
function takesEmpty(obj: {}) {
console.log(obj)
}
Then run:
npx eslint templates/foo.ts
You should not see a warning about no-empty-object-type
if the override is working.
🧰 Troubleshooting Tips
If it's still not working:
1. Ensure you’re using ESLint v8.21+ (Flat config support)
npx eslint -v
You need Flat config to use eslint.config.js
. If you're using an .eslintrc
, this setup won't work as-is.
--print-config
to verify
2. Use npx eslint templates/foo.ts --print-config
Look for:
"@typescript-eslint/no-empty-object-type": "off"
If it still shows as "error"
here, your override block is being skipped (likely due to file matching issues).
.eslintignore
blocking files
3. No Make sure templates/
isn’t ignored.
✅ Summary
Key Point | ✅ |
---|---|
Rule exists and is valid | ✅ Yes: @typescript-eslint/no-empty-object-type |
Can be disabled via flat config | ✅ Yes |
Needs to be after global rules | ✅ Yes |
Path matching must be exact | ✅ Yes: 'templates/**/*.{ts,tsx}' |
Would you like me to double-check a full config or a real file path you're using? Paste either one in and I can confirm it line by line.
Prompt:
This: Value for 'print-config' of type 'path::String' required. You're using eslint.config.js, some command line flags are no longer available. Please see https://eslint.org/docs/latest/use/command-line-interface for details. Was the result of running npx eslint templates/foo.ts --print-config
Response:
Great catch — you're seeing that message because --print-config
is not supported when you're using the new ESLint Flat Config (eslint.config.js
) system.
🧠 Why this happens
As of ESLint v9+ with flat config, --print-config
no longer works the way it used to.
Instead, ESLint expects you to use:
npx eslint --print-config path/to/file.ts
BUT: this feature only works if:
- You pass a literal path, not a glob or relative segment like
templates/foo.ts
. - The path is valid, and the file exists.
- ESLint is not using
eslint.config.js
withtseslint.config(...)
fromtypescript-eslint
, because some dynamic parts of that system make--print-config
not fully compatible (as of now).
✅ Workaround: Debug your config manually
Since --print-config
doesn't help, here's how to ensure your override works:
✅ 1. Ensure file exists and path is correct
- File:
templates/foo.ts
(should exist). - Glob:
'templates/**/*.{ts,tsx}'
.
✅ 2. Temporarily inject a console log into the config (debug hack)
Add this in eslint.config.js
inside the override to verify it's being picked up:
console.log('Applying templates override')
You can also add a fake rule and check if it fails:
{
files: ['templates/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
'no-console': 'error', // intentionally throw an error
},
}
Then in templates/foo.ts
:
console.log("hello") // <-- should now trigger a 'no-console' error
If you see the error, you know the override block is working, and no-empty-object-type
is correctly turned off.
✅ 3. Try a minimal test config (optional sanity check)
Create a temporary ESLint config just for templates/
:
// eslint.config.templates.js
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
{
files: ['**/*.ts'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
},
languageOptions: {
parserOptions: {
project: ['./tsconfig.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
])
Then run:
npx eslint templates/foo.ts --config eslint.config.templates.js
If this works, it confirms that your override is structurally sound — and the issue lies in the full config or rule precedence.
✅ Summary of What to Try
Step | Why |
---|---|
✅ Confirm file paths/globs | ESLint needs correct relative paths |
✅ Add a temporary rule like 'no-console': 'error' |
To test that override block runs |
✅ Use debug logging in config | Helps confirm block is evaluated |
❌ Don’t rely on --print-config with flat config |
Not fully supported yet with tseslint.config() |
If you want, paste your exact eslint.config.js
and the file path you're testing, and I’ll verify your override logic line by line.
Prompt:
OK. If I apply this globally: @typescript-eslint/no-empty-object-type': 'off'. Then I don't get an error. But if I change that line to '@typescript-eslint/no-empty-object-type': 'error' and add the line '@typescript-eslint/no-empty-object-type': 'off', to the rules collection of the override targeting files: ['templates/**/*.{ts,tsx}'] the override is not honoured
Response:
Thanks — that’s very clear and helps pinpoint the issue.
What you’re describing means ESLint isn’t matching your override for templates/**/*.{ts,tsx}
, even though the rule works globally.
✅ Let’s fix that override with precision.
Here’s a complete checklist to solve this reliably:
files
glob is correct
✅ 1. Confirm the relative path used in ESLint flat config globs are relative to the current working directory (typically your project root). So:
files: ['templates/**/*.{ts,tsx}']
Only matches if your actual file path looks like:
your-project-root/
├── templates/
│ ├── something.ts
If you're running ESLint from a subfolder, like cd src && npx eslint ../templates/foo.ts
, the glob won’t match correctly.
➡️ Always run ESLint from the project root:
npx eslint templates/foo.ts
✅ 2. Put the override after the global config block
ESLint flat config applies files
blocks in order. Later blocks override earlier ones only if the file matches.
Your config must look like this:
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
// 1. Global block
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'error',
},
languageOptions: {
parserOptions: {
project: ['./tsconfig.app.json', './tsconfig.node.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
// 2. Override for templates
{
files: ['templates/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
},
},
])
✅ 3. Make sure the test file is matched
Create a file at:
templates/test.ts
With this content:
function doSomething(input: {}) {
console.log(input)
}
Now run:
npx eslint templates/test.ts
You should NOT get:
error Don't use empty object type `{}` @typescript-eslint/no-empty-object-type
🔎 Still not working?
no-console
)
➕ Add debug test rule (like Temporarily inject a known error:
{
files: ['templates/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
'no-console': 'error', // debug test
},
}
In templates/test.ts
, add:
console.log("test")
If you see the no-console
error, then the override is working, but no-empty-object-type
may be duplicated from another config (see next point).
🛑 Check for Duplicated Rule Definitions
tseslint.configs.recommendedTypeChecked
, strictTypeChecked
, or other imported configs may re-enable the rule later — especially if you use multiple extends
arrays.
To fix that:
- Place your
files: ['templates/...']
override last in the config array. - Double-check that you're not pulling in that rule again elsewhere.
✅ Final Tip: Print Matched Globs
If you're still stuck, install eslint-plugin-globs-debug or insert this:
console.log('ESLint override active for templates/**/*.{ts,tsx}')
into the templates
override block to confirm it’s executing.
✅ TL;DR Summary
Step | Check |
---|---|
✅ Glob path matches actual file | templates/**/*.{ts,tsx} |
✅ File exists | templates/test.ts |
✅ ESLint is run from project root | npx eslint templates/test.ts |
✅ Override block comes after global block | Order matters |
✅ Rule isn't re-enabled elsewhere | Avoid duplicate rule via other configs |
If you're still seeing the issue, send me:
- Your exact
eslint.config.js
- The file path and contents you're testing
And I’ll debug it directly with you.
Prompt:
I want the overrides to apply to all files in templates/blog/ and templates/shared-theme/. The templates folder is in the root of src
Response:
Perfect — now we’re getting specific. Here’s exactly how to configure the ESLint flat config override for files in:
src/templates/blog/
src/templates/shared-theme/
Assuming you're running ESLint from the project root, the file paths should be matched with:
files: ['src/templates/{blog,shared-theme}/**/*.{ts,tsx}']
✅ Final Working Config Snippet
// eslint.config.js
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
// Global config (applies to all TS/TSX files)
{
files: ['**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'error', // enforce globally
},
languageOptions: {
parserOptions: {
project: ['./tsconfig.app.json', './tsconfig.node.json'],
tsconfigRootDir: import.meta.dirname,
},
},
},
// Override for specific subfolders of src/templates/
{
files: ['src/templates/{blog,shared-theme}/**/*.{ts,tsx}'],
rules: {
'@typescript-eslint/no-empty-object-type': 'off',
},
},
])
✅ Explanation
Part | Meaning |
---|---|
files: ['src/templates/{blog,shared-theme}/**/*.{ts,tsx}'] |
Only applies to files in src/templates/blog/ and src/templates/shared-theme/ , including all subfolders |
Rule override | Disables @typescript-eslint/no-empty-object-type just for these paths |
Order matters | This block must come after the global rules so it overrides them |
✅ Test it
- Create file:
src/templates/blog/test.ts
with:
function foo(x: {}) {
console.log(x)
}
- Run:
npx eslint src/templates/blog/test.ts
You should not see any error about no-empty-object-type
.
Let me know if you're using any vite.config.ts
or build scripts that alter the working directory — but if you run ESLint from project root and use the above config, you're set.
Prompt:
That works. How to fix this error: error Definition for rule 'import/prefer-default-export' was not found import/prefer-default-export
Response:
Great to hear the override works!
About your new error:
error Definition for rule 'import/prefer-default-export' was not found import/prefer-default-export
Why it happens
This error means ESLint can't find the rule import/prefer-default-export
, which comes from the eslint-plugin-import
package.
How to fix it
eslint-plugin-import
1. Install If you don’t already have it installed, run:
npm install --save-dev eslint-plugin-import
or with yarn:
yarn add -D eslint-plugin-import
2. Add it to your ESLint config
Since you are using the flat config (eslint.config.js
), you need to:
- Import the plugin
- Add it to your config with its recommended settings or manually
Example:
import importPlugin from 'eslint-plugin-import'
export default [
// other configs ...
{
plugins: {
import: importPlugin,
},
rules: {
'import/prefer-default-export': 'error',
// other import rules...
},
},
]
extends
from eslint-plugin-import
3. If you use You can also add their recommended config:
extends: [
// other extends ...
'plugin:import/recommended',
],
but in flat config, this usually means importing and spreading their config explicitly, or referencing it via:
import importPlugin from 'eslint-plugin-import'
export default [
{
plugins: {
import: importPlugin,
},
extends: [
...importPlugin.configs.recommended,
],
},
]
Summary:
Step | What to do |
---|---|
1 | Install eslint-plugin-import |
2 | Import plugin in eslint.config.js |
3 | Add plugin to plugins and rules or extends |
If you want, I can help you update your full eslint.config.js
accordingly!
Prompt:
It's just this line in a file. /* eslint-disable import/prefer-default-export */. The file is imported from material UI and I don't want to change it. Is there not a simpler way to suppress all error messages from this file and others in the same folder
Response:
Got it! You want to silence all ESLint errors (including the missing rule error) for that file and others in the same folder, without modifying the source files themselves.
Simple and clean way to do this:
Add an ESLint override in your eslint.config.js
that disables all rules for those files.
src/some-folder/
)
Example: Disable all linting for files in a folder (e.g., export default tseslint.config([
// your existing configs...
{
files: ['src/some-folder/**/*.{ts,tsx,js,jsx}'], // adjust path & extensions
rules: {
// disable all rules for these files:
// can do this by turning off the 'eslint' core rules (but no blanket switch exists),
// so you can turn off problematic rules or turn off linting entirely by overriding parserOptions to null:
// but simplest is disabling all known rules:
// Disable every rule by setting 'off' - easiest is to set:
'import/prefer-default-export': 'off',
// add any other rules you want to silence here
// OR, disable eslint entirely in these files by setting 'no-restricted-syntax' to 'off' is not enough,
// so you can disable all rules known by listing them or set 'root: true' in a nested .eslintrc file.
},
},
])
But to disable all rules for a file/folder:
Unfortunately, ESLint has no built-in "disable all rules" switch, but you can:
- Set the override for those files with:
{
files: ['src/some-folder/**/*.{ts,tsx,js,jsx}'],
rules: Object.fromEntries(
Object.keys(require('eslint/conf/eslint-recommended').rules).map(rule => [rule, 'off'])
),
}
- Or, easier: just add a
.eslintignore
file and list that folder there, which completely skips ESLint for those files:
src/some-folder/
My recommendation:
If you want to suppress all errors in those files/folder (including missing rule errors):
Add those folders to your .eslintignore
file:
src/some-folder/
This way ESLint won’t lint those files at all — no errors, no warnings, nothing.
Summary
Method | Effect | Pros | Cons |
---|---|---|---|
Add override disabling specific rules in eslint.config.js |
Disable certain rules only | Granular control | Must list every problematic rule |
Add folder to .eslintignore |
ESLint ignores those files completely | Simple & full silence | No linting at all for those files |
If you want, I can help write an exact override for your folder, just let me know the folder path!
Prompt:
The ".eslintignore" file is no longer supported. Switch to using the "ignores" property in "eslint.config.js": https://eslint.org/docs/latest/use/configure/migration-guide#ignoring-files
Response:
Right, with the new ESLint flat config (eslint.config.js
), .eslintignore
is deprecated and you should use the ignores
property in your config instead.
ignores
property
How to ignore files/folders using the Simply add a top-level ignores
key in your eslint.config.js
(or inside your tseslint.config([...])
call) like this:
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
tseslint.globalIgnores(['dist']), // example from before
// Add this to ignore your folder completely:
tseslint.globalIgnores(['src/some-folder/**']),
// ... your other configs here ...
])
Or directly:
export default [
{
ignores: ['src/some-folder/**'],
},
// other configs...
]
import/prefer-default-export
errors come from:
For your case, to ignore all files in the folder where those files with If the folder is src/templates/shared-theme/
or wherever those files live, add:
import { tseslint } from 'typescript-eslint'
export default tseslint.config([
tseslint.globalIgnores([
'dist',
'src/templates/shared-theme/**', // ignore all files in this folder
]),
// your other configs...
])
This will cause ESLint to skip linting those files entirely — so no rules, no errors, no warnings.
TL;DR
.eslintignore
→ deprecated with flat config- Use
ignores
orglobalIgnores
ineslint.config.js
- Example to ignore a folder:
tseslint.globalIgnores(['src/path/to/folder/**'])
If you want me to generate a minimal full example eslint.config.js
with this included, just say the word!
Prompt:
That did it
Response:
Awesome! Glad that worked out for you. If you need help with anything else ESLint, TypeScript, or Vite-related, just shout! 🚀😄
Powered by ChatGPT Exporter