diff --git a/package.json b/package.json index 9a4a1fc..16eb3e3 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@changesets/cli": "^2.28.1", "@typescript/native-preview": "^7.0.0-dev.0", + "@mikecbrant/prettier-config": "workspace:*", "prettier": "^3.3.3", "typescript": "^5.6.3" } diff --git a/packages/eslint-config/config.mjs b/packages/eslint-config/config.mjs index 3192059..68b03ca 100644 --- a/packages/eslint-config/config.mjs +++ b/packages/eslint-config/config.mjs @@ -13,18 +13,10 @@ export default [ // SonarJS recommended (flat) sonarjs.configs.recommended, - // Strict overlays and additional plugins + // TypeScript-specific strict overrides { - name: '@mikecbrant/eslint-config/strict-overrides', - files: [ - '**/*.js', - '**/*.mjs', - '**/*.jsx', - '**/*.ts', - '**/*.mts', - '**/*.tsx', - '**/*.d.ts', - ], + name: '@mikecbrant/eslint-config/strict-overrides:ts', + files: ['**/*.{ts,tsx,mts}'], plugins: { '@typescript-eslint': tsPlugin, import: importPlugin, @@ -32,7 +24,7 @@ export default [ 'unused-imports': unusedImports, }, languageOptions: { - ecmaVersion: 'latest', + ecmaVersion: 2023, sourceType: 'module', parser: tsParser, parserOptions: { @@ -55,7 +47,7 @@ export default [ 'max-depth': ['error', 3], 'max-params': ['error', 4], - // TS hygiene + // TS hygiene (TS-only) '@typescript-eslint/consistent-type-imports': [ 'error', { prefer: 'type-imports', fixStyle: 'inline-type-imports' }, @@ -91,6 +83,60 @@ export default [ }, }, + // JavaScript-specific strict overrides (no TS parser) + { + name: '@mikecbrant/eslint-config/strict-overrides:js', + files: ['**/*.{js,mjs,jsx}'], + plugins: { + import: importPlugin, + unicorn: unicornPlugin, + 'unused-imports': unusedImports, + }, + languageOptions: { + ecmaVersion: 2023, + sourceType: 'module', + parserOptions: { + ecmaFeatures: { jsx: true }, + }, + }, + rules: { + // Confirmed strict thresholds (errors) + 'max-lines-per-function': [ + 'error', + { max: 60, skipComments: true, skipBlankLines: true }, + ], + complexity: ['error', 10], + 'max-depth': ['error', 3], + 'max-params': ['error', 4], + + // Imports hygiene & sorting (no TS type group here) + 'import/no-duplicates': 'error', + 'import/order': [ + 'error', + { + groups: [ + ['builtin', 'external'], + 'internal', + 'parent', + 'sibling', + 'index', + 'object', + ], + alphabetize: { order: 'asc', caseInsensitive: true }, + 'newlines-between': 'always', + }, + ], + 'unused-imports/no-unused-imports': 'error', + + // Misc + 'no-console': 'error', + + // Tame a few unicorn defaults + 'unicorn/prevent-abbreviations': 'off', + 'unicorn/no-null': 'off', + }, + }, + // Explicitly omit CommonJS and TypeScript CJS { ignores: ['**/*.cjs', '**/*.cts'] }, ] diff --git a/packages/eslint-config/eslint.config.mjs b/packages/eslint-config/eslint.config.mjs index 3d7a0cf..1f20cbb 100644 --- a/packages/eslint-config/eslint.config.mjs +++ b/packages/eslint-config/eslint.config.mjs @@ -5,7 +5,7 @@ import unusedImports from 'eslint-plugin-unused-imports' export default [ { - files: ['*.mjs'], + files: ['**/*.mjs'], languageOptions: { ecmaVersion: 2023, sourceType: 'module', diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 7b3aa74..e1387c8 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -28,6 +28,10 @@ "files": [ "index.mjs", "config.mjs", + "eslint.config.mjs", "README.md" - ] + ], + "devDependencies": { + "@mikecbrant/prettier-config": "workspace:*" + } } diff --git a/packages/eslint-config/prettier.config.mjs b/packages/eslint-config/prettier.config.mjs index 2f9238a..cedcde3 100644 --- a/packages/eslint-config/prettier.config.mjs +++ b/packages/eslint-config/prettier.config.mjs @@ -1,2 +1 @@ -// Delegate to the published Prettier config package by name to avoid cross-package relative paths. export { default } from '@mikecbrant/prettier-config' diff --git a/packages/prettier-config/eslint.config.mjs b/packages/prettier-config/eslint.config.mjs index 138a67d..335cdbb 100644 --- a/packages/prettier-config/eslint.config.mjs +++ b/packages/prettier-config/eslint.config.mjs @@ -1,2 +1 @@ -// Delegate to the published sibling package to avoid cross-package relative imports. export { default } from '@mikecbrant/eslint-config' diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index df6f231..0e4890b 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -18,5 +18,8 @@ "index.mjs", "config.mjs", "README.md" - ] + ], + "devDependencies": { + "@mikecbrant/eslint-config": "workspace:*" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b442ae..530babb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,9 @@ importers: "@changesets/cli": specifier: ^2.28.1 version: 2.29.6 + "@mikecbrant/prettier-config": + specifier: workspace:* + version: link:packages/prettier-config "@typescript/native-preview": specifier: ^7.0.0-dev.0 version: 7.0.0-dev.20250901.1 @@ -59,6 +62,10 @@ importers: prettier: specifier: ^3.0.0 version: 3.6.2 + devDependencies: + "@mikecbrant/eslint-config": + specifier: workspace:* + version: link:../eslint-config packages/tsconfig: dependencies: