box-cat
Version:
对暴露get,post之类接口的实例(例如axios、fly.io)二度封装
213 lines (198 loc) • 7.56 kB
JavaScript
// * Released under the MIT License.
var BoxCat = (function (exports) {
'use strict';
// 取规则
function getFormat(str, key) {
if (key === void 0) { key = 'param'; }
return str.split(new RegExp(key)).slice(0, 2);
}
// 转义字符加\\
function getESC(str) {
return ['$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'].some(function (s) { return s === str; })
? '\\' + str
: str;
}
// 匹配末尾
function getRegFinish(str) {
return str === ''
? str
: "[^" + str + "]";
}
function createSliceRegExp(str1, str2) {
return new RegExp("\\/" + str1 + str2 + "[^/]+", 'g');
}
function createParamsRegExp(str1, str2) {
return new RegExp("\\/" + str1 + "([^" + str2 + "]+)" + str2);
}
function defaults(options) {
var defaultOptions = {
methods: {
'get': ['get'],
'post': ['post'],
'put': ['put'],
'delete': ['delete'],
'options': ['options'],
'head': ['head'],
'trace': ['trace'],
'connect': ['connect'],
'patch': ['patch']
},
rule: ':param',
methodsRule: 'startsWith'
};
if (options.mergeMethods) {
var mergeMethods = options.mergeMethods;
delete options.mergeMethods;
Object.assign(defaultOptions.methods, mergeMethods);
}
return Object.assign({}, defaultOptions, options);
}
function createRegExp(str) {
var arr = getFormat(str);
arr[0] = getESC(arr[0]);
var paramsRegExp = createParamsRegExp(arr[0], arr[1]);
arr[1] = getRegFinish(arr[1]);
var sliceRegExp = createSliceRegExp(arr[0], arr[1]);
return {
paramsRegExp: paramsRegExp,
sliceRegExp: sliceRegExp
};
}
function createOptions(options) {
if (options === void 0) { options = {}; }
var processOptions = defaults(options);
var _a = createRegExp(processOptions.rule), paramsRegExp = _a.paramsRegExp, sliceRegExp = _a.sliceRegExp;
return {
processOptions: processOptions,
paramsRegExp: paramsRegExp,
sliceRegExp: sliceRegExp
};
}
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed 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
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
function getMethod(name, methodsRule, methods) {
return Object.keys(methods)
.find(function (key) { return !!methods[key].find(function (val) { return name.toLocaleLowerCase()[methodsRule](val.toLocaleLowerCase()); }); });
}
function isCreate(key, method, response) {
if (method && response[method])
return true;
if (response[method]) {
console.warn("BoxCat:engine\u6CA1\u6709" + method + "\u65B9\u6CD5");
}
else {
console.warn("BoxCat:\u6CA1\u6709\u5339\u914D\u5230" + key + "\u6240\u9700\u7684\u8BF7\u6C42\u65B9\u5F0F");
}
return false;
}
function newFunction(method, url, response, sliceRegExp, paramsRegExp, _config) {
var urls = url.split(sliceRegExp);
var urlMatch = url.match(sliceRegExp);
var params = [];
if (urlMatch) {
params = urlMatch.map(function (param) { return param.replace(paramsRegExp, '$1'); });
}
return function (id, data, config) {
var rest = [];
for (var _i = 3; _i < arguments.length; _i++) {
rest[_i - 3] = arguments[_i];
}
return response[method].apply(response, __spreadArrays(getParam(urls, params, id, data, config, _config), rest));
};
}
// 解析params路径
function getParam(urls, params, id, data, config, _config) {
if (urls.length === 1) {
return [
urls[0],
id,
Object.assign({}, _config, data)
];
}
else {
var url = void 0;
if (typeof id === 'object') {
var arr = [];
var i = void 0;
var _loop_1 = function (key) {
i = params.findIndex(function (param) { return param === key; });
if (i !== -1)
arr[i] = '/' + id[key];
};
for (var key in id) {
_loop_1(key);
}
url = arr.reduce(function (total, currentValue, index) { return "" + total + currentValue + urls[index + 1]; }, urls[0]);
}
else {
url = urls[0] + "/" + id + urls[1];
}
return [
url,
data,
Object.assign({}, _config, config)
];
}
}
function createFactory(apis, response, options) {
if (options === void 0) { options = {}; }
var _a = createOptions(options), processOptions = _a.processOptions, paramsRegExp = _a.paramsRegExp, sliceRegExp = _a.sliceRegExp;
var method;
return function (key) {
method = getMethod(key, processOptions.methodsRule, processOptions.methods);
if (isCreate(key, method, response)) {
return newFunction(method, apis[key], response, sliceRegExp, paramsRegExp, processOptions.config);
}
};
}
function newProxy (fn) {
return new Proxy({}, {
get: function (target, propKey, receiver) {
if (!target[propKey]) {
target[propKey] = fn(propKey);
}
return Reflect.get(target, propKey, receiver);
}
});
}
function createApis(apis, response, options) {
if (options === void 0) { options = {}; }
var createApiFunction = createFactory(apis, response, options);
var apiFun = {};
Object.keys(apis).forEach(function (key) {
apiFun[key] = createApiFunction(key);
});
return apiFun;
}
function createProxy(apis, response, options) {
if (options === void 0) { options = {}; }
if (typeof Proxy !== 'undefined') {
return newProxy(createFactory(apis, response, options));
}
else {
return createApis(apis, response, options);
}
}
var createAll = createApis;
exports.createAll = createAll;
exports.createApis = createApis;
exports.createProxy = createProxy;
return exports;
}({}));