eslint-plugin-esm
Version:
ESLint plugin for linting ESM (import/export syntax)
31 lines • 4.49 kB
JavaScript
import { createRule, DEFAULT_MESSAGE_ID, getRuleName } from "../common.js";
const ignores = [
"^reflect-metadata$",
// https://github.com/vitejs/vite/blob/main/packages/vite/client.d.ts
// "(?<!\\.module)\\.css$",
// "(?<!\\.module)\\.scss$",
// "(?<!\\.module)\\.sass$",
// "(?<!\\.module)\\.less$",
// "(?<!\\.module)\\.styl$",
// "(?<!\\.module)\\.stylus$",
// "(?<!\\.module)\\.pcss$",
// "(?<!\\.module)\\.sss$",
];
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
export const noSideEffectImports = createRule({
name: getRuleName(import.meta.url),
message: "Side effect import is often used for polyfills and css. It's unsafe to use it.",
create: (context) => {
const ignoreExps = ignores.map((ignore) => new RegExp(ignore));
return {
"ImportDeclaration[specifiers.length=0]": (node) => {
if (ignoreExps.some((exp) => typeof node.source.value === "string" &&
exp.test(node.source.value))) {
return;
}
context.report({ node, messageId: DEFAULT_MESSAGE_ID });
},
};
},
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tc2lkZS1lZmZlY3QtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1zaWRlLWVmZmVjdC1pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSzNFLE1BQU0sT0FBTyxHQUFHO0lBQ2Qsb0JBQW9CO0lBQ3BCLHFFQUFxRTtJQUNyRSwyQkFBMkI7SUFDM0IsNEJBQTRCO0lBQzVCLDRCQUE0QjtJQUM1Qiw0QkFBNEI7SUFDNUIsNEJBQTRCO0lBQzVCLDhCQUE4QjtJQUM5Qiw0QkFBNEI7SUFDNUIsMkJBQTJCO0NBQzVCLENBQUM7QUFFRixzRkFBc0Y7QUFDdEYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0lBQzVDLElBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEMsT0FBTyxFQUNMLGdGQUFnRjtJQUNsRixNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNsQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU87WUFDTCx3Q0FBd0MsRUFBRSxDQUFDLElBQXVCLEVBQUUsRUFBRTtnQkFDcEUsSUFDRSxVQUFVLENBQUMsSUFBSSxDQUNiLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7b0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDOUIsRUFDRCxDQUFDO29CQUNELE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUnVsZSwgREVGQVVMVF9NRVNTQUdFX0lELCBnZXRSdWxlTmFtZSB9IGZyb20gXCIuLi9jb21tb24udHNcIjtcbmltcG9ydCB0eXBlIHsgR2V0Tm9kZSB9IGZyb20gXCIuLi91dGlscy50c1wiO1xuXG50eXBlIEltcG9ydERlY2xhcmF0aW9uID0gR2V0Tm9kZTxcIkltcG9ydERlY2xhcmF0aW9uXCI+O1xuXG5jb25zdCBpZ25vcmVzID0gW1xuICBcIl5yZWZsZWN0LW1ldGFkYXRhJFwiLFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUvYmxvYi9tYWluL3BhY2thZ2VzL3ZpdGUvY2xpZW50LmQudHNcbiAgLy8gXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5jc3MkXCIsXG4gIC8vIFwiKD88IVxcXFwubW9kdWxlKVxcXFwuc2NzcyRcIixcbiAgLy8gXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5zYXNzJFwiLFxuICAvLyBcIig/PCFcXFxcLm1vZHVsZSlcXFxcLmxlc3MkXCIsXG4gIC8vIFwiKD88IVxcXFwubW9kdWxlKVxcXFwuc3R5bCRcIixcbiAgLy8gXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5zdHlsdXMkXCIsXG4gIC8vIFwiKD88IVxcXFwubW9kdWxlKVxcXFwucGNzcyRcIixcbiAgLy8gXCIoPzwhXFxcXC5tb2R1bGUpXFxcXC5zc3MkXCIsXG5dO1xuXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9TdGF0ZW1lbnRzL2ltcG9ydFxuZXhwb3J0IGNvbnN0IG5vU2lkZUVmZmVjdEltcG9ydHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTpcbiAgICBcIlNpZGUgZWZmZWN0IGltcG9ydCBpcyBvZnRlbiB1c2VkIGZvciBwb2x5ZmlsbHMgYW5kIGNzcy4gSXQncyB1bnNhZmUgdG8gdXNlIGl0LlwiLFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiB7XG4gICAgY29uc3QgaWdub3JlRXhwcyA9IGlnbm9yZXMubWFwKChpZ25vcmUpID0+IG5ldyBSZWdFeHAoaWdub3JlKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiSW1wb3J0RGVjbGFyYXRpb25bc3BlY2lmaWVycy5sZW5ndGg9MF1cIjogKG5vZGU6IEltcG9ydERlY2xhcmF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpZ25vcmVFeHBzLnNvbWUoXG4gICAgICAgICAgICAoZXhwKSA9PlxuICAgICAgICAgICAgICB0eXBlb2Ygbm9kZS5zb3VyY2UudmFsdWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgZXhwLnRlc3Qobm9kZS5zb3VyY2UudmFsdWUpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZSwgbWVzc2FnZUlkOiBERUZBVUxUX01FU1NBR0VfSUQgfSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59KTtcbiJdfQ==