mtl-js-sdk
Version:
93 lines (70 loc) • 2.24 kB
JavaScript
;
define(['./builder'], function (builder) {
var symbolList;
function addEntry(strategy, module, symbolPath) {
symbolList.push(strategy, module, symbolPath);
}
function prepareNamespace(symbolPath, context) {
if (!symbolPath) {
return context;
}
var parts = symbolPath.split('.');
var cur = context;
for (var i = 0, part; part = parts[i]; ++i) {
cur = cur[part] = cur[part] || {};
}
return cur;
}
var mapper = {};
mapper.reset = function () {
symbolList = [];
};
mapper.addEntry = addEntry;
mapper.clobbers = function (module, symbolPath) {
addEntry('c', module, symbolPath);
};
mapper.merges = function (module, symbolPath) {
addEntry('m', module, symbolPath);
};
mapper.uniques = function (module, symbolPath) {
addEntry('u', module, symbolPath);
};
mapper.mapModules = function (context) {
var origSymbols = {};
context.MTL_origSymbols = origSymbols;
for (var i = 0, len = symbolList.length; i < len; i += 3) {
var strategy = symbolList[i];
var module = symbolList[i + 1];
var symbolPath = symbolList[i + 2];
var lastDot = symbolPath.lastIndexOf('.');
var namespace = symbolPath.substr(0, lastDot);
var lastName = symbolPath.substr(lastDot + 1);
var parentObj = prepareNamespace(namespace, context);
var target = parentObj[lastName];
if (strategy === 'u' && target) {
console.log('Error: 扩展失败, ' + symbolPath + ' 已存在。');
} else if (strategy === 'm' && target) {
builder.recursiveMerge(target, module);
} else {
if (!(symbolPath in origSymbols)) {
origSymbols[symbolPath] = target;
}
builder.assignGetter(parentObj, lastName, module);
}
}
};
mapper.getOriginalSymbol = function (context, symbolPath) {
var origSymbols = context.MTL_origSymbols;
if (origSymbols && symbolPath in origSymbols) {
return origSymbols[symbolPath];
}
var parts = symbolPath.split('.');
var obj = context;
for (var i = 0; i < parts.length; ++i) {
obj = obj && obj[parts[i]];
}
return obj;
};
mapper.reset();
return mapper;
});