From cb45333c03da6d4002ca1d9f83b9d545168a5f6a Mon Sep 17 00:00:00 2001
From: Yann Eves <hello@yanneves.com>
Date: Fri, 19 Mar 2021 17:18:06 +0000
Subject: [PATCH] feat(confusing-browser-globals): Add relevant messaging to
 no-restricted-globals eslint rule

BREAKING CHANGE: export from confusing-browser-globals package changed from String[] to Object[] - no change required if used in eslint no-restricted-globals config
---
 packages/confusing-browser-globals/index.js | 127 +++++++++++---------
 packages/confusing-browser-globals/test.js  |  28 ++++-
 2 files changed, 94 insertions(+), 61 deletions(-)

diff --git a/packages/confusing-browser-globals/index.js b/packages/confusing-browser-globals/index.js
index 98bf34996..c30809e63 100644
--- a/packages/confusing-browser-globals/index.js
+++ b/packages/confusing-browser-globals/index.js
@@ -7,63 +7,72 @@
 
 'use strict';
 
-module.exports = [
-  'addEventListener',
-  'blur',
-  'close',
-  'closed',
-  'confirm',
-  'defaultStatus',
-  'defaultstatus',
-  'event',
-  'external',
-  'find',
-  'focus',
-  'frameElement',
-  'frames',
-  'history',
-  'innerHeight',
-  'innerWidth',
-  'length',
-  'location',
-  'locationbar',
-  'menubar',
-  'moveBy',
-  'moveTo',
-  'name',
-  'onblur',
-  'onerror',
-  'onfocus',
-  'onload',
-  'onresize',
-  'onunload',
-  'open',
-  'opener',
-  'opera',
-  'outerHeight',
-  'outerWidth',
-  'pageXOffset',
-  'pageYOffset',
-  'parent',
-  'print',
-  'removeEventListener',
-  'resizeBy',
-  'resizeTo',
-  'screen',
-  'screenLeft',
-  'screenTop',
-  'screenX',
-  'screenY',
-  'scroll',
-  'scrollbars',
-  'scrollBy',
-  'scrollTo',
-  'scrollX',
-  'scrollY',
-  'self',
-  'status',
-  'statusbar',
-  'stop',
-  'toolbar',
-  'top',
+const restrictedGlobals = [
+  ['addEventListener', 'document'],
+  ['blur', 'window'],
+  ['close', 'window'],
+  ['closed', 'window'],
+  ['confirm', 'window'],
+  ['defaultStatus', 'none'],
+  ['defaultstatus', 'none'],
+  ['event', 'none'],
+  ['external', 'none'],
+  ['find', 'none'],
+  ['focus', 'window'],
+  ['frameElement', 'window'],
+  ['frames', 'window'],
+  ['history', 'window'],
+  ['innerHeight', 'window'],
+  ['innerWidth', 'window'],
+  ['length', 'window'],
+  ['location', 'window'],
+  ['locationbar', 'window'],
+  ['menubar', 'window'],
+  ['moveBy', 'window'],
+  ['moveTo', 'window'],
+  ['name', 'window'],
+  ['onblur', 'window'],
+  ['onerror', 'window'],
+  ['onfocus', 'window'],
+  ['onload', 'window'],
+  ['onresize', 'window'],
+  ['onunload', 'window'],
+  ['open', 'window'],
+  ['opener', 'window'],
+  ['opera', 'window'],
+  ['outerHeight', 'window'],
+  ['outerWidth', 'window'],
+  ['pageXOffset', 'window'],
+  ['pageYOffset', 'window'],
+  ['parent', 'window'],
+  ['print', 'window'],
+  ['removeEventListener', 'document'],
+  ['resizeBy', 'window'],
+  ['resizeTo', 'window'],
+  ['screen', 'window'],
+  ['screenLeft', 'window'],
+  ['screenTop', 'window'],
+  ['screenX', 'window'],
+  ['screenY', 'window'],
+  ['scroll', 'window'],
+  ['scrollbars', 'window'],
+  ['scrollBy', 'window'],
+  ['scrollTo', 'window'],
+  ['scrollX', 'window'],
+  ['scrollY', 'window'],
+  ['self', 'WorkerGlobalScope'],
+  ['status', 'window'],
+  ['statusbar', 'window'],
+  ['stop', 'window'],
+  ['toolbar', 'window'],
+  ['top', 'window'],
 ];
+
+module.exports = restrictedGlobals.map(([name, parent]) => {
+  const message =
+    parent === 'none'
+      ? 'Use local parameter instead.'
+      : `Use local parameter or ${parent}.${name} instead.`;
+
+  return { name, message };
+});
diff --git a/packages/confusing-browser-globals/test.js b/packages/confusing-browser-globals/test.js
index bdc262042..a46c4f836 100644
--- a/packages/confusing-browser-globals/test.js
+++ b/packages/confusing-browser-globals/test.js
@@ -15,6 +15,30 @@ it('should return an Array of globals', () => {
   expect(Array.isArray(globals)).toBe(true);
 });
 
-it('should contain "event" variable', () => {
-  expect(globals).toContain('event');
+it('should contain "event" variable preferring local parameter', () => {
+  expect(globals).toContainEqual({
+    name: 'event',
+    message: 'Use local parameter instead.',
+  });
+});
+
+it('should contain "location" variable preferring local parameter or window global', () => {
+  expect(globals).toContainEqual({
+    name: 'location',
+    message: 'Use local parameter or window.location instead.',
+  });
+});
+
+it('should contain "addEventListener" variable preferring local parameter or document global', () => {
+  expect(globals).toContainEqual({
+    name: 'addEventListener',
+    message: 'Use local parameter or document.addEventListener instead.',
+  });
+});
+
+it('should contain "self" variable preferring local parameter or WorkerGlobalScope global', () => {
+  expect(globals).toContainEqual({
+    name: 'self',
+    message: 'Use local parameter or WorkerGlobalScope.self instead.',
+  });
 });
-- 
GitLab