UNPKG

eslint-plugin-esm

Version:
51 lines 6.72 kB
import childProcess from "node:child_process"; import path from "node:path"; import process from "node:process"; import { isNativeError } from "node:util/types"; import { create, createRule, getRuleName, getSourceType } from "../common.js"; import { memoize } from "../utils.js"; export const noGitIgnoredImports = createRule({ name: getRuleName(import.meta.url), message: "Disallow to import module from a git-ignored path.", create: (context) => create(context, checkIgnored), }); function checkIgnored(filename, source) { // from node_modules if (getSourceType(source) !== "local") { return false; } // out side of project root if (source.startsWith("/") && !source.startsWith(process.cwd())) { return true; } // This file of absolutePath may be a symbolic link const absolutePath = path.resolve(path.dirname(filename), source); if (!absolutePath.startsWith("/")) { throw new Error(`ESLint plugin internal error. Absolute path incorrect: ${absolutePath}.`); } return isIgnored(absolutePath); } const isIgnored = memoize((filePath) => { try { return (childProcess // Adding `stdio: 'pipe'` to depress unexpected error messages in console. // For example, `git check-ignore /absolute/path/to/file` (even wrapped with try-catch) will print something unnecessary. .execSync(`git check-ignore ${filePath}`, { encoding: "utf8", stdio: "pipe", }) .trim() === filePath); } catch (e) { if (isNativeError(e) && "stdout" in e && e.stdout === "" && "stderr" in e && e.stderr === "") { return false; } // We cannot throw an error here. So we have to return true to report the filePath is bad. return true; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tZ2l0LWlnbm9yZWQtaW1wb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9uby1naXQtaWdub3JlZC1pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUM7SUFDNUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQyxPQUFPLEVBQUUsb0RBQW9EO0lBQzdELE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7Q0FDbkQsQ0FBQyxDQUFDO0FBRUgsU0FBUyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxNQUFjO0lBQ3BELG9CQUFvQjtJQUNwQixJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCwyQkFBMkI7SUFDM0IsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELG1EQUFtRDtJQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRCxZQUFZLEdBQUcsQ0FDMUUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxFQUFFO0lBQzdDLElBQUksQ0FBQztRQUNILE9BQU8sQ0FDTCxZQUFZO1lBQ1YsMEVBQTBFO1lBQzFFLHlIQUF5SDthQUN4SCxRQUFRLENBQUMsb0JBQW9CLFFBQVEsRUFBRSxFQUFFO1lBQ3hDLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLEtBQUssRUFBRSxNQUFNO1NBQ2QsQ0FBQzthQUNELElBQUksRUFBRSxLQUFLLFFBQVEsQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ1gsSUFDRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLFFBQVEsSUFBSSxDQUFDO1lBQ2IsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFO1lBQ2YsUUFBUSxJQUFJLENBQUM7WUFDYixDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFDZixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsMEZBQTBGO1FBQzFGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgcHJvY2VzcyBmcm9tIFwibm9kZTpwcm9jZXNzXCI7XG5pbXBvcnQgeyBpc05hdGl2ZUVycm9yIH0gZnJvbSBcIm5vZGU6dXRpbC90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlLCBjcmVhdGVSdWxlLCBnZXRSdWxlTmFtZSwgZ2V0U291cmNlVHlwZSB9IGZyb20gXCIuLi9jb21tb24udHNcIjtcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiLi4vdXRpbHMudHNcIjtcblxuZXhwb3J0IGNvbnN0IG5vR2l0SWdub3JlZEltcG9ydHMgPSBjcmVhdGVSdWxlKHtcbiAgbmFtZTogZ2V0UnVsZU5hbWUoaW1wb3J0Lm1ldGEudXJsKSxcbiAgbWVzc2FnZTogXCJEaXNhbGxvdyB0byBpbXBvcnQgbW9kdWxlIGZyb20gYSBnaXQtaWdub3JlZCBwYXRoLlwiLFxuICBjcmVhdGU6IChjb250ZXh0KSA9PiBjcmVhdGUoY29udGV4dCwgY2hlY2tJZ25vcmVkKSxcbn0pO1xuXG5mdW5jdGlvbiBjaGVja0lnbm9yZWQoZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpIHtcbiAgLy8gZnJvbSBub2RlX21vZHVsZXNcbiAgaWYgKGdldFNvdXJjZVR5cGUoc291cmNlKSAhPT0gXCJsb2NhbFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIG91dCBzaWRlIG9mIHByb2plY3Qgcm9vdFxuICBpZiAoc291cmNlLnN0YXJ0c1dpdGgoXCIvXCIpICYmICFzb3VyY2Uuc3RhcnRzV2l0aChwcm9jZXNzLmN3ZCgpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFRoaXMgZmlsZSBvZiBhYnNvbHV0ZVBhdGggbWF5IGJlIGEgc3ltYm9saWMgbGlua1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgc291cmNlKTtcbiAgaWYgKCFhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRVNMaW50IHBsdWdpbiBpbnRlcm5hbCBlcnJvci4gQWJzb2x1dGUgcGF0aCBpbmNvcnJlY3Q6ICR7YWJzb2x1dGVQYXRofS5gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlzSWdub3JlZChhYnNvbHV0ZVBhdGgpO1xufVxuXG5jb25zdCBpc0lnbm9yZWQgPSBtZW1vaXplKChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAvLyBBZGRpbmcgYHN0ZGlvOiAncGlwZSdgIHRvIGRlcHJlc3MgdW5leHBlY3RlZCBlcnJvciBtZXNzYWdlcyBpbiBjb25zb2xlLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYGdpdCBjaGVjay1pZ25vcmUgL2Fic29sdXRlL3BhdGgvdG8vZmlsZWAgKGV2ZW4gd3JhcHBlZCB3aXRoIHRyeS1jYXRjaCkgd2lsbCBwcmludCBzb21ldGhpbmcgdW5uZWNlc3NhcnkuXG4gICAgICAgIC5leGVjU3luYyhgZ2l0IGNoZWNrLWlnbm9yZSAke2ZpbGVQYXRofWAsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgc3RkaW86IFwicGlwZVwiLFxuICAgICAgICB9KVxuICAgICAgICAudHJpbSgpID09PSBmaWxlUGF0aFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXG4gICAgICBpc05hdGl2ZUVycm9yKGUpICYmXG4gICAgICBcInN0ZG91dFwiIGluIGUgJiZcbiAgICAgIGUuc3Rkb3V0ID09PSBcIlwiICYmXG4gICAgICBcInN0ZGVyclwiIGluIGUgJiZcbiAgICAgIGUuc3RkZXJyID09PSBcIlwiXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCB0aHJvdyBhbiBlcnJvciBoZXJlLiBTbyB3ZSBoYXZlIHRvIHJldHVybiB0cnVlIHRvIHJlcG9ydCB0aGUgZmlsZVBhdGggaXMgYmFkLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59KTtcbiJdfQ==