diff --git a/lib/index.js b/lib/index.js index 8adfdef..6ce98f5 100644 --- a/lib/index.js +++ b/lib/index.js @@ -19,7 +19,7 @@ module.exports.configs = { 'userscripts/align-attributes': ['error', 2], 'userscripts/no-invalid-headers': 'error', 'userscripts/no-invalid-grant': 'error', - 'userscripts/better-use-match': 'warning' + 'userscripts/avoid-regexp-include': 'warning' } } }; diff --git a/lib/rules/avoid-regexp-include.js b/lib/rules/avoid-regexp-include.js new file mode 100644 index 0000000..a4230ee --- /dev/null +++ b/lib/rules/avoid-regexp-include.js @@ -0,0 +1,24 @@ +const createValidator = require('../utils/createValidator'); + +module.exports = createValidator( + 'include', + false, + ({ attrVal, context }) => { + const argument = attrVal.val; + if (argument.startsWith('/')) { + context.report({ + loc: { + start: { + line: attrVal.loc.start.line, + column: 0 + }, + end: attrVal.loc.end + }, + messageId: 'avoidRegExpInclude' + }); + } + }, + { + avoidRegExpInclude: "Using a regular expression at '@include' can cause performance issues. Use a regular @include or @match instead." + } +); \ No newline at end of file diff --git a/lib/rules/better-use-match.js b/lib/rules/better-use-match.js deleted file mode 100644 index fab82c6..0000000 --- a/lib/rules/better-use-match.js +++ /dev/null @@ -1,21 +0,0 @@ -const createValidator = require('../utils/createValidator'); - -module.exports = createValidator( - 'include', - false, - ({ attrVal, context }) => { - context.report({ - loc: { - start: { - line: attrVal.loc.start.line, - column: 0 - }, - end: attrVal.loc.end - }, - messageId: 'betterUseMatch' - }); - }, - { - betterUseMatch: "Using @include is potentially unsafe and may be obsolete in Manifest v3 in early 2023. Please switch to @match." - } -); diff --git a/lib/rules/no-invalid-grant.js b/lib/rules/no-invalid-grant.js index 70a15bc..06861cd 100644 --- a/lib/rules/no-invalid-grant.js +++ b/lib/rules/no-invalid-grant.js @@ -10,12 +10,14 @@ const gmFunctions = [ 'addValueChangeListener', 'cookie', 'deleteValue', + 'deleteValues', 'download', 'getResourceText', 'getResourceURL', 'getTab', 'getTabs', 'getValue', + 'getValues', 'info', 'listValues', 'log', @@ -26,7 +28,9 @@ const gmFunctions = [ 'saveTab', 'setClipboard', 'setValue', + 'setValues', 'unregisterMenuCommand', + 'webRequest', 'xmlhttpRequest' ].map((item) => `GM_${item}`); const greasemonkey = [ @@ -35,12 +39,14 @@ const greasemonkey = [ 'addValueChangeListener', 'cookie', 'deleteValue', + 'deleteValues', 'download', 'getResourceText', 'getResourceUrl', // note lowercase "rl" 'getTab', 'getTabs', 'getValue', + 'getValues', 'info', 'listValues', 'log', @@ -51,7 +57,9 @@ const greasemonkey = [ 'saveTab', 'setClipboard', 'setValue', + 'setValues', 'unregisterMenuCommand', + 'webRequest', 'xmlHttpRequest' // note uppercase "H" ].map((item) => `GM.${item}`); const miscellaneous = [ diff --git a/lib/rules/no-invalid-headers.js b/lib/rules/no-invalid-headers.js index baab2b2..29d46a5 100644 --- a/lib/rules/no-invalid-headers.js +++ b/lib/rules/no-invalid-headers.js @@ -35,8 +35,12 @@ const validHeaders = new Set( 'require', 'resource', 'run-at', + 'run-in', + 'sandbox', 'source', 'supportURL', + 'tag', + 'unwrap', 'updateURL', 'version', 'website' diff --git a/lib/rules/require-version.js b/lib/rules/require-version.js index ad7a613..c14d647 100644 --- a/lib/rules/require-version.js +++ b/lib/rules/require-version.js @@ -10,7 +10,7 @@ module.exports = createValidator( messageId: 'multipleVersions' }); } - if (!/^([\dA-Za-z-]+)(\.[\dA-Za-z-]+)*\s*$/.test(attrVal.val)) { + if (!/^([^\s.]+)(\.[^\s.]+)*$/.test(attrVal.val)) { context.report({ loc: { start: { diff --git a/lib/utils/createValidator.js b/lib/utils/createValidator.js index c306995..2ac6416 100644 --- a/lib/utils/createValidator.js +++ b/lib/utils/createValidator.js @@ -86,12 +86,12 @@ module.exports = function createValidator( inMetadata = true; wentInMetadata = true; } else if (inMetadata && comment.value.trim().startsWith('@')) { - const key = comment.value.trim().slice(1).split(/[ \t]/)[0]; + const key = comment.value.trim().slice(1).split(/[\t ]/)[0]; const val = { val: comment.value .trim() .slice(1) - .split(/[ \t]/) + .split(/[\t ]/) .slice(1) .join(' ') .trim(), diff --git a/package.json b/package.json index 407d456..6d2630a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eslint-plugin-userscripts", - "version": "0.1.1", + "version": "0.2.0", "description": "Implements rules for userscripts metadata in eslint", "keywords": [ "eslint", @@ -22,9 +22,9 @@ "@babel/eslint-parser": "^7.15.8", "acorn": "^8.5.0", "eslint": "^8.0.0", - "eslint-plugin-eslint-plugin": "^4.0.0", - "eslint-plugin-import": "^2.24.2", - "eslint-plugin-unicorn": "^37.0.1", + "eslint-plugin-eslint-plugin": ">=4.0.0", + "eslint-plugin-import": ">=2.24.2", + "eslint-plugin-unicorn": ">=37.0.1", "husky": "^7.0.2", "mocha": "^9.0.3", "nyc": "^15.1.0", @@ -34,7 +34,7 @@ "eslint": ">=6.0.0 <=^8.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=16.0.0" }, "license": "MIT", "homepage": "https://github.com/Yash-Singh1/eslint-plugin-userscripts#readme", diff --git a/tests/lib/rules/better-use-match.js b/tests/lib/rules/avoid-regexp-include.js similarity index 55% rename from tests/lib/rules/better-use-match.js rename to tests/lib/rules/avoid-regexp-include.js index 8da9cea..59ebe13 100644 --- a/tests/lib/rules/better-use-match.js +++ b/tests/lib/rules/avoid-regexp-include.js @@ -1,20 +1,20 @@ -var rule = require('..')['better-use-match']; +var rule = require('..')['avoid-regexp-include']; var RuleTester = require('eslint').RuleTester; var ruleTester = new RuleTester(); -ruleTester.run('better-use-match', rule, { +ruleTester.run('avoid-regexp-include', rule, { valid: [ `// ==UserScript== // @description This is my description - // @match *://*/* + // @include https://* // ==/UserScript==`, ], invalid: [ { code: `// ==UserScript== - // @include *://*/* + // @include /https?:\\/\\/foo.bar\\/.*/ // ==/UserScript==`, - errors: [{ messageId: 'betterUseMatch' }] + errors: [{ messageId: 'avoidRegExpInclude' }] } ] -}); +}); \ No newline at end of file diff --git a/tests/lib/rules/no-invalid-grant.js b/tests/lib/rules/no-invalid-grant.js index cb0b1e2..0fbe028 100644 --- a/tests/lib/rules/no-invalid-grant.js +++ b/tests/lib/rules/no-invalid-grant.js @@ -19,6 +19,8 @@ ruleTester.run('no-invalid-grant', rule, { // @grant GM.download // @grant GM_cookie // @grant GM.cookie + // @grant GM.getValues + // @grant GM.setValues // @grant unsafeWindow // @grant window.onurlchange // ==/UserScript== diff --git a/tests/lib/rules/no-invalid-headers.js b/tests/lib/rules/no-invalid-headers.js index a7713fb..8da02f0 100644 --- a/tests/lib/rules/no-invalid-headers.js +++ b/tests/lib/rules/no-invalid-headers.js @@ -22,6 +22,8 @@ ruleTester.run('no-invalid-headers', rule, { // @downloadURL https://raw.githubusercontent.com/Yash-Singh1/UserScripts/main/Bottom_Padding_to_Swagger_UI/Bottom_Padding_to_Swagger_UI.user.js // @updateURL https://raw.githubusercontent.com/Yash-Singh1/UserScripts/main/Bottom_Padding_to_Swagger_UI/Bottom_Padding_to_Swagger_UI.user.js // @nocompat Chrome + // @run-in normal-tabs + // @run-in container-id-1 // @history 1.0 Initial release // @copyright 2020-2021, Yash Singh (https://github.com/Yash-Singh1) // ==/UserScript== diff --git a/tests/lib/rules/require-version.js b/tests/lib/rules/require-version.js index 3e827f8..7c70fe8 100644 --- a/tests/lib/rules/require-version.js +++ b/tests/lib/rules/require-version.js @@ -33,7 +33,10 @@ ruleTester.run('require-version', rule, { // ==/UserScript==`, `// ==UserScript== // @version 1.1.1.1.2.0.1.1.1.1.1 - // ==/UserScript==` + // ==/UserScript==`, + `// ==UserScript== + // @version @.€.$ + // ==/UserScript==`, ], invalid: [ { @@ -73,12 +76,6 @@ ruleTester.run('require-version', rule, { // @version 5 .6 // ==/UserScript==`, errors: [{ messageId: 'invalidVersion' }] - }, - { - code: `// ==UserScript== - // @version @.€.$ - // ==/UserScript==`, - errors: [{ messageId: 'invalidVersion' }] } ] }); diff --git a/tests/lib/utils/createValidator.js b/tests/lib/utils/createValidator.js index 3057f8c..5300347 100644 --- a/tests/lib/utils/createValidator.js +++ b/tests/lib/utils/createValidator.js @@ -1,5 +1,5 @@ const createValidator = require('../../../lib/utils/createValidator.js'); -const assert = require('assert'); +const assert = require('node:assert'); it('should properly generate description', () => { assert.strictEqual(