@roadmunk/eslint-plugin-roadmunk-custom
Advanced tools
Comparing version 1.8.0 to 1.8.1
@@ -6,10 +6,2 @@ 'use strict'; | ||
/** | ||
* Object containing information about the modules being imported & the corresponding AST node | ||
* @typedef {Object} ModuleInfo | ||
* @property {String} moduleInfo.type - Contains detail about the type of the require/import statement. Possible values include "Literal" & "ArrayExpression" | ||
* @property {String[]} moduleInfo.moduleNames - An array containing the names of module that are being imported | ||
*/ | ||
/** | ||
* Checks if the given node contains properties that have certain values | ||
@@ -98,5 +90,5 @@ * | ||
* @param {ASTNode} node - The node whose properties need to be looked up | ||
* @returns {ModuleInfo} | ||
* @returns {ASTNode[]} - An array of nodes for all the literal arguments passed into the require call | ||
*/ | ||
function getModuleNamesFromRequireCall(node) { | ||
function getLiteralModuleNamesFromRequireCall(node) { | ||
if (!isRequireCall(node)) { | ||
@@ -109,6 +101,3 @@ return []; | ||
return { | ||
type : isLiteralRequire ? 'Literal' : 'ArrayExpression', | ||
moduleNames : args.map(arg => arg.value), | ||
}; | ||
return _.filter(args, arg => arg.type === 'Literal'); | ||
} | ||
@@ -182,3 +171,3 @@ | ||
isRequireCallArrayExpression, | ||
getModuleNamesFromRequireCall, | ||
getLiteralModuleNamesFromRequireCall, | ||
}; |
@@ -76,3 +76,3 @@ const _ = require('lodash'); | ||
// Multi by two to accomodate for relative requires they will be slotted after this (rank + 1) | ||
// Multi by two to accommodate for relative requires they will be slotted after this (rank + 1) | ||
rank *= 2; | ||
@@ -79,0 +79,0 @@ |
@@ -9,3 +9,3 @@ /* eslint-disable no-console */ | ||
const _ = require('lodash'); | ||
const { isRequireCall, getModuleNamesFromRequireCall } = require('../helper'); | ||
const { isRequireCall, getLiteralModuleNamesFromRequireCall } = require('../helper'); | ||
@@ -24,20 +24,12 @@ module.exports = { | ||
/** | ||
* Checks if the module being imported is a Literal require statement | ||
* @param {ModuleInfo} - See helper.js for type definition | ||
*/ | ||
function isModuleTypeLiteral(moduleInfo) { | ||
return moduleInfo.type === 'Literal'; | ||
} | ||
/** | ||
* Returns a string representation of all module names but with the `.js` extension stripped off | ||
* @param {ModuleInfo} - See helper.js for type definition | ||
* @param {ASTNode[]} - An array of all the nodes that have values ending with `.js` | ||
* @returns {String} | ||
*/ | ||
function getFixedModuleNames(moduleInfo) { | ||
if (isModuleTypeLiteral(moduleInfo) || moduleInfo.type === 'ImportDeclaration') { | ||
return `'${getFixedModuleName(moduleInfo.moduleNames[0])}'`; | ||
} | ||
return `[${moduleInfo.moduleNames.map(moduleName => `'${getFixedModuleName(moduleName)}'`).join(', ')}]`; | ||
function getFixedNodes(offendingNodes) { | ||
return _.map(offendingNodes, node => ({ | ||
start : node.start, | ||
end : node.end, | ||
fixedName : `'${getFixedModuleName(node.value)}'`, | ||
})); | ||
} | ||
@@ -53,9 +45,10 @@ | ||
function generateReport(moduleInfo, node) { | ||
if (!_.some(moduleInfo.moduleNames, moduleName => moduleName.endsWith('.js'))) { | ||
function generateReport(moduleNodes, node) { | ||
const offendingNodes = _.filter(moduleNodes, node => node.value.endsWith('.js')); | ||
if (_.isEmpty(offendingNodes)) { | ||
return; | ||
} | ||
const fixedModuleNames = getFixedModuleNames(moduleInfo); | ||
const argToReplace = node.type === 'ImportDeclaration' ? node.source : node.arguments[0]; | ||
const fixedNodes = getFixedNodes(offendingNodes); | ||
@@ -66,3 +59,3 @@ context.report({ | ||
fix(fixer) { | ||
return fixer.replaceTextRange([ argToReplace.start, argToReplace.end ], fixedModuleNames); | ||
return _.map(fixedNodes, node => fixer.replaceTextRange([ node.start, node.end ], node.fixedName)); | ||
}, | ||
@@ -78,9 +71,9 @@ }); | ||
const moduleNames = getModuleNamesFromRequireCall(node); | ||
generateReport(moduleNames, node); | ||
const moduleNodes = getLiteralModuleNamesFromRequireCall(node); | ||
generateReport(moduleNodes, node); | ||
}, | ||
ImportDeclaration(node) { | ||
const moduleNames = [ node.source.value ]; | ||
generateReport({ type : node.type, moduleNames }, node); | ||
const nodes = [ node.source ]; | ||
generateReport(nodes, node); | ||
}, | ||
@@ -87,0 +80,0 @@ }; |
@@ -9,3 +9,3 @@ /** | ||
const { generateReport, registerNode } = require('../order-common'); | ||
const { isRequireCall } = require('../helper'); | ||
const { isRequireCallLiteral } = require('../helper'); | ||
@@ -56,3 +56,3 @@ // ------------------------------------------------------------------------------ | ||
CallExpression(node) { | ||
if (!isRequireCall(node) || !isTopLevelDeclaration(node)) { | ||
if (!isRequireCallLiteral(node) || !isTopLevelDeclaration(node)) { | ||
return; | ||
@@ -59,0 +59,0 @@ } |
{ | ||
"name": "@roadmunk/eslint-plugin-roadmunk-custom", | ||
"version": "1.8.0", | ||
"version": "1.8.1", | ||
"description": "Plugin to hold custom ESLint rules for Roadmunk", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -33,2 +33,4 @@ /** | ||
"require([ 'models/CustomProperty', 'models/Account' ], (customProperty, account) => false );", | ||
"(function(moduleName){ require([ 'moduleName' ], module => module) })", | ||
'(function(moduleName){ require([ moduleName ], module => module) })', | ||
], | ||
@@ -63,2 +65,7 @@ | ||
{ | ||
code : "require([ variable, './models/Account.js', './models/User', './models/Test.js'], foo => bar);", | ||
output : "require([ variable, './models/Account', './models/User', './models/Test'], foo => bar);", | ||
errors : requireErrors, | ||
}, | ||
{ | ||
code : "import Account from './models/Account.js';", | ||
@@ -65,0 +72,0 @@ output : "import Account from './models/Account';", |
93791
2660