create-api.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. const {
  2. isFn,
  3. isPlainObject
  4. } = require('../../../common/utils')
  5. // 注意:不进行递归处理
  6. function parseParams (params = {}, rule) {
  7. if (!rule || !params) {
  8. return params
  9. }
  10. const internalKeys = ['_pre', '_purify', '_post']
  11. // 转换之前的处理
  12. if (rule._pre) {
  13. params = rule._pre(params)
  14. }
  15. // 净化参数
  16. let purify = { shouldDelete: new Set([]) }
  17. if (rule._purify) {
  18. const _purify = rule._purify
  19. for (const purifyKey in _purify) {
  20. _purify[purifyKey] = new Set(_purify[purifyKey])
  21. }
  22. purify = Object.assign(purify, _purify)
  23. }
  24. if (isPlainObject(rule)) {
  25. for (const key in rule) {
  26. const parser = rule[key]
  27. if (isFn(parser) && internalKeys.indexOf(key) === -1) {
  28. params[key] = parser(params)
  29. } else if (typeof parser === 'string' && internalKeys.indexOf(key) === -1) {
  30. // 直接转换属性名称的删除旧属性名
  31. params[key] = params[parser]
  32. purify.shouldDelete.add(parser)
  33. }
  34. }
  35. } else if (isFn(rule)) {
  36. params = rule(params)
  37. }
  38. if (purify.shouldDelete) {
  39. for (const item of purify.shouldDelete) {
  40. delete params[item]
  41. }
  42. }
  43. // 转换之后的处理
  44. if (rule._post) {
  45. params = rule._post(params)
  46. }
  47. return params
  48. }
  49. function createApi (ApiClass, options) {
  50. const apiInstance = new ApiClass(options)
  51. return new Proxy(apiInstance, {
  52. get: function (obj, prop) {
  53. if (typeof obj[prop] === 'function' && prop.indexOf('_') !== 0 && obj._protocols && obj._protocols[prop]) {
  54. const protocol = obj._protocols[prop]
  55. return async function (params) {
  56. params = parseParams(params, protocol.args)
  57. let result = await obj[prop](params)
  58. result = parseParams(result, protocol.returnValue)
  59. return result
  60. }
  61. } else {
  62. return obj[prop]
  63. }
  64. }
  65. })
  66. }
  67. module.exports = createApi