eslint-plugin-esm
Version:
ESLint plugin for linting ESM (import/export syntax)
63 lines • 7.98 kB
JavaScript
import path from "node:path";
import { fileURLToPath } from "node:url";
export const DEFAULT_MESSAGE_ID = "default";
export function createRule({ name, message, schema, fixable, type = "suggestion", create: createFn, }) {
const rule = {
meta: {
...(schema && { schema }),
...(fixable && { fixable }),
messages: {
[DEFAULT_MESSAGE_ID]: message,
},
type,
docs: {
url: `https://github.com/zanminkian/fenge/blob/main/packages/eslint-plugin-esm/doc/rules/${name}.md`,
description: message,
},
},
create: createFn,
};
return { name, rule };
}
export function getRuleName(importMetaUrl) {
// remove '.js' extension
return path.parse(fileURLToPath(importMetaUrl)).name;
}
/**
* Create ESLint RuleListener to check string importation source.
* @param context ESLint RuleContext
* @param check the check logic
* @returns ESLint RuleListener
*/
export function create(context, check) {
const handle = (node) => {
if (!node.source)
return;
if (!("value" in node.source))
return;
if (typeof node.source.value !== "string")
return;
if (check(context.filename, node.source.value, node))
context.report({ node: node.source, messageId: DEFAULT_MESSAGE_ID });
};
return {
ImportDeclaration: handle,
ImportExpression: handle,
ExportAllDeclaration: handle,
ExportNamedDeclaration: handle,
};
}
export function getSourceType(source) {
if (source.startsWith("/") ||
source.startsWith("./") ||
source.startsWith("../") ||
source === "." ||
source === "..") {
return "local";
}
if (source.startsWith("node:")) {
return "builtin";
}
return "module";
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVV6QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUM7QUFFNUMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUN6QixJQUFJLEVBQ0osT0FBTyxFQUNQLE1BQU0sRUFDTixPQUFPLEVBQ1AsSUFBSSxHQUFHLFlBQVksRUFDbkIsTUFBTSxFQUFFLFFBQVEsR0FRakI7SUFDQyxNQUFNLElBQUksR0FBb0I7UUFDNUIsSUFBSSxFQUFFO1lBQ0osR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMzQixRQUFRLEVBQUU7Z0JBQ1IsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU87YUFDOUI7WUFDRCxJQUFJO1lBQ0osSUFBSSxFQUFFO2dCQUNKLEdBQUcsRUFBRSxzRkFBc0YsSUFBSSxLQUFLO2dCQUNwRyxXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNGO1FBQ0QsTUFBTSxFQUFFLFFBQVE7S0FDakIsQ0FBQztJQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsYUFBcUI7SUFDL0MseUJBQXlCO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdkQsQ0FBQztBQVFEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDcEIsT0FBeUIsRUFDekIsS0FBMkU7SUFFM0UsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFxQixFQUFFLEVBQUU7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDdEMsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxNQUFNO1FBQ3pCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsb0JBQW9CLEVBQUUsTUFBTTtRQUM1QixzQkFBc0IsRUFBRSxNQUFNO0tBQy9CLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFjO0lBQzFDLElBQ0UsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUc7UUFDZCxNQUFNLEtBQUssSUFBSSxFQUNmLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE0IH0gZnJvbSBcImpzb24tc2NoZW1hXCI7XG5pbXBvcnQgdHlwZSB7IEdldE5vZGUgfSBmcm9tIFwiLi91dGlscy50c1wiO1xuXG50eXBlIEV4cG9ydEFsbERlY2xhcmF0aW9uID0gR2V0Tm9kZTxcIkV4cG9ydEFsbERlY2xhcmF0aW9uXCI+O1xudHlwZSBFeHBvcnROYW1lZERlY2xhcmF0aW9uID0gR2V0Tm9kZTxcIkV4cG9ydE5hbWVkRGVjbGFyYXRpb25cIj47XG50eXBlIEltcG9ydERlY2xhcmF0aW9uID0gR2V0Tm9kZTxcIkltcG9ydERlY2xhcmF0aW9uXCI+O1xudHlwZSBJbXBvcnRFeHByZXNzaW9uID0gR2V0Tm9kZTxcIkltcG9ydEV4cHJlc3Npb25cIj47XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01FU1NBR0VfSUQgPSBcImRlZmF1bHRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJ1bGUoe1xuICBuYW1lLFxuICBtZXNzYWdlLFxuICBzY2hlbWEsXG4gIGZpeGFibGUsXG4gIHR5cGUgPSBcInN1Z2dlc3Rpb25cIixcbiAgY3JlYXRlOiBjcmVhdGVGbixcbn06IHtcbiAgbmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNjaGVtYT86IEpTT05TY2hlbWE0W107XG4gIGZpeGFibGU/OiBSdWxlLlJ1bGVNZXRhRGF0YVtcImZpeGFibGVcIl07XG4gIHR5cGU/OiBSdWxlLlJ1bGVNZXRhRGF0YVtcInR5cGVcIl07XG4gIGNyZWF0ZTogKGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpID0+IFJ1bGUuUnVsZUxpc3RlbmVyO1xufSk6IHsgbmFtZTogc3RyaW5nOyBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgfSB7XG4gIGNvbnN0IHJ1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgICBtZXRhOiB7XG4gICAgICAuLi4oc2NoZW1hICYmIHsgc2NoZW1hIH0pLFxuICAgICAgLi4uKGZpeGFibGUgJiYgeyBmaXhhYmxlIH0pLFxuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW0RFRkFVTFRfTUVTU0FHRV9JRF06IG1lc3NhZ2UsXG4gICAgICB9LFxuICAgICAgdHlwZSxcbiAgICAgIGRvY3M6IHtcbiAgICAgICAgdXJsOiBgaHR0cHM6Ly9naXRodWIuY29tL3phbm1pbmtpYW4vZmVuZ2UvYmxvYi9tYWluL3BhY2thZ2VzL2VzbGludC1wbHVnaW4tZXNtL2RvYy9ydWxlcy8ke25hbWV9Lm1kYCxcbiAgICAgICAgZGVzY3JpcHRpb246IG1lc3NhZ2UsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3JlYXRlOiBjcmVhdGVGbixcbiAgfTtcbiAgcmV0dXJuIHsgbmFtZSwgcnVsZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UnVsZU5hbWUoaW1wb3J0TWV0YVVybDogc3RyaW5nKSB7XG4gIC8vIHJlbW92ZSAnLmpzJyBleHRlbnNpb25cbiAgcmV0dXJuIHBhdGgucGFyc2UoZmlsZVVSTFRvUGF0aChpbXBvcnRNZXRhVXJsKSkubmFtZTtcbn1cblxuZXhwb3J0IHR5cGUgSW1wb3J0YXRpb25Ob2RlID1cbiAgfCBJbXBvcnREZWNsYXJhdGlvblxuICB8IEltcG9ydEV4cHJlc3Npb25cbiAgfCBFeHBvcnRBbGxEZWNsYXJhdGlvblxuICB8IEV4cG9ydE5hbWVkRGVjbGFyYXRpb247XG5cbi8qKlxuICogQ3JlYXRlIEVTTGludCBSdWxlTGlzdGVuZXIgdG8gY2hlY2sgc3RyaW5nIGltcG9ydGF0aW9uIHNvdXJjZS5cbiAqIEBwYXJhbSBjb250ZXh0IEVTTGludCBSdWxlQ29udGV4dFxuICogQHBhcmFtIGNoZWNrIHRoZSBjaGVjayBsb2dpY1xuICogQHJldHVybnMgRVNMaW50IFJ1bGVMaXN0ZW5lclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0LFxuICBjaGVjazogKGZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nLCBub2RlOiBJbXBvcnRhdGlvbk5vZGUpID0+IGJvb2xlYW4sXG4pOiBSdWxlLlJ1bGVMaXN0ZW5lciB7XG4gIGNvbnN0IGhhbmRsZSA9IChub2RlOiBJbXBvcnRhdGlvbk5vZGUpID0+IHtcbiAgICBpZiAoIW5vZGUuc291cmNlKSByZXR1cm47XG4gICAgaWYgKCEoXCJ2YWx1ZVwiIGluIG5vZGUuc291cmNlKSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygbm9kZS5zb3VyY2UudmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybjtcbiAgICBpZiAoY2hlY2soY29udGV4dC5maWxlbmFtZSwgbm9kZS5zb3VyY2UudmFsdWUsIG5vZGUpKVxuICAgICAgY29udGV4dC5yZXBvcnQoeyBub2RlOiBub2RlLnNvdXJjZSwgbWVzc2FnZUlkOiBERUZBVUxUX01FU1NBR0VfSUQgfSk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgSW1wb3J0RGVjbGFyYXRpb246IGhhbmRsZSxcbiAgICBJbXBvcnRFeHByZXNzaW9uOiBoYW5kbGUsXG4gICAgRXhwb3J0QWxsRGVjbGFyYXRpb246IGhhbmRsZSxcbiAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uOiBoYW5kbGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKHNvdXJjZTogc3RyaW5nKSB7XG4gIGlmIChcbiAgICBzb3VyY2Uuc3RhcnRzV2l0aChcIi9cIikgfHxcbiAgICBzb3VyY2Uuc3RhcnRzV2l0aChcIi4vXCIpIHx8XG4gICAgc291cmNlLnN0YXJ0c1dpdGgoXCIuLi9cIikgfHxcbiAgICBzb3VyY2UgPT09IFwiLlwiIHx8XG4gICAgc291cmNlID09PSBcIi4uXCJcbiAgKSB7XG4gICAgcmV0dXJuIFwibG9jYWxcIjtcbiAgfVxuICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoXCJub2RlOlwiKSkge1xuICAgIHJldHVybiBcImJ1aWx0aW5cIjtcbiAgfVxuICByZXR1cm4gXCJtb2R1bGVcIjtcbn1cbiJdfQ==