uni.api.esm.js 30.6 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import { isArray, isPromise, isFunction, isPlainObject, hasOwn, isString } from '@vue/shared';
fxy060608's avatar
fxy060608 已提交
2

fxy060608's avatar
fxy060608 已提交
3
const API_TYPE_SYNC = 1;
4
function validateProtocol(_name, _args, _protocol) {
fxy060608's avatar
fxy060608 已提交
5 6 7 8 9 10 11 12 13 14
    return true;
}
function formatApiArgs(args, options) {
    if (!options) {
        return args;
    }
}
function createApi({ type, name, options }, fn, protocol) {
    return function (...args) {
        if (type === API_TYPE_SYNC) {
15
            if (!((process.env.NODE_ENV !== 'production') && protocol && !validateProtocol())) {
fxy060608's avatar
fxy060608 已提交
16 17 18 19
                return fn.apply(null, formatApiArgs(args, options));
            }
        }
    };
fxy060608's avatar
fxy060608 已提交
20 21
}

fxy060608's avatar
fxy060608 已提交
22 23 24 25
const Upx2pxProtocol = [
    {
        name: 'upx',
        type: [Number, String],
26 27
        required: true,
    },
fxy060608's avatar
fxy060608 已提交
28
];
fxy060608's avatar
fxy060608 已提交
29

fxy060608's avatar
fxy060608 已提交
30 31 32 33 34 35 36 37 38 39 40
const EPS = 1e-4;
const BASE_DEVICE_WIDTH = 750;
let isIOS = false;
let deviceWidth = 0;
let deviceDPR = 0;
function checkDeviceWidth() {
    const { platform, pixelRatio, windowWidth } = my.getSystemInfoSync();
    deviceWidth = windowWidth;
    deviceDPR = pixelRatio;
    isIOS = platform === 'ios';
}
fxy060608's avatar
fxy060608 已提交
41
const upx2px = createApi({ type: API_TYPE_SYNC, name: 'upx2px' }, (number, newDeviceWidth) => {
fxy060608's avatar
fxy060608 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    if (deviceWidth === 0) {
        checkDeviceWidth();
    }
    number = Number(number);
    if (number === 0) {
        return 0;
    }
    let result = (number / BASE_DEVICE_WIDTH) * (newDeviceWidth || deviceWidth);
    if (result < 0) {
        result = -result;
    }
    result = Math.floor(result + EPS);
    if (result === 0) {
        if (deviceDPR === 1 || !isIOS) {
            result = 1;
        }
        else {
            result = 0.5;
        }
    }
    return number < 0 ? -result : result;
}, Upx2pxProtocol);
fxy060608's avatar
fxy060608 已提交
64

fxy060608's avatar
fxy060608 已提交
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
var HOOKS;
(function (HOOKS) {
    HOOKS["INVOKE"] = "invoke";
    HOOKS["SUCCESS"] = "success";
    HOOKS["FAIL"] = "fail";
    HOOKS["COMPLETE"] = "complete";
    HOOKS["RETURN_VALUE"] = "returnValue";
})(HOOKS || (HOOKS = {}));
const globalInterceptors = {};
const scopedInterceptors = {};
function wrapperHook(hook) {
    return function (data) {
        return hook(data) || data;
    };
}
function queue(hooks, data) {
    let promise = false;
    for (let i = 0; i < hooks.length; i++) {
        const hook = hooks[i];
        if (promise) {
            promise = Promise.resolve(wrapperHook(hook));
        }
        else {
            const res = hook(data);
            if (isPromise(res)) {
                promise = Promise.resolve(res);
            }
            if (res === false) {
                return {
                    then() { },
95
                    catch() { },
fxy060608's avatar
fxy060608 已提交
96 97 98 99 100 101 102 103
                };
            }
        }
    }
    return (promise || {
        then(callback) {
            return callback(data);
        },
104
        catch() { },
fxy060608's avatar
fxy060608 已提交
105 106 107
    });
}
function wrapperOptions(interceptors, options = {}) {
108
    [HOOKS.SUCCESS, HOOKS.FAIL, HOOKS.COMPLETE].forEach((name) => {
fxy060608's avatar
fxy060608 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
        const hooks = interceptors[name];
        if (!isArray(hooks)) {
            return;
        }
        const oldCallback = options[name];
        options[name] = function callbackInterceptor(res) {
            queue(hooks, res).then((res) => {
                return (isFunction(oldCallback) && oldCallback(res)) || res;
            });
        };
    });
    return options;
}
function wrapperReturnValue(method, returnValue) {
    const returnValueHooks = [];
    if (isArray(globalInterceptors.returnValue)) {
        returnValueHooks.push(...globalInterceptors.returnValue);
    }
    const interceptor = scopedInterceptors[method];
    if (interceptor && isArray(interceptor.returnValue)) {
        returnValueHooks.push(...interceptor.returnValue);
    }
131
    returnValueHooks.forEach((hook) => {
fxy060608's avatar
fxy060608 已提交
132 133 134 135 136 137
        returnValue = hook(returnValue) || returnValue;
    });
    return returnValue;
}
function getApiInterceptorHooks(method) {
    const interceptor = Object.create(null);
138
    Object.keys(globalInterceptors).forEach((hook) => {
fxy060608's avatar
fxy060608 已提交
139 140 141 142 143 144
        if (hook !== 'returnValue') {
            interceptor[hook] = globalInterceptors[hook].slice();
        }
    });
    const scopedInterceptor = scopedInterceptors[method];
    if (scopedInterceptor) {
145
        Object.keys(scopedInterceptor).forEach((hook) => {
fxy060608's avatar
fxy060608 已提交
146 147 148 149 150 151 152 153 154 155 156 157
            if (hook !== 'returnValue') {
                interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
            }
        });
    }
    return interceptor;
}
function invokeApi(method, api, options, ...params) {
    const interceptor = getApiInterceptorHooks(method);
    if (interceptor && Object.keys(interceptor).length) {
        if (isArray(interceptor.invoke)) {
            const res = queue(interceptor.invoke, options);
158
            return res.then((options) => {
fxy060608's avatar
fxy060608 已提交
159 160 161 162 163 164 165 166
                return api(wrapperOptions(interceptor, options), ...params);
            });
        }
        else {
            return api(wrapperOptions(interceptor, options), ...params);
        }
    }
    return api(options, ...params);
fxy060608's avatar
fxy060608 已提交
167 168
}

