eslint-plugin-esm 0.8.0 → 0.8.1
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 +6 -0
- package/dist/common.js +3 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/rules/top-side-effect-imports.d.ts +5 -0
- package/dist/rules/top-side-effect-imports.d.ts.map +1 -0
- package/dist/rules/top-side-effect-imports.js +20 -0
- package/doc/rules/top-side-effect-imports.md +31 -0
- package/package.json +1 -1
- package/src/common.ts +2 -2
- package/src/index.ts +2 -0
- package/src/rules/top-side-effect-imports.test.ts +24 -0
- package/src/rules/top-side-effect-imports.ts +22 -0
package/CHANGELOG.md
CHANGED
package/dist/common.js
CHANGED
|
@@ -11,7 +11,7 @@ export function createRule({ name, message, schema, fixable, type = "suggestion"
|
|
|
11
11
|
},
|
|
12
12
|
type,
|
|
13
13
|
docs: {
|
|
14
|
-
|
|
14
|
+
url: `https://github.com/zanminkian/fenge/blob/main/packages/eslint-plugin-esm/doc/rules/${name}.md`,
|
|
15
15
|
description: message,
|
|
16
16
|
},
|
|
17
17
|
},
|
|
@@ -21,7 +21,7 @@ export function createRule({ name, message, schema, fixable, type = "suggestion"
|
|
|
21
21
|
}
|
|
22
22
|
export function getRuleName(importMetaUrl) {
|
|
23
23
|
// remove '.js' extension
|
|
24
|
-
return path.
|
|
24
|
+
return path.parse(fileURLToPath(importMetaUrl)).name;
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Create ESLint RuleListener to check string importation source.
|
|
@@ -60,4 +60,4 @@ export function getSourceType(source) {
|
|
|
60
60
|
}
|
|
61
61
|
return "module";
|
|
62
62
|
}
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVV6QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUM7QUFFNUMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUN6QixJQUFJLEVBQ0osT0FBTyxFQUNQLE1BQU0sRUFDTixPQUFPLEVBQ1AsSUFBSSxHQUFHLFlBQVksRUFDbkIsTUFBTSxFQUFFLFFBQVEsR0FRakI7SUFDQyxNQUFNLElBQUksR0FBb0I7UUFDNUIsSUFBSSxFQUFFO1lBQ0osR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMzQixRQUFRLEVBQUU7Z0JBQ1IsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU87YUFDOUI7WUFDRCxJQUFJO1lBQ0osSUFBSSxFQUFFO2dCQUNKLEdBQUcsRUFBRSxzRkFBc0YsSUFBSSxLQUFLO2dCQUNwRyxXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNGO1FBQ0QsTUFBTSxFQUFFLFFBQVE7S0FDakIsQ0FBQztJQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsYUFBcUI7SUFDL0MseUJBQXlCO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdkQsQ0FBQztBQVFEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDcEIsT0FBeUIsRUFDekIsS0FBMkU7SUFFM0UsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFxQixFQUFFLEVBQUU7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDdEMsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxNQUFNO1FBQ3pCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsb0JBQW9CLEVBQUUsTUFBTTtRQUM1QixzQkFBc0IsRUFBRSxNQUFNO0tBQy9CLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFjO0lBQzFDLElBQ0UsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUc7UUFDZCxNQUFNLEtBQUssSUFBSSxFQUNmLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEV4cG9ydEFsbERlY2xhcmF0aW9uLFxuICBFeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICBJbXBvcnREZWNsYXJhdGlvbixcbiAgSW1wb3J0RXhwcmVzc2lvbixcbn0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNCB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NRVNTQUdFX0lEID0gXCJkZWZhdWx0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdWxlKHtcbiAgbmFtZSxcbiAgbWVzc2FnZSxcbiAgc2NoZW1hLFxuICBmaXhhYmxlLFxuICB0eXBlID0gXCJzdWdnZXN0aW9uXCIsXG4gIGNyZWF0ZTogY3JlYXRlRm4sXG59OiB7XG4gIG5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzY2hlbWE/OiBKU09OU2NoZW1hNFtdO1xuICBmaXhhYmxlPzogUnVsZS5SdWxlTWV0YURhdGFbXCJmaXhhYmxlXCJdO1xuICB0eXBlPzogUnVsZS5SdWxlTWV0YURhdGFbXCJ0eXBlXCJdO1xuICBjcmVhdGU6IChjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KSA9PiBSdWxlLlJ1bGVMaXN0ZW5lcjtcbn0pOiB7IG5hbWU6IHN0cmluZzsgcnVsZTogUnVsZS5SdWxlTW9kdWxlIH0ge1xuICBjb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gICAgbWV0YToge1xuICAgICAgLi4uKHNjaGVtYSAmJiB7IHNjaGVtYSB9KSxcbiAgICAgIC4uLihmaXhhYmxlICYmIHsgZml4YWJsZSB9KSxcbiAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtERUZBVUxUX01FU1NBR0VfSURdOiBtZXNzYWdlLFxuICAgICAgfSxcbiAgICAgIHR5cGUsXG4gICAgICBkb2NzOiB7XG4gICAgICAgIHVybDogYGh0dHBzOi8vZ2l0aHViLmNvbS96YW5taW5raWFuL2ZlbmdlL2Jsb2IvbWFpbi9wYWNrYWdlcy9lc2xpbnQtcGx1Z2luLWVzbS9kb2MvcnVsZXMvJHtuYW1lfS5tZGAsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBtZXNzYWdlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogY3JlYXRlRm4sXG4gIH07XG4gIHJldHVybiB7IG5hbWUsIHJ1bGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bGVOYW1lKGltcG9ydE1ldGFVcmw6IHN0cmluZykge1xuICAvLyByZW1vdmUgJy5qcycgZXh0ZW5zaW9uXG4gIHJldHVybiBwYXRoLnBhcnNlKGZpbGVVUkxUb1BhdGgoaW1wb3J0TWV0YVVybCkpLm5hbWU7XG59XG5cbmV4cG9ydCB0eXBlIEltcG9ydGF0aW9uTm9kZSA9XG4gIHwgSW1wb3J0RGVjbGFyYXRpb25cbiAgfCBJbXBvcnRFeHByZXNzaW9uXG4gIHwgRXhwb3J0QWxsRGVjbGFyYXRpb25cbiAgfCBFeHBvcnROYW1lZERlY2xhcmF0aW9uO1xuXG4vKipcbiAqIENyZWF0ZSBFU0xpbnQgUnVsZUxpc3RlbmVyIHRvIGNoZWNrIHN0cmluZyBpbXBvcnRhdGlvbiBzb3VyY2UuXG4gKiBAcGFyYW0gY29udGV4dCBFU0xpbnQgUnVsZUNvbnRleHRcbiAqIEBwYXJhbSBjaGVjayB0aGUgY2hlY2sgbG9naWNcbiAqIEByZXR1cm5zIEVTTGludCBSdWxlTGlzdGVuZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbiAgY2hlY2s6IChmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZywgbm9kZTogSW1wb3J0YXRpb25Ob2RlKSA9PiBib29sZWFuLFxuKTogUnVsZS5SdWxlTGlzdGVuZXIge1xuICBjb25zdCBoYW5kbGUgPSAobm9kZTogSW1wb3J0YXRpb25Ob2RlKSA9PiB7XG4gICAgaWYgKCFub2RlLnNvdXJjZSkgcmV0dXJuO1xuICAgIGlmICghKFwidmFsdWVcIiBpbiBub2RlLnNvdXJjZSkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG5vZGUuc291cmNlLnZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG4gICAgaWYgKGNoZWNrKGNvbnRleHQuZmlsZW5hbWUsIG5vZGUuc291cmNlLnZhbHVlLCBub2RlKSlcbiAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZTogbm9kZS5zb3VyY2UsIG1lc3NhZ2VJZDogREVGQVVMVF9NRVNTQUdFX0lEIH0pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIEltcG9ydERlY2xhcmF0aW9uOiBoYW5kbGUsXG4gICAgSW1wb3J0RXhwcmVzc2lvbjogaGFuZGxlLFxuICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBoYW5kbGUsXG4gICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogaGFuZGxlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVHlwZShzb3VyY2U6IHN0cmluZykge1xuICBpZiAoXG4gICAgc291cmNlLnN0YXJ0c1dpdGgoXCIvXCIpIHx8XG4gICAgc291cmNlLnN0YXJ0c1dpdGgoXCIuL1wiKSB8fFxuICAgIHNvdXJjZS5zdGFydHNXaXRoKFwiLi4vXCIpIHx8XG4gICAgc291cmNlID09PSBcIi5cIiB8fFxuICAgIHNvdXJjZSA9PT0gXCIuLlwiXG4gICkge1xuICAgIHJldHVybiBcImxvY2FsXCI7XG4gIH1cbiAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKFwibm9kZTpcIikpIHtcbiAgICByZXR1cm4gXCJidWlsdGluXCI7XG4gIH1cbiAgcmV0dXJuIFwibW9kdWxlXCI7XG59XG4iXX0=
|
package/dist/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { noRenameImports } from "./rules/no-rename-imports.ts";
|
|
|
11
11
|
import { noSideEffectImports } from "./rules/no-side-effect-imports.ts";
|
|
12
12
|
import { noUselessPathSegments } from "./rules/no-useless-path-segments.ts";
|
|
13
13
|
import { requiredExports } from "./rules/required-exports.ts";
|
|
14
|
+
import { topSideEffectImports } from "./rules/top-side-effect-imports.ts";
|
|
14
15
|
export declare const rules: {
|
|
15
16
|
[existingFileImports.name]: import("eslint").Rule.RuleModule;
|
|
16
17
|
[noDeclarationFileImports.name]: import("eslint").Rule.RuleModule;
|
|
@@ -25,5 +26,6 @@ export declare const rules: {
|
|
|
25
26
|
[noSideEffectImports.name]: import("eslint").Rule.RuleModule;
|
|
26
27
|
[noUselessPathSegments.name]: import("eslint").Rule.RuleModule;
|
|
27
28
|
[requiredExports.name]: import("eslint").Rule.RuleModule;
|
|
29
|
+
[topSideEffectImports.name]: import("eslint").Rule.RuleModule;
|
|
28
30
|
};
|
|
29
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,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;IAC5C,CAAC,oBAAoB,CAAC,IAAI,CAAC,mCAA2B;CACvD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { noRenameImports } from "./rules/no-rename-imports.js";
|
|
|
11
11
|
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
|
+
import { topSideEffectImports } from "./rules/top-side-effect-imports.js";
|
|
14
15
|
export const rules = {
|
|
15
16
|
[existingFileImports.name]: existingFileImports.rule,
|
|
16
17
|
[noDeclarationFileImports.name]: noDeclarationFileImports.rule,
|
|
@@ -25,5 +26,6 @@ export const rules = {
|
|
|
25
26
|
[noSideEffectImports.name]: noSideEffectImports.rule,
|
|
26
27
|
[noUselessPathSegments.name]: noUselessPathSegments.rule,
|
|
27
28
|
[requiredExports.name]: requiredExports.rule,
|
|
29
|
+
[topSideEffectImports.name]: topSideEffectImports.rule,
|
|
28
30
|
};
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTFFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRztJQUNuQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLG1CQUFtQixDQUFDLElBQUk7SUFDcEQsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJO0lBQzlELENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtJQUNsRCxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQixDQUFDLElBQUk7SUFDOUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxDQUFDLElBQUk7SUFDMUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtJQUNwRCxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLHVCQUF1QixDQUFDLElBQUk7SUFDNUQsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxDQUFDLElBQUk7SUFDNUMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJO0lBQ3BELENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSTtJQUN4RCxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLENBQUMsSUFBSTtJQUM1QyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLG9CQUFvQixDQUFDLElBQUk7Q0FDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0aW5nRmlsZUltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9leGlzdGluZy1maWxlLWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vRGVjbGFyYXRpb25GaWxlSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLWRlY2xhcmF0aW9uLWZpbGUtaW1wb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9EaXJlY3RvcnlJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZGlyZWN0b3J5LWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vRHluYW1pY0ltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1keW5hbWljLWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vRW1wdHlFeHBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tZW1wdHktZXhwb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9HaXRJZ25vcmVkSW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLWdpdC1pZ25vcmVkLWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vUGhhbnRvbURlcEltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1waGFudG9tLWRlcC1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub1JlbGF0aXZlUGFyZW50SW1wb3J0cyB9IGZyb20gXCIuL3J1bGVzL25vLXJlbGF0aXZlLXBhcmVudC1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub1JlbmFtZUV4cG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1yZW5hbWUtZXhwb3J0cy50c1wiO1xuaW1wb3J0IHsgbm9SZW5hbWVJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvbm8tcmVuYW1lLWltcG9ydHMudHNcIjtcbmltcG9ydCB7IG5vU2lkZUVmZmVjdEltcG9ydHMgfSBmcm9tIFwiLi9ydWxlcy9uby1zaWRlLWVmZmVjdC1pbXBvcnRzLnRzXCI7XG5pbXBvcnQgeyBub1VzZWxlc3NQYXRoU2VnbWVudHMgfSBmcm9tIFwiLi9ydWxlcy9uby11c2VsZXNzLXBhdGgtc2VnbWVudHMudHNcIjtcbmltcG9ydCB7IHJlcXVpcmVkRXhwb3J0cyB9IGZyb20gXCIuL3J1bGVzL3JlcXVpcmVkLWV4cG9ydHMudHNcIjtcbmltcG9ydCB7IHRvcFNpZGVFZmZlY3RJbXBvcnRzIH0gZnJvbSBcIi4vcnVsZXMvdG9wLXNpZGUtZWZmZWN0LWltcG9ydHMudHNcIjtcblxuZXhwb3J0IGNvbnN0IHJ1bGVzID0ge1xuICBbZXhpc3RpbmdGaWxlSW1wb3J0cy5uYW1lXTogZXhpc3RpbmdGaWxlSW1wb3J0cy5ydWxlLFxuICBbbm9EZWNsYXJhdGlvbkZpbGVJbXBvcnRzLm5hbWVdOiBub0RlY2xhcmF0aW9uRmlsZUltcG9ydHMucnVsZSxcbiAgW25vRGlyZWN0b3J5SW1wb3J0cy5uYW1lXTogbm9EaXJlY3RvcnlJbXBvcnRzLnJ1bGUsXG4gIFtub0R5bmFtaWNJbXBvcnRzLm5hbWVdOiBub0R5bmFtaWNJbXBvcnRzLnJ1bGUsXG4gIFtub0VtcHR5RXhwb3J0cy5uYW1lXTogbm9FbXB0eUV4cG9ydHMucnVsZSxcbiAgW25vR2l0SWdub3JlZEltcG9ydHMubmFtZV06IG5vR2l0SWdub3JlZEltcG9ydHMucnVsZSxcbiAgW25vUGhhbnRvbURlcEltcG9ydHMubmFtZV06IG5vUGhhbnRvbURlcEltcG9ydHMucnVsZSxcbiAgW25vUmVsYXRpdmVQYXJlbnRJbXBvcnRzLm5hbWVdOiBub1JlbGF0aXZlUGFyZW50SW1wb3J0cy5ydWxlLFxuICBbbm9SZW5hbWVFeHBvcnRzLm5hbWVdOiBub1JlbmFtZUV4cG9ydHMucnVsZSxcbiAgW25vUmVuYW1lSW1wb3J0cy5uYW1lXTogbm9SZW5hbWVJbXBvcnRzLnJ1bGUsXG4gIFtub1NpZGVFZmZlY3RJbXBvcnRzLm5hbWVdOiBub1NpZGVFZmZlY3RJbXBvcnRzLnJ1bGUsXG4gIFtub1VzZWxlc3NQYXRoU2VnbWVudHMubmFtZV06IG5vVXNlbGVzc1BhdGhTZWdtZW50cy5ydWxlLFxuICBbcmVxdWlyZWRFeHBvcnRzLm5hbWVdOiByZXF1aXJlZEV4cG9ydHMucnVsZSxcbiAgW3RvcFNpZGVFZmZlY3RJbXBvcnRzLm5hbWVdOiB0b3BTaWRlRWZmZWN0SW1wb3J0cy5ydWxlLFxufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"top-side-effect-imports.d.ts","sourceRoot":"","sources":["../../src/rules/top-side-effect-imports.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,oBAAoB;;;CAkB/B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.js";
|
|
2
|
+
export const topSideEffectImports = createRule({
|
|
3
|
+
name: getRuleName(import.meta.url),
|
|
4
|
+
message: "Side effect imports must be placed before other import statements.",
|
|
5
|
+
create: (context) => {
|
|
6
|
+
let hasNonSideEffectImport = false;
|
|
7
|
+
return {
|
|
8
|
+
ImportDeclaration: (node) => {
|
|
9
|
+
if (node.specifiers.length > 0) {
|
|
10
|
+
hasNonSideEffectImport = true;
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (hasNonSideEffectImport) {
|
|
14
|
+
context.report({ node, messageId: DEFAULT_MESSAGE_ID });
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wLXNpZGUtZWZmZWN0LWltcG9ydHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvdG9wLXNpZGUtZWZmZWN0LWltcG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0lBQzdDLElBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEMsT0FBTyxFQUFFLG9FQUFvRTtJQUM3RSxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixJQUFJLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUVuQyxPQUFPO1lBQ0wsaUJBQWlCLEVBQUUsQ0FBQyxJQUF1QixFQUFFLEVBQUU7Z0JBQzdDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQy9CLHNCQUFzQixHQUFHLElBQUksQ0FBQztvQkFDOUIsT0FBTztnQkFDVCxDQUFDO2dCQUNELElBQUksc0JBQXNCLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbXBvcnREZWNsYXJhdGlvbiB9IGZyb20gXCJlc3RyZWVcIjtcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIERFRkFVTFRfTUVTU0FHRV9JRCwgZ2V0UnVsZU5hbWUgfSBmcm9tIFwiLi4vY29tbW9uLnRzXCI7XG5cbmV4cG9ydCBjb25zdCB0b3BTaWRlRWZmZWN0SW1wb3J0cyA9IGNyZWF0ZVJ1bGUoe1xuICBuYW1lOiBnZXRSdWxlTmFtZShpbXBvcnQubWV0YS51cmwpLFxuICBtZXNzYWdlOiBcIlNpZGUgZWZmZWN0IGltcG9ydHMgbXVzdCBiZSBwbGFjZWQgYmVmb3JlIG90aGVyIGltcG9ydCBzdGF0ZW1lbnRzLlwiLFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiB7XG4gICAgbGV0IGhhc05vblNpZGVFZmZlY3RJbXBvcnQgPSBmYWxzZTtcblxuICAgIHJldHVybiB7XG4gICAgICBJbXBvcnREZWNsYXJhdGlvbjogKG5vZGU6IEltcG9ydERlY2xhcmF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChub2RlLnNwZWNpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGhhc05vblNpZGVFZmZlY3RJbXBvcnQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzTm9uU2lkZUVmZmVjdEltcG9ydCkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZUlkOiBERUZBVUxUX01FU1NBR0VfSUQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuIl19
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<!-- prettier-ignore-start -->
|
|
2
|
+
# top-side-effect-imports
|
|
3
|
+
|
|
4
|
+
Side effect imports must be placed before other import statements.
|
|
5
|
+
|
|
6
|
+
## Rule Details
|
|
7
|
+
|
|
8
|
+
### Fail
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import {foo} from 'foo'; import 'reflect-metadata'
|
|
12
|
+
import {bar} from 'bar'; import 'foo.css'
|
|
13
|
+
import {foo} from 'foo'; import {} from 'bar'
|
|
14
|
+
import {foo} from 'foo'; import 'bar'; import * as foo from 'reflect-metadata'
|
|
15
|
+
import {foo} from 'foo'; import {} from 'reflect-metadata'; import * as bar from 'bar'
|
|
16
|
+
import 'bar'; import r from 'reflect-metadata'; import {} from 'foo'
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Pass
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
import 'reflect-metadata'; import {foo} from 'foo'
|
|
23
|
+
import 'foo.css'; import {bar} from 'bar'
|
|
24
|
+
import 'reflect-metadata'; import 'foo.css'
|
|
25
|
+
import 'foo.css'; import 'bar'
|
|
26
|
+
import 'reflect-metadata'; import {foo} from 'foo'; import {bar} from 'bar'
|
|
27
|
+
import 'foo.css'; import {foo} from 'foo'; import {bar} from 'bar'
|
|
28
|
+
import 'reflect-metadata'
|
|
29
|
+
import {foo} from 'foo'
|
|
30
|
+
```
|
|
31
|
+
<!-- prettier-ignore-end -->
|
package/package.json
CHANGED
package/src/common.ts
CHANGED
|
@@ -35,7 +35,7 @@ export function createRule({
|
|
|
35
35
|
},
|
|
36
36
|
type,
|
|
37
37
|
docs: {
|
|
38
|
-
|
|
38
|
+
url: `https://github.com/zanminkian/fenge/blob/main/packages/eslint-plugin-esm/doc/rules/${name}.md`,
|
|
39
39
|
description: message,
|
|
40
40
|
},
|
|
41
41
|
},
|
|
@@ -46,7 +46,7 @@ export function createRule({
|
|
|
46
46
|
|
|
47
47
|
export function getRuleName(importMetaUrl: string) {
|
|
48
48
|
// remove '.js' extension
|
|
49
|
-
return path.
|
|
49
|
+
return path.parse(fileURLToPath(importMetaUrl)).name;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
export type ImportationNode =
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { noRenameImports } from "./rules/no-rename-imports.ts";
|
|
|
11
11
|
import { noSideEffectImports } from "./rules/no-side-effect-imports.ts";
|
|
12
12
|
import { noUselessPathSegments } from "./rules/no-useless-path-segments.ts";
|
|
13
13
|
import { requiredExports } from "./rules/required-exports.ts";
|
|
14
|
+
import { topSideEffectImports } from "./rules/top-side-effect-imports.ts";
|
|
14
15
|
|
|
15
16
|
export const rules = {
|
|
16
17
|
[existingFileImports.name]: existingFileImports.rule,
|
|
@@ -26,4 +27,5 @@ export const rules = {
|
|
|
26
27
|
[noSideEffectImports.name]: noSideEffectImports.rule,
|
|
27
28
|
[noUselessPathSegments.name]: noUselessPathSegments.rule,
|
|
28
29
|
[requiredExports.name]: requiredExports.rule,
|
|
30
|
+
[topSideEffectImports.name]: topSideEffectImports.rule,
|
|
29
31
|
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { test } from "@fenge/dev-utils";
|
|
2
|
+
import { topSideEffectImports } from "./top-side-effect-imports.ts";
|
|
3
|
+
|
|
4
|
+
const valid = [
|
|
5
|
+
"import 'reflect-metadata'; import {foo} from 'foo'",
|
|
6
|
+
"import 'foo.css'; import {bar} from 'bar'",
|
|
7
|
+
"import 'reflect-metadata'; import 'foo.css'",
|
|
8
|
+
"import 'foo.css'; import 'bar'",
|
|
9
|
+
"import 'reflect-metadata'; import {foo} from 'foo'; import {bar} from 'bar'",
|
|
10
|
+
"import 'foo.css'; import {foo} from 'foo'; import {bar} from 'bar'",
|
|
11
|
+
"import 'reflect-metadata'", // Single side-effect import
|
|
12
|
+
"import {foo} from 'foo'", // Single non-side-effect import
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
const invalid = [
|
|
16
|
+
"import {foo} from 'foo'; import 'reflect-metadata'",
|
|
17
|
+
"import {bar} from 'bar'; import 'foo.css'",
|
|
18
|
+
"import {foo} from 'foo'; import {} from 'bar'",
|
|
19
|
+
"import {foo} from 'foo'; import 'bar'; import * as foo from 'reflect-metadata'", // Three import statements
|
|
20
|
+
"import {foo} from 'foo'; import {} from 'reflect-metadata'; import * as bar from 'bar'", // Three import statements
|
|
21
|
+
"import 'bar'; import r from 'reflect-metadata'; import {} from 'foo'", // Three import statements
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
test({ valid, invalid, ...topSideEffectImports });
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ImportDeclaration } from "estree";
|
|
2
|
+
import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.ts";
|
|
3
|
+
|
|
4
|
+
export const topSideEffectImports = createRule({
|
|
5
|
+
name: getRuleName(import.meta.url),
|
|
6
|
+
message: "Side effect imports must be placed before other import statements.",
|
|
7
|
+
create: (context) => {
|
|
8
|
+
let hasNonSideEffectImport = false;
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
ImportDeclaration: (node: ImportDeclaration) => {
|
|
12
|
+
if (node.specifiers.length > 0) {
|
|
13
|
+
hasNonSideEffectImport = true;
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (hasNonSideEffectImport) {
|
|
17
|
+
context.report({ node, messageId: DEFAULT_MESSAGE_ID });
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
});
|