eslint-plugin-delegated-events
Advanced tools
Comparing version 0.0.1 to 0.1.0
{ | ||
"name": "eslint-plugin-delegated-events", | ||
"version": "0.0.1", | ||
"version": "0.1.0", | ||
"description": "Disallow delegating high-frequency events.", | ||
@@ -5,0 +5,0 @@ "repository": "dgraham/eslint-plugin-delegated-events", |
'use strict'; | ||
module.exports = function(context) { | ||
const bindings = [] | ||
return { | ||
ImportDeclaration: function(node) { | ||
if (node.source.value !== 'delegated-events') return | ||
for (let spec of node.specifiers) { | ||
switch (spec.type) { | ||
case 'ImportSpecifier': | ||
if (spec.imported.name === 'on') { | ||
bindings.push(callee => { | ||
return callee.type === 'Identifier' && | ||
callee.name === spec.local.name | ||
}) | ||
} | ||
break | ||
case 'ImportNamespaceSpecifier': | ||
bindings.push(callee => { | ||
return callee.type === 'MemberExpression' && | ||
callee.object.name === spec.local.name && | ||
callee.property.name === 'on' | ||
}) | ||
break | ||
} | ||
} | ||
}, | ||
CallExpression: function(node) { | ||
if (node.callee.name !== 'on') return | ||
if (!bindings.some(fn => fn(node.callee))) return | ||
if (!node.arguments[0]) return | ||
var name = node.arguments[0].value | ||
switch (name) { | ||
switch (node.arguments[0].value) { | ||
case 'input': | ||
@@ -11,0 +36,0 @@ case 'keydown': |
'use strict'; | ||
var rule = require('../rules/no-high-freq') | ||
var RuleTester = require('eslint').RuleTester | ||
const rule = require('../rules/no-high-freq') | ||
const RuleTester = require('eslint').RuleTester | ||
var error = 'High-frequency delegated events are not allowed' | ||
const error = 'High-frequency delegated events are not allowed' | ||
var ruleTester = new RuleTester() | ||
const ruleTester = new RuleTester() | ||
ruleTester.run('no-high-freq', rule, { | ||
valid: [ | ||
'on("click", "button", function(){})', | ||
'on("change", "button", function(){})', | ||
'on("drop", "button", function(){})' | ||
{ | ||
code: 'on("click", "div", function(){})', | ||
parserOptions: {sourceType: 'script'} | ||
}, | ||
{ | ||
code: 'on("input", "div", function(){})', | ||
parserOptions: {sourceType: 'script'} | ||
}, | ||
{ | ||
code: 'on("input", "div", function(){})', | ||
parserOptions: {sourceType: 'module'} | ||
}, | ||
{ | ||
code: 'import {on} from "delegated-events"; on("click", "div", function(){})', | ||
parserOptions: {sourceType: 'module'} | ||
}, | ||
{ | ||
code: 'import {on as alias} from "delegated-events"; alias("click", "div", function(){})', | ||
parserOptions: {sourceType: 'module'} | ||
}, | ||
{ | ||
code: 'import * as events from "delegated-events"; events.on("click", "div", function(){})', | ||
parserOptions: {sourceType: 'module'} | ||
}, | ||
{ | ||
code: 'import {on} from "not-delegated-events"; on("input", "div", function(){})', | ||
parserOptions: {sourceType: 'module'} | ||
} | ||
], | ||
invalid: [ | ||
{ | ||
code: 'on("input", "div", function(event){})', | ||
code: 'import {on as alias} from "delegated-events"; alias("input", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("keydown", "div", function(event){})', | ||
code: 'import * as events from "delegated-events"; events.on("input", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("keypress", "div", function(event){})', | ||
code: 'import {on} from "delegated-events"; on("input", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("keyup", "div", function(event){})', | ||
code: 'import {on} from "delegated-events"; on("keydown", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("mouseout", "div", function(event){})', | ||
code: 'import {on} from "delegated-events"; on("keypress", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("mouseover", "div", function(event){})', | ||
code: 'import {on} from "delegated-events"; on("keyup", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("mousemove", "div", function(event){})', | ||
code: 'import {on} from "delegated-events"; on("mouseout", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'on("scroll", "div", function(event){})', | ||
code: 'import {on} from "delegated-events"; on("mouseover", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'import {on} from "delegated-events"; on("mousemove", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
}, | ||
{ | ||
code: 'import {on} from "delegated-events"; on("scroll", "div", function(event){})', | ||
parserOptions: {sourceType: 'module'}, | ||
errors: [{message: error, type: 'CallExpression'}] | ||
} | ||
] | ||
}) |
7817
142