fxy060608's avatar
fxy060608 已提交
169 170 171 172
const AddInterceptorProtocol = [
    {
        name: 'method',
        type: [String, Object],
173 174
        required: true,
    },
fxy060608's avatar
fxy060608 已提交
175 176
];
const RemoveInterceptorProtocol = AddInterceptorProtocol;
fxy060608's avatar
fxy060608 已提交
177

fxy060608's avatar
fxy060608 已提交
178
function mergeInterceptorHook(interceptors, interceptor) {
179
    Object.keys(interceptor).forEach((hook) => {
fxy060608's avatar
fxy060608 已提交
180 181 182 183 184 185 186 187 188
        if (isFunction(interceptor[hook])) {
            interceptors[hook] = mergeHook(interceptors[hook], interceptor[hook]);
        }
    });
}
function removeInterceptorHook(interceptors, interceptor) {
    if (!interceptors || !interceptor) {
        return;
    }
189
    Object.keys(interceptor).forEach((hook) => {
fxy060608's avatar
fxy060608 已提交
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
        if (isFunction(interceptor[hook])) {
            removeHook(interceptors[hook], interceptor[hook]);
        }
    });
}
function mergeHook(parentVal, childVal) {
    const res = childVal
        ? parentVal
            ? parentVal.concat(childVal)
            : isArray(childVal)
                ? childVal
                : [childVal]
        : parentVal;
    return res ? dedupeHooks(res) : res;
}
function dedupeHooks(hooks) {
    const res = [];
    for (let i = 0; i < hooks.length; i++) {
        if (res.indexOf(hooks[i]) === -1) {
            res.push(hooks[i]);
        }
    }
    return res;
}
function removeHook(hooks, hook) {
    if (!hooks) {
        return;
    }
    const index = hooks.indexOf(hook);
    if (index !== -1) {
        hooks.splice(index, 1);
    }
}
fxy060608's avatar
fxy060608 已提交
223
const addInterceptor = createApi({ type: API_TYPE_SYNC, name: 'addInterceptor' }, (method, interceptor) => {
fxy060608's avatar
fxy060608 已提交
224 225 226 227 228 229 230
    if (typeof method === 'string' && isPlainObject(interceptor)) {
        mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), interceptor);
    }
    else if (isPlainObject(method)) {
        mergeInterceptorHook(globalInterceptors, method);
    }
}, AddInterceptorProtocol);
fxy060608's avatar
fxy060608 已提交
231
const removeInterceptor = createApi({ type: API_TYPE_SYNC, name: 'removeInterceptor' }, (method, interceptor) => {
fxy060608's avatar
fxy060608 已提交
232 233 234 235 236 237 238 239 240 241 242 243
    if (typeof method === 'string') {
        if (isPlainObject(interceptor)) {
            removeInterceptorHook(scopedInterceptors[method], interceptor);
        }
        else {
            delete scopedInterceptors[method];
        }
    }
    else if (isPlainObject(method)) {
        removeInterceptorHook(globalInterceptors, method);
    }
}, RemoveInterceptorProtocol);
fxy060608's avatar
fxy060608 已提交
244

