| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | /** * @author Toru Nagashima * See LICENSE file in root directory for full license. * * @deprecated since v4.2.0 * This rule was based on an invalid assumption. * No meaning. */"use strict"const path = require("path")const resolve = require("resolve")const getPackageJson = require("../util/get-package-json")const mergeVisitorsInPlace = require("../util/merge-visitors-in-place")const visitImport = require("../util/visit-import")const visitRequire = require("../util/visit-require")const CORE_MODULES = new Set([    "assert",    "buffer",    "child_process",    "cluster",    "console",    "constants",    "crypto",    "dgram",    "dns",    /* "domain", */ "events",    "fs",    "http",    "https",    "module",    "net",    "os",    "path",    /* "punycode", */ "querystring",    "readline",    "repl",    "stream",    "string_decoder",    "timers",    "tls",    "tty",    "url",    "util",    "vm",    "zlib",])const BACK_SLASH = /\\/gumodule.exports = {    meta: {        docs: {            description:                "disallow third-party modules which are hiding core modules",            category: "Possible Errors",            recommended: false,            url:                "https://github.com/mysticatea/eslint-plugin-node/blob/v11.1.0/docs/rules/no-hide-core-modules.md",        },        type: "problem",        deprecated: true,        fixable: null,        schema: [            {                type: "object",                properties: {                    allow: {                        type: "array",                        items: { enum: Array.from(CORE_MODULES) },                        additionalItems: false,                        uniqueItems: true,                    },                    ignoreDirectDependencies: { type: "boolean" },                    ignoreIndirectDependencies: { type: "boolean" },                },                additionalProperties: false,            },        ],    },    create(context) {        if (context.getFilename() === "<input>") {            return {}        }        const filePath = path.resolve(context.getFilename())        const dirPath = path.dirname(filePath)        const packageJson = getPackageJson(filePath)        const deps = new Set(            [].concat(                Object.keys((packageJson && packageJson.dependencies) || {}),                Object.keys((packageJson && packageJson.devDependencies) || {})            )        )        const options = context.options[0] || {}        const allow = options.allow || []        const ignoreDirectDependencies = Boolean(            options.ignoreDirectDependencies        )        const ignoreIndirectDependencies = Boolean(            options.ignoreIndirectDependencies        )        const targets = []        return [            visitImport(context, { includeCore: true }, importTargets =>                targets.push(...importTargets)            ),            visitRequire(context, { includeCore: true }, requireTargets =>                targets.push(...requireTargets)            ),            {                "Program:exit"() {                    for (const target of targets.filter(                        t =>                            CORE_MODULES.has(t.moduleName) &&                            t.moduleName === t.name                    )) {                        const name = target.moduleName                        const allowed =                            allow.indexOf(name) !== -1 ||                            (ignoreDirectDependencies && deps.has(name)) ||                            (ignoreIndirectDependencies && !deps.has(name))                        if (allowed) {                            continue                        }                        let resolved = ""                        try {                            resolved = resolve.sync(`${name}/`, {                                basedir: dirPath,                            })                        } catch (_error) {                            continue                        }                        context.report({                            node: target.node,                            loc: target.node.loc,                            message:                                "Unexpected import of third-party module '{{name}}'.",                            data: {                                name: path                                    .relative(dirPath, resolved)                                    .replace(BACK_SLASH, "/"),                            },                        })                    }                },            },        ].reduce(            (mergedVisitor, thisVisitor) =>                mergeVisitorsInPlace(mergedVisitor, thisVisitor),            {}        )    },}
 |