From d032897f716bfcec0b771990336aa596a7d2e8c7 Mon Sep 17 00:00:00 2001 From: Siddharth Doshi Date: Fri, 12 May 2017 23:54:09 +0530 Subject: [PATCH 1/5] Blacklist confusing global variables --- packages/eslint-config-react-app/index.js | 594 +++++++++++++++++++++- 1 file changed, 593 insertions(+), 1 deletion(-) diff --git a/packages/eslint-config-react-app/index.js b/packages/eslint-config-react-app/index.js index fac862c72ce..8c0010f7a1e 100644 --- a/packages/eslint-config-react-app/index.js +++ b/packages/eslint-config-react-app/index.js @@ -26,13 +26,605 @@ module.exports = { plugins: ['import', 'flowtype', 'jsx-a11y', 'react'], env: { - browser: true, commonjs: true, es6: true, jest: true, node: true, }, + globals: { + addEventListener: false, + alert: false, + AnalyserNode: false, + Animation: false, + AnimationEffectReadOnly: false, + AnimationEffectTiming: false, + AnimationEffectTimingReadOnly: false, + AnimationEvent: false, + AnimationPlaybackEvent: false, + AnimationTimeline: false, + applicationCache: false, + ApplicationCache: false, + ApplicationCacheErrorEvent: false, + atob: false, + Attr: false, + Audio: false, + AudioBuffer: false, + AudioBufferSourceNode: false, + AudioContext: false, + AudioDestinationNode: false, + AudioListener: false, + AudioNode: false, + AudioParam: false, + AudioProcessingEvent: false, + AutocompleteErrorEvent: false, + BarProp: false, + BatteryManager: false, + BeforeUnloadEvent: false, + BiquadFilterNode: false, + Blob: false, + blur: false, + btoa: false, + Cache: false, + caches: false, + CacheStorage: false, + cancelAnimationFrame: false, + CanvasGradient: false, + CanvasPattern: false, + CanvasRenderingContext2D: false, + CDATASection: false, + ChannelMergerNode: false, + ChannelSplitterNode: false, + CharacterData: false, + clearInterval: false, + clearTimeout: false, + clientInformation: false, + ClientRect: false, + ClientRectList: false, + ClipboardEvent: false, + CloseEvent: false, + Comment: false, + CompositionEvent: false, + confirm: false, + console: false, + ConvolverNode: false, + Credential: false, + CredentialsContainer: false, + crypto: false, + Crypto: false, + CryptoKey: false, + CSS: false, + CSSAnimation: false, + CSSFontFaceRule: false, + CSSImportRule: false, + CSSKeyframeRule: false, + CSSKeyframesRule: false, + CSSMediaRule: false, + CSSPageRule: false, + CSSRule: false, + CSSRuleList: false, + CSSStyleDeclaration: false, + CSSStyleRule: false, + CSSStyleSheet: false, + CSSSupportsRule: false, + CSSTransition: false, + CSSUnknownRule: false, + CSSViewportRule: false, + customElements: false, + CustomEvent: false, + DataTransfer: false, + DataTransferItem: false, + DataTransferItemList: false, + Debug: false, + defaultStatus: false, + defaultstatus: false, + DelayNode: false, + DeviceMotionEvent: false, + DeviceOrientationEvent: false, + devicePixelRatio: false, + dispatchEvent: false, + document: false, + Document: false, + DocumentFragment: false, + DocumentTimeline: false, + DocumentType: false, + DOMError: false, + DOMException: false, + DOMImplementation: false, + DOMParser: false, + DOMSettableTokenList: false, + DOMStringList: false, + DOMStringMap: false, + DOMTokenList: false, + DragEvent: false, + DynamicsCompressorNode: false, + Element: false, + ElementTimeControl: false, + ErrorEvent: false, + event: false, + Event: false, + EventSource: false, + EventTarget: false, + external: false, + FederatedCredential: false, + fetch: false, + File: false, + FileError: false, + FileList: false, + FileReader: false, + find: false, + FocusEvent: false, + FontFace: false, + FormData: false, + frameElement: false, + frames: false, + GainNode: false, + Gamepad: false, + GamepadButton: false, + GamepadEvent: false, + getComputedStyle: false, + getSelection: false, + HashChangeEvent: false, + Headers: false, + History: false, + HTMLAllCollection: false, + HTMLAnchorElement: false, + HTMLAppletElement: false, + HTMLAreaElement: false, + HTMLAudioElement: false, + HTMLBaseElement: false, + HTMLBlockquoteElement: false, + HTMLBodyElement: false, + HTMLBRElement: false, + HTMLButtonElement: false, + HTMLCanvasElement: false, + HTMLCollection: false, + HTMLContentElement: false, + HTMLDataListElement: false, + HTMLDetailsElement: false, + HTMLDialogElement: false, + HTMLDirectoryElement: false, + HTMLDivElement: false, + HTMLDListElement: false, + HTMLDocument: false, + HTMLElement: false, + HTMLEmbedElement: false, + HTMLFieldSetElement: false, + HTMLFontElement: false, + HTMLFormControlsCollection: false, + HTMLFormElement: false, + HTMLFrameElement: false, + HTMLFrameSetElement: false, + HTMLHeadElement: false, + HTMLHeadingElement: false, + HTMLHRElement: false, + HTMLHtmlElement: false, + HTMLIFrameElement: false, + HTMLImageElement: false, + HTMLInputElement: false, + HTMLIsIndexElement: false, + HTMLKeygenElement: false, + HTMLLabelElement: false, + HTMLLayerElement: false, + HTMLLegendElement: false, + HTMLLIElement: false, + HTMLLinkElement: false, + HTMLMapElement: false, + HTMLMarqueeElement: false, + HTMLMediaElement: false, + HTMLMenuElement: false, + HTMLMetaElement: false, + HTMLMeterElement: false, + HTMLModElement: false, + HTMLObjectElement: false, + HTMLOListElement: false, + HTMLOptGroupElement: false, + HTMLOptionElement: false, + HTMLOptionsCollection: false, + HTMLOutputElement: false, + HTMLParagraphElement: false, + HTMLParamElement: false, + HTMLPictureElement: false, + HTMLPreElement: false, + HTMLProgressElement: false, + HTMLQuoteElement: false, + HTMLScriptElement: false, + HTMLSelectElement: false, + HTMLShadowElement: false, + HTMLSourceElement: false, + HTMLSpanElement: false, + HTMLStyleElement: false, + HTMLTableCaptionElement: false, + HTMLTableCellElement: false, + HTMLTableColElement: false, + HTMLTableElement: false, + HTMLTableRowElement: false, + HTMLTableSectionElement: false, + HTMLTemplateElement: false, + HTMLTextAreaElement: false, + HTMLTitleElement: false, + HTMLTrackElement: false, + HTMLUListElement: false, + HTMLUnknownElement: false, + HTMLVideoElement: false, + IDBCursor: false, + IDBCursorWithValue: false, + IDBDatabase: false, + IDBEnvironment: false, + IDBFactory: false, + IDBIndex: false, + IDBKeyRange: false, + IDBObjectStore: false, + IDBOpenDBRequest: false, + IDBRequest: false, + IDBTransaction: false, + IDBVersionChangeEvent: false, + Image: false, + ImageBitmap: false, + ImageData: false, + indexedDB: false, + innerHeight: false, + innerWidth: false, + InputEvent: false, + InputMethodContext: false, + IntersectionObserver: false, + IntersectionObserverEntry: false, + Intl: false, + KeyboardEvent: false, + KeyframeEffect: false, + KeyframeEffectReadOnly: false, + localStorage: false, + Location: false, + locationbar: false, + matchMedia: false, + MediaElementAudioSourceNode: false, + MediaEncryptedEvent: false, + MediaError: false, + MediaKeyError: false, + MediaKeyEvent: false, + MediaKeyMessageEvent: false, + MediaKeys: false, + MediaKeySession: false, + MediaKeyStatusMap: false, + MediaKeySystemAccess: false, + MediaList: false, + MediaQueryList: false, + MediaQueryListEvent: false, + MediaSource: false, + MediaRecorder: false, + MediaStream: false, + MediaStreamAudioDestinationNode: false, + MediaStreamAudioSourceNode: false, + MediaStreamEvent: false, + MediaStreamTrack: false, + MessageChannel: false, + MessageEvent: false, + MessagePort: false, + MIDIAccess: false, + MIDIConnectionEvent: false, + MIDIInput: false, + MIDIInputMap: false, + MIDIMessageEvent: false, + MIDIOutput: false, + MIDIOutputMap: false, + MIDIPort: false, + MimeType: false, + MimeTypeArray: false, + MouseEvent: false, + moveBy: false, + moveTo: false, + MutationEvent: false, + MutationObserver: false, + MutationRecord: false, + NamedNodeMap: false, + navigator: false, + Navigator: false, + Node: false, + NodeFilter: false, + NodeIterator: false, + NodeList: false, + Notification: false, + OfflineAudioCompletionEvent: false, + OfflineAudioContext: false, + offscreenBuffering: false, + onbeforeunload: true, + openDatabase: false, + Option: false, + OscillatorNode: false, + outerHeight: false, + outerWidth: false, + PageTransitionEvent: false, + pageXOffset: false, + pageYOffset: false, + PasswordCredential: false, + Path2D: false, + Performance: false, + PerformanceEntry: false, + PerformanceMark: false, + PerformanceMeasure: false, + PerformanceNavigation: false, + PerformanceResourceTiming: false, + PerformanceTiming: false, + PeriodicWave: false, + Permissions: false, + PermissionStatus: false, + personalbar: false, + Plugin: false, + PluginArray: false, + PopStateEvent: false, + postMessage: false, + ProcessingInstruction: false, + ProgressEvent: false, + PromiseRejectionEvent: false, + prompt: false, + PushManager: false, + PushSubscription: false, + RadioNodeList: false, + Range: false, + ReadableByteStream: false, + ReadableStream: false, + removeEventListener: false, + Request: false, + requestAnimationFrame: false, + requestIdleCallback: false, + resizeBy: false, + resizeTo: false, + Response: false, + RTCIceCandidate: false, + RTCSessionDescription: false, + RTCPeerConnection: false, + Screen: false, + screenLeft: false, + ScreenOrientation: false, + screenTop: false, + screenX: false, + screenY: false, + ScriptProcessorNode: false, + scroll: false, + scrollbars: false, + scrollBy: false, + scrollTo: false, + scrollX: false, + scrollY: false, + SecurityPolicyViolationEvent: false, + Selection: false, + ServiceWorker: false, + ServiceWorkerContainer: false, + ServiceWorkerRegistration: false, + sessionStorage: false, + setInterval: false, + setTimeout: false, + ShadowRoot: false, + SharedKeyframeList: false, + SharedWorker: false, + showModalDialog: false, + SiteBoundCredential: false, + speechSynthesis: false, + SpeechSynthesisEvent: false, + SpeechSynthesisUtterance: false, + Storage: false, + StorageEvent: false, + styleMedia: false, + StyleSheet: false, + StyleSheetList: false, + SubtleCrypto: false, + SVGAElement: false, + SVGAltGlyphDefElement: false, + SVGAltGlyphElement: false, + SVGAltGlyphItemElement: false, + SVGAngle: false, + SVGAnimateColorElement: false, + SVGAnimatedAngle: false, + SVGAnimatedBoolean: false, + SVGAnimatedEnumeration: false, + SVGAnimatedInteger: false, + SVGAnimatedLength: false, + SVGAnimatedLengthList: false, + SVGAnimatedNumber: false, + SVGAnimatedNumberList: false, + SVGAnimatedPathData: false, + SVGAnimatedPoints: false, + SVGAnimatedPreserveAspectRatio: false, + SVGAnimatedRect: false, + SVGAnimatedString: false, + SVGAnimatedTransformList: false, + SVGAnimateElement: false, + SVGAnimateMotionElement: false, + SVGAnimateTransformElement: false, + SVGAnimationElement: false, + SVGCircleElement: false, + SVGClipPathElement: false, + SVGColor: false, + SVGColorProfileElement: false, + SVGColorProfileRule: false, + SVGComponentTransferFunctionElement: false, + SVGCSSRule: false, + SVGCursorElement: false, + SVGDefsElement: false, + SVGDescElement: false, + SVGDiscardElement: false, + SVGDocument: false, + SVGElement: false, + SVGElementInstance: false, + SVGElementInstanceList: false, + SVGEllipseElement: false, + SVGEvent: false, + SVGExternalResourcesRequired: false, + SVGFEBlendElement: false, + SVGFEColorMatrixElement: false, + SVGFEComponentTransferElement: false, + SVGFECompositeElement: false, + SVGFEConvolveMatrixElement: false, + SVGFEDiffuseLightingElement: false, + SVGFEDisplacementMapElement: false, + SVGFEDistantLightElement: false, + SVGFEDropShadowElement: false, + SVGFEFloodElement: false, + SVGFEFuncAElement: false, + SVGFEFuncBElement: false, + SVGFEFuncGElement: false, + SVGFEFuncRElement: false, + SVGFEGaussianBlurElement: false, + SVGFEImageElement: false, + SVGFEMergeElement: false, + SVGFEMergeNodeElement: false, + SVGFEMorphologyElement: false, + SVGFEOffsetElement: false, + SVGFEPointLightElement: false, + SVGFESpecularLightingElement: false, + SVGFESpotLightElement: false, + SVGFETileElement: false, + SVGFETurbulenceElement: false, + SVGFilterElement: false, + SVGFilterPrimitiveStandardAttributes: false, + SVGFitToViewBox: false, + SVGFontElement: false, + SVGFontFaceElement: false, + SVGFontFaceFormatElement: false, + SVGFontFaceNameElement: false, + SVGFontFaceSrcElement: false, + SVGFontFaceUriElement: false, + SVGForeignObjectElement: false, + SVGGElement: false, + SVGGeometryElement: false, + SVGGlyphElement: false, + SVGGlyphRefElement: false, + SVGGradientElement: false, + SVGGraphicsElement: false, + SVGHKernElement: false, + SVGICCColor: false, + SVGImageElement: false, + SVGLangSpace: false, + SVGLength: false, + SVGLengthList: false, + SVGLinearGradientElement: false, + SVGLineElement: false, + SVGLocatable: false, + SVGMarkerElement: false, + SVGMaskElement: false, + SVGMatrix: false, + SVGMetadataElement: false, + SVGMissingGlyphElement: false, + SVGMPathElement: false, + SVGNumber: false, + SVGNumberList: false, + SVGPaint: false, + SVGPathElement: false, + SVGPathSeg: false, + SVGPathSegArcAbs: false, + SVGPathSegArcRel: false, + SVGPathSegClosePath: false, + SVGPathSegCurvetoCubicAbs: false, + SVGPathSegCurvetoCubicRel: false, + SVGPathSegCurvetoCubicSmoothAbs: false, + SVGPathSegCurvetoCubicSmoothRel: false, + SVGPathSegCurvetoQuadraticAbs: false, + SVGPathSegCurvetoQuadraticRel: false, + SVGPathSegCurvetoQuadraticSmoothAbs: false, + SVGPathSegCurvetoQuadraticSmoothRel: false, + SVGPathSegLinetoAbs: false, + SVGPathSegLinetoHorizontalAbs: false, + SVGPathSegLinetoHorizontalRel: false, + SVGPathSegLinetoRel: false, + SVGPathSegLinetoVerticalAbs: false, + SVGPathSegLinetoVerticalRel: false, + SVGPathSegList: false, + SVGPathSegMovetoAbs: false, + SVGPathSegMovetoRel: false, + SVGPatternElement: false, + SVGPoint: false, + SVGPointList: false, + SVGPolygonElement: false, + SVGPolylineElement: false, + SVGPreserveAspectRatio: false, + SVGRadialGradientElement: false, + SVGRect: false, + SVGRectElement: false, + SVGRenderingIntent: false, + SVGScriptElement: false, + SVGSetElement: false, + SVGStopElement: false, + SVGStringList: false, + SVGStylable: false, + SVGStyleElement: false, + SVGSVGElement: false, + SVGSwitchElement: false, + SVGSymbolElement: false, + SVGTests: false, + SVGTextContentElement: false, + SVGTextElement: false, + SVGTextPathElement: false, + SVGTextPositioningElement: false, + SVGTitleElement: false, + SVGTransform: false, + SVGTransformable: false, + SVGTransformList: false, + SVGTRefElement: false, + SVGTSpanElement: false, + SVGUnitTypes: false, + SVGURIReference: false, + SVGUseElement: false, + SVGViewElement: false, + SVGViewSpec: false, + SVGVKernElement: false, + SVGZoomAndPan: false, + SVGZoomEvent: false, + Text: false, + TextDecoder: false, + TextEncoder: false, + TextEvent: false, + TextMetrics: false, + TextTrack: false, + TextTrackCue: false, + TextTrackCueList: false, + TextTrackList: false, + TimeEvent: false, + TimeRanges: false, + toolbar: false, + Touch: false, + TouchEvent: false, + TouchList: false, + TrackEvent: false, + TransitionEvent: false, + TreeWalker: false, + UIEvent: false, + URL: false, + URLSearchParams: false, + ValidityState: false, + VTTCue: false, + WaveShaperNode: false, + WebGLActiveInfo: false, + WebGLBuffer: false, + WebGLContextEvent: false, + WebGLFramebuffer: false, + WebGLProgram: false, + WebGLRenderbuffer: false, + WebGLRenderingContext: false, + WebGLShader: false, + WebGLShaderPrecisionFormat: false, + WebGLTexture: false, + WebGLUniformLocation: false, + WebSocket: false, + WheelEvent: false, + window: false, + Window: false, + Worker: false, + XDomainRequest: false, + XMLDocument: false, + XMLHttpRequest: false, + XMLHttpRequestEventTarget: false, + XMLHttpRequestProgressEvent: false, + XMLHttpRequestUpload: false, + XMLSerializer: false, + XPathEvaluator: false, + XPathException: false, + XPathExpression: false, + XPathNamespace: false, + XPathNSResolver: false, + XPathResult: false, + XSLTProcessor: false, + }, + parserOptions: { ecmaVersion: 6, sourceType: 'module', From 854f7c6b77dc5a82ba52a666e1d930cdcfcafe5d Mon Sep 17 00:00:00 2001 From: Siddharth Doshi Date: Sat, 13 May 2017 11:49:57 +0530 Subject: [PATCH 2/5] Blacklist globals --- packages/eslint-config-react-app/index.js | 633 ++---------------- packages/eslint-config-react-app/package.json | 3 + 2 files changed, 44 insertions(+), 592 deletions(-) diff --git a/packages/eslint-config-react-app/index.js b/packages/eslint-config-react-app/index.js index 8c0010f7a1e..c4f94228ac8 100644 --- a/packages/eslint-config-react-app/index.js +++ b/packages/eslint-config-react-app/index.js @@ -18,6 +18,46 @@ // In the future, we might create a separate list of rules for production. // It would probably be more strict. +// The global scope is polluted with lots of confusing variables which are +// likely to be used generally without being thought of as a global +// For eg:- name, status +// And as these globals are ignored by Eslint it would not warn user in case of +// error, for example if user tries to do `console.log(name)` without ever +// defining name, no error would be shown as `name` is a considered global by +// eslint. +// So we blacklist confusing globals. +var globals = require('globals'); +var customGlobals = Object.assign({}, globals.browser); +var blackListedGlobals = [ + 'close', + 'closed', + 'focus', + 'history', + 'length', + 'location', + 'menubar', + 'name', + 'open', + 'onblur', + 'onerror', + 'onfocus', + 'onload', + 'onresize', + 'onunload', + 'opener', + 'opera', + 'parent', + 'performance', + 'print', + 'screen', + 'self', + 'status', + 'statusbar', + 'stop', + 'top', +]; +blackListedGlobals.forEach(global => delete customGlobals[global]); + module.exports = { root: true, @@ -32,598 +72,7 @@ module.exports = { node: true, }, - globals: { - addEventListener: false, - alert: false, - AnalyserNode: false, - Animation: false, - AnimationEffectReadOnly: false, - AnimationEffectTiming: false, - AnimationEffectTimingReadOnly: false, - AnimationEvent: false, - AnimationPlaybackEvent: false, - AnimationTimeline: false, - applicationCache: false, - ApplicationCache: false, - ApplicationCacheErrorEvent: false, - atob: false, - Attr: false, - Audio: false, - AudioBuffer: false, - AudioBufferSourceNode: false, - AudioContext: false, - AudioDestinationNode: false, - AudioListener: false, - AudioNode: false, - AudioParam: false, - AudioProcessingEvent: false, - AutocompleteErrorEvent: false, - BarProp: false, - BatteryManager: false, - BeforeUnloadEvent: false, - BiquadFilterNode: false, - Blob: false, - blur: false, - btoa: false, - Cache: false, - caches: false, - CacheStorage: false, - cancelAnimationFrame: false, - CanvasGradient: false, - CanvasPattern: false, - CanvasRenderingContext2D: false, - CDATASection: false, - ChannelMergerNode: false, - ChannelSplitterNode: false, - CharacterData: false, - clearInterval: false, - clearTimeout: false, - clientInformation: false, - ClientRect: false, - ClientRectList: false, - ClipboardEvent: false, - CloseEvent: false, - Comment: false, - CompositionEvent: false, - confirm: false, - console: false, - ConvolverNode: false, - Credential: false, - CredentialsContainer: false, - crypto: false, - Crypto: false, - CryptoKey: false, - CSS: false, - CSSAnimation: false, - CSSFontFaceRule: false, - CSSImportRule: false, - CSSKeyframeRule: false, - CSSKeyframesRule: false, - CSSMediaRule: false, - CSSPageRule: false, - CSSRule: false, - CSSRuleList: false, - CSSStyleDeclaration: false, - CSSStyleRule: false, - CSSStyleSheet: false, - CSSSupportsRule: false, - CSSTransition: false, - CSSUnknownRule: false, - CSSViewportRule: false, - customElements: false, - CustomEvent: false, - DataTransfer: false, - DataTransferItem: false, - DataTransferItemList: false, - Debug: false, - defaultStatus: false, - defaultstatus: false, - DelayNode: false, - DeviceMotionEvent: false, - DeviceOrientationEvent: false, - devicePixelRatio: false, - dispatchEvent: false, - document: false, - Document: false, - DocumentFragment: false, - DocumentTimeline: false, - DocumentType: false, - DOMError: false, - DOMException: false, - DOMImplementation: false, - DOMParser: false, - DOMSettableTokenList: false, - DOMStringList: false, - DOMStringMap: false, - DOMTokenList: false, - DragEvent: false, - DynamicsCompressorNode: false, - Element: false, - ElementTimeControl: false, - ErrorEvent: false, - event: false, - Event: false, - EventSource: false, - EventTarget: false, - external: false, - FederatedCredential: false, - fetch: false, - File: false, - FileError: false, - FileList: false, - FileReader: false, - find: false, - FocusEvent: false, - FontFace: false, - FormData: false, - frameElement: false, - frames: false, - GainNode: false, - Gamepad: false, - GamepadButton: false, - GamepadEvent: false, - getComputedStyle: false, - getSelection: false, - HashChangeEvent: false, - Headers: false, - History: false, - HTMLAllCollection: false, - HTMLAnchorElement: false, - HTMLAppletElement: false, - HTMLAreaElement: false, - HTMLAudioElement: false, - HTMLBaseElement: false, - HTMLBlockquoteElement: false, - HTMLBodyElement: false, - HTMLBRElement: false, - HTMLButtonElement: false, - HTMLCanvasElement: false, - HTMLCollection: false, - HTMLContentElement: false, - HTMLDataListElement: false, - HTMLDetailsElement: false, - HTMLDialogElement: false, - HTMLDirectoryElement: false, - HTMLDivElement: false, - HTMLDListElement: false, - HTMLDocument: false, - HTMLElement: false, - HTMLEmbedElement: false, - HTMLFieldSetElement: false, - HTMLFontElement: false, - HTMLFormControlsCollection: false, - HTMLFormElement: false, - HTMLFrameElement: false, - HTMLFrameSetElement: false, - HTMLHeadElement: false, - HTMLHeadingElement: false, - HTMLHRElement: false, - HTMLHtmlElement: false, - HTMLIFrameElement: false, - HTMLImageElement: false, - HTMLInputElement: false, - HTMLIsIndexElement: false, - HTMLKeygenElement: false, - HTMLLabelElement: false, - HTMLLayerElement: false, - HTMLLegendElement: false, - HTMLLIElement: false, - HTMLLinkElement: false, - HTMLMapElement: false, - HTMLMarqueeElement: false, - HTMLMediaElement: false, - HTMLMenuElement: false, - HTMLMetaElement: false, - HTMLMeterElement: false, - HTMLModElement: false, - HTMLObjectElement: false, - HTMLOListElement: false, - HTMLOptGroupElement: false, - HTMLOptionElement: false, - HTMLOptionsCollection: false, - HTMLOutputElement: false, - HTMLParagraphElement: false, - HTMLParamElement: false, - HTMLPictureElement: false, - HTMLPreElement: false, - HTMLProgressElement: false, - HTMLQuoteElement: false, - HTMLScriptElement: false, - HTMLSelectElement: false, - HTMLShadowElement: false, - HTMLSourceElement: false, - HTMLSpanElement: false, - HTMLStyleElement: false, - HTMLTableCaptionElement: false, - HTMLTableCellElement: false, - HTMLTableColElement: false, - HTMLTableElement: false, - HTMLTableRowElement: false, - HTMLTableSectionElement: false, - HTMLTemplateElement: false, - HTMLTextAreaElement: false, - HTMLTitleElement: false, - HTMLTrackElement: false, - HTMLUListElement: false, - HTMLUnknownElement: false, - HTMLVideoElement: false, - IDBCursor: false, - IDBCursorWithValue: false, - IDBDatabase: false, - IDBEnvironment: false, - IDBFactory: false, - IDBIndex: false, - IDBKeyRange: false, - IDBObjectStore: false, - IDBOpenDBRequest: false, - IDBRequest: false, - IDBTransaction: false, - IDBVersionChangeEvent: false, - Image: false, - ImageBitmap: false, - ImageData: false, - indexedDB: false, - innerHeight: false, - innerWidth: false, - InputEvent: false, - InputMethodContext: false, - IntersectionObserver: false, - IntersectionObserverEntry: false, - Intl: false, - KeyboardEvent: false, - KeyframeEffect: false, - KeyframeEffectReadOnly: false, - localStorage: false, - Location: false, - locationbar: false, - matchMedia: false, - MediaElementAudioSourceNode: false, - MediaEncryptedEvent: false, - MediaError: false, - MediaKeyError: false, - MediaKeyEvent: false, - MediaKeyMessageEvent: false, - MediaKeys: false, - MediaKeySession: false, - MediaKeyStatusMap: false, - MediaKeySystemAccess: false, - MediaList: false, - MediaQueryList: false, - MediaQueryListEvent: false, - MediaSource: false, - MediaRecorder: false, - MediaStream: false, - MediaStreamAudioDestinationNode: false, - MediaStreamAudioSourceNode: false, - MediaStreamEvent: false, - MediaStreamTrack: false, - MessageChannel: false, - MessageEvent: false, - MessagePort: false, - MIDIAccess: false, - MIDIConnectionEvent: false, - MIDIInput: false, - MIDIInputMap: false, - MIDIMessageEvent: false, - MIDIOutput: false, - MIDIOutputMap: false, - MIDIPort: false, - MimeType: false, - MimeTypeArray: false, - MouseEvent: false, - moveBy: false, - moveTo: false, - MutationEvent: false, - MutationObserver: false, - MutationRecord: false, - NamedNodeMap: false, - navigator: false, - Navigator: false, - Node: false, - NodeFilter: false, - NodeIterator: false, - NodeList: false, - Notification: false, - OfflineAudioCompletionEvent: false, - OfflineAudioContext: false, - offscreenBuffering: false, - onbeforeunload: true, - openDatabase: false, - Option: false, - OscillatorNode: false, - outerHeight: false, - outerWidth: false, - PageTransitionEvent: false, - pageXOffset: false, - pageYOffset: false, - PasswordCredential: false, - Path2D: false, - Performance: false, - PerformanceEntry: false, - PerformanceMark: false, - PerformanceMeasure: false, - PerformanceNavigation: false, - PerformanceResourceTiming: false, - PerformanceTiming: false, - PeriodicWave: false, - Permissions: false, - PermissionStatus: false, - personalbar: false, - Plugin: false, - PluginArray: false, - PopStateEvent: false, - postMessage: false, - ProcessingInstruction: false, - ProgressEvent: false, - PromiseRejectionEvent: false, - prompt: false, - PushManager: false, - PushSubscription: false, - RadioNodeList: false, - Range: false, - ReadableByteStream: false, - ReadableStream: false, - removeEventListener: false, - Request: false, - requestAnimationFrame: false, - requestIdleCallback: false, - resizeBy: false, - resizeTo: false, - Response: false, - RTCIceCandidate: false, - RTCSessionDescription: false, - RTCPeerConnection: false, - Screen: false, - screenLeft: false, - ScreenOrientation: false, - screenTop: false, - screenX: false, - screenY: false, - ScriptProcessorNode: false, - scroll: false, - scrollbars: false, - scrollBy: false, - scrollTo: false, - scrollX: false, - scrollY: false, - SecurityPolicyViolationEvent: false, - Selection: false, - ServiceWorker: false, - ServiceWorkerContainer: false, - ServiceWorkerRegistration: false, - sessionStorage: false, - setInterval: false, - setTimeout: false, - ShadowRoot: false, - SharedKeyframeList: false, - SharedWorker: false, - showModalDialog: false, - SiteBoundCredential: false, - speechSynthesis: false, - SpeechSynthesisEvent: false, - SpeechSynthesisUtterance: false, - Storage: false, - StorageEvent: false, - styleMedia: false, - StyleSheet: false, - StyleSheetList: false, - SubtleCrypto: false, - SVGAElement: false, - SVGAltGlyphDefElement: false, - SVGAltGlyphElement: false, - SVGAltGlyphItemElement: false, - SVGAngle: false, - SVGAnimateColorElement: false, - SVGAnimatedAngle: false, - SVGAnimatedBoolean: false, - SVGAnimatedEnumeration: false, - SVGAnimatedInteger: false, - SVGAnimatedLength: false, - SVGAnimatedLengthList: false, - SVGAnimatedNumber: false, - SVGAnimatedNumberList: false, - SVGAnimatedPathData: false, - SVGAnimatedPoints: false, - SVGAnimatedPreserveAspectRatio: false, - SVGAnimatedRect: false, - SVGAnimatedString: false, - SVGAnimatedTransformList: false, - SVGAnimateElement: false, - SVGAnimateMotionElement: false, - SVGAnimateTransformElement: false, - SVGAnimationElement: false, - SVGCircleElement: false, - SVGClipPathElement: false, - SVGColor: false, - SVGColorProfileElement: false, - SVGColorProfileRule: false, - SVGComponentTransferFunctionElement: false, - SVGCSSRule: false, - SVGCursorElement: false, - SVGDefsElement: false, - SVGDescElement: false, - SVGDiscardElement: false, - SVGDocument: false, - SVGElement: false, - SVGElementInstance: false, - SVGElementInstanceList: false, - SVGEllipseElement: false, - SVGEvent: false, - SVGExternalResourcesRequired: false, - SVGFEBlendElement: false, - SVGFEColorMatrixElement: false, - SVGFEComponentTransferElement: false, - SVGFECompositeElement: false, - SVGFEConvolveMatrixElement: false, - SVGFEDiffuseLightingElement: false, - SVGFEDisplacementMapElement: false, - SVGFEDistantLightElement: false, - SVGFEDropShadowElement: false, - SVGFEFloodElement: false, - SVGFEFuncAElement: false, - SVGFEFuncBElement: false, - SVGFEFuncGElement: false, - SVGFEFuncRElement: false, - SVGFEGaussianBlurElement: false, - SVGFEImageElement: false, - SVGFEMergeElement: false, - SVGFEMergeNodeElement: false, - SVGFEMorphologyElement: false, - SVGFEOffsetElement: false, - SVGFEPointLightElement: false, - SVGFESpecularLightingElement: false, - SVGFESpotLightElement: false, - SVGFETileElement: false, - SVGFETurbulenceElement: false, - SVGFilterElement: false, - SVGFilterPrimitiveStandardAttributes: false, - SVGFitToViewBox: false, - SVGFontElement: false, - SVGFontFaceElement: false, - SVGFontFaceFormatElement: false, - SVGFontFaceNameElement: false, - SVGFontFaceSrcElement: false, - SVGFontFaceUriElement: false, - SVGForeignObjectElement: false, - SVGGElement: false, - SVGGeometryElement: false, - SVGGlyphElement: false, - SVGGlyphRefElement: false, - SVGGradientElement: false, - SVGGraphicsElement: false, - SVGHKernElement: false, - SVGICCColor: false, - SVGImageElement: false, - SVGLangSpace: false, - SVGLength: false, - SVGLengthList: false, - SVGLinearGradientElement: false, - SVGLineElement: false, - SVGLocatable: false, - SVGMarkerElement: false, - SVGMaskElement: false, - SVGMatrix: false, - SVGMetadataElement: false, - SVGMissingGlyphElement: false, - SVGMPathElement: false, - SVGNumber: false, - SVGNumberList: false, - SVGPaint: false, - SVGPathElement: false, - SVGPathSeg: false, - SVGPathSegArcAbs: false, - SVGPathSegArcRel: false, - SVGPathSegClosePath: false, - SVGPathSegCurvetoCubicAbs: false, - SVGPathSegCurvetoCubicRel: false, - SVGPathSegCurvetoCubicSmoothAbs: false, - SVGPathSegCurvetoCubicSmoothRel: false, - SVGPathSegCurvetoQuadraticAbs: false, - SVGPathSegCurvetoQuadraticRel: false, - SVGPathSegCurvetoQuadraticSmoothAbs: false, - SVGPathSegCurvetoQuadraticSmoothRel: false, - SVGPathSegLinetoAbs: false, - SVGPathSegLinetoHorizontalAbs: false, - SVGPathSegLinetoHorizontalRel: false, - SVGPathSegLinetoRel: false, - SVGPathSegLinetoVerticalAbs: false, - SVGPathSegLinetoVerticalRel: false, - SVGPathSegList: false, - SVGPathSegMovetoAbs: false, - SVGPathSegMovetoRel: false, - SVGPatternElement: false, - SVGPoint: false, - SVGPointList: false, - SVGPolygonElement: false, - SVGPolylineElement: false, - SVGPreserveAspectRatio: false, - SVGRadialGradientElement: false, - SVGRect: false, - SVGRectElement: false, - SVGRenderingIntent: false, - SVGScriptElement: false, - SVGSetElement: false, - SVGStopElement: false, - SVGStringList: false, - SVGStylable: false, - SVGStyleElement: false, - SVGSVGElement: false, - SVGSwitchElement: false, - SVGSymbolElement: false, - SVGTests: false, - SVGTextContentElement: false, - SVGTextElement: false, - SVGTextPathElement: false, - SVGTextPositioningElement: false, - SVGTitleElement: false, - SVGTransform: false, - SVGTransformable: false, - SVGTransformList: false, - SVGTRefElement: false, - SVGTSpanElement: false, - SVGUnitTypes: false, - SVGURIReference: false, - SVGUseElement: false, - SVGViewElement: false, - SVGViewSpec: false, - SVGVKernElement: false, - SVGZoomAndPan: false, - SVGZoomEvent: false, - Text: false, - TextDecoder: false, - TextEncoder: false, - TextEvent: false, - TextMetrics: false, - TextTrack: false, - TextTrackCue: false, - TextTrackCueList: false, - TextTrackList: false, - TimeEvent: false, - TimeRanges: false, - toolbar: false, - Touch: false, - TouchEvent: false, - TouchList: false, - TrackEvent: false, - TransitionEvent: false, - TreeWalker: false, - UIEvent: false, - URL: false, - URLSearchParams: false, - ValidityState: false, - VTTCue: false, - WaveShaperNode: false, - WebGLActiveInfo: false, - WebGLBuffer: false, - WebGLContextEvent: false, - WebGLFramebuffer: false, - WebGLProgram: false, - WebGLRenderbuffer: false, - WebGLRenderingContext: false, - WebGLShader: false, - WebGLShaderPrecisionFormat: false, - WebGLTexture: false, - WebGLUniformLocation: false, - WebSocket: false, - WheelEvent: false, - window: false, - Window: false, - Worker: false, - XDomainRequest: false, - XMLDocument: false, - XMLHttpRequest: false, - XMLHttpRequestEventTarget: false, - XMLHttpRequestProgressEvent: false, - XMLHttpRequestUpload: false, - XMLSerializer: false, - XPathEvaluator: false, - XPathException: false, - XPathExpression: false, - XPathNamespace: false, - XPathNSResolver: false, - XPathResult: false, - XSLTProcessor: false, - }, + globals: customGlobals, parserOptions: { ecmaVersion: 6, diff --git a/packages/eslint-config-react-app/package.json b/packages/eslint-config-react-app/package.json index 855713e4f46..ca46483b3ce 100644 --- a/packages/eslint-config-react-app/package.json +++ b/packages/eslint-config-react-app/package.json @@ -17,5 +17,8 @@ "eslint-plugin-import": "^2.0.1", "eslint-plugin-jsx-a11y": "^2.0.0 || ^3.0.0 || ^4.0.0", "eslint-plugin-react": "^6.4.1" + }, + "dependencies": { + "globals": "^9.17.0" } } From 54ab0dfb517f82bc4a959f22bd92d7615d51922d Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sun, 14 May 2017 19:19:18 +0100 Subject: [PATCH 3/5] Fix kitchensink test to lint --- packages/react-scripts/fixtures/kitchensink/src/App.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-scripts/fixtures/kitchensink/src/App.js b/packages/react-scripts/fixtures/kitchensink/src/App.js index 3e57c3c5a79..3a1981a4000 100644 --- a/packages/react-scripts/fixtures/kitchensink/src/App.js +++ b/packages/react-scripts/fixtures/kitchensink/src/App.js @@ -54,7 +54,7 @@ class App extends Component { } componentDidMount() { - const feature = location.hash.slice(1); + const feature = window.location.hash.slice(1); switch (feature) { case 'array-destructuring': import( From c5e4c0573dc08ab060b7adae10c5b64d52522dab Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sun, 14 May 2017 19:38:00 +0100 Subject: [PATCH 4/5] Edit the list --- packages/eslint-config-react-app/index.js | 53 ++++++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/packages/eslint-config-react-app/index.js b/packages/eslint-config-react-app/index.js index c4f94228ac8..4c8439a333b 100644 --- a/packages/eslint-config-react-app/index.js +++ b/packages/eslint-config-react-app/index.js @@ -18,45 +18,74 @@ // In the future, we might create a separate list of rules for production. // It would probably be more strict. -// The global scope is polluted with lots of confusing variables which are -// likely to be used generally without being thought of as a global -// For eg:- name, status -// And as these globals are ignored by Eslint it would not warn user in case of -// error, for example if user tries to do `console.log(name)` without ever -// defining name, no error would be shown as `name` is a considered global by -// eslint. -// So we blacklist confusing globals. +// The ESLint browser environment defines all browser globals as valid, +// even though most people don't know some of them exist (e.g. `name` or `status`). +// This is dangerous as it hides accidentally undefined variables. +// We blacklist the globals that we deem potentially confusing. +// To use them, explicitly reference them, e.g. `window.name` or `window.status`. var globals = require('globals'); var customGlobals = Object.assign({}, globals.browser); -var blackListedGlobals = [ +var excludedGlobals = [ + 'addEventListener', + 'blur', 'close', 'closed', + 'confirm', + 'defaultStatus', + 'defaultstatus', + 'event', + 'external', + 'find', 'focus', + 'frameElement', + 'frames', 'history', + 'innerHeight', + 'innerWidth', 'length', 'location', + 'locationbar', 'menubar', + 'moveBy', + 'moveTo', 'name', - 'open', 'onblur', 'onerror', 'onfocus', 'onload', 'onresize', 'onunload', + 'open', 'opener', 'opera', + 'outerHeight', + 'outerWidth', + 'pageXOffset', + 'pageYOffset', 'parent', - 'performance', 'print', + 'removeEventListener', + 'resizeBy', + 'resizeTo', 'screen', + 'screenLeft', + 'screenTop', + 'screenX', + 'screenY', + 'scroll', + 'scrollbars', + 'scrollBy', + 'scrollTo', + 'scrollX', + 'scrollY', 'self', 'status', 'statusbar', 'stop', + 'toolbar', 'top', ]; -blackListedGlobals.forEach(global => delete customGlobals[global]); +excludedGlobals.forEach(global => delete customGlobals[global]); module.exports = { root: true, From 8a6399c2994ca2550f8fe3e9797f6c7166df8c6c Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sun, 14 May 2017 19:44:02 +0100 Subject: [PATCH 5/5] Use no-restricted globals for this --- packages/eslint-config-react-app/index.js | 10 +++------- packages/eslint-config-react-app/package.json | 3 --- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/eslint-config-react-app/index.js b/packages/eslint-config-react-app/index.js index 4c8439a333b..c31e46cc111 100644 --- a/packages/eslint-config-react-app/index.js +++ b/packages/eslint-config-react-app/index.js @@ -23,9 +23,7 @@ // This is dangerous as it hides accidentally undefined variables. // We blacklist the globals that we deem potentially confusing. // To use them, explicitly reference them, e.g. `window.name` or `window.status`. -var globals = require('globals'); -var customGlobals = Object.assign({}, globals.browser); -var excludedGlobals = [ +var restrictedGlobals = [ 'addEventListener', 'blur', 'close', @@ -85,7 +83,6 @@ var excludedGlobals = [ 'toolbar', 'top', ]; -excludedGlobals.forEach(global => delete customGlobals[global]); module.exports = { root: true, @@ -95,14 +92,13 @@ module.exports = { plugins: ['import', 'flowtype', 'jsx-a11y', 'react'], env: { + browser: true, commonjs: true, es6: true, jest: true, node: true, }, - globals: customGlobals, - parserOptions: { ecmaVersion: 6, sourceType: 'module', @@ -191,7 +187,7 @@ module.exports = { 'no-this-before-super': 'warn', 'no-throw-literal': 'warn', 'no-undef': 'error', - 'no-restricted-globals': ['error', 'event'], + 'no-restricted-globals': ['error'].concat(restrictedGlobals), 'no-unexpected-multiline': 'warn', 'no-unreachable': 'warn', 'no-unused-expressions': [ diff --git a/packages/eslint-config-react-app/package.json b/packages/eslint-config-react-app/package.json index ca46483b3ce..855713e4f46 100644 --- a/packages/eslint-config-react-app/package.json +++ b/packages/eslint-config-react-app/package.json @@ -17,8 +17,5 @@ "eslint-plugin-import": "^2.0.1", "eslint-plugin-jsx-a11y": "^2.0.0 || ^3.0.0 || ^4.0.0", "eslint-plugin-react": "^6.4.1" - }, - "dependencies": { - "globals": "^9.17.0" } }