diff --git a/rules/no-ajax.js b/rules/no-ajax.js index fc4f373..dcdb8b5 100644 --- a/rules/no-ajax.js +++ b/rules/no-ajax.js @@ -1,24 +1,19 @@ 'use strict' +const utils = require('./utils.js') + module.exports = function(context) { return { - CallExpression: function(node) { - if (node.callee.type !== 'MemberExpression') return - if (node.callee.object.name !== '$') return - - const name = node.callee.property.name - switch (name) { - case 'ajax': - case 'get': - case 'getJSON': - case 'getScript': - case 'post': - context.report({ - node: node, - message: 'Prefer fetch to $.' + name - }) + CallExpression: utils.withProperty( + ['ajax', 'get', 'getJSON', 'getScript', 'post'], + function(node) { + const name = node.callee.property.name + context.report({ + node: node, + message: 'Prefer fetch to $.' + name + }) } - } + ) } } diff --git a/rules/no-css.js b/rules/no-css.js index b48cf49..41f37f2 100644 --- a/rules/no-css.js +++ b/rules/no-css.js @@ -4,17 +4,12 @@ const utils = require('./utils.js') module.exports = function(context) { return { - CallExpression: function(node) { - if (node.callee.type !== 'MemberExpression') return - if (node.callee.property.name !== 'css') return - - if (utils.isjQuery(node)) { - context.report({ - node: node, - message: 'Prefer getComputedStyle to $.css' - }) - } - } + CallExpression: utils.withMethod('css', function(node) { + context.report({ + node: node, + message: 'Prefer getComputedStyle to $.css' + }) + }) } } diff --git a/rules/no-deferred.js b/rules/no-deferred.js index e191ddb..ee547ce 100644 --- a/rules/no-deferred.js +++ b/rules/no-deferred.js @@ -1,16 +1,14 @@ 'use strict' -module.exports = function(context) { - function enforce(node) { - if (node.callee.type !== 'MemberExpression') return - if (node.callee.object.name !== '$') return - if (node.callee.property.name !== 'Deferred') return +const utils = require('./utils.js') +module.exports = function(context) { + const enforce = utils.withProperty('Deferred', function(node) { context.report({ node: node, message: 'Prefer Promise to $.Deferred' }) - } + }) return { CallExpression: enforce, diff --git a/rules/no-global-eval.js b/rules/no-global-eval.js index 1c97952..f588de2 100644 --- a/rules/no-global-eval.js +++ b/rules/no-global-eval.js @@ -1,17 +1,15 @@ 'use strict' +const utils = require('./utils.js') + module.exports = function(context) { return { - CallExpression: function(node) { - if (node.callee.type !== 'MemberExpression') return - if (node.callee.object.name !== '$') return - if (node.callee.property.name !== 'globalEval') return - + CallExpression: utils.withProperty('globalEval', function(node) { context.report({ node: node, message: '$.globalEval is not allowed' }) - } + }) } } diff --git a/rules/utils.js b/rules/utils.js index 50f2840..f0424f3 100644 --- a/rules/utils.js +++ b/rules/utils.js @@ -33,7 +33,41 @@ function isjQuery(node) { return id && id.name.startsWith('$') } +function withProperty(property, callback) { + if (typeof callback !== 'function') { + throw new TypeError('Must provide callback function') + } + + const properties = new Set([].concat(property)) + + return function(node) { + if (node.callee.type !== 'MemberExpression') return + if (node.callee.object.name !== '$') return + if (!properties.has(node.callee.property.name)) return + + callback(node) + } +} + +function withMethod(method, callback) { + if (typeof callback !== 'function') { + throw new TypeError('Must provide callback function') + } + + const methods = new Set([].concat(method)) + + return function(node) { + if (node.callee.type !== 'MemberExpression') return + if (!methods.has(node.callee.property.name)) return + if (isjQuery(node)) { + callback(node) + } + } +} + module.exports = { traverse: traverse, - isjQuery: isjQuery + isjQuery: isjQuery, + withMethod: withMethod, + withProperty: withProperty }