eslint-plugin-esm 0.2.2-beta.1 → 0.3.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.
- package/CHANGELOG.md +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/rules/no-empty-exports.d.ts +5 -0
- package/dist/rules/no-empty-exports.d.ts.map +1 -0
- package/dist/rules/no-empty-exports.js +11 -0
- package/dist/rules/no-phantom-dep-imports.d.ts.map +1 -1
- package/dist/rules/no-phantom-dep-imports.js +10 -3
- package/dist/rules/no-side-effect-imports.d.ts.map +1 -1
- package/dist/rules/no-side-effect-imports.js +3 -5
- package/dist/rules/no-ts-file-imports.js +2 -6
- package/dist/rules/required-exports.d.ts +5 -0
- package/dist/rules/required-exports.d.ts.map +1 -0
- package/dist/rules/required-exports.js +22 -0
- package/doc/rules/no-empty-exports.md +29 -0
- package/doc/rules/no-side-effect-imports.md +13 -14
- package/doc/rules/no-ts-file-imports.md +18 -102
- package/doc/rules/required-exports.md +31 -0
- package/package.json +2 -2
- package/src/index.ts +4 -0
- package/src/rules/no-empty-exports.spec.ts +22 -0
- package/src/rules/no-empty-exports.ts +14 -0
- package/src/rules/no-phantom-dep-imports.ts +10 -2
- package/src/rules/no-side-effect-imports.spec.ts +2 -4
- package/src/rules/no-side-effect-imports.ts +4 -9
- package/src/rules/no-ts-file-imports.spec.ts +2 -11
- package/src/rules/no-ts-file-imports.ts +1 -9
- package/src/rules/required-exports.spec.ts +24 -0
- package/src/rules/required-exports.ts +22 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
# eslint-plugin-esm
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1b7d98c: refactor(eslint-plugin-esm): `no-side-effect-imports` will not ignore declaration files now
|
|
8
|
+
- 2d485c9: refactor(eslint-plugin-esm): `no-ts-file-imports` will not ignore declaration files now
|
|
4
9
|
|
|
5
10
|
### Patch Changes
|
|
6
11
|
|
|
7
|
-
-
|
|
12
|
+
- 6c64129: feat: add rule `no-empty-exports`
|
|
13
|
+
- d54423b: fix(eslint-plugin-esm): additionally check for importing node built-in module
|
|
14
|
+
- 778a198: feat: add rule `esm/required-exports`
|
|
8
15
|
|
|
9
|
-
## 0.2.2
|
|
16
|
+
## 0.2.2
|
|
10
17
|
|
|
11
18
|
### Patch Changes
|
|
12
19
|
|
|
20
|
+
- 905e445: chore: update deps
|
|
13
21
|
- 0c4462d: fix(eslint-plugin-esm): fix incorrect report on `import type {} from "@foo/bar"`
|
|
14
22
|
|
|
15
23
|
## 0.2.1
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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,7 @@
|
|
|
1
1
|
import { nearestRelativePath } from "./rules/nearest-relative-path.js";
|
|
2
2
|
import { noDirectoryImports } from "./rules/no-directory-imports.js";
|
|
3
3
|
import { noDynamicImports } from "./rules/no-dynamic-imports.js";
|
|
4
|
+
import { noEmptyExports } from "./rules/no-empty-exports.js";
|
|
4
5
|
import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.js";
|
|
5
6
|
import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.js";
|
|
6
7
|
import { noRelativeParentImports } from "./rules/no-relative-parent-imports.js";
|
|
@@ -8,10 +9,12 @@ import { noRenameExports } from "./rules/no-rename-exports.js";
|
|
|
8
9
|
import { noRenameImports } from "./rules/no-rename-imports.js";
|
|
9
10
|
import { noSideEffectImports } from "./rules/no-side-effect-imports.js";
|
|
10
11
|
import { noTsFileImports } from "./rules/no-ts-file-imports.js";
|
|
12
|
+
import { requiredExports } from "./rules/required-exports.js";
|
|
11
13
|
export const rules = {
|
|
12
14
|
[nearestRelativePath.name]: nearestRelativePath.rule,
|
|
13
15
|
[noDirectoryImports.name]: noDirectoryImports.rule,
|
|
14
16
|
[noDynamicImports.name]: noDynamicImports.rule,
|
|
17
|
+
[noEmptyExports.name]: noEmptyExports.rule,
|
|
15
18
|
[noGitIgnoredImports.name]: noGitIgnoredImports.rule,
|
|
16
19
|
[noPhantomDepImports.name]: noPhantomDepImports.rule,
|
|
17
20
|
[noRelativeParentImports.name]: noRelativeParentImports.rule,
|
|
@@ -19,5 +22,6 @@ export const rules = {
|
|
|
19
22
|
[noRenameImports.name]: noRenameImports.rule,
|
|
20
23
|
[noSideEffectImports.name]: noSideEffectImports.rule,
|
|
21
24
|
[noTsFileImports.name]: noTsFileImports.rule,
|
|
25
|
+
[requiredExports.name]: requiredExports.rule,
|
|
22
26
|
};
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtJQUNsRCxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLElBQUk7SUFDOUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxDQUFDLElBQUk7SUFDMUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLElBQUk7SUFDNUQsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJO0lBQzVDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBuZWFyZXN0UmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4vcnVsZXMvbmVhcmVzdC1yZWxhdGl2ZS1wYXRoLmpzXCI7XG5pbXBvcnQgeyBub0RpcmVjdG9yeUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1kaXJlY3RvcnktaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9EeW5hbWljSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLWR5bmFtaWMtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9FbXB0eUV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1lbXB0eS1leHBvcnRzLmpzXCI7XG5pbXBvcnQgeyBub0dpdElnbm9yZWRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZ2l0LWlnbm9yZWQtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9QaGFudG9tRGVwSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXBoYW50b20tZGVwLWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vUmVsYXRpdmVQYXJlbnRJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcmVsYXRpdmUtcGFyZW50LWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vUmVuYW1lRXhwb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXJlbmFtZS1leHBvcnRzLmpzXCI7XG5pbXBvcnQgeyBub1JlbmFtZUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZW5hbWUtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgbm9TaWRlRWZmZWN0SW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXNpZGUtZWZmZWN0LWltcG9ydHMuanNcIjtcbmltcG9ydCB7IG5vVHNGaWxlSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXRzLWZpbGUtaW1wb3J0cy5qc1wiO1xuaW1wb3J0IHsgcmVxdWlyZWRFeHBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvcmVxdWlyZWQtZXhwb3J0cy5qc1wiO1xuXG5leHBvcnQgY29uc3QgcnVsZXMgPSB7XG4gIFtuZWFyZXN0UmVsYXRpdmVQYXRoLm5hbWVdOiBuZWFyZXN0UmVsYXRpdmVQYXRoLnJ1bGUsXG4gIFtub0RpcmVjdG9yeUltcG9ydHMubmFtZV06IG5vRGlyZWN0b3J5SW1wb3J0cy5ydWxlLFxuICBbbm9EeW5hbWljSW1wb3J0cy5uYW1lXTogbm9EeW5hbWljSW1wb3J0cy5ydWxlLFxuICBbbm9FbXB0eUV4cG9ydHMubmFtZV06IG5vRW1wdHlFeHBvcnRzLnJ1bGUsXG4gIFtub0dpdElnbm9yZWRJbXBvcnRzLm5hbWVdOiBub0dpdElnbm9yZWRJbXBvcnRzLnJ1bGUsXG4gIFtub1BoYW50b21EZXBJbXBvcnRzLm5hbWVdOiBub1BoYW50b21EZXBJbXBvcnRzLnJ1bGUsXG4gIFtub1JlbGF0aXZlUGFyZW50SW1wb3J0cy5uYW1lXTogbm9SZWxhdGl2ZVBhcmVudEltcG9ydHMucnVsZSxcbiAgW25vUmVuYW1lRXhwb3J0cy5uYW1lXTogbm9SZW5hbWVFeHBvcnRzLnJ1bGUsXG4gIFtub1JlbmFtZUltcG9ydHMubmFtZV06IG5vUmVuYW1lSW1wb3J0cy5ydWxlLFxuICBbbm9TaWRlRWZmZWN0SW1wb3J0cy5uYW1lXTogbm9TaWRlRWZmZWN0SW1wb3J0cy5ydWxlLFxuICBbbm9Uc0ZpbGVJbXBvcnRzLm5hbWVdOiBub1RzRmlsZUltcG9ydHMucnVsZSxcbiAgW3JlcXVpcmVkRXhwb3J0cy5uYW1lXTogcmVxdWlyZWRFeHBvcnRzLnJ1bGUsXG59O1xuIl19
|
|
@@ -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;;;
|
|
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 './'`
|
|
53
|
-
|
|
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,
|
|
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;;;
|
|
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,13 +16,11 @@ 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) => {
|
|
25
|
-
if (ignoreExps.some((exp) =>
|
|
22
|
+
if (ignoreExps.some((exp) => typeof node.source.value === "string" &&
|
|
23
|
+
exp.test(node.source.value))) {
|
|
26
24
|
return;
|
|
27
25
|
}
|
|
28
26
|
context.report({ node, messageId: DEFAULT_MESSAGE_ID });
|
|
@@ -30,4 +28,4 @@ export const noSideEffectImports = createRule({
|
|
|
30
28
|
};
|
|
31
29
|
},
|
|
32
30
|
});
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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(
|
|
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,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdHMtZmlsZS1pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bGVzL25vLXRzLWZpbGUtaW1wb3J0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztJQUN4QyxJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xDLE9BQU8sRUFBRSwrREFBK0Q7SUFDeEUsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSCxTQUFTLEtBQUssQ0FBQyxTQUFpQixFQUFFLE1BQWM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZSwgY3JlYXRlUnVsZSwgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vY29tbW9uLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBub1RzRmlsZUltcG9ydHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTogXCJEaXNhbGxvdyBpbXBvcnRpbmcgZnJvbSBhIGRlY2xhcmF0aW9uIHN0eWxlIGZpbGUgb3IgYSB0cyBmaWxlXCIsXG4gIGNyZWF0ZTogKGNvbnRleHQpID0+IGNyZWF0ZShjb250ZXh0LCBjaGVjayksXG59KTtcblxuZnVuY3Rpb24gY2hlY2soX2ZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSB7XG4gIGNvbnN0IGZpbGUgPSBzb3VyY2Uuc3BsaXQoXCIvXCIpLmF0KC0xKTtcbiAgaWYgKCFmaWxlIHx8IGZpbGUuaW5jbHVkZXMoXCIuZC5cIikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gW1wiLnRzXCIsIFwiLmN0c1wiLCBcIi5tdHNcIiwgXCIudHN4XCJdLnNvbWUoKGV4dCkgPT4gZmlsZS5lbmRzV2l0aChleHQpKTtcbn1cbiJdfQ==
|
|
@@ -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'
|
|
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'
|
|
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'
|
|
24
|
-
import {} from 'reflect-metadata'
|
|
25
|
-
import 'foo.css'
|
|
26
|
-
import './foo.css'
|
|
27
|
-
import 'module.css'
|
|
28
|
-
import {foo} from 'foo'
|
|
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'
|
|
12
|
-
import foo from './foo.
|
|
13
|
-
import foo from './foo.
|
|
14
|
-
import foo from './foo.
|
|
15
|
-
import foo from '
|
|
16
|
-
import foo from './foo.
|
|
17
|
-
import foo from './foo.
|
|
18
|
-
import foo from './foo.
|
|
19
|
-
import foo from './foo.
|
|
20
|
-
import foo from './foo.mts'
|
|
21
|
-
import foo from './foo.
|
|
22
|
-
import foo from './foo.
|
|
23
|
-
import foo from './foo.
|
|
24
|
-
import foo from './foo.
|
|
25
|
-
import foo from './foo.
|
|
26
|
-
import foo from '
|
|
27
|
-
import foo from 'foo.d.
|
|
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 '
|
|
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 -->
|
|
@@ -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.
|
|
3
|
+
"version": "0.3.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.
|
|
32
|
+
"@typescript-eslint/parser": "8.18.1",
|
|
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,7 @@
|
|
|
1
1
|
import { nearestRelativePath } from "./rules/nearest-relative-path.js";
|
|
2
2
|
import { noDirectoryImports } from "./rules/no-directory-imports.js";
|
|
3
3
|
import { noDynamicImports } from "./rules/no-dynamic-imports.js";
|
|
4
|
+
import { noEmptyExports } from "./rules/no-empty-exports.js";
|
|
4
5
|
import { noGitIgnoredImports } from "./rules/no-git-ignored-imports.js";
|
|
5
6
|
import { noPhantomDepImports } from "./rules/no-phantom-dep-imports.js";
|
|
6
7
|
import { noRelativeParentImports } from "./rules/no-relative-parent-imports.js";
|
|
@@ -8,11 +9,13 @@ import { noRenameExports } from "./rules/no-rename-exports.js";
|
|
|
8
9
|
import { noRenameImports } from "./rules/no-rename-imports.js";
|
|
9
10
|
import { noSideEffectImports } from "./rules/no-side-effect-imports.js";
|
|
10
11
|
import { noTsFileImports } from "./rules/no-ts-file-imports.js";
|
|
12
|
+
import { requiredExports } from "./rules/required-exports.js";
|
|
11
13
|
|
|
12
14
|
export const rules = {
|
|
13
15
|
[nearestRelativePath.name]: nearestRelativePath.rule,
|
|
14
16
|
[noDirectoryImports.name]: noDirectoryImports.rule,
|
|
15
17
|
[noDynamicImports.name]: noDynamicImports.rule,
|
|
18
|
+
[noEmptyExports.name]: noEmptyExports.rule,
|
|
16
19
|
[noGitIgnoredImports.name]: noGitIgnoredImports.rule,
|
|
17
20
|
[noPhantomDepImports.name]: noPhantomDepImports.rule,
|
|
18
21
|
[noRelativeParentImports.name]: noRelativeParentImports.rule,
|
|
@@ -20,4 +23,5 @@ export const rules = {
|
|
|
20
23
|
[noRenameImports.name]: noRenameImports.rule,
|
|
21
24
|
[noSideEffectImports.name]: noSideEffectImports.rule,
|
|
22
25
|
[noTsFileImports.name]: noTsFileImports.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 './'`
|
|
65
|
-
|
|
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
|
-
]
|
|
21
|
+
];
|
|
24
22
|
|
|
25
23
|
test({ valid, invalid, ...noSideEffectImports });
|
|
@@ -20,19 +20,14 @@ 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) => {
|
|
33
26
|
if (
|
|
34
|
-
ignoreExps.some(
|
|
35
|
-
exp
|
|
27
|
+
ignoreExps.some(
|
|
28
|
+
(exp) =>
|
|
29
|
+
typeof node.source.value === "string" &&
|
|
30
|
+
exp.test(node.source.value),
|
|
36
31
|
)
|
|
37
32
|
) {
|
|
38
33
|
return;
|
|
@@ -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
|
|
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
|
|
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(
|
|
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;
|
|
@@ -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
|
+
});
|