@dagster-io/eslint-config
v2.0.0
Published
Shared eslint configuration for @dagster-io
Readme
@dagster-io/eslint-config
Shared ESLint configuration for Dagster applications.
Version 2.x+ requires ESLint 9 and uses the flat config format.
For ESLint 8 support, use version 1.x.
Installation
yarn add -D @dagster-io/eslint-config eslint@^9.0.0 prettier@^3.3.3Usage
ESLint 9 Flat Config (eslint.config.js)
Create an eslint.config.js file in your project root:
const dagsterConfig = require('@dagster-io/eslint-config');
module.exports = [
...dagsterConfig,
// Your custom overrides here
{
rules: {
// Override specific rules
},
},
];With Ignores
const dagsterConfig = require('@dagster-io/eslint-config');
module.exports = [
...dagsterConfig,
{
ignores: ['dist/**', 'build/**', '*.config.js'],
},
];With Additional Plugins
const dagsterConfig = require('@dagster-io/eslint-config');
const storybookPlugin = require('eslint-plugin-storybook');
module.exports = [
...dagsterConfig,
...storybookPlugin.configs['flat/recommended'],
{
// Additional configuration
},
];Migration from v1 to v2
Step 1: Upgrade Dependencies
yarn add -D eslint@^9.0.0 @dagster-io/eslint-config@^2.0.0Step 2: Rename Config File
Rename .eslintrc.js → eslint.config.js
Step 3: Update Config Format
Before (.eslintrc.js):
module.exports = {
extends: ['@dagster-io/eslint-config'],
ignorePatterns: ['dist/**'],
overrides: [
{
files: ['*.test.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
],
};After (eslint.config.js):
const dagsterConfig = require('@dagster-io/eslint-config');
module.exports = [
...dagsterConfig,
{
ignores: ['dist/**'],
},
{
files: ['*.test.ts'],
rules: {
'@typescript-eslint/no-explicit-any': 'off',
},
},
];Step 4: Update Scripts (if needed)
ESLint 9 with flat config auto-detects files and config location.
Before:
{
"scripts": {
"lint": "eslint . --ext .ts,.tsx -c .eslintrc.js"
}
}After:
{
"scripts": {
"lint": "eslint ."
}
}Key Differences in Flat Config
- Config is an array - Multiple config objects can be specified
- No
extends- Configs are imported and spread:...dagsterConfig - Ignores replace ignorePatterns - Use
ignores: ['pattern']in config objects - Overrides are separate objects - Each override is its own config object in the array
- File patterns in
fileskey - Override specific files withfiles: ['*.test.ts']
Custom Rules
This config includes custom Dagster-specific ESLint rules:
dagster-rules/missing-graphql-variables-type
Ensures GraphQL queries and mutations specify the Variables type parameter.
❌ Incorrect:
const {data} = useQuery<SomeQuery>(SOME_QUERY);✅ Correct:
const {data} = useQuery<SomeQuery, SomeQueryVariables>(SOME_QUERY);dagster-rules/no-oss-imports
Prevents relative imports of .oss files and enforces absolute path imports.
❌ Incorrect:
import {Component} from './Component.oss';✅ Correct:
import {Component} from 'shared/components/Component.oss';dagster-rules/no-apollo-client
Enforces using Dagster's wrapped Apollo client with performance instrumentation.
❌ Incorrect:
import {useQuery} from '@apollo/client';✅ Correct:
import {useQuery} from '../apollo-client';
// or
import {useQuery} from '@dagster-io/ui-core/apollo-client';dagster-rules/no-react-router-route
Enforces using Dagster's custom Route component instead of react-router-dom's.
❌ Incorrect:
import {Route} from 'react-router-dom';✅ Correct:
import {Route} from '../app/Route';
// or
import {Route} from '@dagster-io/ui-core/app/Route';dagster-rules/missing-shared-import
Validates that imports using the shared/ path reference files ending with .oss.
Included Rules and Plugins
This config includes:
- TypeScript -
@typescript-eslintrecommended rules - React - React recommended rules + JSX runtime
- Jest - Jest recommended rules
- Prettier - Prettier integration with auto-formatting
- Import - Import ordering and cycle detection
- React Hooks - Rules of Hooks and exhaustive deps
- Unused Imports - Auto-removal of unused imports
- Custom Dagster Rules - Dagster-specific linting rules
Rule Highlights
- Import Ordering - Automatically sorts imports by type and alphabetically
- No Default Exports - Enforces named exports for better refactoring
- No Unused Imports - Automatically removes unused imports
- Restricted Imports - Prevents use of deprecated libraries (moment, lodash, etc.)
- React Best Practices - Enforces modern React patterns
- TypeScript Strictness - Disallows non-null assertions and other unsafe patterns
Compatibility
- ESLint: ^9.0.0
- Node.js: 18.18+, 20.9+, 21+
- TypeScript: Any version (via typescript-eslint v8)
Legacy Version (ESLint 8)
If you need ESLint 8 support, install version 1.x:
yarn add -D @dagster-io/eslint-config@^1.0.0 eslint@^8.57.1Then use the legacy .eslintrc.js format:
// .eslintrc.js
module.exports = {
extends: ['@dagster-io/eslint-config'],
};Contributing
This package is part of the Dagster monorepo. To make changes:
- Update the config in
/js_modules/dagster-ui/packages/eslint-config - Test locally with
yarn lintandyarn test - Update version in
package.json - Update
CHANGELOG.mdwith changes - Submit a PR
License
Apache-2.0
