no-hide-core-modules.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * @author Toru Nagashima
  3. * @copyright 2016 Toru Nagashima. All rights reserved.
  4. * See LICENSE file in root directory for full license.
  5. *
  6. * @deprecated since v4.2.0
  7. * This rule was based on an invalid assumption.
  8. * No meaning.
  9. */
  10. "use strict"
  11. //------------------------------------------------------------------------------
  12. // Requirements
  13. //------------------------------------------------------------------------------
  14. const path = require("path")
  15. const resolve = require("resolve")
  16. const getDocsUrl = require("../util/get-docs-url")
  17. const getPackageJson = require("../util/get-package-json")
  18. const getRequireTargets = require("../util/get-require-targets")
  19. const getImportExportTargets = require("../util/get-import-export-targets")
  20. //------------------------------------------------------------------------------
  21. // Helpers
  22. //------------------------------------------------------------------------------
  23. const CORE_MODULES = new Set([
  24. "assert", "buffer", "child_process", "cluster", "console", "constants",
  25. "crypto", "dgram", "dns", /* "domain", */ "events", "fs", "http", "https",
  26. "module", "net", "os", "path", /* "punycode", */ "querystring", "readline",
  27. "repl", "stream", "string_decoder", "timers", "tls", "tty", "url", "util",
  28. "vm", "zlib",
  29. ])
  30. const BACK_SLASH = /\\/g
  31. /**
  32. * Creates AST event handlers for no-hide-core-modules.
  33. *
  34. * @param {RuleContext} context - The rule context.
  35. * @returns {object} AST event handlers.
  36. */
  37. function create(context) {
  38. if (context.getFilename() === "<input>") {
  39. return {}
  40. }
  41. const filePath = path.resolve(context.getFilename())
  42. const dirPath = path.dirname(filePath)
  43. const packageJson = getPackageJson(filePath)
  44. const deps = new Set([].concat(
  45. Object.keys((packageJson && packageJson.dependencies) || {}),
  46. Object.keys((packageJson && packageJson.devDependencies) || {})
  47. ))
  48. const options = context.options[0] || {}
  49. const allow = options.allow || []
  50. const ignoreDirectDependencies = Boolean(options.ignoreDirectDependencies)
  51. const ignoreIndirectDependencies = Boolean(options.ignoreIndirectDependencies)
  52. return {
  53. "Program:exit"(node) {
  54. const targets =
  55. [].concat(
  56. getRequireTargets(context, true),
  57. getImportExportTargets(context, node, true)
  58. ).filter(t => CORE_MODULES.has(t.moduleName))
  59. for (const target of targets) {
  60. const name = target.moduleName
  61. const allowed =
  62. allow.indexOf(name) !== -1 ||
  63. (ignoreDirectDependencies && deps.has(name)) ||
  64. (ignoreIndirectDependencies && !deps.has(name))
  65. if (allowed) {
  66. continue
  67. }
  68. const resolved = resolve.sync(name, { basedir: dirPath })
  69. const isCore = resolved === name
  70. if (isCore) {
  71. continue
  72. }
  73. context.report({
  74. node: target.node,
  75. loc: target.node.loc,
  76. message: "Unexpected import of third-party module '{{name}}'.",
  77. data: {
  78. name: path
  79. .relative(dirPath, resolved)
  80. .replace(BACK_SLASH, "/"),
  81. },
  82. })
  83. }
  84. },
  85. }
  86. }
  87. //------------------------------------------------------------------------------
  88. // Rule Definition
  89. //------------------------------------------------------------------------------
  90. module.exports = {
  91. create,
  92. meta: {
  93. docs: {
  94. description: "disallow third-party modules which are hiding core modules",
  95. category: "Possible Errors",
  96. recommended: false,
  97. url: getDocsUrl("no-hide-core-modules.md"),
  98. },
  99. deprecated: true,
  100. fixable: false,
  101. schema: [
  102. {
  103. type: "object",
  104. properties: {
  105. allow: {
  106. type: "array",
  107. items: { enum: Array.from(CORE_MODULES) },
  108. additionalItems: false,
  109. uniqueItems: true,
  110. },
  111. ignoreDirectDependencies: { type: "boolean" },
  112. ignoreIndirectDependencies: { type: "boolean" },
  113. },
  114. additionalProperties: false,
  115. },
  116. ],
  117. },
  118. }