1/** 2 * @fileoverview Require `common` module first in our tests. 3 */ 4'use strict'; 5 6const path = require('path'); 7const { isRequireCall, isString } = require('./rules-utils.js'); 8 9//------------------------------------------------------------------------------ 10// Rule Definition 11//------------------------------------------------------------------------------ 12 13module.exports = function(context) { 14 const requiredModule = 'common'; 15 const isESM = context.parserOptions.sourceType === 'module'; 16 const foundModules = []; 17 18 /** 19 * Function to check if the path is a module and return its name. 20 * @param {String} str The path to check 21 * @returns {String} module name 22 */ 23 function getModuleName(str) { 24 if (str === '../common/index.mjs') { 25 return 'common'; 26 } 27 28 return path.basename(str); 29 } 30 31 /** 32 * Function to check if a node has an argument that is a module and 33 * return its name. 34 * @param {ASTNode} node The node to check 35 * @returns {undefined|String} module name or undefined 36 */ 37 function getModuleNameFromCall(node) { 38 // Node has arguments and first argument is string 39 if (node.arguments.length && isString(node.arguments[0])) { 40 return getModuleName(node.arguments[0].value.trim()); 41 } 42 43 return undefined; 44 } 45 46 const rules = { 47 'Program:exit'(node) { 48 // The common module should be loaded in the first place. 49 const notLoadedFirst = foundModules.indexOf(requiredModule) !== 0; 50 if (notLoadedFirst) { 51 context.report( 52 node, 53 'Mandatory module "{{moduleName}}" must be loaded ' + 54 'before any other modules.', 55 { moduleName: requiredModule } 56 ); 57 } 58 } 59 }; 60 61 if (isESM) { 62 rules.ImportDeclaration = (node) => { 63 const moduleName = getModuleName(node.source.value); 64 if (moduleName) { 65 foundModules.push(moduleName); 66 } 67 }; 68 } else { 69 rules.CallExpression = (node) => { 70 if (isRequireCall(node)) { 71 const moduleName = getModuleNameFromCall(node); 72 73 if (moduleName) { 74 foundModules.push(moduleName); 75 } 76 } 77 }; 78 } 79 80 return rules; 81}; 82