systemjs/lib/proto.js
2016-04-01 10:22:26 -06:00

134 lines
3.5 KiB
JavaScript

// SystemJS Loader Class and Extension helpers
function SystemJSLoader() {
SystemLoader.call(this);
systemJSConstructor.call(this);
}
// inline Object.create-style class extension
function SystemProto() {};
SystemProto.prototype = SystemLoader.prototype;
SystemJSLoader.prototype = new SystemProto();
SystemJSLoader.prototype.constructor = SystemJSLoader;
// remove ESML instantiate
SystemJSLoader.prototype.instantiate = function() {};
var systemJSConstructor;
function hook(name, hook) {
SystemJSLoader.prototype[name] = hook(SystemJSLoader.prototype[name] || function() {});
}
function hookConstructor(hook) {
systemJSConstructor = hook(systemJSConstructor || function() {});
}
function dedupe(deps) {
var newDeps = [];
for (var i = 0, l = deps.length; i < l; i++)
if (indexOf.call(newDeps, deps[i]) == -1)
newDeps.push(deps[i])
return newDeps;
}
function group(deps) {
var names = [];
var indices = [];
for (var i = 0, l = deps.length; i < l; i++) {
var index = indexOf.call(names, deps[i]);
if (index === -1) {
names.push(deps[i]);
indices.push([i]);
}
else {
indices[index].push(i);
}
}
return { names: names, indices: indices };
}
var getOwnPropertyDescriptor = true;
try {
Object.getOwnPropertyDescriptor({ a: 0 }, 'a');
}
catch(e) {
getOwnPropertyDescriptor = false;
}
// converts any module.exports object into an object ready for SystemJS.newModule
function getESModule(exports) {
var esModule = {};
// don't trigger getters/setters in environments that support them
if (typeof exports == 'object' || typeof exports == 'function') {
var hasOwnProperty = exports && exports.hasOwnProperty;
if (getOwnPropertyDescriptor) {
for (var p in exports) {
if (!trySilentDefineProperty(esModule, exports, p))
setPropertyIfHasOwnProperty(esModule, exports, p, hasOwnProperty);
}
}
else {
for (var p in exports)
setPropertyIfHasOwnProperty(esModule, exports, p, hasOwnProperty);
}
}
esModule['default'] = exports;
defineProperty(esModule, '__useDefault', {
value: true
});
return esModule;
}
function setPropertyIfHasOwnProperty(targetObj, sourceObj, propName, hasOwnProperty) {
if (!hasOwnProperty || sourceObj.hasOwnProperty(propName))
targetObj[propName] = sourceObj[propName];
}
function trySilentDefineProperty(targetObj, sourceObj, propName) {
try {
var d;
if (d = Object.getOwnPropertyDescriptor(sourceObj, propName))
defineProperty(targetObj, propName, d);
return true;
} catch (ex) {
// Object.getOwnPropertyDescriptor threw an exception, fall back to normal set property.
return false;
}
}
function extend(a, b, prepend) {
for (var p in b) {
if (!prepend || !(p in a))
a[p] = b[p];
}
return a;
}
// package configuration options
var packageProperties = ['main', 'format', 'defaultExtension', 'meta', 'map', 'basePath', 'depCache'];
// meta first-level extends where:
// array + array appends
// object + object extends
// other properties replace
function extendMeta(a, b, prepend) {
for (var p in b) {
var val = b[p];
if (!(p in a))
a[p] = val;
else if (val instanceof Array && a[p] instanceof Array)
a[p] = [].concat(prepend ? val : a[p]).concat(prepend ? a[p] : val);
else if (typeof val == 'object' && val !== null && typeof a[p] == 'object')
a[p] = extend(extend({}, a[p]), val, prepend);
else if (!prepend)
a[p] = val;
}
}
function warn(msg) {
if (this.warnings && typeof console != 'undefined' && console.warn)
console.warn(msg);
}