YAPI Helper

将YAPI的接口返回数据结构复制为typescript的interface类型

当前为 2021-05-15 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name YAPI Helper
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description 将YAPI的接口返回数据结构复制为typescript的interface类型
  6. // @author zhenhappy<q505507538@gmail.com>
  7. // @match http://gate.97kid.com:8004/*
  8. // @require https://unpkg.com/jquery/dist/jquery.slim.min.js
  9. // @require https://unpkg.com/clipboard/dist/clipboard.min.js
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. var title = null
  14. var table = null
  15. var t = setInterval(function () {
  16. try {
  17. // 查找"返回数据"节点
  18. if ($('.interface-title') && $('.interface-title').length > 0) {
  19. $.each($('.interface-title'), function () {
  20. if ($(this).text() === '返回数据') {
  21. console.log('找到: "' + $(this).text() + '"')
  22. title = $(this)
  23. table = $(this).next().find('table')
  24. expandAll(copy)
  25. }
  26. })
  27. } else {
  28. throw(Error('未找到元素'))
  29. }
  30. clearInterval(t)
  31. } catch (e) {
  32. if ((e.message !== '未找到元素')) console.error(e)
  33. }
  34. }, 500)
  35.  
  36. function addCopyBtn (text) {
  37. title.append(' <a id="copy" href="#" data-clipboard-text=\''+ text +'\'>复制为interface</a>');
  38. new ClipboardJS('#copy')
  39. }
  40. function copy () {
  41. var obj = {}
  42. var parent = obj
  43. var parentLevel = 0
  44. try {
  45. $.each(table.find('.ant-table-row'), function () {
  46. var key = $(this).find('td').eq(0).text()
  47. var type = $(this).find('td').eq(1).text()
  48. var level = parseInt($(this).attr('class').replace('ant-table-row ant-table-row-level-', ''))
  49.  
  50. if (level < parentLevel) parent = obj
  51.  
  52. parent[key] = typeTranslate(type)
  53. if (typeof parent[key] !== 'string') {
  54. parent = parent[key]
  55. }
  56. parentLevel = level
  57. })
  58. } catch (e) {
  59. console.error(e)
  60. }
  61. addCopyBtn(JSON.stringify(obj, replacer).replace(/"/g, '').replace(/,/g, ';'))
  62. }
  63. function expandAll (cb) {
  64. if (table.find('.ant-table-row-collapsed') && table.find('.ant-table-row-collapsed').length > 0) {
  65. $.each(table.find('.ant-table-row-collapsed'), function () {$(this).trigger('click')})
  66. expandAll(cb)
  67. } else {
  68. cb()
  69. }
  70. }
  71. function typeTranslate (type) {
  72. switch (type) {
  73. case 'integer': return 'number'
  74. case 'object []': return {}
  75. default: return type
  76. }
  77. }
  78. function replacer (key, value) {
  79. if (key !== '' && typeof value === 'object') return 'Array<' + JSON.stringify(value, replacer).replace(/"/g, '').replace(/,/g, ';') + '>'
  80. else return value
  81. }
  82. })();