fxy060608's avatar
fxy060608 已提交
245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
const SYNC_API_RE = /^\$|sendNativeEvent|restoreGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
const CONTEXT_API_RE = /^create|Manager$/;
// Context例外情况
const CONTEXT_API_RE_EXC = ['createBLEConnection'];
// 同步例外情况
const ASYNC_API = ['createBLEConnection'];
const CALLBACK_API_RE = /^on|^off/;
function isContextApi(name) {
    return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1;
}
function isSyncApi(name) {
    return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1;
}
function isCallbackApi(name) {
    return CALLBACK_API_RE.test(name) && name !== 'onPush';
}
function handlePromise(promise) {
    if (!__UNI_PROMISE_API__) {
        return promise;
    }
    return promise
266
        .then((data) => {
fxy060608's avatar
fxy060608 已提交
267 268
        return [null, data];
    })
269
        .catch((err) => [err]);
fxy060608's avatar
fxy060608 已提交
270 271 272 273 274 275 276 277 278 279 280
}
function shouldPromise(name) {
    if (isContextApi(name) || isSyncApi(name) || isCallbackApi(name)) {
        return false;
    }
    return true;
}
/* eslint-disable no-extend-native */
if (!Promise.prototype.finally) {
    Promise.prototype.finally = function (onfinally) {
        const promise = this.constructor;
281
        return this.then((value) => promise.resolve(onfinally && onfinally()).then(() => value), (reason) => promise.resolve(onfinally && onfinally()).then(() => {
fxy060608's avatar
fxy060608 已提交
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
            throw reason;
        }));
    };
}
function promisify(name, api) {
    if (!shouldPromise(name)) {
        return api;
    }
    if (!isFunction(api)) {
        return api;
    }
    return function promiseApi(options = {}, ...params) {
        if (isFunction(options.success) ||
            isFunction(options.fail) ||
            isFunction(options.complete)) {
            return wrapperReturnValue(name, invokeApi(name, api, options, ...params));
        }
        return wrapperReturnValue(name, handlePromise(new Promise((resolve, reject) => {
            invokeApi(name, api, Object.assign({}, options, {
                success: resolve,
302
                fail: reject,
fxy060608's avatar
fxy060608 已提交
303 304 305
            }), ...params);
        })));
    };
fxy060608's avatar
fxy060608 已提交
306 307
}

fxy060608's avatar
fxy060608 已提交
308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
const CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
function initWrapper(protocols) {
    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 (isFunction(argsOption)) {
                argsOption = argsOption(fromArgs, toArgs) || {};
            }
            for (const key in fromArgs) {
                if (hasOwn(argsOption, key)) {
                    let keyOption = argsOption[key];
                    if (isFunction(keyOption)) {
                        keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
                    }
                    if (!keyOption) {
                        // 不支持的参数
                        console.warn(`支付宝小程序 ${methodName} 暂不支持 ${key}`);
                    }
                    else if (isString(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) {
                    const callback = fromArgs[key];
                    if (isFunction(callback)) {
                        toArgs[key] = processCallback(methodName, callback, returnValue);
                    }
                }
                else {
                    if (!keepFromArgs && !hasOwn(toArgs, key)) {
                        toArgs[key] = fromArgs[key];
                    }
                }
            }
            return toArgs;
        }
        else if (isFunction(fromArgs)) {
            fromArgs = processCallback(methodName, fromArgs, returnValue);
        }
        return fromArgs;
    }
    function processReturnValue(methodName, res, returnValue, keepReturnValue = false) {
        if (isFunction(protocols.returnValue)) {
            // 处理通用 returnValue
            res = protocols.returnValue(methodName, res);
        }
        return processArgs(methodName, res, returnValue, {}, keepReturnValue);
    }
    return function wrapper(methodName, method) {
        if (!hasOwn(protocols, methodName)) {
            return method;
        }
        const protocol = protocols[methodName];
        if (!protocol) {
            // 暂不支持的 api
            return function () {
                console.error(`支付宝小程序 暂不支持${methodName}`);
            };
        }
        return function (arg1, arg2) {
            // 目前 api 最多两个参数
            let options = protocol;
            if (isFunction(protocol)) {
                options = protocol(arg1);
            }
            arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
            const args = [arg1];
            if (typeof arg2 !== 'undefined') {
                args.push(arg2);
            }
            const returnValue = my[options.name || methodName].apply(my, args);
            if (isSyncApi(methodName)) {
                // 同步 api
                return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName));
            }
            return returnValue;
        };
    };
fxy060608's avatar
fxy060608 已提交
397 398
}

