diff options
| author | Taylor Mullen <[email protected]> | 2025-04-17 17:57:39 -0400 |
|---|---|---|
| committer | N. Taylor Mullen <[email protected]> | 2025-04-17 15:29:34 -0700 |
| commit | 7928c1727f0b208ed34850cc89bbb36ea3dd23e5 (patch) | |
| tree | 928446c3561805c0e6f89dfc2f75a856dcc9c980 /eslint.config.js | |
| parent | d3ee91ff9203f8591ca7a7101ce9ccadeb8137be (diff) | |
Configure linter + prettier.
- This is based on existing expectations for TS code in Google-esc repos.
- First part of the change (we have not run any linter or formatting commands). After this changeset goes in I'll do a mass changeset push.
Fixes https://b.corp.google.com/issues/411384603
Diffstat (limited to 'eslint.config.js')
| -rw-r--r-- | eslint.config.js | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..32f4c364 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,131 @@ +import eslint from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import reactPlugin from 'eslint-plugin-react'; +import reactRecommended from 'eslint-plugin-react/configs/recommended.js'; +import reactHooks from 'eslint-plugin-react-hooks'; +import prettierConfig from 'eslint-config-prettier'; +import importPlugin from 'eslint-plugin-import'; +import globals from 'globals'; + +export default tseslint.config( + { + // Global ignores + ignores: ['node_modules/**', 'eslint.config.js', 'packages/cli/dist/**'], + }, + eslint.configs.recommended, + ...tseslint.configs.recommended, + { + // React specific config + files: ['packages/cli/src/**/*.tsx'], // Target only TSX in the cli package + languageOptions: { + // Keep languageOptions from reactRecommended if needed, or define explicitly + parserOptions: { + ecmaFeatures: { jsx: true }, + }, + globals: { + ...globals.browser, + }, + }, + plugins: { + // Define the plugins used in this block + react: reactPlugin, + 'react-hooks': reactHooks, + }, + rules: { + // Apply recommended rules explicitly + ...reactRecommended.rules, + ...reactHooks.configs.recommended.rules, + // Custom overrides + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + }, + settings: { + react: { + version: 'detect', + }, + }, + }, + { + // Import specific config + files: ['packages/cli/src/**/*.{ts,tsx}'], // Target only TS/TSX in the cli package + plugins: { + import: importPlugin, + }, + settings: { + 'import/resolver': { + typescript: true, + node: true, + }, + }, + rules: { + ...importPlugin.configs.recommended.rules, + ...importPlugin.configs.typescript.rules, + 'import/no-default-export': 'warn', + 'import/no-unresolved': 'off', // Disable for now, can be noisy with monorepos/paths + }, + }, + { + // General overrides and rules for the project (TS/TSX files) + files: ['packages/cli/src/**/*.{ts,tsx}'], // Target only TS/TSX in the cli package + languageOptions: { + globals: { + ...globals.node, + ...globals.es2021, + }, + }, + rules: { + // General Best Practice Rules (subset adapted for flat config) + '@typescript-eslint/array-type': ['error', { default: 'array-simple' }], + 'arrow-body-style': ['error', 'as-needed'], + curly: ['error', 'multi-line'], + eqeqeq: ['error', 'always', { null: 'ignore' }], + '@typescript-eslint/consistent-type-assertions': [ + 'error', + { assertionStyle: 'as' }, + ], + '@typescript-eslint/explicit-member-accessibility': [ + 'error', + { accessibility: 'no-public' }, + ], + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-inferrable-types': [ + 'error', + { ignoreParameters: true, ignoreProperties: true }, + ], + '@typescript-eslint/no-namespace': ['error', { allowDeclarations: true }], + '@typescript-eslint/no-unused-vars': [ + 'warn', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' }, + ], + 'no-cond-assign': 'error', + 'no-debugger': 'error', + 'no-duplicate-case': 'error', + 'no-restricted-syntax': [ + 'error', + { + selector: 'CallExpression[callee.name="require"]', + message: 'Avoid using require(). Use ES6 imports instead.', + }, + { + selector: 'ThrowStatement > Literal:not([value=/^\\w+Error:/])', + message: 'Do not throw string literals or non-Error objects. Throw new Error("...") instead.', + }, + ], + 'no-unsafe-finally': 'error', + 'no-unused-expressions': 'off', // Disable base rule + '@typescript-eslint/no-unused-expressions': [ // Enable TS version + 'error', + { allowShortCircuit: true, allowTernary: true }, + ], + 'no-var': 'error', + 'object-shorthand': 'error', + 'one-var': ['error', 'never'], + 'prefer-arrow-callback': 'error', + 'prefer-const': ['error', { destructuring: 'all' }], + radix: 'error', + 'default-case': 'error', + }, + }, + // Prettier config must be last + prettierConfig, +); |
