react-native-safe-modules
Version:
A safe way to consume React Native NativeModules (forked from react-native-safe-module by @lelandrichardson)
155 lines (89 loc) • 3.92 kB
JavaScript
var _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};var _templateObject=_taggedTemplateLiteral(['\n SafeModule.module(...) was invoked without any options parameter.\n '],['\n SafeModule.module(...) was invoked without any options parameter.\n ']),_templateObject2=_taggedTemplateLiteral(['\n SafeModule.module(...) requires a moduleName property to be specified.\n '],['\n SafeModule.module(...) requires a moduleName property to be specified.\n ']),_templateObject3=_taggedTemplateLiteral(['\n Missing a "mock" parameter.\n '],['\n Missing a "mock" parameter.\n ']),_templateObject4=_taggedTemplateLiteral(['\n ReactNative.NativeModules.','.',' did not have a corresponding prop defined\n in the mock provided to SafeModule.\n '],['\n ReactNative.NativeModules.','.',' did not have a corresponding prop defined\n in the mock provided to SafeModule.\n ']);var _reactNative=require('react-native');
var _dedent=require('dedent');var _dedent2=_interopRequireDefault(_dedent);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _taggedTemplateLiteral(strings,raw){return Object.freeze(Object.defineProperties(strings,{raw:{value:Object.freeze(raw)}}));}
var hasOwnProperty=Object.prototype.hasOwnProperty;
var UNMOCKED_PROPERTY_WHITELIST={
VERSION:true,
addListener:true,
removeListeners:true};
var eventEmitterMock={
addListener:function addListener(){},
removeListeners:function removeListeners(){}};
var first=function first(array,fn){
var result=void 0;
var i=0;
for(;i<array.length;i++){
result=fn(array[i]);
if(result)return result;
}
return null;
};
var moduleWithName=function moduleWithName(nameOrArray){
if(!nameOrArray)return null;
if(Array.isArray(nameOrArray))return first(nameOrArray,moduleWithName);
return _reactNative.NativeModules[nameOrArray];
};
var getPrimaryName=function getPrimaryName(nameOrArray){
return Array.isArray(nameOrArray)?getPrimaryName(nameOrArray[0]):nameOrArray;
};
var getModule=function getModule(moduleNameOrNames,mock,isEventEmitter){
var module=moduleWithName(moduleNameOrNames);
if(module)return module;
if(isEventEmitter)return _extends({},mock,eventEmitterMock);
return mock;
};
var defaultGetVersion=function defaultGetVersion(module){return module.VERSION;};
var create=function SafeModuleCreate(options){
if(!options){
throw new Error((0,_dedent2.default)(_templateObject));
}var
moduleName=
options.moduleName,mock=options.mock,isEventEmitter=options.isEventEmitter,versionOverrides=options.versionOverrides;var
getVersion=
options.getVersion;
if(!getVersion){
getVersion=defaultGetVersion;
}
if(!moduleName){
throw new Error((0,_dedent2.default)(_templateObject2));
}
var MODULE_NAME=getPrimaryName(moduleName);
if(!mock){
throw new Error((0,_dedent2.default)(_templateObject3));
}
var result={};
var module=getModule(moduleName,mock,isEventEmitter);
var version=getVersion(module);
if(__DEV__){
Object.keys(module).forEach(function(key){
if(!hasOwnProperty.call(mock,key)&&!UNMOCKED_PROPERTY_WHITELIST[key]){
console.warn((0,_dedent2.default)(_templateObject4,
MODULE_NAME,key));
}
});
}
if(isEventEmitter){
result.emitter=new _reactNative.NativeEventEmitter(module);
}
var overrides=void 0;
var boundOverrides=void 0;
if(versionOverrides){
overrides=versionOverrides[version];
boundOverrides={};
if(overrides){
Object.keys(overrides).forEach(function(key){
if(typeof overrides[key]==='function'){
boundOverrides[key]=overrides[key](module[key],module);
}else{
boundOverrides[key]=overrides[key];
}
});
}
}
_extends(
result,
mock,
module,
boundOverrides);
return result;
};
module.exports=create;