fxy060608's avatar
fxy060608 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
const baseApis = { upx2px, addInterceptor, removeInterceptor };
function initUni(api, protocols) {
    const wrapper = initWrapper(protocols);
    const UniProxyHandlers = {
        get(target, key) {
            if (hasOwn(target, key)) {
                return target[key];
            }
            if (hasOwn(api, key)) {
                return promisify(key, api[key]);
            }
            if (hasOwn(baseApis, key)) {
                return promisify(key, baseApis[key]);
            }
            // event-api
            // provider-api?
            return promisify(key, wrapper(key, my[key]));
416
        },
fxy060608's avatar
fxy060608 已提交
417 418
    };
    return new Proxy({}, UniProxyHandlers);
fxy060608's avatar
fxy060608 已提交
419 420
}

fxy060608's avatar
fxy060608 已提交
421
function initGetProvider(providers) {
422
    return function getProvider({ service, success, fail, complete, }) {
fxy060608's avatar
fxy060608 已提交
423 424 425 426 427
        let res;
        if (providers[service]) {
            res = {
                errMsg: 'getProvider:ok',
                service,
428
                provider: providers[service],
fxy060608's avatar
fxy060608 已提交
429 430 431 432 433
            };
            isFunction(success) && success(res);
        }
        else {
            res = {
434
                errMsg: 'getProvider:fail:服务[' + service + ']不存在',
fxy060608's avatar
fxy060608 已提交
435 436 437 438 439
            };
            isFunction(fail) && fail(res);
        }
        isFunction(complete) && complete(res);
    };
fxy060608's avatar
fxy060608 已提交
440 441
}

fxy060608's avatar
fxy060608 已提交
442 443 444 445 446 447 448
function addSafeAreaInsets(fromRes, toRes) {
    if (fromRes.safeArea) {
        const safeArea = fromRes.safeArea;
        toRes.safeAreaInsets = {
            top: safeArea.top,
            left: safeArea.left,
            right: fromRes.windowWidth - safeArea.right,
449
            bottom: fromRes.windowHeight - safeArea.bottom,
fxy060608's avatar
fxy060608 已提交
450 451 452
        };
    }
}
fxy060608's avatar
fxy060608 已提交
453
const redirectTo = {};
fxy060608's avatar
fxy060608 已提交
454

fxy060608's avatar
fxy060608 已提交
455 456 457 458
const getProvider = initGetProvider({
    oauth: ['alipay'],
    share: ['alipay'],
    payment: ['alipay'],
459
    push: ['alipay'],
fxy060608's avatar
fxy060608 已提交
460 461 462 463
});
function setStorageSync(key, data) {
    return my.setStorageSync({
        key,
464
        data,
fxy060608's avatar
fxy060608 已提交
465 466 467 468
    });
}
function getStorageSync(key) {
    const result = my.getStorageSync({
469
        key,
fxy060608's avatar
fxy060608 已提交
470 471 472 473 474 475
    });
    // 支付宝平台会返回一个 success 值,但是目前测试的结果这个始终是 true。当没有存储数据的时候,其它平台会返回空字符串。
    return result.data !== null ? result.data : '';
}
function removeStorageSync(key) {
    return my.removeStorageSync({
476
        key,
fxy060608's avatar
fxy060608 已提交
477 478 479 480 481 482 483 484
    });
}
function startGyroscope(args) {
    if (hasOwn(args, 'interval')) {
        console.warn('支付宝小程序 startGyroscope暂不支持interval');
    }
    args.success &&
        args.success({
485
            errMsg: 'startGyroscope:ok',
fxy060608's avatar
fxy060608 已提交
486 487 488
        });
    args.complete &&
        args.complete({
489
            errMsg: 'startGyroscope:ok',
fxy060608's avatar
fxy060608 已提交
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
        });
}
function createExecCallback(execCallback) {
    return function wrapperExecCallback(res) {
        this.actions.forEach((action, index) => {
            (action._$callbacks || []).forEach((callback) => {
                callback(res[index]);
            });
        });
        if (isFunction(execCallback)) {
            execCallback(res);
        }
    };
}
function addCallback(callback) {
    if (isFunction(callback)) {
        const action = this.actions[this.actions.length - 1];
        if (action) {
            (action._$callbacks || (action._$callbacks = [])).push(callback);
        }
    }
}
function createSelectorQuery() {
    const query = my.createSelectorQuery();
    const oldExec = query.exec;
    const oldScrollOffset = query.scrollOffset;
    const oldBoundingClientRect = query.boundingClientRect;
    query.exec = function exec(callback) {
        return oldExec.call(this, createExecCallback(callback).bind(this));
    };
    query.scrollOffset = function scrollOffset(callback) {
        const ret = oldScrollOffset.call(this);
        addCallback.call(this, callback);
        return ret;
    };
    query.boundingClientRect = function boundingClientRect(callback) {
        const ret = oldBoundingClientRect.call(this);
        addCallback.call(this, callback);
        return ret;
    };
    if (!query.fields) {
        query.fields = function ({ rect, size, scrollOffset }, callback) {
            if (rect || size) {
                this.boundingClientRect();
            }
            if (scrollOffset) {
                this.scrollOffset();
            }
            addCallback.call(this, callback);
            return this;
        };
    }
    if (!query.in) {
        query.in = function () {
            return this;
        };
    }
    return query;
}
function createIntersectionObserver(component, options) {
    if (options && options.observeAll) {
        options.selectAll = options.observeAll;
        delete options.observeAll;
    }
    return my.createIntersectionObserver(options);
fxy060608's avatar
fxy060608 已提交
555 556
}

