Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Summary: React Native bundler (aka Metro Bundler) was splitted from the main codebase some time ago (now it lives [[https://github.com/facebook/metro-bundler|here]]). To make it more agnostic, polyfills will be moved out from it, so people who doesn't need them does not include them. However, RN will still need them, so the first step is to copy them back to RN so that we can provide them to Metro Bundler later. We also include a way of passing the list of polyfills to include, as an `Array<string>`. The field is called `polyfills`, and defaults to the traditional list that is currently included in the package manager [see here](https://github.com/facebook/metro-bundler/blob/be1843cddcff78802cd774c8a75fe8647df0135d/packages/metro-bundler/src/defaults.js#L27-L37). In future commits, `metro-bundler` will be able to manage the `polyfills` array passed to it, and use it, instead of the pre-defined ones. Reviewed By: davidaurelio Differential Revision: D5381614 fbshipit-source-id: 749d536b781843ecb3067803e44398cd6df941f1
- Loading branch information
1 parent
88fb45d
commit ad0fe15
Showing
12 changed files
with
1,436 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/** | ||
* 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. | ||
* | ||
* @polyfill | ||
*/ | ||
|
||
/* eslint-disable */ | ||
|
||
/** | ||
* Creates an array from array like objects. | ||
* | ||
* https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from | ||
*/ | ||
if (!Array.from) { | ||
Array.from = function(arrayLike /*, mapFn, thisArg */) { | ||
if (arrayLike == null) { | ||
throw new TypeError('Object is null or undefined'); | ||
} | ||
|
||
// Optional args. | ||
var mapFn = arguments[1]; | ||
var thisArg = arguments[2]; | ||
|
||
var C = this; | ||
var items = Object(arrayLike); | ||
var symbolIterator = typeof Symbol === 'function' | ||
? Symbol.iterator | ||
: '@@iterator'; | ||
var mapping = typeof mapFn === 'function'; | ||
var usingIterator = typeof items[symbolIterator] === 'function'; | ||
var key = 0; | ||
var ret; | ||
var value; | ||
|
||
if (usingIterator) { | ||
ret = typeof C === 'function' | ||
? new C() | ||
: []; | ||
var it = items[symbolIterator](); | ||
var next; | ||
|
||
while (!(next = it.next()).done) { | ||
value = next.value; | ||
|
||
if (mapping) { | ||
value = mapFn.call(thisArg, value, key); | ||
} | ||
|
||
ret[key] = value; | ||
key += 1; | ||
} | ||
|
||
ret.length = key; | ||
return ret; | ||
} | ||
|
||
var len = items.length; | ||
if (isNaN(len) || len < 0) { | ||
len = 0; | ||
} | ||
|
||
ret = typeof C === 'function' | ||
? new C(len) | ||
: new Array(len); | ||
|
||
while (key < len) { | ||
value = items[key]; | ||
|
||
if (mapping) { | ||
value = mapFn.call(thisArg, value, key); | ||
} | ||
|
||
ret[key] = value; | ||
|
||
key += 1; | ||
} | ||
|
||
ret.length = key; | ||
return ret; | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/** | ||
* Copyright (c) 2015-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. | ||
* | ||
* @polyfill | ||
*/ | ||
|
||
/* eslint-disable */ | ||
|
||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex | ||
function findIndex(predicate, context) { | ||
if (this == null) { | ||
throw new TypeError( | ||
'Array.prototype.findIndex called on null or undefined' | ||
); | ||
} | ||
if (typeof predicate !== 'function') { | ||
throw new TypeError('predicate must be a function'); | ||
} | ||
var list = Object(this); | ||
var length = list.length >>> 0; | ||
for (var i = 0; i < length; i++) { | ||
if (predicate.call(context, list[i], i, list)) { | ||
return i; | ||
} | ||
} | ||
return -1; | ||
} | ||
|
||
if (!Array.prototype.findIndex) { | ||
Object.defineProperty(Array.prototype, 'findIndex', { | ||
enumerable: false, | ||
writable: true, | ||
configurable: true, | ||
value: findIndex | ||
}); | ||
} | ||
|
||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find | ||
if (!Array.prototype.find) { | ||
Object.defineProperty(Array.prototype, 'find', { | ||
enumerable: false, | ||
writable: true, | ||
configurable: true, | ||
value: function(predicate, context) { | ||
if (this == null) { | ||
throw new TypeError( | ||
'Array.prototype.find called on null or undefined' | ||
); | ||
} | ||
var index = findIndex.call(this, predicate, context); | ||
return index === -1 ? undefined : this[index]; | ||
} | ||
}); | ||
} | ||
|
||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes | ||
if (!Array.prototype.includes) { | ||
Object.defineProperty(Array.prototype, 'includes', { | ||
enumerable: false, | ||
writable: true, | ||
configurable: true, | ||
value: function (searchElement) { | ||
var O = Object(this); | ||
var len = parseInt(O.length) || 0; | ||
if (len === 0) { | ||
return false; | ||
} | ||
var n = parseInt(arguments[1]) || 0; | ||
var k; | ||
if (n >= 0) { | ||
k = n; | ||
} else { | ||
k = len + n; | ||
if (k < 0) { | ||
k = 0; | ||
} | ||
} | ||
var currentElement; | ||
while (k < len) { | ||
currentElement = O[k]; | ||
if (searchElement === currentElement || | ||
(searchElement !== searchElement && currentElement !== currentElement)) { | ||
return true; | ||
} | ||
k++; | ||
} | ||
return false; | ||
} | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/** | ||
* Copyright (c) 2015-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. | ||
* | ||
* @polyfill | ||
*/ | ||
|
||
/* eslint-disable strict */ | ||
|
||
if (Number.EPSILON === undefined) { | ||
Object.defineProperty(Number, 'EPSILON', { | ||
value: Math.pow(2, -52), | ||
}); | ||
} | ||
if (Number.MAX_SAFE_INTEGER === undefined) { | ||
Object.defineProperty(Number, 'MAX_SAFE_INTEGER', { | ||
value: Math.pow(2, 53) - 1, | ||
}); | ||
} | ||
if (Number.MIN_SAFE_INTEGER === undefined) { | ||
Object.defineProperty(Number, 'MIN_SAFE_INTEGER', { | ||
value: -(Math.pow(2, 53) - 1), | ||
}); | ||
} | ||
if (!Number.isNaN) { | ||
// eslint-disable-next-line max-len | ||
// 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, | ||
}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/** | ||
* Copyright (c) 2015-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. | ||
* | ||
* @polyfill | ||
*/ | ||
|
||
/* eslint-disable strict */ | ||
|
||
// WARNING: This is an optimized version that fails on hasOwnProperty checks | ||
// and non objects. It's not spec-compliant. It's a perf optimization. | ||
// This is only needed for iOS 8 and current Android JSC. | ||
|
||
Object.assign = function(target, sources) { | ||
if (__DEV__) { | ||
if (target == null) { | ||
throw new TypeError('Object.assign target cannot be null or undefined'); | ||
} | ||
if (typeof target !== 'object' && typeof target !== 'function') { | ||
throw new TypeError( | ||
'In this environment the target of assign MUST be an object.' + | ||
'This error is a performance optimization and not spec compliant.' | ||
); | ||
} | ||
} | ||
|
||
for (var nextIndex = 1; nextIndex < arguments.length; nextIndex++) { | ||
var nextSource = arguments[nextIndex]; | ||
if (nextSource == null) { | ||
continue; | ||
} | ||
|
||
if (__DEV__) { | ||
if (typeof nextSource !== 'object' && | ||
typeof nextSource !== 'function') { | ||
throw new TypeError( | ||
'In this environment the sources for assign MUST be an object.' + | ||
'This error is a performance optimization and not spec compliant.' | ||
); | ||
} | ||
} | ||
|
||
// We don't currently support accessors nor proxies. Therefore this | ||
// copy cannot throw. If we ever supported this then we must handle | ||
// exceptions and side-effects. | ||
|
||
for (var key in nextSource) { | ||
if (__DEV__) { | ||
var hasOwnProperty = Object.prototype.hasOwnProperty; | ||
if (!hasOwnProperty.call(nextSource, key)) { | ||
throw new TypeError( | ||
'One of the sources for assign has an enumerable key on the ' + | ||
'prototype chain. Are you trying to assign a prototype property? ' + | ||
'We don\'t allow it, as this is an edge case that we do not support. ' + | ||
'This error is a performance optimization and not spec compliant.' | ||
); | ||
} | ||
} | ||
target[key] = nextSource[key]; | ||
} | ||
} | ||
|
||
return target; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/** | ||
* Copyright (c) 2015-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. | ||
* | ||
* @polyfill | ||
*/ | ||
|
||
(function() { | ||
'use strict'; | ||
|
||
const hasOwnProperty = Object.prototype.hasOwnProperty; | ||
|
||
/** | ||
* Returns an array of the given object's own enumerable entries. | ||
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries | ||
*/ | ||
if (typeof Object.entries !== 'function') { | ||
Object.entries = function(object) { | ||
// `null` and `undefined` values are not allowed. | ||
if (object == null) { | ||
throw new TypeError('Object.entries called on non-object'); | ||
} | ||
|
||
const entries = []; | ||
for (const key in object) { | ||
if (hasOwnProperty.call(object, key)) { | ||
entries.push([key, object[key]]); | ||
} | ||
} | ||
return entries; | ||
}; | ||
} | ||
|
||
/** | ||
* Returns an array of the given object's own enumerable entries. | ||
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values | ||
*/ | ||
if (typeof Object.values !== 'function') { | ||
Object.values = function(object) { | ||
// `null` and `undefined` values are not allowed. | ||
if (object == null) { | ||
throw new TypeError('Object.values called on non-object'); | ||
} | ||
|
||
const values = []; | ||
for (const key in object) { | ||
if (hasOwnProperty.call(object, key)) { | ||
values.push(object[key]); | ||
} | ||
} | ||
return values; | ||
}; | ||
} | ||
|
||
})(); |
Oops, something went wrong.