import {
|
isFn,
|
isStr,
|
hasOwn,
|
isPlainObject
|
} from 'uni-shared'
|
|
import {
|
isSyncApi,
|
isContextApi
|
} from '../helpers/promise'
|
|
import {
|
protocols
|
} from 'uni-platform/runtime/api/protocols'
|
|
const CALLBACKS = ['success', 'fail', 'cancel', 'complete']
|
|
function processCallback (methodName, method, returnValue) {
|
return function (res) {
|
return method(processReturnValue(methodName, res, returnValue))
|
}
|
}
|
|
function processArgs (methodName, fromArgs, argsOption = {}, returnValue = {}, keepFromArgs = false) {
|
if (isPlainObject(fromArgs)) { // 一般 api 的参数解析
|
const toArgs = keepFromArgs === true ? fromArgs : {} // returnValue 为 false 时,说明是格式化返回值,直接在返回值对象上修改赋值
|
if (isFn(argsOption)) {
|
argsOption = argsOption(fromArgs, toArgs) || {}
|
}
|
for (const key in fromArgs) {
|
if (hasOwn(argsOption, key)) {
|
let keyOption = argsOption[key]
|
if (isFn(keyOption)) {
|
keyOption = keyOption(fromArgs[key], fromArgs, toArgs)
|
}
|
if (!keyOption) { // 不支持的参数
|
console.warn(`The '${methodName}' method of platform '__PLATFORM_TITLE__' does not support option '${key}'`)
|
} else if (isStr(keyOption)) { // 重写参数 key
|
toArgs[keyOption] = fromArgs[key]
|
} else if (isPlainObject(keyOption)) { // {name:newName,value:value}可重新指定参数 key:value
|
toArgs[keyOption.name ? keyOption.name : key] = keyOption.value
|
}
|
} else if (CALLBACKS.indexOf(key) !== -1) {
|
if (isFn(fromArgs[key])) {
|
toArgs[key] = processCallback(methodName, fromArgs[key], returnValue)
|
}
|
} else {
|
if (!keepFromArgs) {
|
toArgs[key] = fromArgs[key]
|
}
|
}
|
}
|
return toArgs
|
} else if (isFn(fromArgs)) {
|
fromArgs = processCallback(methodName, fromArgs, returnValue)
|
}
|
return fromArgs
|
}
|
|
function processReturnValue (methodName, res, returnValue, keepReturnValue = false) {
|
if (isFn(protocols.returnValue)) { // 处理通用 returnValue
|
res = protocols.returnValue(methodName, res)
|
}
|
return processArgs(methodName, res, returnValue, {}, keepReturnValue)
|
}
|
|
export default function wrapper (methodName, method) {
|
if (hasOwn(protocols, methodName)) {
|
const protocol = protocols[methodName]
|
if (!protocol) { // 暂不支持的 api
|
return function () {
|
console.error(`Platform '__PLATFORM_TITLE__' does not support '${methodName}'.`)
|
}
|
}
|
return function (arg1, arg2) { // 目前 api 最多两个参数
|
let options = protocol
|
if (isFn(protocol)) {
|
options = protocol(arg1)
|
}
|
|
arg1 = processArgs(methodName, arg1, options.args, options.returnValue)
|
|
const args = [arg1]
|
if (typeof arg2 !== 'undefined') {
|
args.push(arg2)
|
}
|
if (isFn(options.name)) {
|
methodName = options.name(arg1)
|
} else if (isStr(options.name)) {
|
methodName = options.name
|
}
|
const returnValue = __GLOBAL__[methodName].apply(__GLOBAL__, args)
|
if (isSyncApi(methodName)) { // 同步 api
|
return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName))
|
}
|
return returnValue
|
}
|
}
|
return method
|
}
|