UNPKG

box-cat

Version:

对暴露get,post之类接口的实例(例如axios、fly.io)二度封装

213 lines (198 loc) 7.56 kB
// * 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; }({}));