blob: 1efee4ca664e92541f1b62e908623440d1b456e9 [file] [log] [blame]
/**
* @author Toru Nagashima
* @copyright 2016 Toru Nagashima. All rights reserved.
* 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"
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
const path = require("path")
const resolve = require("resolve")
const getPackageJson = require("../util/get-package-json")
const getRequireTargets = require("../util/get-require-targets")
const getImportExportTargets = require("../util/get-import-export-targets")
//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------
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 = /\\/g
/**
* Creates AST event handlers for no-hide-core-modules.
*
* @param {RuleContext} context - The rule context.
* @returns {object} AST event handlers.
*/
function 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)
return {
"Program:exit"(node) {
const targets =
[].concat(
getRequireTargets(context, true),
getImportExportTargets(context, node, true)
).filter(t => CORE_MODULES.has(t.moduleName))
for (const target of targets) {
const name = target.moduleName
const allowed =
allow.indexOf(name) !== -1 ||
(ignoreDirectDependencies && deps.has(name)) ||
(ignoreIndirectDependencies && !deps.has(name))
if (allowed) {
continue
}
const resolved = resolve.sync(name, {basedir: dirPath})
const isCore = resolved === name
if (isCore) {
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, "/"),
},
})
}
},
}
}
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = {
create,
meta: {
docs: {
description: "disallow third-party modules which are hiding core modules",
category: "Possible Errors",
recommended: false,
},
deprecated: true,
fixable: false,
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,
},
],
},
}