eslint-plugin-esm
Version:
ESLint plugin for linting ESM (import/export syntax)
63 lines • 7.76 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQVV6QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUM7QUFFNUMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUN6QixJQUFJLEVBQ0osT0FBTyxFQUNQLE1BQU0sRUFDTixPQUFPLEVBQ1AsSUFBSSxHQUFHLFlBQVksRUFDbkIsTUFBTSxFQUFFLFFBQVEsR0FRakI7SUFDQyxNQUFNLElBQUksR0FBb0I7UUFDNUIsSUFBSSxFQUFFO1lBQ0osR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMzQixRQUFRLEVBQUU7Z0JBQ1IsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU87YUFDOUI7WUFDRCxJQUFJO1lBQ0osSUFBSSxFQUFFO2dCQUNKLEdBQUcsRUFBRSxzRkFBc0YsSUFBSSxLQUFLO2dCQUNwRyxXQUFXLEVBQUUsT0FBTzthQUNyQjtTQUNGO1FBQ0QsTUFBTSxFQUFFLFFBQVE7S0FDakIsQ0FBQztJQUNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsYUFBcUI7SUFDL0MseUJBQXlCO0lBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDdkQsQ0FBQztBQVFEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDcEIsT0FBeUIsRUFDekIsS0FBMkU7SUFFM0UsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFxQixFQUFFLEVBQUU7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDdEMsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxpQkFBaUIsRUFBRSxNQUFNO1FBQ3pCLGdCQUFnQixFQUFFLE1BQU07UUFDeEIsb0JBQW9CLEVBQUUsTUFBTTtRQUM1QixzQkFBc0IsRUFBRSxNQUFNO0tBQy9CLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUFjO0lBQzFDLElBQ0UsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDdEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDdkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUc7UUFDZCxNQUFNLEtBQUssSUFBSSxFQUNmLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgdHlwZSB7IFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEV4cG9ydEFsbERlY2xhcmF0aW9uLFxuICBFeHBvcnROYW1lZERlY2xhcmF0aW9uLFxuICBJbXBvcnREZWNsYXJhdGlvbixcbiAgSW1wb3J0RXhwcmVzc2lvbixcbn0gZnJvbSBcImVzdHJlZVwiO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNCB9IGZyb20gXCJqc29uLXNjaGVtYVwiO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NRVNTQUdFX0lEID0gXCJkZWZhdWx0XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdWxlKHtcbiAgbmFtZSxcbiAgbWVzc2FnZSxcbiAgc2NoZW1hLFxuICBmaXhhYmxlLFxuICB0eXBlID0gXCJzdWdnZXN0aW9uXCIsXG4gIGNyZWF0ZTogY3JlYXRlRm4sXG59OiB7XG4gIG5hbWU6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzY2hlbWE/OiBKU09OU2NoZW1hNFtdO1xuICBmaXhhYmxlPzogUnVsZS5SdWxlTWV0YURhdGFbXCJmaXhhYmxlXCJdO1xuICB0eXBlPzogUnVsZS5SdWxlTWV0YURhdGFbXCJ0eXBlXCJdO1xuICBjcmVhdGU6IChjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KSA9PiBSdWxlLlJ1bGVMaXN0ZW5lcjtcbn0pOiB7IG5hbWU6IHN0cmluZzsgcnVsZTogUnVsZS5SdWxlTW9kdWxlIH0ge1xuICBjb25zdCBydWxlOiBSdWxlLlJ1bGVNb2R1bGUgPSB7XG4gICAgbWV0YToge1xuICAgICAgLi4uKHNjaGVtYSAmJiB7IHNjaGVtYSB9KSxcbiAgICAgIC4uLihmaXhhYmxlICYmIHsgZml4YWJsZSB9KSxcbiAgICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFtERUZBVUxUX01FU1NBR0VfSURdOiBtZXNzYWdlLFxuICAgICAgfSxcbiAgICAgIHR5cGUsXG4gICAgICBkb2NzOiB7XG4gICAgICAgIHVybDogYGh0dHBzOi8vZ2l0aHViLmNvbS96YW5taW5raWFuL2ZlbmdlL2Jsb2IvbWFpbi9wYWNrYWdlcy9lc2xpbnQtcGx1Z2luLWVzbS9kb2MvcnVsZXMvJHtuYW1lfS5tZGAsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBtZXNzYWdlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNyZWF0ZTogY3JlYXRlRm4sXG4gIH07XG4gIHJldHVybiB7IG5hbWUsIHJ1bGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bGVOYW1lKGltcG9ydE1ldGFVcmw6IHN0cmluZykge1xuICAvLyByZW1vdmUgJy5qcycgZXh0ZW5zaW9uXG4gIHJldHVybiBwYXRoLnBhcnNlKGZpbGVVUkxUb1BhdGgoaW1wb3J0TWV0YVVybCkpLm5hbWU7XG59XG5cbmV4cG9ydCB0eXBlIEltcG9ydGF0aW9uTm9kZSA9XG4gIHwgSW1wb3J0RGVjbGFyYXRpb25cbiAgfCBJbXBvcnRFeHByZXNzaW9uXG4gIHwgRXhwb3J0QWxsRGVjbGFyYXRpb25cbiAgfCBFeHBvcnROYW1lZERlY2xhcmF0aW9uO1xuXG4vKipcbiAqIENyZWF0ZSBFU0xpbnQgUnVsZUxpc3RlbmVyIHRvIGNoZWNrIHN0cmluZyBpbXBvcnRhdGlvbiBzb3VyY2UuXG4gKiBAcGFyYW0gY29udGV4dCBFU0xpbnQgUnVsZUNvbnRleHRcbiAqIEBwYXJhbSBjaGVjayB0aGUgY2hlY2sgbG9naWNcbiAqIEByZXR1cm5zIEVTTGludCBSdWxlTGlzdGVuZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCxcbiAgY2hlY2s6IChmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZywgbm9kZTogSW1wb3J0YXRpb25Ob2RlKSA9PiBib29sZWFuLFxuKTogUnVsZS5SdWxlTGlzdGVuZXIge1xuICBjb25zdCBoYW5kbGUgPSAobm9kZTogSW1wb3J0YXRpb25Ob2RlKSA9PiB7XG4gICAgaWYgKCFub2RlLnNvdXJjZSkgcmV0dXJuO1xuICAgIGlmICghKFwidmFsdWVcIiBpbiBub2RlLnNvdXJjZSkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIG5vZGUuc291cmNlLnZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG4gICAgaWYgKGNoZWNrKGNvbnRleHQuZmlsZW5hbWUsIG5vZGUuc291cmNlLnZhbHVlLCBub2RlKSlcbiAgICAgIGNvbnRleHQucmVwb3J0KHsgbm9kZTogbm9kZS5zb3VyY2UsIG1lc3NhZ2VJZDogREVGQVVMVF9NRVNTQUdFX0lEIH0pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIEltcG9ydERlY2xhcmF0aW9uOiBoYW5kbGUsXG4gICAgSW1wb3J0RXhwcmVzc2lvbjogaGFuZGxlLFxuICAgIEV4cG9ydEFsbERlY2xhcmF0aW9uOiBoYW5kbGUsXG4gICAgRXhwb3J0TmFtZWREZWNsYXJhdGlvbjogaGFuZGxlLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlVHlwZShzb3VyY2U6IHN0cmluZykge1xuICBpZiAoXG4gICAgc291cmNlLnN0YXJ0c1dpdGgoXCIvXCIpIHx8XG4gICAgc291cmNlLnN0YXJ0c1dpdGgoXCIuL1wiKSB8fFxuICAgIHNvdXJjZS5zdGFydHNXaXRoKFwiLi4vXCIpIHx8XG4gICAgc291cmNlID09PSBcIi5cIiB8fFxuICAgIHNvdXJjZSA9PT0gXCIuLlwiXG4gICkge1xuICAgIHJldHVybiBcImxvY2FsXCI7XG4gIH1cbiAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKFwibm9kZTpcIikpIHtcbiAgICByZXR1cm4gXCJidWlsdGluXCI7XG4gIH1cbiAgcmV0dXJuIFwibW9kdWxlXCI7XG59XG4iXX0=