123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
-
-
- "use strict";
-
-
-
-
-
- module.exports = {
- meta: {
- type: "suggestion",
-
- docs: {
- description: "disallow `require` calls to be mixed with regular variable declarations",
- category: "Node.js and CommonJS",
- recommended: false,
- url: "https://eslint.org/docs/rules/no-mixed-requires"
- },
-
- schema: [
- {
- oneOf: [
- {
- type: "boolean"
- },
- {
- type: "object",
- properties: {
- grouping: {
- type: "boolean"
- },
- allowCall: {
- type: "boolean"
- }
- },
- additionalProperties: false
- }
- ]
- }
- ]
- },
-
- create(context) {
-
- const options = context.options[0];
- let grouping = false,
- allowCall = false;
-
- if (typeof options === "object") {
- grouping = options.grouping;
- allowCall = options.allowCall;
- } else {
- grouping = !!options;
- }
-
-
-
- function getBuiltinModules() {
-
-
-
- return [
- "assert", "buffer", "child_process", "cluster", "crypto",
- "dgram", "dns", "domain", "events", "fs", "http", "https",
- "net", "os", "path", "punycode", "querystring", "readline",
- "repl", "smalloc", "stream", "string_decoder", "tls", "tty",
- "url", "util", "v8", "vm", "zlib"
- ];
- }
-
- const BUILTIN_MODULES = getBuiltinModules();
-
- const DECL_REQUIRE = "require",
- DECL_UNINITIALIZED = "uninitialized",
- DECL_OTHER = "other";
-
- const REQ_CORE = "core",
- REQ_FILE = "file",
- REQ_MODULE = "module",
- REQ_COMPUTED = "computed";
-
-
-
- function getDeclarationType(initExpression) {
- if (!initExpression) {
-
-
- return DECL_UNINITIALIZED;
- }
-
- if (initExpression.type === "CallExpression" &&
- initExpression.callee.type === "Identifier" &&
- initExpression.callee.name === "require"
- ) {
-
-
- return DECL_REQUIRE;
- }
- if (allowCall &&
- initExpression.type === "CallExpression" &&
- initExpression.callee.type === "CallExpression"
- ) {
-
-
- return getDeclarationType(initExpression.callee);
- }
- if (initExpression.type === "MemberExpression") {
-
-
- return getDeclarationType(initExpression.object);
- }
-
-
- return DECL_OTHER;
- }
-
-
-
- function inferModuleType(initExpression) {
- if (initExpression.type === "MemberExpression") {
-
-
- return inferModuleType(initExpression.object);
- }
- if (initExpression.arguments.length === 0) {
-
-
- return REQ_COMPUTED;
- }
-
- const arg = initExpression.arguments[0];
-
- if (arg.type !== "Literal" || typeof arg.value !== "string") {
-
-
- return REQ_COMPUTED;
- }
-
- if (BUILTIN_MODULES.indexOf(arg.value) !== -1) {
-
-
- return REQ_CORE;
- }
- if (/^\.{0,2}\//.test(arg.value)) {
-
-
- return REQ_FILE;
- }
-
-
- return REQ_MODULE;
-
- }
-
-
-
- function isMixed(declarations) {
- const contains = {};
-
- declarations.forEach(declaration => {
- const type = getDeclarationType(declaration.init);
-
- contains[type] = true;
- });
-
- return !!(
- contains[DECL_REQUIRE] &&
- (contains[DECL_UNINITIALIZED] || contains[DECL_OTHER])
- );
- }
-
-
-
- function isGrouped(declarations) {
- const found = {};
-
- declarations.forEach(declaration => {
- if (getDeclarationType(declaration.init) === DECL_REQUIRE) {
- found[inferModuleType(declaration.init)] = true;
- }
- });
-
- return Object.keys(found).length <= 1;
- }
-
-
- return {
-
- VariableDeclaration(node) {
-
- if (isMixed(node.declarations)) {
- context.report({ node, message: "Do not mix 'require' and other declarations." });
- } else if (grouping && !isGrouped(node.declarations)) {
- context.report({ node, message: "Do not mix core, module, file and computed requires." });
- }
- }
- };
-
- }
- };
|