| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| */ |
| |
| var builder = require('cordova/builder'), |
| symbolList = [], |
| deprecationMap; |
| |
| exports.reset = function() { |
| symbolList = []; |
| deprecationMap = {}; |
| }; |
| |
| function addEntry(strategy, moduleName, symbolPath, opt_deprecationMessage) { |
| symbolList.push(strategy, moduleName, symbolPath); |
| if (opt_deprecationMessage) { |
| deprecationMap[symbolPath] = opt_deprecationMessage; |
| } |
| } |
| |
| // Note: Android 2.3 does have Function.bind(). |
| exports.clobbers = function(moduleName, symbolPath, opt_deprecationMessage) { |
| addEntry('c', moduleName, symbolPath, opt_deprecationMessage); |
| }; |
| |
| exports.merges = function(moduleName, symbolPath, opt_deprecationMessage) { |
| addEntry('m', moduleName, symbolPath, opt_deprecationMessage); |
| }; |
| |
| exports.defaults = function(moduleName, symbolPath, opt_deprecationMessage) { |
| addEntry('d', moduleName, symbolPath, opt_deprecationMessage); |
| }; |
| |
| exports.runs = function(moduleName) { |
| addEntry('r', moduleName, null); |
| }; |
| |
| 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; |
| } |
| |
| exports.mapModules = function(context) { |
| var origSymbols = {}; |
| context.CDV_origSymbols = origSymbols; |
| for (var i = 0, len = symbolList.length; i < len; i += 3) { |
| var strategy = symbolList[i]; |
| var moduleName = symbolList[i + 1]; |
| var module = require(moduleName); |
| // <runs/> |
| if (strategy == 'r') { |
| continue; |
| } |
| var symbolPath = symbolList[i + 2]; |
| var lastDot = symbolPath.lastIndexOf('.'); |
| var namespace = symbolPath.substr(0, lastDot); |
| var lastName = symbolPath.substr(lastDot + 1); |
| |
| var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; |
| var parentObj = prepareNamespace(namespace, context); |
| var target = parentObj[lastName]; |
| |
| if (strategy == 'm' && target) { |
| builder.recursiveMerge(target, module); |
| } else if ((strategy == 'd' && !target) || (strategy != 'd')) { |
| if (!(symbolPath in origSymbols)) { |
| origSymbols[symbolPath] = target; |
| } |
| builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); |
| } |
| } |
| }; |
| |
| exports.getOriginalSymbol = function(context, symbolPath) { |
| var origSymbols = context.CDV_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; |
| }; |
| |
| exports.reset(); |
| |