Bones/node_modules/systemjs/lib/global-helpers.js

145 lines
3.9 KiB
JavaScript
Raw Normal View History

2017-05-17 13:45:25 -04:00
function getGlobalValue(exports) {
if (typeof exports == 'string')
return readMemberExpression(exports, __global);
if (!(exports instanceof Array))
throw new Error('Global exports must be a string or array.');
var globalValue = {};
var first = true;
for (var i = 0; i < exports.length; i++) {
var val = readMemberExpression(exports[i], __global);
if (first) {
globalValue['default'] = val;
first = false;
}
globalValue[exports[i].split('.').pop()] = val;
}
return globalValue;
}
hook('reduceRegister_', function(reduceRegister) {
return function(load, register) {
if (register || !load.metadata.exports)
return reduceRegister.call(this, load, register);
load.metadata.format = 'global';
var entry = load.metadata.entry = createEntry();
entry.deps = load.metadata.deps;
var globalValue = getGlobalValue(load.metadata.exports);
entry.execute = function() {
return globalValue;
};
};
});
hookConstructor(function(constructor) {
return function() {
var loader = this;
constructor.call(loader);
var hasOwnProperty = Object.prototype.hasOwnProperty;
// bare minimum ignores
var ignoredGlobalProps = ['_g', 'sessionStorage', 'localStorage', 'clipboardData', 'frames', 'frameElement', 'external',
'mozAnimationStartTime', 'webkitStorageInfo', 'webkitIndexedDB', 'mozInnerScreenY', 'mozInnerScreenX'];
var globalSnapshot;
function forEachGlobal(callback) {
if (Object.keys)
Object.keys(__global).forEach(callback);
else
for (var g in __global) {
if (!hasOwnProperty.call(__global, g))
continue;
callback(g);
}
}
function forEachGlobalValue(callback) {
forEachGlobal(function(globalName) {
if (indexOf.call(ignoredGlobalProps, globalName) != -1)
return;
try {
var value = __global[globalName];
}
catch (e) {
ignoredGlobalProps.push(globalName);
}
callback(globalName, value);
});
}
loader.set('@@global-helpers', loader.newModule({
prepareGlobal: function(moduleName, exports, globals) {
// disable module detection
var curDefine = __global.define;
__global.define = undefined;
// set globals
var oldGlobals;
if (globals) {
oldGlobals = {};
for (var g in globals) {
oldGlobals[g] = __global[g];
__global[g] = globals[g];
}
}
// store a complete copy of the global object in order to detect changes
if (!exports) {
globalSnapshot = {};
forEachGlobalValue(function(name, value) {
globalSnapshot[name] = value;
});
}
// return function to retrieve global
return function() {
var globalValue;
if (exports) {
globalValue = getGlobalValue(exports);
}
else {
globalValue = {};
var singleGlobal;
var multipleExports;
forEachGlobalValue(function(name, value) {
if (globalSnapshot[name] === value)
return;
if (typeof value == 'undefined')
return;
globalValue[name] = value;
if (typeof singleGlobal != 'undefined') {
if (!multipleExports && singleGlobal !== value)
multipleExports = true;
}
else {
singleGlobal = value;
}
});
globalValue = multipleExports ? globalValue : singleGlobal;
}
// revert globals
if (oldGlobals) {
for (var g in oldGlobals)
__global[g] = oldGlobals[g];
}
__global.define = curDefine;
return globalValue;
};
}
}));
};
});