import * as path from 'node:path'; import { includeIgnoreFile } from '@eslint/compat'; import eslint from '@eslint/js'; import importPlugin from 'eslint-plugin-import'; // eslint-plugin-prefer-arrow-functions doesn't ship flat config types — cast needed import preferArrowFunctions from 'eslint-plugin-prefer-arrow-functions'; import turboPlugin from 'eslint-plugin-turbo'; import { defineConfig } from 'eslint/config'; import tseslint from 'typescript-eslint'; // eslint-disable-next-line @typescript-eslint/no-explicit-any const preferArrowPlugin = preferArrowFunctions as any; /** * All packages that leverage t3-env should use this rule */ export const restrictEnvAccess = defineConfig( { ignores: ['**/env.ts'] }, { files: ['**/*.js', '**/*.ts', '**/*.tsx'], rules: { 'no-restricted-properties': [ 'error', { object: 'process', property: 'env', message: "Use `import { env } from '@/env'` instead to ensure validated types.", }, ], 'no-restricted-imports': [ 'error', { name: 'process', importNames: ['env'], message: "Use `import { env } from '@/env'` instead to ensure validated types.", }, ], }, }, ); export const baseConfig = defineConfig( // Ignore files not tracked by VCS and any config files includeIgnoreFile(path.join(import.meta.dirname, '../../.gitignore')), { ignores: ['**/*.config.*'] }, { files: ['**/*.js', '**/*.ts', '**/*.tsx'], plugins: { import: importPlugin, turbo: turboPlugin, 'prefer-arrow-functions': preferArrowPlugin, }, extends: [ eslint.configs.recommended, ...tseslint.configs.recommended, ...tseslint.configs.recommendedTypeChecked, ...tseslint.configs.stylisticTypeChecked, ], rules: { ...turboPlugin.configs.recommended.rules, '@typescript-eslint/no-unused-vars': [ 'warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, ], '@typescript-eslint/no-misused-promises': [ 2, { checksVoidReturn: { attributes: false } }, ], '@typescript-eslint/no-unnecessary-condition': [ 'error', { allowConstantLoopConditions: true, }, ], '@typescript-eslint/no-non-null-assertion': 'error', '@typescript-eslint/consistent-type-definitions': 'off', 'prefer-arrow-functions/prefer-arrow-functions': [ 'warn', { allowNamedFunctions: false, classPropertiesAllowed: false, disallowPrototype: false, returnStyle: 'unchanged', singleReturnOnly: false, }, ], }, }, { linterOptions: { reportUnusedDisableDirectives: true }, languageOptions: { parserOptions: { projectService: true, tsconfigRootDir: import.meta.dirname, }, }, }, );