fxy060608's avatar
fxy060608 已提交
557
var shims = /*#__PURE__*/Object.freeze({
fxy060608's avatar
fxy060608 已提交
558 559 560 561 562 563 564 565
  __proto__: null,
  getProvider: getProvider,
  setStorageSync: setStorageSync,
  getStorageSync: getStorageSync,
  removeStorageSync: removeStorageSync,
  startGyroscope: startGyroscope,
  createSelectorQuery: createSelectorQuery,
  createIntersectionObserver: createIntersectionObserver
fxy060608's avatar
fxy060608 已提交
566
});
fxy060608's avatar
fxy060608 已提交
567

fxy060608's avatar
fxy060608 已提交
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
function handleNetworkInfo(fromRes, toRes) {
    const nextworkType = fromRes.networkType;
    switch (nextworkType) {
        case 'NOTREACHABLE':
            toRes.networkType = 'none';
            break;
        case 'WWAN':
            // TODO ?
            toRes.networkType = '3g';
            break;
        default:
            toRes.networkType = fromRes.networkType.toLowerCase();
            break;
    }
}
function handleSystemInfo(fromRes, toRes) {
    addSafeAreaInsets(fromRes, toRes);
    let platform = fromRes.platform ? fromRes.platform.toLowerCase() : 'devtools';
    if (!~['android', 'ios'].indexOf(platform)) {
        platform = 'devtools';
    }
    toRes.platform = platform;
}
function returnValue(methodName, res) {
    // 通用 returnValue 解析
    if (res.error || res.errorMessage) {
        res.errMsg = `${methodName}:fail ${res.errorMessage || res.error}`;
        delete res.error;
        delete res.errorMessage;
    }
    else {
        res.errMsg = `${methodName}:ok`;
    }
    return res;
}
const request = {
    name: my.canIUse('request') ? 'request' : 'httpRequest',
    args(fromArgs) {
        const method = fromArgs.method || 'GET';
        if (!fromArgs.header) {
            // 默认增加 header 参数,方便格式化 content-type
            fromArgs.header = {};
        }
        const headers = {
612
            'content-type': 'application/json',
fxy060608's avatar
fxy060608 已提交
613
        };
614
        Object.keys(fromArgs.header).forEach((key) => {
fxy060608's avatar
fxy060608 已提交
615 616 617 618 619 620
            headers[key.toLocaleLowerCase()] = fromArgs.header[key];
        });
        return {
            header() {
                return {
                    name: 'headers',
621
                    value: headers,
fxy060608's avatar
fxy060608 已提交
622 623 624 625 626 627 628 629 630 631
                };
            },
            data(data) {
                // 钉钉小程序在content-type为application/json时需上传字符串形式data,使用my.dd在真机运行钉钉小程序时不能正确判断
                if (my.canIUse('saveFileToDingTalk') &&
                    method.toUpperCase() === 'POST' &&
                    headers['content-type'].indexOf('application/json') === 0 &&
                    isPlainObject(data)) {
                    return {
                        name: 'data',
632
                        value: JSON.stringify(data),
fxy060608's avatar
fxy060608 已提交
633 634 635 636
                    };
                }
                return {
                    name: 'data',
637
                    value: data,
fxy060608's avatar
fxy060608 已提交
638 639 640
                };
            },
            method: 'method',
641
            responseType: false,
fxy060608's avatar
fxy060608 已提交
642 643 644 645
        };
    },
    returnValue: {
        status: 'statusCode',
646 647
        headers: 'header',
    },
fxy060608's avatar
fxy060608 已提交
648 649 650 651 652
};
const setNavigationBarColor = {
    name: 'setNavigationBar',
    args: {
        frontColor: false,
653 654
        animation: false,
    },
fxy060608's avatar
fxy060608 已提交
655 656
};
const setNavigationBarTitle = {
657
    name: 'setNavigationBar',
fxy060608's avatar
fxy060608 已提交
658 659 660 661 662 663 664 665 666
};
function showModal({ showCancel = true } = {}) {
    if (showCancel) {
        return {
            name: 'confirm',
            args: {
                cancelColor: false,
                confirmColor: false,
                cancelText: 'cancelButtonText',
667
                confirmText: 'confirmButtonText',
fxy060608's avatar
fxy060608 已提交
668 669 670 671
            },
            returnValue(fromRes, toRes) {
                toRes.confirm = fromRes.confirm;
                toRes.cancel = !fromRes.confirm;
672
            },
fxy060608's avatar
fxy060608 已提交
673 674 675 676 677 678
        };
    }
    return {
        name: 'alert',
        args: {
            confirmColor: false,
679
            confirmText: 'buttonText',
fxy060608's avatar
fxy060608 已提交
680 681 682 683
        },
        returnValue(fromRes, toRes) {
            toRes.confirm = true;
            toRes.cancel = false;
684
        },
fxy060608's avatar
fxy060608 已提交
685 686 687 688 689 690 691 692
    };
}
function showToast({ icon = 'success' } = {}) {
    const args = {
        title: 'content',
        icon: 'type',
        duration: false,
        image: false,
693
        mask: false,
fxy060608's avatar
fxy060608 已提交
694 695 696 697
    };
    if (icon === 'loading') {
        return {
            name: 'showLoading',
698
            args,
fxy060608's avatar
fxy060608 已提交
699 700 701 702
        };
    }
    return {
        name: 'showToast',
703
        args,
fxy060608's avatar
fxy060608 已提交
704 705 706 707 708 709
    };
}
const showActionSheet = {
    name: 'showActionSheet',
    args: {
        itemList: 'items',
710
        itemColor: false,
fxy060608's avatar
fxy060608 已提交
711 712
    },
    returnValue: {
713 714
        index: 'tapIndex',
    },
fxy060608's avatar
fxy060608 已提交
715 716 717 718
};
const showLoading = {
    args: {
        title: 'content',
719 720
        mask: false,
    },
fxy060608's avatar
fxy060608 已提交
721 722 723
};
const uploadFile = {
    args: {
724 725
        name: 'fileName',
    },
fxy060608's avatar
fxy060608 已提交
726 727 728
};
const downloadFile = {
    returnValue: {
729 730
        apFilePath: 'tempFilePath',
    },
fxy060608's avatar
fxy060608 已提交
731 732 733
};
const getFileInfo = {
    args: {
734 735
        filePath: 'apFilePath',
    },
fxy060608's avatar
fxy060608 已提交
736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
};
const compressImage = {
    args(fromArgs, toArgs) {
        toArgs.compressLevel = 4;
        if (fromArgs && fromArgs.quality) {
            toArgs.compressLevel = Math.floor(fromArgs.quality / 26);
        }
        if (fromArgs.src) {
            toArgs.apFilePaths = [fromArgs.src];
        }
    },
    returnValue(fromRes, toRes) {
        const apFilePaths = fromRes.apFilePaths;
        if (apFilePaths && apFilePaths.length) {
            toRes.tempFilePath = apFilePaths[0];
        }
752
    },
fxy060608's avatar
fxy060608 已提交
753 754 755 756
};
const chooseVideo = {
    // 支付宝小程序文档中未找到(仅在getSetting处提及),但实际可用
    returnValue: {
757 758
        apFilePath: 'tempFilePath',
    },
fxy060608's avatar
fxy060608 已提交
759 760 761 762
};
const connectSocket = {
    args: {
        method: false,
763 764
        protocols: false,
    },
fxy060608's avatar
fxy060608 已提交
765 766 767
};
const chooseImage = {
    returnValue: {
768 769
        apFilePaths: 'tempFilePaths',
    },
fxy060608's avatar
fxy060608 已提交
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
};
const previewImage = {
    args(fromArgs, toArgs) {
        // 支付宝小程序的 current 是索引值,而非图片地址。
        const currentIndex = Number(fromArgs.current);
        if (isNaN(currentIndex)) {
            if (fromArgs.current && isArray(fromArgs.urls)) {
                const index = fromArgs.urls.indexOf(fromArgs.current);
                toArgs.current = ~index ? index : 0;
            }
        }
        else {
            toArgs.current = currentIndex;
        }
        return {
            indicator: false,
786
            loop: false,
fxy060608's avatar
fxy060608 已提交
787
        };
788
    },
fxy060608's avatar
fxy060608 已提交
789 790 791
};
const saveFile = {
    args: {
792
        tempFilePath: 'apFilePath',
fxy060608's avatar
fxy060608 已提交
793 794
    },
    returnValue: {
795 796
        apFilePath: 'savedFilePath',
    },
fxy060608's avatar
fxy060608 已提交
797 798 799
};
const getSavedFileInfo = {
    args: {
800 801
        filePath: 'apFilePath',
    },
fxy060608's avatar
fxy060608 已提交
802 803 804
};
const getSavedFileList = {
    returnValue(fromRes, toRes) {
805
        toRes.fileList = fromRes.fileList.map((file) => {
fxy060608's avatar
fxy060608 已提交
806 807 808
            return {
                filePath: file.apFilePath,
                createTime: file.createTime,
809
                size: file.size,
fxy060608's avatar
fxy060608 已提交
810 811
            };
        });
812
    },
fxy060608's avatar
fxy060608 已提交
813 814 815
};
const removeSavedFile = {
    args: {
816 817
        filePath: 'apFilePath',
    },
fxy060608's avatar
fxy060608 已提交
818 819 820 821
};
const getLocation = {
    args: {
        type: false,
822 823
        altitude: false,
    },
fxy060608's avatar
fxy060608 已提交
824 825 826 827
};
const openLocation = {
    args: {
    // TODO address 参数在阿里上是必传的
828
    },
fxy060608's avatar
fxy060608 已提交
829 830
};
const getNetworkType = {
831
    returnValue: handleNetworkInfo,
fxy060608's avatar
fxy060608 已提交
832 833
};
const onNetworkStatusChange = {
834
    returnValue: handleNetworkInfo,
fxy060608's avatar
fxy060608 已提交
835 836
};
const stopAccelerometer = {
837
    name: 'offAccelerometerChange',
fxy060608's avatar
fxy060608 已提交
838 839
};
const stopCompass = {
840
    name: 'offCompassChange',
fxy060608's avatar
fxy060608 已提交
841 842 843 844
};
const scanCode = {
    name: 'scan',
    args: {
845
        onlyFromCamera: 'hideAlbum',
fxy060608's avatar
fxy060608 已提交
846 847
    },
    returnValue: {
848 849
        code: 'result',
    },
fxy060608's avatar
fxy060608 已提交
850 851 852 853
};
const setClipboardData = {
    name: 'setClipboard',
    args: {
854 855
        data: 'text',
    },
fxy060608's avatar
fxy060608 已提交
856 857 858 859
};
const getClipboardData = {
    name: 'getClipboard',
    returnValue: {
860 861
        text: 'data',
    },
fxy060608's avatar
fxy060608 已提交
862 863 864
};
const pageScrollTo = {
    args: {
865 866
        duration: false,
    },
fxy060608's avatar
fxy060608 已提交
867 868 869 870
};
const login = {
    name: 'getAuthCode',
    returnValue: {
871 872
        authCode: 'code',
    },
fxy060608's avatar
fxy060608 已提交
873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892
};
const getUserInfo = {
    name: my.canIUse('getOpenUserInfo') ? 'getOpenUserInfo' : 'getAuthUserInfo',
    returnValue(fromRes, toRes) {
        if (my.canIUse('getOpenUserInfo')) {
            let response;
            try {
                response = JSON.parse(fromRes.response).response;
            }
            catch (e) { }
            if (response) {
                toRes.userInfo = response;
                toRes.userInfo.avatarUrl = response.avatar;
                delete response.avatar;
            }
        }
        else {
            toRes.userInfo = {
                openId: '',
                nickName: fromRes.nickName,
893
                avatarUrl: fromRes.avatar,
fxy060608's avatar
fxy060608 已提交
894 895
            };
        }
896
    },
fxy060608's avatar
fxy060608 已提交
897 898 899 900
};
const requestPayment = {
    name: 'tradePay',
    args: {
901 902
        orderInfo: 'tradeNO',
    },
fxy060608's avatar
fxy060608 已提交
903 904 905
};
const getBLEDeviceServices = {
    returnValue(fromRes, toRes) {
906
        toRes.services = fromRes.services.map((item) => {
fxy060608's avatar
fxy060608 已提交
907 908
            return {
                uuid: item.serviceId,
909
                isPrimary: item.isPrimary,
fxy060608's avatar
fxy060608 已提交
910 911
            };
        });
912
    },
fxy060608's avatar
fxy060608 已提交
913 914 915 916
};
const createBLEConnection = {
    name: 'connectBLEDevice',
    args: {
917 918
        timeout: false,
    },
fxy060608's avatar
fxy060608 已提交
919 920
};
const closeBLEConnection = {
921
    name: 'disconnectBLEDevice',
fxy060608's avatar
fxy060608 已提交
922 923
};
const onBLEConnectionStateChange = {
924
    name: 'onBLEConnectionStateChanged',
fxy060608's avatar
fxy060608 已提交
925 926 927
};
const makePhoneCall = {
    args: {
928 929
        phoneNumber: 'number',
    },
fxy060608's avatar
fxy060608 已提交
930 931
};
const stopGyroscope = {
932
    name: 'offGyroscopeChange',
fxy060608's avatar
fxy060608 已提交
933 934
};
const getSystemInfo = {
935
    returnValue: handleSystemInfo,
fxy060608's avatar
fxy060608 已提交
936 937
};
const getSystemInfoSync = {
938
    returnValue: handleSystemInfo,
fxy060608's avatar
fxy060608 已提交
939 940 941 942 943 944
};
// 文档没提到,但是实测可用。
const canvasToTempFilePath = {
    returnValue(fromRes, toRes) {
        // 真机的情况下会有 tempFilePath 这个值,因此需要主动修改。
        toRes.tempFilePath = fromRes.apFilePath;
945
    },
fxy060608's avatar
fxy060608 已提交
946 947 948
};
const setScreenBrightness = {
    args: {
949 950
        value: 'brightness',
    },
fxy060608's avatar
fxy060608 已提交
951 952 953
};
const getScreenBrightness = {
    returnValue: {
954 955
        brightness: 'value',
    },
fxy060608's avatar
fxy060608 已提交
956 957
};
const showShareMenu = {
958
    name: 'showSharePanel',
fxy060608's avatar
fxy060608 已提交
959 960
};
const hideHomeButton = {
961
    name: 'hideBackHome',
fxy060608's avatar
fxy060608 已提交
962 963 964 965
};
const saveImageToPhotosAlbum = {
    name: 'saveImage',
    args: {
966 967
        filePath: 'url',
    },
fxy060608's avatar
fxy060608 已提交
968 969 970
};
const saveVideoToPhotosAlbum = {
    args: {
971 972
        filePath: 'src',
    },
fxy060608's avatar
fxy060608 已提交
973 974 975 976 977 978 979 980 981 982 983 984
};
const chooseAddress = {
    name: 'getAddress',
    returnValue(fromRes, toRes) {
        const info = fromRes.result || {};
        toRes.userName = info.fullname;
        toRes.countyName = info.country;
        toRes.provinceName = info.prov;
        toRes.cityName = info.city;
        toRes.detailInfo = info.address;
        toRes.telNumber = info.mobilePhone;
        toRes.errMsg = toRes.errMsg + ' ' + fromRes.resultStatus;
985
    },
fxy060608's avatar
fxy060608 已提交
986
};
fxy060608's avatar
fxy060608 已提交
987

