eslint-plugin-esm 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +7 -3
  4. package/dist/rules/no-empty-exports.d.ts +5 -0
  5. package/dist/rules/no-empty-exports.d.ts.map +1 -0
  6. package/dist/rules/no-empty-exports.js +11 -0
  7. package/dist/rules/no-phantom-dep-imports.d.ts.map +1 -1
  8. package/dist/rules/no-phantom-dep-imports.js +10 -3
  9. package/dist/rules/no-side-effect-imports.d.ts.map +1 -1
  10. package/dist/rules/no-side-effect-imports.js +1 -4
  11. package/dist/rules/no-ts-file-imports.js +2 -6
  12. package/dist/rules/no-useless-path-segments.d.ts +5 -0
  13. package/dist/rules/no-useless-path-segments.d.ts.map +1 -0
  14. package/dist/rules/no-useless-path-segments.js +28 -0
  15. package/dist/rules/required-exports.d.ts +5 -0
  16. package/dist/rules/required-exports.d.ts.map +1 -0
  17. package/dist/rules/required-exports.js +22 -0
  18. package/doc/rules/no-empty-exports.md +29 -0
  19. package/doc/rules/no-side-effect-imports.md +13 -14
  20. package/doc/rules/no-ts-file-imports.md +18 -102
  21. package/doc/rules/{nearest-relative-path.md → no-useless-path-segments.md} +7 -1
  22. package/doc/rules/required-exports.md +31 -0
  23. package/package.json +2 -2
  24. package/src/index.ts +6 -2
  25. package/src/rules/no-empty-exports.spec.ts +22 -0
  26. package/src/rules/no-empty-exports.ts +14 -0
  27. package/src/rules/no-phantom-dep-imports.ts +10 -2
  28. package/src/rules/no-side-effect-imports.spec.ts +2 -4
  29. package/src/rules/no-side-effect-imports.ts +0 -7
  30. package/src/rules/no-ts-file-imports.spec.ts +2 -11
  31. package/src/rules/no-ts-file-imports.ts +1 -9
  32. package/src/rules/{nearest-relative-path.spec.ts → no-useless-path-segments.spec.ts} +10 -2
  33. package/src/rules/{nearest-relative-path.ts → no-useless-path-segments.ts} +5 -2
  34. package/src/rules/required-exports.spec.ts +24 -0
  35. package/src/rules/required-exports.ts +22 -0
  36. package/dist/rules/nearest-relative-path.d.ts +0 -5
  37. package/dist/rules/nearest-relative-path.d.ts.map +0 -1
  38. package/dist/rules/nearest-relative-path.js +0 -25
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # eslint-plugin-esm
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 85cd2d5: refactor(eslint-plugin-esm): rename rule `nearest-relative-path` to `no-useless-path-segments`
8
+
9
+ ### Patch Changes
10
+
11
+ - 36c4c6b: fix(eslint-plugin-esm): report on `./..` and `./`
12
+
13
+ ## 0.3.0
14
+
15
+ ### Minor Changes
16
+
17
+ - 1b7d98c: refactor(eslint-plugin-esm): `no-side-effect-imports` will not ignore declaration files now
18
+ - 2d485c9: refactor(eslint-plugin-esm): `no-ts-file-imports` will not ignore declaration files now
19
+
20
+ ### Patch Changes
21
+
22
+ - 6c64129: feat: add rule `no-empty-exports`
23
+ - d54423b: fix(eslint-plugin-esm): additionally check for importing node built-in module
24
+ - 778a198: feat: add rule `esm/required-exports`
25
+
3
26
  ## 0.2.2
4
27
 
5
28
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,KAAK;;CAWjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,KAAK;;CAajB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { nearestRelativePath } from "./rules/nearest-relative-path.js";
2
1
  import { noDirectoryImports } from "./rules/no-directory-imports.js";
3
2
  import { noDynamicImports } from "./rules/no-dynamic-imports.js";
3
+ import { noEmptyExports } from "./rules/no-empty-exports.js";
4
4
  import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.js";
5
5
  import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.js";
6
6
  import { noRelativeParentImports } from "./rules/no-relative-parent-imports.js";
@@ -8,10 +8,12 @@ import { noRenameExports } from "./rules/no-rename-exports.js";
8
8
  import { noRenameImports } from "./rules/no-rename-imports.js";
9
9
  import { noSideEffectImports } from "./rules/no-side-effect-imports.js";
10
10
  import { noTsFileImports } from "./rules/no-ts-file-imports.js";
