diff --git a/packager/react-packager/src/Resolver/__tests__/Resolver-test.js b/packager/react-packager/src/Resolver/__tests__/Resolver-test.js index 971e94e6a..f53c69126 100644 --- a/packager/react-packager/src/Resolver/__tests__/Resolver-test.js +++ b/packager/react-packager/src/Resolver/__tests__/Resolver-test.js @@ -143,12 +143,21 @@ describe('Resolver', function() { 'polyfills/console.js' ], }, + { id: 'polyfills/Number.es6.js', + file: 'polyfills/Number.es6.js', + dependencies: [ + 'polyfills/polyfills.js', + 'polyfills/console.js', + 'polyfills/error-guard.js' + ], + }, { id: 'polyfills/String.prototype.es6.js', file: 'polyfills/String.prototype.es6.js', dependencies: [ 'polyfills/polyfills.js', 'polyfills/console.js', - 'polyfills/error-guard.js' + 'polyfills/error-guard.js', + 'polyfills/Number.es6.js', ], }, { id: 'polyfills/Array.prototype.es6.js', @@ -157,6 +166,7 @@ describe('Resolver', function() { 'polyfills/polyfills.js', 'polyfills/console.js', 'polyfills/error-guard.js', + 'polyfills/Number.es6.js', 'polyfills/String.prototype.es6.js', ], }, @@ -166,6 +176,7 @@ describe('Resolver', function() { 'polyfills/polyfills.js', 'polyfills/console.js', 'polyfills/error-guard.js', + 'polyfills/Number.es6.js', 'polyfills/String.prototype.es6.js', 'polyfills/Array.prototype.es6.js', ], @@ -176,6 +187,7 @@ describe('Resolver', function() { 'polyfills/polyfills.js', 'polyfills/console.js', 'polyfills/error-guard.js', + 'polyfills/Number.es6.js', 'polyfills/String.prototype.es6.js', 'polyfills/Array.prototype.es6.js', 'polyfills/Array.es6.js', @@ -187,6 +199,7 @@ describe('Resolver', function() { 'polyfills/polyfills.js', 'polyfills/console.js', 'polyfills/error-guard.js', + 'polyfills/Number.es6.js', 'polyfills/String.prototype.es6.js', 'polyfills/Array.prototype.es6.js', 'polyfills/Array.es6.js', @@ -251,6 +264,7 @@ describe('Resolver', function() { 'polyfills/polyfills.js', 'polyfills/console.js', 'polyfills/error-guard.js', + 'polyfills/Number.es6.js', 'polyfills/String.prototype.es6.js', 'polyfills/Array.prototype.es6.js', 'polyfills/Array.es6.js', diff --git a/packager/react-packager/src/Resolver/index.js b/packager/react-packager/src/Resolver/index.js index fd67201f3..f508c9b62 100644 --- a/packager/react-packager/src/Resolver/index.js +++ b/packager/react-packager/src/Resolver/index.js @@ -177,6 +177,7 @@ class Resolver { path.join(__dirname, 'polyfills/polyfills.js'), path.join(__dirname, 'polyfills/console.js'), path.join(__dirname, 'polyfills/error-guard.js'), + path.join(__dirname, 'polyfills/Number.es6.js'), path.join(__dirname, 'polyfills/String.prototype.es6.js'), path.join(__dirname, 'polyfills/Array.prototype.es6.js'), path.join(__dirname, 'polyfills/Array.es6.js'), diff --git a/packager/react-packager/src/Resolver/polyfills/Number.es6.js b/packager/react-packager/src/Resolver/polyfills/Number.es6.js new file mode 100644 index 000000000..333bfb946 --- /dev/null +++ b/packager/react-packager/src/Resolver/polyfills/Number.es6.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @provides Number.es6 + * @polyfill + */ + +if (!Number.isNaN) { + // https://github.com/dherman/tc39-codex-wiki/blob/master/data/es6/number/index.md#polyfill-for-numberisnan + const globalIsNaN = global.isNaN; + Object.defineProperty(Number, 'isNaN', { + configurable: true, + enumerable: false, + value: function isNaN(value) { + return typeof value === 'number' && globalIsNaN(value); + }, + writable: true, + }); +} diff --git a/packager/react-packager/src/Resolver/polyfills/__tests__/Number.es6.js b/packager/react-packager/src/Resolver/polyfills/__tests__/Number.es6.js new file mode 100644 index 000000000..44f93d0c1 --- /dev/null +++ b/packager/react-packager/src/Resolver/polyfills/__tests__/Number.es6.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @emails oncall+jsinfra + */ + +jest.autoMockOff(); + +describe('Number (ES6)', () => { + describe('isNaN()', () => { + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Examples + beforeEach(() => { + delete Number.isNaN; + jest.resetModuleRegistry(); + require('../Number.es6'); + }); + it('returns true when fed something that is not-a-number', () => { + [ + NaN, + Number.NaN, + 0 / 0, + ].forEach(value => expect(Number.isNaN(value)).toBe(true)); + }); + it('returns false when fed something other than not-a-number', () => { + [ + 'NaN', + undefined, + {}, + 'blabla', + true, + null, + 37, + '37', + '37.37', + '', + ' ', + ].forEach(value => expect(Number.isNaN(value)).toBe(false)); + }); + }); +});