eslint-plugin-esm 0.6.1 → 0.8.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 (31) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/index.d.ts +26 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -3
  5. package/dist/rules/existing-file-imports.d.ts +5 -0
  6. package/dist/rules/existing-file-imports.d.ts.map +1 -0
  7. package/dist/rules/existing-file-imports.js +24 -0
  8. package/doc/rules/existing-file-imports.md +28 -0
  9. package/doc/rules/no-directory-imports.md +13 -13
  10. package/doc/rules/no-git-ignored-imports.md +19 -19
  11. package/package.json +7 -4
  12. package/src/index.ts +2 -2
  13. package/src/rules/{no-inexistent-relative-imports.spec.ts → existing-file-imports.test.ts} +11 -10
  14. package/src/rules/{no-inexistent-relative-imports.ts → existing-file-imports.ts} +6 -8
  15. package/tsconfig.json +1 -1
  16. package/dist/rules/no-inexistent-relative-imports.d.ts +0 -5
  17. package/dist/rules/no-inexistent-relative-imports.d.ts.map +0 -1
  18. package/dist/rules/no-inexistent-relative-imports.js +0 -26
  19. package/doc/rules/no-inexistent-relative-imports.md +0 -28
  20. /package/src/rules/{no-declaration-file-imports.spec.ts → no-declaration-file-imports.test.ts} +0 -0
  21. /package/src/rules/{no-directory-imports.spec.ts → no-directory-imports.test.ts} +0 -0
  22. /package/src/rules/{no-dynamic-imports.spec.ts → no-dynamic-imports.test.ts} +0 -0
  23. /package/src/rules/{no-empty-exports.spec.ts → no-empty-exports.test.ts} +0 -0
  24. /package/src/rules/{no-git-ignored-imports.spec.ts → no-git-ignored-imports.test.ts} +0 -0
  25. /package/src/rules/{no-phantom-dep-imports.spec.ts → no-phantom-dep-imports.test.ts} +0 -0
  26. /package/src/rules/{no-relative-parent-imports.spec.ts → no-relative-parent-imports.test.ts} +0 -0
  27. /package/src/rules/{no-rename-exports.spec.ts → no-rename-exports.test.ts} +0 -0
  28. /package/src/rules/{no-rename-imports.spec.ts → no-rename-imports.test.ts} +0 -0
  29. /package/src/rules/{no-side-effect-imports.spec.ts → no-side-effect-imports.test.ts} +0 -0
  30. /package/src/rules/{no-useless-path-segments.spec.ts → no-useless-path-segments.test.ts} +0 -0
  31. /package/src/rules/{required-exports.spec.ts → required-exports.test.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # eslint-plugin-esm
2
2
 
3
+ ## 0.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 28d8553: chore: required node ^18.20.0 or >=20.10.0
8
+
9
+ ## 0.7.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 01657a8: feat(eslint-plugin-esm): rename `no-inexistent-relative-imports` to `existing-file-imports`
14
+
3
15
  ## 0.6.1
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,4 +1,29 @@
1
+ import { existingFileImports } from "./rules/existing-file-imports.ts";
2
+ import { noDeclarationFileImports } from "./rules/no-declaration-file-imports.ts";
3
+ import { noDirectoryImports } from "./rules/no-directory-imports.ts";
4
+ import { noDynamicImports } from "./rules/no-dynamic-imports.ts";
5
+ import { noEmptyExports } from "./rules/no-empty-exports.ts";
6
+ import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.ts";
7
+ import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.ts";
8
+ import { noRelativeParentImports } from "./rules/no-relative-parent-imports.ts";
9
+ import { noRenameExports } from "./rules/no-rename-exports.ts";
10
+ import { noRenameImports } from "./rules/no-rename-imports.ts";
11
+ import { noSideEffectImports } from "./rules/no-side-effect-imports.ts";
12
+ import { noUselessPathSegments } from "./rules/no-useless-path-segments.ts";
13
+ import { requiredExports } from "./rules/required-exports.ts";
1
14
  export declare const rules: {
2
- [x: string]: import("eslint").Rule.RuleModule;
15
+ [existingFileImports.name]: import("eslint").Rule.RuleModule;
16
+ [noDeclarationFileImports.name]: import("eslint").Rule.RuleModule;
17
+ [noDirectoryImports.name]: import("eslint").Rule.RuleModule;
18
+ [noDynamicImports.name]: import("eslint").Rule.RuleModule;
19
+ [noEmptyExports.name]: import("eslint").Rule.RuleModule;
20
+ [noGitIgnoredImports.name]: import("eslint").Rule.RuleModule;
21
+ [noPhantomDepImports.name]: import("eslint").Rule.RuleModule;
22
+ [noRelativeParentImports.name]: import("eslint").Rule.RuleModule;
23
+ [noRenameExports.name]: import("eslint").Rule.RuleModule;
24
+ [noRenameImports.name]: import("eslint").Rule.RuleModule;
25
+ [noSideEffectImports.name]: import("eslint").Rule.RuleModule;
26
+ [noUselessPathSegments.name]: import("eslint").Rule.RuleModule;
27
+ [requiredExports.name]: import("eslint").Rule.RuleModule;
3
28
  };
4
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,KAAK;;CAcjB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,eAAO,MAAM,KAAK;IAChB,CAAC,mBAAmB,CAAC,IAAI,CAAC,mCAA0B;IACpD,CAAC,wBAAwB,CAAC,IAAI,CAAC,mCAA+B;IAC9D,CAAC,kBAAkB,CAAC,IAAI,CAAC,mCAAyB;IAClD,CAAC,gBAAgB,CAAC,IAAI,CAAC,mCAAuB;IAC9C,CAAC,cAAc,CAAC,IAAI,CAAC,mCAAqB;IAC1C,CAAC,mBAAmB,CAAC,IAAI,CAAC,mCAA0B;IACpD,CAAC,mBAAmB,CAAC,IAAI,CAAC,mCAA0B;IACpD,CAAC,uBAAuB,CAAC,IAAI,CAAC,mCAA8B;IAC5D,CAAC,eAAe,CAAC,IAAI,CAAC,mCAAsB;IAC5C,CAAC,eAAe,CAAC,IAAI,CAAC,mCAAsB;IAC5C,CAAC,mBAAmB,CAAC,IAAI,CAAC,mCAA0B;IACpD,CAAC,qBAAqB,CAAC,IAAI,CAAC,mCAA4B;IACxD,CAAC,eAAe,CAAC,IAAI,CAAC,mCAAsB;CAC7C,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
+ import { existingFileImports } from "./rules/existing-file-imports.js";
1
2
  import { noDeclarationFileImports } from "./rules/no-declaration-file-imports.js";
2
3
  import { noDirectoryImports } from "./rules/no-directory-imports.js";
3
4
  import { noDynamicImports } from "./rules/no-dynamic-imports.js";
4
5
  import { noEmptyExports } from "./rules/no-empty-exports.js";
5
6
  import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.js";
6
- import { noInexistentRelativeImports } from "./rules/no-inexistent-relative-imports.js";
7
7
  import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.js";
8
8
  import { noRelativeParentImports } from "./rules/no-relative-parent-imports.js";
9
9
  import { noRenameExports } from "./rules/no-rename-exports.js";
@@ -12,12 +12,12 @@ import { noSideEffectImports } from "./rules/no-side-effect-imports.js";
12
12
  import { noUselessPathSegments } from "./rules/no-useless-path-segments.js";
13
13
  import { requiredExports } from "./rules/required-exports.js";
14
14
  export const rules = {
15
+ [existingFileImports.name]: existingFileImports.rule,
15
16
  [noDeclarationFileImports.name]: noDeclarationFileImports.rule,
16
17
  [noDirectoryImports.name]: noDirectoryImports.rule,
17
18
  [noDynamicImports.name]: noDynamicImports.rule,
18
19
  [noEmptyExports.name]: noEmptyExports.rule,
19
20
  [noGitIgnoredImports.name]: noGitIgnoredImports.rule,
20
- [noInexistentRelativeImports.name]: noInexistentRelativeImports.rule,
21
21
  [noPhantomDepImports.name]: noPhantomDepImports.rule,
22
22
  [noRelativeParentImports.name]: noRelativeParentImports.rule,
23
23
  [noRenameExports.name]: noRenameExports.rule,
@@ -26,4 +26,4 @@ export const rules = {
26
26
  [noUselessPathSegments.name]: noUselessPathSegments.rule,
27
27
  [requiredExports.name]: requiredExports.rule,
28
28
  };
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRztJQUNuQixDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLHdCQUF3QixDQUFDLElBQUk7SUFDOUQsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJO0lBQ2xELENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtJQUM5QyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLENBQUMsSUFBSTtJQUMxQyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsRUFBRSwyQkFBMkIsQ0FBQyxJQUFJO0lBQ3BFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLElBQUk7SUFDNUQsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSTtJQUN4RCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSTtDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbm9EZWNsYXJhdGlvbkZpbGVJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZGVjbGFyYXRpb24tZmlsZS1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub0RpcmVjdG9yeUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1kaXJlY3RvcnktaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9EeW5hbWljSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLWR5bmFtaWMtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9FbXB0eUV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1lbXB0eS1leHBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub0dpdElnbm9yZWRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZ2l0LWlnbm9yZWQtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9JbmV4aXN0ZW50UmVsYXRpdmVJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8taW5leGlzdGVudC1yZWxhdGl2ZS1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub1BoYW50b21EZXBJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcGhhbnRvbS1kZXAtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9SZWxhdGl2ZVBhcmVudEltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZWxhdGl2ZS1wYXJlbnQtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9SZW5hbWVFeHBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcmVuYW1lLWV4cG9ydHMudHNcIjtcbmltcG9ydCB7IG5vUmVuYW1lSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXJlbmFtZS1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub1NpZGVFZmZlY3RJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tc2lkZS1lZmZlY3QtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9Vc2VsZXNzUGF0aFNlZ21lbnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tdXNlbGVzcy1wYXRoLXNlZ21lbnRzLnRzXCI7XG5pbXBvcnQgeyByZXF1aXJlZEV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9yZXF1aXJlZC1leHBvcnRzLnRzXCI7XG5cbmV4cG9ydCBjb25zdCBydWxlcyA9IHtcbiAgW25vRGVjbGFyYXRpb25GaWxlSW1wb3J0cy5uYW1lXTogbm9EZWNsYXJhdGlvbkZpbGVJbXBvcnRzLnJ1bGUsXG4gIFtub0RpcmVjdG9yeUltcG9ydHMubmFtZV06IG5vRGlyZWN0b3J5SW1wb3J0cy5ydWxlLFxuICBbbm9EeW5hbWljSW1wb3J0cy5uYW1lXTogbm9EeW5hbWljSW1wb3J0cy5ydWxlLFxuICBbbm9FbXB0eUV4cG9ydHMubmFtZV06IG5vRW1wdHlFeHBvcnRzLnJ1bGUsXG4gIFtub0dpdElnbm9yZWRJbXBvcnRzLm5hbWVdOiBub0dpdElnbm9yZWRJbXBvcnRzLnJ1bGUsXG4gIFtub0luZXhpc3RlbnRSZWxhdGl2ZUltcG9ydHMubmFtZV06IG5vSW5leGlzdGVudFJlbGF0aXZlSW1wb3J0cy5ydWxlLFxuICBbbm9QaGFudG9tRGVwSW1wb3J0cy5uYW1lXTogbm9QaGFudG9tRGVwSW1wb3J0cy5ydWxlLFxuICBbbm9SZWxhdGl2ZVBhcmVudEltcG9ydHMubmFtZV06IG5vUmVsYXRpdmVQYXJlbnRJbXBvcnRzLnJ1bGUsXG4gIFtub1JlbmFtZUV4cG9ydHMubmFtZV06IG5vUmVuYW1lRXhwb3J0cy5ydWxlLFxuICBbbm9SZW5hbWVJbXBvcnRzLm5hbWVdOiBub1JlbmFtZUltcG9ydHMucnVsZSxcbiAgW25vU2lkZUVmZmVjdEltcG9ydHMubmFtZV06IG5vU2lkZUVmZmVjdEltcG9ydHMucnVsZSxcbiAgW25vVXNlbGVzc1BhdGhTZWdtZW50cy5uYW1lXTogbm9Vc2VsZXNzUGF0aFNlZ21lbnRzLnJ1bGUsXG4gIFtyZXF1aXJlZEV4cG9ydHMubmFtZV06IHJlcXVpcmVkRXhwb3J0cy5ydWxlLFxufTtcbiJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRztJQUNuQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJO0lBQzlELENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtJQUNsRCxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLElBQUk7SUFDOUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxDQUFDLElBQUk7SUFDMUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLElBQUk7SUFDNUQsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSTtJQUN4RCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSTtDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RpbmdGaWxlSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL2V4aXN0aW5nLWZpbGUtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9EZWNsYXJhdGlvbkZpbGVJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZGVjbGFyYXRpb24tZmlsZS1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub0RpcmVjdG9yeUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1kaXJlY3RvcnktaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9EeW5hbWljSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLWR5bmFtaWMtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9FbXB0eUV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1lbXB0eS1leHBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub0dpdElnbm9yZWRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZ2l0LWlnbm9yZWQtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9QaGFudG9tRGVwSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXBoYW50b20tZGVwLWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vUmVsYXRpdmVQYXJlbnRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vUmVuYW1lRXhwb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXJlbmFtZS1leHBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub1JlbmFtZUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZW5hbWUtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9TaWRlRWZmZWN0SW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXNpZGUtZWZmZWN0LWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vVXNlbGVzc1BhdGhTZWdtZW50cyB9IGZyb20gXCIuL3J1bGVzL25vLXVzZWxlc3MtcGF0aC1zZWdtZW50cy50c1wiO1xuaW1wb3J0IHsgcmVxdWlyZWRFeHBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvcmVxdWlyZWQtZXhwb3J0cy50c1wiO1xuXG5leHBvcnQgY29uc3QgcnVsZXMgPSB7XG4gIFtleGlzdGluZ0ZpbGVJbXBvcnRzLm5hbWVdOiBleGlzdGluZ0ZpbGVJbXBvcnRzLnJ1bGUsXG4gIFtub0RlY2xhcmF0aW9uRmlsZUltcG9ydHMubmFtZV06IG5vRGVjbGFyYXRpb25GaWxlSW1wb3J0cy5ydWxlLFxuICBbbm9EaXJlY3RvcnlJbXBvcnRzLm5hbWVdOiBub0RpcmVjdG9yeUltcG9ydHMucnVsZSxcbiAgW25vRHluYW1pY0ltcG9ydHMubmFtZV06IG5vRHluYW1pY0ltcG9ydHMucnVsZSxcbiAgW25vRW1wdHlFeHBvcnRzLm5hbWVdOiBub0VtcHR5RXhwb3J0cy5ydWxlLFxuICBbbm9HaXRJZ25vcmVkSW1wb3J0cy5uYW1lXTogbm9HaXRJZ25vcmVkSW1wb3J0cy5ydWxlLFxuICBbbm9QaGFudG9tRGVwSW1wb3J0cy5uYW1lXTogbm9QaGFudG9tRGVwSW1wb3J0cy5ydWxlLFxuICBbbm9SZWxhdGl2ZVBhcmVudEltcG9ydHMubmFtZV06IG5vUmVsYXRpdmVQYXJlbnRJbXBvcnRzLnJ1bGUsXG4gIFtub1JlbmFtZUV4cG9ydHMubmFtZV06IG5vUmVuYW1lRXhwb3J0cy5ydWxlLFxuICBbbm9SZW5hbWVJbXBvcnRzLm5hbWVdOiBub1JlbmFtZUltcG9ydHMucnVsZSxcbiAgW25vU2lkZUVmZmVjdEltcG9ydHMubmFtZV06IG5vU2lkZUVmZmVjdEltcG9ydHMucnVsZSxcbiAgW25vVXNlbGVzc1BhdGhTZWdtZW50cy5uYW1lXTogbm9Vc2VsZXNzUGF0aFNlZ21lbnRzLnJ1bGUsXG4gIFtyZXF1aXJlZEV4cG9ydHMubmFtZV06IHJlcXVpcmVkRXhwb3J0cy5ydWxlLFxufTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export declare const existingFileImports: {
2
+ name: string;
3
+ rule: import("eslint").Rule.RuleModule;
4
+ };
5
+ //# sourceMappingURL=existing-file-imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"existing-file-imports.d.ts","sourceRoot":"","sources":["../../src/rules/existing-file-imports.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB;;;CAI9B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { create, createRule, getRuleName, getSourceType } from "../common.js";
4
+ import { memoize } from "../utils.js";
5
+ export const existingFileImports = createRule({
6
+ name: getRuleName(import.meta.url),
7
+ message: "Only allow importing from an existing local file.",
8
+ create: (context) => create(context, check),
9
+ });
10
+ function check(filename, source) {
11
+ return getSourceType(source) === "local"
12
+ ? !isExisting(path.resolve(path.dirname(filename), source))
13
+ : false;
14
+ }
15
+ const isExisting = memoize((filepath) => {
16
+ try {
17
+ const stat = fs.statSync(filepath);
18
+ return stat.isFile();
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhpc3RpbmctZmlsZS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL2V4aXN0aW5nLWZpbGUtaW1wb3J0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUM7SUFDNUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsbURBQW1EO0lBQzVELE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Q0FDNUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFjO0lBQzdDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU87UUFDdEMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ1osQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLFFBQWdCLEVBQVcsRUFBRTtJQUN2RCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgY3JlYXRlLCBjcmVhdGVSdWxlLCBnZXRSdWxlTmFtZSwgZ2V0U291cmNlVHlwZSB9IGZyb20gXCIuLi9jb21tb24udHNcIjtcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi4vdXRpbHMudHNcIjtcblxuZXhwb3J0IGNvbnN0IGV4aXN0aW5nRmlsZUltcG9ydHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTogXCJPbmx5IGFsbG93IGltcG9ydGluZyBmcm9tIGFuIGV4aXN0aW5nIGxvY2FsIGZpbGUuXCIsXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IGNyZWF0ZShjb250ZXh0LCBjaGVjayksXG59KTtcblxuZnVuY3Rpb24gY2hlY2soZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGdldFNvdXJjZVR5cGUoc291cmNlKSA9PT0gXCJsb2NhbFwiXG4gICAgPyAhaXNFeGlzdGluZyhwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgc291cmNlKSlcbiAgICA6IGZhbHNlO1xufVxuXG5jb25zdCBpc0V4aXN0aW5nID0gbWVtb2l6ZSgoZmlsZXBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmaWxlcGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSk7XG4iXX0=
@@ -0,0 +1,28 @@
1
+ <!-- prettier-ignore-start -->
2
+ # existing-file-imports
3
+
4
+ Only allow importing from an existing local file.
5
+
6
+ ## Rule Details
7
+
8
+ ### Fail
9
+
10
+ ```ts
11
+ import foo from './existing-file-imports.test.js' // filename: /foo/src/rules/existing-file-imports.test.ts
12
+ import foo from './existing-file-imports.test' // filename: /foo/src/rules/existing-file-imports.test.ts
13
+ import foo from './inexistent-file' // filename: /foo/src/rules/existing-file-imports.test.ts
14
+ import foo from '../inexistent-file' // filename: /foo/src/rules/existing-file-imports.test.ts
15
+ import foo from '../rules' // filename: /foo/src/rules/existing-file-imports.test.ts
16
+ import foo from '.' // filename: /foo/src/rules/existing-file-imports.test.ts
17
+ import foo from './' // filename: /foo/src/rules/existing-file-imports.test.ts
18
+ import foo from '..' // filename: /foo/src/rules/existing-file-imports.test.ts
19
+ import foo from '../' // filename: /foo/src/rules/existing-file-imports.test.ts
20
+ ```
21
+
22
+ ### Pass
23
+
24
+ ```ts
25
+ import foo from 'foo' // filename: /foo/src/rules/existing-file-imports.test.ts
26
+ import foo from './existing-file-imports.test.ts' // filename: /foo/src/rules/existing-file-imports.test.ts
27
+ ```
28
+ <!-- prettier-ignore-end -->
@@ -8,23 +8,23 @@ Disallow importing from a directory.
8
8
  ### Fail
9
9
 
10
10
  ```ts
11
- import foo from '.' // filename: /foo/src/rules/no-directory-imports.spec.ts
12
- import foo from './' // filename: /foo/src/rules/no-directory-imports.spec.ts
13
- import foo from '..' // filename: /foo/src/rules/no-directory-imports.spec.ts
14
- import foo from '../' // filename: /foo/src/rules/no-directory-imports.spec.ts
15
- import foo from '../rules' // filename: /foo/src/rules/no-directory-imports.spec.ts
16
- import foo from '../rules/' // filename: /foo/src/rules/no-directory-imports.spec.ts
17
- import foo from '../../src' // filename: /foo/src/rules/no-directory-imports.spec.ts
18
- import foo from '/foo' // filename: /foo/src/rules/no-directory-imports.spec.ts
11
+ import foo from '.' // filename: /foo/src/rules/no-directory-imports.test.ts
12
+ import foo from './' // filename: /foo/src/rules/no-directory-imports.test.ts
13
+ import foo from '..' // filename: /foo/src/rules/no-directory-imports.test.ts
14
+ import foo from '../' // filename: /foo/src/rules/no-directory-imports.test.ts
15
+ import foo from '../rules' // filename: /foo/src/rules/no-directory-imports.test.ts
16
+ import foo from '../rules/' // filename: /foo/src/rules/no-directory-imports.test.ts
17
+ import foo from '../../src' // filename: /foo/src/rules/no-directory-imports.test.ts
18
+ import foo from '/foo' // filename: /foo/src/rules/no-directory-imports.test.ts
19
19
  ```
20
20
 
21
21
  ### Pass
22
22
 
23
23
  ```ts
24
- import foo from 'foo' // filename: /foo/src/rules/no-directory-imports.spec.ts
25
- import foo from './foo' // filename: /foo/src/rules/no-directory-imports.spec.ts
26
- import foo from '/foo/index.js' // filename: /foo/src/rules/no-directory-imports.spec.ts
27
- import foo from '/foo/index.ts' // filename: /foo/src/rules/no-directory-imports.spec.ts
28
- import foo from '/foo/package.json' // filename: /foo/src/rules/no-directory-imports.spec.ts
24
+ import foo from 'foo' // filename: /foo/src/rules/no-directory-imports.test.ts
25
+ import foo from './foo' // filename: /foo/src/rules/no-directory-imports.test.ts
26
+ import foo from '/foo/index.js' // filename: /foo/src/rules/no-directory-imports.test.ts
27
+ import foo from '/foo/index.ts' // filename: /foo/src/rules/no-directory-imports.test.ts
28
+ import foo from '/foo/package.json' // filename: /foo/src/rules/no-directory-imports.test.ts
29
29
  ```
30
30
  <!-- prettier-ignore-end -->
@@ -8,29 +8,29 @@ Disallow to import module from a git-ignored path.
8
8
  ### Fail
9
9
 
10
10
  ```ts
11
- import foo from './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
12
- import './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
13
- import('./dist/foo') // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
14
- export * from './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
15
- export {name} from './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
16
- import foo from '../dist/index.js' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
17
- import foo from '../../node_modules/foo/bar.js' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
18
- import foo from '/foo/tmp' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
19
- import foo from '/foo/tmp' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
20
- import foo from '../../test/for-test' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
21
- import foo from '../../../../../for-test' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
11
+ import foo from './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
12
+ import './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
13
+ import('./dist/foo') // filename: /foo/src/rules/no-git-ignored-imports.test.ts
14
+ export * from './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
15
+ export {name} from './dist/foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
16
+ import foo from '../dist/index.js' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
17
+ import foo from '../../node_modules/foo/bar.js' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
18
+ import foo from '/foo/tmp' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
19
+ import foo from '/foo/tmp' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
20
+ import foo from '../../test/for-test' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
21
+ import foo from '../../../../../for-test' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
22
22
  ```
23
23
 
24
24
  ### Pass
25
25
 
26
26
  ```ts
27
- import foo from 'foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
28
- import 'foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
29
- require('foo') // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
30
- import('foo') // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
31
- export * from 'foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
32
- export {name} from 'foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
33
- import foo from '.foo' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
34
- import foo from '../../../../for-test' // filename: /foo/src/rules/no-git-ignored-imports.spec.ts
27
+ import foo from 'foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
28
+ import 'foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
29
+ require('foo') // filename: /foo/src/rules/no-git-ignored-imports.test.ts
30
+ import('foo') // filename: /foo/src/rules/no-git-ignored-imports.test.ts
31
+ export * from 'foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
32
+ export {name} from 'foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
33
+ import foo from '.foo' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
34
+ import foo from '../../../../for-test' // filename: /foo/src/rules/no-git-ignored-imports.test.ts
35
35
  ```
36
36
  <!-- prettier-ignore-end -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-esm",
3
- "version": "0.6.1",
3
+ "version": "0.8.0",
4
4
  "description": "ESLint plugin for linting ESM (import/export syntax)",
5
5
  "keywords": [
6
6
  "eslint",
@@ -27,12 +27,15 @@
27
27
  "devDependencies": {
28
28
  "@types/estree": "1.0.6",
29
29
  "@types/json-schema": "7.0.15",
30
- "@types/node": "22.13.5",
31
- "eslint": "9.21.0",
30
+ "@types/node": "22.13.10",
31
+ "eslint": "9.22.0",
32
32
  "@fenge/dev-utils": "0.0.0"
33
33
  },
34
+ "engines": {
35
+ "node": "^18.20.0 || >=20.10.0"
36
+ },
34
37
  "scripts": {
35
38
  "build": "tsc",
36
- "test": "node --test --experimental-strip-types \"**/*.spec.ts\""
39
+ "test": "node --test --experimental-strip-types"
37
40
  }
38
41
  }
package/src/index.ts CHANGED
@@ -1,9 +1,9 @@
1
+ import { existingFileImports } from "./rules/existing-file-imports.ts";
1
2
  import { noDeclarationFileImports } from "./rules/no-declaration-file-imports.ts";
2
3
  import { noDirectoryImports } from "./rules/no-directory-imports.ts";
3
4
  import { noDynamicImports } from "./rules/no-dynamic-imports.ts";
4
5
  import { noEmptyExports } from "./rules/no-empty-exports.ts";
5
6
  import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.ts";
6
- import { noInexistentRelativeImports } from "./rules/no-inexistent-relative-imports.ts";
7
7
  import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.ts";
8
8
  import { noRelativeParentImports } from "./rules/no-relative-parent-imports.ts";
9
9
  import { noRenameExports } from "./rules/no-rename-exports.ts";
@@ -13,12 +13,12 @@ import { noUselessPathSegments } from "./rules/no-useless-path-segments.ts";
13
13
  import { requiredExports } from "./rules/required-exports.ts";
14
14
 
15
15
  export const rules = {
16
+ [existingFileImports.name]: existingFileImports.rule,
16
17
  [noDeclarationFileImports.name]: noDeclarationFileImports.rule,
17
18
  [noDirectoryImports.name]: noDirectoryImports.rule,
18
19
  [noDynamicImports.name]: noDynamicImports.rule,
19
20
  [noEmptyExports.name]: noEmptyExports.rule,
20
21
  [noGitIgnoredImports.name]: noGitIgnoredImports.rule,
21
- [noInexistentRelativeImports.name]: noInexistentRelativeImports.rule,
22
22
  [noPhantomDepImports.name]: noPhantomDepImports.rule,
23
23
  [noRelativeParentImports.name]: noRelativeParentImports.rule,
24
24
  [noRenameExports.name]: noRenameExports.rule,
@@ -1,6 +1,6 @@
1
1
  import { fileURLToPath } from "node:url";
2
2
  import { test } from "@fenge/dev-utils";
3
- import { noInexistentRelativeImports } from "./no-inexistent-relative-imports.ts";
3
+ import { existingFileImports } from "./existing-file-imports.ts";
4
4
 
5
5
  const filename = fileURLToPath(import.meta.url);
6
6
 
@@ -8,20 +8,21 @@ const valid = [
8
8
  "import foo from 'foo'",
9
9
 
10
10
  // with ext
11
- "import foo from './no-inexistent-relative-imports.spec.ts'",
12
- "import foo from '../rules'",
13
- "import foo from '.'",
14
- "import foo from './'",
15
- "import foo from '..'",
16
- "import foo from '../'",
11
+ "import foo from './existing-file-imports.test.ts'",
17
12
  ].map((code) => ({ code, filename }));
18
13
 
19
14
  const invalid = [
20
- "import foo from './no-inexistent-relative-imports.spec.js'",
15
+ "import foo from './existing-file-imports.test.js'",
21
16
  // without ext
22
- "import foo from './no-inexistent-relative-imports.spec'",
17
+ "import foo from './existing-file-imports.test'",
23
18
  "import foo from './inexistent-file'",
24
19
  "import foo from '../inexistent-file'",
20
+ // directory
21
+ "import foo from '../rules'",
22
+ "import foo from '.'",
23
+ "import foo from './'",
24
+ "import foo from '..'",
25
+ "import foo from '../'",
25
26
  ].map((code) => ({ code, filename }));
26
27
 
27
- test({ valid, invalid, ...noInexistentRelativeImports });
28
+ test({ valid, invalid, ...existingFileImports });
@@ -3,24 +3,22 @@ import path from "node:path";
3
3
  import { create, createRule, getRuleName, getSourceType } from "../common.ts";
4
4
  import { memoize } from "../utils.ts";
5
5
 
6
- export const noInexistentRelativeImports = createRule({
6
+ export const existingFileImports = createRule({
7
7
  name: getRuleName(import.meta.url),
8
- message: "Disallow importing from a relative file which is inexistent.",
8
+ message: "Only allow importing from an existing local file.",
9
9
  create: (context) => create(context, check),
10
10
  });
11
11
 
12
12
  function check(filename: string, source: string) {
13
- if (getSourceType(source) !== "local") {
14
- return false;
15
- }
16
- return !isExisting(path.resolve(path.dirname(filename), source));
13
+ return getSourceType(source) === "local"
14
+ ? !isExisting(path.resolve(path.dirname(filename), source))
15
+ : false;
17
16
  }
18
17
 
19
- // TODO: Directory should be reported. Remove `|| stat.isDirectory()` later.
20
18
  const isExisting = memoize((filepath: string): boolean => {
21
19
  try {
22
20
  const stat = fs.statSync(filepath);
23
- return stat.isFile() || stat.isDirectory();
21
+ return stat.isFile();
24
22
  } catch {
25
23
  return false;
26
24
  }
package/tsconfig.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "extends": "../../tsconfig",
3
3
  "include": ["src"],
4
- "exclude": ["**/*.spec.ts", "**/*.test.ts"]
4
+ "exclude": ["**/*.test.ts"]
5
5
  }
@@ -1,5 +0,0 @@
1
- export declare const noInexistentRelativeImports: {
2
- name: string;
3
- rule: import("eslint").Rule.RuleModule;
4
- };
5
- //# sourceMappingURL=no-inexistent-relative-imports.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"no-inexistent-relative-imports.d.ts","sourceRoot":"","sources":["../../src/rules/no-inexistent-relative-imports.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B;;;CAItC,CAAC"}
@@ -1,26 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { create, createRule, getRuleName, getSourceType } from "../common.js";
4
- import { memoize } from "../utils.js";
5
- export const noInexistentRelativeImports = createRule({
6
- name: getRuleName(import.meta.url),
7
- message: "Disallow importing from a relative file which is inexistent.",
8
- create: (context) => create(context, check),
9
- });
10
- function check(filename, source) {
11
- if (getSourceType(source) !== "local") {
12
- return false;
13
- }
14
- return !isExisting(path.resolve(path.dirname(filename), source));
15
- }
16
- // TODO: Directory should be reported. Remove `|| stat.isDirectory()` later.
17
- const isExisting = memoize((filepath) => {
18
- try {
19
- const stat = fs.statSync(filepath);
20
- return stat.isFile() || stat.isDirectory();
21
- }
22
- catch {
23
- return false;
24
- }
25
- });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8taW5leGlzdGVudC1yZWxhdGl2ZS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLWluZXhpc3RlbnQtcmVsYXRpdmUtaW1wb3J0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxVQUFVLENBQUM7SUFDcEQsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsOERBQThEO0lBQ3ZFLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Q0FDNUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxLQUFLLENBQUMsUUFBZ0IsRUFBRSxNQUFjO0lBQzdDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxRQUFnQixFQUFXLEVBQUU7SUFDdkQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGUsIGNyZWF0ZVJ1bGUsIGdldFJ1bGVOYW1lLCBnZXRTb3VyY2VUeXBlIH0gZnJvbSBcIi4uL2NvbW1vbi50c1wiO1xuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gXCIuLi91dGlscy50c1wiO1xuXG5leHBvcnQgY29uc3Qgbm9JbmV4aXN0ZW50UmVsYXRpdmVJbXBvcnRzID0gY3JlYXRlUnVsZSh7XG4gIG5hbWU6IGdldFJ1bGVOYW1lKGltcG9ydC5tZXRhLnVybCksXG4gIG1lc3NhZ2U6IFwiRGlzYWxsb3cgaW1wb3J0aW5nIGZyb20gYSByZWxhdGl2ZSBmaWxlIHdoaWNoIGlzIGluZXhpc3RlbnQuXCIsXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IGNyZWF0ZShjb250ZXh0LCBjaGVjayksXG59KTtcblxuZnVuY3Rpb24gY2hlY2soZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpIHtcbiAgaWYgKGdldFNvdXJjZVR5cGUoc291cmNlKSAhPT0gXCJsb2NhbFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAhaXNFeGlzdGluZyhwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgc291cmNlKSk7XG59XG5cbi8vIFRPRE86IERpcmVjdG9yeSBzaG91bGQgYmUgcmVwb3J0ZWQuIFJlbW92ZSBgfHwgc3RhdC5pc0RpcmVjdG9yeSgpYCBsYXRlci5cbmNvbnN0IGlzRXhpc3RpbmcgPSBtZW1vaXplKChmaWxlcGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZpbGVwYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0ZpbGUoKSB8fCBzdGF0LmlzRGlyZWN0b3J5KCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSk7XG4iXX0=
@@ -1,28 +0,0 @@
1
- <!-- prettier-ignore-start -->
2
- # no-inexistent-relative-imports
3
-
4
- Disallow importing from a relative file which is inexistent.
5
-
6
- ## Rule Details
7
-
8
- ### Fail
9
-
10
- ```ts
11
- import foo from './no-inexistent-relative-imports.spec.js' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
12
- import foo from './no-inexistent-relative-imports.spec' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
13
- import foo from './inexistent-file' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
14
- import foo from '../inexistent-file' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
15
- ```
16
-
17
- ### Pass
18
-
19
- ```ts
20
- import foo from 'foo' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
21
- import foo from './no-inexistent-relative-imports.spec.ts' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
22
- import foo from '../rules' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
23
- import foo from '.' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
24
- import foo from './' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
25
- import foo from '..' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
26
- import foo from '../' // filename: /foo/src/rules/no-inexistent-relative-imports.spec.ts
27
- ```
28
- <!-- prettier-ignore-end -->