Skip to content

Commit

Permalink
🎨 refactor how to collect 'require/import'
Browse files Browse the repository at this point in the history
  • Loading branch information
mysticatea committed Sep 5, 2019
1 parent b91b48d commit df979d3
Show file tree
Hide file tree
Showing 13 changed files with 204 additions and 198 deletions.
11 changes: 4 additions & 7 deletions lib/rules/file-extension-in-import.js
Expand Up @@ -6,8 +6,8 @@

const path = require("path")
const fs = require("fs")
const getImportExportTargets = require("../util/get-import-export-targets")
const getTryExtensions = require("../util/get-try-extensions")
const visitImport = require("../util/visit-import")
const packageNamePattern = /^(?:@[^/\\]+[/\\])?[^/\\]+$/u
const corePackageOverridePattern = /^(?:assert|async_hooks|buffer|child_process|cluster|console|constants|crypto|dgram|dns|domain|events|fs|http|http2|https|inspector|module|net|os|path|perf_hooks|process|punycode|querystring|readline|repl|stream|string_decoder|sys|timers|tls|trace_events|tty|url|util|v8|vm|worker_threads|zlib)[/\\]$/u

Expand Down Expand Up @@ -122,11 +122,8 @@ module.exports = {
}
}

return {
"Program:exit"(node) {
const opts = { optionIndex: 1 }
getImportExportTargets(context, node, opts).forEach(verify)
},
}
return visitImport(context, { optionIndex: 1 }, targets => {
targets.forEach(verify)
})
},
}
14 changes: 4 additions & 10 deletions lib/rules/no-extraneous-import.js
Expand Up @@ -7,9 +7,9 @@
const checkExtraneous = require("../util/check-extraneous")
const getAllowModules = require("../util/get-allow-modules")
const getConvertPath = require("../util/get-convert-path")
const getImportTargets = require("../util/get-import-export-targets")
const getResolvePaths = require("../util/get-resolve-paths")
const getTryExtensions = require("../util/get-try-extensions")
const visitImport = require("../util/visit-import")

module.exports = {
meta: {
Expand Down Expand Up @@ -42,14 +42,8 @@ module.exports = {
return {}
}

return {
"Program:exit"(node) {
checkExtraneous(
context,
filePath,
getImportTargets(context, node, false)
)
},
}
return visitImport(context, {}, targets => {
checkExtraneous(context, filePath, targets)
})
},
}
14 changes: 4 additions & 10 deletions lib/rules/no-extraneous-require.js
Expand Up @@ -7,9 +7,9 @@
const checkExtraneous = require("../util/check-extraneous")
const getAllowModules = require("../util/get-allow-modules")
const getConvertPath = require("../util/get-convert-path")
const getRequireTargets = require("../util/get-require-targets")
const getResolvePaths = require("../util/get-resolve-paths")
const getTryExtensions = require("../util/get-try-extensions")
const visitRequire = require("../util/visit-require")

module.exports = {
meta: {
Expand Down Expand Up @@ -42,14 +42,8 @@ module.exports = {
return {}
}

return {
"Program:exit"() {
checkExtraneous(
context,
filePath,
getRequireTargets(context, false)
)
},
}
return visitRequire(context, {}, targets => {
checkExtraneous(context, filePath, targets)
})
},
}
87 changes: 48 additions & 39 deletions lib/rules/no-hide-core-modules.js
Expand Up @@ -11,8 +11,9 @@
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")
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",
Expand Down Expand Up @@ -98,49 +99,57 @@ module.exports = {
const ignoreIndirectDependencies = Boolean(
options.ignoreIndirectDependencies
)
const targets = []

return {
"Program:exit"(node) {
const targets = []
.concat(
getRequireTargets(context, true),
getImportExportTargets(context, node, {
includeCore: true,
})
)
.filter(t => CORE_MODULES.has(t.moduleName))
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)
)) {
const name = target.moduleName
const allowed =
allow.indexOf(name) !== -1 ||
(ignoreDirectDependencies && deps.has(name)) ||
(ignoreIndirectDependencies && !deps.has(name))

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
}

if (allowed) {
continue
}
const resolved = resolve.sync(name, {
basedir: dirPath,
})
const isCore = resolved === name

const resolved = resolve.sync(name, { basedir: dirPath })
const isCore = resolved === name
if (isCore) {
continue
}

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, "/"),
},
})
}

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),
{}
)
},
}
10 changes: 4 additions & 6 deletions lib/rules/no-missing-import.js
Expand Up @@ -6,9 +6,9 @@

const checkExistence = require("../util/check-existence")
const getAllowModules = require("../util/get-allow-modules")
const getImportExportTargets = require("../util/get-import-export-targets")
const getResolvePaths = require("../util/get-resolve-paths")
const getTryExtensions = require("../util/get-try-extensions")
const visitImport = require("../util/visit-import")

