├── .eslintrc ├── .github ├── CODEOWNERS ├── pull_request_template.md └── workflows │ ├── lint.yml │ ├── newsfile.yml │ ├── sign-off.yml │ ├── tests.yml │ └── triage-incoming.yml ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── changelog.d ├── .gitkeep ├── 69.misc ├── 70.misc └── 71.doc ├── package.json ├── pyproject.toml ├── scripts ├── changelog-release.sh └── check-newsfragment ├── src ├── AppserviceHttpError.ts ├── app-service-registration.ts ├── app-service.ts └── index.ts ├── test └── test_app-service-registration.ts ├── tsconfig.json └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "plugins": ["@typescript-eslint"], 4 | "extends": ["plugin:@typescript-eslint/recommended"], 5 | "env": { 6 | "node": true, 7 | "jasmine": true 8 | }, 9 | "rules": { 10 | "@typescript-eslint/explicit-function-return-type": 0, 11 | "@typescript-eslint/explicit-module-boundary-types": 0, 12 | "camelcase": ["error", { "properties": "never" }] 13 | } 14 | } -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @matrix-org/bridges 2 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | push: 5 | branches: [ develop ] 6 | pull_request: 7 | branches: [ develop ] 8 | 9 | jobs: 10 | lint: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: Use Node.js 15 | uses: actions/setup-node@v3 16 | with: 17 | node-version: 18 18 | - run: yarn --ignore-scripts --strict-semver --pure-lockfile 19 | - run: yarn lint -------------------------------------------------------------------------------- /.github/workflows/newsfile.yml: -------------------------------------------------------------------------------- 1 | name: Newsfile 2 | 3 | on: 4 | pull_request: 5 | branches: [ develop ] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | changelog: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | with: # Needed for comparison 14 | fetch-depth: 0 15 | - uses: actions/setup-python@v1 16 | with: 17 | python-version: '3.9' 18 | - run: pip install towncrier==21.9.0 19 | - name: ":newspaper: Newsfile" 20 | run: ./scripts/check-newsfragment 21 | -------------------------------------------------------------------------------- /.github/workflows/sign-off.yml: -------------------------------------------------------------------------------- 1 | name: Contribution requirements 2 | 3 | on: 4 | pull_request: 5 | types: [opened, edited, synchronize] 6 | 7 | jobs: 8 | signoff: 9 | uses: matrix-org/backend-meta/.github/workflows/sign-off.yml@v1.4.1 10 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | push: 5 | branches: [ develop ] 6 | pull_request: 7 | branches: [ develop ] 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | node_version: [18, 20] 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: Use Node.js 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: "${{ matrix.node_version }}" 21 | - run: yarn --ignore-scripts --pure-lockfile 22 | - run: yarn test -------------------------------------------------------------------------------- /.github/workflows/triage-incoming.yml: -------------------------------------------------------------------------------- 1 | name: Move new issues into the issue triage board 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | 7 | jobs: 8 | triage: 9 | uses: matrix-org/backend-meta/.github/workflows/triage-incoming.yml@v1 10 | with: 11 | project_id: 'PVT_kwDOAIB0Bs4AG0bY' 12 | content_id: ${{ github.event.issue.node_id }} 13 | secrets: 14 | github_access_token: ${{ secrets.ELEMENT_BOT_TOKEN }} 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | out 5 | .jsdoc 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # Compiled binary addons (http://nodejs.org/api/addons.html) 22 | build/Release 23 | 24 | # Dependency directory 25 | # Commenting this out is preferred by some people, see 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 27 | node_modules 28 | 29 | # Users Environment Variables 30 | .lock-wscript 31 | 32 | config.js 33 | 34 | # Typescript 35 | lib/ 36 | 37 | # Docs 38 | .typedoc/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.tsbuildinfo 2 | .typedoc -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2.0.0 (2023-04-21) 2 | ================== 3 | 4 | Deprecations and Removals 5 | ------------------------- 6 | 7 | - The legacy `/users`, `/rooms`, and `/transactions` endpoints have been removed in this release 8 | and now redirect to the appropriate spec'd path. ([\#63](https://github.com/matrix-org/matrix-appservice-node/issues/63)) 9 | - Add support for Node 20, and drop support for Node 16. ([\#65](https://github.com/matrix-org/matrix-appservice-node/issues/65)) 10 | 11 | 12 | Internal Changes 13 | ---------------- 14 | 15 | - Update the version of `express` to match that of `matrix-appservice-bridge`. ([\#60](https://github.com/matrix-org/matrix-appservice-node/issues/60)) 16 | 17 | 18 | 1.1.0 (2022-08-09) 19 | ================== 20 | 21 | Features 22 | -------- 23 | 24 | - A subclass of the `AppService` class can now signal user query errors in its onUserQuery method by throwing an `AppserviceHttpError` exception. This allows the appservice to return a HTTP status, a Matrix errorcode, and a Matrix error message. ([\#56](https://github.com/matrix-org/matrix-appservice-node/issues/56)) 25 | 26 | 27 | Internal Changes 28 | ---------------- 29 | 30 | - Add new CI workflow to check for signoffs. ([\#58](https://github.com/matrix-org/matrix-appservice-node/issues/58)) 31 | 32 | 33 | 1.0.0 (2022-07-20) 34 | ================== 35 | 36 | **This release drops support for Node 12 and adds support for Node 18** 37 | 38 | Features 39 | -------- 40 | 41 | - Support Authorization headers ([MSC2832](https://github.com/matrix-org/matrix-spec-proposals/pull/2832)). ([\#52](https://github.com/matrix-org/matrix-appservice-node/issues/52)) 42 | 43 | 44 | Internal Changes 45 | ---------------- 46 | 47 | - The project has been modernized to be in-line with our other matrix-org bridge repos. This means: 48 | - We now use yarn for dependency management. 49 | - We now use GitHub CI. 50 | - There is a contributing file. ([\#57](https://github.com/matrix-org/matrix-appservice-node/issues/57)) 51 | 52 | 53 | 0.10.1 (2022-03-15) 54 | ==================== 55 | 56 | Bugfixes 57 | -------- 58 | 59 | - Remove tailing new line on http-log events ([\#50](https://github.com/matrix-org/matrix-appservice-node/issues/50)) 60 | 61 | 62 | 0.10.0 (2021-11-23) 63 | ==================== 64 | 65 | Internal Changes 66 | ---------------- 67 | 68 | - Update dependencies, including Typescript to `4.5.2` ([\#45](https://github.com/matrix-org/matrix-appservice-node/issues/45)) 69 | 70 | 71 | 0.9.0 (2021-07-15) 72 | ================== 73 | 74 | Internal Changes 75 | ---------------- 76 | 77 | - The `master` branch has been renamed to `develop` to be consistent wih other `matrix-org` projects. ([\#40](https://github.com/matrix-org/matrix-appservice-node/issues/40)) 78 | - Update to Typescript 4.3.5 and update Typedoc. ([\#44](https://github.com/matrix-org/matrix-appservice-node/issues/44)) 79 | 80 | 81 | 0.8.0 (2021-03-01) 82 | =================== 83 | 84 | Features 85 | -------- 86 | 87 | - Add health check endpoint ([\#38](https://github.com/matrix-org/matrix-appservice-node/issues/38)) 88 | 89 | 90 | 0.7.1 (2020-11-05) 91 | =================== 92 | 93 | Internal Changes 94 | ---------------- 95 | 96 | - Export `AppServiceOutput` and `RegexObj` interfaces. ([\#35](https://github.com/matrix-org/matrix-appservice-node/issues/35)) 97 | 98 | 99 | 0.7.0 (2020-10-30) 100 | =================== 101 | 102 | Bugfixes 103 | -------- 104 | 105 | - Fix issue where `AppServiceRegistration.getOutput()` would fail if `de.sorunome.msc2409.push_ephemeral` is undefined. ([\#34](https://github.com/matrix-org/matrix-appservice-node/issues/34)) 106 | 107 | 108 | 0.6.0 (2020-10-08) 109 | =================== 110 | 111 | Features 112 | -------- 113 | 114 | - Add experimental support for receiving ephemeral data from the homeserver (MSC2409) ([\#32](https://github.com/matrix-org/matrix-appservice-node/issues/32)) 115 | 116 | 117 | 0.5.0 (2020-09-14) 118 | =================== 119 | 120 | Features 121 | -------- 122 | 123 | - Expose `AppService.app` so that services may add their own Express request handlers. ([\#26](https://github.com/matrix-org/matrix-appservice-node/issues/26)) 124 | - Expose `AppService.expressApp` ([\#27](https://github.com/matrix-org/matrix-appservice-node/issues/27)) 125 | - Documentation is now generated for Typescript files ([\#28](https://github.com/matrix-org/matrix-appservice-node/issues/28)) 126 | 127 | 128 | Internal Changes 129 | ---------------- 130 | 131 | - Remove `request` dependency ([\#25](https://github.com/matrix-org/matrix-appservice-node/issues/25)) 132 | 133 | 134 | 0.4.2 (2020-07-24) 135 | =================== 136 | 137 | Internal Changes 138 | ---------------- 139 | 140 | - Start using towncrier for changelogs ([\#23](https://github.com/matrix-org/matrix-appservice-node/issues/23)) 141 | - Update packages. ([\#24](https://github.com/matrix-org/matrix-appservice-node/issues/24)) 142 | 143 | 144 | v0.4.1 145 | ====== 146 | 147 | - Fixed an issue which caused the package to fail to install. 148 | 149 | v0.4.0 150 | ====== 151 | 152 | - **The library is now written in Typescript**. 153 | This change should not cause any breakages, as the library will 154 | compile itself on installation via the `postinstall` script. 155 | 156 | v0.3.5 157 | ====== 158 | 159 | Updated `body-parser`, `express`, `morgan` and `request` packages to fix security vulnerabilities. 160 | 161 | 162 | v0.3.4 163 | ====== 164 | `AppServiceRegistration`: 165 | * Added `getProtocols()` and `setProtocols(string[])`. (Thanks @Half-Shot!) 166 | `AppService`: 167 | * Add HTTPS support if the environment variables `MATRIX_AS_TLS_KEY` and `MATRIX_AS_TLS_CERT` exist. (Thanks @AndrewJDR!) 168 | 169 | v0.3.3 170 | ====== 171 | `AppService`: 172 | * Redact access tokens in the AppService logs. 173 | `AppServiceRegistration`: 174 | * Added a flag to indicate to the HS not to rate limit the AS client or any users belonging to the AS. The default is set to `true`. Set by calling `setRateLimited(false)`. 175 | 176 | v0.3.2 177 | ====== 178 | Expanded `AppService.listen` to accept more parameters to control how the service 179 | listens for connections. 180 | 181 | v0.3.1 182 | ====== 183 | `AppServiceRegistration`: 184 | * Bug fix which prevented registration files from being loaded correctly. 185 | 186 | v0.3.0 187 | ====== 188 | `AppServiceRegistration`: 189 | * Require an ID to be set with the `setId` method. 190 | 191 | v0.2.3 192 | ====== 193 | `AppServiceRegistration`: 194 | * Added instance method `setAppServiceUrl`. Setting the URL in the constructor 195 | is still possible but discouraged as it is less clear which URL should go 196 | there (HS or AS). 197 | 198 | v0.2.2 199 | ====== 200 | `AppServiceRegistration`: 201 | * Added static method `fromObject` 202 | * Added instance methods `isUserMatch`, `isAliasMatch`, `isRoomMatch`. 203 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Hi there! Please read the [CONTRIBUTING.md](https://github.com/matrix-org/matrix-appservice-bridge/blob/develop/CONTRIBUTING.md) guide for all matrix.org bridge 2 | projects. -------------------------------------------------------------------------------- /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 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | matrix-appservice-node 2 | ====================== 3 | 4 | This is a Matrix Application Service framework written in Node.js. 5 | 6 | This can be used to quickly setup performant application services for almost 7 | anything you can think of in a web framework agnostic way. 8 | 9 | If you are looking for a more fully-featured SDK for creating bridges, 10 | you may want to check out [matrix-appservice-bridge](https://github.com/matrix-org/matrix-appservice-bridge) instead. 11 | 12 | ### Example 13 | 14 | To create an app service registration file: 15 | ```javascript 16 | const { AppServiceRegistration } = require("matrix-appservice"); 17 | 18 | // creating registration files 19 | const reg = new AppServiceRegistration(); 20 | reg.setAppServiceUrl("http://localhost:8010"); 21 | reg.setHomeserverToken(AppServiceRegistration.generateToken()); 22 | reg.setAppServiceToken(AppServiceRegistration.generateToken()); 23 | reg.setSenderLocalpart("example-appservice"); 24 | reg.addRegexPattern("users", "@.*", true); 25 | reg.setProtocols(["exampleservice"]); // For 3PID lookups 26 | reg.setId("example-service"); 27 | reg.outputAsYaml("registration.yaml"); 28 | ``` 29 | 30 | You only need to generate a registration once, provided the registration info does not 31 | change. Once you have generated a registration, you can run the app service like so: 32 | 33 | ```javascript 34 | import { AppService, AppserviceHttpError } from "matrix-appservice"; 35 | // listening 36 | const as = new AppService({ 37 | homeserverToken: "abcd653bac492087d3c87" 38 | }); 39 | as.on("type:m.room.message", (event) => { 40 | // handle the incoming message 41 | }); 42 | as.onUserQuery = function(userId, callback) { 43 | // handle the incoming user query then respond 44 | console.log("RECV %s", userId); 45 | 46 | /* 47 | // if this userId cannot be created, or if some error 48 | // conditions occur, throw AppserviceHttpError exception. 49 | // The underlying appservice code will send the HTTP status, 50 | // Matrix errorcode and error message back as a response. 51 | 52 | if (userCreationOrQueryFailed) { 53 | throw new AppserviceHttpError( 54 | { 55 | errcode: "M_FORBIDDEN", 56 | error: "User query or creation failed.", 57 | }, 58 | 403, // Forbidden, or an appropriate HTTP status 59 | ) 60 | } 61 | */ 62 | 63 | callback(); 64 | }; 65 | // can also do this as a promise 66 | as.onAliasQuery = async function(alias) { 67 | console.log("RECV %s", alias); 68 | }; 69 | as.listen(8010); 70 | ``` 71 | 72 | ### TLS Connections 73 | 74 | If `MATRIX_AS_TLS_KEY` and `MATRIX_AS_TLS_CERT` environment variables are 75 | defined and point to valid tls key and cert files, the AS will listen using 76 | an HTTPS listener. 77 | 78 | ### API Reference 79 | 80 | A hosted API reference can be found on [GitHub Pages](https://matrix-org.github.io/matrix-appservice-node/index.html). 81 | 82 | -------------------------------------------------------------------------------- /changelog.d/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matrix-org/matrix-appservice-node/20b8fdc0f2c6acfd71638bc1d12fef0666b9cd6d/changelog.d/.gitkeep -------------------------------------------------------------------------------- /changelog.d/69.misc: -------------------------------------------------------------------------------- 1 | Update semver from 7.3.7 to 7.5.4. 2 | -------------------------------------------------------------------------------- /changelog.d/70.misc: -------------------------------------------------------------------------------- 1 | Update word-wrap from 1.2.3 to 1.2.4. 2 | -------------------------------------------------------------------------------- /changelog.d/71.doc: -------------------------------------------------------------------------------- 1 | Fix the README's example script for creating an app service registration file. 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "matrix-appservice", 3 | "version": "2.0.0", 4 | "description": "Matrix Application Service Framework", 5 | "main": "lib/index.js", 6 | "types": "lib/index.d.ts", 7 | "engines": { 8 | "node": ">=18" 9 | }, 10 | "directories": { 11 | "test": "tests" 12 | }, 13 | "scripts": { 14 | "gendoc": "typedoc", 15 | "test": "mocha -r ts-node/register test/*.ts", 16 | "lint": "eslint -c .eslintrc --max-warnings 0 src/**/*.ts", 17 | "build": "tsc --project tsconfig.json", 18 | "prepare": "npm run build" 19 | }, 20 | "repository": { 21 | "url": "https://github.com/matrix-org/matrix-appservice-node" 22 | }, 23 | "keywords": [ 24 | "matrix-org" 25 | ], 26 | "author": "matrix.org", 27 | "license": "Apache-2.0", 28 | "dependencies": { 29 | "body-parser": "^1.19.0", 30 | "express": "^4.18.1", 31 | "js-yaml": "^4.1.0", 32 | "morgan": "^1.10.0" 33 | }, 34 | "devDependencies": { 35 | "@tsconfig/node18": "^2.0.0", 36 | "@types/body-parser": "^1.19.2", 37 | "@types/chai": "^4.2.22", 38 | "@types/express": "^4.17.14", 39 | "@types/js-yaml": "^4.0.5", 40 | "@types/mocha": "^9.0.0", 41 | "@types/morgan": "^1.9.3", 42 | "@types/node": "^18", 43 | "@typescript-eslint/eslint-plugin": "^5.4.0", 44 | "@typescript-eslint/parser": "^5.4.0", 45 | "chai": "^4.3.4", 46 | "eslint": "^8.3.0", 47 | "mocha": "^9.1.3", 48 | "ts-node": "^10.9.1", 49 | "typedoc": "^0.24.4", 50 | "typescript": "^5.0.4" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.towncrier] 2 | filename = "CHANGELOG.md" 3 | directory = "changelog.d" 4 | issue_format = "[\\#{issue}](https://github.com/matrix-org/matrix-appservice-node/issues/{issue})" 5 | 6 | [[tool.towncrier.type]] 7 | directory = "feature" 8 | name = "Features" 9 | showcontent = true 10 | 11 | [[tool.towncrier.type]] 12 | directory = "bugfix" 13 | name = "Bugfixes" 14 | showcontent = true 15 | 16 | [[tool.towncrier.type]] 17 | directory = "doc" 18 | name = "Improved Documentation" 19 | showcontent = true 20 | 21 | [[tool.towncrier.type]] 22 | directory = "removal" 23 | name = "Deprecations and Removals" 24 | showcontent = true 25 | 26 | [[tool.towncrier.type]] 27 | directory = "misc" 28 | name = "Internal Changes" 29 | showcontent = true 30 | -------------------------------------------------------------------------------- /scripts/changelog-release.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | VERSION=`python3 -c "import json; f = open('./package.json', 'r'); v = json.loads(f.read())['version']; f.close(); print(v)"` 3 | towncrier --version $VERSION $1 -------------------------------------------------------------------------------- /scripts/check-newsfragment: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # A script which checks that an appropriate news file has been added on this 4 | # branch. 5 | 6 | 7 | echo -e "+++ \033[32mChecking newsfragment\033[m" 8 | 9 | set -e 10 | 11 | # make sure that origin/develop is up to date 12 | git remote set-branches --add origin develop 13 | git fetch -q origin develop 14 | 15 | pr="$PULL_REQUEST_NUMBER" 16 | 17 | # Print a link to the contributing guide if the user makes a mistake 18 | CONTRIBUTING_GUIDE_TEXT="!! Please see the contributing guide for help writing your changelog entry: 19 | https://github.com/matrix-org/matrix-appservice-bridge/blob/develop/CONTRIBUTING.md#%EF%B8%8F-pull-requests" 20 | 21 | # If check-newsfragment returns a non-zero exit code, print the contributing guide and exit 22 | python3 -m towncrier.check --compare-with=origin/develop || (echo -e "$CONTRIBUTING_GUIDE_TEXT" >&2 && exit 1) 23 | 24 | echo 25 | echo "--------------------------" 26 | echo 27 | 28 | matched=0 29 | for f in $(git diff --diff-filter=d --name-only FETCH_HEAD... -- changelog.d); do 30 | # check that any added newsfiles on this branch end with a full stop. 31 | lastchar=$(tr -d '\n' < "$f" | tail -c 1) 32 | if [ "$lastchar" != '.' ] && [ "$lastchar" != '!' ]; then 33 | echo -e "\e[31mERROR: newsfragment $f does not end with a '.' or '!'\e[39m" >&2 34 | echo -e "$CONTRIBUTING_GUIDE_TEXT" >&2 35 | exit 1 36 | fi 37 | 38 | # see if this newsfile corresponds to the right PR 39 | [[ -n "$pr" && "$f" == changelog.d/"$pr".* ]] && matched=1 40 | done 41 | 42 | if [[ -n "$pr" && "$matched" -eq 0 ]]; then 43 | echo -e "\e[31mERROR: Did not find a news fragment with the right number: expected changelog.d/$pr.*.\e[39m" >&2 44 | echo -e "$CONTRIBUTING_GUIDE_TEXT" >&2 45 | exit 1 46 | fi 47 | -------------------------------------------------------------------------------- /src/AppserviceHttpError.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Represents an HTTP error from the Appservice. 3 | * @category Error handling 4 | */ 5 | export class AppserviceHttpError extends Error { 6 | /** 7 | * The Matrix error code 8 | */ 9 | public readonly errcode: string; 10 | 11 | /** 12 | * Optional human-readable error message. 13 | */ 14 | public readonly error: string; 15 | 16 | /** 17 | * Creates a new Appservice HTTP error 18 | * @param body The error body. 19 | * @param status The HTTP status code. 20 | */ 21 | constructor(readonly body: { errcode: string, error: string }, public readonly status: number) { 22 | super(); 23 | this.errcode = body.errcode; 24 | this.error = body.error; 25 | } 26 | 27 | /** 28 | * Developer-friendly error message. 29 | */ 30 | public get message() { 31 | return `${this.errcode}: ${this.error}`; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/app-service-registration.ts: -------------------------------------------------------------------------------- 1 | import { randomBytes } from "crypto"; 2 | import yaml from "js-yaml"; 3 | import fs from "fs"; 4 | 5 | export interface RegexObj { 6 | regex: string; 7 | exclusive: boolean; 8 | } 9 | 10 | export interface AppServiceOutput { 11 | url: string|null; 12 | id: string; 13 | // eslint-disable-next-line camelcase 14 | hs_token: string; 15 | // eslint-disable-next-line camelcase 16 | as_token: string; 17 | // eslint-disable-next-line camelcase 18 | sender_localpart: string; 19 | // eslint-disable-next-line camelcase 20 | rate_limited?: boolean; 21 | protocols?: string[]|null; 22 | "de.sorunome.msc2409.push_ephemeral"?: boolean; 23 | namespaces?: { 24 | users?: RegexObj[]; 25 | rooms?: RegexObj[]; 26 | aliases?: RegexObj[]; 27 | } 28 | } 29 | 30 | export class AppServiceRegistration { 31 | 32 | /** 33 | * Generate a random token. 34 | * @return {string} A randomly generated token. 35 | */ 36 | public static generateToken() { 37 | return randomBytes(32).toString('hex'); 38 | } 39 | 40 | /** 41 | * Convert a JSON object to an AppServiceRegistration object. 42 | * @static 43 | * @param obj The registration object 44 | * @return The registration. 45 | */ 46 | public static fromObject(obj: AppServiceOutput): AppServiceRegistration { 47 | const reg = new AppServiceRegistration(obj.url); 48 | reg.setId(obj.id); 49 | reg.setHomeserverToken(obj.hs_token); 50 | reg.setAppServiceToken(obj.as_token); 51 | reg.setSenderLocalpart(obj.sender_localpart); 52 | if (obj.rate_limited !== undefined) reg.setRateLimited(obj.rate_limited); 53 | if (obj.protocols) reg.setProtocols(obj.protocols); 54 | reg.pushEphemeral = obj["de.sorunome.msc2409.push_ephemeral"]; 55 | if (obj.namespaces) { 56 | const kinds: ("users"|"aliases"|"rooms")[] = ["users", "aliases", "rooms"]; 57 | for (const kind of kinds) { 58 | const namespace = obj.namespaces[kind]; 59 | if (!namespace) { 60 | continue; 61 | } 62 | namespace.forEach((regexObj: RegexObj) => { 63 | reg.addRegexPattern( 64 | kind, regexObj.regex, regexObj.exclusive, 65 | ); 66 | }); 67 | } 68 | } 69 | return reg; 70 | } 71 | 72 | /** 73 | * Construct a new application service registration. 74 | * @constructor 75 | * @param {string} appServiceUrl The base URL the AS can be reached via. 76 | */ 77 | private id: string|null = null; 78 | private hsToken: string|null = null; 79 | private asToken: string|null = null; 80 | private senderLocalpart: string|null = null; 81 | private rateLimited: boolean|undefined = undefined; 82 | /** 83 | * **Experimental** 84 | * Signal to the homeserver that this appservice will accept ephemeral events. 85 | */ 86 | public pushEphemeral: boolean|undefined = undefined; 87 | private namespaces: { 88 | users?: RegexObj[]; 89 | aliases?: RegexObj[]; 90 | rooms?: RegexObj[]; 91 | } = {}; 92 | private protocols: string[]|null = null; 93 | private cachedRegex: {[regextext: string]: RegExp} = {}; 94 | constructor (private url: string|null) { } 95 | 96 | /** 97 | * Set the URL which the home server will hit in order to talk to the AS. 98 | * @param {string} url The application service url 99 | */ 100 | public setAppServiceUrl(url: string) { 101 | this.url = url; 102 | } 103 | 104 | /** 105 | * Get the URL which the home server will hit in order to talk to the AS. 106 | */ 107 | public getAppServiceUrl() { 108 | return this.url; 109 | } 110 | 111 | /** 112 | * Set the ID of the appservice; must be unique across the homeserver and never change. 113 | * @param {string} id The ID 114 | */ 115 | public setId(id: string) { 116 | this.id = id; 117 | } 118 | 119 | /** 120 | * Get the ID of the appservice. 121 | * @return {?string} The ID 122 | */ 123 | public getId() { 124 | return this.id; 125 | } 126 | 127 | /** 128 | * Set the list of protocols that this appservice will serve for third party lookups. 129 | * @param {string[]} protocols The protocols 130 | */ 131 | public setProtocols(protocols: string[]) { 132 | this.protocols = protocols; 133 | } 134 | 135 | /** 136 | * Get the list of protocols that this appservice will serve for third party lookups. 137 | * Will return null if no protocols have been set. 138 | * @return {string[]} The protocols. 139 | */ 140 | public getProtocols() { 141 | return this.protocols; 142 | } 143 | 144 | /** 145 | * Set the token the homeserver will use to communicate with the app service. 146 | * @param {string} token The token 147 | */ 148 | public setHomeserverToken(token: string) { 149 | this.hsToken = token; 150 | } 151 | 152 | /** 153 | * Get the token the homeserver will use to communicate with the app service. 154 | * @return {?string} The token 155 | */ 156 | public getHomeserverToken() { 157 | return this.hsToken; 158 | } 159 | 160 | /** 161 | * Set the token the app service will use to communicate with the homeserver. 162 | * @param {string} token The token 163 | */ 164 | public setAppServiceToken(token: string) { 165 | this.asToken = token; 166 | } 167 | 168 | /** 169 | * Get the token the app service will use to communicate with the homeserver. 170 | * @return {?string} The token 171 | */ 172 | public getAppServiceToken() { 173 | return this.asToken; 174 | } 175 | 176 | /** 177 | * Set the desired user_id localpart for the app service itself. 178 | * @param {string} localpart The user_id localpart ("alice" in "@alice:domain") 179 | */ 180 | public setSenderLocalpart(localpart: string) { 181 | this.senderLocalpart = localpart; 182 | } 183 | 184 | /** 185 | * Get whether requests from this AS are rate-limited by the home server. 186 | */ 187 | public isRateLimited() { 188 | return this.rateLimited === undefined ? true : this.rateLimited; 189 | } 190 | 191 | /** 192 | * Set whether requests from this AS are rate-limited by the home server. 193 | * @param {boolean} isRateLimited The flag which is set to true to enable rate 194 | * rate limiting, false to disable. 195 | */ 196 | public setRateLimited(isRateLimited: boolean) { 197 | this.rateLimited = isRateLimited; 198 | } 199 | 200 | /** 201 | * **Experimental** 202 | * 203 | * Should the appservice receive ephemeral events. Note this requires 204 | * a homeserver implementing MSC2409. 205 | */ 206 | public pushEphemeralEnabled() { 207 | return this.pushEphemeral || false; 208 | } 209 | 210 | /** 211 | * Get the desired user_id localpart for the app service itself. 212 | * @return {?string} The user_id localpart ("alice" in "@alice:domain") 213 | */ 214 | public getSenderLocalpart() { 215 | return this.senderLocalpart; 216 | } 217 | 218 | /** 219 | * Add a regex pattern to be registered. 220 | * @param {String} type : The type of regex pattern. Must be 'users', 'rooms', or 221 | * 'aliases'. 222 | * @param {String} regex : The regex pattern. 223 | * @param {Boolean} exclusive : True to reserve the matched namespace. 224 | * @throws If given an invalid type or regex. 225 | */ 226 | public addRegexPattern(type: "users"|"rooms"|"aliases", regex: string, exclusive?: boolean) { 227 | if (typeof regex != "string") { 228 | throw new Error("Regex must be a string"); 229 | } 230 | if (["users", "aliases", "rooms"].indexOf(type) == -1) { 231 | throw new Error("'type' must be 'users', 'rooms' or 'aliases'"); 232 | } 233 | 234 | const regexObject = { 235 | exclusive: Boolean(exclusive), 236 | regex: regex 237 | }; 238 | 239 | const namespace = this.namespaces[type]; 240 | if (namespace) { 241 | namespace.push(regexObject); 242 | } else { 243 | this.namespaces[type] = [regexObject]; 244 | } 245 | } 246 | 247 | /** 248 | * Output this registration to the given file name. 249 | * @param {String} filename The file name to write the yaml to. 250 | * @throws If required fields hs_token, as_token, url are missing. 251 | */ 252 | public outputAsYaml(filename: string) { 253 | const reg = this.getOutput(); 254 | fs.writeFileSync(filename, yaml.dump(reg)); 255 | } 256 | 257 | /** 258 | * Get the key-value output which should be written to a YAML file. 259 | * @throws If required fields hs_token, as-token, url, sender_localpart are missing. 260 | */ 261 | public getOutput(): AppServiceOutput { 262 | // Typescript will default any string array to a set of strings, even if it's a static array. 263 | const requiredFields: ("id"|"hsToken"|"asToken"|"senderLocalpart")[] = [ 264 | "id", "hsToken", "asToken", "senderLocalpart" 265 | ]; 266 | const missingFields = requiredFields.filter((key) => !this[key]); 267 | if (missingFields.length) { 268 | throw new Error( 269 | `Missing required field(s): ${missingFields}` 270 | ); 271 | } 272 | const responseFormat: AppServiceOutput = { 273 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 274 | id: this.id!, 275 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 276 | hs_token: this.hsToken!, 277 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 278 | as_token: this.asToken!, 279 | url: this.url, 280 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 281 | sender_localpart: this.senderLocalpart!, 282 | }; 283 | if (this.pushEphemeral !== undefined) { 284 | responseFormat["de.sorunome.msc2409.push_ephemeral"] = this.pushEphemeral; 285 | } 286 | if (this.protocols) { 287 | responseFormat.protocols = this.protocols; 288 | } 289 | if (Object.keys(this.namespaces).length > 0) { 290 | responseFormat.namespaces = this.namespaces; 291 | } 292 | if(this.rateLimited !== undefined) { 293 | responseFormat.rate_limited = this.rateLimited; 294 | } 295 | return responseFormat; 296 | } 297 | 298 | /** 299 | * Check if a user_id meets this registration regex. 300 | * @param {string} userId The user ID 301 | * @param {boolean} onlyExclusive True to restrict matching to only exclusive 302 | * regexes. False to allow exclusive or non-exlusive regexes to match. 303 | * @return {boolean} True if there is a match. 304 | */ 305 | public isUserMatch(userId: string, onlyExclusive: boolean) { 306 | return this._isMatch(this.namespaces.users, userId, onlyExclusive); 307 | } 308 | 309 | /** 310 | * Check if a room alias meets this registration regex. 311 | * @param {string} alias The room alias 312 | * @param {boolean} onlyExclusive True to restrict matching to only exclusive 313 | * regexes. False to allow exclusive or non-exlusive regexes to match. 314 | * @return {boolean} True if there is a match. 315 | */ 316 | public isAliasMatch(alias: string, onlyExclusive: boolean) { 317 | return this._isMatch(this.namespaces.aliases, alias, onlyExclusive); 318 | } 319 | 320 | /** 321 | * Check if a room ID meets this registration regex. 322 | * @param {string} roomId The room ID 323 | * @param {boolean} onlyExclusive True to restrict matching to only exclusive 324 | * regexes. False to allow exclusive or non-exlusive regexes to match. 325 | * @return {boolean} True if there is a match. 326 | */ 327 | public isRoomMatch(roomId: string, onlyExclusive: boolean) { 328 | return this._isMatch(this.namespaces.rooms, roomId, onlyExclusive); 329 | } 330 | 331 | public _isMatch(regexList: RegexObj[]|undefined, sample: string, onlyExclusive: boolean) { 332 | if (!regexList) { 333 | return false; 334 | } 335 | onlyExclusive = Boolean(onlyExclusive); 336 | for (const regexObj of regexList) { 337 | let regex = this.cachedRegex[regexObj.regex]; 338 | if (!regex) { 339 | regex = new RegExp(regexObj.regex); 340 | this.cachedRegex[regexObj.regex] = regex; 341 | } 342 | if (regex.test(sample)) { 343 | if (onlyExclusive && !regexObj.exclusive) { 344 | continue; 345 | } 346 | return true; 347 | } 348 | } 349 | return false; 350 | } 351 | } 352 | 353 | -------------------------------------------------------------------------------- /src/app-service.ts: -------------------------------------------------------------------------------- 1 | import {Application, Request, Response, default as express} from "express"; 2 | import bodyParser from "body-parser"; 3 | import morgan from "morgan"; 4 | import util from "util"; 5 | import { EventEmitter } from "events"; 6 | import fs from "fs"; 7 | import https from "https"; 8 | import { Server, default as http } from "http"; 9 | import { AppserviceHttpError } from "./AppserviceHttpError"; 10 | 11 | const MAX_SIZE_BYTES = 5000000; // 5MB 12 | 13 | export declare interface AppService { 14 | /** 15 | * Emitted when an event is pushed to the appservice. 16 | * The format of the event object is documented at 17 | * https://matrix.org/docs/spec/application_service/r0.1.2#put-matrix-app-v1-transactions-txnid 18 | * @event 19 | * @example 20 | * appService.on("event", function(ev) { 21 | * console.log("ID: %s", ev.event_id); 22 | * }); 23 | */ 24 | on(event: "event", cb: (event: Record) => void): this; 25 | /** 26 | * Emitted when an ephemeral event is pushed to the appservice. 27 | * The format of the event object is documented at 28 | * https://github.com/matrix-org/matrix-doc/pull/2409 29 | * @event 30 | * @example 31 | * appService.on("ephemeral", function(ev) { 32 | * console.log("ID: %s", ev.type); 33 | * }); 34 | */ 35 | on(event: "ephemeral", cb: (event: Record) => void): this; 36 | /** 37 | * Emitted when the HTTP listener logs some information. 38 | * `access_tokens` are stripped from requests 39 | * @event 40 | * @example 41 | * appService.on("http-log", function(line) { 42 | * console.log(line); 43 | * }); 44 | */ 45 | on(event: "http-log", cb: (line: string) => void): this; 46 | /** 47 | * Emitted when an event of a particular type is pushed 48 | * to the appservice. This will be emitted *in addition* 49 | * to "event", so ensure your bridge deduplicates events. 50 | * @event 51 | * @param event Should start with "type:" 52 | * @example 53 | * appService.on("type:m.room.message", function(event) { 54 | * console.log("ID: %s", ev.content.body); 55 | * }); 56 | */ 57 | on(event: string, cb: (event: Record) => void): this; 58 | } 59 | 60 | export class AppService extends EventEmitter { 61 | /** 62 | * @deprecated Use `AppService.expressApp` 63 | */ 64 | public readonly app: Application; 65 | private server?: Server; 66 | private lastProcessedTxnId = ""; 67 | /** 68 | * Construct a new application service. 69 | * @constructor 70 | * @param {Object} config Configuration for this service. 71 | * @param {String} config.homeserverToken The incoming HS token to expect. Must 72 | * be set prior to calling listen(port). 73 | * @param {Number} config.httpMaxSizeBytes The max number of bytes allowed on an 74 | * incoming HTTP request. Default: 5000000. 75 | * @throws If a homeserver token is not supplied. 76 | */ 77 | constructor (private config: { homeserverToken: string; httpMaxSizeBytes?: number}) { 78 | super(); 79 | const app = express(); 80 | app.use(morgan("combined", { 81 | stream: { 82 | write: this.onMorganLog.bind(this), 83 | } 84 | })); 85 | 86 | app.use(bodyParser.json({ 87 | limit: this.config.httpMaxSizeBytes || MAX_SIZE_BYTES, 88 | })); 89 | const legacyEndpointHandler = (req: Request, res: Response) => { 90 | res.status(308).location("/_matrix/app/v1" + req.originalUrl).send({ errcode: "M_UNKNOWN", error: "This non-standard endpoint has been removed" }) }; 91 | app.get("/_matrix/app/v1/users/:userId", this.onGetUsers.bind(this)); 92 | app.get("/_matrix/app/v1/rooms/:alias", this.onGetRoomAlias.bind(this)); 93 | app.put("/_matrix/app/v1/transactions/:txnId", this.onTransaction.bind(this)); 94 | app.get("/users/:userId", legacyEndpointHandler); 95 | app.get("/rooms/:alias", legacyEndpointHandler); 96 | app.put("/transactions/:txnId", legacyEndpointHandler); 97 | app.get("/health", this.onHealthCheck.bind(this)); 98 | 99 | this.app = app; 100 | } 101 | 102 | /*** 103 | * Begin listening on the specified port. 104 | * @param {Number} port The port to listen on. 105 | * @param {String} hostname Optional hostname to listen on 106 | * @param {Number} backlog Maximum length of the queue of pending connections 107 | * @param {Function} callback The callback for the "listening" event. Optional. 108 | * @returns {Promise} When the server is listening, if a callback is not provided. 109 | */ 110 | public listen(port: number, hostname: string, backlog: number, callback?: () => void) { 111 | const tlsKey = process.env.MATRIX_AS_TLS_KEY; 112 | const tlsCert = process.env.MATRIX_AS_TLS_CERT; 113 | let serverApp: Server; 114 | if (tlsKey || tlsCert) { 115 | if (!(tlsKey && tlsCert)) { 116 | throw new Error("MATRIX_AS_TLS_KEY and MATRIX_AS_TLS_CERT should be defined together!"); 117 | } 118 | 119 | if (!fs.existsSync(tlsKey)) { 120 | throw new Error("Could not open MATRIX_AS_TLS_KEY: " + tlsKey); 121 | } 122 | 123 | if (!fs.existsSync(tlsCert)) { 124 | throw new Error("Could not open MATRIX_AS_TLS_CERT: " + tlsCert); 125 | } 126 | 127 | const options = { 128 | key : fs.readFileSync(tlsKey), 129 | cert : fs.readFileSync(tlsCert) 130 | }; 131 | serverApp = https.createServer(options, this.app); 132 | } 133 | else { 134 | serverApp = http.createServer({}, this.app); 135 | } 136 | if (callback) { 137 | this.server = serverApp.listen(port, hostname, backlog, callback); 138 | return; 139 | } 140 | return new Promise((resolve, reject) => { 141 | serverApp.once("error", reject); 142 | serverApp.once("listening", resolve); 143 | this.server = serverApp.listen(port, hostname, backlog); 144 | }); 145 | } 146 | 147 | /** 148 | * Closes the HTTP server. 149 | * @returns {Promise} When the operation has completed 150 | * @throws If the server has not been started. 151 | */ 152 | public async close() { 153 | if (!this.server) { 154 | throw Error("Server has not started"); 155 | } 156 | return util.promisify(this.server.close).apply(this.server); 157 | } 158 | 159 | 160 | /** 161 | * Override this method to handle alias queries. 162 | * @param {string} alias The queried room alias 163 | * @param {Function} callback The callback to invoke when complete. 164 | * @return {Promise} A promise to resolve when complete (if callback isn't supplied) 165 | */ 166 | public onAliasQuery(alias: string, callback: () => void): PromiseLike|null { 167 | callback(); // stub impl 168 | return null; 169 | } 170 | 171 | /** 172 | * Override this method to handle user queries. 173 | * @param {string} userId The queried user ID. 174 | * @param {Function} callback The callback to invoke when complete. 175 | * @return {Promise} A promise to resolve when complete (if callback isn't supplied) 176 | */ 177 | public onUserQuery(userId: string, callback: () => void): PromiseLike|null { 178 | callback(); // stub impl 179 | return null; 180 | } 181 | 182 | /** 183 | * Set the token that should be used to verify incoming events. 184 | * @param {string} hsToken The home server token 185 | */ 186 | public setHomeserverToken(hsToken: string) { 187 | this.config.homeserverToken = hsToken; 188 | } 189 | 190 | /** 191 | * The Express App instance for the appservice, which 192 | * can be extended with paths. 193 | */ 194 | public get expressApp() { 195 | return this.app; 196 | } 197 | 198 | private onMorganLog(str: string) { 199 | // The dependency `morgan` expects to write to a stream and adds a new line at the end. 200 | // Listeners of the `http-log` event expect there not to be a new line, so the string 201 | // can be handed to a logger like `console.log()` without displaying empty lines. 202 | str = str.replace(/\n$/, ""); 203 | str = str.replace(/access_token=.*?(&|\s|$)/, "access_token=$1"); 204 | this.emit("http-log", str); 205 | } 206 | 207 | private isInvalidToken(req: Request, res: Response): boolean { 208 | const providedToken = req.headers.authorization?.substring("Bearer ".length) ?? req.query.access_token; 209 | if (providedToken !== this.config.homeserverToken) { 210 | res.status(403); 211 | res.send({ 212 | errcode: "M_FORBIDDEN", 213 | error: "Bad token supplied," 214 | }); 215 | return true; 216 | } 217 | return false; 218 | } 219 | 220 | private async onGetUsers(req: Request, res: Response) { 221 | if (this.isInvalidToken(req, res)) { 222 | return; 223 | } 224 | const possiblePromise = this.onUserQuery(req.params.userId, () => { 225 | res.send({}); 226 | }); 227 | if (!possiblePromise) { 228 | return; 229 | } 230 | try { 231 | await possiblePromise; 232 | res.send({}); 233 | } catch (e) { 234 | if (e instanceof AppserviceHttpError) { 235 | res.status(e.status); 236 | res.send({ 237 | errcode: e.errcode, 238 | message: e.message, 239 | }); 240 | } else { 241 | res.status(500); 242 | res.send({ 243 | errcode: "M_UNKNOWN", 244 | message: e instanceof Error ? e.message : "", 245 | }); 246 | } 247 | } 248 | } 249 | 250 | private async onGetRoomAlias(req: Request, res: Response) { 251 | if (this.isInvalidToken(req, res)) { 252 | return; 253 | } 254 | const possiblePromise = this.onAliasQuery(req.params.alias, function() { 255 | res.send({}); 256 | }); 257 | if (!possiblePromise) { 258 | return; 259 | } 260 | try { 261 | await possiblePromise; 262 | res.send({}); 263 | } catch (e) { 264 | res.send({ 265 | errcode: "M_UNKNOWN", 266 | error: e instanceof Error ? e.message : "" 267 | }); 268 | } 269 | } 270 | 271 | private onTransaction(req: Request, res: Response) { 272 | if (this.isInvalidToken(req, res)) { 273 | return; 274 | } 275 | 276 | const txnId = req.params.txnId; 277 | if (!txnId) { 278 | res.send("Missing transaction ID."); 279 | return; 280 | } 281 | if (!req.body) { 282 | res.send("Missing body."); 283 | return; 284 | } 285 | 286 | const events = req.body.events || []; 287 | const ephemeral = req.body["de.sorunome.msc2409.ephemeral"] || []; 288 | 289 | if (this.lastProcessedTxnId === txnId) { 290 | res.send({}); // duplicate 291 | return; 292 | } 293 | for (const event of events) { 294 | this.emit("event", event); 295 | if (event.type) { 296 | this.emit("type:" + event.type, event); 297 | } 298 | } 299 | for (const event of ephemeral) { 300 | this.emit("ephemeral", event); 301 | if (event.type) { 302 | this.emit("ephemeral_type:" + event.type, event); 303 | } 304 | } 305 | this.lastProcessedTxnId = txnId; 306 | res.send({}); 307 | } 308 | 309 | private onHealthCheck(req: Request, res: Response) { 310 | res.send('OK'); 311 | } 312 | } 313 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./app-service"; 2 | export * from "./app-service-registration"; 3 | export * from "./AppserviceHttpError"; 4 | -------------------------------------------------------------------------------- /test/test_app-service-registration.ts: -------------------------------------------------------------------------------- 1 | import { AppServiceRegistration } from "../src/app-service-registration"; 2 | import { expect } from "chai"; 3 | 4 | describe("AppServiceRegistration", () => { 5 | it("can construct a fresh registration file", () => { 6 | const reg = new AppServiceRegistration("https://example.com"); 7 | expect(reg.getAppServiceUrl()).to.equal("https://example.com"); 8 | }); 9 | describe("fromObject", () => { 10 | it("can import minimal registration from object", () => { 11 | const reg = AppServiceRegistration.fromObject({ 12 | id: "foobar", 13 | hs_token: "foohstoken", 14 | as_token: "fooastoken", 15 | url: "https://example.com", 16 | sender_localpart: "foobot", 17 | }); 18 | expect(reg.getId()).to.equal("foobar"); 19 | expect(reg.getHomeserverToken()).to.equal("foohstoken"); 20 | expect(reg.getAppServiceToken()).to.equal("fooastoken"); 21 | expect(reg.getAppServiceUrl()).to.equal("https://example.com"); 22 | expect(reg.getSenderLocalpart()).to.equal("foobot"); 23 | expect(reg.getProtocols()).to.be.null; 24 | expect(reg.isRateLimited()).to.be.true; 25 | expect(reg.pushEphemeral).to.be.undefined; 26 | expect(reg.pushEphemeralEnabled()).to.be.false; 27 | }); 28 | 29 | it("can import complete registration from object", () => { 30 | const reg = AppServiceRegistration.fromObject({ 31 | id: "foobar", 32 | hs_token: "foohstoken", 33 | as_token: "fooastoken", 34 | url: "https://example.com", 35 | sender_localpart: "foobot", 36 | protocols: ["irc", "gitter"], 37 | "de.sorunome.msc2409.push_ephemeral": true, 38 | rate_limited: false, 39 | namespaces: { 40 | users: [{ 41 | regex: "@foobar.+", 42 | exclusive: true, 43 | },{ 44 | regex: "@barbaz.+", 45 | exclusive: false, 46 | }], 47 | rooms: [{ 48 | regex: "!foo", 49 | exclusive: true, 50 | }], 51 | aliases: [{ 52 | regex: "#foo.+", 53 | exclusive: true, 54 | }] 55 | } 56 | }); 57 | expect(reg.getId()).to.equal("foobar"); 58 | expect(reg.getHomeserverToken()).to.equal("foohstoken"); 59 | expect(reg.getAppServiceToken()).to.equal("fooastoken"); 60 | expect(reg.getAppServiceUrl()).to.equal("https://example.com"); 61 | expect(reg.getSenderLocalpart()).to.equal("foobot"); 62 | expect(reg.getProtocols()).to.deep.equal(["irc", "gitter"]); 63 | expect(reg.isRateLimited()).to.be.false; 64 | expect(reg.pushEphemeral).to.be.true; 65 | expect(reg.pushEphemeralEnabled()).to.be.true; 66 | 67 | expect(reg.isRoomMatch("!foo", true)).to.be.true; 68 | 69 | expect(reg.isUserMatch("@foobar1", true)).to.be.true; 70 | expect(reg.isUserMatch("@foobar2", false)).to.be.true; 71 | expect(reg.isUserMatch("@barbaz1", false)).to.be.true; 72 | 73 | expect(reg.isAliasMatch("#foo1", true)).to.be.true; 74 | expect(reg.isAliasMatch("#foo1", false)).to.be.true; 75 | }); 76 | }); 77 | describe("getOutput", () => { 78 | it("can export minimal registration to object", () => { 79 | const reg = new AppServiceRegistration(null); 80 | reg.setId("foobar"); 81 | reg.setHomeserverToken("foohstoken"); 82 | reg.setAppServiceToken("fooastoken"); 83 | reg.setSenderLocalpart("foobot"); 84 | expect(reg.getOutput()).to.deep.equal({ 85 | id: "foobar", 86 | hs_token: "foohstoken", 87 | as_token: "fooastoken", 88 | url: null, 89 | sender_localpart: "foobot", 90 | }); 91 | }); 92 | it("can export complete registration to object", () => { 93 | const reg = new AppServiceRegistration("https://example.com"); 94 | reg.setId("foobar"); 95 | reg.setHomeserverToken("foohstoken"); 96 | reg.setAppServiceToken("fooastoken"); 97 | reg.setSenderLocalpart("foobot"); 98 | reg.setRateLimited(false); 99 | reg.setProtocols(["irc", "gitter"]); 100 | reg.pushEphemeral = true; 101 | reg.addRegexPattern("users", "@foobar.+", true); 102 | reg.addRegexPattern("users", "@barbaz.+", false); 103 | reg.addRegexPattern("rooms", "!foo", true); 104 | reg.addRegexPattern("aliases", "#foo.+", true); 105 | expect(reg.getOutput()).to.deep.equal({ 106 | id: "foobar", 107 | hs_token: "foohstoken", 108 | as_token: "fooastoken", 109 | url: "https://example.com", 110 | sender_localpart: "foobot", 111 | protocols: ["irc", "gitter"], 112 | "de.sorunome.msc2409.push_ephemeral": true, 113 | rate_limited: false, 114 | namespaces: { 115 | users: [{ 116 | regex: "@foobar.+", 117 | exclusive: true, 118 | },{ 119 | regex: "@barbaz.+", 120 | exclusive: false, 121 | }], 122 | rooms: [{ 123 | regex: "!foo", 124 | exclusive: true, 125 | }], 126 | aliases: [{ 127 | regex: "#foo.+", 128 | exclusive: true, 129 | }] 130 | } 131 | }); 132 | }); 133 | }); 134 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "compilerOptions": { 4 | "incremental": true, 5 | "allowJs": false, 6 | "checkJs": false, 7 | "declaration": true, 8 | "sourceMap": true, 9 | "outDir": "./lib", 10 | "composite": false, 11 | "strictNullChecks": true, 12 | }, 13 | "include": [ 14 | "src/**/*" 15 | ], 16 | "exclude": [ 17 | "test/**/*", 18 | ], 19 | "typedocOptions": { 20 | "out": ".typedoc", 21 | "entryPoints": ["src/index.ts"], 22 | "excludePrivate": true, 23 | "exclude": ["**/index.ts"] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@eslint/eslintrc@^1.3.0": 13 | version "1.3.0" 14 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" 15 | integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw== 16 | dependencies: 17 | ajv "^6.12.4" 18 | debug "^4.3.2" 19 | espree "^9.3.2" 20 | globals "^13.15.0" 21 | ignore "^5.2.0" 22 | import-fresh "^3.2.1" 23 | js-yaml "^4.1.0" 24 | minimatch "^3.1.2" 25 | strip-json-comments "^3.1.1" 26 | 27 | "@humanwhocodes/config-array@^0.9.2": 28 | version "0.9.5" 29 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" 30 | integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== 31 | dependencies: 32 | "@humanwhocodes/object-schema" "^1.2.1" 33 | debug "^4.1.1" 34 | minimatch "^3.0.4" 35 | 36 | "@humanwhocodes/object-schema@^1.2.1": 37 | version "1.2.1" 38 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 39 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 40 | 41 | "@jridgewell/resolve-uri@^3.0.3": 42 | version "3.1.0" 43 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 44 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 45 | 46 | "@jridgewell/sourcemap-codec@^1.4.10": 47 | version "1.4.14" 48 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 49 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 50 | 51 | "@jridgewell/trace-mapping@0.3.9": 52 | version "0.3.9" 53 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 54 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 55 | dependencies: 56 | "@jridgewell/resolve-uri" "^3.0.3" 57 | "@jridgewell/sourcemap-codec" "^1.4.10" 58 | 59 | "@nodelib/fs.scandir@2.1.5": 60 | version "2.1.5" 61 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 62 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 63 | dependencies: 64 | "@nodelib/fs.stat" "2.0.5" 65 | run-parallel "^1.1.9" 66 | 67 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 68 | version "2.0.5" 69 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 70 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 71 | 72 | "@nodelib/fs.walk@^1.2.3": 73 | version "1.2.8" 74 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 75 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 76 | dependencies: 77 | "@nodelib/fs.scandir" "2.1.5" 78 | fastq "^1.6.0" 79 | 80 | "@tsconfig/node10@^1.0.7": 81 | version "1.0.9" 82 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 83 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 84 | 85 | "@tsconfig/node12@^1.0.7": 86 | version "1.0.11" 87 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 88 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 89 | 90 | "@tsconfig/node14@^1.0.0": 91 | version "1.0.3" 92 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 93 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 94 | 95 | "@tsconfig/node16@^1.0.2": 96 | version "1.0.3" 97 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 98 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 99 | 100 | "@tsconfig/node18@^2.0.0": 101 | version "2.0.0" 102 | resolved "https://registry.yarnpkg.com/@tsconfig/node18/-/node18-2.0.0.tgz#58b52430d00913dc26c4459fbc7f05396e47886a" 103 | integrity sha512-uI/B0ShkiEwTk036pncXucVlj4y11EW6mycQvCEzC1PkR2TBvdQZ5Wf96dp+XXWAc70FEDfvwTqanoaDpP6rPw== 104 | 105 | "@types/body-parser@*", "@types/body-parser@^1.19.2": 106 | version "1.19.2" 107 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 108 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 109 | dependencies: 110 | "@types/connect" "*" 111 | "@types/node" "*" 112 | 113 | "@types/chai@^4.2.22": 114 | version "4.3.1" 115 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" 116 | integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== 117 | 118 | "@types/connect@*": 119 | version "3.4.35" 120 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 121 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 122 | dependencies: 123 | "@types/node" "*" 124 | 125 | "@types/express-serve-static-core@^4.17.18": 126 | version "4.17.31" 127 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" 128 | integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== 129 | dependencies: 130 | "@types/node" "*" 131 | "@types/qs" "*" 132 | "@types/range-parser" "*" 133 | 134 | "@types/express@^4.17.14": 135 | version "4.17.14" 136 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c" 137 | integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg== 138 | dependencies: 139 | "@types/body-parser" "*" 140 | "@types/express-serve-static-core" "^4.17.18" 141 | "@types/qs" "*" 142 | "@types/serve-static" "*" 143 | 144 | "@types/js-yaml@^4.0.5": 145 | version "4.0.5" 146 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" 147 | integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== 148 | 149 | "@types/json-schema@^7.0.9": 150 | version "7.0.11" 151 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" 152 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 153 | 154 | "@types/mime@*": 155 | version "3.0.1" 156 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" 157 | integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== 158 | 159 | "@types/mocha@^9.0.0": 160 | version "9.1.1" 161 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" 162 | integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== 163 | 164 | "@types/morgan@^1.9.3": 165 | version "1.9.3" 166 | resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.3.tgz#ae04180dff02c437312bc0cfb1e2960086b2f540" 167 | integrity sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q== 168 | dependencies: 169 | "@types/node" "*" 170 | 171 | "@types/node@*": 172 | version "16.11.9" 173 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.9.tgz#879be3ad7af29f4c1a5c433421bf99fab7047185" 174 | integrity sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A== 175 | 176 | "@types/node@^18": 177 | version "18.15.11" 178 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" 179 | integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== 180 | 181 | "@types/qs@*": 182 | version "6.9.7" 183 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 184 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 185 | 186 | "@types/range-parser@*": 187 | version "1.2.4" 188 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 189 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 190 | 191 | "@types/serve-static@*": 192 | version "1.15.0" 193 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" 194 | integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== 195 | dependencies: 196 | "@types/mime" "*" 197 | "@types/node" "*" 198 | 199 | "@typescript-eslint/eslint-plugin@^5.4.0": 200 | version "5.30.6" 201 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.6.tgz#9c6017b6c1d04894141b4a87816388967f64c359" 202 | integrity sha512-J4zYMIhgrx4MgnZrSDD7sEnQp7FmhKNOaqaOpaoQ/SfdMfRB/0yvK74hTnvH+VQxndZynqs5/Hn4t+2/j9bADg== 203 | dependencies: 204 | "@typescript-eslint/scope-manager" "5.30.6" 205 | "@typescript-eslint/type-utils" "5.30.6" 206 | "@typescript-eslint/utils" "5.30.6" 207 | debug "^4.3.4" 208 | functional-red-black-tree "^1.0.1" 209 | ignore "^5.2.0" 210 | regexpp "^3.2.0" 211 | semver "^7.3.7" 212 | tsutils "^3.21.0" 213 | 214 | "@typescript-eslint/parser@^5.4.0": 215 | version "5.30.6" 216 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.6.tgz#add440db038fa9d777e4ebdaf66da9e7fb7abe92" 217 | integrity sha512-gfF9lZjT0p2ZSdxO70Xbw8w9sPPJGfAdjK7WikEjB3fcUI/yr9maUVEdqigBjKincUYNKOmf7QBMiTf719kbrA== 218 | dependencies: 219 | "@typescript-eslint/scope-manager" "5.30.6" 220 | "@typescript-eslint/types" "5.30.6" 221 | "@typescript-eslint/typescript-estree" "5.30.6" 222 | debug "^4.3.4" 223 | 224 | "@typescript-eslint/scope-manager@5.30.6": 225 | version "5.30.6" 226 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.6.tgz#ce1b49ff5ce47f55518d63dbe8fc9181ddbd1a33" 227 | integrity sha512-Hkq5PhLgtVoW1obkqYH0i4iELctEKixkhWLPTYs55doGUKCASvkjOXOd/pisVeLdO24ZX9D6yymJ/twqpJiG3g== 228 | dependencies: 229 | "@typescript-eslint/types" "5.30.6" 230 | "@typescript-eslint/visitor-keys" "5.30.6" 231 | 232 | "@typescript-eslint/type-utils@5.30.6": 233 | version "5.30.6" 234 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.6.tgz#a64aa9acbe609ab77f09f53434a6af2b9685f3af" 235 | integrity sha512-GFVVzs2j0QPpM+NTDMXtNmJKlF842lkZKDSanIxf+ArJsGeZUIaeT4jGg+gAgHt7AcQSFwW7htzF/rbAh2jaVA== 236 | dependencies: 237 | "@typescript-eslint/utils" "5.30.6" 238 | debug "^4.3.4" 239 | tsutils "^3.21.0" 240 | 241 | "@typescript-eslint/types@5.30.6": 242 | version "5.30.6" 243 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.6.tgz#86369d0a7af8c67024115ac1da3e8fb2d38907e1" 244 | integrity sha512-HdnP8HioL1F7CwVmT4RaaMX57RrfqsOMclZc08wGMiDYJBsLGBM7JwXM4cZJmbWLzIR/pXg1kkrBBVpxTOwfUg== 245 | 246 | "@typescript-eslint/typescript-estree@5.30.6": 247 | version "5.30.6" 248 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.6.tgz#a84a0d6a486f9b54042da1de3d671a2c9f14484e" 249 | integrity sha512-Z7TgPoeYUm06smfEfYF0RBkpF8csMyVnqQbLYiGgmUSTaSXTP57bt8f0UFXstbGxKIreTwQCujtaH0LY9w9B+A== 250 | dependencies: 251 | "@typescript-eslint/types" "5.30.6" 252 | "@typescript-eslint/visitor-keys" "5.30.6" 253 | debug "^4.3.4" 254 | globby "^11.1.0" 255 | is-glob "^4.0.3" 256 | semver "^7.3.7" 257 | tsutils "^3.21.0" 258 | 259 | "@typescript-eslint/utils@5.30.6": 260 | version "5.30.6" 261 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.6.tgz#1de2da14f678e7d187daa6f2e4cdb558ed0609dc" 262 | integrity sha512-xFBLc/esUbLOJLk9jKv0E9gD/OH966M40aY9jJ8GiqpSkP2xOV908cokJqqhVd85WoIvHVHYXxSFE4cCSDzVvA== 263 | dependencies: 264 | "@types/json-schema" "^7.0.9" 265 | "@typescript-eslint/scope-manager" "5.30.6" 266 | "@typescript-eslint/types" "5.30.6" 267 | "@typescript-eslint/typescript-estree" "5.30.6" 268 | eslint-scope "^5.1.1" 269 | eslint-utils "^3.0.0" 270 | 271 | "@typescript-eslint/visitor-keys@5.30.6": 272 | version "5.30.6" 273 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.6.tgz#94dd10bb481c8083378d24de1742a14b38a2678c" 274 | integrity sha512-41OiCjdL2mCaSDi2SvYbzFLlqqlm5v1ZW9Ym55wXKL/Rx6OOB1IbuFGo71Fj6Xy90gJDFTlgOS+vbmtGHPTQQA== 275 | dependencies: 276 | "@typescript-eslint/types" "5.30.6" 277 | eslint-visitor-keys "^3.3.0" 278 | 279 | "@ungap/promise-all-settled@1.1.2": 280 | version "1.1.2" 281 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 282 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 283 | 284 | accepts@~1.3.8: 285 | version "1.3.8" 286 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 287 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 288 | dependencies: 289 | mime-types "~2.1.34" 290 | negotiator "0.6.3" 291 | 292 | acorn-jsx@^5.3.2: 293 | version "5.3.2" 294 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 295 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 296 | 297 | acorn-walk@^8.1.1: 298 | version "8.2.0" 299 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 300 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 301 | 302 | acorn@^8.4.1, acorn@^8.7.1: 303 | version "8.7.1" 304 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" 305 | integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== 306 | 307 | ajv@^6.10.0, ajv@^6.12.4: 308 | version "6.12.6" 309 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 310 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 311 | dependencies: 312 | fast-deep-equal "^3.1.1" 313 | fast-json-stable-stringify "^2.0.0" 314 | json-schema-traverse "^0.4.1" 315 | uri-js "^4.2.2" 316 | 317 | ansi-colors@4.1.1: 318 | version "4.1.1" 319 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 320 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 321 | 322 | ansi-regex@^5.0.1: 323 | version "5.0.1" 324 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 325 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 326 | 327 | ansi-sequence-parser@^1.1.0: 328 | version "1.1.0" 329 | resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" 330 | integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== 331 | 332 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 333 | version "4.3.0" 334 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 335 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 336 | dependencies: 337 | color-convert "^2.0.1" 338 | 339 | anymatch@~3.1.2: 340 | version "3.1.2" 341 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 342 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 343 | dependencies: 344 | normalize-path "^3.0.0" 345 | picomatch "^2.0.4" 346 | 347 | arg@^4.1.0: 348 | version "4.1.3" 349 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 350 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 351 | 352 | argparse@^2.0.1: 353 | version "2.0.1" 354 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 355 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 356 | 357 | array-flatten@1.1.1: 358 | version "1.1.1" 359 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 360 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 361 | 362 | array-union@^2.1.0: 363 | version "2.1.0" 364 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 365 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 366 | 367 | assertion-error@^1.1.0: 368 | version "1.1.0" 369 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 370 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 371 | 372 | balanced-match@^1.0.0: 373 | version "1.0.2" 374 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 375 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 376 | 377 | basic-auth@~2.0.1: 378 | version "2.0.1" 379 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 380 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 381 | dependencies: 382 | safe-buffer "5.1.2" 383 | 384 | binary-extensions@^2.0.0: 385 | version "2.2.0" 386 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 387 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 388 | 389 | body-parser@1.20.1: 390 | version "1.20.1" 391 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 392 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 393 | dependencies: 394 | bytes "3.1.2" 395 | content-type "~1.0.4" 396 | debug "2.6.9" 397 | depd "2.0.0" 398 | destroy "1.2.0" 399 | http-errors "2.0.0" 400 | iconv-lite "0.4.24" 401 | on-finished "2.4.1" 402 | qs "6.11.0" 403 | raw-body "2.5.1" 404 | type-is "~1.6.18" 405 | unpipe "1.0.0" 406 | 407 | body-parser@^1.19.0: 408 | version "1.19.0" 409 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 410 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 411 | dependencies: 412 | bytes "3.1.0" 413 | content-type "~1.0.4" 414 | debug "2.6.9" 415 | depd "~1.1.2" 416 | http-errors "1.7.2" 417 | iconv-lite "0.4.24" 418 | on-finished "~2.3.0" 419 | qs "6.7.0" 420 | raw-body "2.4.0" 421 | type-is "~1.6.17" 422 | 423 | brace-expansion@^1.1.7: 424 | version "1.1.11" 425 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 426 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 427 | dependencies: 428 | balanced-match "^1.0.0" 429 | concat-map "0.0.1" 430 | 431 | brace-expansion@^2.0.1: 432 | version "2.0.1" 433 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 434 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 435 | dependencies: 436 | balanced-match "^1.0.0" 437 | 438 | braces@^3.0.2, braces@~3.0.2: 439 | version "3.0.2" 440 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 441 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 442 | dependencies: 443 | fill-range "^7.0.1" 444 | 445 | browser-stdout@1.3.1: 446 | version "1.3.1" 447 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 448 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 449 | 450 | bytes@3.1.0: 451 | version "3.1.0" 452 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 453 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 454 | 455 | bytes@3.1.2: 456 | version "3.1.2" 457 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 458 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 459 | 460 | call-bind@^1.0.0: 461 | version "1.0.2" 462 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 463 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 464 | dependencies: 465 | function-bind "^1.1.1" 466 | get-intrinsic "^1.0.2" 467 | 468 | callsites@^3.0.0: 469 | version "3.1.0" 470 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 471 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 472 | 473 | camelcase@^6.0.0: 474 | version "6.2.1" 475 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" 476 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== 477 | 478 | chai@^4.3.4: 479 | version "4.3.6" 480 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" 481 | integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== 482 | dependencies: 483 | assertion-error "^1.1.0" 484 | check-error "^1.0.2" 485 | deep-eql "^3.0.1" 486 | get-func-name "^2.0.0" 487 | loupe "^2.3.1" 488 | pathval "^1.1.1" 489 | type-detect "^4.0.5" 490 | 491 | chalk@^4.0.0, chalk@^4.1.0: 492 | version "4.1.2" 493 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 494 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 495 | dependencies: 496 | ansi-styles "^4.1.0" 497 | supports-color "^7.1.0" 498 | 499 | check-error@^1.0.2: 500 | version "1.0.2" 501 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 502 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 503 | 504 | chokidar@3.5.3: 505 | version "3.5.3" 506 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 507 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 508 | dependencies: 509 | anymatch "~3.1.2" 510 | braces "~3.0.2" 511 | glob-parent "~5.1.2" 512 | is-binary-path "~2.1.0" 513 | is-glob "~4.0.1" 514 | normalize-path "~3.0.0" 515 | readdirp "~3.6.0" 516 | optionalDependencies: 517 | fsevents "~2.3.2" 518 | 519 | cliui@^7.0.2: 520 | version "7.0.4" 521 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 522 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 523 | dependencies: 524 | string-width "^4.2.0" 525 | strip-ansi "^6.0.0" 526 | wrap-ansi "^7.0.0" 527 | 528 | color-convert@^2.0.1: 529 | version "2.0.1" 530 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 531 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 532 | dependencies: 533 | color-name "~1.1.4" 534 | 535 | color-name@~1.1.4: 536 | version "1.1.4" 537 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 538 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 539 | 540 | concat-map@0.0.1: 541 | version "0.0.1" 542 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 543 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 544 | 545 | content-disposition@0.5.4: 546 | version "0.5.4" 547 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 548 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 549 | dependencies: 550 | safe-buffer "5.2.1" 551 | 552 | content-type@~1.0.4: 553 | version "1.0.4" 554 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 555 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 556 | 557 | cookie-signature@1.0.6: 558 | version "1.0.6" 559 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 560 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 561 | 562 | cookie@0.5.0: 563 | version "0.5.0" 564 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 565 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 566 | 567 | create-require@^1.1.0: 568 | version "1.1.1" 569 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 570 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 571 | 572 | cross-spawn@^7.0.2: 573 | version "7.0.3" 574 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 575 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 576 | dependencies: 577 | path-key "^3.1.0" 578 | shebang-command "^2.0.0" 579 | which "^2.0.1" 580 | 581 | debug@2.6.9: 582 | version "2.6.9" 583 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 584 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 585 | dependencies: 586 | ms "2.0.0" 587 | 588 | debug@4.3.3: 589 | version "4.3.3" 590 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 591 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 592 | dependencies: 593 | ms "2.1.2" 594 | 595 | debug@^4.1.1: 596 | version "4.3.2" 597 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 598 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 599 | dependencies: 600 | ms "2.1.2" 601 | 602 | debug@^4.3.2, debug@^4.3.4: 603 | version "4.3.4" 604 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 605 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 606 | dependencies: 607 | ms "2.1.2" 608 | 609 | decamelize@^4.0.0: 610 | version "4.0.0" 611 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 612 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 613 | 614 | deep-eql@^3.0.1: 615 | version "3.0.1" 616 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 617 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 618 | dependencies: 619 | type-detect "^4.0.0" 620 | 621 | deep-is@^0.1.3: 622 | version "0.1.4" 623 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 624 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 625 | 626 | depd@2.0.0, depd@~2.0.0: 627 | version "2.0.0" 628 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 629 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 630 | 631 | depd@~1.1.2: 632 | version "1.1.2" 633 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 634 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 635 | 636 | destroy@1.2.0: 637 | version "1.2.0" 638 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 639 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 640 | 641 | diff@5.0.0: 642 | version "5.0.0" 643 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 644 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 645 | 646 | diff@^4.0.1: 647 | version "4.0.2" 648 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 649 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 650 | 651 | dir-glob@^3.0.1: 652 | version "3.0.1" 653 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 654 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 655 | dependencies: 656 | path-type "^4.0.0" 657 | 658 | doctrine@^3.0.0: 659 | version "3.0.0" 660 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 661 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 662 | dependencies: 663 | esutils "^2.0.2" 664 | 665 | ee-first@1.1.1: 666 | version "1.1.1" 667 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 668 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 669 | 670 | emoji-regex@^8.0.0: 671 | version "8.0.0" 672 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 673 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 674 | 675 | encodeurl@~1.0.2: 676 | version "1.0.2" 677 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 678 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 679 | 680 | escalade@^3.1.1: 681 | version "3.1.1" 682 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 683 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 684 | 685 | escape-html@~1.0.3: 686 | version "1.0.3" 687 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 688 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 689 | 690 | escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: 691 | version "4.0.0" 692 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 693 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 694 | 695 | eslint-scope@^5.1.1: 696 | version "5.1.1" 697 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 698 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 699 | dependencies: 700 | esrecurse "^4.3.0" 701 | estraverse "^4.1.1" 702 | 703 | eslint-scope@^7.1.1: 704 | version "7.1.1" 705 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 706 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 707 | dependencies: 708 | esrecurse "^4.3.0" 709 | estraverse "^5.2.0" 710 | 711 | eslint-utils@^3.0.0: 712 | version "3.0.0" 713 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 714 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 715 | dependencies: 716 | eslint-visitor-keys "^2.0.0" 717 | 718 | eslint-visitor-keys@^2.0.0: 719 | version "2.1.0" 720 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" 721 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 722 | 723 | eslint-visitor-keys@^3.3.0: 724 | version "3.3.0" 725 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 726 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 727 | 728 | eslint@^8.3.0: 729 | version "8.20.0" 730 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.20.0.tgz#048ac56aa18529967da8354a478be4ec0a2bc81b" 731 | integrity sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA== 732 | dependencies: 733 | "@eslint/eslintrc" "^1.3.0" 734 | "@humanwhocodes/config-array" "^0.9.2" 735 | ajv "^6.10.0" 736 | chalk "^4.0.0" 737 | cross-spawn "^7.0.2" 738 | debug "^4.3.2" 739 | doctrine "^3.0.0" 740 | escape-string-regexp "^4.0.0" 741 | eslint-scope "^7.1.1" 742 | eslint-utils "^3.0.0" 743 | eslint-visitor-keys "^3.3.0" 744 | espree "^9.3.2" 745 | esquery "^1.4.0" 746 | esutils "^2.0.2" 747 | fast-deep-equal "^3.1.3" 748 | file-entry-cache "^6.0.1" 749 | functional-red-black-tree "^1.0.1" 750 | glob-parent "^6.0.1" 751 | globals "^13.15.0" 752 | ignore "^5.2.0" 753 | import-fresh "^3.0.0" 754 | imurmurhash "^0.1.4" 755 | is-glob "^4.0.0" 756 | js-yaml "^4.1.0" 757 | json-stable-stringify-without-jsonify "^1.0.1" 758 | levn "^0.4.1" 759 | lodash.merge "^4.6.2" 760 | minimatch "^3.1.2" 761 | natural-compare "^1.4.0" 762 | optionator "^0.9.1" 763 | regexpp "^3.2.0" 764 | strip-ansi "^6.0.1" 765 | strip-json-comments "^3.1.0" 766 | text-table "^0.2.0" 767 | v8-compile-cache "^2.0.3" 768 | 769 | espree@^9.3.2: 770 | version "9.3.2" 771 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" 772 | integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== 773 | dependencies: 774 | acorn "^8.7.1" 775 | acorn-jsx "^5.3.2" 776 | eslint-visitor-keys "^3.3.0" 777 | 778 | esquery@^1.4.0: 779 | version "1.4.0" 780 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 781 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 782 | dependencies: 783 | estraverse "^5.1.0" 784 | 785 | esrecurse@^4.3.0: 786 | version "4.3.0" 787 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 788 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 789 | dependencies: 790 | estraverse "^5.2.0" 791 | 792 | estraverse@^4.1.1: 793 | version "4.3.0" 794 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 795 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 796 | 797 | estraverse@^5.1.0, estraverse@^5.2.0: 798 | version "5.3.0" 799 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 800 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 801 | 802 | esutils@^2.0.2: 803 | version "2.0.3" 804 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 805 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 806 | 807 | etag@~1.8.1: 808 | version "1.8.1" 809 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 810 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 811 | 812 | express@^4.18.1: 813 | version "4.18.2" 814 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 815 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 816 | dependencies: 817 | accepts "~1.3.8" 818 | array-flatten "1.1.1" 819 | body-parser "1.20.1" 820 | content-disposition "0.5.4" 821 | content-type "~1.0.4" 822 | cookie "0.5.0" 823 | cookie-signature "1.0.6" 824 | debug "2.6.9" 825 | depd "2.0.0" 826 | encodeurl "~1.0.2" 827 | escape-html "~1.0.3" 828 | etag "~1.8.1" 829 | finalhandler "1.2.0" 830 | fresh "0.5.2" 831 | http-errors "2.0.0" 832 | merge-descriptors "1.0.1" 833 | methods "~1.1.2" 834 | on-finished "2.4.1" 835 | parseurl "~1.3.3" 836 | path-to-regexp "0.1.7" 837 | proxy-addr "~2.0.7" 838 | qs "6.11.0" 839 | range-parser "~1.2.1" 840 | safe-buffer "5.2.1" 841 | send "0.18.0" 842 | serve-static "1.15.0" 843 | setprototypeof "1.2.0" 844 | statuses "2.0.1" 845 | type-is "~1.6.18" 846 | utils-merge "1.0.1" 847 | vary "~1.1.2" 848 | 849 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 850 | version "3.1.3" 851 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 852 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 853 | 854 | fast-glob@^3.2.9: 855 | version "3.2.11" 856 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" 857 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 858 | dependencies: 859 | "@nodelib/fs.stat" "^2.0.2" 860 | "@nodelib/fs.walk" "^1.2.3" 861 | glob-parent "^5.1.2" 862 | merge2 "^1.3.0" 863 | micromatch "^4.0.4" 864 | 865 | fast-json-stable-stringify@^2.0.0: 866 | version "2.1.0" 867 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 868 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 869 | 870 | fast-levenshtein@^2.0.6: 871 | version "2.0.6" 872 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 873 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 874 | 875 | fastq@^1.6.0: 876 | version "1.13.0" 877 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 878 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 879 | dependencies: 880 | reusify "^1.0.4" 881 | 882 | file-entry-cache@^6.0.1: 883 | version "6.0.1" 884 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 885 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 886 | dependencies: 887 | flat-cache "^3.0.4" 888 | 889 | fill-range@^7.0.1: 890 | version "7.0.1" 891 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 892 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 893 | dependencies: 894 | to-regex-range "^5.0.1" 895 | 896 | finalhandler@1.2.0: 897 | version "1.2.0" 898 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 899 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 900 | dependencies: 901 | debug "2.6.9" 902 | encodeurl "~1.0.2" 903 | escape-html "~1.0.3" 904 | on-finished "2.4.1" 905 | parseurl "~1.3.3" 906 | statuses "2.0.1" 907 | unpipe "~1.0.0" 908 | 909 | find-up@5.0.0: 910 | version "5.0.0" 911 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 912 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 913 | dependencies: 914 | locate-path "^6.0.0" 915 | path-exists "^4.0.0" 916 | 917 | flat-cache@^3.0.4: 918 | version "3.0.4" 919 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 920 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 921 | dependencies: 922 | flatted "^3.1.0" 923 | rimraf "^3.0.2" 924 | 925 | flat@^5.0.2: 926 | version "5.0.2" 927 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 928 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 929 | 930 | flatted@^3.1.0: 931 | version "3.2.4" 932 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" 933 | integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== 934 | 935 | forwarded@0.2.0: 936 | version "0.2.0" 937 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 938 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 939 | 940 | fresh@0.5.2: 941 | version "0.5.2" 942 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 943 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 944 | 945 | fs.realpath@^1.0.0: 946 | version "1.0.0" 947 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 948 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 949 | 950 | fsevents@~2.3.2: 951 | version "2.3.2" 952 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 953 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 954 | 955 | function-bind@^1.1.1: 956 | version "1.1.1" 957 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 958 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 959 | 960 | functional-red-black-tree@^1.0.1: 961 | version "1.0.1" 962 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 963 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 964 | 965 | get-caller-file@^2.0.5: 966 | version "2.0.5" 967 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 968 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 969 | 970 | get-func-name@^2.0.0: 971 | version "2.0.0" 972 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 973 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 974 | 975 | get-intrinsic@^1.0.2: 976 | version "1.1.3" 977 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 978 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 979 | dependencies: 980 | function-bind "^1.1.1" 981 | has "^1.0.3" 982 | has-symbols "^1.0.3" 983 | 984 | glob-parent@^5.1.2, glob-parent@~5.1.2: 985 | version "5.1.2" 986 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 987 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 988 | dependencies: 989 | is-glob "^4.0.1" 990 | 991 | glob-parent@^6.0.1: 992 | version "6.0.2" 993 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 994 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 995 | dependencies: 996 | is-glob "^4.0.3" 997 | 998 | glob@7.2.0, glob@^7.1.3: 999 | version "7.2.0" 1000 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 1001 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 1002 | dependencies: 1003 | fs.realpath "^1.0.0" 1004 | inflight "^1.0.4" 1005 | inherits "2" 1006 | minimatch "^3.0.4" 1007 | once "^1.3.0" 1008 | path-is-absolute "^1.0.0" 1009 | 1010 | globals@^13.15.0: 1011 | version "13.16.0" 1012 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.16.0.tgz#9be4aca28f311aaeb974ea54978ebbb5e35ce46a" 1013 | integrity sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q== 1014 | dependencies: 1015 | type-fest "^0.20.2" 1016 | 1017 | globby@^11.1.0: 1018 | version "11.1.0" 1019 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1020 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1021 | dependencies: 1022 | array-union "^2.1.0" 1023 | dir-glob "^3.0.1" 1024 | fast-glob "^3.2.9" 1025 | ignore "^5.2.0" 1026 | merge2 "^1.4.1" 1027 | slash "^3.0.0" 1028 | 1029 | growl@1.10.5: 1030 | version "1.10.5" 1031 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 1032 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 1033 | 1034 | has-flag@^4.0.0: 1035 | version "4.0.0" 1036 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1037 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1038 | 1039 | has-symbols@^1.0.3: 1040 | version "1.0.3" 1041 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1042 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1043 | 1044 | has@^1.0.3: 1045 | version "1.0.3" 1046 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1047 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1048 | dependencies: 1049 | function-bind "^1.1.1" 1050 | 1051 | he@1.2.0: 1052 | version "1.2.0" 1053 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1054 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1055 | 1056 | http-errors@1.7.2: 1057 | version "1.7.2" 1058 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 1059 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 1060 | dependencies: 1061 | depd "~1.1.2" 1062 | inherits "2.0.3" 1063 | setprototypeof "1.1.1" 1064 | statuses ">= 1.5.0 < 2" 1065 | toidentifier "1.0.0" 1066 | 1067 | http-errors@2.0.0: 1068 | version "2.0.0" 1069 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1070 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1071 | dependencies: 1072 | depd "2.0.0" 1073 | inherits "2.0.4" 1074 | setprototypeof "1.2.0" 1075 | statuses "2.0.1" 1076 | toidentifier "1.0.1" 1077 | 1078 | iconv-lite@0.4.24: 1079 | version "0.4.24" 1080 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1081 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1082 | dependencies: 1083 | safer-buffer ">= 2.1.2 < 3" 1084 | 1085 | ignore@^5.2.0: 1086 | version "5.2.0" 1087 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 1088 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1089 | 1090 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1091 | version "3.3.0" 1092 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1093 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1094 | dependencies: 1095 | parent-module "^1.0.0" 1096 | resolve-from "^4.0.0" 1097 | 1098 | imurmurhash@^0.1.4: 1099 | version "0.1.4" 1100 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1101 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1102 | 1103 | inflight@^1.0.4: 1104 | version "1.0.6" 1105 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1106 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1107 | dependencies: 1108 | once "^1.3.0" 1109 | wrappy "1" 1110 | 1111 | inherits@2, inherits@2.0.4: 1112 | version "2.0.4" 1113 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1114 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1115 | 1116 | inherits@2.0.3: 1117 | version "2.0.3" 1118 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1119 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1120 | 1121 | ipaddr.js@1.9.1: 1122 | version "1.9.1" 1123 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1124 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1125 | 1126 | is-binary-path@~2.1.0: 1127 | version "2.1.0" 1128 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1129 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1130 | dependencies: 1131 | binary-extensions "^2.0.0" 1132 | 1133 | is-extglob@^2.1.1: 1134 | version "2.1.1" 1135 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1136 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1137 | 1138 | is-fullwidth-code-point@^3.0.0: 1139 | version "3.0.0" 1140 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1141 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1142 | 1143 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 1144 | version "4.0.3" 1145 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1146 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1147 | dependencies: 1148 | is-extglob "^2.1.1" 1149 | 1150 | is-number@^7.0.0: 1151 | version "7.0.0" 1152 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1153 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1154 | 1155 | is-plain-obj@^2.1.0: 1156 | version "2.1.0" 1157 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1158 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1159 | 1160 | is-unicode-supported@^0.1.0: 1161 | version "0.1.0" 1162 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1163 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1164 | 1165 | isexe@^2.0.0: 1166 | version "2.0.0" 1167 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1168 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1169 | 1170 | js-yaml@4.1.0, js-yaml@^4.1.0: 1171 | version "4.1.0" 1172 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1173 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1174 | dependencies: 1175 | argparse "^2.0.1" 1176 | 1177 | json-schema-traverse@^0.4.1: 1178 | version "0.4.1" 1179 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1180 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1181 | 1182 | json-stable-stringify-without-jsonify@^1.0.1: 1183 | version "1.0.1" 1184 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1185 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1186 | 1187 | jsonc-parser@^3.2.0: 1188 | version "3.2.0" 1189 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" 1190 | integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== 1191 | 1192 | levn@^0.4.1: 1193 | version "0.4.1" 1194 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1195 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1196 | dependencies: 1197 | prelude-ls "^1.2.1" 1198 | type-check "~0.4.0" 1199 | 1200 | locate-path@^6.0.0: 1201 | version "6.0.0" 1202 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1203 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1204 | dependencies: 1205 | p-locate "^5.0.0" 1206 | 1207 | lodash.merge@^4.6.2: 1208 | version "4.6.2" 1209 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1210 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1211 | 1212 | log-symbols@4.1.0: 1213 | version "4.1.0" 1214 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 1215 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 1216 | dependencies: 1217 | chalk "^4.1.0" 1218 | is-unicode-supported "^0.1.0" 1219 | 1220 | loupe@^2.3.1: 1221 | version "2.3.4" 1222 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" 1223 | integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== 1224 | dependencies: 1225 | get-func-name "^2.0.0" 1226 | 1227 | lru-cache@^6.0.0: 1228 | version "6.0.0" 1229 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1230 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1231 | dependencies: 1232 | yallist "^4.0.0" 1233 | 1234 | lunr@^2.3.9: 1235 | version "2.3.9" 1236 | resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" 1237 | integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== 1238 | 1239 | make-error@^1.1.1: 1240 | version "1.3.6" 1241 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1242 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1243 | 1244 | marked@^4.3.0: 1245 | version "4.3.0" 1246 | resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" 1247 | integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== 1248 | 1249 | media-typer@0.3.0: 1250 | version "0.3.0" 1251 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1252 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1253 | 1254 | merge-descriptors@1.0.1: 1255 | version "1.0.1" 1256 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1257 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1258 | 1259 | merge2@^1.3.0, merge2@^1.4.1: 1260 | version "1.4.1" 1261 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1262 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1263 | 1264 | methods@~1.1.2: 1265 | version "1.1.2" 1266 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1267 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1268 | 1269 | micromatch@^4.0.4: 1270 | version "4.0.5" 1271 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1272 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1273 | dependencies: 1274 | braces "^3.0.2" 1275 | picomatch "^2.3.1" 1276 | 1277 | mime-db@1.51.0: 1278 | version "1.51.0" 1279 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 1280 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 1281 | 1282 | mime-db@1.52.0: 1283 | version "1.52.0" 1284 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1285 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1286 | 1287 | mime-types@~2.1.24: 1288 | version "2.1.34" 1289 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 1290 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 1291 | dependencies: 1292 | mime-db "1.51.0" 1293 | 1294 | mime-types@~2.1.34: 1295 | version "2.1.35" 1296 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1297 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1298 | dependencies: 1299 | mime-db "1.52.0" 1300 | 1301 | mime@1.6.0: 1302 | version "1.6.0" 1303 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1304 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1305 | 1306 | minimatch@4.2.1: 1307 | version "4.2.1" 1308 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" 1309 | integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== 1310 | dependencies: 1311 | brace-expansion "^1.1.7" 1312 | 1313 | minimatch@^3.0.4, minimatch@^3.1.2: 1314 | version "3.1.2" 1315 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1316 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1317 | dependencies: 1318 | brace-expansion "^1.1.7" 1319 | 1320 | minimatch@^9.0.0: 1321 | version "9.0.0" 1322 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56" 1323 | integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== 1324 | dependencies: 1325 | brace-expansion "^2.0.1" 1326 | 1327 | mocha@^9.1.3: 1328 | version "9.2.2" 1329 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" 1330 | integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== 1331 | dependencies: 1332 | "@ungap/promise-all-settled" "1.1.2" 1333 | ansi-colors "4.1.1" 1334 | browser-stdout "1.3.1" 1335 | chokidar "3.5.3" 1336 | debug "4.3.3" 1337 | diff "5.0.0" 1338 | escape-string-regexp "4.0.0" 1339 | find-up "5.0.0" 1340 | glob "7.2.0" 1341 | growl "1.10.5" 1342 | he "1.2.0" 1343 | js-yaml "4.1.0" 1344 | log-symbols "4.1.0" 1345 | minimatch "4.2.1" 1346 | ms "2.1.3" 1347 | nanoid "3.3.1" 1348 | serialize-javascript "6.0.0" 1349 | strip-json-comments "3.1.1" 1350 | supports-color "8.1.1" 1351 | which "2.0.2" 1352 | workerpool "6.2.0" 1353 | yargs "16.2.0" 1354 | yargs-parser "20.2.4" 1355 | yargs-unparser "2.0.0" 1356 | 1357 | morgan@^1.10.0: 1358 | version "1.10.0" 1359 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 1360 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 1361 | dependencies: 1362 | basic-auth "~2.0.1" 1363 | debug "2.6.9" 1364 | depd "~2.0.0" 1365 | on-finished "~2.3.0" 1366 | on-headers "~1.0.2" 1367 | 1368 | ms@2.0.0: 1369 | version "2.0.0" 1370 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1371 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1372 | 1373 | ms@2.1.2: 1374 | version "2.1.2" 1375 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1376 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1377 | 1378 | ms@2.1.3: 1379 | version "2.1.3" 1380 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1381 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1382 | 1383 | nanoid@3.3.1: 1384 | version "3.3.1" 1385 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 1386 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 1387 | 1388 | natural-compare@^1.4.0: 1389 | version "1.4.0" 1390 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1391 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1392 | 1393 | negotiator@0.6.3: 1394 | version "0.6.3" 1395 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1396 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1397 | 1398 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1399 | version "3.0.0" 1400 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1401 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1402 | 1403 | object-inspect@^1.9.0: 1404 | version "1.12.2" 1405 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 1406 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 1407 | 1408 | on-finished@2.4.1: 1409 | version "2.4.1" 1410 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1411 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1412 | dependencies: 1413 | ee-first "1.1.1" 1414 | 1415 | on-finished@~2.3.0: 1416 | version "2.3.0" 1417 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1418 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1419 | dependencies: 1420 | ee-first "1.1.1" 1421 | 1422 | on-headers@~1.0.2: 1423 | version "1.0.2" 1424 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1425 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 1426 | 1427 | once@^1.3.0: 1428 | version "1.4.0" 1429 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1430 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1431 | dependencies: 1432 | wrappy "1" 1433 | 1434 | optionator@^0.9.1: 1435 | version "0.9.1" 1436 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1437 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1438 | dependencies: 1439 | deep-is "^0.1.3" 1440 | fast-levenshtein "^2.0.6" 1441 | levn "^0.4.1" 1442 | prelude-ls "^1.2.1" 1443 | type-check "^0.4.0" 1444 | word-wrap "^1.2.3" 1445 | 1446 | p-limit@^3.0.2: 1447 | version "3.1.0" 1448 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1449 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1450 | dependencies: 1451 | yocto-queue "^0.1.0" 1452 | 1453 | p-locate@^5.0.0: 1454 | version "5.0.0" 1455 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1456 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1457 | dependencies: 1458 | p-limit "^3.0.2" 1459 | 1460 | parent-module@^1.0.0: 1461 | version "1.0.1" 1462 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1463 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1464 | dependencies: 1465 | callsites "^3.0.0" 1466 | 1467 | parseurl@~1.3.3: 1468 | version "1.3.3" 1469 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1470 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1471 | 1472 | path-exists@^4.0.0: 1473 | version "4.0.0" 1474 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1475 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1476 | 1477 | path-is-absolute@^1.0.0: 1478 | version "1.0.1" 1479 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1480 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1481 | 1482 | path-key@^3.1.0: 1483 | version "3.1.1" 1484 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1485 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1486 | 1487 | path-to-regexp@0.1.7: 1488 | version "0.1.7" 1489 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1490 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1491 | 1492 | path-type@^4.0.0: 1493 | version "4.0.0" 1494 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1495 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1496 | 1497 | pathval@^1.1.1: 1498 | version "1.1.1" 1499 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1500 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1501 | 1502 | picomatch@^2.0.4, picomatch@^2.2.1: 1503 | version "2.3.0" 1504 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1505 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1506 | 1507 | picomatch@^2.3.1: 1508 | version "2.3.1" 1509 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1510 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1511 | 1512 | prelude-ls@^1.2.1: 1513 | version "1.2.1" 1514 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1515 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1516 | 1517 | proxy-addr@~2.0.7: 1518 | version "2.0.7" 1519 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1520 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1521 | dependencies: 1522 | forwarded "0.2.0" 1523 | ipaddr.js "1.9.1" 1524 | 1525 | punycode@^2.1.0: 1526 | version "2.1.1" 1527 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1528 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1529 | 1530 | qs@6.11.0: 1531 | version "6.11.0" 1532 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 1533 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1534 | dependencies: 1535 | side-channel "^1.0.4" 1536 | 1537 | qs@6.7.0: 1538 | version "6.7.0" 1539 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1540 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1541 | 1542 | queue-microtask@^1.2.2: 1543 | version "1.2.3" 1544 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1545 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1546 | 1547 | randombytes@^2.1.0: 1548 | version "2.1.0" 1549 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1550 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1551 | dependencies: 1552 | safe-buffer "^5.1.0" 1553 | 1554 | range-parser@~1.2.1: 1555 | version "1.2.1" 1556 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1557 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1558 | 1559 | raw-body@2.4.0: 1560 | version "2.4.0" 1561 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1562 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1563 | dependencies: 1564 | bytes "3.1.0" 1565 | http-errors "1.7.2" 1566 | iconv-lite "0.4.24" 1567 | unpipe "1.0.0" 1568 | 1569 | raw-body@2.5.1: 1570 | version "2.5.1" 1571 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 1572 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 1573 | dependencies: 1574 | bytes "3.1.2" 1575 | http-errors "2.0.0" 1576 | iconv-lite "0.4.24" 1577 | unpipe "1.0.0" 1578 | 1579 | readdirp@~3.6.0: 1580 | version "3.6.0" 1581 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1582 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1583 | dependencies: 1584 | picomatch "^2.2.1" 1585 | 1586 | regexpp@^3.2.0: 1587 | version "3.2.0" 1588 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1589 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1590 | 1591 | require-directory@^2.1.1: 1592 | version "2.1.1" 1593 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1594 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1595 | 1596 | resolve-from@^4.0.0: 1597 | version "4.0.0" 1598 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1599 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1600 | 1601 | reusify@^1.0.4: 1602 | version "1.0.4" 1603 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1604 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1605 | 1606 | rimraf@^3.0.2: 1607 | version "3.0.2" 1608 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1609 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1610 | dependencies: 1611 | glob "^7.1.3" 1612 | 1613 | run-parallel@^1.1.9: 1614 | version "1.2.0" 1615 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1616 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1617 | dependencies: 1618 | queue-microtask "^1.2.2" 1619 | 1620 | safe-buffer@5.1.2: 1621 | version "5.1.2" 1622 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1623 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1624 | 1625 | safe-buffer@5.2.1, safe-buffer@^5.1.0: 1626 | version "5.2.1" 1627 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1628 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1629 | 1630 | "safer-buffer@>= 2.1.2 < 3": 1631 | version "2.1.2" 1632 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1633 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1634 | 1635 | semver@^7.3.7: 1636 | version "7.5.4" 1637 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 1638 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 1639 | dependencies: 1640 | lru-cache "^6.0.0" 1641 | 1642 | send@0.18.0: 1643 | version "0.18.0" 1644 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1645 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1646 | dependencies: 1647 | debug "2.6.9" 1648 | depd "2.0.0" 1649 | destroy "1.2.0" 1650 | encodeurl "~1.0.2" 1651 | escape-html "~1.0.3" 1652 | etag "~1.8.1" 1653 | fresh "0.5.2" 1654 | http-errors "2.0.0" 1655 | mime "1.6.0" 1656 | ms "2.1.3" 1657 | on-finished "2.4.1" 1658 | range-parser "~1.2.1" 1659 | statuses "2.0.1" 1660 | 1661 | serialize-javascript@6.0.0: 1662 | version "6.0.0" 1663 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1664 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1665 | dependencies: 1666 | randombytes "^2.1.0" 1667 | 1668 | serve-static@1.15.0: 1669 | version "1.15.0" 1670 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1671 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1672 | dependencies: 1673 | encodeurl "~1.0.2" 1674 | escape-html "~1.0.3" 1675 | parseurl "~1.3.3" 1676 | send "0.18.0" 1677 | 1678 | setprototypeof@1.1.1: 1679 | version "1.1.1" 1680 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1681 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1682 | 1683 | setprototypeof@1.2.0: 1684 | version "1.2.0" 1685 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1686 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1687 | 1688 | shebang-command@^2.0.0: 1689 | version "2.0.0" 1690 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1691 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1692 | dependencies: 1693 | shebang-regex "^3.0.0" 1694 | 1695 | shebang-regex@^3.0.0: 1696 | version "3.0.0" 1697 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1698 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1699 | 1700 | shiki@^0.14.1: 1701 | version "0.14.1" 1702 | resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.1.tgz#9fbe082d0a8aa2ad63df4fbf2ee11ec924aa7ee1" 1703 | integrity sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw== 1704 | dependencies: 1705 | ansi-sequence-parser "^1.1.0" 1706 | jsonc-parser "^3.2.0" 1707 | vscode-oniguruma "^1.7.0" 1708 | vscode-textmate "^8.0.0" 1709 | 1710 | side-channel@^1.0.4: 1711 | version "1.0.4" 1712 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1713 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1714 | dependencies: 1715 | call-bind "^1.0.0" 1716 | get-intrinsic "^1.0.2" 1717 | object-inspect "^1.9.0" 1718 | 1719 | slash@^3.0.0: 1720 | version "3.0.0" 1721 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1722 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1723 | 1724 | statuses@2.0.1: 1725 | version "2.0.1" 1726 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1727 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1728 | 1729 | "statuses@>= 1.5.0 < 2": 1730 | version "1.5.0" 1731 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1732 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1733 | 1734 | string-width@^4.1.0, string-width@^4.2.0: 1735 | version "4.2.3" 1736 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1737 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1738 | dependencies: 1739 | emoji-regex "^8.0.0" 1740 | is-fullwidth-code-point "^3.0.0" 1741 | strip-ansi "^6.0.1" 1742 | 1743 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1744 | version "6.0.1" 1745 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1746 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1747 | dependencies: 1748 | ansi-regex "^5.0.1" 1749 | 1750 | strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1751 | version "3.1.1" 1752 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1753 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1754 | 1755 | supports-color@8.1.1: 1756 | version "8.1.1" 1757 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1758 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1759 | dependencies: 1760 | has-flag "^4.0.0" 1761 | 1762 | supports-color@^7.1.0: 1763 | version "7.2.0" 1764 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1765 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1766 | dependencies: 1767 | has-flag "^4.0.0" 1768 | 1769 | text-table@^0.2.0: 1770 | version "0.2.0" 1771 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1772 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1773 | 1774 | to-regex-range@^5.0.1: 1775 | version "5.0.1" 1776 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1777 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1778 | dependencies: 1779 | is-number "^7.0.0" 1780 | 1781 | toidentifier@1.0.0: 1782 | version "1.0.0" 1783 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1784 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1785 | 1786 | toidentifier@1.0.1: 1787 | version "1.0.1" 1788 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1789 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1790 | 1791 | ts-node@^10.9.1: 1792 | version "10.9.1" 1793 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 1794 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 1795 | dependencies: 1796 | "@cspotcode/source-map-support" "^0.8.0" 1797 | "@tsconfig/node10" "^1.0.7" 1798 | "@tsconfig/node12" "^1.0.7" 1799 | "@tsconfig/node14" "^1.0.0" 1800 | "@tsconfig/node16" "^1.0.2" 1801 | acorn "^8.4.1" 1802 | acorn-walk "^8.1.1" 1803 | arg "^4.1.0" 1804 | create-require "^1.1.0" 1805 | diff "^4.0.1" 1806 | make-error "^1.1.1" 1807 | v8-compile-cache-lib "^3.0.1" 1808 | yn "3.1.1" 1809 | 1810 | tslib@^1.8.1: 1811 | version "1.14.1" 1812 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1813 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1814 | 1815 | tsutils@^3.21.0: 1816 | version "3.21.0" 1817 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 1818 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1819 | dependencies: 1820 | tslib "^1.8.1" 1821 | 1822 | type-check@^0.4.0, type-check@~0.4.0: 1823 | version "0.4.0" 1824 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1825 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1826 | dependencies: 1827 | prelude-ls "^1.2.1" 1828 | 1829 | type-detect@^4.0.0, type-detect@^4.0.5: 1830 | version "4.0.8" 1831 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1832 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1833 | 1834 | type-fest@^0.20.2: 1835 | version "0.20.2" 1836 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1837 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1838 | 1839 | type-is@~1.6.17, type-is@~1.6.18: 1840 | version "1.6.18" 1841 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1842 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1843 | dependencies: 1844 | media-typer "0.3.0" 1845 | mime-types "~2.1.24" 1846 | 1847 | typedoc@^0.24.4: 1848 | version "0.24.4" 1849 | resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.24.4.tgz#bae677982115f94b9c6bc5d2bfa133350de7fedd" 1850 | integrity sha512-vQuliyGhJEGeKzzCFHbkS3m0gHoIL6cfr0fHf6eX658iGELtq2J9mWe0b+X5McEYgFoMuHFt5Py3Zug6Sxjn/Q== 1851 | dependencies: 1852 | lunr "^2.3.9" 1853 | marked "^4.3.0" 1854 | minimatch "^9.0.0" 1855 | shiki "^0.14.1" 1856 | 1857 | typescript@^5.0.4: 1858 | version "5.0.4" 1859 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" 1860 | integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== 1861 | 1862 | unpipe@1.0.0, unpipe@~1.0.0: 1863 | version "1.0.0" 1864 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1865 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1866 | 1867 | uri-js@^4.2.2: 1868 | version "4.4.1" 1869 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1870 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1871 | dependencies: 1872 | punycode "^2.1.0" 1873 | 1874 | utils-merge@1.0.1: 1875 | version "1.0.1" 1876 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1877 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1878 | 1879 | v8-compile-cache-lib@^3.0.1: 1880 | version "3.0.1" 1881 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1882 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1883 | 1884 | v8-compile-cache@^2.0.3: 1885 | version "2.3.0" 1886 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 1887 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 1888 | 1889 | vary@~1.1.2: 1890 | version "1.1.2" 1891 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1892 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1893 | 1894 | vscode-oniguruma@^1.7.0: 1895 | version "1.7.0" 1896 | resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" 1897 | integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== 1898 | 1899 | vscode-textmate@^8.0.0: 1900 | version "8.0.0" 1901 | resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" 1902 | integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== 1903 | 1904 | which@2.0.2, which@^2.0.1: 1905 | version "2.0.2" 1906 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1907 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1908 | dependencies: 1909 | isexe "^2.0.0" 1910 | 1911 | word-wrap@^1.2.3: 1912 | version "1.2.4" 1913 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" 1914 | integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== 1915 | 1916 | workerpool@6.2.0: 1917 | version "6.2.0" 1918 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" 1919 | integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== 1920 | 1921 | wrap-ansi@^7.0.0: 1922 | version "7.0.0" 1923 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1924 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1925 | dependencies: 1926 | ansi-styles "^4.0.0" 1927 | string-width "^4.1.0" 1928 | strip-ansi "^6.0.0" 1929 | 1930 | wrappy@1: 1931 | version "1.0.2" 1932 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1933 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1934 | 1935 | y18n@^5.0.5: 1936 | version "5.0.8" 1937 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1938 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1939 | 1940 | yallist@^4.0.0: 1941 | version "4.0.0" 1942 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1943 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1944 | 1945 | yargs-parser@20.2.4: 1946 | version "20.2.4" 1947 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1948 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1949 | 1950 | yargs-parser@^20.2.2: 1951 | version "20.2.9" 1952 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1953 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1954 | 1955 | yargs-unparser@2.0.0: 1956 | version "2.0.0" 1957 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1958 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1959 | dependencies: 1960 | camelcase "^6.0.0" 1961 | decamelize "^4.0.0" 1962 | flat "^5.0.2" 1963 | is-plain-obj "^2.1.0" 1964 | 1965 | yargs@16.2.0: 1966 | version "16.2.0" 1967 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1968 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1969 | dependencies: 1970 | cliui "^7.0.2" 1971 | escalade "^3.1.1" 1972 | get-caller-file "^2.0.5" 1973 | require-directory "^2.1.1" 1974 | string-width "^4.2.0" 1975 | y18n "^5.0.5" 1976 | yargs-parser "^20.2.2" 1977 | 1978 | yn@3.1.1: 1979 | version "3.1.1" 1980 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1981 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1982 | 1983 | yocto-queue@^0.1.0: 1984 | version "0.1.0" 1985 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1986 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1987 | --------------------------------------------------------------------------------