no-hide-core-modules.js 4.4 KB

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