module.exports = {
meta: {
Expand Down Expand Up @@ -40,10 +40,8 @@ module.exports = {
return {}
}

return {
"Program:exit"(node) {
checkExistence(context, getImportExportTargets(context, node))
},
}
return visitImport(context, {}, targets => {
checkExistence(context, targets)
})
},
}
10 changes: 4 additions & 6 deletions lib/rules/no-missing-require.js
Expand Up @@ -6,9 +6,9 @@

const checkExistence = require("../util/check-existence")
const getAllowModules = require("../util/get-allow-modules")
const getRequireTargets = require("../util/get-require-targets")
const getResolvePaths = require("../util/get-resolve-paths")
const getTryExtensions = require("../util/get-try-extensions")
const visitRequire = require("../util/visit-require")

module.exports = {
meta: {
Expand Down Expand Up @@ -40,10 +40,8 @@ module.exports = {
return {}
}

return {
"Program:exit"() {
checkExistence(context, getRequireTargets(context))
},
}
return visitRequire(context, {}, targets => {
checkExistence(context, targets)
})
},
}
14 changes: 4 additions & 10 deletions lib/rules/no-unpublished-import.js
Expand Up @@ -7,9 +7,9 @@
const checkPublish = require("../util/check-publish")
const getAllowModules = require("../util/get-allow-modules")
const getConvertPath = require("../util/get-convert-path")
const getImportExportTargets = require("../util/get-import-export-targets")
const getResolvePaths = require("../util/get-resolve-paths")
const getTryExtensions = require("../util/get-try-extensions")
const visitImport = require("../util/visit-import")

module.exports = {
meta: {
Expand Down Expand Up @@ -42,14 +42,8 @@ module.exports = {
return {}
}

return {
"Program:exit"(node) {
checkPublish(
context,
filePath,
getImportExportTargets(context, node)
)
},
}
return visitImport(context, {}, targets => {
checkPublish(context, filePath, targets)
})
},
}
10 changes: 4 additions & 6 deletions lib/rules/no-unpublished-require.js
Expand Up @@ -7,9 +7,9 @@
const checkPublish = require("../util/check-publish")
const getAllowModules = require("../util/get-allow-modules")
const getConvertPath = require("../util/get-convert-path")
const getRequireTargets = require("../util/get-require-targets")
const getResolvePaths = require("../util/get-resolve-paths")
const getTryExtensions = require("../util/get-try-extensions")
const visitRequire = require("../util/visit-require")

module.exports = {
meta: {
Expand Down Expand Up @@ -42,10 +42,8 @@ module.exports = {
return {}
}

return {
"Program:exit"() {
checkPublish(context, filePath, getRequireTargets(context))
},
}
return visitRequire(context, {}, targets => {
checkPublish(context, filePath, targets)
})
},
}
38 changes: 2 additions & 36 deletions lib/rules/no-unsupported-features/es-syntax.js
Expand Up @@ -9,6 +9,7 @@ const { getInnermostScope } = require("eslint-utils")
const { Range } = require("semver") //eslint-disable-line no-unused-vars
const getConfiguredNodeVersion = require("../../util/get-configured-node-version")
const getSemverRange = require("../../util/get-semver-range")
const mergeVisitorsInPlace = require("../../util/merge-visitors-in-place")

const getOrSet = /^(?:g|s)et$/u
const features = {
Expand Down Expand Up @@ -405,41 +406,6 @@ function normalizeScope(initialScope, node) {
return scope
}

/**
* Merge two visitors.
* @param {Visitor} x The visitor which is assigned.
* @param {Visitor} y The visitor which is assigning.
* @returns {Visitor} `x`.
*/
function merge(x, y) {
for (const key of Object.keys(y)) {
if (typeof x[key] === "function") {
if (x[key]._handlers == null) {
const fs = [x[key], y[key]]
x[key] = dispatch.bind(null, fs)
x[key]._handlers = fs
} else {
x[key]._handlers.push(y[key])
}
} else {
x[key] = y[key]
}
}
return x
}

/**
* Dispatch all given functions with a node.
* @param {function[]} handlers The function list to call.
* @param {Node} node The AST node to be handled.
* @returns {void}
*/
function dispatch(handlers, node) {
for (const h of handlers) {
h(node)
}
}

/**
* Define the visitor object as merging the rules of eslint-plugin-es.
* @param {RuleContext} context The rule context.
Expand Down Expand Up @@ -514,7 +480,7 @@ function defineVisitor(context, options) {
}
},
}
return merge(visitor, rule.create(thisContext))
return mergeVisitorsInPlace(visitor, rule.create(thisContext))
}, {})
)
}
Expand Down

0 comments on commit df979d3

Please sign in to comment.