11
+ import { noUselessPathSegments } from "./rules/no-useless-path-segments.js";
12
+ import { requiredExports } from "./rules/required-exports.js";
11
13
  export const rules = {
12
- [nearestRelativePath.name]: nearestRelativePath.rule,
13
14
  [noDirectoryImports.name]: noDirectoryImports.rule,
14
15
  [noDynamicImports.name]: noDynamicImports.rule,
16
+ [noEmptyExports.name]: noEmptyExports.rule,
15
17
  [noGitIgnoredImports.name]: noGitIgnoredImports.rule,
16
18
  [noPhantomDepImports.name]: noPhantomDepImports.rule,
17
19
  [noRelativeParentImports.name]: noRelativeParentImports.rule,
@@ -19,5 +21,7 @@ export const rules = {
19
21
  [noRenameImports.name]: noRenameImports.rule,
20
22
  [noSideEffectImports.name]: noSideEffectImports.rule,
21
23
  [noTsFileImports.name]: noTsFileImports.rule,
24
+ [noUselessPathSegments.name]: noUselessPathSegments.rule,
25
+ [requiredExports.name]: requiredExports.rule,
22
26
  };
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUk7SUFDbEQsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJO0lBQzlDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRSx1QkFBdUIsQ0FBQyxJQUFJO0lBQzVELENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJO0lBQzVDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJO0lBQzVDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSTtDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbmVhcmVzdFJlbGF0aXZlUGF0aCB9IGZyb20gXCIuL3J1bGVzL25lYXJlc3QtcmVsYXRpdmUtcGF0aC5qc1wiO1xuaW1wb3J0IHsgbm9EaXJlY3RvcnlJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZGlyZWN0b3J5LWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vRHluYW1pY0ltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1keW5hbWljLWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vR2l0SWdub3JlZEltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1naXQtaWdub3JlZC1pbXBvcnRzLmpzXCI7XG5pbXBvcnQgeyBub1BoYW50b21EZXBJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcGhhbnRvbS1kZXAtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9SZWxhdGl2ZVBhcmVudEltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9SZW5hbWVFeHBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcmVuYW1lLWV4cG9ydHMuanNcIjtcbmltcG9ydCB7IG5vUmVuYW1lSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXJlbmFtZS1pbXBvcnRzLmpzXCI7XG5pbXBvcnQgeyBub1NpZGVFZmZlY3RJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tc2lkZS1lZmZlY3QtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9Uc0ZpbGVJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tdHMtZmlsZS1pbXBvcnRzLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgW25lYXJlc3RSZWxhdGl2ZVBhdGgubmFtZV06IG5lYXJlc3RSZWxhdGl2ZVBhdGgucnVsZSxcbiAgW25vRGlyZWN0b3J5SW1wb3J0cy5uYW1lXTogbm9EaXJlY3RvcnlJbXBvcnRzLnJ1bGUsXG4gIFtub0R5bmFtaWNJbXBvcnRzLm5hbWVdOiBub0R5bmFtaWNJbXBvcnRzLnJ1bGUsXG4gIFtub0dpdElnbm9yZWRJbXBvcnRzLm5hbWVdOiBub0dpdElnbm9yZWRJbXBvcnRzLnJ1bGUsXG4gIFtub1BoYW50b21EZXBJbXBvcnRzLm5hbWVdOiBub1BoYW50b21EZXBJbXBvcnRzLnJ1bGUsXG4gIFtub1JlbGF0aXZlUGFyZW50SW1wb3J0cy5uYW1lXTogbm9SZWxhdGl2ZVBhcmVudEltcG9ydHMucnVsZSxcbiAgW25vUmVuYW1lRXhwb3J0cy5uYW1lXTogbm9SZW5hbWVFeHBvcnRzLnJ1bGUsXG4gIFtub1JlbmFtZUltcG9ydHMubmFtZV06IG5vUmVuYW1lSW1wb3J0cy5ydWxlLFxuICBbbm9TaWRlRWZmZWN0SW1wb3J0cy5uYW1lXTogbm9TaWRlRWZmZWN0SW1wb3J0cy5ydWxlLFxuICBbbm9Uc0ZpbGVJbXBvcnRzLm5hbWVdOiBub1RzRmlsZUltcG9ydHMucnVsZSxcbn07XG4iXX0=
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJO0lBQ2xELENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtJQUM5QyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLENBQUMsSUFBSTtJQUMxQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsSUFBSTtJQUM1RCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSTtJQUM1QyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSTtJQUM1QyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxJQUFJO0lBQ3hELENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub0RpcmVjdG9yeUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1kaXJlY3RvcnktaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9EeW5hbWljSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLWR5bmFtaWMtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9FbXB0eUV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1lbXB0eS1leHBvcnRzLmpzXCI7XG5pbXBvcnQgeyBub0dpdElnbm9yZWRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZ2l0LWlnbm9yZWQtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9QaGFudG9tRGVwSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXBoYW50b20tZGVwLWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vUmVsYXRpdmVQYXJlbnRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vUmVuYW1lRXhwb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXJlbmFtZS1leHBvcnRzLmpzXCI7XG5pbXBvcnQgeyBub1JlbmFtZUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZW5hbWUtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9TaWRlRWZmZWN0SW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXNpZGUtZWZmZWN0LWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vVHNGaWxlSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXRzLWZpbGUtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9Vc2VsZXNzUGF0aFNlZ21lbnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzLmpzXCI7XG5pbXBvcnQgeyByZXF1aXJlZEV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9yZXF1aXJlZC1leHBvcnRzLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgW25vRGlyZWN0b3J5SW1wb3J0cy5uYW1lXTogbm9EaXJlY3RvcnlJbXBvcnRzLnJ1bGUsXG4gIFtub0R5bmFtaWNJbXBvcnRzLm5hbWVdOiBub0R5bmFtaWNJbXBvcnRzLnJ1bGUsXG4gIFtub0VtcHR5RXhwb3J0cy5uYW1lXTogbm9FbXB0eUV4cG9ydHMucnVsZSxcbiAgW25vR2l0SWdub3JlZEltcG9ydHMubmFtZV06IG5vR2l0SWdub3JlZEltcG9ydHMucnVsZSxcbiAgW25vUGhhbnRvbURlcEltcG9ydHMubmFtZV06IG5vUGhhbnRvbURlcEltcG9ydHMucnVsZSxcbiAgW25vUmVsYXRpdmVQYXJlbnRJbXBvcnRzLm5hbWVdOiBub1JlbGF0aXZlUGFyZW50SW1wb3J0cy5ydWxlLFxuICBbbm9SZW5hbWVFeHBvcnRzLm5hbWVdOiBub1JlbmFtZUV4cG9ydHMucnVsZSxcbiAgW25vUmVuYW1lSW1wb3J0cy5uYW1lXTogbm9SZW5hbWVJbXBvcnRzLnJ1bGUsXG4gIFtub1NpZGVFZmZlY3RJbXBvcnRzLm5hbWVdOiBub1NpZGVFZmZlY3RJbXBvcnRzLnJ1bGUsXG4gIFtub1RzRmlsZUltcG9ydHMubmFtZV06IG5vVHNGaWxlSW1wb3J0cy5ydWxlLFxuICBbbm9Vc2VsZXNzUGF0aFNlZ21lbnRzLm5hbWVdOiBub1VzZWxlc3NQYXRoU2VnbWVudHMucnVsZSxcbiAgW3JlcXVpcmVkRXhwb3J0cy5uYW1lXTogcmVxdWlyZWRFeHBvcnRzLnJ1bGUsXG59O1xuIl19
@@ -0,0 +1,5 @@
1
+ export declare const noEmptyExports: {
2
+ name: string;
3
+ rule: import("eslint").Rule.RuleModule;
4
+ };
5
+ //# sourceMappingURL=no-empty-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-empty-exports.d.ts","sourceRoot":"","sources":["../../src/rules/no-empty-exports.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc;;;CAUzB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.js";
2
+ export const noEmptyExports = createRule({
3
+ name: getRuleName(import.meta.url),
4
+ message: "Disallow `export {}`.",
5
+ create: (context) => ({
6
+ "ExportNamedDeclaration[specifiers.length=0][declaration=null]": (node) => {
7
+ context.report({ node, messageId: DEFAULT_MESSAGE_ID });
8
+ },
9
+ }),
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tZW1wdHktZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1lbXB0eS1leHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUM7SUFDdkMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsdUJBQXVCO0lBQ2hDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQiwrREFBK0QsRUFBRSxDQUMvRCxJQUFVLEVBQ1YsRUFBRTtZQUNGLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO0tBQ0YsQ0FBQztDQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIERFRkFVTFRfTUVTU0FHRV9JRCwgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBub0VtcHR5RXhwb3J0cyA9IGNyZWF0ZVJ1bGUoe1xuICBuYW1lOiBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpLFxuICBtZXNzYWdlOiBcIkRpc2FsbG93IGBleHBvcnQge31gLlwiLFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiAoe1xuICAgIFwiRXhwb3J0TmFtZWREZWNsYXJhdGlvbltzcGVjaWZpZXJzLmxlbmd0aD0wXVtkZWNsYXJhdGlvbj1udWxsXVwiOiAoXG4gICAgICBub2RlOiBOb2RlLFxuICAgICkgPT4ge1xuICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IERFRkFVTFRfTUVTU0FHRV9JRCB9KTtcbiAgICB9LFxuICB9KSxcbn0pO1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"no-phantom-dep-imports.d.ts","sourceRoot":"","sources":["../../src/rules/no-phantom-dep-imports.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,mBAAmB;;;CAiE9B,CAAC"}
1
+ {"version":3,"file":"no-phantom-dep-imports.d.ts","sourceRoot":"","sources":["../../src/rules/no-phantom-dep-imports.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,mBAAmB;;;CAyE9B,CAAC"}
@@ -49,8 +49,9 @@ export const noPhantomDepImports = createRule({
49
49
  ],
50
50
  create: (context) => create(context, (filename, source, node) => {
51
51
  const { allowDevDependencies = false, } = context.options[0] ?? {};
52
- // ignore `import {foo} from './'` and `import {foo} from 'node:foo'`
53
- if (getSourceType(source) !== "module") {
52
+ // ignore `import {foo} from './'`
53
+ // check `import {foo} from 'node:foo'` and `import {foo} from 'foo'`
54
+ if (getSourceType(source) === "local") {
54
55
  return false;
55
56
  }
56
57
  const pkgJson = getPkgJson(path.dirname(filename));
@@ -70,6 +71,12 @@ export const noPhantomDepImports = createRule({
70
71
  isObject(pkgJson.content.devDependencies)
71
72
  ? pkgJson.content.devDependencies
72
73
  : {};
74
+ // TODO: Optimize the error message which is reported on `import foo from 'node:foo'`
75
+ // 1. check `import foo from 'node:foo'`
76
+ if (source.startsWith("node:")) {
77
+ return !("@types/node" in devDep || "@types/node" in dep);
78
+ }
79
+ // 2. check `import foo from 'foo'`
73
80
  const moduleName = source
74
81
  .split("/")
75
82
  .slice(0, source.startsWith("@") ? 2 : 1)
@@ -90,4 +97,4 @@ export const noPhantomDepImports = createRule({
90
97
  }
91
98
  }),
92
99
  });
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tcGhhbnRvbS1kZXAtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1waGFudG9tLWRlcC1pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUUsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxRQUFnQjtJQUM5QixJQUFJLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBeUQsQ0FBQyxDQUFDLG9DQUFvQztBQUNwSCxTQUFTLFVBQVUsQ0FDakIsR0FBVztJQUVYLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25CLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbkQsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFD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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWIsTUFBTSxPQUFPLEdBQUcsVUFBVSxJQUFJLEdBQUcsSUFBSSxVQUFVLElBQUksT0FBTyxDQUFDO1FBQzNELE1BQU0sT0FBTyxHQUFHLFVBQVUsSUFBSSxNQUFNLENBQUM7UUFDckMsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdkQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxVQUFVLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDcEQsQ0FBQyxDQUFDLFVBQVUsVUFBVSxFQUFFLENBQUM7WUFDM0IsT0FBTyxDQUFDLENBQ04sT0FBTztnQkFDUCxPQUFPO2dCQUNQLFdBQVcsSUFBSSxHQUFHO2dCQUNsQixXQUFXLElBQUksTUFBTSxDQUN0QixDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0NBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGUsIGNyZWF0ZVJ1bGUsIGdldFJ1bGVOYW1lLCBnZXRTb3VyY2VUeXBlIH0gZnJvbSBcIi4uL2NvbW1vbi5qc1wiO1xuXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZTogdW5rbm93bikge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiO1xufVxuXG5mdW5jdGlvbiBpc0ZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICB0cnkge1xuICAgIHJldHVybiBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHBhdGg6IHN0cmluZzsgY29udGVudDogb2JqZWN0IH0gfCB1bmRlZmluZWQ+KCk7IC8vIGtleSBpcyBkaXIsIHZhbHVlIGlzIHBhY2thZ2UuanNvblxuZnVuY3Rpb24gZ2V0UGtnSnNvbihcbiAgZGlyOiBzdHJpbmcsXG4pOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogb2JqZWN0IH0gfCB1bmRlZmluZWQge1xuICBpZiAoY2FjaGUuaGFzKGRpcikpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KGRpcik7XG4gIH1cbiAgY29uc3QgcGtnSnNvblBhdGggPSBwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgaWYgKGlzRmlsZShwa2dKc29uUGF0aCkpIHtcbiAgICBjb25zdCBjb250ZW50OiB1bmtub3duID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGtnSnNvblBhdGgsIFwidXRmOFwiKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gaXNPYmplY3QoY29udGVudClcbiAgICAgID8geyBwYXRoOiBwa2dKc29uUGF0aCwgY29udGVudCB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjYWNoZS5zZXQoZGlyLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBpZiBpdCBpcyBhIGRpcmVjdG9yeVxuICBpZiAoZGlyID09PSBwcm9jZXNzLmN3ZCgpIHx8IGRpciA9PT0gXCIvXCIpIHtcbiAgICAvLyBzdG9wIGhlcmVcbiAgICBjYWNoZS5zZXQoZGlyLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gZ2V0UGtnSnNvbihwYXRoLmpvaW4oZGlyLCBcIi4uXCIpKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vUGhhbnRvbURlcEltcG9ydHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTpcbiAgICBcIkRpc2FsbG93IGltcG9ydGluZyBmcm9tIGEgbW9kdWxlIHdoaWNoIHRoZSBuZWFyZXN0IGBwYWNrYWdlLmpzb25gIGRvZXNuJ3QgaW5jbHVkZSBpdC5cIixcbiAgc2NoZW1hOiBbXG4gICAge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgYWxsb3dEZXZEZXBlbmRlbmNpZXM6IHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgfSxcbiAgXSxcbiAgY3JlYXRlOiAoY29udGV4dCkgPT5cbiAgICBjcmVhdGUoY29udGV4dCwgKGZpbGVuYW1lLCBzb3VyY2UsIG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxsb3dEZXZEZXBlbmRlbmNpZXMgPSBmYWxzZSxcbiAgICAgIH06IHsgYWxsb3dEZXZEZXBlbmRlbmNpZXM6IGJvb2xlYW4gfSA9IGNvbnRleHQub3B0aW9uc1swXSA/PyB7fTtcblxuICAgICAgLy8gaWdub3JlIGBpbXBvcnQge2Zvb30gZnJvbSAnLi8nYCBhbmQgYGltcG9ydCB7Zm9vfSBmcm9tICdub2RlOmZvbydgXG4gICAgICBpZiAoZ2V0U291cmNlVHlwZShzb3VyY2UpICE9PSBcIm1vZHVsZVwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBrZ0pzb24gPSBnZXRQa2dKc29uKHBhdGguZGlybmFtZShmaWxlbmFtZSkpO1xuICAgICAgLy8gY2Fubm90IGZpbmQgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgIGlmICghcGtnSnNvbikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcCA9XG4gICAgICAgIFwiZGVwZW5kZW5jaWVzXCIgaW4gcGtnSnNvbi5jb250ZW50ICYmXG4gICAgICAgIGlzT2JqZWN0KHBrZ0pzb24uY29udGVudC5kZXBlbmRlbmNpZXMpXG4gICAgICAgICAgPyBwa2dKc29uLmNvbnRlbnQuZGVwZW5kZW5jaWVzXG4gICAgICAgICAgOiB7fTtcbiAgICAgIGNvbnN0IHBlZXJEZXAgPVxuICAgICAgICBcInBlZXJEZXBlbmRlbmNpZXNcIiBpbiBwa2dKc29uLmNvbnRlbnQgJiZcbiAgICAgICAgaXNPYmplY3QocGtnSnNvbi5jb250ZW50LnBlZXJEZXBlbmRlbmNpZXMpXG4gICAgICAgICAgPyBwa2dKc29uLmNvbnRlbnQucGVlckRlcGVuZGVuY2llc1xuICAgICAgICAgIDoge307XG4gICAgICBjb25zdCBkZXZEZXAgPVxuICAgICAgICBcImRldkRlcGVuZGVuY2llc1wiIGluIHBrZ0pzb24uY29udGVudCAmJlxuICAgICAgICBpc09iamVjdChwa2dKc29uLmNvbnRlbnQuZGV2RGVwZW5kZW5jaWVzKVxuICAgICAgICAgID8gcGtnSnNvbi5jb250ZW50LmRldkRlcGVuZGVuY2llc1xuICAgICAgICAgIDoge307XG5cbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBzb3VyY2VcbiAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAuc2xpY2UoMCwgc291cmNlLnN0YXJ0c1dpdGgoXCJAXCIpID8gMiA6IDEpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaXNJbkRlcCA9IG1vZHVsZU5hbWUgaW4gZGVwIHx8IG1vZHVsZU5hbWUgaW4gcGVlckRlcDtcbiAgICAgIGNvbnN0IGlzSW5EZXYgPSBtb2R1bGVOYW1lIGluIGRldkRlcDtcbiAgICAgIGlmIChcImltcG9ydEtpbmRcIiBpbiBub2RlICYmIG5vZGUuaW1wb3J0S2luZCA9PT0gXCJ0eXBlXCIpIHtcbiAgICAgICAgY29uc3QgdHlwZURlcE5hbWUgPSBtb2R1bGVOYW1lLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgICAgICAgPyBgQHR5cGVzLyR7bW9kdWxlTmFtZS5zbGljZSgxKS5yZXBsYWNlKFwiL1wiLCBcIl9fXCIpfWBcbiAgICAgICAgICA6IGBAdHlwZXMvJHttb2R1bGVOYW1lfWA7XG4gICAgICAgIHJldHVybiAhKFxuICAgICAgICAgIGlzSW5EZXAgfHxcbiAgICAgICAgICBpc0luRGV2IHx8XG4gICAgICAgICAgdHlwZURlcE5hbWUgaW4gZGVwIHx8XG4gICAgICAgICAgdHlwZURlcE5hbWUgaW4gZGV2RGVwXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWxsb3dEZXZEZXBlbmRlbmNpZXMgPyAhKGlzSW5EZXAgfHwgaXNJbkRldikgOiAhaXNJbkRlcDtcbiAgICAgIH1cbiAgICB9KSxcbn0pO1xuIl19
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tcGhhbnRvbS1kZXAtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1waGFudG9tLWRlcC1pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUUsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM5QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxRQUFnQjtJQUM5QixJQUFJLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBeUQsQ0FBQyxDQUFDLG9DQUFvQztBQUNwSCxTQUFTLFVBQVUsQ0FDakIsR0FBVztJQUVYLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ25CLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDbkQsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFD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QUFNLElBQUksYUFBYSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsTUFBTTthQUN0QixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixNQUFNLE9BQU8sR0FBRyxVQUFVLElBQUksR0FBRyxJQUFJLFVBQVUsSUFBSSxPQUFPLENBQUM7UUFDM0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxJQUFJLE1BQU0sQ0FBQztRQUNyQyxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN2RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDNUMsQ0FBQyxDQUFDLFVBQVUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNwRCxDQUFDLENBQUMsVUFBVSxVQUFVLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsQ0FDTixPQUFPO2dCQUNQLE9BQU87Z0JBQ1AsV0FBVyxJQUFJLEdBQUc7Z0JBQ2xCLFdBQVcsSUFBSSxNQUFNLENBQ3RCLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDLENBQUM7Q0FDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJub2RlOnByb2Nlc3NcIjtcbmltcG9ydCB7IGNyZWF0ZSwgY3JlYXRlUnVsZSwgZ2V0UnVsZU5hbWUsIGdldFNvdXJjZVR5cGUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG59XG5cbmZ1bmN0aW9uIGlzRmlsZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLnN0YXRTeW5jKGZpbGVQYXRoKS5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBvYmplY3QgfSB8IHVuZGVmaW5lZD4oKTsgLy8ga2V5IGlzIGRpciwgdmFsdWUgaXMgcGFja2FnZS5qc29uXG5mdW5jdGlvbiBnZXRQa2dKc29uKFxuICBkaXI6IHN0cmluZyxcbik6IHsgcGF0aDogc3RyaW5nOyBjb250ZW50OiBvYmplY3QgfSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjYWNoZS5oYXMoZGlyKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQoZGlyKTtcbiAgfVxuICBjb25zdCBwa2dKc29uUGF0aCA9IHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpO1xuICBpZiAoaXNGaWxlKHBrZ0pzb25QYXRoKSkge1xuICAgIGNvbnN0IGNvbnRlbnQ6IHVua25vd24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwa2dKc29uUGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBjb25zdCByZXN1bHQgPSBpc09iamVjdChjb250ZW50KVxuICAgICAgPyB7IHBhdGg6IHBrZ0pzb25QYXRoLCBjb250ZW50IH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNhY2hlLnNldChkaXIsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGlmIGl0IGlzIGEgZGlyZWN0b3J5XG4gIGlmIChkaXIgPT09IHByb2Nlc3MuY3dkKCkgfHwgZGlyID09PSBcIi9cIikge1xuICAgIC8vIHN0b3AgaGVyZVxuICAgIGNhY2hlLnNldChkaXIsIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBnZXRQa2dKc29uKHBhdGguam9pbihkaXIsIFwiLi5cIikpO1xufVxuXG5leHBvcnQgY29uc3Qgbm9QaGFudG9tRGVwSW1wb3J0cyA9IGNyZWF0ZVJ1bGUoe1xuICBuYW1lOiBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpLFxuICBtZXNzYWdlOlxuICAgIFwiRGlzYWxsb3cgaW1wb3J0aW5nIGZyb20gYSBtb2R1bGUgd2hpY2ggdGhlIG5lYXJlc3QgYHBhY2thZ2UuanNvbmAgZG9lc24ndCBpbmNsdWRlIGl0LlwiLFxuICBzY2hlbWE6IFtcbiAgICB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBhbGxvd0RldkRlcGVuZGVuY2llczogeyB0eXBlOiBcImJvb2xlYW5cIiB9LFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICB9LFxuICBdLFxuICBjcmVhdGU6IChjb250ZXh0KSA9PlxuICAgIGNyZWF0ZShjb250ZXh0LCAoZmlsZW5hbWUsIHNvdXJjZSwgbm9kZSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhbGxvd0RldkRlcGVuZGVuY2llcyA9IGZhbHNlLFxuICAgICAgfTogeyBhbGxvd0RldkRlcGVuZGVuY2llczogYm9vbGVhbiB9ID0gY29udGV4dC5vcHRpb25zWzBdID8/IHt9O1xuXG4gICAgICAvLyBpZ25vcmUgYGltcG9ydCB7Zm9vfSBmcm9tICcuLydgXG4gICAgICAvLyBjaGVjayBgaW1wb3J0IHtmb299IGZyb20gJ25vZGU6Zm9vJ2AgYW5kIGBpbXBvcnQge2Zvb30gZnJvbSAnZm9vJ2BcbiAgICAgIGlmIChnZXRTb3VyY2VUeXBlKHNvdXJjZSkgPT09IFwibG9jYWxcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBwa2dKc29uID0gZ2V0UGtnSnNvbihwYXRoLmRpcm5hbWUoZmlsZW5hbWUpKTtcbiAgICAgIC8vIGNhbm5vdCBmaW5kIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICBpZiAoIXBrZ0pzb24pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkZXAgPVxuICAgICAgICBcImRlcGVuZGVuY2llc1wiIGluIHBrZ0pzb24uY29udGVudCAmJlxuICAgICAgICBpc09iamVjdChwa2dKc29uLmNvbnRlbnQuZGVwZW5kZW5jaWVzKVxuICAgICAgICAgID8gcGtnSnNvbi5jb250ZW50LmRlcGVuZGVuY2llc1xuICAgICAgICAgIDoge307XG4gICAgICBjb25zdCBwZWVyRGVwID1cbiAgICAgICAgXCJwZWVyRGVwZW5kZW5jaWVzXCIgaW4gcGtnSnNvbi5jb250ZW50ICYmXG4gICAgICAgIGlzT2JqZWN0KHBrZ0pzb24uY29udGVudC5wZWVyRGVwZW5kZW5jaWVzKVxuICAgICAgICAgID8gcGtnSnNvbi5jb250ZW50LnBlZXJEZXBlbmRlbmNpZXNcbiAgICAgICAgICA6IHt9O1xuICAgICAgY29uc3QgZGV2RGVwID1cbiAgICAgICAgXCJkZXZEZXBlbmRlbmNpZXNcIiBpbiBwa2dKc29uLmNvbnRlbnQgJiZcbiAgICAgICAgaXNPYmplY3QocGtnSnNvbi5jb250ZW50LmRldkRlcGVuZGVuY2llcylcbiAgICAgICAgICA/IHBrZ0pzb24uY29udGVudC5kZXZEZXBlbmRlbmNpZXNcbiAgICAgICAgICA6IHt9O1xuXG4gICAgICAvLyBUT0RPOiBPcHRpbWl6ZSB0aGUgZXJyb3IgbWVzc2FnZSB3aGljaCBpcyByZXBvcnRlZCBvbiBgaW1wb3J0IGZvbyBmcm9tICdub2RlOmZvbydgXG4gICAgICAvLyAxLiBjaGVjayBgaW1wb3J0IGZvbyBmcm9tICdub2RlOmZvbydgXG4gICAgICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoXCJub2RlOlwiKSkge1xuICAgICAgICByZXR1cm4gIShcIkB0eXBlcy9ub2RlXCIgaW4gZGV2RGVwIHx8IFwiQHR5cGVzL25vZGVcIiBpbiBkZXApO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBjaGVjayBgaW1wb3J0IGZvbyBmcm9tICdmb28nYFxuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IHNvdXJjZVxuICAgICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAgIC5zbGljZSgwLCBzb3VyY2Uuc3RhcnRzV2l0aChcIkBcIikgPyAyIDogMSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBpc0luRGVwID0gbW9kdWxlTmFtZSBpbiBkZXAgfHwgbW9kdWxlTmFtZSBpbiBwZWVyRGVwO1xuICAgICAgY29uc3QgaXNJbkRldiA9IG1vZHVsZU5hbWUgaW4gZGV2RGVwO1xuICAgICAgaWYgKFwiaW1wb3J0S2luZFwiIGluIG5vZGUgJiYgbm9kZS5pbXBvcnRLaW5kID09PSBcInR5cGVcIikge1xuICAgICAgICBjb25zdCB0eXBlRGVwTmFtZSA9IG1vZHVsZU5hbWUuc3RhcnRzV2l0aChcIkBcIilcbiAgICAgICAgICA/IGBAdHlwZXMvJHttb2R1bGVOYW1lLnNsaWNlKDEpLnJlcGxhY2UoXCIvXCIsIFwiX19cIil9YFxuICAgICAgICAgIDogYEB0eXBlcy8ke21vZHVsZU5hbWV9YDtcbiAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgaXNJbkRlcCB8fFxuICAgICAgICAgIGlzSW5EZXYgfHxcbiAgICAgICAgICB0eXBlRGVwTmFtZSBpbiBkZXAgfHxcbiAgICAgICAgICB0eXBlRGVwTmFtZSBpbiBkZXZEZXBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhbGxvd0RldkRlcGVuZGVuY2llcyA/ICEoaXNJbkRlcCB8fCBpc0luRGV2KSA6ICFpc0luRGVwO1xuICAgICAgfVxuICAgIH0pLFxufSk7XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"no-side-effect-imports.d.ts","sourceRoot":"","sources":["../../src/rules/no-side-effect-imports.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,mBAAmB;;;CA4B9B,CAAC"}
1
+ {"version":3,"file":"no-side-effect-imports.d.ts","sourceRoot":"","sources":["../../src/rules/no-side-effect-imports.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,mBAAmB;;;CAqB9B,CAAC"}
@@ -16,9 +16,6 @@ export const noSideEffectImports = createRule({
16
16
  name: getRuleName(import.meta.url),
17
17
  message: "Side effect import is often used for polyfills and css. It's unsafe to use it.",
18
18
  create: (context) => {
19
- if ([".d.ts", ".d.cts", ".d.mts", ".d.tsx"].some((ext) => context.filename.endsWith(ext))) {
20
- return {};
21
- }
22
19
  const ignoreExps = ignores.map((ignore) => new RegExp(ignore));
23
20
  return {
24
21
  "ImportDeclaration[specifiers.length=0]": (node) => {
@@ -31,4 +28,4 @@ export const noSideEffectImports = createRule({
31
28
  };
32
29
  },
33
30
  });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tc2lkZS1lZmZlY3QtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1zaWRlLWVmZmVjdC1pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNFLE1BQU0sT0FBTyxHQUFHO0lBQ2Qsb0JBQW9CO0lBQ3BCLHFFQUFxRTtJQUNyRSx1QkFBdUI7SUFDdkIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQix3QkFBd0I7SUFDeEIsdUJBQXVCO0NBQ3hCLENBQUM7QUFFRixzRkFBc0Y7QUFDdEYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEMsT0FBTyxFQUNMLGdGQUFnRjtJQUNsRixNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixJQUNFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDbkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQy9CLEVBQ0QsQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDL0QsT0FBTztZQUNMLHdDQUF3QyxFQUFFLENBQUMsSUFBdUIsRUFBRSxFQUFFO2dCQUNwRSxJQUNFLFVBQVUsQ0FBQyxJQUFJLENBQ2IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUM5QixFQUNELENBQUM7b0JBQ0QsT0FBTztnQkFDVCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUMxRCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEltcG9ydERlY2xhcmF0aW9uIH0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSwgREVGQVVMVF9NRVNTQUdFX0lELCBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi9jb21tb24uanNcIjtcblxuY29uc3QgaWdub3JlcyA9IFtcbiAgXCJecmVmbGVjdC1tZXRhZGF0YSRcIixcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlL2Jsb2IvbWFpbi9wYWNrYWdlcy92aXRlL2NsaWVudC5kLnRzXG4gIFwiKD88IVxcXFwubW9kdWxlKVxcXFwuY3NzJFwiLFxuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLnNjc3MkXCIsXG4gIFwiKD88IVxcXFwubW9kdWxlKVxcXFwuc2FzcyRcIixcbiAgXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5sZXNzJFwiLFxuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLnN0eWwkXCIsXG4gIFwiKD88IVxcXFwubW9kdWxlKVxcXFwuc3R5bHVzJFwiLFxuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLnBjc3MkXCIsXG4gIFwiKD88IVxcXFwubW9kdWxlKVxcXFwuc3NzJFwiLFxuXTtcblxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvU3RhdGVtZW50cy9pbXBvcnRcbmV4cG9ydCBjb25zdCBub1NpZGVFZmZlY3RJbXBvcnRzID0gY3JlYXRlUnVsZSh7XG4gIG5hbWU6IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCksXG4gIG1lc3NhZ2U6XG4gICAgXCJTaWRlIGVmZmVjdCBpbXBvcnQgaXMgb2Z0ZW4gdXNlZCBmb3IgcG9seWZpbGxzIGFuZCBjc3MuIEl0J3MgdW5zYWZlIHRvIHVzZSBpdC5cIixcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFtcIi5kLnRzXCIsIFwiLmQuY3RzXCIsIFwiLmQubXRzXCIsIFwiLmQudHN4XCJdLnNvbWUoKGV4dCkgPT5cbiAgICAgICAgY29udGV4dC5maWxlbmFtZS5lbmRzV2l0aChleHQpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICBjb25zdCBpZ25vcmVFeHBzID0gaWdub3Jlcy5tYXAoKGlnbm9yZSkgPT4gbmV3IFJlZ0V4cChpZ25vcmUpKTtcbiAgICByZXR1cm4ge1xuICAgICAgXCJJbXBvcnREZWNsYXJhdGlvbltzcGVjaWZpZXJzLmxlbmd0aD0wXVwiOiAobm9kZTogSW1wb3J0RGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlnbm9yZUV4cHMuc29tZShcbiAgICAgICAgICAgIChleHApID0+XG4gICAgICAgICAgICAgIHR5cGVvZiBub2RlLnNvdXJjZS52YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICBleHAudGVzdChub2RlLnNvdXJjZS52YWx1ZSksXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IERFRkFVTFRfTUVTU0FHRV9JRCB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIl19
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tc2lkZS1lZmZlY3QtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1zaWRlLWVmZmVjdC1pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNFLE1BQU0sT0FBTyxHQUFHO0lBQ2Qsb0JBQW9CO0lBQ3BCLHFFQUFxRTtJQUNyRSx1QkFBdUI7SUFDdkIsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQix3QkFBd0I7SUFDeEIsdUJBQXVCO0NBQ3hCLENBQUM7QUFFRixzRkFBc0Y7QUFDdEYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEMsT0FBTyxFQUNMLGdGQUFnRjtJQUNsRixNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU87WUFDTCx3Q0FBd0MsRUFBRSxDQUFDLElBQXVCLEVBQUUsRUFBRTtnQkFDcEUsSUFDRSxVQUFVLENBQUMsSUFBSSxDQUNiLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7b0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDOUIsRUFDRCxDQUFDO29CQUNELE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbXBvcnREZWNsYXJhdGlvbiB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIERFRkFVTFRfTUVTU0FHRV9JRCwgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmNvbnN0IGlnbm9yZXMgPSBbXG4gIFwiXnJlZmxlY3QtbWV0YWRhdGEkXCIsXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZS9ibG9iL21haW4vcGFja2FnZXMvdml0ZS9jbGllbnQuZC50c1xuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLmNzcyRcIixcbiAgXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5zY3NzJFwiLFxuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLnNhc3MkXCIsXG4gIFwiKD88IVxcXFwubW9kdWxlKVxcXFwubGVzcyRcIixcbiAgXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5zdHlsJFwiLFxuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLnN0eWx1cyRcIixcbiAgXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5wY3NzJFwiLFxuICBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLnNzcyRcIixcbl07XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL1N0YXRlbWVudHMvaW1wb3J0XG5leHBvcnQgY29uc3Qgbm9TaWRlRWZmZWN0SW1wb3J0cyA9IGNyZWF0ZVJ1bGUoe1xuICBuYW1lOiBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpLFxuICBtZXNzYWdlOlxuICAgIFwiU2lkZSBlZmZlY3QgaW1wb3J0IGlzIG9mdGVuIHVzZWQgZm9yIHBvbHlmaWxscyBhbmQgY3NzLiBJdCdzIHVuc2FmZSB0byB1c2UgaXQuXCIsXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBpZ25vcmVFeHBzID0gaWdub3Jlcy5tYXAoKGlnbm9yZSkgPT4gbmV3IFJlZ0V4cChpZ25vcmUpKTtcbiAgICByZXR1cm4ge1xuICAgICAgXCJJbXBvcnREZWNsYXJhdGlvbltzcGVjaWZpZXJzLmxlbmd0aD0wXVwiOiAobm9kZTogSW1wb3J0RGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlnbm9yZUV4cHMuc29tZShcbiAgICAgICAgICAgIChleHApID0+XG4gICAgICAgICAgICAgIHR5cGVvZiBub2RlLnNvdXJjZS52YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICBleHAudGVzdChub2RlLnNvdXJjZS52YWx1ZSksXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlLCBtZXNzYWdlSWQ6IERFRkFVTFRfTUVTU0FHRV9JRCB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIl19
@@ -4,15 +4,11 @@ export const noTsFileImports = createRule({
4
4
  message: "Disallow importing from a declaration style file or a ts file",
5
5
  create: (context) => create(context, check),
6
6
  });
7
- function check(filename, source) {
8
- // disabled this rule in declaration files
9
- if ([".d.ts", ".d.cts", ".d.mts", ".d.tsx"].some((ext) => filename.endsWith(ext))) {
10
- return false;
11
- }
7
+ function check(_filename, source) {
12
8
  const file = source.split("/").at(-1);
13
9
  if (!file || file.includes(".d.")) {
14
10
  return true;
15
11
  }
16
12
  return [".ts", ".cts", ".mts", ".tsx"].some((ext) => file.endsWith(ext));
17
13
  }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdHMtZmlsZS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXRzLWZpbGUtaW1wb3J0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztJQUN4QyxJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSwrREFBK0Q7SUFDeEUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSCxTQUFTLEtBQUssQ0FBQyxRQUFnQixFQUFFLE1BQWM7SUFDN0MsMENBQTBDO0lBQzFDLElBQ0UsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNuRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUN2QixFQUNELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMzRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlLCBjcmVhdGVSdWxlLCBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi9jb21tb24uanNcIjtcblxuZXhwb3J0IGNvbnN0IG5vVHNGaWxlSW1wb3J0cyA9IGNyZWF0ZVJ1bGUoe1xuICBuYW1lOiBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpLFxuICBtZXNzYWdlOiBcIkRpc2FsbG93IGltcG9ydGluZyBmcm9tIGEgZGVjbGFyYXRpb24gc3R5bGUgZmlsZSBvciBhIHRzIGZpbGVcIixcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4gY3JlYXRlKGNvbnRleHQsIGNoZWNrKSxcbn0pO1xuXG5mdW5jdGlvbiBjaGVjayhmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykge1xuICAvLyBkaXNhYmxlZCB0aGlzIHJ1bGUgaW4gZGVjbGFyYXRpb24gZmlsZXNcbiAgaWYgKFxuICAgIFtcIi5kLnRzXCIsIFwiLmQuY3RzXCIsIFwiLmQubXRzXCIsIFwiLmQudHN4XCJdLnNvbWUoKGV4dCkgPT5cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKGV4dCksXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZmlsZSA9IHNvdXJjZS5zcGxpdChcIi9cIikuYXQoLTEpO1xuICBpZiAoIWZpbGUgfHwgZmlsZS5pbmNsdWRlcyhcIi5kLlwiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCIudHNcIiwgXCIuY3RzXCIsIFwiLm10c1wiLCBcIi50c3hcIl0uc29tZSgoZXh0KSA9PiBmaWxlLmVuZHNXaXRoKGV4dCkpO1xufVxuIl19
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdHMtZmlsZS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXRzLWZpbGUtaW1wb3J0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztJQUN4QyxJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSwrREFBK0Q7SUFDeEUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSCxTQUFTLEtBQUssQ0FBQyxTQUFpQixFQUFFLE1BQWM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZSwgY3JlYXRlUnVsZSwgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBub1RzRmlsZUltcG9ydHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTogXCJEaXNhbGxvdyBpbXBvcnRpbmcgZnJvbSBhIGRlY2xhcmF0aW9uIHN0eWxlIGZpbGUgb3IgYSB0cyBmaWxlXCIsXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IGNyZWF0ZShjb250ZXh0LCBjaGVjayksXG59KTtcblxuZnVuY3Rpb24gY2hlY2soX2ZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSB7XG4gIGNvbnN0IGZpbGUgPSBzb3VyY2Uuc3BsaXQoXCIvXCIpLmF0KC0xKTtcbiAgaWYgKCFmaWxlIHx8IGZpbGUuaW5jbHVkZXMoXCIuZC5cIikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gW1wiLnRzXCIsIFwiLmN0c1wiLCBcIi5tdHNcIiwgXCIudHN4XCJdLnNvbWUoKGV4dCkgPT4gZmlsZS5lbmRzV2l0aChleHQpKTtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export declare const noUselessPathSegments: {
2
+ name: string;
3
+ rule: import("eslint").Rule.RuleModule;
4
+ };
5
+ //# sourceMappingURL=no-useless-path-segments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-useless-path-segments.d.ts","sourceRoot":"","sources":["../../src/rules/no-useless-path-segments.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB;;;CAIhC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import path from "node:path";
2
+ import { create, createRule, getRuleName, getSourceType } from "../common.js";
3
+ export const noUselessPathSegments = createRule({
4
+ name: getRuleName(import.meta.url),
5
+ message: "The relative source path should be a nearest relative path.",
6
+ create: (context) => create(context, check),
7
+ });
8
+ function check(filename, source) {
9
+ if (getSourceType(source) !== "local" ||
10
+ source.startsWith("/") ||
11
+ source === ".") {
12
+ return false;
13
+ }
14
+ if (source.endsWith("/")) {
15
+ return true;
16
+ }
17
+ const currentPath = path.dirname(filename);
18
+ const absoluteSource = path.resolve(currentPath, source);
19
+ // compatible with windows
20
+ let resultPath = path
21
+ .relative(currentPath, absoluteSource)
22
+ .replaceAll("\\", "/");
23
+ if (!resultPath.startsWith("./") && !resultPath.startsWith("..")) {
24
+ resultPath = `./${resultPath}`;
25
+ }
26
+ return resultPath !== source;
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxVQUFVLENBQUM7SUFDOUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsNkRBQTZEO0lBQ3RFLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Q0FDNUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFjO0lBQzdDLElBQ0UsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU87UUFDakMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsRUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCwwQkFBMEI7SUFDMUIsSUFBSSxVQUFVLEdBQUcsSUFBSTtTQUNsQixRQUFRLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQztTQUNyQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pFLFVBQVUsR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLFVBQVUsS0FBSyxNQUFNLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZSwgY3JlYXRlUnVsZSwgZ2V0UnVsZU5hbWUsIGdldFNvdXJjZVR5cGUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBub1VzZWxlc3NQYXRoU2VnbWVudHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTogXCJUaGUgcmVsYXRpdmUgc291cmNlIHBhdGggc2hvdWxkIGJlIGEgbmVhcmVzdCByZWxhdGl2ZSBwYXRoLlwiLFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiBjcmVhdGUoY29udGV4dCwgY2hlY2spLFxufSk7XG5cbmZ1bmN0aW9uIGNoZWNrKGZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSB7XG4gIGlmIChcbiAgICBnZXRTb3VyY2VUeXBlKHNvdXJjZSkgIT09IFwibG9jYWxcIiB8fFxuICAgIHNvdXJjZS5zdGFydHNXaXRoKFwiL1wiKSB8fFxuICAgIHNvdXJjZSA9PT0gXCIuXCJcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzb3VyY2UuZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZW5hbWUpO1xuICBjb25zdCBhYnNvbHV0ZVNvdXJjZSA9IHBhdGgucmVzb2x2ZShjdXJyZW50UGF0aCwgc291cmNlKTtcbiAgLy8gY29tcGF0aWJsZSB3aXRoIHdpbmRvd3NcbiAgbGV0IHJlc3VsdFBhdGggPSBwYXRoXG4gICAgLnJlbGF0aXZlKGN1cnJlbnRQYXRoLCBhYnNvbHV0ZVNvdXJjZSlcbiAgICAucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuICBpZiAoIXJlc3VsdFBhdGguc3RhcnRzV2l0aChcIi4vXCIpICYmICFyZXN1bHRQYXRoLnN0YXJ0c1dpdGgoXCIuLlwiKSkge1xuICAgIHJlc3VsdFBhdGggPSBgLi8ke3Jlc3VsdFBhdGh9YDtcbiAgfVxuICByZXR1cm4gcmVzdWx0UGF0aCAhPT0gc291cmNlO1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ export declare const requiredExports: {
2
+ name: string;
3
+ rule: import("eslint").Rule.RuleModule;
4
+ };
5
+ //# sourceMappingURL=required-exports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-exports.d.ts","sourceRoot":"","sources":["../../src/rules/required-exports.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe;;;CAmB1B,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.js";
2
+ export const requiredExports = createRule({
3
+ name: getRuleName(import.meta.url),
4
+ message: "It's required at least one `export` statement in a file.",
5
+ create: (context) => {
6
+ let existExport = false;
7
+ const hasExport = () => {
8
+ existExport = true;
9
+ };
10
+ return {
11
+ ExportAllDeclaration: () => hasExport(),
12
+ ExportDefaultDeclaration: () => hasExport(),
13
+ ExportNamedDeclaration: () => hasExport(),
14
+ "Program:exit": (node) => {
15
+ if (!existExport) {
16
+ context.report({ node, messageId: DEFAULT_MESSAGE_ID });
17
+ }
18
+ },
19
+ };
20
+ },
21
+ });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZWQtZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9yZXF1aXJlZC1leHBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7SUFDeEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsMERBQTBEO0lBQ25FLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ2xCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7WUFDckIsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDLENBQUM7UUFDRixPQUFPO1lBQ0wsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFO1lBQ3ZDLHdCQUF3QixFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRTtZQUMzQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUU7WUFDekMsY0FBYyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUnVsZSwgREVGQVVMVF9NRVNTQUdFX0lELCBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi9jb21tb24uanNcIjtcblxuZXhwb3J0IGNvbnN0IHJlcXVpcmVkRXhwb3J0cyA9IGNyZWF0ZVJ1bGUoe1xuICBuYW1lOiBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpLFxuICBtZXNzYWdlOiBcIkl0J3MgcmVxdWlyZWQgYXQgbGVhc3Qgb25lIGBleHBvcnRgIHN0YXRlbWVudCBpbiBhIGZpbGUuXCIsXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IHtcbiAgICBsZXQgZXhpc3RFeHBvcnQgPSBmYWxzZTtcbiAgICBjb25zdCBoYXNFeHBvcnQgPSAoKSA9PiB7XG4gICAgICBleGlzdEV4cG9ydCA9IHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgRXhwb3J0QWxsRGVjbGFyYXRpb246ICgpID0+IGhhc0V4cG9ydCgpLFxuICAgICAgRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uOiAoKSA9PiBoYXNFeHBvcnQoKSxcbiAgICAgIEV4cG9ydE5hbWVkRGVjbGFyYXRpb246ICgpID0+IGhhc0V4cG9ydCgpLFxuICAgICAgXCJQcm9ncmFtOmV4aXRcIjogKG5vZGUpID0+IHtcbiAgICAgICAgaWYgKCFleGlzdEV4cG9ydCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZUlkOiBERUZBVUxUX01FU1NBR0VfSUQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIl19
@@ -0,0 +1,29 @@
1
+ <!-- prettier-ignore-start -->
2
+ # no-empty-exports
3
+
4
+ Disallow `export {}`.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ export {};
12
+ console.log(123); export {};
13
+ export default {}; export {};
14
+ export {} from 'foo';
15
+ export {} from './foo';
16
+ ```
17
+
18
+ ### Pass
19
+
20
+ ```ts
21
+ var name = 123; export {name as age};
22
+ const name = {}; export {name};
23
+ export const name = {};
24
+ export default {};
25
+ var foo = 213; export {foo as default};
26
+ export {default} from 'foo';
27
+ export * as foo from 'foo';
28
+ ```
29
+ <!-- prettier-ignore-end -->
@@ -8,24 +8,23 @@ Side effect import is often used for polyfills and css. It's unsafe to use it.
8
8
  ### Fail
9
9
 
10
10
  ```ts
11
- import 'foo' // filename: foo.ts
12
- import './foo' // filename: foo.ts
13
- import {} from 'foo' // filename: foo.ts
14
- import {} from './foo' // filename: foo.ts
15
- import './reflect-metadata' // filename: foo.ts
16
- import './foo.module.css' // filename: foo.ts
17
- import 'foo.module.css' // filename: foo.ts
11
+ import 'foo'
12
+ import './foo'
13
+ import {} from 'foo'
14
+ import {} from './foo'
15
+ import './reflect-metadata'
16
+ import './foo.module.css'
17
+ import 'foo.module.css'
18
18
  ```
19
19
 
20
20
  ### Pass
21
21
 
22
22
  ```ts
23
- import 'reflect-metadata' // filename: foo.ts
24
- import {} from 'reflect-metadata' // filename: foo.ts
25
- import 'foo.css' // filename: foo.ts
26
- import './foo.css' // filename: foo.ts
27
- import 'module.css' // filename: foo.ts
28
- import {foo} from 'foo' // filename: foo.ts
29
- import 'foo' // filename: foo.d.ts
23
+ import 'reflect-metadata'
24
+ import {} from 'reflect-metadata'
25
+ import 'foo.css'
26
+ import './foo.css'
27
+ import 'module.css'
28
+ import {foo} from 'foo'
30
29
  ```
31
30
  <!-- prettier-ignore-end -->
@@ -8,112 +8,28 @@ Disallow importing from a declaration style file or a ts file
8
8
  ### Fail
9
9
 
10
10
  ```ts
11
- import foo from './foo.ts' // filename: bar.js
12
- import foo from './foo.ts' // filename: bar
13
- import foo from './foo.ts' // filename: bar.ts
14
- import foo from './foo.ts' // filename: bar.tsx
15
- import foo from './foo.cts' // filename: bar.js
16
- import foo from './foo.cts' // filename: bar
17
- import foo from './foo.cts' // filename: bar.ts
18
- import foo from './foo.cts' // filename: bar.tsx
19
- import foo from './foo.mts' // filename: bar.js
20
- import foo from './foo.mts' // filename: bar
21
- import foo from './foo.mts' // filename: bar.ts
22
- import foo from './foo.mts' // filename: bar.tsx
23
- import foo from './foo.tsx' // filename: bar.js
24
- import foo from './foo.tsx' // filename: bar
25
- import foo from './foo.tsx' // filename: bar.ts
26
- import foo from './foo.tsx' // filename: bar.tsx
27
- import foo from 'foo.d.bar' // filename: bar.js
28
- import foo from 'foo.d.bar' // filename: bar
29
- import foo from 'foo.d.bar' // filename: bar.ts
30
- import foo from 'foo.d.bar' // filename: bar.tsx
31
- import foo from './foo.d.bar' // filename: bar.js
32
- import foo from './foo.d.bar' // filename: bar
33
- import foo from './foo.d.bar' // filename: bar.ts
34
- import foo from './foo.d.bar' // filename: bar.tsx
35
- import foo from './foo/foo.d.bar' // filename: bar.js
36
- import foo from './foo/foo.d.bar' // filename: bar
37
- import foo from './foo/foo.d.bar' // filename: bar.ts
38
- import foo from './foo/foo.d.bar' // filename: bar.tsx
39
- import foo from './foo.d.ts' // filename: bar.js
40
- import foo from './foo.d.ts' // filename: bar
41
- import foo from './foo.d.ts' // filename: bar.ts
42
- import foo from './foo.d.ts' // filename: bar.tsx
43
- import foo from './foo.d.cts' // filename: bar.js
44
- import foo from './foo.d.cts' // filename: bar
45
- import foo from './foo.d.cts' // filename: bar.ts
46
- import foo from './foo.d.cts' // filename: bar.tsx
47
- import foo from './foo.d.mts' // filename: bar.js
48
- import foo from './foo.d.mts' // filename: bar
49
- import foo from './foo.d.mts' // filename: bar.ts
50
- import foo from './foo.d.mts' // filename: bar.tsx
51
- import foo from './foo.d.tsx' // filename: bar.js
52
- import foo from './foo.d.tsx' // filename: bar
53
- import foo from './foo.d.tsx' // filename: bar.ts
54
- import foo from './foo.d.tsx' // filename: bar.tsx
55
- import foo from './foo.d.js' // filename: bar.js
56
- import foo from './foo.d.js' // filename: bar
57
- import foo from './foo.d.js' // filename: bar.ts
58
- import foo from './foo.d.js' // filename: bar.tsx
59
- import foo from './foo.d.cjs' // filename: bar.js
60
- import foo from './foo.d.cjs' // filename: bar
61
- import foo from './foo.d.cjs' // filename: bar.ts
62
- import foo from './foo.d.cjs' // filename: bar.tsx
63
- import foo from './foo.d.mjs' // filename: bar.js
64
- import foo from './foo.d.mjs' // filename: bar
65
- import foo from './foo.d.mjs' // filename: bar.ts
66
- import foo from './foo.d.mjs' // filename: bar.tsx
67
- import foo from './foo.d.jsx' // filename: bar.js
68
- import foo from './foo.d.jsx' // filename: bar
69
- import foo from './foo.d.jsx' // filename: bar.ts
70
- import foo from './foo.d.jsx' // filename: bar.tsx
71
- import foo from '/foo.ts' // filename: bar.js
72
- import foo from '/foo.ts' // filename: bar
73
- import foo from '/foo.ts' // filename: bar.ts
74
- import foo from '/foo.ts' // filename: bar.tsx
75
- import foo from '/foo.d.js' // filename: bar.js
76
- import foo from '/foo.d.js' // filename: bar
77
- import foo from '/foo.d.js' // filename: bar.ts
78
- import foo from '/foo.d.js' // filename: bar.tsx
11
+ import foo from './foo.ts'
12
+ import foo from './foo.cts'
13
+ import foo from './foo.mts'
14
+ import foo from './foo.tsx'
15
+ import foo from 'foo.d.bar'
16
+ import foo from './foo.d.bar'
17
+ import foo from './foo/foo.d.bar'
18
+ import foo from './foo.d.ts'
19
+ import foo from './foo.d.cts'
20
+ import foo from './foo.d.mts'
21
+ import foo from './foo.d.tsx'
22
+ import foo from './foo.d.js'
23
+ import foo from './foo.d.cjs'
24
+ import foo from './foo.d.mjs'
25
+ import foo from './foo.d.jsx'
26
+ import foo from '/foo.ts'
27
+ import foo from '/foo.d.js'
79
28
  ```
80
29
 
81
30
  ### Pass
82
31
 
83
32
  ```ts
84
- import foo from './foo.ts' // filename: bar.d.ts
85
- import foo from './foo.ts' // filename: bar.d.tsx
86
- import foo from './foo.cts' // filename: bar.d.ts
87
- import foo from './foo.cts' // filename: bar.d.tsx
88
- import foo from './foo.mts' // filename: bar.d.ts
89
- import foo from './foo.mts' // filename: bar.d.tsx
90
- import foo from './foo.tsx' // filename: bar.d.ts
91
- import foo from './foo.tsx' // filename: bar.d.tsx
92
- import foo from 'foo.d.bar' // filename: bar.d.ts
93
- import foo from 'foo.d.bar' // filename: bar.d.tsx
94
- import foo from './foo.d.bar' // filename: bar.d.ts
95
- import foo from './foo.d.bar' // filename: bar.d.tsx
96
- import foo from './foo/foo.d.bar' // filename: bar.d.ts
97
- import foo from './foo/foo.d.bar' // filename: bar.d.tsx
98
- import foo from './foo.d.ts' // filename: bar.d.ts
99
- import foo from './foo.d.ts' // filename: bar.d.tsx
100
- import foo from './foo.d.cts' // filename: bar.d.ts
101
- import foo from './foo.d.cts' // filename: bar.d.tsx
102
- import foo from './foo.d.mts' // filename: bar.d.ts
103
- import foo from './foo.d.mts' // filename: bar.d.tsx
104
- import foo from './foo.d.tsx' // filename: bar.d.ts
105
- import foo from './foo.d.tsx' // filename: bar.d.tsx
106
- import foo from './foo.d.js' // filename: bar.d.ts
107
- import foo from './foo.d.js' // filename: bar.d.tsx
108
- import foo from './foo.d.cjs' // filename: bar.d.ts
109
- import foo from './foo.d.cjs' // filename: bar.d.tsx
110
- import foo from './foo.d.mjs' // filename: bar.d.ts
111
- import foo from './foo.d.mjs' // filename: bar.d.tsx
112
- import foo from './foo.d.jsx' // filename: bar.d.ts
113
- import foo from './foo.d.jsx' // filename: bar.d.tsx
114
- import foo from '/foo.ts' // filename: bar.d.ts
115
- import foo from '/foo.ts' // filename: bar.d.tsx
116
- import foo from '/foo.d.js' // filename: bar.d.ts
117
- import foo from '/foo.d.js' // filename: bar.d.tsx
33
+ import foo from 'foo'
118
34
  ```
119
35
  <!-- prettier-ignore-end -->
@@ -1,5 +1,5 @@
1
1
  <!-- prettier-ignore-start -->
2
- # nearest-relative-path
2
+ # no-useless-path-segments
3
3
 
4
4
  The relative source path should be a nearest relative path.
5
5
 
@@ -27,6 +27,10 @@ import "./../foo" // filename: /a/b/c/d/e.js
27
27
  import("./../foo") // filename: /a/b/c/d/e.js
28
28
  export * from "./../foo" // filename: /a/b/c/d/e.js
29
29
  export {a} from "./../foo" // filename: /a/b/c/d/e.js
30
+ import foo from "./" // filename: /a/b/c/d/e.js
31
+ import foo from '../' // filename: /a/b/c/d/e.js
32
+ import foo from '../../' // filename: /a/b/c/d/e.js
33
+ import foo from './..' // filename: /a/b/c/d/e.js
30
34
  ```
31
35
 
32
36
  ### Pass
@@ -44,5 +48,7 @@ export * from "./a" // filename: /a/b/c/d/e.js
44
48
  export {a} from "a" // filename: /a/b/c/d/e.js
45
49
  export {a} from "./a" // filename: /a/b/c/d/e.js
46
50
  import foo from "." // filename: /a/b/c/d/e.js
51
+ import foo from '..' // filename: /a/b/c/d/e.js
52
+ import foo from '../..' // filename: /a/b/c/d/e.js
47
53
  ```
48
54
  <!-- prettier-ignore-end -->
@@ -0,0 +1,31 @@
1
+ <!-- prettier-ignore-start -->
2
+ # required-exports
3
+
4
+ It's required at least one `export` statement in a file.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ // This rule will also report on empty files
12
+
13
+ console.log()
14
+ import foo from 'foo'
15
+ exports.foo = {}
16
+ module.exports = {}
17
+ ```
18
+
19
+ ### Pass
20
+
21
+ ```ts
22
+ export {}
23
+ const foo = 'foo'; export {foo}
24
+ export const foo = {}
25
+ export default {}
26
+ export {foo} from 'foo'
27
+ export {} from 'foo'
28
+ export * as foo from 'foo'
29
+ export {}; let foo = ''
30
+ ```
31
+ <!-- prettier-ignore-end -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-esm",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "ESLint plugin for linting ESM (import/export syntax)",
5
5
  "keywords": [
6
6
  "eslint",
@@ -29,7 +29,7 @@
29
29
  "@types/estree": "1.0.6",
30
30
  "@types/json-schema": "7.0.15",
31
31
  "@types/node": "22.9.1",
32
- "@typescript-eslint/parser": "8.18.0",
32
+ "@typescript-eslint/parser": "8.18.2",
33
33
  "eslint": "8.57.1",
34
34
  "outdent": "0.8.0",
35
35
  "tsx": "4.19.2"
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { nearestRelativePath } from "./rules/nearest-relative-path.js";
2
1
  import { noDirectoryImports } from "./rules/no-directory-imports.js";
3
2
  import { noDynamicImports } from "./rules/no-dynamic-imports.js";
3
+ import { noEmptyExports } from "./rules/no-empty-exports.js";
4
4
  import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.js";
5
5
  import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.js";
6
6
  import { noRelativeParentImports } from "./rules/no-relative-parent-imports.js";
@@ -8,11 +8,13 @@ import { noRenameExports } from "./rules/no-rename-exports.js";
8
8
  import { noRenameImports } from "./rules/no-rename-imports.js";
9
9
  import { noSideEffectImports } from "./rules/no-side-effect-imports.js";
10
10
  import { noTsFileImports } from "./rules/no-ts-file-imports.js";
11
+ import { noUselessPathSegments } from "./rules/no-useless-path-segments.js";
12
+ import { requiredExports } from "./rules/required-exports.js";
11
13
 
12
14
  export const rules = {
13
- [nearestRelativePath.name]: nearestRelativePath.rule,
14
15
  [noDirectoryImports.name]: noDirectoryImports.rule,
15
16
  [noDynamicImports.name]: noDynamicImports.rule,
17
+ [noEmptyExports.name]: noEmptyExports.rule,
16
18
  [noGitIgnoredImports.name]: noGitIgnoredImports.rule,
17
19
  [noPhantomDepImports.name]: noPhantomDepImports.rule,
18
20
  [noRelativeParentImports.name]: noRelativeParentImports.rule,
@@ -20,4 +22,6 @@ export const rules = {
20
22
  [noRenameImports.name]: noRenameImports.rule,
21
23
  [noSideEffectImports.name]: noSideEffectImports.rule,
22
24
  [noTsFileImports.name]: noTsFileImports.rule,
25
+ [noUselessPathSegments.name]: noUselessPathSegments.rule,
26
+ [requiredExports.name]: requiredExports.rule,
23
27
  };
@@ -0,0 +1,22 @@
1
+ import { test } from "../test.spec.js";
2
+ import { noEmptyExports } from "./no-empty-exports.js";
3
+
4
+ const valid = [
5
+ "var name = 123; export {name as age};",
6
+ "const name = {}; export {name};",
7
+ "export const name = {};",
8
+ "export default {};",
9
+ "var foo = 213; export {foo as default};",
10
+ "export {default} from 'foo';",
11
+ "export * as foo from 'foo';",
12
+ ];
13
+
14
+ const invalid = [
15
+ "export {};",
16
+ "console.log(123); export {};",
17
+ "export default {}; export {};",
18
+ "export {} from 'foo';",
19
+ "export {} from './foo';",
20
+ ];
21
+
22
+ test({ valid, invalid, ...noEmptyExports });
@@ -0,0 +1,14 @@
1
+ import type { Node } from "estree";
2
+ import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.js";
3
+
4
+ export const noEmptyExports = createRule({
5
+ name: getRuleName(import.meta.url),
6
+ message: "Disallow `export {}`.",
7
+ create: (context) => ({
8
+ "ExportNamedDeclaration[specifiers.length=0][declaration=null]": (
9
+ node: Node,
10
+ ) => {
11
+ context.report({ node, messageId: DEFAULT_MESSAGE_ID });
12
+ },
13
+ }),
14
+ });
@@ -61,8 +61,9 @@ export const noPhantomDepImports = createRule({
61
61
  allowDevDependencies = false,
62
62
  }: { allowDevDependencies: boolean } = context.options[0] ?? {};
63
63
 
64
- // ignore `import {foo} from './'` and `import {foo} from 'node:foo'`
65
- if (getSourceType(source) !== "module") {
64
+ // ignore `import {foo} from './'`
65
+ // check `import {foo} from 'node:foo'` and `import {foo} from 'foo'`
66
+ if (getSourceType(source) === "local") {
66
67
  return false;
67
68
  }
68
69
  const pkgJson = getPkgJson(path.dirname(filename));
@@ -86,6 +87,13 @@ export const noPhantomDepImports = createRule({
86
87
  ? pkgJson.content.devDependencies
87
88
  : {};
88
89
 
90
+ // TODO: Optimize the error message which is reported on `import foo from 'node:foo'`
91
+ // 1. check `import foo from 'node:foo'`
92
+ if (source.startsWith("node:")) {
93
+ return !("@types/node" in devDep || "@types/node" in dep);
94
+ }
95
+
96
+ // 2. check `import foo from 'foo'`
89
97
  const moduleName = source
90
98
  .split("/")
91
99
  .slice(0, source.startsWith("@") ? 2 : 1)
@@ -8,9 +8,7 @@ const valid = [
8
8
  "import './foo.css'",
9
9
  "import 'module.css'",
10
10
  "import {foo} from 'foo'",
11
- ]
12
- .map((code) => ({ code, filename: "foo.ts" }))
13
- .concat({ code: "import 'foo'", filename: "foo.d.ts" });
11
+ ];
14
12
 
15
13
  const invalid = [
16
14
  "import 'foo'",
@@ -20,6 +18,6 @@ const invalid = [
20
18
  "import './reflect-metadata'",
21
19
  "import './foo.module.css'",
22
20
  "import 'foo.module.css'",
23
- ].map((code) => ({ code, filename: "foo.ts" }));
21
+ ];
24
22
 
25
23
  test({ valid, invalid, ...noSideEffectImports });
@@ -20,13 +20,6 @@ export const noSideEffectImports = createRule({
20
20
  message:
21
21
  "Side effect import is often used for polyfills and css. It's unsafe to use it.",
22
22
  create: (context) => {
23
- if (
24
- [".d.ts", ".d.cts", ".d.mts", ".d.tsx"].some((ext) =>
25
- context.filename.endsWith(ext),
26
- )
27
- ) {
28
- return {};
29
- }
30
23
  const ignoreExps = ignores.map((ignore) => new RegExp(ignore));
31
24
  return {
32
25
  "ImportDeclaration[specifiers.length=0]": (node: ImportDeclaration) => {
@@ -1,7 +1,7 @@
1
1
  import { test } from "../test.spec.js";
2
2
  import { noTsFileImports } from "./no-ts-file-imports.js";
3
3
 
4
- const codes = [
4
+ const invalid = [
5
5
  "import foo from './foo.ts'",
6
6
  "import foo from './foo.cts'",
7
7
  "import foo from './foo.mts'",
@@ -25,15 +25,6 @@ const codes = [
25
25
  "import foo from '/foo.d.js'",
26
26
  ];
27
27
 
28
- const invalid = codes.flatMap((code) => [
29
- { code, filename: "bar.js" },
30
- { code, filename: "bar" },
31
- { code, filename: "bar.ts" },
32
- { code, filename: "bar.tsx" },
33
- ]);
34
- const valid = codes.flatMap((code) => [
35
- { code, filename: "bar.d.ts" },
36
- { code, filename: "bar.d.tsx" },
37
- ]);
28
+ const valid = ["import foo from 'foo'"];
38
29
 
39
30
  test({ valid, invalid, ...noTsFileImports });
@@ -6,15 +6,7 @@ export const noTsFileImports = createRule({
6
6
  create: (context) => create(context, check),
7
7
  });
8
8
 
9
- function check(filename: string, source: string) {
10
- // disabled this rule in declaration files
11
- if (
12
- [".d.ts", ".d.cts", ".d.mts", ".d.tsx"].some((ext) =>
13
- filename.endsWith(ext),
14
- )
15
- ) {
16
- return false;
17
- }
9
+ function check(_filename: string, source: string) {
18
10
  const file = source.split("/").at(-1);
19
11
  if (!file || file.includes(".d.")) {
20
12
  return true;
@@ -1,5 +1,5 @@
1
1
  import { test } from "../test.spec.js";
2
- import { nearestRelativePath } from "./nearest-relative-path.js";
2
+ import { noUselessPathSegments } from "./no-useless-path-segments.js";
3
3
 
4
4
  const valid = [
5
5
  'import xxx from "../a"',
@@ -13,7 +13,10 @@ const valid = [
13
13
  'export * from "./a"',
14
14
  'export {a} from "a"',
15
15
  'export {a} from "./a"',
16
+
16
17
  'import foo from "."',
18
+ "import foo from '..'",
19
+ "import foo from '../..'",
17
20
  ].map((code) => ({ code, filename: "/a/b/c/d/e.js" }));
18
21
 
19
22
  const invalid = [
@@ -39,6 +42,11 @@ const invalid = [
39
42
  'import("./../foo")',
40
43
  'export * from "./../foo"',
41
44
  'export {a} from "./../foo"',
45
+
46
+ 'import foo from "./"',
47
+ "import foo from '../'",
48
+ "import foo from '../../'",
49
+ "import foo from './..'",
42
50
  ].map((code) => ({ code, filename: "/a/b/c/d/e.js" }));
43
51
 
44
- test({ valid, invalid, ...nearestRelativePath });
52
+ test({ valid, invalid, ...noUselessPathSegments });
@@ -1,7 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { create, createRule, getRuleName, getSourceType } from "../common.js";
3
3
 
4
- export const nearestRelativePath = createRule({
4
+ export const noUselessPathSegments = createRule({
5
5
  name: getRuleName(import.meta.url),
6
6
  message: "The relative source path should be a nearest relative path.",
7
7
  create: (context) => create(context, check),
@@ -15,13 +15,16 @@ function check(filename: string, source: string) {
15
15
  ) {
16
16
  return false;
17
17
  }
18
+ if (source.endsWith("/")) {
19
+ return true;
20
+ }
18
21
  const currentPath = path.dirname(filename);
19
22
  const absoluteSource = path.resolve(currentPath, source);
20
23
  // compatible with windows
21
24
  let resultPath = path
22
25
  .relative(currentPath, absoluteSource)
23
26
  .replaceAll("\\", "/");
24
- if (!resultPath.startsWith("./") && !resultPath.startsWith("../")) {
27
+ if (!resultPath.startsWith("./") && !resultPath.startsWith("..")) {
25
28
  resultPath = `./${resultPath}`;
26
29
  }
27
30
  return resultPath !== source;
@@ -0,0 +1,24 @@
1
+ import { test } from "../test.spec.js";
2
+ import { requiredExports } from "./required-exports.js";
3
+
4
+ const valid = [
5
+ "export {}",
6
+ "const foo = 'foo'; export {foo}",
7
+ "export const foo = {}",
8
+ "export default {}",
9
+ "export {foo} from 'foo'",
10
+ "export {} from 'foo'",
11
+ "export * as foo from 'foo'",
12
+ "export {}; let foo = ''",
13
+ ];
14
+
15
+ const invalid = [
16
+ "// This rule will also report on empty files",
17
+ "",
18
+ "console.log()",
19
+ "import foo from 'foo'",
20
+ "exports.foo = {}",
21
+ "module.exports = {}",
22
+ ];
23
+
24
+ test({ valid, invalid, ...requiredExports });
@@ -0,0 +1,22 @@
1
+ import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.js";
2
+
3
+ export const requiredExports = createRule({
4
+ name: getRuleName(import.meta.url),
5
+ message: "It's required at least one `export` statement in a file.",
6
+ create: (context) => {
7
+ let existExport = false;
8
+ const hasExport = () => {
9
+ existExport = true;
10
+ };
11
+ return {
12
+ ExportAllDeclaration: () => hasExport(),
13
+ ExportDefaultDeclaration: () => hasExport(),
14
+ ExportNamedDeclaration: () => hasExport(),
15
+ "Program:exit": (node) => {
16
+ if (!existExport) {
17
+ context.report({ node, messageId: DEFAULT_MESSAGE_ID });
18
+ }
19
+ },
20
+ };
21
+ },
22
+ });
@@ -1,5 +0,0 @@
1
- export declare const nearestRelativePath: {
2
- name: string;
3
- rule: import("eslint").Rule.RuleModule;
4
- };
5
- //# sourceMappingURL=nearest-relative-path.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nearest-relative-path.d.ts","sourceRoot":"","sources":["../../src/rules/nearest-relative-path.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB;;;CAI9B,CAAC"}
@@ -1,25 +0,0 @@
1
- import path from "node:path";
2
- import { create, createRule, getRuleName, getSourceType } from "../common.js";
3
- export const nearestRelativePath = createRule({
4
- name: getRuleName(import.meta.url),
5
- message: "The relative source path should be a nearest relative path.",
6
- create: (context) => create(context, check),
7
- });
8
- function check(filename, source) {
9
- if (getSourceType(source) !== "local" ||
10
- source.startsWith("/") ||
11
- source === ".") {
12
- return false;
13
- }
14
- const currentPath = path.dirname(filename);
15
- const absoluteSource = path.resolve(currentPath, source);
16
- // compatible with windows
17
- let resultPath = path
18
- .relative(currentPath, absoluteSource)
19
- .replaceAll("\\", "/");
20
- if (!resultPath.startsWith("./") && !resultPath.startsWith("../")) {
21
- resultPath = `./${resultPath}`;
22
- }
23
- return resultPath !== source;
24
- }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhcmVzdC1yZWxhdGl2ZS1wYXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25lYXJlc3QtcmVsYXRpdmUtcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUM7SUFDNUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsNkRBQTZEO0lBQ3RFLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Q0FDNUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFjO0lBQzdDLElBQ0UsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU87UUFDakMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsRUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCwwQkFBMEI7SUFDMUIsSUFBSSxVQUFVLEdBQUcsSUFBSTtTQUNsQixRQUFRLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQztTQUNyQyxVQUFVLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2xFLFVBQVUsR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLFVBQVUsS0FBSyxNQUFNLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZSwgY3JlYXRlUnVsZSwgZ2V0UnVsZU5hbWUsIGdldFNvdXJjZVR5cGUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBuZWFyZXN0UmVsYXRpdmVQYXRoID0gY3JlYXRlUnVsZSh7XG4gIG5hbWU6IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCksXG4gIG1lc3NhZ2U6IFwiVGhlIHJlbGF0aXZlIHNvdXJjZSBwYXRoIHNob3VsZCBiZSBhIG5lYXJlc3QgcmVsYXRpdmUgcGF0aC5cIixcbiAgY3JlYXRlOiAoY29udGV4dCkgPT4gY3JlYXRlKGNvbnRleHQsIGNoZWNrKSxcbn0pO1xuXG5mdW5jdGlvbiBjaGVjayhmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykge1xuICBpZiAoXG4gICAgZ2V0U291cmNlVHlwZShzb3VyY2UpICE9PSBcImxvY2FsXCIgfHxcbiAgICBzb3VyY2Uuc3RhcnRzV2l0aChcIi9cIikgfHxcbiAgICBzb3VyY2UgPT09IFwiLlwiXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShmaWxlbmFtZSk7XG4gIGNvbnN0IGFic29sdXRlU291cmNlID0gcGF0aC5yZXNvbHZlKGN1cnJlbnRQYXRoLCBzb3VyY2UpO1xuICAvLyBjb21wYXRpYmxlIHdpdGggd2luZG93c1xuICBsZXQgcmVzdWx0UGF0aCA9IHBhdGhcbiAgICAucmVsYXRpdmUoY3VycmVudFBhdGgsIGFic29sdXRlU291cmNlKVxuICAgIC5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIik7XG4gIGlmICghcmVzdWx0UGF0aC5zdGFydHNXaXRoKFwiLi9cIikgJiYgIXJlc3VsdFBhdGguc3RhcnRzV2l0aChcIi4uL1wiKSkge1xuICAgIHJlc3VsdFBhdGggPSBgLi8ke3Jlc3VsdFBhdGh9YDtcbiAgfVxuICByZXR1cm4gcmVzdWx0UGF0aCAhPT0gc291cmNlO1xufVxuIl19