From 31c195dcea26be7a60ef04b75e389dc7503b82ac Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Thu, 14 Apr 2022 11:06:36 +0200 Subject: [PATCH 1/7] Add @unwrap to valid headers --- lib/rules/no-invalid-headers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/no-invalid-headers.js b/lib/rules/no-invalid-headers.js index baab2b2..1c62be0 100644 --- a/lib/rules/no-invalid-headers.js +++ b/lib/rules/no-invalid-headers.js @@ -37,6 +37,7 @@ const validHeaders = new Set( 'run-at', 'source', 'supportURL', + 'unwrap', 'updateURL', 'version', 'website' From a00058ba5c013aa65dd4efcb9ae7c02238c55dea Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Thu, 27 Oct 2022 08:46:59 +0200 Subject: [PATCH 2/7] Add @andbox --- lib/rules/no-invalid-headers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/rules/no-invalid-headers.js b/lib/rules/no-invalid-headers.js index 1c62be0..ef9718b 100644 --- a/lib/rules/no-invalid-headers.js +++ b/lib/rules/no-invalid-headers.js @@ -35,6 +35,7 @@ const validHeaders = new Set( 'require', 'resource', 'run-at', + 'sandbox', 'source', 'supportURL', 'unwrap', From 092084aa36c4d2ec62693a64409bca3ea2a4ff6a Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Thu, 9 Mar 2023 14:04:12 +0100 Subject: [PATCH 3/7] Adapt `@version` check for what Tampermonkey includes into its update checks --- lib/rules/require-version.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rules/require-version.js b/lib/rules/require-version.js index ad7a613..cdca3da 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]*){0,3}\s*$/.test(attrVal.val)) { context.report({ loc: { start: { From 029eb1c03b53788665c04d37661066419f9f3a0c Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Tue, 21 Mar 2023 20:42:31 +0100 Subject: [PATCH 4/7] Add GM_webRequest to the valid grant value list --- lib/rules/no-invalid-grant.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/rules/no-invalid-grant.js b/lib/rules/no-invalid-grant.js index 70a15bc..02b36d6 100644 --- a/lib/rules/no-invalid-grant.js +++ b/lib/rules/no-invalid-grant.js @@ -27,6 +27,7 @@ const gmFunctions = [ 'setClipboard', 'setValue', 'unregisterMenuCommand', + 'webRequest', 'xmlhttpRequest' ].map((item) => `GM_${item}`); const greasemonkey = [ @@ -52,6 +53,7 @@ const greasemonkey = [ 'setClipboard', 'setValue', 'unregisterMenuCommand', + 'webRequest', 'xmlHttpRequest' // note uppercase "H" ].map((item) => `GM.${item}`); const miscellaneous = [ From ebbe3552b8994be8f3921791f7cf4ce76e7bec11 Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Sun, 21 Jul 2024 14:03:19 +0200 Subject: [PATCH 5/7] Add @tag support Replace better-use-match by avoid-regexp-include --- lib/index.js | 2 +- lib/rules/avoid-regexp-include.js | 24 +++++++++++++++++++ lib/rules/better-use-match.js | 21 ---------------- lib/rules/no-invalid-headers.js | 1 + lib/rules/require-version.js | 2 +- lib/utils/createValidator.js | 4 ++-- package.json | 10 ++++---- ...r-use-match.js => avoid-regexp-include.js} | 12 +++++----- tests/lib/rules/require-version.js | 11 ++++----- tests/lib/utils/createValidator.js | 2 +- 10 files changed, 45 insertions(+), 44 deletions(-) create mode 100644 lib/rules/avoid-regexp-include.js delete mode 100644 lib/rules/better-use-match.js rename tests/lib/rules/{better-use-match.js => avoid-regexp-include.js} (55%) 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-headers.js b/lib/rules/no-invalid-headers.js index ef9718b..6f62da6 100644 --- a/lib/rules/no-invalid-headers.js +++ b/lib/rules/no-invalid-headers.js @@ -38,6 +38,7 @@ const validHeaders = new Set( 'sandbox', 'source', 'supportURL', + 'tag', 'unwrap', 'updateURL', 'version', diff --git a/lib/rules/require-version.js b/lib/rules/require-version.js index cdca3da..c14d647 100644 --- a/lib/rules/require-version.js +++ b/lib/rules/require-version.js @@ -10,7 +10,7 @@ module.exports = createValidator( messageId: 'multipleVersions' }); } - if (!/^([^.\s]+)(\.[^.\s]*){0,3}\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/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( From 2752cd296832d2a5c28f82dc2439d3c045456bb4 Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Thu, 5 Sep 2024 11:40:13 +0200 Subject: [PATCH 6/7] Add `@run-in` --- lib/rules/no-invalid-headers.js | 1 + tests/lib/rules/no-invalid-headers.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib/rules/no-invalid-headers.js b/lib/rules/no-invalid-headers.js index 6f62da6..29d46a5 100644 --- a/lib/rules/no-invalid-headers.js +++ b/lib/rules/no-invalid-headers.js @@ -35,6 +35,7 @@ const validHeaders = new Set( 'require', 'resource', 'run-at', + 'run-in', 'sandbox', 'source', 'supportURL', 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== From 8e03ba4a5838b5cec8fdb1e488dec0a34954904e Mon Sep 17 00:00:00 2001 From: Jan Biniok Date: Thu, 5 Sep 2024 13:35:53 +0200 Subject: [PATCH 7/7] Add multi-value storage API --- lib/rules/no-invalid-grant.js | 6 ++++++ tests/lib/rules/no-invalid-grant.js | 2 ++ 2 files changed, 8 insertions(+) diff --git a/lib/rules/no-invalid-grant.js b/lib/rules/no-invalid-grant.js index 02b36d6..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,6 +28,7 @@ const gmFunctions = [ 'saveTab', 'setClipboard', 'setValue', + 'setValues', 'unregisterMenuCommand', 'webRequest', 'xmlhttpRequest' @@ -36,12 +39,14 @@ const greasemonkey = [ 'addValueChangeListener', 'cookie', 'deleteValue', + 'deleteValues', 'download', 'getResourceText', 'getResourceUrl', // note lowercase "rl" 'getTab', 'getTabs', 'getValue', + 'getValues', 'info', 'listValues', 'log', @@ -52,6 +57,7 @@ const greasemonkey = [ 'saveTab', 'setClipboard', 'setValue', + 'setValues', 'unregisterMenuCommand', 'webRequest', 'xmlHttpRequest' // note uppercase "H" 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==