fxy060608's avatar
fxy060608 已提交
988
var protocols = /*#__PURE__*/Object.freeze({
fxy060608's avatar
fxy060608 已提交
989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
  __proto__: null,
  returnValue: returnValue,
  request: request,
  setNavigationBarColor: setNavigationBarColor,
  setNavigationBarTitle: setNavigationBarTitle,
  showModal: showModal,
  showToast: showToast,
  showActionSheet: showActionSheet,
  showLoading: showLoading,
  uploadFile: uploadFile,
  downloadFile: downloadFile,
  getFileInfo: getFileInfo,
  compressImage: compressImage,
  chooseVideo: chooseVideo,
  connectSocket: connectSocket,
  chooseImage: chooseImage,
  previewImage: previewImage,
  saveFile: saveFile,
  getSavedFileInfo: getSavedFileInfo,
  getSavedFileList: getSavedFileList,
  removeSavedFile: removeSavedFile,
  getLocation: getLocation,
  openLocation: openLocation,
  getNetworkType: getNetworkType,
  onNetworkStatusChange: onNetworkStatusChange,
  stopAccelerometer: stopAccelerometer,
  stopCompass: stopCompass,
  scanCode: scanCode,
  setClipboardData: setClipboardData,
  getClipboardData: getClipboardData,
  pageScrollTo: pageScrollTo,
  login: login,
  getUserInfo: getUserInfo,
  requestPayment: requestPayment,
  getBLEDeviceServices: getBLEDeviceServices,
  createBLEConnection: createBLEConnection,
  closeBLEConnection: closeBLEConnection,
  onBLEConnectionStateChange: onBLEConnectionStateChange,
  makePhoneCall: makePhoneCall,
  stopGyroscope: stopGyroscope,
  getSystemInfo: getSystemInfo,
  getSystemInfoSync: getSystemInfoSync,
  canvasToTempFilePath: canvasToTempFilePath,
  setScreenBrightness: setScreenBrightness,
  getScreenBrightness: getScreenBrightness,
  showShareMenu: showShareMenu,
  hideHomeButton: hideHomeButton,
  saveImageToPhotosAlbum: saveImageToPhotosAlbum,
  saveVideoToPhotosAlbum: saveVideoToPhotosAlbum,
  chooseAddress: chooseAddress,
fxy060608's avatar
fxy060608 已提交
1039
  redirectTo: redirectTo
fxy060608's avatar
fxy060608 已提交
1040
});
fxy060608's avatar
fxy060608 已提交
1041

fxy060608's avatar
fxy060608 已提交
1042
var index = initUni(shims, protocols);
fxy060608's avatar
fxy060608 已提交
1043

fxy060608's avatar
fxy060608 已提交
1044
export default index;