├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── LICENSE ├── README.md ├── bizwechat-configurator.html ├── bizwechat-configurator.js ├── bizwechat.html ├── bizwechat.js ├── images ├── 1.png ├── 10.png ├── 11.png ├── 13.png ├── 2.jpg ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png └── 9.png ├── lib ├── Baidu.js ├── BaiduCode.js ├── Stt.js ├── WeChat.js └── WeChatCode.js ├── package-lock.json ├── package.json └── pushbear.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | # 对所有文件生效 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | end_of_line = lf 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | # 对后缀名为 md 的文件生效 13 | [*.md] 14 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "root": true, 3 | "parserOptions": { 4 | "parser": "babel-eslint", 5 | "sourceType": "module" 6 | }, 7 | "extends": [ 8 | "vue", "plugin:vue/recommended" 9 | ], 10 | "rules": { 11 | "eqeqeq": 0, 12 | "camelcase": 0, 13 | "vue/html-self-closing": 0, 14 | "vue/max-attributes-per-line": ["error", { 15 | "singleline": 8, 16 | "multiline": { 17 | "max": 1, 18 | "allowFirstLine": false 19 | } 20 | }], 21 | "vue/singleline-html-element-content-newline": 0 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | 63 | test.* 64 | .vscode 65 | .DS_Store 66 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 基于企业微信的一对多消息送达服务-完美替代pushbear 2 | ---- 3 | 4 | 因为`Pushbear`遭到的很多人的滥用及无聊人士的举报,造成该服务将在五月底下线,对比表示非常伤心。 5 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/1.png) 6 | 7 | 经过各位伙伴探索发现可以使用企业微信完美实现此想服务,经过[flashsoft 大佬](https://github.com/FlashSoft/),[F 大佬](https://github.com/Lumy88)和[smarthomefans 组织](https://github.com/smarthomefans) 多日努力,发布`node-red-contrib-bizwechat 1.0.3` 版本,基本已经可以完美替代 `pushbear` ,本教程由[iobroker首发](https://bbs.iobroker.cn/forum.php?mod=viewthread&tid=118&page=1&extra=#pid226) 8 | 9 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/2.jpg) 10 | 11 | 12 | 13 | 14 | node-red-contrib-bizwechat 15 | --- 16 | 企业微信推送有以下优点: 17 | * 自建服务,除非企业微信停服 18 | * 可以接收用户发送的`文字` `语音`(配置百度已经自动转换文字了) 等等 19 | * 更好的私密性 20 | 21 | 但是同时具有最大的缺点就是:**需要你有公网服务** 22 | 23 | 24 | 手摸手从零开始教程 25 | ---- 26 | * 注册企业微信 27 | 28 | 注册地址如下[https://work.weixin.qq.com/wework_admin/register_wx](https://work.weixin.qq.com/wework_admin/register_wx), 没啥要求,随意注册即可使用 29 | 30 | * 创建应用 31 | 32 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/3.png) 33 | 34 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/4.png) 35 | 36 | * 获取配置信息 37 | 直接进入应用里面可以获取到*AgentId* *Secret* 38 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/5.png) 39 | 40 | *企业id* 在*我的企业*最下面可以找到 41 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/7.png) 42 | 43 | *接收消息* 模块中有*设置API接收*,用来设置企业微信请求的*URL* *Token* *EncodingAESKey* 44 | 45 | **特别注意: 先把这些信息填写到node-red节点信息中, 然后才能验证通过此步** 46 | **特别注意: 先把这些信息填写到node-red节点信息中, 然后才能验证通过此步** 47 | **特别注意: 先把这些信息填写到node-red节点信息中, 然后才能验证通过此步** 48 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/6.png) 49 | 50 | * 安装 node-red节点 51 | 52 | ```js 53 | 54 | node-red-contrib-bizwechat 55 | ``` 56 | 57 | * 配置节点信息 58 | 59 | 节点分为 *服务端*,*输出*, *推送* 60 | 1. 服务端: 用来接收企业微信发来的信息,你可以在后面获取企业微信发过来的信息,但是同时你`需要给它反馈`不然它认为你没有收到,重复发送三次,*只是确认收到消息,直接返回一个空,即msg.payload = ''* 61 | 2. 输出: 用于返回`服务端`信息,一般跟在`服务端`后面,不可以单独使用 62 | 3. 推送: 发送消息给指定的人或多个人,默认为*群发*,指定人是通过*通讯录里面的账号*, 可以自行查看 63 | 64 | * bizwechat 配置信息 65 | 一下信息可以从上面说明如何获取, 填写百度语音配置时,会自动把企业微信发过来的语音消息转换为文字,可以输出信息看一下 66 | 67 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/8.png) 68 | 69 | * 测试服务状态 70 | 1. 访问你的机器`ip:节点里面的端口`, 出现一下界面表示服务正常 71 | 2. 访问你外网的地址,出现相同的界面表示外网访问也正常 72 | 73 | **特别说明:如果你是通过路由器端口映射到内网这台机器端口的,放url请填写 域名:端口访问** 74 | **特别特别注意:这里的端口不是node-red的1880端口,而已你节点信息里面填写的端口** 75 | 76 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/9.png) 77 | 78 | 79 | * 如何添加人到企业微信 80 | 81 | 找到通讯录栏目,添加人员。 可以采用直接`微信邀请`或`添加成员方式`。 82 | 83 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/10.png) 84 | 85 | 86 | * 如何使用微信接收消息 87 | 88 | 找到*我的企业*里面的*微工作台*找到邀请关注,如下图: 89 | 90 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/11.png) 91 | ![图片](https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/master/images/13.png) 92 | 93 | 94 | 范例流程 95 | --- 96 | 97 | ```json 98 | [{"id":"8de36836.2ad578","type":"tab","label":"流程9","disabled":false,"info":""},{"id":"d2cfbe29.54fd9","type":"debug","z":"8de36836.2ad578","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":401,"y":246,"wires":[]},{"id":"f1a926c1.47a0c8","type":"bizwechat-input","z":"8de36836.2ad578","name":"1","bizwechat":"66803d6f.5417b4","x":209,"y":391,"wires":[["d2cfbe29.54fd9","5b134336.fa0bec"]]},{"id":"c022aade.b76af8","type":"bizwechat-output","z":"8de36836.2ad578","name":"","bizwechat":"66803d6f.5417b4","x":748,"y":314,"wires":[]},{"id":"5b134336.fa0bec","type":"function","z":"8de36836.2ad578","name":"","func":"\nmsg.payload = \"\"\nreturn msg;","outputs":1,"noerr":0,"x":486,"y":329,"wires":[["c022aade.b76af8"]]},{"id":"2976594b.99a2e6","type":"bizwechat-pushbear","z":"8de36836.2ad578","name":"","bizwechat":"66803d6f.5417b4","touser":"","toparty":"测试","title":"修改标题","description":"","x":510,"y":509,"wires":[["d2cfbe29.54fd9"]]},{"id":"e89a3e0a.48d71","type":"inject","z":"8de36836.2ad578","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":194,"y":507,"wires":[["d34c6f27.c06ed"]]},{"id":"d34c6f27.c06ed","type":"function","z":"8de36836.2ad578","name":"","func":"\nmsg.payload = `我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown:\n\n> * 整理知识,学习笔记\n> * 发布日记,杂文,所见所想\n> * 撰写发布技术文稿(代码支持)\n> * 撰写发布学术论文(LaTeX 公式支持)\n\n![cmd-markdown-logo](https://www.zybuluo.com/static/img/logo.png)`\nreturn msg;","outputs":1,"noerr":0,"x":365,"y":509,"wires":[["2976594b.99a2e6"]]},{"id":"66803d6f.5417b4","type":"bizwechat-configurator","z":"","name":"","port":"3001","corpid":"wxc9daffb2cdab64b1","agentid":" ","corpsecret":" ","url":"","token":" ","aeskey":" ","client_id":"","client_secret":""}] 99 | ``` 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /bizwechat-configurator.html: -------------------------------------------------------------------------------- 1 | 54 | 113 | 121 | -------------------------------------------------------------------------------- /bizwechat-configurator.js: -------------------------------------------------------------------------------- 1 | module.exports = (RED) => { 2 | RED.nodes.registerType('bizwechat-configurator', class { 3 | constructor (config) { 4 | RED.nodes.createNode(this, config) 5 | Object.assign(this, config) 6 | // console.log('configurator config', config) 7 | } 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /bizwechat.html: -------------------------------------------------------------------------------- 1 | 155 | 165 | 218 | 219 | 229 | 242 | 243 | 272 | 293 | 294 | 295 | 305 | 337 | 338 | 339 | 349 | 370 | 371 | 392 | 410 | -------------------------------------------------------------------------------- /bizwechat.js: -------------------------------------------------------------------------------- 1 | const WXBizMsgCrypt = require('wechat-crypto') 2 | const express = require('express') 3 | 4 | const WeChat = require('./lib/WeChat') 5 | const Baidu = require('./lib/Baidu') 6 | const Stt = require('./lib/Stt') 7 | const { pushBearRouter, indexHtml } = require('./pushbear') 8 | 9 | module.exports = RED => { 10 | // 输入节点 11 | RED.nodes.registerType('bizwechat-input', class { 12 | constructor (config) { 13 | const node = this 14 | RED.nodes.createNode(node, config) 15 | 16 | const biz_config = RED.nodes.getNode(config.bizwechat) 17 | // console.log('in biz_config', biz_config) 18 | 19 | const cryptor = new WXBizMsgCrypt(biz_config.token, biz_config.aeskey, biz_config.corpid) 20 | const wx = new WeChat(node, biz_config, cryptor) 21 | const bd = new Baidu(node, biz_config) 22 | const stt = new Stt(node, biz_config) 23 | 24 | const app = express() 25 | 26 | // 接收消息主逻辑 27 | app.all('/', async (req, res) => { 28 | if (req.method == 'GET') { 29 | // === 回调校验用 ========== 30 | const sVerifyEchoStr = decodeURIComponent(req.query.echostr) 31 | if (req.query.msg_signature == cryptor.getSignature(req.query.timestamp, req.query.nonce, sVerifyEchoStr)) { 32 | res.send(cryptor.decrypt(sVerifyEchoStr).message) 33 | } else { 34 | res.status(200).send(indexHtml) 35 | } 36 | } else { 37 | // === 正常通讯消息 ========== 38 | try { 39 | const message = await wx.getMessage(req) 40 | setTimeout(() => { 41 | node.status({ text: `3.9秒超时自动应答`, fill: 'red', shape: 'ring' }) 42 | res.end('') 43 | }, 3900) 44 | console.log(`receive message: ${JSON.stringify(message)}`) 45 | if (message.MsgType == 'voice' && biz_config.client_id && biz_config.client_id) { 46 | const amr = await wx.getMedia(message.MediaId) 47 | const asr = await bd.getAsr(amr) 48 | message.AsrContent = asr 49 | console.log(`asr result: ${asr}`) 50 | }else if (message.MsgType == 'voice' && biz_config.stt) { 51 | const startTime = new Date().getTime() 52 | const amr = await wx.getMedia(message.MediaId) 53 | const asr = await stt.getAsr(amr) 54 | message.AsrContent = asr 55 | message.AsrTime = new Date().getTime() - startTime 56 | console.log(`asr result: ${asr} times: ${message.AsrTime}`) 57 | } 58 | node.status({ text: `${message.MsgType}(${message.MsgId})` }) 59 | node.send({ res, req, config: biz_config, message }) 60 | 61 | 62 | } catch (err) { 63 | node.status({ text: err.message, fill: 'red', shape: 'ring' }) 64 | node.warn(err) 65 | res.end('') 66 | } 67 | } 68 | }) 69 | // pushbear逻辑 70 | app.use('/pushbear', pushBearRouter) 71 | 72 | // 404 73 | app.use((req, res, next) => { 74 | res.status(404).end('') 75 | }) 76 | 77 | const server = app.listen(biz_config.port, () => { 78 | node.status({ text: `port: ${biz_config.port}`, fill: 'green', shape: 'dot' }) 79 | node.log(`listening on port ${biz_config.port}`) 80 | }) 81 | server.on('error', ({ message }) => { node.status({ text: message, fill: 'red', shape: 'ring' }) }) 82 | node.on('close', () => server.close()) 83 | } 84 | }) 85 | // 输出节点 86 | RED.nodes.registerType('bizwechat-output', class { 87 | constructor (config) { 88 | const node = this 89 | RED.nodes.createNode(node, config) 90 | 91 | const biz_config = RED.nodes.getNode(config.bizwechat) 92 | // console.log('out biz_config', biz_config) 93 | 94 | node.on('input', data => { 95 | const { res, message, payload } = data 96 | const { FromUserName, ToUserName } = message 97 | const cryptor = new WXBizMsgCrypt(biz_config.token, biz_config.aeskey, biz_config.corpid) 98 | const wx = new WeChat(node, biz_config, cryptor) 99 | if (payload) { 100 | console.log(`revert message: ${payload}`) 101 | res.end(wx.getSendXML(FromUserName, ToUserName, `${payload}`)) 102 | } else { 103 | console.log('no revert') 104 | res.end('') 105 | } 106 | }) 107 | } 108 | }) 109 | 110 | // 输出推送 111 | RED.nodes.registerType('bizwechat-pushbear', class { 112 | constructor (config) { 113 | const node = this 114 | RED.nodes.createNode(node, config) 115 | const biz_config = RED.nodes.getNode(config.bizwechat) 116 | node.on('input', async data => { 117 | try { 118 | const cryptor = new WXBizMsgCrypt(biz_config.token, biz_config.aeskey, biz_config.corpid) 119 | const wx = new WeChat(node, biz_config, cryptor) 120 | 121 | // 合并值,未细想 122 | for (const key in config) { if (config[key] != '' && config[key] != null) { data[key] = config[key] } } 123 | data.description = data.description || data.payload 124 | data.touser = data.touser || '@all' 125 | data.url = data.url || 'https://bbs.iobroker.cn' 126 | 127 | // 发送pushbear类型消息 128 | await wx.pushbearMessage(data) 129 | 130 | node.status({ text: `发送成功:${data._msgid}` }) 131 | node.send(data) 132 | } catch (err) { 133 | node.status({ text: err.message, fill: 'red', shape: 'ring' }) 134 | node.warn(err) 135 | } 136 | }) 137 | } 138 | }) 139 | 140 | // 网页内容 141 | RED.nodes.registerType('bizwechat-template', class { 142 | constructor (config) { 143 | const node = this 144 | RED.nodes.createNode(node, config) 145 | const biz_config = RED.nodes.getNode(config.bizwechat) 146 | node.on('input', data => { 147 | try { 148 | const cryptor = new WXBizMsgCrypt(biz_config.token, biz_config.aeskey, biz_config.corpid) 149 | const wx = new WeChat(node, biz_config, cryptor) 150 | 151 | // 合并值,未细想 152 | for (const key in config) { if (config[key] != '' && config[key] != null) { data[key] = config[key] } } 153 | data.description = data.description || data.payload 154 | 155 | // 网页内容 存储 156 | 157 | wx.pushbearTemplate(data) 158 | 159 | node.status({ text: `发送成功:${data._msgid}` }) 160 | node.send(data) 161 | } catch (err) { 162 | node.status({ text: err.message, fill: 'red', shape: 'ring' }) 163 | node.warn(err) 164 | } 165 | }) 166 | } 167 | }) 168 | 169 | // push 170 | RED.nodes.registerType('bizwechat-push', class { 171 | constructor (config) { 172 | const node = this 173 | RED.nodes.createNode(node, config) 174 | 175 | const biz_config = RED.nodes.getNode(config.bizwechat) 176 | // console.log('out biz_config', biz_config) 177 | 178 | node.on('input', async data => { 179 | const { payload, image, type, filename } = data 180 | const cryptor = new WXBizMsgCrypt(biz_config.token, biz_config.aeskey, biz_config.corpid) 181 | const wx = new WeChat(node, biz_config, cryptor) 182 | 183 | try { 184 | // 如果存在 image 属性,证明可能需要临时素材上传 185 | // filename 如果不存在,随机生成 186 | // type 默认为图片 187 | 188 | let mediaInfo 189 | if (image && payload && (payload.msgtype === 'video' || payload.msgtype === 'mpnews')) { 190 | const t = type || 'image' 191 | const f = filename || `${new Date().toLocaleString()}-${(Math.random() * 100).toFixed()}.jpg` 192 | mediaInfo = await wx.uploadMedia({ file: image, type: t, filename: f }) 193 | // console.log(mediaInfo) 194 | if (payload.msgtype === 'video') { 195 | if (payload && payload.video ) { 196 | payload.video.media_id = mediaInfo.media_id 197 | } 198 | }else if(payload.msgtype === 'mpnews') { 199 | if (payload && payload.mpnews && payload.mpnews.articles) { 200 | payload.mpnews.articles.thumb_media_id = mediaInfo.media_id 201 | } 202 | } 203 | } 204 | // 发送用户自定义数据类型消息 205 | await wx.pushMessage(payload) 206 | node.status({ text: `发送成功:${data._msgid}` }) 207 | node.send(data) 208 | } catch (err) { 209 | node.status({ text: err.message, fill: 'red', shape: 'ring' }) 210 | node.warn(err) 211 | } 212 | }) 213 | } 214 | }) 215 | 216 | // upload 217 | RED.nodes.registerType('bizwechat-upload', class { 218 | constructor (config) { 219 | const node = this 220 | RED.nodes.createNode(node, config) 221 | 222 | const biz_config = RED.nodes.getNode(config.bizwechat) 223 | // console.log('out biz_config', biz_config) 224 | 225 | node.on('input', async data => { 226 | const { payload, type, filename } = data 227 | const cryptor = new WXBizMsgCrypt(biz_config.token, biz_config.aeskey, biz_config.corpid) 228 | const wx = new WeChat(node, biz_config, cryptor) 229 | 230 | try { 231 | // 上传临时素材 232 | const result = await wx.uploadMedia({ file: payload, type, filename }) 233 | node.status({ text: `上传成功:${data._msgid}` }) 234 | data.payload = result 235 | node.send(data) 236 | } catch (err) { 237 | node.status({ text: err.message, fill: 'red', shape: 'ring' }) 238 | node.warn(err) 239 | } 240 | }) 241 | } 242 | }) 243 | } 244 | -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/1.png -------------------------------------------------------------------------------- /images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/10.png -------------------------------------------------------------------------------- /images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/11.png -------------------------------------------------------------------------------- /images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/13.png -------------------------------------------------------------------------------- /images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/2.jpg -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/3.png -------------------------------------------------------------------------------- /images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/4.png -------------------------------------------------------------------------------- /images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/5.png -------------------------------------------------------------------------------- /images/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/6.png -------------------------------------------------------------------------------- /images/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/7.png -------------------------------------------------------------------------------- /images/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/8.png -------------------------------------------------------------------------------- /images/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FlashSoft/node-red-contrib-bizwechat/52623c26a30fe8133adc5c336e6045ed9ae79894/images/9.png -------------------------------------------------------------------------------- /lib/Baidu.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const BaiduCode = require('./BaiduCode') 3 | 4 | const EXPIRE_TIME = 1000 * 3600 * 2 5 | 6 | class BaiduClass { 7 | constructor (node, config) { 8 | this.node = node 9 | this.config = config 10 | } 11 | getToken () { 12 | const { set: setCache, get: getCache } = this.node.context().global 13 | const { client_id, client_secret } = this.config 14 | return new Promise(async (resolve, reject) => { 15 | try { 16 | const cache = getCache('baidu') 17 | if (cache && cache.time && ((new Date().valueOf() - cache.time) < EXPIRE_TIME)) { 18 | // console.log('has cache', cache) 19 | resolve(cache.token) 20 | return 21 | } 22 | const { data } = await axios.get('https://aip.baidubce.com/oauth/2.0/token', { 23 | params: { grant_type: 'client_credentials', client_id, client_secret } 24 | }).catch(err => { 25 | throw new Error(`[百度Token]${err}`) 26 | }) 27 | if (!data.access_token) { 28 | reject(new Error('[百度Token]token获取失败')) 29 | } 30 | setCache('baidu', { 31 | token: data.access_token, 32 | time: new Date().valueOf() 33 | }) 34 | resolve(data.access_token) 35 | } catch (err) { reject(err) } 36 | }) 37 | } 38 | 39 | getAsr (amr) { 40 | return new Promise(async (resolve, reject) => { 41 | try { 42 | const token = await this.getToken() 43 | const { data } = await axios.post('https://vop.baidu.com/server_api', amr, { 44 | params: { dev_pid: 1537, token, cuid: 12345 }, 45 | headers: { 'Content-Type': 'audio/amr;rate=8000' } 46 | }).catch(err => { 47 | throw new Error(`[百度Asr]${err}`) 48 | }) 49 | if (data.err_no > 0) { 50 | const msg = BaiduCode[data.err_no] || data.err_msg 51 | throw new Error(`[百度Asr]${msg}`) 52 | } 53 | resolve(data.result) 54 | } catch (err) { reject(err) } 55 | }) 56 | } 57 | } 58 | module.exports = BaiduClass 59 | -------------------------------------------------------------------------------- /lib/BaiduCode.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '3300': '输入参数不正确', 3 | '3301': '音频质量过差', 4 | '3302': '鉴权失败', 5 | '3303': '百度服务器后端繁忙', 6 | '3304': '用户的请求QPS超限', 7 | '3305': '用户的日pv(日请求量)超限', 8 | '3307': '语音服务器后端识别出错问题', 9 | '3308': '音频过长', 10 | '3309': '音频数据问题', 11 | '3310': '输入的音频文件过大', 12 | '3311': '采样率rate参数不在选项里', 13 | '3312': '音频格式format参数不在选项里', 14 | '3313': '语音服务器解析超时', 15 | '3314': '音频长度过短', 16 | '3315': '语音服务器处理超时', 17 | '3316': '用户输入错误 音频转为pcm失败' 18 | } 19 | -------------------------------------------------------------------------------- /lib/Stt.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios') 2 | const FormData = require('form-data') 3 | 4 | class SttClass { 5 | constructor (node, config) { 6 | this.node = node 7 | this.config = config 8 | } 9 | 10 | getAsr (amr) { 11 | return new Promise(async (resolve, reject) => { 12 | try { 13 | const param = new FormData() 14 | param.append('file', amr, {'filename': `${new Date().getTime()}.speex`, contentType: 'voice/speex'}) 15 | param.append('model', 'small') 16 | param.append('language', 'zh') 17 | param.append('response_format', 'json') 18 | 19 | const headers = param.getHeaders() 20 | const { data } = await axios.post(this.config.stt,param, { 21 | headers 22 | }).catch(err => { 23 | console.log(err) 24 | throw new Error(`[Stt Asr]${err}`) 25 | }) 26 | if (data.code > 0) { 27 | throw new Error(`[Stt Asr] error`) 28 | } 29 | 30 | resolve(data.data[0].text) 31 | } catch (err) { 32 | console.log(err) 33 | reject(err) } 34 | }) 35 | } 36 | } 37 | module.exports = SttClass 38 | -------------------------------------------------------------------------------- /lib/WeChat.js: -------------------------------------------------------------------------------- 1 | const crypto = require('crypto') 2 | const fs = require('fs') 3 | const UrlResolve = require('url').resolve 4 | const Xml2js = require('xml2js') 5 | const WXBizMsgCrypt = require('wechat-crypto') 6 | const axios = require('axios') 7 | const mkdirp = require('mkdirp') 8 | const FormData = require('form-data') 9 | const marked = require('marked') 10 | const os = require('os') 11 | const WeChatCode = require('./WeChatCode') 12 | 13 | 14 | const EXPIRE_TIME = 1000 * 3600 * 2 15 | const QI_WX_HOST = "https://qyapi.weixin.qq.com"; 16 | 17 | class WechatClass { 18 | constructor (node, config, cryptor) { 19 | this.node = node 20 | this.config = config 21 | this.cryptor = cryptor 22 | } 23 | receiveData (req) { 24 | return new Promise(resolve => { 25 | const buffer = [] 26 | req.on('data', trunk => buffer.push(trunk)) 27 | req.on('end', trunk => resolve(Buffer.concat(buffer).toString('utf-8'))) 28 | }) 29 | } 30 | parseXML (xml) { 31 | return new Promise(resolve => { 32 | Xml2js.parseString(xml, { 33 | trim: true, 34 | explicitArray: false, 35 | ignoreAttrs: true 36 | }, (err, result) => resolve(result.xml, err)) 37 | }) 38 | } 39 | getReplyXML (from, to, msg) { 40 | return ` 41 | 42 | 43 | 44 | ${new Date().getTime()} 45 | 46 | 47 | 48 | ` 49 | } 50 | getSendXML (fromUsername, toUsername, msg) { 51 | const { token, aeskey, corpid } = this.config 52 | const xml = this.getReplyXML(fromUsername, toUsername, msg) 53 | const cryptor = new WXBizMsgCrypt(token, aeskey, corpid) 54 | const encrypt = cryptor.encrypt(xml) 55 | const nonce = parseInt((Math.random() * 100000000000), 10) 56 | const timestamp = new Date().getTime() 57 | const signature = cryptor.getSignature(timestamp, nonce, encrypt) 58 | return ` 59 | 60 | 61 | 62 | ${timestamp} 63 | 64 | 65 | ` 66 | } 67 | dealUrl(path) { 68 | const { proxyWx } = this.config; 69 | if (proxyWx && proxyWx.startsWith('http')) { 70 | if (proxyWx.endsWith('/')) { 71 | return `${proxyWx}${path}`; 72 | }else { 73 | return `${proxyWx}/${path}`; 74 | } 75 | }else { 76 | return `${QI_WX_HOST}/${path}` 77 | } 78 | } 79 | getToken () { 80 | const { set: setCache, get: getCache } = this.node.context().global 81 | const { corpid, corpsecret, agentid } = this.config; 82 | return new Promise(async (resolve, reject) => { 83 | try { 84 | const cache_key = `wechat-${agentid}` 85 | // 修改缓存token逻辑,用于可以使用多个应用进行推送 86 | const cache = getCache(cache_key) 87 | if (cache && cache.time && ((new Date().valueOf() - cache.time) < EXPIRE_TIME)) { 88 | // console.log('has cache', cache) 89 | resolve(cache.token) 90 | return 91 | } 92 | const { data } = await axios.get(this.dealUrl('cgi-bin/gettoken'), { 93 | params: { corpid, corpsecret } 94 | }).catch(err => { 95 | console.log(err) 96 | throw new Error(`[微信Token]:${err.message}`) 97 | }) 98 | if (data.errcode != 0) { 99 | const msg = WeChatCode[data.errcode] || data.errmsg 100 | throw (new Error(`[微信Token]${msg}`)) 101 | } 102 | setCache(cache_key, { 103 | token: data.access_token, 104 | time: new Date().valueOf() 105 | }) 106 | resolve(data.access_token) 107 | } catch (err) { reject(err) } 108 | }) 109 | } 110 | getMedia (media_id) { 111 | return new Promise(async (resolve, reject) => { 112 | try { 113 | const access_token = await this.getToken() 114 | const result = await axios.get(this.dealUrl('cgi-bin/media/get'), { 115 | params: { access_token, media_id }, 116 | responseType: 'arraybuffer' 117 | }).catch(err => { 118 | throw new Error(`[微信媒体]${err.message}`) 119 | }) 120 | if (result.data.errcode != null && result.data.errcode != 0) { 121 | const msg = WeChatCode[result.data.errcode] || result.data.errmsg 122 | throw (new Error(`[微信媒体]${msg}`)) 123 | } 124 | if (result.headers['error-code'] && result.headers['error-code'] != 0) { 125 | const msg = WeChatCode[result.headers['error-code']] || result.headers['error-msg'] 126 | throw (new Error(`[微信媒体]${msg}`)) 127 | } 128 | resolve(result.data) 129 | } catch (err) { reject(err) } 130 | }) 131 | } 132 | 133 | uploadMedia (data) { 134 | return new Promise(async (resolve, reject) => { 135 | try { 136 | const access_token = await this.getToken() 137 | 138 | const { file, type, filename } = data 139 | 140 | const form = new FormData() 141 | form.append('media', file, filename) 142 | 143 | const header = Object.assign({ 144 | 'Content-Length': form.getLengthSync() 145 | }, form.getHeaders()) 146 | // console.log(header) 147 | const result = await axios.post(this.dealUrl('cgi-bin/media/upload'), form, { 148 | params: { access_token, type }, 149 | headers: header 150 | 151 | }).catch(err => { 152 | throw new Error(`[微信媒体上传]${err}`) 153 | }) 154 | 155 | if (result.data.errcode && result.data.errcode != 0) { 156 | const msg = WeChatCode[result.data.errcode] || result.data.errmsg 157 | throw (new Error(`[微信媒体上传]${msg}`)) 158 | } 159 | if (result.headers['error-code'] && result.headers['error-code'] != 0) { 160 | const msg = WeChatCode[result.headers['error-code']] || result.headers['error-msg'] 161 | throw (new Error(`[微信媒体上传]${msg}`)) 162 | } 163 | resolve(result.data) 164 | } catch (error) { 165 | reject(error) 166 | } 167 | }) 168 | } 169 | async getMessage (req) { 170 | // 接收消息 171 | const message = await this.receiveData(req) 172 | // 解析xml数据 173 | const result = await this.parseXML(message) 174 | // 解密消息 175 | const decrypt_message = this.cryptor.decrypt(result.Encrypt) 176 | // 解析消息xml数据 177 | const json_message = await this.parseXML(decrypt_message.message) 178 | return json_message 179 | } 180 | // 发送主动消息 181 | pushMessage (sendData) { 182 | return new Promise(async (resolve, reject) => { 183 | try { 184 | const access_token = await this.getToken() 185 | // 当用户手动发送消息做一下检查 186 | if (!sendData.agentid) { 187 | sendData.agentid = this.config.agentid 188 | } 189 | 190 | const result = await axios.post(this.dealUrl('cgi-bin/message/send'), sendData, { 191 | params: { access_token } 192 | }).catch(err => { 193 | throw new Error(`[微信推送]${err}`) 194 | }) 195 | if (result.data.errcode != null && result.data.errcode != 0) { 196 | const msg = WeChatCode[result.data.errcode] || result.data.errmsg 197 | throw (new Error(`[微信推送]${msg}`)) 198 | } 199 | resolve(sendData) 200 | } catch (err) { reject(err) } 201 | }) 202 | } 203 | 204 | pushbearTemplate (data) { 205 | const { url } = this.config 206 | 207 | // 处理pushbear数据 208 | data.html = marked(data.description) 209 | const { title, html } = data 210 | 211 | const date = new Date() 212 | const datePath = `${date.getFullYear()}-${date.getMonth() + 1}` 213 | const parentDir = `${os.homedir()}/.node-red/pushbear/${datePath}` 214 | // 创建存储目录 215 | mkdirp.sync(parentDir) 216 | // 计算文件名并存储 217 | const content = JSON.stringify({ title, description: html, time: new Date().valueOf() }) 218 | const fileName = crypto.createHash('md5').update(JSON.stringify(content)).digest('hex') 219 | fs.writeFileSync(`${parentDir}/${fileName}.txt`, content) 220 | // 生成网络URL 221 | if (data.longPath) { 222 | data.url = `${url}/pushbear/${datePath}/${fileName}` 223 | }else { 224 | data.url = `${UrlResolve(url, `/pushbear/${datePath}`)}/${fileName}` 225 | } 226 | 227 | return data 228 | } 229 | 230 | pushbearMessage (data) { 231 | return new Promise(async (resolve, reject) => { 232 | try { 233 | // 原始markdown 文本信息 234 | const markdown = data.description 235 | // 处理存储推送消息 236 | this.pushbearTemplate(data) 237 | 238 | const { title, introduction, touser, html } = data 239 | // 发送主动消息 240 | if (introduction) { // 如果用户已经自己定义简介,测试用用户提供的 241 | data.description = introduction 242 | } else { 243 | const noHtml = html.replace(/<\/?[^>]*>/g, '') 244 | data.description = noHtml 245 | } 246 | // 构建卡片发送消息格式 247 | const { agentid } = this.config 248 | const sendData = { 249 | msgtype: 'textcard', 250 | agentid, 251 | touser, 252 | textcard: { title, description: data.description, url: data.url } 253 | } 254 | 255 | await this.pushMessage(sendData) 256 | data.description = markdown 257 | resolve(data) 258 | } catch (err) { reject(err) } 259 | }) 260 | } 261 | } 262 | 263 | module.exports = WechatClass 264 | -------------------------------------------------------------------------------- /lib/WeChatCode.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | '-1': '系统繁忙', 3 | '0': '请求成功', 4 | '40001': '获取access_token时Secret错误,或者access_token无效', 5 | '40002': '不合法的凭证类型', 6 | '40003': '不合法的UserID', 7 | '40004': '不合法的媒体文件类型', 8 | '40005': '不合法的文件类型', 9 | '40006': '不合法的文件大小', 10 | '40007': '不合法的媒体文件id', 11 | '40008': '不合法的消息类型', 12 | '40013': '不合法的corpid', 13 | '40014': '不合法的access_token', 14 | '40015': '不合法的菜单类型', 15 | '40016': '不合法的按钮个数', 16 | '40017': '不合法的按钮类型', 17 | '40018': '不合法的按钮名字长度', 18 | '40019': '不合法的按钮KEY长度', 19 | '40020': '不合法的按钮URL长度', 20 | '40021': '不合法的菜单版本号', 21 | '40022': '不合法的子菜单级数', 22 | '40023': '不合法的子菜单按钮个数', 23 | '40024': '不合法的子菜单按钮类型', 24 | '40025': '不合法的子菜单按钮名字长度', 25 | '40026': '不合法的子菜单按钮KEY长度', 26 | '40027': '不合法的子菜单按钮URL长度', 27 | '40028': '不合法的自定义菜单使用成员', 28 | '40029': '不合法的oauth_code', 29 | '40031': '不合法的UserID列表', 30 | '40032': '不合法的UserID列表长度', 31 | '40033': '不合法的请求字符,不能包含\\uxxxx格式的字符', 32 | '40035': '不合法的参数', 33 | '40038': '不合法的请求格式', 34 | '40039': '不合法的URL长度', 35 | '40040': '不合法的插件token', 36 | '40041': '不合法的插件id', 37 | '40042': '不合法的插件会话', 38 | '40048': 'url中包含不合法domain', 39 | '40054': '不合法的子菜单url域名', 40 | '40055': '不合法的按钮url域名', 41 | '40056': '不合法的agentid', 42 | '40057': '不合法的callbackurl或者callbackurl验证失败', 43 | '40058': '不合法的红包参数', 44 | '40059': '不合法的上报地理位置标志位', 45 | '40060': '设置上报地理位置标志位时没有设置callbackurl', 46 | '40061': '设置应用头像失败', 47 | '40062': '不合法的应用模式', 48 | '40063': '参数为空', 49 | '40064': '管理组名字已存在', 50 | '40065': '不合法的管理组名字长度', 51 | '40066': '不合法的部门列表', 52 | '40067': '标题长度不合法', 53 | '40068': '不合法的标签ID', 54 | '40069': '不合法的标签ID列表', 55 | '40070': '列表中所有标签(成员)ID都不合法', 56 | '40071': '不合法的标签名字,标签名字已经存在', 57 | '40072': '不合法的标签名字长度', 58 | '40073': '不合法的openid', 59 | '40074': 'news消息不支持指定为高保密消息', 60 | '40077': '不合法的预授权码', 61 | '40078': '不合法的临时授权码', 62 | '40079': '不合法的授权信息', 63 | '40080': '不合法的suitesecret', 64 | '40082': '不合法的suitetoken', 65 | '40083': '不合法的suiteid', 66 | '40084': '不合法的永久授权码', 67 | '40085': '不合法的suiteticket', 68 | '40086': '不合法的第三方应用appid', 69 | '40092': '导入文件存在不合法的内容', 70 | '40093': '不合法的跳转target', 71 | '40094': '不合法的URL', 72 | '40095': '修改失败,并发冲突', 73 | '40155': '请勿添加其他公众号的主页链接', 74 | '41001': '缺少access_token参数', 75 | '41002': '缺少corpid参数', 76 | '41003': '缺少refresh_token参数', 77 | '41004': '缺少secret参数', 78 | '41005': '缺少多媒体文件数据', 79 | '41006': '缺少media_id参数', 80 | '41007': '缺少子菜单数据', 81 | '41008': '缺少oauth code', 82 | '41009': '缺少UserID', 83 | '41010': '缺少url', 84 | '41011': '缺少agentid', 85 | '41012': '缺少应用头像mediaid', 86 | '41013': '缺少应用名字', 87 | '41014': '缺少应用描述', 88 | '41015': '缺少Content', 89 | '41016': '缺少标题', 90 | '41017': '缺少标签ID', 91 | '41018': '缺少标签名字', 92 | '41021': '缺少suiteid', 93 | '41022': '缺少suitetoken', 94 | '41023': '缺少suiteticket', 95 | '41024': '缺少suitesecret', 96 | '41025': '缺少永久授权码', 97 | '41034': '缺少login_ticket', 98 | '41035': '缺少跳转target', 99 | '42001': 'access_token过期', 100 | '42002': 'refresh_token过期', 101 | '42003': 'oauth_code过期', 102 | '42004': '插件token过期', 103 | '42007': '预授权码失效', 104 | '42008': '临时授权码失效', 105 | '42009': 'suitetoken失效', 106 | '43001': '需要GET请求', 107 | '43002': '需要POST请求', 108 | '43003': '需要HTTPS', 109 | '43004': '需要成员已关注', 110 | '43005': '需要好友关系', 111 | '43006': '需要订阅', 112 | '43007': '需要授权', 113 | '43008': '需要支付授权', 114 | '43010': '需要处于回调模式', 115 | '43011': '需要企业授权', 116 | '43013': '应用对成员不可见', 117 | '44001': '多媒体文件为空', 118 | '44002': 'POST的数据包为空', 119 | '44003': '图文消息内容为空', 120 | '44004': '文本消息内容为空', 121 | '45001': '多媒体文件大小超过限制', 122 | '45002': '消息内容大小超过限制', 123 | '45003': '标题大小超过限制', 124 | '45004': '描述大小超过限制', 125 | '45005': '链接长度超过限制', 126 | '45006': '图片链接长度超过限制', 127 | '45007': '语音播放时间超过限制', 128 | '45008': '图文消息的文章数量不能超过10条', 129 | '45009': '接口调用超过限制', 130 | '45010': '创建菜单个数超过限制', 131 | '45015': '回复时间超过限制', 132 | '45016': '系统分组,不允许修改', 133 | '45017': '分组名字过长', 134 | '45018': '分组数量超过上限', 135 | '45022': '应用名字长度不合法,合法长度为2-16个字', 136 | '45024': '帐号数量超过上限', 137 | '45025': '同一个成员每周只能邀请一次', 138 | '45026': '触发删除用户数的保护', 139 | '45027': 'mpnews每天只能发送100次', 140 | '45028': '素材数量超过上限', 141 | '45029': 'media_id对该应用不可见', 142 | '45032': '作者名字长度超过限制', 143 | '46001': '不存在媒体数据', 144 | '46002': '不存在的菜单版本', 145 | '46003': '不存在的菜单数据', 146 | '46004': '不存在的成员', 147 | '47001': '解析JSON/XML内容错误', 148 | '48001': 'Api未授权', 149 | '48002': 'Api禁用(一般是管理组类型与Api不匹配,例如普通管理组调用会话服务的Api)', 150 | '48003': 'suitetoken无效', 151 | '48004': '授权关系无效', 152 | '48005': 'Api已废弃', 153 | '50001': 'redirect_uri未授权', 154 | '50002': '成员不在权限范围', 155 | '50003': '应用已停用', 156 | '50004': '成员状态不正确,需要成员为企业验证中状态', 157 | '50005': '企业已禁用', 158 | '60001': '部门长度不符合限制', 159 | '60002': '部门层级深度超过限制', 160 | '60003': '部门不存在', 161 | '60004': '父亲部门不存在', 162 | '60005': '不允许删除有成员的部门', 163 | '60006': '不允许删除有子部门的部门', 164 | '60007': '不允许删除根部门', 165 | '60008': '部门ID或者部门名称已存在', 166 | '60009': '部门名称含有非法字符', 167 | '60010': '部门存在循环关系', 168 | '60011': '管理组权限不足,(user/department/agent)无权限', 169 | '60012': '不允许删除默认应用', 170 | '60013': '不允许关闭应用', 171 | '60014': '不允许开启应用', 172 | '60015': '不允许修改默认应用可见范围', 173 | '60016': '不允许删除存在成员的标签', 174 | '60017': '不允许设置企业', 175 | '60019': '不允许设置应用地理位置上报开关', 176 | '60020': '访问ip不在白名单之中', 177 | '60023': '已授权的应用不允许企业管理组调用接口修改菜单', 178 | '60025': '主页型应用不支持的消息类型', 179 | '60027': '不支持第三方修改主页型应用字段', 180 | '60028': '应用已授权予第三方,不允许通过接口修改主页url', 181 | '60029': '应用已授权予第三方,不允许通过接口修改可信域名', 182 | '60031': '未设置管理组的登录授权域名', 183 | '60102': 'UserID已存在', 184 | '60103': '手机号码不合法', 185 | '60104': '手机号码已存在', 186 | '60105': '邮箱不合法', 187 | '60106': '邮箱已存在', 188 | '60107': '微信号不合法', 189 | '60108': '微信号已存在', 190 | '60109': 'QQ号已存在', 191 | '60110': '用户同时归属部门超过20个', 192 | '60111': 'UserID不存在', 193 | '60112': '成员姓名不合法', 194 | '60113': '身份认证信息(微信号/手机/邮箱)不能同时为空', 195 | '60114': '性别不合法', 196 | '60115': '已关注成员微信不能修改', 197 | '60116': '扩展属性已存在', 198 | '60118': '成员无有效邀请字段,详情参考(邀请成员关注)的接口说明', 199 | '60119': '成员已关注', 200 | '60120': '成员已禁用', 201 | '60121': '找不到该成员', 202 | '60122': '邮箱已被外部管理员使用', 203 | '60123': '无效的部门id', 204 | '60124': '无效的父部门id', 205 | '60125': '非法部门名字,长度超过限制、重名等,重名包括与csv文件中同级部门重名或者与旧组织架构包含成员的同级部门重名', 206 | '60126': '创建部门失败', 207 | '60127': '缺少部门id', 208 | '60128': '字段不合法,可能存在主键冲突或者格式错误', 209 | '60129': '用户设置了拒绝邀请', 210 | '60131': '不合法的职位长度', 211 | '80001': '可信域名不匹配,或者可信域名没有IPC备案(后续将不能在该域名下正常使用jssdk)', 212 | '81003': '邀请额度已用完', 213 | '81004': '部门数量超过上限', 214 | '81011': '无权限操作该标签', 215 | '82001': '发送消息或者邀请的参数全部为空或者全部不合法', 216 | '82002': '不合法的PartyID列表长度', 217 | '82003': '不合法的TagID列表长度', 218 | '82004': '微信版本号过低', 219 | '84013': '企业会话、客服套件已下线', 220 | '85002': '包含不合法的词语', 221 | '86001': '不合法的会话ID', 222 | '86003': '不存在的会话ID', 223 | '86004': '不合法的会话名', 224 | '86005': '不合法的会话管理员', 225 | '86006': '不合法的成员列表大小', 226 | '86007': '不存在的成员', 227 | '86101': '需要会话管理员权限', 228 | '86201': '缺少会话ID', 229 | '86202': '缺少会话名', 230 | '86203': '缺少会话管理员', 231 | '86204': '缺少成员', 232 | '86205': '非法的会话ID长度', 233 | '86206': '非法的会话ID数值', 234 | '86207': '会话管理员不在用户列表中', 235 | '86208': '消息服务未开启', 236 | '86209': '缺少操作者', 237 | '86210': '缺少会话参数', 238 | '86211': '缺少会话类型(单聊或者群聊)', 239 | '86213': '缺少发件人', 240 | '86214': '非法的会话类型', 241 | '86215': '会话已存在', 242 | '86216': '非法会话成员', 243 | '86217': '会话操作者不在成员列表中', 244 | '86218': '非法会话发件人', 245 | '86219': '非法会话收件人', 246 | '86220': '非法会话操作者', 247 | '86221': '单聊模式下,发件人与收件人不能为同一人', 248 | '86222': '不允许消息服务访问的API', 249 | '86304': '不合法的消息类型', 250 | '86305': '客服服务未启用', 251 | '86306': '缺少发送人', 252 | '86307': '缺少发送人类型', 253 | '86308': '缺少发送人id', 254 | '86309': '缺少接收人', 255 | '86310': '缺少接收人类型', 256 | '86311': '缺少接收人id', 257 | '86312': '缺少消息类型', 258 | '86313': '缺少客服,发送人或接收人类型,必须有一个为kf', 259 | '86314': '客服不唯一,发送人或接收人类型,必须只有一个为kf', 260 | '86315': '不合法的发送人类型', 261 | '86316': '不合法的发送人id。Userid不存在、openid不存在、kf不存在', 262 | '86317': '不合法的接收人类型', 263 | '86318': '不合法的接收人id。Userid不存在、openid不存在、kf不存在', 264 | '86319': '不合法的客服,kf不在客服列表中', 265 | '86320': '不合法的客服类型', 266 | '88001': '缺少seq参数', 267 | '88002': '缺少offset参数', 268 | '88003': '非法seq', 269 | '90001': '未认证摇一摇周边', 270 | '90002': '缺少摇一摇周边ticket参数', 271 | '90003': '摇一摇周边ticket参数不合法', 272 | '90004': '摇一摇周边ticket过期', 273 | '90005': '未开启摇一摇周边服务', 274 | '91004': '卡券已被核销', 275 | '91011': '无效的code', 276 | '91014': '缺少卡券详情', 277 | '91015': '代金券缺少least_cost或者reduce_cost参数', 278 | '91016': '折扣券缺少discount参数', 279 | '91017': '礼品券缺少gift参数', 280 | '91019': '缺少卡券sku参数', 281 | '91020': '缺少卡券有效期', 282 | '91021': '缺少卡券有效期类型', 283 | '91022': '缺少卡券logo_url', 284 | '91023': '缺少卡券code类型', 285 | '91025': '缺少卡券title', 286 | '91026': '缺少卡券color', 287 | '91027': '缺少offset参数', 288 | '91028': '缺少count参数', 289 | '91029': '缺少card_id', 290 | '91030': '缺少卡券code', 291 | '91031': '缺少卡券notice', 292 | '91032': '缺少卡券description', 293 | '91033': '缺少ticket类型', 294 | '91036': '不合法的有效期', 295 | '91038': '变更库存值不合法', 296 | '91039': '不合法的卡券id', 297 | '91040': '不合法的ticket type', 298 | '91041': '没有创建,上传卡券logo,以及核销卡券的权限', 299 | '91042': '没有该卡券投放权限', 300 | '91043': '没有修改或者删除该卡券的权限', 301 | '91044': '不合法的卡券参数', 302 | '91045': '缺少团购券groupon结构', 303 | '91046': '缺少现金券cash结构', 304 | '91047': '缺少折扣券discount 结构', 305 | '91048': '缺少礼品券gift结构', 306 | '91049': '缺少优惠券coupon结构', 307 | '91050': '缺少卡券必填字段', 308 | '91051': '商户名称超过12个汉字', 309 | '91052': '卡券标题超过9个汉字', 310 | '91053': '卡券提醒超过16个汉字', 311 | '91054': '卡券描述超过1024个汉字', 312 | '91055': '卡券副标题长度超过18个汉字', 313 | '91058': '未开通卡券服务,不允许调用卡券接口' 314 | } 315 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-red-contrib-bizwechat", 3 | "version": "1.2.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.24.2", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", 10 | "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.24.2", 14 | "picocolors": "^1.0.0" 15 | } 16 | }, 17 | "@babel/generator": { 18 | "version": "7.24.5", 19 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", 20 | "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", 21 | "dev": true, 22 | "requires": { 23 | "@babel/types": "^7.24.5", 24 | "@jridgewell/gen-mapping": "^0.3.5", 25 | "@jridgewell/trace-mapping": "^0.3.25", 26 | "jsesc": "^2.5.1" 27 | } 28 | }, 29 | "@babel/helper-environment-visitor": { 30 | "version": "7.22.20", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", 32 | "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", 33 | "dev": true 34 | }, 35 | "@babel/helper-function-name": { 36 | "version": "7.23.0", 37 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", 38 | "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", 39 | "dev": true, 40 | "requires": { 41 | "@babel/template": "^7.22.15", 42 | "@babel/types": "^7.23.0" 43 | } 44 | }, 45 | "@babel/helper-hoist-variables": { 46 | "version": "7.22.5", 47 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", 48 | "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", 49 | "dev": true, 50 | "requires": { 51 | "@babel/types": "^7.22.5" 52 | } 53 | }, 54 | "@babel/helper-split-export-declaration": { 55 | "version": "7.24.5", 56 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", 57 | "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", 58 | "dev": true, 59 | "requires": { 60 | "@babel/types": "^7.24.5" 61 | } 62 | }, 63 | "@babel/helper-string-parser": { 64 | "version": "7.24.1", 65 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", 66 | "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", 67 | "dev": true 68 | }, 69 | "@babel/helper-validator-identifier": { 70 | "version": "7.24.5", 71 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", 72 | "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", 73 | "dev": true 74 | }, 75 | "@babel/highlight": { 76 | "version": "7.24.5", 77 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", 78 | "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", 79 | "dev": true, 80 | "requires": { 81 | "@babel/helper-validator-identifier": "^7.24.5", 82 | "chalk": "^2.4.2", 83 | "js-tokens": "^4.0.0", 84 | "picocolors": "^1.0.0" 85 | } 86 | }, 87 | "@babel/parser": { 88 | "version": "7.24.5", 89 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", 90 | "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", 91 | "dev": true 92 | }, 93 | "@babel/template": { 94 | "version": "7.24.0", 95 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", 96 | "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", 97 | "dev": true, 98 | "requires": { 99 | "@babel/code-frame": "^7.23.5", 100 | "@babel/parser": "^7.24.0", 101 | "@babel/types": "^7.24.0" 102 | } 103 | }, 104 | "@babel/traverse": { 105 | "version": "7.24.5", 106 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", 107 | "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", 108 | "dev": true, 109 | "requires": { 110 | "@babel/code-frame": "^7.24.2", 111 | "@babel/generator": "^7.24.5", 112 | "@babel/helper-environment-visitor": "^7.22.20", 113 | "@babel/helper-function-name": "^7.23.0", 114 | "@babel/helper-hoist-variables": "^7.22.5", 115 | "@babel/helper-split-export-declaration": "^7.24.5", 116 | "@babel/parser": "^7.24.5", 117 | "@babel/types": "^7.24.5", 118 | "debug": "^4.3.1", 119 | "globals": "^11.1.0" 120 | }, 121 | "dependencies": { 122 | "debug": { 123 | "version": "4.3.4", 124 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 125 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 126 | "dev": true, 127 | "requires": { 128 | "ms": "2.1.2" 129 | } 130 | }, 131 | "ms": { 132 | "version": "2.1.2", 133 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 134 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 135 | "dev": true 136 | } 137 | } 138 | }, 139 | "@babel/types": { 140 | "version": "7.24.5", 141 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", 142 | "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", 143 | "dev": true, 144 | "requires": { 145 | "@babel/helper-string-parser": "^7.24.1", 146 | "@babel/helper-validator-identifier": "^7.24.5", 147 | "to-fast-properties": "^2.0.0" 148 | } 149 | }, 150 | "@jridgewell/gen-mapping": { 151 | "version": "0.3.5", 152 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 153 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 154 | "dev": true, 155 | "requires": { 156 | "@jridgewell/set-array": "^1.2.1", 157 | "@jridgewell/sourcemap-codec": "^1.4.10", 158 | "@jridgewell/trace-mapping": "^0.3.24" 159 | } 160 | }, 161 | "@jridgewell/resolve-uri": { 162 | "version": "3.1.2", 163 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 164 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 165 | "dev": true 166 | }, 167 | "@jridgewell/set-array": { 168 | "version": "1.2.1", 169 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 170 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 171 | "dev": true 172 | }, 173 | "@jridgewell/sourcemap-codec": { 174 | "version": "1.4.15", 175 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 176 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 177 | "dev": true 178 | }, 179 | "@jridgewell/trace-mapping": { 180 | "version": "0.3.25", 181 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 182 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 183 | "dev": true, 184 | "requires": { 185 | "@jridgewell/resolve-uri": "^3.1.0", 186 | "@jridgewell/sourcemap-codec": "^1.4.14" 187 | } 188 | }, 189 | "accepts": { 190 | "version": "1.3.8", 191 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 192 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 193 | "requires": { 194 | "mime-types": "~2.1.34", 195 | "negotiator": "0.6.3" 196 | } 197 | }, 198 | "acorn": { 199 | "version": "6.4.2", 200 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 201 | "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 202 | "dev": true 203 | }, 204 | "acorn-jsx": { 205 | "version": "5.3.2", 206 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 207 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 208 | "dev": true 209 | }, 210 | "ajv": { 211 | "version": "6.12.6", 212 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 213 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 214 | "dev": true, 215 | "requires": { 216 | "fast-deep-equal": "^3.1.1", 217 | "fast-json-stable-stringify": "^2.0.0", 218 | "json-schema-traverse": "^0.4.1", 219 | "uri-js": "^4.2.2" 220 | } 221 | }, 222 | "ansi-escapes": { 223 | "version": "3.2.0", 224 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 225 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 226 | "dev": true 227 | }, 228 | "ansi-regex": { 229 | "version": "3.0.1", 230 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", 231 | "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", 232 | "dev": true 233 | }, 234 | "ansi-styles": { 235 | "version": "3.2.1", 236 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 237 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 238 | "dev": true, 239 | "requires": { 240 | "color-convert": "^1.9.0" 241 | } 242 | }, 243 | "argparse": { 244 | "version": "1.0.10", 245 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 246 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 247 | "dev": true, 248 | "requires": { 249 | "sprintf-js": "~1.0.2" 250 | } 251 | }, 252 | "array-flatten": { 253 | "version": "1.1.1", 254 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 255 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 256 | }, 257 | "astral-regex": { 258 | "version": "1.0.0", 259 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 260 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 261 | "dev": true 262 | }, 263 | "asynckit": { 264 | "version": "0.4.0", 265 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 266 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 267 | }, 268 | "axios": { 269 | "version": "1.6.8", 270 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 271 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 272 | "requires": { 273 | "follow-redirects": "^1.15.6", 274 | "form-data": "^4.0.0", 275 | "proxy-from-env": "^1.1.0" 276 | }, 277 | "dependencies": { 278 | "form-data": { 279 | "version": "4.0.0", 280 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 281 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 282 | "requires": { 283 | "asynckit": "^0.4.0", 284 | "combined-stream": "^1.0.8", 285 | "mime-types": "^2.1.12" 286 | } 287 | } 288 | } 289 | }, 290 | "babel-eslint": { 291 | "version": "10.1.0", 292 | "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", 293 | "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", 294 | "dev": true, 295 | "requires": { 296 | "@babel/code-frame": "^7.0.0", 297 | "@babel/parser": "^7.7.0", 298 | "@babel/traverse": "^7.7.0", 299 | "@babel/types": "^7.7.0", 300 | "eslint-visitor-keys": "^1.0.0", 301 | "resolve": "^1.12.0" 302 | } 303 | }, 304 | "balanced-match": { 305 | "version": "1.0.2", 306 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 307 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 308 | "dev": true 309 | }, 310 | "body-parser": { 311 | "version": "1.20.2", 312 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 313 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 314 | "requires": { 315 | "bytes": "3.1.2", 316 | "content-type": "~1.0.5", 317 | "debug": "2.6.9", 318 | "depd": "2.0.0", 319 | "destroy": "1.2.0", 320 | "http-errors": "2.0.0", 321 | "iconv-lite": "0.4.24", 322 | "on-finished": "2.4.1", 323 | "qs": "6.11.0", 324 | "raw-body": "2.5.2", 325 | "type-is": "~1.6.18", 326 | "unpipe": "1.0.0" 327 | } 328 | }, 329 | "brace-expansion": { 330 | "version": "1.1.11", 331 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 332 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 333 | "dev": true, 334 | "requires": { 335 | "balanced-match": "^1.0.0", 336 | "concat-map": "0.0.1" 337 | } 338 | }, 339 | "bytes": { 340 | "version": "3.1.2", 341 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 342 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 343 | }, 344 | "call-bind": { 345 | "version": "1.0.7", 346 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 347 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 348 | "requires": { 349 | "es-define-property": "^1.0.0", 350 | "es-errors": "^1.3.0", 351 | "function-bind": "^1.1.2", 352 | "get-intrinsic": "^1.2.4", 353 | "set-function-length": "^1.2.1" 354 | } 355 | }, 356 | "callsites": { 357 | "version": "3.1.0", 358 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 359 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 360 | "dev": true 361 | }, 362 | "chalk": { 363 | "version": "2.4.2", 364 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 365 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 366 | "dev": true, 367 | "requires": { 368 | "ansi-styles": "^3.2.1", 369 | "escape-string-regexp": "^1.0.5", 370 | "supports-color": "^5.3.0" 371 | } 372 | }, 373 | "chardet": { 374 | "version": "0.7.0", 375 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 376 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 377 | "dev": true 378 | }, 379 | "cli-cursor": { 380 | "version": "2.1.0", 381 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 382 | "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", 383 | "dev": true, 384 | "requires": { 385 | "restore-cursor": "^2.0.0" 386 | } 387 | }, 388 | "cli-width": { 389 | "version": "2.2.1", 390 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 391 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", 392 | "dev": true 393 | }, 394 | "color-convert": { 395 | "version": "1.9.3", 396 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 397 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 398 | "dev": true, 399 | "requires": { 400 | "color-name": "1.1.3" 401 | } 402 | }, 403 | "color-name": { 404 | "version": "1.1.3", 405 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 406 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 407 | "dev": true 408 | }, 409 | "combined-stream": { 410 | "version": "1.0.8", 411 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 412 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 413 | "requires": { 414 | "delayed-stream": "~1.0.0" 415 | } 416 | }, 417 | "concat-map": { 418 | "version": "0.0.1", 419 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 420 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 421 | "dev": true 422 | }, 423 | "content-disposition": { 424 | "version": "0.5.4", 425 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 426 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 427 | "requires": { 428 | "safe-buffer": "5.2.1" 429 | } 430 | }, 431 | "content-type": { 432 | "version": "1.0.5", 433 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 434 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 435 | }, 436 | "cookie": { 437 | "version": "0.6.0", 438 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 439 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" 440 | }, 441 | "cookie-signature": { 442 | "version": "1.0.6", 443 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 444 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 445 | }, 446 | "cross-spawn": { 447 | "version": "6.0.5", 448 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 449 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 450 | "dev": true, 451 | "requires": { 452 | "nice-try": "^1.0.4", 453 | "path-key": "^2.0.1", 454 | "semver": "^5.5.0", 455 | "shebang-command": "^1.2.0", 456 | "which": "^1.2.9" 457 | } 458 | }, 459 | "debug": { 460 | "version": "2.6.9", 461 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 462 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 463 | "requires": { 464 | "ms": "2.0.0" 465 | } 466 | }, 467 | "deep-is": { 468 | "version": "0.1.4", 469 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 470 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 471 | "dev": true 472 | }, 473 | "define-data-property": { 474 | "version": "1.1.4", 475 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 476 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 477 | "requires": { 478 | "es-define-property": "^1.0.0", 479 | "es-errors": "^1.3.0", 480 | "gopd": "^1.0.1" 481 | } 482 | }, 483 | "delayed-stream": { 484 | "version": "1.0.0", 485 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 486 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 487 | }, 488 | "depd": { 489 | "version": "2.0.0", 490 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 491 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 492 | }, 493 | "destroy": { 494 | "version": "1.2.0", 495 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 496 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 497 | }, 498 | "doctrine": { 499 | "version": "3.0.0", 500 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 501 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 502 | "dev": true, 503 | "requires": { 504 | "esutils": "^2.0.2" 505 | } 506 | }, 507 | "ee-first": { 508 | "version": "1.1.1", 509 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 510 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 511 | }, 512 | "emoji-regex": { 513 | "version": "7.0.3", 514 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 515 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 516 | "dev": true 517 | }, 518 | "encodeurl": { 519 | "version": "1.0.2", 520 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 521 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 522 | }, 523 | "es-define-property": { 524 | "version": "1.0.0", 525 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 526 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 527 | "requires": { 528 | "get-intrinsic": "^1.2.4" 529 | } 530 | }, 531 | "es-errors": { 532 | "version": "1.3.0", 533 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 534 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 535 | }, 536 | "escape-html": { 537 | "version": "1.0.3", 538 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 539 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 540 | }, 541 | "escape-string-regexp": { 542 | "version": "1.0.5", 543 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 544 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 545 | "dev": true 546 | }, 547 | "eslint": { 548 | "version": "5.16.0", 549 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 550 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 551 | "dev": true, 552 | "requires": { 553 | "@babel/code-frame": "^7.0.0", 554 | "ajv": "^6.9.1", 555 | "chalk": "^2.1.0", 556 | "cross-spawn": "^6.0.5", 557 | "debug": "^4.0.1", 558 | "doctrine": "^3.0.0", 559 | "eslint-scope": "^4.0.3", 560 | "eslint-utils": "^1.3.1", 561 | "eslint-visitor-keys": "^1.0.0", 562 | "espree": "^5.0.1", 563 | "esquery": "^1.0.1", 564 | "esutils": "^2.0.2", 565 | "file-entry-cache": "^5.0.1", 566 | "functional-red-black-tree": "^1.0.1", 567 | "glob": "^7.1.2", 568 | "globals": "^11.7.0", 569 | "ignore": "^4.0.6", 570 | "import-fresh": "^3.0.0", 571 | "imurmurhash": "^0.1.4", 572 | "inquirer": "^6.2.2", 573 | "js-yaml": "^3.13.0", 574 | "json-stable-stringify-without-jsonify": "^1.0.1", 575 | "levn": "^0.3.0", 576 | "lodash": "^4.17.11", 577 | "minimatch": "^3.0.4", 578 | "mkdirp": "^0.5.1", 579 | "natural-compare": "^1.4.0", 580 | "optionator": "^0.8.2", 581 | "path-is-inside": "^1.0.2", 582 | "progress": "^2.0.0", 583 | "regexpp": "^2.0.1", 584 | "semver": "^5.5.1", 585 | "strip-ansi": "^4.0.0", 586 | "strip-json-comments": "^2.0.1", 587 | "table": "^5.2.3", 588 | "text-table": "^0.2.0" 589 | }, 590 | "dependencies": { 591 | "debug": { 592 | "version": "4.3.4", 593 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 594 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 595 | "dev": true, 596 | "requires": { 597 | "ms": "2.1.2" 598 | } 599 | }, 600 | "ms": { 601 | "version": "2.1.2", 602 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 603 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 604 | "dev": true 605 | } 606 | } 607 | }, 608 | "eslint-config-vue": { 609 | "version": "2.0.2", 610 | "resolved": "https://registry.npmjs.org/eslint-config-vue/-/eslint-config-vue-2.0.2.tgz", 611 | "integrity": "sha512-0k013WXCa22XTdi/ce4PQrBEsu2vt/GjViA7YPCmoAg5RFrlPUtbaCfo26Tes6mvp2M0HJzSSYZllWLtez/QdA==", 612 | "dev": true 613 | }, 614 | "eslint-plugin-vue": { 615 | "version": "5.2.3", 616 | "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz", 617 | "integrity": "sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==", 618 | "dev": true, 619 | "requires": { 620 | "vue-eslint-parser": "^5.0.0" 621 | } 622 | }, 623 | "eslint-scope": { 624 | "version": "4.0.3", 625 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 626 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 627 | "dev": true, 628 | "requires": { 629 | "esrecurse": "^4.1.0", 630 | "estraverse": "^4.1.1" 631 | } 632 | }, 633 | "eslint-utils": { 634 | "version": "1.4.3", 635 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 636 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 637 | "dev": true, 638 | "requires": { 639 | "eslint-visitor-keys": "^1.1.0" 640 | } 641 | }, 642 | "eslint-visitor-keys": { 643 | "version": "1.3.0", 644 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 645 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 646 | "dev": true 647 | }, 648 | "espree": { 649 | "version": "5.0.1", 650 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 651 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 652 | "dev": true, 653 | "requires": { 654 | "acorn": "^6.0.7", 655 | "acorn-jsx": "^5.0.0", 656 | "eslint-visitor-keys": "^1.0.0" 657 | } 658 | }, 659 | "esprima": { 660 | "version": "4.0.1", 661 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 662 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 663 | "dev": true 664 | }, 665 | "esquery": { 666 | "version": "1.5.0", 667 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 668 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 669 | "dev": true, 670 | "requires": { 671 | "estraverse": "^5.1.0" 672 | }, 673 | "dependencies": { 674 | "estraverse": { 675 | "version": "5.3.0", 676 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 677 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 678 | "dev": true 679 | } 680 | } 681 | }, 682 | "esrecurse": { 683 | "version": "4.3.0", 684 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 685 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 686 | "dev": true, 687 | "requires": { 688 | "estraverse": "^5.2.0" 689 | }, 690 | "dependencies": { 691 | "estraverse": { 692 | "version": "5.3.0", 693 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 694 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 695 | "dev": true 696 | } 697 | } 698 | }, 699 | "estraverse": { 700 | "version": "4.3.0", 701 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 702 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 703 | "dev": true 704 | }, 705 | "esutils": { 706 | "version": "2.0.3", 707 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 708 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 709 | "dev": true 710 | }, 711 | "etag": { 712 | "version": "1.8.1", 713 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 714 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 715 | }, 716 | "express": { 717 | "version": "4.19.2", 718 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 719 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 720 | "requires": { 721 | "accepts": "~1.3.8", 722 | "array-flatten": "1.1.1", 723 | "body-parser": "1.20.2", 724 | "content-disposition": "0.5.4", 725 | "content-type": "~1.0.4", 726 | "cookie": "0.6.0", 727 | "cookie-signature": "1.0.6", 728 | "debug": "2.6.9", 729 | "depd": "2.0.0", 730 | "encodeurl": "~1.0.2", 731 | "escape-html": "~1.0.3", 732 | "etag": "~1.8.1", 733 | "finalhandler": "1.2.0", 734 | "fresh": "0.5.2", 735 | "http-errors": "2.0.0", 736 | "merge-descriptors": "1.0.1", 737 | "methods": "~1.1.2", 738 | "on-finished": "2.4.1", 739 | "parseurl": "~1.3.3", 740 | "path-to-regexp": "0.1.7", 741 | "proxy-addr": "~2.0.7", 742 | "qs": "6.11.0", 743 | "range-parser": "~1.2.1", 744 | "safe-buffer": "5.2.1", 745 | "send": "0.18.0", 746 | "serve-static": "1.15.0", 747 | "setprototypeof": "1.2.0", 748 | "statuses": "2.0.1", 749 | "type-is": "~1.6.18", 750 | "utils-merge": "1.0.1", 751 | "vary": "~1.1.2" 752 | } 753 | }, 754 | "external-editor": { 755 | "version": "3.1.0", 756 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 757 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 758 | "dev": true, 759 | "requires": { 760 | "chardet": "^0.7.0", 761 | "iconv-lite": "^0.4.24", 762 | "tmp": "^0.0.33" 763 | } 764 | }, 765 | "fast-deep-equal": { 766 | "version": "3.1.3", 767 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 768 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 769 | "dev": true 770 | }, 771 | "fast-json-stable-stringify": { 772 | "version": "2.1.0", 773 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 774 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 775 | "dev": true 776 | }, 777 | "fast-levenshtein": { 778 | "version": "2.0.6", 779 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 780 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 781 | "dev": true 782 | }, 783 | "figures": { 784 | "version": "2.0.0", 785 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 786 | "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", 787 | "dev": true, 788 | "requires": { 789 | "escape-string-regexp": "^1.0.5" 790 | } 791 | }, 792 | "file-entry-cache": { 793 | "version": "5.0.1", 794 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 795 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 796 | "dev": true, 797 | "requires": { 798 | "flat-cache": "^2.0.1" 799 | } 800 | }, 801 | "finalhandler": { 802 | "version": "1.2.0", 803 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 804 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 805 | "requires": { 806 | "debug": "2.6.9", 807 | "encodeurl": "~1.0.2", 808 | "escape-html": "~1.0.3", 809 | "on-finished": "2.4.1", 810 | "parseurl": "~1.3.3", 811 | "statuses": "2.0.1", 812 | "unpipe": "~1.0.0" 813 | } 814 | }, 815 | "flat-cache": { 816 | "version": "2.0.1", 817 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 818 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 819 | "dev": true, 820 | "requires": { 821 | "flatted": "^2.0.0", 822 | "rimraf": "2.6.3", 823 | "write": "1.0.3" 824 | } 825 | }, 826 | "flatted": { 827 | "version": "2.0.2", 828 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 829 | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 830 | "dev": true 831 | }, 832 | "follow-redirects": { 833 | "version": "1.15.6", 834 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 835 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" 836 | }, 837 | "form-data": { 838 | "version": "2.5.1", 839 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", 840 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", 841 | "requires": { 842 | "asynckit": "^0.4.0", 843 | "combined-stream": "^1.0.6", 844 | "mime-types": "^2.1.12" 845 | } 846 | }, 847 | "forwarded": { 848 | "version": "0.2.0", 849 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 850 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 851 | }, 852 | "fresh": { 853 | "version": "0.5.2", 854 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 855 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 856 | }, 857 | "fs.realpath": { 858 | "version": "1.0.0", 859 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 860 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 861 | "dev": true 862 | }, 863 | "function-bind": { 864 | "version": "1.1.2", 865 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 866 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 867 | }, 868 | "functional-red-black-tree": { 869 | "version": "1.0.1", 870 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 871 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 872 | "dev": true 873 | }, 874 | "get-intrinsic": { 875 | "version": "1.2.4", 876 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 877 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 878 | "requires": { 879 | "es-errors": "^1.3.0", 880 | "function-bind": "^1.1.2", 881 | "has-proto": "^1.0.1", 882 | "has-symbols": "^1.0.3", 883 | "hasown": "^2.0.0" 884 | } 885 | }, 886 | "glob": { 887 | "version": "7.2.3", 888 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 889 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 890 | "dev": true, 891 | "requires": { 892 | "fs.realpath": "^1.0.0", 893 | "inflight": "^1.0.4", 894 | "inherits": "2", 895 | "minimatch": "^3.1.1", 896 | "once": "^1.3.0", 897 | "path-is-absolute": "^1.0.0" 898 | } 899 | }, 900 | "globals": { 901 | "version": "11.12.0", 902 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 903 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 904 | "dev": true 905 | }, 906 | "gopd": { 907 | "version": "1.0.1", 908 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 909 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 910 | "requires": { 911 | "get-intrinsic": "^1.1.3" 912 | } 913 | }, 914 | "has-flag": { 915 | "version": "3.0.0", 916 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 917 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 918 | "dev": true 919 | }, 920 | "has-property-descriptors": { 921 | "version": "1.0.2", 922 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 923 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 924 | "requires": { 925 | "es-define-property": "^1.0.0" 926 | } 927 | }, 928 | "has-proto": { 929 | "version": "1.0.3", 930 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 931 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" 932 | }, 933 | "has-symbols": { 934 | "version": "1.0.3", 935 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 936 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 937 | }, 938 | "hasown": { 939 | "version": "2.0.2", 940 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 941 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 942 | "requires": { 943 | "function-bind": "^1.1.2" 944 | } 945 | }, 946 | "http-errors": { 947 | "version": "2.0.0", 948 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 949 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 950 | "requires": { 951 | "depd": "2.0.0", 952 | "inherits": "2.0.4", 953 | "setprototypeof": "1.2.0", 954 | "statuses": "2.0.1", 955 | "toidentifier": "1.0.1" 956 | } 957 | }, 958 | "iconv-lite": { 959 | "version": "0.4.24", 960 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 961 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 962 | "requires": { 963 | "safer-buffer": ">= 2.1.2 < 3" 964 | } 965 | }, 966 | "ignore": { 967 | "version": "4.0.6", 968 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 969 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 970 | "dev": true 971 | }, 972 | "import-fresh": { 973 | "version": "3.3.0", 974 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 975 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 976 | "dev": true, 977 | "requires": { 978 | "parent-module": "^1.0.0", 979 | "resolve-from": "^4.0.0" 980 | } 981 | }, 982 | "imurmurhash": { 983 | "version": "0.1.4", 984 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 985 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 986 | "dev": true 987 | }, 988 | "inflight": { 989 | "version": "1.0.6", 990 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 991 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 992 | "dev": true, 993 | "requires": { 994 | "once": "^1.3.0", 995 | "wrappy": "1" 996 | } 997 | }, 998 | "inherits": { 999 | "version": "2.0.4", 1000 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1001 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1002 | }, 1003 | "inquirer": { 1004 | "version": "6.5.2", 1005 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 1006 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 1007 | "dev": true, 1008 | "requires": { 1009 | "ansi-escapes": "^3.2.0", 1010 | "chalk": "^2.4.2", 1011 | "cli-cursor": "^2.1.0", 1012 | "cli-width": "^2.0.0", 1013 | "external-editor": "^3.0.3", 1014 | "figures": "^2.0.0", 1015 | "lodash": "^4.17.12", 1016 | "mute-stream": "0.0.7", 1017 | "run-async": "^2.2.0", 1018 | "rxjs": "^6.4.0", 1019 | "string-width": "^2.1.0", 1020 | "strip-ansi": "^5.1.0", 1021 | "through": "^2.3.6" 1022 | }, 1023 | "dependencies": { 1024 | "ansi-regex": { 1025 | "version": "4.1.1", 1026 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 1027 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 1028 | "dev": true 1029 | }, 1030 | "strip-ansi": { 1031 | "version": "5.2.0", 1032 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1033 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1034 | "dev": true, 1035 | "requires": { 1036 | "ansi-regex": "^4.1.0" 1037 | } 1038 | } 1039 | } 1040 | }, 1041 | "ipaddr.js": { 1042 | "version": "1.9.1", 1043 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1044 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1045 | }, 1046 | "is-core-module": { 1047 | "version": "2.13.1", 1048 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1049 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1050 | "dev": true, 1051 | "requires": { 1052 | "hasown": "^2.0.0" 1053 | } 1054 | }, 1055 | "is-fullwidth-code-point": { 1056 | "version": "2.0.0", 1057 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1058 | "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", 1059 | "dev": true 1060 | }, 1061 | "isexe": { 1062 | "version": "2.0.0", 1063 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1064 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1065 | "dev": true 1066 | }, 1067 | "js-tokens": { 1068 | "version": "4.0.0", 1069 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1070 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1071 | "dev": true 1072 | }, 1073 | "js-yaml": { 1074 | "version": "3.14.1", 1075 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1076 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1077 | "dev": true, 1078 | "requires": { 1079 | "argparse": "^1.0.7", 1080 | "esprima": "^4.0.0" 1081 | } 1082 | }, 1083 | "jsesc": { 1084 | "version": "2.5.2", 1085 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1086 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1087 | "dev": true 1088 | }, 1089 | "json-schema-traverse": { 1090 | "version": "0.4.1", 1091 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1092 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1093 | "dev": true 1094 | }, 1095 | "json-stable-stringify-without-jsonify": { 1096 | "version": "1.0.1", 1097 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1098 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1099 | "dev": true 1100 | }, 1101 | "levn": { 1102 | "version": "0.3.0", 1103 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1104 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", 1105 | "dev": true, 1106 | "requires": { 1107 | "prelude-ls": "~1.1.2", 1108 | "type-check": "~0.3.2" 1109 | } 1110 | }, 1111 | "lodash": { 1112 | "version": "4.17.21", 1113 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1114 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1115 | "dev": true 1116 | }, 1117 | "marked": { 1118 | "version": "0.7.0", 1119 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", 1120 | "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" 1121 | }, 1122 | "media-typer": { 1123 | "version": "0.3.0", 1124 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1125 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1126 | }, 1127 | "merge-descriptors": { 1128 | "version": "1.0.1", 1129 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1130 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1131 | }, 1132 | "methods": { 1133 | "version": "1.1.2", 1134 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1135 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1136 | }, 1137 | "mime": { 1138 | "version": "1.6.0", 1139 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1140 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1141 | }, 1142 | "mime-db": { 1143 | "version": "1.52.0", 1144 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1145 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1146 | }, 1147 | "mime-types": { 1148 | "version": "2.1.35", 1149 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1150 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1151 | "requires": { 1152 | "mime-db": "1.52.0" 1153 | } 1154 | }, 1155 | "mimic-fn": { 1156 | "version": "1.2.0", 1157 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1158 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1159 | "dev": true 1160 | }, 1161 | "minimatch": { 1162 | "version": "3.1.2", 1163 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1164 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1165 | "dev": true, 1166 | "requires": { 1167 | "brace-expansion": "^1.1.7" 1168 | } 1169 | }, 1170 | "minimist": { 1171 | "version": "1.2.8", 1172 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1173 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 1174 | }, 1175 | "mkdirp": { 1176 | "version": "0.5.6", 1177 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", 1178 | "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", 1179 | "requires": { 1180 | "minimist": "^1.2.6" 1181 | } 1182 | }, 1183 | "ms": { 1184 | "version": "2.0.0", 1185 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1186 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1187 | }, 1188 | "mute-stream": { 1189 | "version": "0.0.7", 1190 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1191 | "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", 1192 | "dev": true 1193 | }, 1194 | "natural-compare": { 1195 | "version": "1.4.0", 1196 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1197 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1198 | "dev": true 1199 | }, 1200 | "negotiator": { 1201 | "version": "0.6.3", 1202 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1203 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1204 | }, 1205 | "nice-try": { 1206 | "version": "1.0.5", 1207 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1208 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1209 | "dev": true 1210 | }, 1211 | "object-inspect": { 1212 | "version": "1.13.1", 1213 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1214 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" 1215 | }, 1216 | "on-finished": { 1217 | "version": "2.4.1", 1218 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1219 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1220 | "requires": { 1221 | "ee-first": "1.1.1" 1222 | } 1223 | }, 1224 | "once": { 1225 | "version": "1.4.0", 1226 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1227 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1228 | "dev": true, 1229 | "requires": { 1230 | "wrappy": "1" 1231 | } 1232 | }, 1233 | "onetime": { 1234 | "version": "2.0.1", 1235 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1236 | "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", 1237 | "dev": true, 1238 | "requires": { 1239 | "mimic-fn": "^1.0.0" 1240 | } 1241 | }, 1242 | "optionator": { 1243 | "version": "0.8.3", 1244 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1245 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1246 | "dev": true, 1247 | "requires": { 1248 | "deep-is": "~0.1.3", 1249 | "fast-levenshtein": "~2.0.6", 1250 | "levn": "~0.3.0", 1251 | "prelude-ls": "~1.1.2", 1252 | "type-check": "~0.3.2", 1253 | "word-wrap": "~1.2.3" 1254 | } 1255 | }, 1256 | "os-tmpdir": { 1257 | "version": "1.0.2", 1258 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1259 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 1260 | "dev": true 1261 | }, 1262 | "parent-module": { 1263 | "version": "1.0.1", 1264 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1265 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1266 | "dev": true, 1267 | "requires": { 1268 | "callsites": "^3.0.0" 1269 | } 1270 | }, 1271 | "parseurl": { 1272 | "version": "1.3.3", 1273 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1274 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1275 | }, 1276 | "path-is-absolute": { 1277 | "version": "1.0.1", 1278 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1279 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1280 | "dev": true 1281 | }, 1282 | "path-is-inside": { 1283 | "version": "1.0.2", 1284 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1285 | "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", 1286 | "dev": true 1287 | }, 1288 | "path-key": { 1289 | "version": "2.0.1", 1290 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1291 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 1292 | "dev": true 1293 | }, 1294 | "path-parse": { 1295 | "version": "1.0.7", 1296 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1297 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1298 | "dev": true 1299 | }, 1300 | "path-to-regexp": { 1301 | "version": "0.1.7", 1302 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1303 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1304 | }, 1305 | "picocolors": { 1306 | "version": "1.0.1", 1307 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", 1308 | "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", 1309 | "dev": true 1310 | }, 1311 | "prelude-ls": { 1312 | "version": "1.1.2", 1313 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1314 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", 1315 | "dev": true 1316 | }, 1317 | "progress": { 1318 | "version": "2.0.3", 1319 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1320 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1321 | "dev": true 1322 | }, 1323 | "proxy-addr": { 1324 | "version": "2.0.7", 1325 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1326 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1327 | "requires": { 1328 | "forwarded": "0.2.0", 1329 | "ipaddr.js": "1.9.1" 1330 | } 1331 | }, 1332 | "proxy-from-env": { 1333 | "version": "1.1.0", 1334 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1335 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1336 | }, 1337 | "punycode": { 1338 | "version": "2.3.1", 1339 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1340 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1341 | "dev": true 1342 | }, 1343 | "qs": { 1344 | "version": "6.11.0", 1345 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1346 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1347 | "requires": { 1348 | "side-channel": "^1.0.4" 1349 | } 1350 | }, 1351 | "range-parser": { 1352 | "version": "1.2.1", 1353 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1354 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1355 | }, 1356 | "raw-body": { 1357 | "version": "2.5.2", 1358 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1359 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1360 | "requires": { 1361 | "bytes": "3.1.2", 1362 | "http-errors": "2.0.0", 1363 | "iconv-lite": "0.4.24", 1364 | "unpipe": "1.0.0" 1365 | } 1366 | }, 1367 | "regexpp": { 1368 | "version": "2.0.1", 1369 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1370 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1371 | "dev": true 1372 | }, 1373 | "resolve": { 1374 | "version": "1.22.8", 1375 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1376 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1377 | "dev": true, 1378 | "requires": { 1379 | "is-core-module": "^2.13.0", 1380 | "path-parse": "^1.0.7", 1381 | "supports-preserve-symlinks-flag": "^1.0.0" 1382 | } 1383 | }, 1384 | "resolve-from": { 1385 | "version": "4.0.0", 1386 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1387 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1388 | "dev": true 1389 | }, 1390 | "restore-cursor": { 1391 | "version": "2.0.0", 1392 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1393 | "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", 1394 | "dev": true, 1395 | "requires": { 1396 | "onetime": "^2.0.0", 1397 | "signal-exit": "^3.0.2" 1398 | } 1399 | }, 1400 | "rimraf": { 1401 | "version": "2.6.3", 1402 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1403 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1404 | "dev": true, 1405 | "requires": { 1406 | "glob": "^7.1.3" 1407 | } 1408 | }, 1409 | "run-async": { 1410 | "version": "2.4.1", 1411 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", 1412 | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", 1413 | "dev": true 1414 | }, 1415 | "rxjs": { 1416 | "version": "6.6.7", 1417 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", 1418 | "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", 1419 | "dev": true, 1420 | "requires": { 1421 | "tslib": "^1.9.0" 1422 | } 1423 | }, 1424 | "safe-buffer": { 1425 | "version": "5.2.1", 1426 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1427 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1428 | }, 1429 | "safer-buffer": { 1430 | "version": "2.1.2", 1431 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1432 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1433 | }, 1434 | "sax": { 1435 | "version": "1.3.0", 1436 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", 1437 | "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" 1438 | }, 1439 | "semver": { 1440 | "version": "5.7.2", 1441 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1442 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1443 | "dev": true 1444 | }, 1445 | "send": { 1446 | "version": "0.18.0", 1447 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1448 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1449 | "requires": { 1450 | "debug": "2.6.9", 1451 | "depd": "2.0.0", 1452 | "destroy": "1.2.0", 1453 | "encodeurl": "~1.0.2", 1454 | "escape-html": "~1.0.3", 1455 | "etag": "~1.8.1", 1456 | "fresh": "0.5.2", 1457 | "http-errors": "2.0.0", 1458 | "mime": "1.6.0", 1459 | "ms": "2.1.3", 1460 | "on-finished": "2.4.1", 1461 | "range-parser": "~1.2.1", 1462 | "statuses": "2.0.1" 1463 | }, 1464 | "dependencies": { 1465 | "ms": { 1466 | "version": "2.1.3", 1467 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1468 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1469 | } 1470 | } 1471 | }, 1472 | "serve-static": { 1473 | "version": "1.15.0", 1474 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1475 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1476 | "requires": { 1477 | "encodeurl": "~1.0.2", 1478 | "escape-html": "~1.0.3", 1479 | "parseurl": "~1.3.3", 1480 | "send": "0.18.0" 1481 | } 1482 | }, 1483 | "set-function-length": { 1484 | "version": "1.2.2", 1485 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1486 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1487 | "requires": { 1488 | "define-data-property": "^1.1.4", 1489 | "es-errors": "^1.3.0", 1490 | "function-bind": "^1.1.2", 1491 | "get-intrinsic": "^1.2.4", 1492 | "gopd": "^1.0.1", 1493 | "has-property-descriptors": "^1.0.2" 1494 | } 1495 | }, 1496 | "setprototypeof": { 1497 | "version": "1.2.0", 1498 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1499 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1500 | }, 1501 | "shebang-command": { 1502 | "version": "1.2.0", 1503 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1504 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 1505 | "dev": true, 1506 | "requires": { 1507 | "shebang-regex": "^1.0.0" 1508 | } 1509 | }, 1510 | "shebang-regex": { 1511 | "version": "1.0.0", 1512 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1513 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 1514 | "dev": true 1515 | }, 1516 | "side-channel": { 1517 | "version": "1.0.6", 1518 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1519 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1520 | "requires": { 1521 | "call-bind": "^1.0.7", 1522 | "es-errors": "^1.3.0", 1523 | "get-intrinsic": "^1.2.4", 1524 | "object-inspect": "^1.13.1" 1525 | } 1526 | }, 1527 | "signal-exit": { 1528 | "version": "3.0.7", 1529 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1530 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1531 | "dev": true 1532 | }, 1533 | "slice-ansi": { 1534 | "version": "2.1.0", 1535 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 1536 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 1537 | "dev": true, 1538 | "requires": { 1539 | "ansi-styles": "^3.2.0", 1540 | "astral-regex": "^1.0.0", 1541 | "is-fullwidth-code-point": "^2.0.0" 1542 | } 1543 | }, 1544 | "sprintf-js": { 1545 | "version": "1.0.3", 1546 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1547 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 1548 | "dev": true 1549 | }, 1550 | "statuses": { 1551 | "version": "2.0.1", 1552 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1553 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1554 | }, 1555 | "string-width": { 1556 | "version": "2.1.1", 1557 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1558 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1559 | "dev": true, 1560 | "requires": { 1561 | "is-fullwidth-code-point": "^2.0.0", 1562 | "strip-ansi": "^4.0.0" 1563 | } 1564 | }, 1565 | "strip-ansi": { 1566 | "version": "4.0.0", 1567 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1568 | "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", 1569 | "dev": true, 1570 | "requires": { 1571 | "ansi-regex": "^3.0.0" 1572 | } 1573 | }, 1574 | "strip-json-comments": { 1575 | "version": "2.0.1", 1576 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1577 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 1578 | "dev": true 1579 | }, 1580 | "supports-color": { 1581 | "version": "5.5.0", 1582 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1583 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1584 | "dev": true, 1585 | "requires": { 1586 | "has-flag": "^3.0.0" 1587 | } 1588 | }, 1589 | "supports-preserve-symlinks-flag": { 1590 | "version": "1.0.0", 1591 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1592 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1593 | "dev": true 1594 | }, 1595 | "table": { 1596 | "version": "5.4.6", 1597 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1598 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1599 | "dev": true, 1600 | "requires": { 1601 | "ajv": "^6.10.2", 1602 | "lodash": "^4.17.14", 1603 | "slice-ansi": "^2.1.0", 1604 | "string-width": "^3.0.0" 1605 | }, 1606 | "dependencies": { 1607 | "ansi-regex": { 1608 | "version": "4.1.1", 1609 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 1610 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 1611 | "dev": true 1612 | }, 1613 | "string-width": { 1614 | "version": "3.1.0", 1615 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1616 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1617 | "dev": true, 1618 | "requires": { 1619 | "emoji-regex": "^7.0.1", 1620 | "is-fullwidth-code-point": "^2.0.0", 1621 | "strip-ansi": "^5.1.0" 1622 | } 1623 | }, 1624 | "strip-ansi": { 1625 | "version": "5.2.0", 1626 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1627 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1628 | "dev": true, 1629 | "requires": { 1630 | "ansi-regex": "^4.1.0" 1631 | } 1632 | } 1633 | } 1634 | }, 1635 | "text-table": { 1636 | "version": "0.2.0", 1637 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1638 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1639 | "dev": true 1640 | }, 1641 | "through": { 1642 | "version": "2.3.8", 1643 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1644 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1645 | "dev": true 1646 | }, 1647 | "tmp": { 1648 | "version": "0.0.33", 1649 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1650 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1651 | "dev": true, 1652 | "requires": { 1653 | "os-tmpdir": "~1.0.2" 1654 | } 1655 | }, 1656 | "to-fast-properties": { 1657 | "version": "2.0.0", 1658 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1659 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 1660 | "dev": true 1661 | }, 1662 | "toidentifier": { 1663 | "version": "1.0.1", 1664 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1665 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1666 | }, 1667 | "tslib": { 1668 | "version": "1.14.1", 1669 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 1670 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 1671 | "dev": true 1672 | }, 1673 | "type-check": { 1674 | "version": "0.3.2", 1675 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1676 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", 1677 | "dev": true, 1678 | "requires": { 1679 | "prelude-ls": "~1.1.2" 1680 | } 1681 | }, 1682 | "type-is": { 1683 | "version": "1.6.18", 1684 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1685 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1686 | "requires": { 1687 | "media-typer": "0.3.0", 1688 | "mime-types": "~2.1.24" 1689 | } 1690 | }, 1691 | "unpipe": { 1692 | "version": "1.0.0", 1693 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1694 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1695 | }, 1696 | "uri-js": { 1697 | "version": "4.4.1", 1698 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1699 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1700 | "dev": true, 1701 | "requires": { 1702 | "punycode": "^2.1.0" 1703 | } 1704 | }, 1705 | "utils-merge": { 1706 | "version": "1.0.1", 1707 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1708 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1709 | }, 1710 | "vary": { 1711 | "version": "1.1.2", 1712 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1713 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1714 | }, 1715 | "vue-eslint-parser": { 1716 | "version": "5.0.0", 1717 | "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz", 1718 | "integrity": "sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==", 1719 | "dev": true, 1720 | "requires": { 1721 | "debug": "^4.1.0", 1722 | "eslint-scope": "^4.0.0", 1723 | "eslint-visitor-keys": "^1.0.0", 1724 | "espree": "^4.1.0", 1725 | "esquery": "^1.0.1", 1726 | "lodash": "^4.17.11" 1727 | }, 1728 | "dependencies": { 1729 | "debug": { 1730 | "version": "4.3.4", 1731 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1732 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1733 | "dev": true, 1734 | "requires": { 1735 | "ms": "2.1.2" 1736 | } 1737 | }, 1738 | "espree": { 1739 | "version": "4.1.0", 1740 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", 1741 | "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", 1742 | "dev": true, 1743 | "requires": { 1744 | "acorn": "^6.0.2", 1745 | "acorn-jsx": "^5.0.0", 1746 | "eslint-visitor-keys": "^1.0.0" 1747 | } 1748 | }, 1749 | "ms": { 1750 | "version": "2.1.2", 1751 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1752 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1753 | "dev": true 1754 | } 1755 | } 1756 | }, 1757 | "wechat-crypto": { 1758 | "version": "0.0.2", 1759 | "resolved": "https://registry.npmjs.org/wechat-crypto/-/wechat-crypto-0.0.2.tgz", 1760 | "integrity": "sha512-VGCWUmg+4klU+auFBhhiVRBvBsMYnfgQ4ZhW9XQDrMXSYJDCuBvsc8BCwAdAFr9JY9EluYQCbSA9tMUpdd5cPg==" 1761 | }, 1762 | "which": { 1763 | "version": "1.3.1", 1764 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1765 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1766 | "dev": true, 1767 | "requires": { 1768 | "isexe": "^2.0.0" 1769 | } 1770 | }, 1771 | "word-wrap": { 1772 | "version": "1.2.5", 1773 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1774 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1775 | "dev": true 1776 | }, 1777 | "wrappy": { 1778 | "version": "1.0.2", 1779 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1780 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1781 | "dev": true 1782 | }, 1783 | "write": { 1784 | "version": "1.0.3", 1785 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1786 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1787 | "dev": true, 1788 | "requires": { 1789 | "mkdirp": "^0.5.1" 1790 | } 1791 | }, 1792 | "xml2js": { 1793 | "version": "0.4.23", 1794 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1795 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1796 | "requires": { 1797 | "sax": ">=0.6.0", 1798 | "xmlbuilder": "~11.0.0" 1799 | } 1800 | }, 1801 | "xmlbuilder": { 1802 | "version": "11.0.1", 1803 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1804 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1805 | } 1806 | } 1807 | } 1808 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-red-contrib-bizwechat", 3 | "version": "1.2.1", 4 | "description": "企业微信消息接收转发至NodeRed", 5 | "main": "index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/FlashSoft/node-red-contrib-bizwechat.git" 9 | }, 10 | "keywords": [ 11 | "node-red", 12 | "nodered", 13 | "NodeRed", 14 | "WeChat", 15 | "BizWeChat" 16 | ], 17 | "node-red": { 18 | "nodes": { 19 | "bizwechat": "bizwechat.js", 20 | "bizwechat-configurator": "bizwechat-configurator.js" 21 | } 22 | }, 23 | "author": "FlashSoft", 24 | "license": "Apache-2.0", 25 | "bugs": { 26 | "url": "https://github.com/FlashSoft/node-red-contrib-bizwechat/issues" 27 | }, 28 | "homepage": "https://github.com/FlashSoft/node-red-contrib-bizwechat#readme", 29 | "dependencies": { 30 | "axios": ">=0.18.1", 31 | "express": "^4.16.4", 32 | "form-data": "^2.5.1", 33 | "marked": "^0.7.0", 34 | "mkdirp": "^0.5.1", 35 | "wechat-crypto": "0.0.2", 36 | "xml2js": "^0.4.19" 37 | }, 38 | "devDependencies": { 39 | "babel-eslint": "^10.0.1", 40 | "eslint": "^5.16.0", 41 | "eslint-config-vue": "^2.0.2", 42 | "eslint-plugin-vue": "^5.2.2" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /pushbear.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const pushBearRouter = express.Router() 3 | 4 | const os = require('os') 5 | const fs = require('fs') 6 | const util = require('util') 7 | const readAsync = util.promisify(fs.readFile) 8 | 9 | pushBearRouter.get('/:date/:id', async (req, res, next) => { 10 | const content = await getSendTemplate(req) 11 | res.status(200).end(content) 12 | }) 13 | 14 | const getSendTemplate = async (req) => { 15 | let title = 'hello' 16 | let content = 'test' 17 | let time = '刚刚' 18 | const rootDir = os.homedir() 19 | const path = `${rootDir}/.node-red/pushbear/${req.params.date}/${req.params.id}.txt` 20 | try { 21 | const data = await readAsync(path) 22 | const fileContent = JSON.parse(data) 23 | title = fileContent.title 24 | content = fileContent.description 25 | const _date = new Date(fileContent.time) 26 | time = _date.toLocaleString() 27 | } catch (err) { 28 | title = '文件不存在' 29 | content = '请确认文件是否删除' 30 | time = '' 31 | } 32 | 33 | return ` 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 消息阅读 | PushBear 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 59 | 105 | 106 | 107 | 108 | 109 |
110 | 113 |
时间:${time}
114 |
115 |

${content}

116 |
117 |
118 | 125 | 126 | 127 | 128 | ` 129 | } 130 | 131 | const indexHtml = ` 132 | 133 | 134 | bizwechat 135 | 139 | 140 | 141 |

bizwechat(企业微信版本的pushbear)

142 |

欢迎使用由 flashsoft 大佬 ,F 大佬 , 143 | smarthomefans 144 | 提供的企业微信版本的pushbear。如果你看到这个界面证明你已经安装成功了 145 |

146 |

如需发现更多好玩的智能家居玩法请访问这里

147 | 148 | ` 149 | 150 | module.exports = { pushBearRouter, indexHtml } 151 | 152 | --------------------------------------------------------------------------------