82f2b76e25
We now use webpack instead of SystemJS, effectively bundling modules into one file (plus commons chunks) for every entry point. This results in a much smaller extension size (almost half). Furthermore we use yarn/npm even for extension run-time dependencies. This relieves us from manually vendoring and building dependencies. It's also easier to understand for new developers familiar with node.
276 lines
10 KiB
JavaScript
276 lines
10 KiB
JavaScript
'use strict';
|
|
var $ = require('./$')
|
|
, $export = require('./$.export')
|
|
, DESCRIPTORS = require('./$.descriptors')
|
|
, createDesc = require('./$.property-desc')
|
|
, html = require('./$.html')
|
|
, cel = require('./$.dom-create')
|
|
, has = require('./$.has')
|
|
, cof = require('./$.cof')
|
|
, invoke = require('./$.invoke')
|
|
, fails = require('./$.fails')
|
|
, anObject = require('./$.an-object')
|
|
, aFunction = require('./$.a-function')
|
|
, isObject = require('./$.is-object')
|
|
, toObject = require('./$.to-object')
|
|
, toIObject = require('./$.to-iobject')
|
|
, toInteger = require('./$.to-integer')
|
|
, toIndex = require('./$.to-index')
|
|
, toLength = require('./$.to-length')
|
|
, IObject = require('./$.iobject')
|
|
, IE_PROTO = require('./$.uid')('__proto__')
|
|
, createArrayMethod = require('./$.array-methods')
|
|
, arrayIndexOf = require('./$.array-includes')(false)
|
|
, ObjectProto = Object.prototype
|
|
, ArrayProto = Array.prototype
|
|
, arraySlice = ArrayProto.slice
|
|
, arrayJoin = ArrayProto.join
|
|
, defineProperty = $.setDesc
|
|
, getOwnDescriptor = $.getDesc
|
|
, defineProperties = $.setDescs
|
|
, factories = {}
|
|
, IE8_DOM_DEFINE;
|
|
|
|
if(!DESCRIPTORS){
|
|
IE8_DOM_DEFINE = !fails(function(){
|
|
return defineProperty(cel('div'), 'a', {get: function(){ return 7; }}).a != 7;
|
|
});
|
|
$.setDesc = function(O, P, Attributes){
|
|
if(IE8_DOM_DEFINE)try {
|
|
return defineProperty(O, P, Attributes);
|
|
} catch(e){ /* empty */ }
|
|
if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
|
|
if('value' in Attributes)anObject(O)[P] = Attributes.value;
|
|
return O;
|
|
};
|
|
$.getDesc = function(O, P){
|
|
if(IE8_DOM_DEFINE)try {
|
|
return getOwnDescriptor(O, P);
|
|
} catch(e){ /* empty */ }
|
|
if(has(O, P))return createDesc(!ObjectProto.propertyIsEnumerable.call(O, P), O[P]);
|
|
};
|
|
$.setDescs = defineProperties = function(O, Properties){
|
|
anObject(O);
|
|
var keys = $.getKeys(Properties)
|
|
, length = keys.length
|
|
, i = 0
|
|
, P;
|
|
while(length > i)$.setDesc(O, P = keys[i++], Properties[P]);
|
|
return O;
|
|
};
|
|
}
|
|
$export($export.S + $export.F * !DESCRIPTORS, 'Object', {
|
|
// 19.1.2.6 / 15.2.3.3 Object.getOwnPropertyDescriptor(O, P)
|
|
getOwnPropertyDescriptor: $.getDesc,
|
|
// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
|
|
defineProperty: $.setDesc,
|
|
// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
|
|
defineProperties: defineProperties
|
|
});
|
|
|
|
// IE 8- don't enum bug keys
|
|
var keys1 = ('constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,' +
|
|
'toLocaleString,toString,valueOf').split(',')
|
|
// Additional keys for getOwnPropertyNames
|
|
, keys2 = keys1.concat('length', 'prototype')
|
|
, keysLen1 = keys1.length;
|
|
|
|
// Create object with `null` prototype: use iframe Object with cleared prototype
|
|
var createDict = function(){
|
|
// Thrash, waste and sodomy: IE GC bug
|
|
var iframe = cel('iframe')
|
|
, i = keysLen1
|
|
, gt = '>'
|
|
, iframeDocument;
|
|
iframe.style.display = 'none';
|
|
html.appendChild(iframe);
|
|
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
|
|
// createDict = iframe.contentWindow.Object;
|
|
// html.removeChild(iframe);
|
|
iframeDocument = iframe.contentWindow.document;
|
|
iframeDocument.open();
|
|
iframeDocument.write('<script>document.F=Object</script' + gt);
|
|
iframeDocument.close();
|
|
createDict = iframeDocument.F;
|
|
while(i--)delete createDict.prototype[keys1[i]];
|
|
return createDict();
|
|
};
|
|
var createGetKeys = function(names, length){
|
|
return function(object){
|
|
var O = toIObject(object)
|
|
, i = 0
|
|
, result = []
|
|
, key;
|
|
for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
|
|
// Don't enum bug & hidden keys
|
|
while(length > i)if(has(O, key = names[i++])){
|
|
~arrayIndexOf(result, key) || result.push(key);
|
|
}
|
|
return result;
|
|
};
|
|
};
|
|
var Empty = function(){};
|
|
$export($export.S, 'Object', {
|
|
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
|
|
getPrototypeOf: $.getProto = $.getProto || function(O){
|
|
O = toObject(O);
|
|
if(has(O, IE_PROTO))return O[IE_PROTO];
|
|
if(typeof O.constructor == 'function' && O instanceof O.constructor){
|
|
return O.constructor.prototype;
|
|
} return O instanceof Object ? ObjectProto : null;
|
|
},
|
|
// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
|
|
getOwnPropertyNames: $.getNames = $.getNames || createGetKeys(keys2, keys2.length, true),
|
|
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
|
|
create: $.create = $.create || function(O, /*?*/Properties){
|
|
var result;
|
|
if(O !== null){
|
|
Empty.prototype = anObject(O);
|
|
result = new Empty();
|
|
Empty.prototype = null;
|
|
// add "__proto__" for Object.getPrototypeOf shim
|
|
result[IE_PROTO] = O;
|
|
} else result = createDict();
|
|
return Properties === undefined ? result : defineProperties(result, Properties);
|
|
},
|
|
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
|
|
keys: $.getKeys = $.getKeys || createGetKeys(keys1, keysLen1, false)
|
|
});
|
|
|
|
var construct = function(F, len, args){
|
|
if(!(len in factories)){
|
|
for(var n = [], i = 0; i < len; i++)n[i] = 'a[' + i + ']';
|
|
factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
|
|
}
|
|
return factories[len](F, args);
|
|
};
|
|
|
|
// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
|
|
$export($export.P, 'Function', {
|
|
bind: function bind(that /*, args... */){
|
|
var fn = aFunction(this)
|
|
, partArgs = arraySlice.call(arguments, 1);
|
|
var bound = function(/* args... */){
|
|
var args = partArgs.concat(arraySlice.call(arguments));
|
|
return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
|
|
};
|
|
if(isObject(fn.prototype))bound.prototype = fn.prototype;
|
|
return bound;
|
|
}
|
|
});
|
|
|
|
// fallback for not array-like ES3 strings and DOM objects
|
|
$export($export.P + $export.F * fails(function(){
|
|
if(html)arraySlice.call(html);
|
|
}), 'Array', {
|
|
slice: function(begin, end){
|
|
var len = toLength(this.length)
|
|
, klass = cof(this);
|
|
end = end === undefined ? len : end;
|
|
if(klass == 'Array')return arraySlice.call(this, begin, end);
|
|
var start = toIndex(begin, len)
|
|
, upTo = toIndex(end, len)
|
|
, size = toLength(upTo - start)
|
|
, cloned = Array(size)
|
|
, i = 0;
|
|
for(; i < size; i++)cloned[i] = klass == 'String'
|
|
? this.charAt(start + i)
|
|
: this[start + i];
|
|
return cloned;
|
|
}
|
|
});
|
|
$export($export.P + $export.F * (IObject != Object), 'Array', {
|
|
join: function join(separator){
|
|
return arrayJoin.call(IObject(this), separator === undefined ? ',' : separator);
|
|
}
|
|
});
|
|
|
|
// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
|
|
$export($export.S, 'Array', {isArray: require('./$.is-array')});
|
|
|
|
var createArrayReduce = function(isRight){
|
|
return function(callbackfn, memo){
|
|
aFunction(callbackfn);
|
|
var O = IObject(this)
|
|
, length = toLength(O.length)
|
|
, index = isRight ? length - 1 : 0
|
|
, i = isRight ? -1 : 1;
|
|
if(arguments.length < 2)for(;;){
|
|
if(index in O){
|
|
memo = O[index];
|
|
index += i;
|
|
break;
|
|
}
|
|
index += i;
|
|
if(isRight ? index < 0 : length <= index){
|
|
throw TypeError('Reduce of empty array with no initial value');
|
|
}
|
|
}
|
|
for(;isRight ? index >= 0 : length > index; index += i)if(index in O){
|
|
memo = callbackfn(memo, O[index], index, this);
|
|
}
|
|
return memo;
|
|
};
|
|
};
|
|
|
|
var methodize = function($fn){
|
|
return function(arg1/*, arg2 = undefined */){
|
|
return $fn(this, arg1, arguments[1]);
|
|
};
|
|
};
|
|
|
|
$export($export.P, 'Array', {
|
|
// 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
|
|
forEach: $.each = $.each || methodize(createArrayMethod(0)),
|
|
// 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
|
|
map: methodize(createArrayMethod(1)),
|
|
// 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
|
|
filter: methodize(createArrayMethod(2)),
|
|
// 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
|
|
some: methodize(createArrayMethod(3)),
|
|
// 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
|
|
every: methodize(createArrayMethod(4)),
|
|
// 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
|
|
reduce: createArrayReduce(false),
|
|
// 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
|
|
reduceRight: createArrayReduce(true),
|
|
// 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
|
|
indexOf: methodize(arrayIndexOf),
|
|
// 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
|
|
lastIndexOf: function(el, fromIndex /* = @[*-1] */){
|
|
var O = toIObject(this)
|
|
, length = toLength(O.length)
|
|
, index = length - 1;
|
|
if(arguments.length > 1)index = Math.min(index, toInteger(fromIndex));
|
|
if(index < 0)index = toLength(length + index);
|
|
for(;index >= 0; index--)if(index in O)if(O[index] === el)return index;
|
|
return -1;
|
|
}
|
|
});
|
|
|
|
// 20.3.3.1 / 15.9.4.4 Date.now()
|
|
$export($export.S, 'Date', {now: function(){ return +new Date; }});
|
|
|
|
var lz = function(num){
|
|
return num > 9 ? num : '0' + num;
|
|
};
|
|
|
|
// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
|
|
// PhantomJS / old WebKit has a broken implementations
|
|
$export($export.P + $export.F * (fails(function(){
|
|
return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';
|
|
}) || !fails(function(){
|
|
new Date(NaN).toISOString();
|
|
})), 'Date', {
|
|
toISOString: function toISOString(){
|
|
if(!isFinite(this))throw RangeError('Invalid time value');
|
|
var d = this
|
|
, y = d.getUTCFullYear()
|
|
, m = d.getUTCMilliseconds()
|
|
, s = y < 0 ? '-' : y > 9999 ? '+' : '';
|
|
return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +
|
|
'-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +
|
|
'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +
|
|
':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
|
|
}
|
|
}); |