Compare commits
	
		
			48 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 6080d3f74d | ||
|  | b996c58bac | ||
|  | b8fe1fabea | ||
|  | 0ab9f88603 | ||
|  | 17670e8e38 | ||
|  | 686f285a37 | ||
|  | 2d9efd4df6 | ||
|  | b8e6cdf047 | ||
|  | 50c962197b | ||
|  | bf19dc0adb | ||
|  | 38f64ae9af | ||
|  | 22527f61de | ||
|  | 1ff53f2f04 | ||
|  | 316bbd903b | ||
|  | bce5016b53 | ||
|  | ddd34a9465 | ||
|  | 2f1c785eef | ||
|  | 4eb7aee28e | ||
|  | 769bee0139 | ||
|  | 07a15be095 | ||
|  | 0af15d4bf4 | ||
|  | d23abea648 | ||
|  | eaff018580 | ||
|  | 327ab9dd35 | ||
|  | ea70c5c6aa | ||
|  | 2e9948029c | ||
|  | a6692cc074 | ||
|  | ded3cf2da2 | ||
|  | f1644757c8 | ||
|  | a695d58bd0 | ||
|  | 5f05cfcfd6 | ||
|  | 25668d5d1c | ||
|  | 0cc68e6219 | ||
|  | a93e26642d | ||
|  | 9653a33381 | ||
|  | 95a2c10b3a | ||
|  | d4538f42b1 | ||
|  | 782ab7abb1 | ||
|  | a5ec18a973 | ||
|  | 0a1f8c5612 | ||
|  | 73a790c1d0 | ||
|  | 0349a41506 | ||
|  | a3c897a9ec | ||
|  | 774757b0e5 | ||
|  | 83db65f464 | ||
|  | 2e962a2785 | ||
|  | 625e845c80 | ||
|  | 38c927024b | 
							
								
								
									
										62
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -3,6 +3,68 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
|  | ||||
| ## [0.19.1](https://github.com/antfu/eslint-config/compare/v0.19.0...v0.19.1) (2022-03-30) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * missing file, close [#76](https://github.com/antfu/eslint-config/issues/76) ([0cc68e6](https://github.com/antfu/eslint-config/commit/0cc68e6219601b09ac8e258b869f23308e073af5)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # [0.19.0](https://github.com/antfu/eslint-config/compare/v0.18.9...v0.19.0) (2022-03-29) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * inline `eslint-config-standard` ([9653a33](https://github.com/antfu/eslint-config/commit/9653a333819cb4f180cede002c965b8a2e2acb82)) | ||||
|  | ||||
|  | ||||
| ### Features | ||||
|  | ||||
| * vue sfc tags order ([d4538f4](https://github.com/antfu/eslint-config/commit/d4538f42b14d0f7c824795945ffa556d585ceb06)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.9](https://github.com/antfu/eslint-config/compare/v0.18.8...v0.18.9) (2022-03-20) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * **vue:** disable `vue/no-setup-props-destructure` ([0a1f8c5](https://github.com/antfu/eslint-config/commit/0a1f8c56124ac1735e7b26879ac3e6ab9289ca74)) | ||||
| * disable `yml/no-empty-document` ([73a790c](https://github.com/antfu/eslint-config/commit/73a790c1d08f9ce9837cbad03d3f8b68a6b9a5f8)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.8](https://github.com/antfu/eslint-config/compare/v0.18.7...v0.18.8) (2022-03-10) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * disable `spaced-comment` in yaml ([a3c897a](https://github.com/antfu/eslint-config/commit/a3c897a9ece0b15508564aa3dc1837eaaa161680)) | ||||
| * disable no-var-requires in markdown ([774757b](https://github.com/antfu/eslint-config/commit/774757b0e5142f44678b1bd6f0db04aff0a5ee1f)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.7](https://github.com/antfu/eslint-config/compare/v0.18.6...v0.18.7) (2022-03-10) | ||||
|  | ||||
|  | ||||
| ### Features | ||||
|  | ||||
| * improve `no-unused-vars` rule ([2e962a2](https://github.com/antfu/eslint-config/commit/2e962a278571113853435221e8c3d43bd9fa1421)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.6](https://github.com/antfu/eslint-config/compare/v0.18.5...v0.18.6) (2022-03-10) | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								LICENSE
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| MIT License | ||||
|  | ||||
| Copyright (c) 2019 Anthony Fu<https://github.com/antfu> | ||||
| Copyright (c) 2019-PRESENT Anthony Fu<https://github.com/antfu> | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| of this software and associated documentation files (the "Software"), to deal | ||||
|   | ||||
							
								
								
									
										26
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,6 +1,13 @@ | ||||
| # @antfu/eslint-config | ||||
|  | ||||
| [](https://npmjs.com/package/@antfu/eslint-config) | ||||
| [](https://npmjs.com/package/@antfu/eslint-config) | ||||
|  | ||||
| - Single quotes, no semi | ||||
| - Auto fix for formatting (aimed to be used standalone without Prettier) | ||||
| - TypeScript, Vue, React out-of-box | ||||
| - Lint also for json, yaml, markdown | ||||
| - Sorted imports, dangling commas for cleaner commit diff | ||||
| - Reasonable defaults, best practices, only one-line of config | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| @@ -18,6 +25,8 @@ pnpm add -D eslint @antfu/eslint-config | ||||
| } | ||||
| ``` | ||||
|  | ||||
| > You don't need `.eslintignore` normally as it has been provided by the preset. | ||||
|  | ||||
| ### Add script for package.json | ||||
|  | ||||
| For example: | ||||
| @@ -25,7 +34,8 @@ For example: | ||||
| ```json | ||||
| { | ||||
|   "scripts": { | ||||
|     "lint": "eslint ." | ||||
|     "lint": "eslint .", | ||||
|     "lint:fix": "eslint . --fix" | ||||
|   } | ||||
| } | ||||
| ``` | ||||
| @@ -42,3 +52,15 @@ Create `.vscode/settings.json` | ||||
|   } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| ## Check Also | ||||
|  | ||||
| - [antfu/dotfiles](https://github.com/antfu/dotfiles) - My dotfiles | ||||
| - [antfu/vscode-settings](https://github.com/antfu/vscode-settings) - My VS Code settings | ||||
| - [antfu/eslint-config](https://github.com/antfu/eslint-config) - My ESLint config | ||||
| - [antfu/ts-starter](https://github.com/antfu/ts-starter) - My starter template for TypeScript library | ||||
| - [antfu/vitesse](https://github.com/antfu/vitesse) - My starter template for Vue & Vite app | ||||
|  | ||||
| ## License | ||||
|  | ||||
| MIT | ||||
|   | ||||
| @@ -1,6 +0,0 @@ | ||||
| { | ||||
|   "packages": [ | ||||
|     "packages/*" | ||||
|   ], | ||||
|   "version": "0.18.6" | ||||
| } | ||||
							
								
								
									
										12
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,17 +1,19 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-monorepo", | ||||
|   "version": "0.21.1", | ||||
|   "private": true, | ||||
|   "license": "MIT", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "scripts": { | ||||
|     "preinstall": "npx only-allow pnpm", | ||||
|     "lint": "eslint .", | ||||
|     "release": "lerna publish --conventional-commits" | ||||
|     "prepare": "pnpm -r run stub", | ||||
|     "release": "bumpp package.json packages/*/package.json --commit --push --tag && pnpm -r publish --access public" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@antfu/eslint-config": "*", | ||||
|     "eslint": "^8.10.0", | ||||
|     "lerna": "^4.0.0", | ||||
|     "typescript": "^4.6.2" | ||||
|     "bumpp": "^7.1.1", | ||||
|     "eslint": "^8.14.0", | ||||
|     "eslint-plugin-antfu": "workspace:*", | ||||
|     "typescript": "^4.6.3" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,49 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
|  | ||||
| ## [0.19.1](https://github.com/antfu/eslint-config/compare/v0.19.0...v0.19.1) (2022-03-30) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # [0.19.0](https://github.com/antfu/eslint-config/compare/v0.18.9...v0.19.0) (2022-03-29) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * inline `eslint-config-standard` ([9653a33](https://github.com/antfu/eslint-config/commit/9653a333819cb4f180cede002c965b8a2e2acb82)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.9](https://github.com/antfu/eslint-config/compare/v0.18.8...v0.18.9) (2022-03-20) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.8](https://github.com/antfu/eslint-config/compare/v0.18.7...v0.18.8) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.7](https://github.com/antfu/eslint-config/compare/v0.18.6...v0.18.7) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.6](https://github.com/antfu/eslint-config/compare/v0.18.5...v0.18.6) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config", | ||||
|   "version": "0.18.6", | ||||
|   "version": "0.21.1", | ||||
|   "description": "", | ||||
|   "keywords": [], | ||||
|   "license": "MIT", | ||||
| @@ -13,25 +13,24 @@ | ||||
|     "eslint": ">=7.4.0" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-react": "^0.18.6", | ||||
|     "@antfu/eslint-config-vue": "^0.18.6", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.13.0", | ||||
|     "@typescript-eslint/parser": "^5.13.0", | ||||
|     "eslint-config-standard": "17.0.0-1", | ||||
|     "@antfu/eslint-config-react": "workspace:*", | ||||
|     "@antfu/eslint-config-vue": "workspace:*", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.20.0", | ||||
|     "@typescript-eslint/parser": "^5.20.0", | ||||
|     "eslint-plugin-eslint-comments": "^3.2.0", | ||||
|     "eslint-plugin-html": "^6.2.0", | ||||
|     "eslint-plugin-import": "^2.25.4", | ||||
|     "eslint-plugin-import": "^2.26.0", | ||||
|     "eslint-plugin-jsonc": "^2.2.1", | ||||
|     "eslint-plugin-n": "^15.0.1", | ||||
|     "eslint-plugin-n": "^15.1.0", | ||||
|     "eslint-plugin-promise": "^6.0.0", | ||||
|     "eslint-plugin-unicorn": "^41.0.0", | ||||
|     "eslint-plugin-vue": "^8.5.0", | ||||
|     "eslint-plugin-unicorn": "^42.0.0", | ||||
|     "eslint-plugin-vue": "^8.7.1", | ||||
|     "eslint-plugin-yml": "^0.14.0", | ||||
|     "jsonc-eslint-parser": "^2.1.0", | ||||
|     "yaml-eslint-parser": "^0.5.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.10.0" | ||||
|     "eslint": "^8.14.0" | ||||
|   }, | ||||
|   "publishConfig": { | ||||
|     "access": "public" | ||||
|   | ||||
| @@ -3,6 +3,62 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
|  | ||||
| ## [0.19.1](https://github.com/antfu/eslint-config/compare/v0.19.0...v0.19.1) (2022-03-30) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * missing file, close [#76](https://github.com/antfu/eslint-config/issues/76) ([0cc68e6](https://github.com/antfu/eslint-config/commit/0cc68e6219601b09ac8e258b869f23308e073af5)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # [0.19.0](https://github.com/antfu/eslint-config/compare/v0.18.9...v0.19.0) (2022-03-29) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * inline `eslint-config-standard` ([9653a33](https://github.com/antfu/eslint-config/commit/9653a333819cb4f180cede002c965b8a2e2acb82)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.9](https://github.com/antfu/eslint-config/compare/v0.18.8...v0.18.9) (2022-03-20) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * disable `yml/no-empty-document` ([73a790c](https://github.com/antfu/eslint-config/commit/73a790c1d08f9ce9837cbad03d3f8b68a6b9a5f8)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.8](https://github.com/antfu/eslint-config/compare/v0.18.7...v0.18.8) (2022-03-10) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * disable `spaced-comment` in yaml ([a3c897a](https://github.com/antfu/eslint-config/commit/a3c897a9ece0b15508564aa3dc1837eaaa161680)) | ||||
| * disable no-var-requires in markdown ([774757b](https://github.com/antfu/eslint-config/commit/774757b0e5142f44678b1bd6f0db04aff0a5ee1f)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.7](https://github.com/antfu/eslint-config/compare/v0.18.6...v0.18.7) (2022-03-10) | ||||
|  | ||||
|  | ||||
| ### Features | ||||
|  | ||||
| * improve `no-unused-vars` rule ([2e962a2](https://github.com/antfu/eslint-config/commit/2e962a278571113853435221e8c3d43bd9fa1421)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.6](https://github.com/antfu/eslint-config/compare/v0.18.5...v0.18.6) (2022-03-10) | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ module.exports = { | ||||
|     node: true, | ||||
|   }, | ||||
|   extends: [ | ||||
|     'standard', | ||||
|     './standard', | ||||
|     'plugin:import/recommended', | ||||
|     'plugin:eslint-comments/recommended', | ||||
|     'plugin:jsonc/recommended-with-jsonc', | ||||
| @@ -18,11 +18,13 @@ module.exports = { | ||||
|     'dist', | ||||
|     'LICENSE*', | ||||
|     'output', | ||||
|     'packages-lock.json', | ||||
|     'pnpm-lock.yaml', | ||||
|     'coverage', | ||||
|     'public', | ||||
|     'temp', | ||||
|     'packages-lock.json', | ||||
|     'pnpm-lock.yaml', | ||||
|     'yarn.lock', | ||||
|     '__snapshots__', | ||||
|     '!.github', | ||||
|     '!.vitepress', | ||||
|     '!.vscode', | ||||
| @@ -30,10 +32,11 @@ module.exports = { | ||||
|   plugins: [ | ||||
|     'html', | ||||
|     'unicorn', | ||||
|     'antfu', | ||||
|   ], | ||||
|   settings: { | ||||
|     'import/resolver': { | ||||
|       node: { extensions: ['.js', '.mjs', '.ts', '.d.ts'] }, | ||||
|       node: { extensions: ['.js', '.mjs'] }, | ||||
|     }, | ||||
|   }, | ||||
|   overrides: [ | ||||
| @@ -41,14 +44,17 @@ module.exports = { | ||||
|       files: ['*.json', '*.json5'], | ||||
|       parser: 'jsonc-eslint-parser', | ||||
|       rules: { | ||||
|         'quotes': ['error', 'double'], | ||||
|         'quote-props': ['error', 'always'], | ||||
|         'comma-dangle': ['error', 'never'], | ||||
|         'jsonc/quotes': ['error', 'double'], | ||||
|         'jsonc/quote-props': ['error', 'always'], | ||||
|         'jsonc/comma-dangle': ['error', 'never'], | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       files: ['*.yaml', '*.yml'], | ||||
|       parser: 'yaml-eslint-parser', | ||||
|       rules: { | ||||
|         'spaced-comment': 'off', | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       files: ['package.json'], | ||||
| @@ -128,6 +134,8 @@ module.exports = { | ||||
|         '@typescript-eslint/no-redeclare': 'off', | ||||
|         '@typescript-eslint/no-unused-vars': 'off', | ||||
|         '@typescript-eslint/no-use-before-define': 'off', | ||||
|         '@typescript-eslint/no-var-requires': 'off', | ||||
|         '@typescript-eslint/comma-dangle': 'off', | ||||
|         'import/no-unresolved': 'off', | ||||
|         'no-alert': 'off', | ||||
|         'no-console': 'off', | ||||
| @@ -175,7 +183,15 @@ module.exports = { | ||||
|     ], | ||||
|     'object-curly-spacing': ['error', 'always'], | ||||
|     'no-return-await': 'off', | ||||
|     'space-before-function-paren': ['error', 'never'], | ||||
|     'space-before-function-paren': [ | ||||
|       'error', | ||||
|       { | ||||
|         anonymous: 'always', | ||||
|         named: 'never', | ||||
|         asyncArrow: 'always', | ||||
|       }, | ||||
|     ], | ||||
|     'no-multiple-empty-lines': ['error', { max: 1, maxBOF: 0, maxEOF: 1 }], | ||||
|  | ||||
|     // es6 | ||||
|     'no-var': 'error', | ||||
| @@ -281,5 +297,11 @@ module.exports = { | ||||
|  | ||||
|     // yml | ||||
|     'yml/quotes': ['error', { prefer: 'single', avoidEscape: false }], | ||||
|     'yml/no-empty-document': 'off', | ||||
|  | ||||
|     // antfu | ||||
|     'antfu/if-newline': 'error', | ||||
|     'antfu/import-dedupe': 'error', | ||||
|     // 'antfu/prefer-inline-type-import': 'error', | ||||
|   }, | ||||
| } | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-basic", | ||||
|   "version": "0.18.6", | ||||
|   "version": "0.21.1", | ||||
|   "description": "", | ||||
|   "keywords": [], | ||||
|   "license": "MIT", | ||||
|   "author": "Anthony Fu <anthonyfu117@hotmail.com> (https://github.com/antfu/)", | ||||
|   "main": "index.js", | ||||
|   "files": [ | ||||
|     "index.js" | ||||
|     "*.js" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "lint": "eslint . --config=index.js" | ||||
| @@ -16,21 +16,21 @@ | ||||
|     "eslint": ">=7.4.0" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "eslint-config-standard": "17.0.0-1", | ||||
|     "eslint-plugin-antfu": "workspace:*", | ||||
|     "eslint-plugin-eslint-comments": "^3.2.0", | ||||
|     "eslint-plugin-html": "^6.2.0", | ||||
|     "eslint-plugin-import": "^2.25.4", | ||||
|     "eslint-plugin-import": "^2.26.0", | ||||
|     "eslint-plugin-jsonc": "^2.2.1", | ||||
|     "eslint-plugin-markdown": "^2.2.1", | ||||
|     "eslint-plugin-n": "^15.0.1", | ||||
|     "eslint-plugin-n": "^15.1.0", | ||||
|     "eslint-plugin-promise": "^6.0.0", | ||||
|     "eslint-plugin-unicorn": "^41.0.0", | ||||
|     "eslint-plugin-unicorn": "^42.0.0", | ||||
|     "eslint-plugin-yml": "^0.14.0", | ||||
|     "jsonc-eslint-parser": "^2.1.0", | ||||
|     "yaml-eslint-parser": "^0.5.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.10.0" | ||||
|     "eslint": "^8.14.0" | ||||
|   }, | ||||
|   "publishConfig": { | ||||
|     "access": "public" | ||||
|   | ||||
							
								
								
									
										250
									
								
								packages/basic/standard.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										250
									
								
								packages/basic/standard.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,250 @@ | ||||
| // Inline from https://github.com/standard/eslint-config-standard/blob/master/.eslintrc.json | ||||
| // Until it upgrades | ||||
|  | ||||
| module.exports = { | ||||
|   parserOptions: { | ||||
|     ecmaVersion: 2022, | ||||
|     ecmaFeatures: { | ||||
|       jsx: true, | ||||
|     }, | ||||
|     sourceType: 'module', | ||||
|   }, | ||||
|   env: { | ||||
|     es2021: true, | ||||
|     node: true, | ||||
|   }, | ||||
|   plugins: [ | ||||
|     'import', | ||||
|     'n', | ||||
|     'promise', | ||||
|   ], | ||||
|   globals: { | ||||
|     document: 'readonly', | ||||
|     navigator: 'readonly', | ||||
|     window: 'readonly', | ||||
|   }, | ||||
|   rules: { | ||||
|     'no-var': 'warn', | ||||
|     'object-shorthand': ['warn', 'properties'], | ||||
|  | ||||
|     'accessor-pairs': ['error', { setWithoutGet: true, enforceForClassMembers: true }], | ||||
|     'array-bracket-spacing': ['error', 'never'], | ||||
|     'array-callback-return': ['error', { | ||||
|       allowImplicit: false, | ||||
|       checkForEach: false, | ||||
|     }], | ||||
|     'arrow-spacing': ['error', { before: true, after: true }], | ||||
|     'block-spacing': ['error', 'always'], | ||||
|     'brace-style': ['error', '1tbs', { allowSingleLine: true }], | ||||
|     'camelcase': ['error', { | ||||
|       allow: ['^UNSAFE_'], | ||||
|       properties: 'never', | ||||
|       ignoreGlobals: true, | ||||
|     }], | ||||
|     'comma-dangle': ['error', { | ||||
|       arrays: 'never', | ||||
|       objects: 'never', | ||||
|       imports: 'never', | ||||
|       exports: 'never', | ||||
|       functions: 'never', | ||||
|     }], | ||||
|     'comma-spacing': ['error', { before: false, after: true }], | ||||
|     'comma-style': ['error', 'last'], | ||||
|     'computed-property-spacing': ['error', 'never', { enforceForClassMembers: true }], | ||||
|     'constructor-super': 'error', | ||||
|     'curly': ['error', 'multi-line'], | ||||
|     'default-case-last': 'error', | ||||
|     'dot-location': ['error', 'property'], | ||||
|     'dot-notation': ['error', { allowKeywords: true }], | ||||
|     'eol-last': 'error', | ||||
|     'eqeqeq': ['error', 'always', { null: 'ignore' }], | ||||
|     'func-call-spacing': ['error', 'never'], | ||||
|     'generator-star-spacing': ['error', { before: true, after: true }], | ||||
|     'indent': ['error', 2, { | ||||
|       SwitchCase: 1, | ||||
|       VariableDeclarator: 1, | ||||
|       outerIIFEBody: 1, | ||||
|       MemberExpression: 1, | ||||
|       FunctionDeclaration: { parameters: 1, body: 1 }, | ||||
|       FunctionExpression: { parameters: 1, body: 1 }, | ||||
|       CallExpression: { arguments: 1 }, | ||||
|       ArrayExpression: 1, | ||||
|       ObjectExpression: 1, | ||||
|       ImportDeclaration: 1, | ||||
|       flatTernaryExpressions: false, | ||||
|       ignoreComments: false, | ||||
|       ignoredNodes: ['TemplateLiteral *', 'JSXElement', 'JSXElement > *', 'JSXAttribute', 'JSXIdentifier', 'JSXNamespacedName', 'JSXMemberExpression', 'JSXSpreadAttribute', 'JSXExpressionContainer', 'JSXOpeningElement', 'JSXClosingElement', 'JSXFragment', 'JSXOpeningFragment', 'JSXClosingFragment', 'JSXText', 'JSXEmptyExpression', 'JSXSpreadChild'], | ||||
|       offsetTernaryExpressions: true, | ||||
|     }], | ||||
|     'key-spacing': ['error', { beforeColon: false, afterColon: true }], | ||||
|     'keyword-spacing': ['error', { before: true, after: true }], | ||||
|     'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }], | ||||
|     'multiline-ternary': ['error', 'always-multiline'], | ||||
|     'new-cap': ['error', { newIsCap: true, capIsNew: false, properties: true }], | ||||
|     'new-parens': 'error', | ||||
|     'no-array-constructor': 'error', | ||||
|     'no-async-promise-executor': 'error', | ||||
|     'no-caller': 'error', | ||||
|     'no-case-declarations': 'error', | ||||
|     'no-class-assign': 'error', | ||||
|     'no-compare-neg-zero': 'error', | ||||
|     'no-cond-assign': 'error', | ||||
|     'no-const-assign': 'error', | ||||
|     'no-constant-condition': ['error', { checkLoops: false }], | ||||
|     'no-control-regex': 'error', | ||||
|     'no-debugger': 'error', | ||||
|     'no-delete-var': 'error', | ||||
|     'no-dupe-args': 'error', | ||||
|     'no-dupe-class-members': 'error', | ||||
|     'no-dupe-keys': 'error', | ||||
|     'no-duplicate-case': 'error', | ||||
|     'no-useless-backreference': 'error', | ||||
|     'no-empty': ['error', { allowEmptyCatch: true }], | ||||
|     'no-empty-character-class': 'error', | ||||
|     'no-empty-pattern': 'error', | ||||
|     'no-eval': 'error', | ||||
|     'no-ex-assign': 'error', | ||||
|     'no-extend-native': 'error', | ||||
|     'no-extra-bind': 'error', | ||||
|     'no-extra-boolean-cast': 'error', | ||||
|     'no-extra-parens': ['error', 'functions'], | ||||
|     'no-fallthrough': 'error', | ||||
|     'no-floating-decimal': 'error', | ||||
|     'no-func-assign': 'error', | ||||
|     'no-global-assign': 'error', | ||||
|     'no-implied-eval': 'error', | ||||
|     'no-import-assign': 'error', | ||||
|     'no-invalid-regexp': 'error', | ||||
|     'no-irregular-whitespace': 'error', | ||||
|     'no-iterator': 'error', | ||||
|     'no-labels': ['error', { allowLoop: false, allowSwitch: false }], | ||||
|     'no-lone-blocks': 'error', | ||||
|     'no-loss-of-precision': 'error', | ||||
|     'no-misleading-character-class': 'error', | ||||
|     'no-prototype-builtins': 'error', | ||||
|     'no-useless-catch': 'error', | ||||
|     'no-mixed-operators': ['error', { | ||||
|       groups: [ | ||||
|         ['==', '!=', '===', '!==', '>', '>=', '<', '<='], | ||||
|         ['&&', '||'], | ||||
|         ['in', 'instanceof'], | ||||
|       ], | ||||
|       allowSamePrecedence: true, | ||||
|     }], | ||||
|     'no-mixed-spaces-and-tabs': 'error', | ||||
|     'no-multi-spaces': 'error', | ||||
|     'no-multi-str': 'error', | ||||
|     'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 0 }], | ||||
|     'no-new': 'error', | ||||
|     'no-new-func': 'error', | ||||
|     'no-new-object': 'error', | ||||
|     'no-new-symbol': 'error', | ||||
|     'no-new-wrappers': 'error', | ||||
|     'no-obj-calls': 'error', | ||||
|     'no-octal': 'error', | ||||
|     'no-octal-escape': 'error', | ||||
|     'no-proto': 'error', | ||||
|     'no-redeclare': ['error', { builtinGlobals: false }], | ||||
|     'no-regex-spaces': 'error', | ||||
|     'no-return-assign': ['error', 'except-parens'], | ||||
|     'no-self-assign': ['error', { props: true }], | ||||
|     'no-self-compare': 'error', | ||||
|     'no-sequences': 'error', | ||||
|     'no-shadow-restricted-names': 'error', | ||||
|     'no-sparse-arrays': 'error', | ||||
|     'no-tabs': 'error', | ||||
|     'no-template-curly-in-string': 'error', | ||||
|     'no-this-before-super': 'error', | ||||
|     'no-throw-literal': 'error', | ||||
|     'no-trailing-spaces': 'error', | ||||
|     'no-undef': 'error', | ||||
|     'no-undef-init': 'error', | ||||
|     'no-unexpected-multiline': 'error', | ||||
|     'no-unmodified-loop-condition': 'error', | ||||
|     'no-unneeded-ternary': ['error', { defaultAssignment: false }], | ||||
|     'no-unreachable': 'error', | ||||
|     'no-unreachable-loop': 'error', | ||||
|     'no-unsafe-finally': 'error', | ||||
|     'no-unsafe-negation': 'error', | ||||
|     'no-unused-expressions': ['error', { | ||||
|       allowShortCircuit: true, | ||||
|       allowTernary: true, | ||||
|       allowTaggedTemplates: true, | ||||
|     }], | ||||
|     'no-unused-vars': ['error', { | ||||
|       args: 'none', | ||||
|       caughtErrors: 'none', | ||||
|       ignoreRestSiblings: true, | ||||
|       vars: 'all', | ||||
|     }], | ||||
|     'no-use-before-define': ['error', { functions: false, classes: false, variables: false }], | ||||
|     'no-useless-call': 'error', | ||||
|     'no-useless-computed-key': 'error', | ||||
|     'no-useless-constructor': 'error', | ||||
|     'no-useless-escape': 'error', | ||||
|     'no-useless-rename': 'error', | ||||
|     'no-useless-return': 'error', | ||||
|     'no-void': 'error', | ||||
|     'no-whitespace-before-property': 'error', | ||||
|     'no-with': 'error', | ||||
|     'object-curly-newline': ['error', { multiline: true, consistent: true }], | ||||
|     'object-curly-spacing': ['error', 'always'], | ||||
|     'object-property-newline': ['error', { allowMultiplePropertiesPerLine: true }], | ||||
|     'one-var': ['error', { initialized: 'never' }], | ||||
|     'operator-linebreak': ['error', 'after', { overrides: { '?': 'before', ':': 'before', '|>': 'before' } }], | ||||
|     'padded-blocks': ['error', { blocks: 'never', switches: 'never', classes: 'never' }], | ||||
|     'prefer-const': ['error', { destructuring: 'all' }], | ||||
|     'prefer-promise-reject-errors': 'error', | ||||
|     'prefer-regex-literals': ['error', { disallowRedundantWrapping: true }], | ||||
|     'quote-props': ['error', 'as-needed'], | ||||
|     'quotes': ['error', 'single', { avoidEscape: true, allowTemplateLiterals: false }], | ||||
|     'rest-spread-spacing': ['error', 'never'], | ||||
|     'semi': ['error', 'never'], | ||||
|     'semi-spacing': ['error', { before: false, after: true }], | ||||
|     'space-before-blocks': ['error', 'always'], | ||||
|     'space-before-function-paren': [ | ||||
|       'error', | ||||
|       { | ||||
|         'anonymous': 'always', | ||||
|         'named': 'never', | ||||
|         'asyncArrow': 'always' | ||||
|       } | ||||
|     ], | ||||
|     'space-in-parens': ['error', 'never'], | ||||
|     'space-infix-ops': 'error', | ||||
|     'space-unary-ops': ['error', { words: true, nonwords: false }], | ||||
|     'spaced-comment': ['error', 'always', { | ||||
|       line: { markers: ['*package', '!', '/', ',', '='] }, | ||||
|       block: { balanced: true, markers: ['*package', '!', ',', ':', '::', 'flow-include'], exceptions: ['*'] }, | ||||
|     }], | ||||
|     'symbol-description': 'error', | ||||
|     'template-curly-spacing': ['error', 'never'], | ||||
|     'template-tag-spacing': ['error', 'never'], | ||||
|     'unicode-bom': ['error', 'never'], | ||||
|     'use-isnan': ['error', { | ||||
|       enforceForSwitchCase: true, | ||||
|       enforceForIndexOf: true, | ||||
|     }], | ||||
|     'valid-typeof': ['error', { requireStringLiterals: true }], | ||||
|     'wrap-iife': ['error', 'any', { functionPrototypeMethods: true }], | ||||
|     'yield-star-spacing': ['error', 'both'], | ||||
|     'yoda': ['error', 'never'], | ||||
|  | ||||
|     'import/export': 'error', | ||||
|     'import/first': 'error', | ||||
|     'import/no-absolute-path': ['error', { esmodule: true, commonjs: true, amd: false }], | ||||
|     'import/no-duplicates': 'error', | ||||
|     'import/no-named-default': 'error', | ||||
|     'import/no-webpack-loader-syntax': 'error', | ||||
|  | ||||
|     'n/handle-callback-err': ['error', '^(err|error)$'], | ||||
|     'n/no-callback-literal': 'error', | ||||
|     'n/no-deprecated-api': 'error', | ||||
|     'n/no-exports-assign': 'error', | ||||
|     'n/no-new-require': 'error', | ||||
|     'n/no-path-concat': 'error', | ||||
|     'n/process-exit-as-throw': 'error', | ||||
|  | ||||
|     'promise/param-names': 'error', | ||||
|   }, | ||||
| } | ||||
							
								
								
									
										6
									
								
								packages/eslint-plugin-antfu/.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								packages/eslint-plugin-antfu/.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "extends": "@antfu", | ||||
|   "plugins": [ | ||||
|     "antfu" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										12
									
								
								packages/eslint-plugin-antfu/build.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								packages/eslint-plugin-antfu/build.config.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| import { defineBuildConfig } from 'unbuild' | ||||
|  | ||||
| export default defineBuildConfig({ | ||||
|   entries: [ | ||||
|     'src/index', | ||||
|   ], | ||||
|   declaration: true, | ||||
|   clean: true, | ||||
|   rollup: { | ||||
|     emitCJS: true, | ||||
|   }, | ||||
| }) | ||||
							
								
								
									
										31
									
								
								packages/eslint-plugin-antfu/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								packages/eslint-plugin-antfu/package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| { | ||||
|   "name": "eslint-plugin-antfu", | ||||
|   "version": "0.21.1", | ||||
|   "license": "MIT", | ||||
|   "main": "./dist/index.cjs", | ||||
|   "module": "./dist/index.mjs", | ||||
|   "types": "./dist/index.d.ts", | ||||
|   "exports": { | ||||
|     ".": { | ||||
|       "require": "./dist/index.cjs", | ||||
|       "import": "./dist/index.mjs", | ||||
|       "types": "./dist/index.d.ts" | ||||
|     } | ||||
|   }, | ||||
|   "files": [ | ||||
|     "dist" | ||||
|   ], | ||||
|   "scripts": { | ||||
|     "build": "rimraf dist && unbuild", | ||||
|     "stub": "unbuild --stub", | ||||
|     "test": "vitest", | ||||
|     "prepublishOnly": "nr build" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@typescript-eslint/utils": "^5.20.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "unbuild": "^0.7.4", | ||||
|     "vitest": "^0.9.4" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										11
									
								
								packages/eslint-plugin-antfu/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								packages/eslint-plugin-antfu/src/index.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| import ifNewline from './rules/if-newline' | ||||
| import importDedupe from './rules/import-dedupe' | ||||
| import preferInlineTypeImport from './rules/prefer-inline-type-import' | ||||
|  | ||||
| export default { | ||||
|   rules: { | ||||
|     'if-newline': ifNewline, | ||||
|     'import-dedupe': importDedupe, | ||||
|     'prefer-inline-type-import': preferInlineTypeImport, | ||||
|   }, | ||||
| } | ||||
							
								
								
									
										30
									
								
								packages/eslint-plugin-antfu/src/rules/if-newline.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								packages/eslint-plugin-antfu/src/rules/if-newline.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| import { RuleTester } from '@typescript-eslint/utils/dist/ts-eslint' | ||||
| import { it } from 'vitest' | ||||
| import rule, { RULE_NAME } from './if-newline' | ||||
|  | ||||
| const valids = [ | ||||
|   `if (true) | ||||
|   console.log('hello') | ||||
| `, | ||||
|   `if (true) { | ||||
|   console.log('hello') | ||||
| }`, | ||||
| ] | ||||
| const invalids = [ | ||||
|   ['if (true) console.log(\'hello\')', 'if (true) \nconsole.log(\'hello\')'], | ||||
| ] | ||||
|  | ||||
| it('runs', () => { | ||||
|   const ruleTester: RuleTester = new RuleTester({ | ||||
|     parser: require.resolve('@typescript-eslint/parser'), | ||||
|   }) | ||||
|  | ||||
|   ruleTester.run(RULE_NAME, rule, { | ||||
|     valid: valids, | ||||
|     invalid: invalids.map(i => ({ | ||||
|       code: i[0], | ||||
|       output: i[1], | ||||
|       errors: [{ messageId: 'missingIfNewline' }], | ||||
|     })), | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										45
									
								
								packages/eslint-plugin-antfu/src/rules/if-newline.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								packages/eslint-plugin-antfu/src/rules/if-newline.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| import { createEslintRule } from '../utils' | ||||
|  | ||||
| export const RULE_NAME = 'if-newline' | ||||
| export type MessageIds = 'missingIfNewline' | ||||
| export type Options = [] | ||||
|  | ||||
| export default createEslintRule<Options, MessageIds>({ | ||||
|   name: RULE_NAME, | ||||
|   meta: { | ||||
|     type: 'problem', | ||||
|     docs: { | ||||
|       description: 'Newline after if', | ||||
|       recommended: 'error', | ||||
|     }, | ||||
|     fixable: 'code', | ||||
|     schema: [], | ||||
|     messages: { | ||||
|       missingIfNewline: 'Expect newline after if', | ||||
|     }, | ||||
|   }, | ||||
|   defaultOptions: [], | ||||
|   create: (context) => { | ||||
|     return { | ||||
|       IfStatement(node) { | ||||
|         if (!node.consequent) | ||||
|           return | ||||
|         if (node.consequent.type === 'BlockStatement') | ||||
|           return | ||||
|         if (node.test.loc.end.line === node.consequent.loc.start.line) { | ||||
|           context.report({ | ||||
|             node, | ||||
|             loc: { | ||||
|               start: node.test.loc.end, | ||||
|               end: node.consequent.loc.start, | ||||
|             }, | ||||
|             messageId: 'missingIfNewline', | ||||
|             fix(fixer) { | ||||
|               return fixer.replaceTextRange([node.consequent.range[0], node.consequent.range[0]], '\n') | ||||
|             }, | ||||
|           }) | ||||
|         } | ||||
|       }, | ||||
|     } | ||||
|   }, | ||||
| }) | ||||
							
								
								
									
										28
									
								
								packages/eslint-plugin-antfu/src/rules/import-dedupe.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								packages/eslint-plugin-antfu/src/rules/import-dedupe.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| import { RuleTester } from '@typescript-eslint/utils/dist/ts-eslint' | ||||
| import { it } from 'vitest' | ||||
| import rule, { RULE_NAME } from './import-dedupe' | ||||
|  | ||||
| const valids = [ | ||||
|   'import { a } from \'foo\'', | ||||
| ] | ||||
| const invalids = [ | ||||
|   [ | ||||
|     'import { a, b, a, a, c, a } from \'foo\'', | ||||
|     'import { a, b,   c,  } from \'foo\'', | ||||
|   ], | ||||
| ] | ||||
|  | ||||
| it('runs', () => { | ||||
|   const ruleTester: RuleTester = new RuleTester({ | ||||
|     parser: require.resolve('@typescript-eslint/parser'), | ||||
|   }) | ||||
|  | ||||
|   ruleTester.run(RULE_NAME, rule, { | ||||
|     valid: valids, | ||||
|     invalid: invalids.map(i => ({ | ||||
|       code: i[0], | ||||
|       output: i[1], | ||||
|       errors: [{ messageId: 'importDedupe' }, { messageId: 'importDedupe' }, { messageId: 'importDedupe' }], | ||||
|     })), | ||||
|   }) | ||||
| }) | ||||
							
								
								
									
										55
									
								
								packages/eslint-plugin-antfu/src/rules/import-dedupe.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								packages/eslint-plugin-antfu/src/rules/import-dedupe.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| import { createEslintRule } from '../utils' | ||||
|  | ||||
| export const RULE_NAME = 'import-dedupe' | ||||
| export type MessageIds = 'importDedupe' | ||||
| export type Options = [] | ||||
|  | ||||
| export default createEslintRule<Options, MessageIds>({ | ||||
|   name: RULE_NAME, | ||||
|   meta: { | ||||
|     type: 'problem', | ||||
|     docs: { | ||||
|       description: 'Fix duplication in imports', | ||||
|       recommended: 'error', | ||||
|     }, | ||||
|     fixable: 'code', | ||||
|     schema: [], | ||||
|     messages: { | ||||
|       importDedupe: 'Expect no duplication in imports', | ||||
|     }, | ||||
|   }, | ||||
|   defaultOptions: [], | ||||
|   create: (context) => { | ||||
|     return { | ||||
|       ImportDeclaration(node) { | ||||
|         if (node.specifiers.length <= 1) | ||||
|           return | ||||
|  | ||||
|         const names = new Set<string>() | ||||
|         node.specifiers.forEach((n) => { | ||||
|           const id = n.local.name | ||||
|           if (names.has(id)) { | ||||
|             context.report({ | ||||
|               node, | ||||
|               loc: { | ||||
|                 start: n.loc.end, | ||||
|                 end: n.loc.start, | ||||
|               }, | ||||
|               messageId: 'importDedupe', | ||||
|               fix(fixer) { | ||||
|                 const s = n.range[0] | ||||
|                 let e = n.range[1] | ||||
|                 if (context.getSourceCode().text[e] === ',') | ||||
|                   e += 1 | ||||
|                 return fixer.removeRange([s, e]) | ||||
|               }, | ||||
|             }) | ||||
|           } | ||||
|           names.add(id) | ||||
|         }) | ||||
|  | ||||
|         // console.log(node) | ||||
|       }, | ||||
|     } | ||||
|   }, | ||||
| }) | ||||
| @@ -0,0 +1,27 @@ | ||||
| import { RuleTester } from '@typescript-eslint/utils/dist/ts-eslint' | ||||
| import { it } from 'vitest' | ||||
| import rule, { RULE_NAME } from './prefer-inline-type-import' | ||||
|  | ||||
| const valids = [ | ||||
|   'import { type Foo } from \'foo\'', | ||||
|   'import type Foo from \'foo\'', | ||||
|   'import type * as Foo from \'foo\'', | ||||
| ] | ||||
| const invalids = [ | ||||
|   ['import type { Foo } from \'foo\'', 'import { type Foo } from \'foo\''], | ||||
| ] | ||||
|  | ||||
| it('runs', () => { | ||||
|   const ruleTester: RuleTester = new RuleTester({ | ||||
|     parser: require.resolve('@typescript-eslint/parser'), | ||||
|   }) | ||||
|  | ||||
|   ruleTester.run(RULE_NAME, rule, { | ||||
|     valid: valids, | ||||
|     invalid: invalids.map(i => ({ | ||||
|       code: i[0], | ||||
|       output: i[1].trim(), | ||||
|       errors: [{ messageId: 'preferInlineTypeImport' }], | ||||
|     })), | ||||
|   }) | ||||
| }) | ||||
| @@ -0,0 +1,63 @@ | ||||
| // Ported from https://github.com/gajus/eslint-plugin-canonical/blob/master/src/rules/preferInlineTypeImport.js | ||||
| // by Gajus Kuizinas https://github.com/gajus | ||||
|  | ||||
| import { createEslintRule } from '../utils' | ||||
|  | ||||
| export const RULE_NAME = 'prefer-inline-type-import' | ||||
| export type MessageIds = 'preferInlineTypeImport' | ||||
| export type Options = [] | ||||
|  | ||||
| export default createEslintRule<Options, MessageIds>({ | ||||
|   name: RULE_NAME, | ||||
|   meta: { | ||||
|     type: 'suggestion', | ||||
|     docs: { | ||||
|       description: 'Newline after if', | ||||
|       recommended: 'error', | ||||
|     }, | ||||
|     fixable: 'code', | ||||
|     schema: [], | ||||
|     messages: { | ||||
|       preferInlineTypeImport: 'Prefer inline type import', | ||||
|     }, | ||||
|   }, | ||||
|   defaultOptions: [], | ||||
|   create: (context) => { | ||||
|     const sourceCode = context.getSourceCode() | ||||
|     return { | ||||
|       ImportDeclaration: (node) => { | ||||
|         // ignore bare type imports | ||||
|         if (node.specifiers.length === 1 && ['ImportNamespaceSpecifier', 'ImportDefaultSpecifier'].includes(node.specifiers[0].type)) | ||||
|           return | ||||
|         if (node.importKind === 'type') { | ||||
|           context.report({ | ||||
|             *fix(fixer) { | ||||
|               yield * removeTypeSpecifier(fixer, sourceCode, node) | ||||
|  | ||||
|               for (const specifier of node.specifiers) | ||||
|                 yield fixer.insertTextBefore(specifier, 'type ') | ||||
|             }, | ||||
|             loc: node.loc, | ||||
|             messageId: 'preferInlineTypeImport', | ||||
|             node, | ||||
|           }) | ||||
|         } | ||||
|       }, | ||||
|     } | ||||
|   }, | ||||
| }) | ||||
|  | ||||
| function *removeTypeSpecifier(fixer, sourceCode, node) { | ||||
|   const importKeyword = sourceCode.getFirstToken(node) | ||||
|  | ||||
|   const typeIdentifier = sourceCode.getTokenAfter(importKeyword) | ||||
|  | ||||
|   yield fixer.remove(typeIdentifier) | ||||
|  | ||||
|   if (importKeyword.loc.end.column + 1 === typeIdentifier.loc.start.column) { | ||||
|     yield fixer.removeRange([ | ||||
|       importKeyword.range[1], | ||||
|       importKeyword.range[1] + 1, | ||||
|     ]) | ||||
|   } | ||||
| } | ||||
							
								
								
									
										5
									
								
								packages/eslint-plugin-antfu/src/utils.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								packages/eslint-plugin-antfu/src/utils.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import { ESLintUtils } from '@typescript-eslint/utils' | ||||
|  | ||||
| export const createEslintRule = ESLintUtils.RuleCreator( | ||||
|   ruleName => ruleName, | ||||
| ) | ||||
| @@ -3,6 +3,46 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
|  | ||||
| ## [0.19.1](https://github.com/antfu/eslint-config/compare/v0.19.0...v0.19.1) (2022-03-30) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-react | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # [0.19.0](https://github.com/antfu/eslint-config/compare/v0.18.9...v0.19.0) (2022-03-29) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-react | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.9](https://github.com/antfu/eslint-config/compare/v0.18.8...v0.18.9) (2022-03-20) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-react | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.8](https://github.com/antfu/eslint-config/compare/v0.18.7...v0.18.8) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-react | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.7](https://github.com/antfu/eslint-config/compare/v0.18.6...v0.18.7) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-react | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.6](https://github.com/antfu/eslint-config/compare/v0.18.5...v0.18.6) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-react | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-react", | ||||
|   "version": "0.18.6", | ||||
|   "version": "0.21.1", | ||||
|   "description": "", | ||||
|   "keywords": [], | ||||
|   "license": "MIT", | ||||
| @@ -19,12 +19,12 @@ | ||||
|     "access": "public" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-ts": "^0.18.6", | ||||
|     "eslint-plugin-react": "^7.29.3" | ||||
|     "@antfu/eslint-config-ts": "workspace:*", | ||||
|     "eslint-plugin-react": "^7.29.4" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.10.0", | ||||
|     "react": "^17.0.2", | ||||
|     "typescript": "^4.6.2" | ||||
|     "eslint": "^8.14.0", | ||||
|     "react": "^18.0.0", | ||||
|     "typescript": "^4.6.3" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,49 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
|  | ||||
| ## [0.19.1](https://github.com/antfu/eslint-config/compare/v0.19.0...v0.19.1) (2022-03-30) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-ts | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # [0.19.0](https://github.com/antfu/eslint-config/compare/v0.18.9...v0.19.0) (2022-03-29) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-ts | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.9](https://github.com/antfu/eslint-config/compare/v0.18.8...v0.18.9) (2022-03-20) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-ts | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.8](https://github.com/antfu/eslint-config/compare/v0.18.7...v0.18.8) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-ts | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.7](https://github.com/antfu/eslint-config/compare/v0.18.6...v0.18.7) (2022-03-10) | ||||
|  | ||||
|  | ||||
| ### Features | ||||
|  | ||||
| * improve `no-unused-vars` rule ([2e962a2](https://github.com/antfu/eslint-config/commit/2e962a278571113853435221e8c3d43bd9fa1421)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.6](https://github.com/antfu/eslint-config/compare/v0.18.5...v0.18.6) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-ts | ||||
|   | ||||
| @@ -4,8 +4,14 @@ const basic = require('@antfu/eslint-config-basic') | ||||
| module.exports = { | ||||
|   extends: [ | ||||
|     '@antfu/eslint-config-basic', | ||||
|     'plugin:import/typescript', | ||||
|     'plugin:@typescript-eslint/recommended', | ||||
|   ], | ||||
|   settings: { | ||||
|     'import/resolver': { | ||||
|       node: { extensions: ['.js', '.jsx', '.mjs', '.ts', '.tsx', '.d.ts'] }, | ||||
|     }, | ||||
|   }, | ||||
|   overrides: basic.overrides, | ||||
|   rules: { | ||||
|     'import/named': 'off', | ||||
| @@ -23,9 +29,43 @@ module.exports = { | ||||
|     // Override JS | ||||
|     'no-useless-constructor': 'off', | ||||
|     'indent': 'off', | ||||
|     '@typescript-eslint/indent': ['error', 2], | ||||
|     '@typescript-eslint/indent': ['error', 2, { | ||||
|       SwitchCase: 1, | ||||
|       VariableDeclarator: 1, | ||||
|       outerIIFEBody: 1, | ||||
|       MemberExpression: 1, | ||||
|       FunctionDeclaration: { parameters: 1, body: 1 }, | ||||
|       FunctionExpression: { parameters: 1, body: 1 }, | ||||
|       CallExpression: { arguments: 1 }, | ||||
|       ArrayExpression: 1, | ||||
|       ObjectExpression: 1, | ||||
|       ImportDeclaration: 1, | ||||
|       flatTernaryExpressions: false, | ||||
|       ignoreComments: false, | ||||
|       ignoredNodes: [ | ||||
|         'TemplateLiteral *', | ||||
|         'JSXElement', | ||||
|         'JSXElement > *', | ||||
|         'JSXAttribute', | ||||
|         'JSXIdentifier', | ||||
|         'JSXNamespacedName', | ||||
|         'JSXMemberExpression', | ||||
|         'JSXSpreadAttribute', | ||||
|         'JSXExpressionContainer', | ||||
|         'JSXOpeningElement', | ||||
|         'JSXClosingElement', | ||||
|         'JSXFragment', | ||||
|         'JSXOpeningFragment', | ||||
|         'JSXClosingFragment', | ||||
|         'JSXText', | ||||
|         'JSXEmptyExpression', | ||||
|         'JSXSpreadChild', | ||||
|         'TSTypeParameterInstantiation', | ||||
|       ], | ||||
|       offsetTernaryExpressions: true, | ||||
|     }], | ||||
|     'no-unused-vars': 'off', | ||||
|     '@typescript-eslint/no-unused-vars': 'error', | ||||
|     '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], | ||||
|     'no-redeclare': 'off', | ||||
|     '@typescript-eslint/no-redeclare': 'error', | ||||
|     'no-use-before-define': 'off', | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-ts", | ||||
|   "version": "0.18.6", | ||||
|   "version": "0.21.1", | ||||
|   "description": "", | ||||
|   "keywords": [], | ||||
|   "license": "MIT", | ||||
| @@ -17,11 +17,11 @@ | ||||
|     "typescript": ">=3.9" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-basic": "^0.18.6", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.13.0", | ||||
|     "@typescript-eslint/parser": "^5.13.0" | ||||
|     "@antfu/eslint-config-basic": "workspace:*", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.20.0", | ||||
|     "@typescript-eslint/parser": "^5.20.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.10.0" | ||||
|     "eslint": "^8.14.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,52 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
| See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. | ||||
|  | ||||
| ## [0.19.1](https://github.com/antfu/eslint-config/compare/v0.19.0...v0.19.1) (2022-03-30) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-vue | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # [0.19.0](https://github.com/antfu/eslint-config/compare/v0.18.9...v0.19.0) (2022-03-29) | ||||
|  | ||||
|  | ||||
| ### Features | ||||
|  | ||||
| * vue sfc tags order ([d4538f4](https://github.com/antfu/eslint-config/commit/d4538f42b14d0f7c824795945ffa556d585ceb06)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.9](https://github.com/antfu/eslint-config/compare/v0.18.8...v0.18.9) (2022-03-20) | ||||
|  | ||||
|  | ||||
| ### Bug Fixes | ||||
|  | ||||
| * **vue:** disable `vue/no-setup-props-destructure` ([0a1f8c5](https://github.com/antfu/eslint-config/commit/0a1f8c56124ac1735e7b26879ac3e6ab9289ca74)) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.8](https://github.com/antfu/eslint-config/compare/v0.18.7...v0.18.8) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-vue | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.7](https://github.com/antfu/eslint-config/compare/v0.18.6...v0.18.7) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-vue | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ## [0.18.6](https://github.com/antfu/eslint-config/compare/v0.18.5...v0.18.6) (2022-03-10) | ||||
|  | ||||
| **Note:** Version bump only for package @antfu/eslint-config-vue | ||||
|   | ||||
| @@ -23,5 +23,12 @@ module.exports = { | ||||
|     'vue/require-prop-types': 'off', | ||||
|     'vue/require-default-prop': 'off', | ||||
|     'vue/multi-word-component-names': 'off', | ||||
|  | ||||
|     // reactivity transform | ||||
|     'vue/no-setup-props-destructure': 'off', | ||||
|  | ||||
|     'vue/component-tags-order': ['error', { | ||||
|       order: ['script', 'template', 'style'], | ||||
|     }], | ||||
|   }, | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@antfu/eslint-config-vue", | ||||
|   "version": "0.18.6", | ||||
|   "version": "0.21.1", | ||||
|   "description": "", | ||||
|   "keywords": [], | ||||
|   "license": "MIT", | ||||
| @@ -16,10 +16,10 @@ | ||||
|     "access": "public" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@antfu/eslint-config-ts": "^0.18.6", | ||||
|     "eslint-plugin-vue": "^8.5.0" | ||||
|     "@antfu/eslint-config-ts": "workspace:*", | ||||
|     "eslint-plugin-vue": "^8.7.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "eslint": "^8.10.0" | ||||
|     "eslint": "^8.14.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										4967
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4967
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user