├── .node-version ├── changelog.d └── .gitkeep ├── .npmignore ├── .github ├── CODEOWNERS ├── pull_request_template.md └── workflows │ ├── sign-off.yml │ ├── triage-incoming.yml │ ├── lint.yml │ ├── tests.yml │ └── newsfile.yml ├── src ├── index.ts ├── AppserviceHttpError.ts ├── app-service.ts └── app-service-registration.ts ├── CONTRIBUTING.md ├── scripts ├── changelog-release.sh └── check-newsfragment ├── .eslintrc ├── tsconfig.json ├── .gitignore ├── pyproject.toml ├── package.json ├── README.md ├── test └── test_app-service-registration.ts ├── CHANGELOG.md ├── LICENSE └── yarn.lock /.node-version: -------------------------------------------------------------------------------- 1 | 22 2 | -------------------------------------------------------------------------------- /changelog.d/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.tsbuildinfo 2 | .typedoc -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @matrix-org/bridges 2 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./app-service"; 2 | export * from "./app-service-registration"; 3 | export * from "./AppserviceHttpError"; 4 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /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. -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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/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 | -------------------------------------------------------------------------------- /.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-file: .node-version 18 | - run: yarn --ignore-scripts --strict-semver --pure-lockfile 19 | - run: yarn lint -------------------------------------------------------------------------------- /.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: [22, 24] 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/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 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node22/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 | -------------------------------------------------------------------------------- /.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/ -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "matrix-appservice", 3 | "version": "3.0.0", 4 | "description": "Matrix Application Service Framework", 5 | "main": "lib/index.js", 6 | "types": "lib/index.d.ts", 7 | "engines": { 8 | "node": ">=22" 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.2", 31 | "js-yaml": "^4.1.0", 32 | "morgan": "^1.10.0" 33 | }, 34 | "devDependencies": { 35 | "@tsconfig/node22": "^22", 36 | "@types/body-parser": "^1.19.2", 37 | "@types/chai": "^4.2.22", 38 | "@types/express": "^4.17.21", 39 | "@types/js-yaml": "^4.0.9", 40 | "@types/mocha": "^10.0.0", 41 | "@types/morgan": "^1.9.3", 42 | "@types/node": "^22", 43 | "@typescript-eslint/eslint-plugin": "^8.39.0", 44 | "@typescript-eslint/parser": "^8.39.0", 45 | "chai": "^4.3.4", 46 | "eslint": "^8.57.0", 47 | "mocha": "^10.0.0", 48 | "ts-node": "^10.9.2", 49 | "typedoc": "^0.28.9", 50 | "typescript": "^5.9.2" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | }) -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 3.0.0 (2025-08-15) 2 | ================== 3 | 4 | Improved Documentation 5 | ---------------------- 6 | 7 | - Fix the README's example script for creating an app service registration file. ([\#71](https://github.com/matrix-org/matrix-appservice-node/issues/71)) 8 | 9 | 10 | Deprecations and Removals 11 | ------------------------- 12 | 13 | - Drop support for Node 18 & 20, add support for Node 22 & 24. ([\#73](https://github.com/matrix-org/matrix-appservice-node/issues/73)) 14 | 15 | 16 | Internal Changes 17 | ---------------- 18 | 19 | - Update semver from 7.3.7 to 7.5.4. ([\#69](https://github.com/matrix-org/matrix-appservice-node/issues/69)) 20 | - Update word-wrap from 1.2.3 to 1.2.4. ([\#70](https://github.com/matrix-org/matrix-appservice-node/issues/70)) 21 | 22 | 23 | 2.0.0 (2023-04-21) 24 | ================== 25 | 26 | Deprecations and Removals 27 | ------------------------- 28 | 29 | - The legacy `/users`, `/rooms`, and `/transactions` endpoints have been removed in this release 30 | and now redirect to the appropriate spec'd path. ([\#63](https://github.com/matrix-org/matrix-appservice-node/issues/63)) 31 | - Add support for Node 20, and drop support for Node 16. ([\#65](https://github.com/matrix-org/matrix-appservice-node/issues/65)) 32 | 33 | 34 | Internal Changes 35 | ---------------- 36 | 37 | - Update the version of `express` to match that of `matrix-appservice-bridge`. ([\#60](https://github.com/matrix-org/matrix-appservice-node/issues/60)) 38 | 39 | 40 | 1.1.0 (2022-08-09) 41 | ================== 42 | 43 | Features 44 | -------- 45 | 46 | - 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)) 47 | 48 | 49 | Internal Changes 50 | ---------------- 51 | 52 | - Add new CI workflow to check for signoffs. ([\#58](https://github.com/matrix-org/matrix-appservice-node/issues/58)) 53 | 54 | 55 | 1.0.0 (2022-07-20) 56 | ================== 57 | 58 | **This release drops support for Node 12 and adds support for Node 18** 59 | 60 | Features 61 | -------- 62 | 63 | - 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)) 64 | 65 | 66 | Internal Changes 67 | ---------------- 68 | 69 | - The project has been modernized to be in-line with our other matrix-org bridge repos. This means: 70 | - We now use yarn for dependency management. 71 | - We now use GitHub CI. 72 | - There is a contributing file. ([\#57](https://github.com/matrix-org/matrix-appservice-node/issues/57)) 73 | 74 | 75 | 0.10.1 (2022-03-15) 76 | ==================== 77 | 78 | Bugfixes 79 | -------- 80 | 81 | - Remove tailing new line on http-log events ([\#50](https://github.com/matrix-org/matrix-appservice-node/issues/50)) 82 | 83 | 84 | 0.10.0 (2021-11-23) 85 | ==================== 86 | 87 | Internal Changes 88 | ---------------- 89 | 90 | - Update dependencies, including Typescript to `4.5.2` ([\#45](https://github.com/matrix-org/matrix-appservice-node/issues/45)) 91 | 92 | 93 | 0.9.0 (2021-07-15) 94 | ================== 95 | 96 | Internal Changes 97 | ---------------- 98 | 99 | - 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)) 100 | - Update to Typescript 4.3.5 and update Typedoc. ([\#44](https://github.com/matrix-org/matrix-appservice-node/issues/44)) 101 | 102 | 103 | 0.8.0 (2021-03-01) 104 | =================== 105 | 106 | Features 107 | -------- 108 | 109 | - Add health check endpoint ([\#38](https://github.com/matrix-org/matrix-appservice-node/issues/38)) 110 | 111 | 112 | 0.7.1 (2020-11-05) 113 | =================== 114 | 115 | Internal Changes 116 | ---------------- 117 | 118 | - Export `AppServiceOutput` and `RegexObj` interfaces. ([\#35](https://github.com/matrix-org/matrix-appservice-node/issues/35)) 119 | 120 | 121 | 0.7.0 (2020-10-30) 122 | =================== 123 | 124 | Bugfixes 125 | -------- 126 | 127 | - 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)) 128 | 129 | 130 | 0.6.0 (2020-10-08) 131 | =================== 132 | 133 | Features 134 | -------- 135 | 136 | - Add experimental support for receiving ephemeral data from the homeserver (MSC2409) ([\#32](https://github.com/matrix-org/matrix-appservice-node/issues/32)) 137 | 138 | 139 | 0.5.0 (2020-09-14) 140 | =================== 141 | 142 | Features 143 | -------- 144 | 145 | - Expose `AppService.app` so that services may add their own Express request handlers. ([\#26](https://github.com/matrix-org/matrix-appservice-node/issues/26)) 146 | - Expose `AppService.expressApp` ([\#27](https://github.com/matrix-org/matrix-appservice-node/issues/27)) 147 | - Documentation is now generated for Typescript files ([\#28](https://github.com/matrix-org/matrix-appservice-node/issues/28)) 148 | 149 | 150 | Internal Changes 151 | ---------------- 152 | 153 | - Remove `request` dependency ([\#25](https://github.com/matrix-org/matrix-appservice-node/issues/25)) 154 | 155 | 156 | 0.4.2 (2020-07-24) 157 | =================== 158 | 159 | Internal Changes 160 | ---------------- 161 | 162 | - Start using towncrier for changelogs ([\#23](https://github.com/matrix-org/matrix-appservice-node/issues/23)) 163 | - Update packages. ([\#24](https://github.com/matrix-org/matrix-appservice-node/issues/24)) 164 | 165 | 166 | v0.4.1 167 | ====== 168 | 169 | - Fixed an issue which caused the package to fail to install. 170 | 171 | v0.4.0 172 | ====== 173 | 174 | - **The library is now written in Typescript**. 175 | This change should not cause any breakages, as the library will 176 | compile itself on installation via the `postinstall` script. 177 | 178 | v0.3.5 179 | ====== 180 | 181 | Updated `body-parser`, `express`, `morgan` and `request` packages to fix security vulnerabilities. 182 | 183 | 184 | v0.3.4 185 | ====== 186 | `AppServiceRegistration`: 187 | * Added `getProtocols()` and `setProtocols(string[])`. (Thanks @Half-Shot!) 188 | `AppService`: 189 | * Add HTTPS support if the environment variables `MATRIX_AS_TLS_KEY` and `MATRIX_AS_TLS_CERT` exist. (Thanks @AndrewJDR!) 190 | 191 | v0.3.3 192 | ====== 193 | `AppService`: 194 | * Redact access tokens in the AppService logs. 195 | `AppServiceRegistration`: 196 | * 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)`. 197 | 198 | v0.3.2 199 | ====== 200 | Expanded `AppService.listen` to accept more parameters to control how the service 201 | listens for connections. 202 | 203 | v0.3.1 204 | ====== 205 | `AppServiceRegistration`: 206 | * Bug fix which prevented registration files from being loaded correctly. 207 | 208 | v0.3.0 209 | ====== 210 | `AppServiceRegistration`: 211 | * Require an ID to be set with the `setId` method. 212 | 213 | v0.2.3 214 | ====== 215 | `AppServiceRegistration`: 216 | * Added instance method `setAppServiceUrl`. Setting the URL in the constructor 217 | is still possible but discouraged as it is less clear which URL should go 218 | there (HS or AS). 219 | 220 | v0.2.2 221 | ====== 222 | `AppServiceRegistration`: 223 | * Added static method `fromObject` 224 | * Added instance methods `isUserMatch`, `isAliasMatch`, `isRoomMatch`. 225 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging 14 | export declare interface AppService { 15 | /** 16 | * Emitted when an event is pushed to the appservice. 17 | * The format of the event object is documented at 18 | * https://matrix.org/docs/spec/application_service/r0.1.2#put-matrix-app-v1-transactions-txnid 19 | * @event 20 | * @example 21 | * appService.on("event", function(ev) { 22 | * console.log("ID: %s", ev.event_id); 23 | * }); 24 | */ 25 | on(event: "event", cb: (event: Record) => void): this; 26 | /** 27 | * Emitted when an ephemeral event is pushed to the appservice. 28 | * The format of the event object is documented at 29 | * https://github.com/matrix-org/matrix-doc/pull/2409 30 | * @event 31 | * @example 32 | * appService.on("ephemeral", function(ev) { 33 | * console.log("ID: %s", ev.type); 34 | * }); 35 | */ 36 | on(event: "ephemeral", cb: (event: Record) => void): this; 37 | /** 38 | * Emitted when the HTTP listener logs some information. 39 | * `access_tokens` are stripped from requests 40 | * @event 41 | * @example 42 | * appService.on("http-log", function(line) { 43 | * console.log(line); 44 | * }); 45 | */ 46 | on(event: "http-log", cb: (line: string) => void): this; 47 | /** 48 | * Emitted when an event of a particular type is pushed 49 | * to the appservice. This will be emitted *in addition* 50 | * to "event", so ensure your bridge deduplicates events. 51 | * @event 52 | * @param event Should start with "type:" 53 | * @example 54 | * appService.on("type:m.room.message", function(event) { 55 | * console.log("ID: %s", ev.content.body); 56 | * }); 57 | */ 58 | on(event: string, cb: (event: Record) => void): this; 59 | } 60 | 61 | // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging 62 | export class AppService extends EventEmitter { 63 | /** 64 | * @deprecated Use `AppService.expressApp` 65 | */ 66 | public readonly app: Application; 67 | private server?: Server; 68 | private lastProcessedTxnId = ""; 69 | /** 70 | * Construct a new application service. 71 | * @constructor 72 | * @param {Object} config Configuration for this service. 73 | * @param {String} config.homeserverToken The incoming HS token to expect. Must 74 | * be set prior to calling listen(port). 75 | * @param {Number} config.httpMaxSizeBytes The max number of bytes allowed on an 76 | * incoming HTTP request. Default: 5000000. 77 | * @throws If a homeserver token is not supplied. 78 | */ 79 | constructor (private config: { homeserverToken: string; httpMaxSizeBytes?: number}) { 80 | super(); 81 | const app = express(); 82 | app.use(morgan("combined", { 83 | stream: { 84 | write: this.onMorganLog.bind(this), 85 | } 86 | })); 87 | 88 | app.use(bodyParser.json({ 89 | limit: this.config.httpMaxSizeBytes || MAX_SIZE_BYTES, 90 | })); 91 | const legacyEndpointHandler = (req: Request, res: Response) => { 92 | res.status(308).location("/_matrix/app/v1" + req.originalUrl).send({ errcode: "M_UNKNOWN", error: "This non-standard endpoint has been removed" }) }; 93 | app.get("/_matrix/app/v1/users/:userId", this.onGetUsers.bind(this)); 94 | app.get("/_matrix/app/v1/rooms/:alias", this.onGetRoomAlias.bind(this)); 95 | app.put("/_matrix/app/v1/transactions/:txnId", this.onTransaction.bind(this)); 96 | app.get("/users/:userId", legacyEndpointHandler); 97 | app.get("/rooms/:alias", legacyEndpointHandler); 98 | app.put("/transactions/:txnId", legacyEndpointHandler); 99 | app.get("/health", this.onHealthCheck.bind(this)); 100 | 101 | this.app = app; 102 | } 103 | 104 | /*** 105 | * Begin listening on the specified port. 106 | * @param {Number} port The port to listen on. 107 | * @param {String} hostname Optional hostname to listen on 108 | * @param {Number} backlog Maximum length of the queue of pending connections 109 | * @param {Function} callback The callback for the "listening" event. Optional. 110 | * @returns {Promise} When the server is listening, if a callback is not provided. 111 | */ 112 | public listen(port: number, hostname: string, backlog: number, callback?: () => void) { 113 | const tlsKey = process.env.MATRIX_AS_TLS_KEY; 114 | const tlsCert = process.env.MATRIX_AS_TLS_CERT; 115 | let serverApp: Server; 116 | if (tlsKey || tlsCert) { 117 | if (!(tlsKey && tlsCert)) { 118 | throw new Error("MATRIX_AS_TLS_KEY and MATRIX_AS_TLS_CERT should be defined together!"); 119 | } 120 | 121 | if (!fs.existsSync(tlsKey)) { 122 | throw new Error("Could not open MATRIX_AS_TLS_KEY: " + tlsKey); 123 | } 124 | 125 | if (!fs.existsSync(tlsCert)) { 126 | throw new Error("Could not open MATRIX_AS_TLS_CERT: " + tlsCert); 127 | } 128 | 129 | const options = { 130 | key : fs.readFileSync(tlsKey), 131 | cert : fs.readFileSync(tlsCert) 132 | }; 133 | serverApp = https.createServer(options, this.app); 134 | } 135 | else { 136 | serverApp = http.createServer({}, this.app); 137 | } 138 | if (callback) { 139 | this.server = serverApp.listen(port, hostname, backlog, callback); 140 | return; 141 | } 142 | return new Promise((resolve, reject) => { 143 | serverApp.once("error", reject); 144 | serverApp.once("listening", resolve); 145 | this.server = serverApp.listen(port, hostname, backlog); 146 | }); 147 | } 148 | 149 | /** 150 | * Closes the HTTP server. 151 | * @returns {Promise} When the operation has completed 152 | * @throws If the server has not been started. 153 | */ 154 | public async close() { 155 | if (!this.server) { 156 | throw Error("Server has not started"); 157 | } 158 | return util.promisify(this.server.close).apply(this.server); 159 | } 160 | 161 | 162 | /** 163 | * Override this method to handle alias queries. 164 | * @param {string} alias The queried room alias 165 | * @param {Function} callback The callback to invoke when complete. 166 | * @return {Promise} A promise to resolve when complete (if callback isn't supplied) 167 | */ 168 | public onAliasQuery(alias: string, callback: () => void): PromiseLike|null { 169 | callback(); // stub impl 170 | return null; 171 | } 172 | 173 | /** 174 | * Override this method to handle user queries. 175 | * @param {string} userId The queried user ID. 176 | * @param {Function} callback The callback to invoke when complete. 177 | * @return {Promise} A promise to resolve when complete (if callback isn't supplied) 178 | */ 179 | public onUserQuery(userId: string, callback: () => void): PromiseLike|null { 180 | callback(); // stub impl 181 | return null; 182 | } 183 | 184 | /** 185 | * Set the token that should be used to verify incoming events. 186 | * @param {string} hsToken The home server token 187 | */ 188 | public setHomeserverToken(hsToken: string) { 189 | this.config.homeserverToken = hsToken; 190 | } 191 | 192 | /** 193 | * The Express App instance for the appservice, which 194 | * can be extended with paths. 195 | */ 196 | public get expressApp() { 197 | return this.app; 198 | } 199 | 200 | private onMorganLog(str: string) { 201 | // The dependency `morgan` expects to write to a stream and adds a new line at the end. 202 | // Listeners of the `http-log` event expect there not to be a new line, so the string 203 | // can be handed to a logger like `console.log()` without displaying empty lines. 204 | str = str.replace(/\n$/, ""); 205 | str = str.replace(/access_token=.*?(&|\s|$)/, "access_token=$1"); 206 | this.emit("http-log", str); 207 | } 208 | 209 | private isInvalidToken(req: Request, res: Response): boolean { 210 | const providedToken = req.headers.authorization?.substring("Bearer ".length) ?? req.query.access_token; 211 | if (providedToken !== this.config.homeserverToken) { 212 | res.status(403); 213 | res.send({ 214 | errcode: "M_FORBIDDEN", 215 | error: "Bad token supplied," 216 | }); 217 | return true; 218 | } 219 | return false; 220 | } 221 | 222 | private async onGetUsers(req: Request, res: Response) { 223 | if (this.isInvalidToken(req, res)) { 224 | return; 225 | } 226 | const possiblePromise = this.onUserQuery(req.params.userId, () => { 227 | res.send({}); 228 | }); 229 | if (!possiblePromise) { 230 | return; 231 | } 232 | try { 233 | await possiblePromise; 234 | res.send({}); 235 | } catch (e) { 236 | if (e instanceof AppserviceHttpError) { 237 | res.status(e.status); 238 | res.send({ 239 | errcode: e.errcode, 240 | message: e.message, 241 | }); 242 | } else { 243 | res.status(500); 244 | res.send({ 245 | errcode: "M_UNKNOWN", 246 | message: e instanceof Error ? e.message : "", 247 | }); 248 | } 249 | } 250 | } 251 | 252 | private async onGetRoomAlias(req: Request, res: Response) { 253 | if (this.isInvalidToken(req, res)) { 254 | return; 255 | } 256 | const possiblePromise = this.onAliasQuery(req.params.alias, function() { 257 | res.send({}); 258 | }); 259 | if (!possiblePromise) { 260 | return; 261 | } 262 | try { 263 | await possiblePromise; 264 | res.send({}); 265 | } catch (e) { 266 | res.send({ 267 | errcode: "M_UNKNOWN", 268 | error: e instanceof Error ? e.message : "" 269 | }); 270 | } 271 | } 272 | 273 | private onTransaction(req: Request, res: Response) { 274 | if (this.isInvalidToken(req, res)) { 275 | return; 276 | } 277 | 278 | const txnId = req.params.txnId; 279 | if (!txnId) { 280 | res.send("Missing transaction ID."); 281 | return; 282 | } 283 | if (!req.body) { 284 | res.send("Missing body."); 285 | return; 286 | } 287 | 288 | const events = req.body.events || []; 289 | const ephemeral = req.body["de.sorunome.msc2409.ephemeral"] || []; 290 | 291 | if (this.lastProcessedTxnId === txnId) { 292 | res.send({}); // duplicate 293 | return; 294 | } 295 | for (const event of events) { 296 | this.emit("event", event); 297 | if (event.type) { 298 | this.emit("type:" + event.type, event); 299 | } 300 | } 301 | for (const event of ephemeral) { 302 | this.emit("ephemeral", event); 303 | if (event.type) { 304 | this.emit("ephemeral_type:" + event.type, event); 305 | } 306 | } 307 | this.lastProcessedTxnId = txnId; 308 | res.send({}); 309 | } 310 | 311 | private onHealthCheck(req: Request, res: Response) { 312 | res.send('OK'); 313 | } 314 | } 315 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": 13 | version "4.7.0" 14 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" 15 | integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== 16 | dependencies: 17 | eslint-visitor-keys "^3.4.3" 18 | 19 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1": 20 | version "4.12.1" 21 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 22 | integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== 23 | 24 | "@eslint/eslintrc@^2.1.4": 25 | version "2.1.4" 26 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 27 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 28 | dependencies: 29 | ajv "^6.12.4" 30 | debug "^4.3.2" 31 | espree "^9.6.0" 32 | globals "^13.19.0" 33 | ignore "^5.2.0" 34 | import-fresh "^3.2.1" 35 | js-yaml "^4.1.0" 36 | minimatch "^3.1.2" 37 | strip-json-comments "^3.1.1" 38 | 39 | "@eslint/js@8.57.1": 40 | version "8.57.1" 41 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" 42 | integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== 43 | 44 | "@gerrit0/mini-shiki@^3.9.0": 45 | version "3.9.2" 46 | resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-3.9.2.tgz#de4cacde1d25e704720b717b387a54b11e6b4593" 47 | integrity sha512-Tvsj+AOO4Z8xLRJK900WkyfxHsZQu+Zm1//oT1w443PO6RiYMoq/4NGOhaNuZoUMYsjKIAPVQ6eOFMddj6yphQ== 48 | dependencies: 49 | "@shikijs/engine-oniguruma" "^3.9.2" 50 | "@shikijs/langs" "^3.9.2" 51 | "@shikijs/themes" "^3.9.2" 52 | "@shikijs/types" "^3.9.2" 53 | "@shikijs/vscode-textmate" "^10.0.2" 54 | 55 | "@humanwhocodes/config-array@^0.13.0": 56 | version "0.13.0" 57 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" 58 | integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== 59 | dependencies: 60 | "@humanwhocodes/object-schema" "^2.0.3" 61 | debug "^4.3.1" 62 | minimatch "^3.0.5" 63 | 64 | "@humanwhocodes/module-importer@^1.0.1": 65 | version "1.0.1" 66 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 67 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 68 | 69 | "@humanwhocodes/object-schema@^2.0.3": 70 | version "2.0.3" 71 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 72 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 73 | 74 | "@jridgewell/resolve-uri@^3.0.3": 75 | version "3.1.0" 76 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 77 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 78 | 79 | "@jridgewell/sourcemap-codec@^1.4.10": 80 | version "1.4.14" 81 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 82 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 83 | 84 | "@jridgewell/trace-mapping@0.3.9": 85 | version "0.3.9" 86 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 87 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 88 | dependencies: 89 | "@jridgewell/resolve-uri" "^3.0.3" 90 | "@jridgewell/sourcemap-codec" "^1.4.10" 91 | 92 | "@nodelib/fs.scandir@2.1.5": 93 | version "2.1.5" 94 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 95 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 96 | dependencies: 97 | "@nodelib/fs.stat" "2.0.5" 98 | run-parallel "^1.1.9" 99 | 100 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 101 | version "2.0.5" 102 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 103 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 104 | 105 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 106 | version "1.2.8" 107 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 108 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 109 | dependencies: 110 | "@nodelib/fs.scandir" "2.1.5" 111 | fastq "^1.6.0" 112 | 113 | "@shikijs/engine-oniguruma@^3.9.2": 114 | version "3.9.2" 115 | resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.9.2.tgz#f6e0e2d1b7211b98353de0753aaa6447ed57e5ab" 116 | integrity sha512-Vn/w5oyQ6TUgTVDIC/BrpXwIlfK6V6kGWDVVz2eRkF2v13YoENUvaNwxMsQU/t6oCuZKzqp9vqtEtEzKl9VegA== 117 | dependencies: 118 | "@shikijs/types" "3.9.2" 119 | "@shikijs/vscode-textmate" "^10.0.2" 120 | 121 | "@shikijs/langs@^3.9.2": 122 | version "3.9.2" 123 | resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.9.2.tgz#6de3b2e62c9b46e0e81a54396a98bc43aa7aedad" 124 | integrity sha512-X1Q6wRRQXY7HqAuX3I8WjMscjeGjqXCg/Sve7J2GWFORXkSrXud23UECqTBIdCSNKJioFtmUGJQNKtlMMZMn0w== 125 | dependencies: 126 | "@shikijs/types" "3.9.2" 127 | 128 | "@shikijs/themes@^3.9.2": 129 | version "3.9.2" 130 | resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.9.2.tgz#e6b603b21e40c8e40e9723f7ad1bcca18dedd838" 131 | integrity sha512-6z5lBPBMRfLyyEsgf6uJDHPa6NAGVzFJqH4EAZ+03+7sedYir2yJBRu2uPZOKmj43GyhVHWHvyduLDAwJQfDjA== 132 | dependencies: 133 | "@shikijs/types" "3.9.2" 134 | 135 | "@shikijs/types@3.9.2", "@shikijs/types@^3.9.2": 136 | version "3.9.2" 137 | resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.9.2.tgz#a29da422d0a4d853a56156abfafc3ad2b3bb6316" 138 | integrity sha512-/M5L0Uc2ljyn2jKvj4Yiah7ow/W+DJSglVafvWAJ/b8AZDeeRAdMu3c2riDzB7N42VD+jSnWxeP9AKtd4TfYVw== 139 | dependencies: 140 | "@shikijs/vscode-textmate" "^10.0.2" 141 | "@types/hast" "^3.0.4" 142 | 143 | "@shikijs/vscode-textmate@^10.0.2": 144 | version "10.0.2" 145 | resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" 146 | integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== 147 | 148 | "@tsconfig/node10@^1.0.7": 149 | version "1.0.9" 150 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 151 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 152 | 153 | "@tsconfig/node12@^1.0.7": 154 | version "1.0.11" 155 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 156 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 157 | 158 | "@tsconfig/node14@^1.0.0": 159 | version "1.0.3" 160 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 161 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 162 | 163 | "@tsconfig/node16@^1.0.2": 164 | version "1.0.3" 165 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" 166 | integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== 167 | 168 | "@tsconfig/node22@^22": 169 | version "22.0.2" 170 | resolved "https://registry.yarnpkg.com/@tsconfig/node22/-/node22-22.0.2.tgz#1e04e2c5cc946dac787d69bb502462a851ae51b6" 171 | integrity sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA== 172 | 173 | "@types/body-parser@*", "@types/body-parser@^1.19.2": 174 | version "1.19.2" 175 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" 176 | integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== 177 | dependencies: 178 | "@types/connect" "*" 179 | "@types/node" "*" 180 | 181 | "@types/chai@^4.2.22": 182 | version "4.3.1" 183 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" 184 | integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== 185 | 186 | "@types/connect@*": 187 | version "3.4.35" 188 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 189 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 190 | dependencies: 191 | "@types/node" "*" 192 | 193 | "@types/express-serve-static-core@^4.17.33": 194 | version "4.19.6" 195 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" 196 | integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== 197 | dependencies: 198 | "@types/node" "*" 199 | "@types/qs" "*" 200 | "@types/range-parser" "*" 201 | "@types/send" "*" 202 | 203 | "@types/express@^4.17.21": 204 | version "4.17.23" 205 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" 206 | integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== 207 | dependencies: 208 | "@types/body-parser" "*" 209 | "@types/express-serve-static-core" "^4.17.33" 210 | "@types/qs" "*" 211 | "@types/serve-static" "*" 212 | 213 | "@types/hast@^3.0.4": 214 | version "3.0.4" 215 | resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" 216 | integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== 217 | dependencies: 218 | "@types/unist" "*" 219 | 220 | "@types/js-yaml@^4.0.9": 221 | version "4.0.9" 222 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" 223 | integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== 224 | 225 | "@types/mime@*": 226 | version "3.0.1" 227 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" 228 | integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== 229 | 230 | "@types/mime@^1": 231 | version "1.3.5" 232 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" 233 | integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== 234 | 235 | "@types/mocha@^10.0.0": 236 | version "10.0.10" 237 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" 238 | integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== 239 | 240 | "@types/morgan@^1.9.3": 241 | version "1.9.3" 242 | resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.3.tgz#ae04180dff02c437312bc0cfb1e2960086b2f540" 243 | integrity sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q== 244 | dependencies: 245 | "@types/node" "*" 246 | 247 | "@types/node@*": 248 | version "16.11.9" 249 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.9.tgz#879be3ad7af29f4c1a5c433421bf99fab7047185" 250 | integrity sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A== 251 | 252 | "@types/node@^22": 253 | version "22.17.1" 254 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.17.1.tgz#484a755050497ebc3b37ff5adb7470f2e3ea5f5b" 255 | integrity sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA== 256 | dependencies: 257 | undici-types "~6.21.0" 258 | 259 | "@types/qs@*": 260 | version "6.9.7" 261 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 262 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 263 | 264 | "@types/range-parser@*": 265 | version "1.2.4" 266 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 267 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 268 | 269 | "@types/send@*": 270 | version "0.17.5" 271 | resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.5.tgz#d991d4f2b16f2b1ef497131f00a9114290791e74" 272 | integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== 273 | dependencies: 274 | "@types/mime" "^1" 275 | "@types/node" "*" 276 | 277 | "@types/serve-static@*": 278 | version "1.15.0" 279 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" 280 | integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== 281 | dependencies: 282 | "@types/mime" "*" 283 | "@types/node" "*" 284 | 285 | "@types/unist@*": 286 | version "3.0.3" 287 | resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" 288 | integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== 289 | 290 | "@typescript-eslint/eslint-plugin@^8.39.0": 291 | version "8.39.1" 292 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz#28dffcb5272d20afe250bfeec3173263db5528a0" 293 | integrity sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g== 294 | dependencies: 295 | "@eslint-community/regexpp" "^4.10.0" 296 | "@typescript-eslint/scope-manager" "8.39.1" 297 | "@typescript-eslint/type-utils" "8.39.1" 298 | "@typescript-eslint/utils" "8.39.1" 299 | "@typescript-eslint/visitor-keys" "8.39.1" 300 | graphemer "^1.4.0" 301 | ignore "^7.0.0" 302 | natural-compare "^1.4.0" 303 | ts-api-utils "^2.1.0" 304 | 305 | "@typescript-eslint/parser@^8.39.0": 306 | version "8.39.1" 307 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.39.1.tgz#7f8f9ecfc7e172d67e42c366fa198e42324e5d50" 308 | integrity sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg== 309 | dependencies: 310 | "@typescript-eslint/scope-manager" "8.39.1" 311 | "@typescript-eslint/types" "8.39.1" 312 | "@typescript-eslint/typescript-estree" "8.39.1" 313 | "@typescript-eslint/visitor-keys" "8.39.1" 314 | debug "^4.3.4" 315 | 316 | "@typescript-eslint/project-service@8.39.1": 317 | version "8.39.1" 318 | resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.39.1.tgz#63525878d488ebf27c485f295e83434a1398f52d" 319 | integrity sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw== 320 | dependencies: 321 | "@typescript-eslint/tsconfig-utils" "^8.39.1" 322 | "@typescript-eslint/types" "^8.39.1" 323 | debug "^4.3.4" 324 | 325 | "@typescript-eslint/scope-manager@8.39.1": 326 | version "8.39.1" 327 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz#1253fe3e1f2f33f08a3e438a05b5dd7faf9fbca6" 328 | integrity sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw== 329 | dependencies: 330 | "@typescript-eslint/types" "8.39.1" 331 | "@typescript-eslint/visitor-keys" "8.39.1" 332 | 333 | "@typescript-eslint/tsconfig-utils@8.39.1", "@typescript-eslint/tsconfig-utils@^8.39.1": 334 | version "8.39.1" 335 | resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz#17f13b4ad481e7bec7c249ee1854078645b34b12" 336 | integrity sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA== 337 | 338 | "@typescript-eslint/type-utils@8.39.1": 339 | version "8.39.1" 340 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz#642f9fb96173649e2928fea0375b1d74d31906c2" 341 | integrity sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA== 342 | dependencies: 343 | "@typescript-eslint/types" "8.39.1" 344 | "@typescript-eslint/typescript-estree" "8.39.1" 345 | "@typescript-eslint/utils" "8.39.1" 346 | debug "^4.3.4" 347 | ts-api-utils "^2.1.0" 348 | 349 | "@typescript-eslint/types@8.39.1", "@typescript-eslint/types@^8.39.1": 350 | version "8.39.1" 351 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.39.1.tgz#f0ab996c8ab2c3b046bbf86bb1990b03529869a1" 352 | integrity sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw== 353 | 354 | "@typescript-eslint/typescript-estree@8.39.1": 355 | version "8.39.1" 356 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz#8825d3ea7ea2144c577859ae489eec24ef7318a5" 357 | integrity sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw== 358 | dependencies: 359 | "@typescript-eslint/project-service" "8.39.1" 360 | "@typescript-eslint/tsconfig-utils" "8.39.1" 361 | "@typescript-eslint/types" "8.39.1" 362 | "@typescript-eslint/visitor-keys" "8.39.1" 363 | debug "^4.3.4" 364 | fast-glob "^3.3.2" 365 | is-glob "^4.0.3" 366 | minimatch "^9.0.4" 367 | semver "^7.6.0" 368 | ts-api-utils "^2.1.0" 369 | 370 | "@typescript-eslint/utils@8.39.1": 371 | version "8.39.1" 372 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.39.1.tgz#58a834f89f93b786ada2cd14d77fa63c3c8f408b" 373 | integrity sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg== 374 | dependencies: 375 | "@eslint-community/eslint-utils" "^4.7.0" 376 | "@typescript-eslint/scope-manager" "8.39.1" 377 | "@typescript-eslint/types" "8.39.1" 378 | "@typescript-eslint/typescript-estree" "8.39.1" 379 | 380 | "@typescript-eslint/visitor-keys@8.39.1": 381 | version "8.39.1" 382 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz#a467742a98f2fa3c03d7bed4979dc0db3850a77a" 383 | integrity sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A== 384 | dependencies: 385 | "@typescript-eslint/types" "8.39.1" 386 | eslint-visitor-keys "^4.2.1" 387 | 388 | "@ungap/structured-clone@^1.2.0": 389 | version "1.3.0" 390 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" 391 | integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== 392 | 393 | accepts@~1.3.8: 394 | version "1.3.8" 395 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 396 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 397 | dependencies: 398 | mime-types "~2.1.34" 399 | negotiator "0.6.3" 400 | 401 | acorn-jsx@^5.3.2: 402 | version "5.3.2" 403 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 404 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 405 | 406 | acorn-walk@^8.1.1: 407 | version "8.2.0" 408 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 409 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 410 | 411 | acorn@^8.4.1: 412 | version "8.7.1" 413 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" 414 | integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== 415 | 416 | acorn@^8.9.0: 417 | version "8.15.0" 418 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" 419 | integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== 420 | 421 | ajv@^6.12.4: 422 | version "6.12.6" 423 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 424 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 425 | dependencies: 426 | fast-deep-equal "^3.1.1" 427 | fast-json-stable-stringify "^2.0.0" 428 | json-schema-traverse "^0.4.1" 429 | uri-js "^4.2.2" 430 | 431 | ansi-colors@^4.1.3: 432 | version "4.1.3" 433 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 434 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 435 | 436 | ansi-regex@^5.0.1: 437 | version "5.0.1" 438 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 439 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 440 | 441 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 442 | version "4.3.0" 443 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 444 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 445 | dependencies: 446 | color-convert "^2.0.1" 447 | 448 | anymatch@~3.1.2: 449 | version "3.1.2" 450 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 451 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 452 | dependencies: 453 | normalize-path "^3.0.0" 454 | picomatch "^2.0.4" 455 | 456 | arg@^4.1.0: 457 | version "4.1.3" 458 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 459 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 460 | 461 | argparse@^2.0.1: 462 | version "2.0.1" 463 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 464 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 465 | 466 | array-flatten@1.1.1: 467 | version "1.1.1" 468 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 469 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 470 | 471 | assertion-error@^1.1.0: 472 | version "1.1.0" 473 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 474 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 475 | 476 | balanced-match@^1.0.0: 477 | version "1.0.2" 478 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 479 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 480 | 481 | basic-auth@~2.0.1: 482 | version "2.0.1" 483 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 484 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 485 | dependencies: 486 | safe-buffer "5.1.2" 487 | 488 | binary-extensions@^2.0.0: 489 | version "2.2.0" 490 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 491 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 492 | 493 | body-parser@1.20.3: 494 | version "1.20.3" 495 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" 496 | integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== 497 | dependencies: 498 | bytes "3.1.2" 499 | content-type "~1.0.5" 500 | debug "2.6.9" 501 | depd "2.0.0" 502 | destroy "1.2.0" 503 | http-errors "2.0.0" 504 | iconv-lite "0.4.24" 505 | on-finished "2.4.1" 506 | qs "6.13.0" 507 | raw-body "2.5.2" 508 | type-is "~1.6.18" 509 | unpipe "1.0.0" 510 | 511 | body-parser@^1.19.0: 512 | version "1.19.0" 513 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 514 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 515 | dependencies: 516 | bytes "3.1.0" 517 | content-type "~1.0.4" 518 | debug "2.6.9" 519 | depd "~1.1.2" 520 | http-errors "1.7.2" 521 | iconv-lite "0.4.24" 522 | on-finished "~2.3.0" 523 | qs "6.7.0" 524 | raw-body "2.4.0" 525 | type-is "~1.6.17" 526 | 527 | brace-expansion@^1.1.7: 528 | version "1.1.11" 529 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 530 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 531 | dependencies: 532 | balanced-match "^1.0.0" 533 | concat-map "0.0.1" 534 | 535 | brace-expansion@^2.0.1: 536 | version "2.0.1" 537 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 538 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 539 | dependencies: 540 | balanced-match "^1.0.0" 541 | 542 | braces@^3.0.3: 543 | version "3.0.3" 544 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 545 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 546 | dependencies: 547 | fill-range "^7.1.1" 548 | 549 | braces@~3.0.2: 550 | version "3.0.2" 551 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 552 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 553 | dependencies: 554 | fill-range "^7.0.1" 555 | 556 | browser-stdout@^1.3.1: 557 | version "1.3.1" 558 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 559 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 560 | 561 | bytes@3.1.0: 562 | version "3.1.0" 563 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 564 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 565 | 566 | bytes@3.1.2: 567 | version "3.1.2" 568 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 569 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 570 | 571 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 572 | version "1.0.2" 573 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 574 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 575 | dependencies: 576 | es-errors "^1.3.0" 577 | function-bind "^1.1.2" 578 | 579 | call-bound@^1.0.2: 580 | version "1.0.4" 581 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 582 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 583 | dependencies: 584 | call-bind-apply-helpers "^1.0.2" 585 | get-intrinsic "^1.3.0" 586 | 587 | callsites@^3.0.0: 588 | version "3.1.0" 589 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 590 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 591 | 592 | camelcase@^6.0.0: 593 | version "6.2.1" 594 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" 595 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== 596 | 597 | chai@^4.3.4: 598 | version "4.3.6" 599 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" 600 | integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== 601 | dependencies: 602 | assertion-error "^1.1.0" 603 | check-error "^1.0.2" 604 | deep-eql "^3.0.1" 605 | get-func-name "^2.0.0" 606 | loupe "^2.3.1" 607 | pathval "^1.1.1" 608 | type-detect "^4.0.5" 609 | 610 | chalk@^4.0.0, chalk@^4.1.0: 611 | version "4.1.2" 612 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 613 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 614 | dependencies: 615 | ansi-styles "^4.1.0" 616 | supports-color "^7.1.0" 617 | 618 | check-error@^1.0.2: 619 | version "1.0.2" 620 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 621 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 622 | 623 | chokidar@^3.5.3: 624 | version "3.6.0" 625 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 626 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 627 | dependencies: 628 | anymatch "~3.1.2" 629 | braces "~3.0.2" 630 | glob-parent "~5.1.2" 631 | is-binary-path "~2.1.0" 632 | is-glob "~4.0.1" 633 | normalize-path "~3.0.0" 634 | readdirp "~3.6.0" 635 | optionalDependencies: 636 | fsevents "~2.3.2" 637 | 638 | cliui@^7.0.2: 639 | version "7.0.4" 640 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 641 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 642 | dependencies: 643 | string-width "^4.2.0" 644 | strip-ansi "^6.0.0" 645 | wrap-ansi "^7.0.0" 646 | 647 | color-convert@^2.0.1: 648 | version "2.0.1" 649 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 650 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 651 | dependencies: 652 | color-name "~1.1.4" 653 | 654 | color-name@~1.1.4: 655 | version "1.1.4" 656 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 657 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 658 | 659 | concat-map@0.0.1: 660 | version "0.0.1" 661 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 662 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 663 | 664 | content-disposition@0.5.4: 665 | version "0.5.4" 666 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 667 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 668 | dependencies: 669 | safe-buffer "5.2.1" 670 | 671 | content-type@~1.0.4: 672 | version "1.0.4" 673 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 674 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 675 | 676 | content-type@~1.0.5: 677 | version "1.0.5" 678 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 679 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 680 | 681 | cookie-signature@1.0.6: 682 | version "1.0.6" 683 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 684 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 685 | 686 | cookie@0.7.1: 687 | version "0.7.1" 688 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" 689 | integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== 690 | 691 | create-require@^1.1.0: 692 | version "1.1.1" 693 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 694 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 695 | 696 | cross-spawn@^7.0.2: 697 | version "7.0.3" 698 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 699 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 700 | dependencies: 701 | path-key "^3.1.0" 702 | shebang-command "^2.0.0" 703 | which "^2.0.1" 704 | 705 | debug@2.6.9: 706 | version "2.6.9" 707 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 708 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 709 | dependencies: 710 | ms "2.0.0" 711 | 712 | debug@^4.3.1, debug@^4.3.5: 713 | version "4.4.1" 714 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" 715 | integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== 716 | dependencies: 717 | ms "^2.1.3" 718 | 719 | debug@^4.3.2, debug@^4.3.4: 720 | version "4.3.4" 721 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 722 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 723 | dependencies: 724 | ms "2.1.2" 725 | 726 | decamelize@^4.0.0: 727 | version "4.0.0" 728 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 729 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 730 | 731 | deep-eql@^3.0.1: 732 | version "3.0.1" 733 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 734 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 735 | dependencies: 736 | type-detect "^4.0.0" 737 | 738 | deep-is@^0.1.3: 739 | version "0.1.4" 740 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 741 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 742 | 743 | depd@2.0.0, depd@~2.0.0: 744 | version "2.0.0" 745 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 746 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 747 | 748 | depd@~1.1.2: 749 | version "1.1.2" 750 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 751 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 752 | 753 | destroy@1.2.0: 754 | version "1.2.0" 755 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 756 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 757 | 758 | diff@^4.0.1: 759 | version "4.0.2" 760 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 761 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 762 | 763 | diff@^5.2.0: 764 | version "5.2.0" 765 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" 766 | integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== 767 | 768 | doctrine@^3.0.0: 769 | version "3.0.0" 770 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 771 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 772 | dependencies: 773 | esutils "^2.0.2" 774 | 775 | dunder-proto@^1.0.1: 776 | version "1.0.1" 777 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 778 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 779 | dependencies: 780 | call-bind-apply-helpers "^1.0.1" 781 | es-errors "^1.3.0" 782 | gopd "^1.2.0" 783 | 784 | ee-first@1.1.1: 785 | version "1.1.1" 786 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 787 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 788 | 789 | emoji-regex@^8.0.0: 790 | version "8.0.0" 791 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 792 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 793 | 794 | encodeurl@~1.0.2: 795 | version "1.0.2" 796 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 797 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 798 | 799 | encodeurl@~2.0.0: 800 | version "2.0.0" 801 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" 802 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 803 | 804 | entities@^4.4.0: 805 | version "4.5.0" 806 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 807 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 808 | 809 | es-define-property@^1.0.1: 810 | version "1.0.1" 811 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 812 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 813 | 814 | es-errors@^1.3.0: 815 | version "1.3.0" 816 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 817 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 818 | 819 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 820 | version "1.1.1" 821 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 822 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 823 | dependencies: 824 | es-errors "^1.3.0" 825 | 826 | escalade@^3.1.1: 827 | version "3.1.1" 828 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 829 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 830 | 831 | escape-html@~1.0.3: 832 | version "1.0.3" 833 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 834 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 835 | 836 | escape-string-regexp@^4.0.0: 837 | version "4.0.0" 838 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 839 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 840 | 841 | eslint-scope@^7.2.2: 842 | version "7.2.2" 843 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 844 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 845 | dependencies: 846 | esrecurse "^4.3.0" 847 | estraverse "^5.2.0" 848 | 849 | eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 850 | version "3.4.3" 851 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 852 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 853 | 854 | eslint-visitor-keys@^4.2.1: 855 | version "4.2.1" 856 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" 857 | integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== 858 | 859 | eslint@^8.57.0: 860 | version "8.57.1" 861 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" 862 | integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== 863 | dependencies: 864 | "@eslint-community/eslint-utils" "^4.2.0" 865 | "@eslint-community/regexpp" "^4.6.1" 866 | "@eslint/eslintrc" "^2.1.4" 867 | "@eslint/js" "8.57.1" 868 | "@humanwhocodes/config-array" "^0.13.0" 869 | "@humanwhocodes/module-importer" "^1.0.1" 870 | "@nodelib/fs.walk" "^1.2.8" 871 | "@ungap/structured-clone" "^1.2.0" 872 | ajv "^6.12.4" 873 | chalk "^4.0.0" 874 | cross-spawn "^7.0.2" 875 | debug "^4.3.2" 876 | doctrine "^3.0.0" 877 | escape-string-regexp "^4.0.0" 878 | eslint-scope "^7.2.2" 879 | eslint-visitor-keys "^3.4.3" 880 | espree "^9.6.1" 881 | esquery "^1.4.2" 882 | esutils "^2.0.2" 883 | fast-deep-equal "^3.1.3" 884 | file-entry-cache "^6.0.1" 885 | find-up "^5.0.0" 886 | glob-parent "^6.0.2" 887 | globals "^13.19.0" 888 | graphemer "^1.4.0" 889 | ignore "^5.2.0" 890 | imurmurhash "^0.1.4" 891 | is-glob "^4.0.0" 892 | is-path-inside "^3.0.3" 893 | js-yaml "^4.1.0" 894 | json-stable-stringify-without-jsonify "^1.0.1" 895 | levn "^0.4.1" 896 | lodash.merge "^4.6.2" 897 | minimatch "^3.1.2" 898 | natural-compare "^1.4.0" 899 | optionator "^0.9.3" 900 | strip-ansi "^6.0.1" 901 | text-table "^0.2.0" 902 | 903 | espree@^9.6.0, espree@^9.6.1: 904 | version "9.6.1" 905 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 906 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 907 | dependencies: 908 | acorn "^8.9.0" 909 | acorn-jsx "^5.3.2" 910 | eslint-visitor-keys "^3.4.1" 911 | 912 | esquery@^1.4.2: 913 | version "1.6.0" 914 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 915 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 916 | dependencies: 917 | estraverse "^5.1.0" 918 | 919 | esrecurse@^4.3.0: 920 | version "4.3.0" 921 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 922 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 923 | dependencies: 924 | estraverse "^5.2.0" 925 | 926 | estraverse@^5.1.0, estraverse@^5.2.0: 927 | version "5.3.0" 928 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 929 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 930 | 931 | esutils@^2.0.2: 932 | version "2.0.3" 933 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 934 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 935 | 936 | etag@~1.8.1: 937 | version "1.8.1" 938 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 939 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 940 | 941 | express@^4.18.2: 942 | version "4.21.2" 943 | resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" 944 | integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== 945 | dependencies: 946 | accepts "~1.3.8" 947 | array-flatten "1.1.1" 948 | body-parser "1.20.3" 949 | content-disposition "0.5.4" 950 | content-type "~1.0.4" 951 | cookie "0.7.1" 952 | cookie-signature "1.0.6" 953 | debug "2.6.9" 954 | depd "2.0.0" 955 | encodeurl "~2.0.0" 956 | escape-html "~1.0.3" 957 | etag "~1.8.1" 958 | finalhandler "1.3.1" 959 | fresh "0.5.2" 960 | http-errors "2.0.0" 961 | merge-descriptors "1.0.3" 962 | methods "~1.1.2" 963 | on-finished "2.4.1" 964 | parseurl "~1.3.3" 965 | path-to-regexp "0.1.12" 966 | proxy-addr "~2.0.7" 967 | qs "6.13.0" 968 | range-parser "~1.2.1" 969 | safe-buffer "5.2.1" 970 | send "0.19.0" 971 | serve-static "1.16.2" 972 | setprototypeof "1.2.0" 973 | statuses "2.0.1" 974 | type-is "~1.6.18" 975 | utils-merge "1.0.1" 976 | vary "~1.1.2" 977 | 978 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 979 | version "3.1.3" 980 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 981 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 982 | 983 | fast-glob@^3.3.2: 984 | version "3.3.3" 985 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" 986 | integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 987 | dependencies: 988 | "@nodelib/fs.stat" "^2.0.2" 989 | "@nodelib/fs.walk" "^1.2.3" 990 | glob-parent "^5.1.2" 991 | merge2 "^1.3.0" 992 | micromatch "^4.0.8" 993 | 994 | fast-json-stable-stringify@^2.0.0: 995 | version "2.1.0" 996 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 997 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 998 | 999 | fast-levenshtein@^2.0.6: 1000 | version "2.0.6" 1001 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1002 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 1003 | 1004 | fastq@^1.6.0: 1005 | version "1.13.0" 1006 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" 1007 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 1008 | dependencies: 1009 | reusify "^1.0.4" 1010 | 1011 | file-entry-cache@^6.0.1: 1012 | version "6.0.1" 1013 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 1014 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1015 | dependencies: 1016 | flat-cache "^3.0.4" 1017 | 1018 | fill-range@^7.0.1: 1019 | version "7.0.1" 1020 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 1021 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 1022 | dependencies: 1023 | to-regex-range "^5.0.1" 1024 | 1025 | fill-range@^7.1.1: 1026 | version "7.1.1" 1027 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 1028 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1029 | dependencies: 1030 | to-regex-range "^5.0.1" 1031 | 1032 | finalhandler@1.3.1: 1033 | version "1.3.1" 1034 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" 1035 | integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== 1036 | dependencies: 1037 | debug "2.6.9" 1038 | encodeurl "~2.0.0" 1039 | escape-html "~1.0.3" 1040 | on-finished "2.4.1" 1041 | parseurl "~1.3.3" 1042 | statuses "2.0.1" 1043 | unpipe "~1.0.0" 1044 | 1045 | find-up@^5.0.0: 1046 | version "5.0.0" 1047 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1048 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1049 | dependencies: 1050 | locate-path "^6.0.0" 1051 | path-exists "^4.0.0" 1052 | 1053 | flat-cache@^3.0.4: 1054 | version "3.0.4" 1055 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 1056 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 1057 | dependencies: 1058 | flatted "^3.1.0" 1059 | rimraf "^3.0.2" 1060 | 1061 | flat@^5.0.2: 1062 | version "5.0.2" 1063 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 1064 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 1065 | 1066 | flatted@^3.1.0: 1067 | version "3.2.4" 1068 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" 1069 | integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== 1070 | 1071 | forwarded@0.2.0: 1072 | version "0.2.0" 1073 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 1074 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 1075 | 1076 | fresh@0.5.2: 1077 | version "0.5.2" 1078 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1079 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 1080 | 1081 | fs.realpath@^1.0.0: 1082 | version "1.0.0" 1083 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1084 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1085 | 1086 | fsevents@~2.3.2: 1087 | version "2.3.2" 1088 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 1089 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 1090 | 1091 | function-bind@^1.1.2: 1092 | version "1.1.2" 1093 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1094 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1095 | 1096 | get-caller-file@^2.0.5: 1097 | version "2.0.5" 1098 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1099 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1100 | 1101 | get-func-name@^2.0.0: 1102 | version "2.0.0" 1103 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 1104 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 1105 | 1106 | get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: 1107 | version "1.3.0" 1108 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 1109 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 1110 | dependencies: 1111 | call-bind-apply-helpers "^1.0.2" 1112 | es-define-property "^1.0.1" 1113 | es-errors "^1.3.0" 1114 | es-object-atoms "^1.1.1" 1115 | function-bind "^1.1.2" 1116 | get-proto "^1.0.1" 1117 | gopd "^1.2.0" 1118 | has-symbols "^1.1.0" 1119 | hasown "^2.0.2" 1120 | math-intrinsics "^1.1.0" 1121 | 1122 | get-proto@^1.0.1: 1123 | version "1.0.1" 1124 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 1125 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 1126 | dependencies: 1127 | dunder-proto "^1.0.1" 1128 | es-object-atoms "^1.0.0" 1129 | 1130 | glob-parent@^5.1.2, glob-parent@~5.1.2: 1131 | version "5.1.2" 1132 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1133 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1134 | dependencies: 1135 | is-glob "^4.0.1" 1136 | 1137 | glob-parent@^6.0.2: 1138 | version "6.0.2" 1139 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1140 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1141 | dependencies: 1142 | is-glob "^4.0.3" 1143 | 1144 | glob@^7.1.3: 1145 | version "7.2.0" 1146 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 1147 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 1148 | dependencies: 1149 | fs.realpath "^1.0.0" 1150 | inflight "^1.0.4" 1151 | inherits "2" 1152 | minimatch "^3.0.4" 1153 | once "^1.3.0" 1154 | path-is-absolute "^1.0.0" 1155 | 1156 | glob@^8.1.0: 1157 | version "8.1.0" 1158 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 1159 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 1160 | dependencies: 1161 | fs.realpath "^1.0.0" 1162 | inflight "^1.0.4" 1163 | inherits "2" 1164 | minimatch "^5.0.1" 1165 | once "^1.3.0" 1166 | 1167 | globals@^13.19.0: 1168 | version "13.24.0" 1169 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 1170 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 1171 | dependencies: 1172 | type-fest "^0.20.2" 1173 | 1174 | gopd@^1.2.0: 1175 | version "1.2.0" 1176 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 1177 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 1178 | 1179 | graphemer@^1.4.0: 1180 | version "1.4.0" 1181 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1182 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1183 | 1184 | has-flag@^4.0.0: 1185 | version "4.0.0" 1186 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1187 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1188 | 1189 | has-symbols@^1.1.0: 1190 | version "1.1.0" 1191 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 1192 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 1193 | 1194 | hasown@^2.0.2: 1195 | version "2.0.2" 1196 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1197 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1198 | dependencies: 1199 | function-bind "^1.1.2" 1200 | 1201 | he@^1.2.0: 1202 | version "1.2.0" 1203 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1204 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1205 | 1206 | http-errors@1.7.2: 1207 | version "1.7.2" 1208 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 1209 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 1210 | dependencies: 1211 | depd "~1.1.2" 1212 | inherits "2.0.3" 1213 | setprototypeof "1.1.1" 1214 | statuses ">= 1.5.0 < 2" 1215 | toidentifier "1.0.0" 1216 | 1217 | http-errors@2.0.0: 1218 | version "2.0.0" 1219 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1220 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1221 | dependencies: 1222 | depd "2.0.0" 1223 | inherits "2.0.4" 1224 | setprototypeof "1.2.0" 1225 | statuses "2.0.1" 1226 | toidentifier "1.0.1" 1227 | 1228 | iconv-lite@0.4.24: 1229 | version "0.4.24" 1230 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1231 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1232 | dependencies: 1233 | safer-buffer ">= 2.1.2 < 3" 1234 | 1235 | ignore@^5.2.0: 1236 | version "5.2.0" 1237 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 1238 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1239 | 1240 | ignore@^7.0.0: 1241 | version "7.0.5" 1242 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" 1243 | integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== 1244 | 1245 | import-fresh@^3.2.1: 1246 | version "3.3.0" 1247 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1248 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1249 | dependencies: 1250 | parent-module "^1.0.0" 1251 | resolve-from "^4.0.0" 1252 | 1253 | imurmurhash@^0.1.4: 1254 | version "0.1.4" 1255 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1256 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1257 | 1258 | inflight@^1.0.4: 1259 | version "1.0.6" 1260 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1261 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1262 | dependencies: 1263 | once "^1.3.0" 1264 | wrappy "1" 1265 | 1266 | inherits@2, inherits@2.0.4: 1267 | version "2.0.4" 1268 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1269 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1270 | 1271 | inherits@2.0.3: 1272 | version "2.0.3" 1273 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1274 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1275 | 1276 | ipaddr.js@1.9.1: 1277 | version "1.9.1" 1278 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1279 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1280 | 1281 | is-binary-path@~2.1.0: 1282 | version "2.1.0" 1283 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1284 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1285 | dependencies: 1286 | binary-extensions "^2.0.0" 1287 | 1288 | is-extglob@^2.1.1: 1289 | version "2.1.1" 1290 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1291 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1292 | 1293 | is-fullwidth-code-point@^3.0.0: 1294 | version "3.0.0" 1295 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1296 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1297 | 1298 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 1299 | version "4.0.3" 1300 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1301 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1302 | dependencies: 1303 | is-extglob "^2.1.1" 1304 | 1305 | is-number@^7.0.0: 1306 | version "7.0.0" 1307 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1308 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1309 | 1310 | is-path-inside@^3.0.3: 1311 | version "3.0.3" 1312 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1313 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1314 | 1315 | is-plain-obj@^2.1.0: 1316 | version "2.1.0" 1317 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1318 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1319 | 1320 | is-unicode-supported@^0.1.0: 1321 | version "0.1.0" 1322 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1323 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1324 | 1325 | isexe@^2.0.0: 1326 | version "2.0.0" 1327 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1328 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1329 | 1330 | js-yaml@^4.1.0: 1331 | version "4.1.0" 1332 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1333 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1334 | dependencies: 1335 | argparse "^2.0.1" 1336 | 1337 | json-schema-traverse@^0.4.1: 1338 | version "0.4.1" 1339 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1340 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1341 | 1342 | json-stable-stringify-without-jsonify@^1.0.1: 1343 | version "1.0.1" 1344 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1345 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1346 | 1347 | levn@^0.4.1: 1348 | version "0.4.1" 1349 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1350 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1351 | dependencies: 1352 | prelude-ls "^1.2.1" 1353 | type-check "~0.4.0" 1354 | 1355 | linkify-it@^5.0.0: 1356 | version "5.0.0" 1357 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" 1358 | integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== 1359 | dependencies: 1360 | uc.micro "^2.0.0" 1361 | 1362 | locate-path@^6.0.0: 1363 | version "6.0.0" 1364 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1365 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1366 | dependencies: 1367 | p-locate "^5.0.0" 1368 | 1369 | lodash.merge@^4.6.2: 1370 | version "4.6.2" 1371 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1372 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1373 | 1374 | log-symbols@^4.1.0: 1375 | version "4.1.0" 1376 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 1377 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 1378 | dependencies: 1379 | chalk "^4.1.0" 1380 | is-unicode-supported "^0.1.0" 1381 | 1382 | loupe@^2.3.1: 1383 | version "2.3.4" 1384 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" 1385 | integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== 1386 | dependencies: 1387 | get-func-name "^2.0.0" 1388 | 1389 | lunr@^2.3.9: 1390 | version "2.3.9" 1391 | resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" 1392 | integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== 1393 | 1394 | make-error@^1.1.1: 1395 | version "1.3.6" 1396 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1397 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1398 | 1399 | markdown-it@^14.1.0: 1400 | version "14.1.0" 1401 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" 1402 | integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== 1403 | dependencies: 1404 | argparse "^2.0.1" 1405 | entities "^4.4.0" 1406 | linkify-it "^5.0.0" 1407 | mdurl "^2.0.0" 1408 | punycode.js "^2.3.1" 1409 | uc.micro "^2.1.0" 1410 | 1411 | math-intrinsics@^1.1.0: 1412 | version "1.1.0" 1413 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 1414 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 1415 | 1416 | mdurl@^2.0.0: 1417 | version "2.0.0" 1418 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" 1419 | integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== 1420 | 1421 | media-typer@0.3.0: 1422 | version "0.3.0" 1423 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1424 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1425 | 1426 | merge-descriptors@1.0.3: 1427 | version "1.0.3" 1428 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" 1429 | integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== 1430 | 1431 | merge2@^1.3.0: 1432 | version "1.4.1" 1433 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1434 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1435 | 1436 | methods@~1.1.2: 1437 | version "1.1.2" 1438 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1439 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1440 | 1441 | micromatch@^4.0.8: 1442 | version "4.0.8" 1443 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1444 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1445 | dependencies: 1446 | braces "^3.0.3" 1447 | picomatch "^2.3.1" 1448 | 1449 | mime-db@1.51.0: 1450 | version "1.51.0" 1451 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 1452 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 1453 | 1454 | mime-db@1.52.0: 1455 | version "1.52.0" 1456 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1457 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1458 | 1459 | mime-types@~2.1.24: 1460 | version "2.1.34" 1461 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 1462 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 1463 | dependencies: 1464 | mime-db "1.51.0" 1465 | 1466 | mime-types@~2.1.34: 1467 | version "2.1.35" 1468 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1469 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1470 | dependencies: 1471 | mime-db "1.52.0" 1472 | 1473 | mime@1.6.0: 1474 | version "1.6.0" 1475 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1476 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1477 | 1478 | minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: 1479 | version "3.1.2" 1480 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1481 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1482 | dependencies: 1483 | brace-expansion "^1.1.7" 1484 | 1485 | minimatch@^5.0.1, minimatch@^5.1.6: 1486 | version "5.1.6" 1487 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 1488 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 1489 | dependencies: 1490 | brace-expansion "^2.0.1" 1491 | 1492 | minimatch@^9.0.4, minimatch@^9.0.5: 1493 | version "9.0.5" 1494 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" 1495 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 1496 | dependencies: 1497 | brace-expansion "^2.0.1" 1498 | 1499 | mocha@^10.0.0: 1500 | version "10.8.2" 1501 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" 1502 | integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== 1503 | dependencies: 1504 | ansi-colors "^4.1.3" 1505 | browser-stdout "^1.3.1" 1506 | chokidar "^3.5.3" 1507 | debug "^4.3.5" 1508 | diff "^5.2.0" 1509 | escape-string-regexp "^4.0.0" 1510 | find-up "^5.0.0" 1511 | glob "^8.1.0" 1512 | he "^1.2.0" 1513 | js-yaml "^4.1.0" 1514 | log-symbols "^4.1.0" 1515 | minimatch "^5.1.6" 1516 | ms "^2.1.3" 1517 | serialize-javascript "^6.0.2" 1518 | strip-json-comments "^3.1.1" 1519 | supports-color "^8.1.1" 1520 | workerpool "^6.5.1" 1521 | yargs "^16.2.0" 1522 | yargs-parser "^20.2.9" 1523 | yargs-unparser "^2.0.0" 1524 | 1525 | morgan@^1.10.0: 1526 | version "1.10.0" 1527 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 1528 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 1529 | dependencies: 1530 | basic-auth "~2.0.1" 1531 | debug "2.6.9" 1532 | depd "~2.0.0" 1533 | on-finished "~2.3.0" 1534 | on-headers "~1.0.2" 1535 | 1536 | ms@2.0.0: 1537 | version "2.0.0" 1538 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1539 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1540 | 1541 | ms@2.1.2: 1542 | version "2.1.2" 1543 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1544 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1545 | 1546 | ms@2.1.3, ms@^2.1.3: 1547 | version "2.1.3" 1548 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1549 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1550 | 1551 | natural-compare@^1.4.0: 1552 | version "1.4.0" 1553 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1554 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1555 | 1556 | negotiator@0.6.3: 1557 | version "0.6.3" 1558 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1559 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1560 | 1561 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1562 | version "3.0.0" 1563 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1564 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1565 | 1566 | object-inspect@^1.13.3: 1567 | version "1.13.4" 1568 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 1569 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 1570 | 1571 | on-finished@2.4.1: 1572 | version "2.4.1" 1573 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1574 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1575 | dependencies: 1576 | ee-first "1.1.1" 1577 | 1578 | on-finished@~2.3.0: 1579 | version "2.3.0" 1580 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1581 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1582 | dependencies: 1583 | ee-first "1.1.1" 1584 | 1585 | on-headers@~1.0.2: 1586 | version "1.0.2" 1587 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1588 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 1589 | 1590 | once@^1.3.0: 1591 | version "1.4.0" 1592 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1593 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1594 | dependencies: 1595 | wrappy "1" 1596 | 1597 | optionator@^0.9.3: 1598 | version "0.9.4" 1599 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1600 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1601 | dependencies: 1602 | deep-is "^0.1.3" 1603 | fast-levenshtein "^2.0.6" 1604 | levn "^0.4.1" 1605 | prelude-ls "^1.2.1" 1606 | type-check "^0.4.0" 1607 | word-wrap "^1.2.5" 1608 | 1609 | p-limit@^3.0.2: 1610 | version "3.1.0" 1611 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1612 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1613 | dependencies: 1614 | yocto-queue "^0.1.0" 1615 | 1616 | p-locate@^5.0.0: 1617 | version "5.0.0" 1618 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1619 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1620 | dependencies: 1621 | p-limit "^3.0.2" 1622 | 1623 | parent-module@^1.0.0: 1624 | version "1.0.1" 1625 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1626 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1627 | dependencies: 1628 | callsites "^3.0.0" 1629 | 1630 | parseurl@~1.3.3: 1631 | version "1.3.3" 1632 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1633 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1634 | 1635 | path-exists@^4.0.0: 1636 | version "4.0.0" 1637 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1638 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1639 | 1640 | path-is-absolute@^1.0.0: 1641 | version "1.0.1" 1642 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1643 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1644 | 1645 | path-key@^3.1.0: 1646 | version "3.1.1" 1647 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1648 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1649 | 1650 | path-to-regexp@0.1.12: 1651 | version "0.1.12" 1652 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" 1653 | integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== 1654 | 1655 | pathval@^1.1.1: 1656 | version "1.1.1" 1657 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1658 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1659 | 1660 | picomatch@^2.0.4, picomatch@^2.2.1: 1661 | version "2.3.0" 1662 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1663 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1664 | 1665 | picomatch@^2.3.1: 1666 | version "2.3.1" 1667 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1668 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1669 | 1670 | prelude-ls@^1.2.1: 1671 | version "1.2.1" 1672 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1673 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1674 | 1675 | proxy-addr@~2.0.7: 1676 | version "2.0.7" 1677 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1678 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1679 | dependencies: 1680 | forwarded "0.2.0" 1681 | ipaddr.js "1.9.1" 1682 | 1683 | punycode.js@^2.3.1: 1684 | version "2.3.1" 1685 | resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" 1686 | integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== 1687 | 1688 | punycode@^2.1.0: 1689 | version "2.1.1" 1690 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1691 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1692 | 1693 | qs@6.13.0: 1694 | version "6.13.0" 1695 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" 1696 | integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== 1697 | dependencies: 1698 | side-channel "^1.0.6" 1699 | 1700 | qs@6.7.0: 1701 | version "6.7.0" 1702 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1703 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1704 | 1705 | queue-microtask@^1.2.2: 1706 | version "1.2.3" 1707 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1708 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1709 | 1710 | randombytes@^2.1.0: 1711 | version "2.1.0" 1712 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1713 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1714 | dependencies: 1715 | safe-buffer "^5.1.0" 1716 | 1717 | range-parser@~1.2.1: 1718 | version "1.2.1" 1719 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1720 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1721 | 1722 | raw-body@2.4.0: 1723 | version "2.4.0" 1724 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1725 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1726 | dependencies: 1727 | bytes "3.1.0" 1728 | http-errors "1.7.2" 1729 | iconv-lite "0.4.24" 1730 | unpipe "1.0.0" 1731 | 1732 | raw-body@2.5.2: 1733 | version "2.5.2" 1734 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" 1735 | integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== 1736 | dependencies: 1737 | bytes "3.1.2" 1738 | http-errors "2.0.0" 1739 | iconv-lite "0.4.24" 1740 | unpipe "1.0.0" 1741 | 1742 | readdirp@~3.6.0: 1743 | version "3.6.0" 1744 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1745 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1746 | dependencies: 1747 | picomatch "^2.2.1" 1748 | 1749 | require-directory@^2.1.1: 1750 | version "2.1.1" 1751 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1752 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1753 | 1754 | resolve-from@^4.0.0: 1755 | version "4.0.0" 1756 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1757 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1758 | 1759 | reusify@^1.0.4: 1760 | version "1.0.4" 1761 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1762 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1763 | 1764 | rimraf@^3.0.2: 1765 | version "3.0.2" 1766 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1767 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1768 | dependencies: 1769 | glob "^7.1.3" 1770 | 1771 | run-parallel@^1.1.9: 1772 | version "1.2.0" 1773 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1774 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1775 | dependencies: 1776 | queue-microtask "^1.2.2" 1777 | 1778 | safe-buffer@5.1.2: 1779 | version "5.1.2" 1780 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1781 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1782 | 1783 | safe-buffer@5.2.1, safe-buffer@^5.1.0: 1784 | version "5.2.1" 1785 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1786 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1787 | 1788 | "safer-buffer@>= 2.1.2 < 3": 1789 | version "2.1.2" 1790 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1791 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1792 | 1793 | semver@^7.6.0: 1794 | version "7.7.2" 1795 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" 1796 | integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== 1797 | 1798 | send@0.19.0: 1799 | version "0.19.0" 1800 | resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" 1801 | integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== 1802 | dependencies: 1803 | debug "2.6.9" 1804 | depd "2.0.0" 1805 | destroy "1.2.0" 1806 | encodeurl "~1.0.2" 1807 | escape-html "~1.0.3" 1808 | etag "~1.8.1" 1809 | fresh "0.5.2" 1810 | http-errors "2.0.0" 1811 | mime "1.6.0" 1812 | ms "2.1.3" 1813 | on-finished "2.4.1" 1814 | range-parser "~1.2.1" 1815 | statuses "2.0.1" 1816 | 1817 | serialize-javascript@^6.0.2: 1818 | version "6.0.2" 1819 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" 1820 | integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== 1821 | dependencies: 1822 | randombytes "^2.1.0" 1823 | 1824 | serve-static@1.16.2: 1825 | version "1.16.2" 1826 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" 1827 | integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== 1828 | dependencies: 1829 | encodeurl "~2.0.0" 1830 | escape-html "~1.0.3" 1831 | parseurl "~1.3.3" 1832 | send "0.19.0" 1833 | 1834 | setprototypeof@1.1.1: 1835 | version "1.1.1" 1836 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1837 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1838 | 1839 | setprototypeof@1.2.0: 1840 | version "1.2.0" 1841 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1842 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1843 | 1844 | shebang-command@^2.0.0: 1845 | version "2.0.0" 1846 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1847 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1848 | dependencies: 1849 | shebang-regex "^3.0.0" 1850 | 1851 | shebang-regex@^3.0.0: 1852 | version "3.0.0" 1853 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1854 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1855 | 1856 | side-channel-list@^1.0.0: 1857 | version "1.0.0" 1858 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 1859 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 1860 | dependencies: 1861 | es-errors "^1.3.0" 1862 | object-inspect "^1.13.3" 1863 | 1864 | side-channel-map@^1.0.1: 1865 | version "1.0.1" 1866 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 1867 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 1868 | dependencies: 1869 | call-bound "^1.0.2" 1870 | es-errors "^1.3.0" 1871 | get-intrinsic "^1.2.5" 1872 | object-inspect "^1.13.3" 1873 | 1874 | side-channel-weakmap@^1.0.2: 1875 | version "1.0.2" 1876 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 1877 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 1878 | dependencies: 1879 | call-bound "^1.0.2" 1880 | es-errors "^1.3.0" 1881 | get-intrinsic "^1.2.5" 1882 | object-inspect "^1.13.3" 1883 | side-channel-map "^1.0.1" 1884 | 1885 | side-channel@^1.0.6: 1886 | version "1.1.0" 1887 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 1888 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 1889 | dependencies: 1890 | es-errors "^1.3.0" 1891 | object-inspect "^1.13.3" 1892 | side-channel-list "^1.0.0" 1893 | side-channel-map "^1.0.1" 1894 | side-channel-weakmap "^1.0.2" 1895 | 1896 | statuses@2.0.1: 1897 | version "2.0.1" 1898 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1899 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1900 | 1901 | "statuses@>= 1.5.0 < 2": 1902 | version "1.5.0" 1903 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1904 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1905 | 1906 | string-width@^4.1.0, string-width@^4.2.0: 1907 | version "4.2.3" 1908 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1909 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1910 | dependencies: 1911 | emoji-regex "^8.0.0" 1912 | is-fullwidth-code-point "^3.0.0" 1913 | strip-ansi "^6.0.1" 1914 | 1915 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1916 | version "6.0.1" 1917 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1918 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1919 | dependencies: 1920 | ansi-regex "^5.0.1" 1921 | 1922 | strip-json-comments@^3.1.1: 1923 | version "3.1.1" 1924 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1925 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1926 | 1927 | supports-color@^7.1.0: 1928 | version "7.2.0" 1929 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1930 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1931 | dependencies: 1932 | has-flag "^4.0.0" 1933 | 1934 | supports-color@^8.1.1: 1935 | version "8.1.1" 1936 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1937 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1938 | dependencies: 1939 | has-flag "^4.0.0" 1940 | 1941 | text-table@^0.2.0: 1942 | version "0.2.0" 1943 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1944 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1945 | 1946 | to-regex-range@^5.0.1: 1947 | version "5.0.1" 1948 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1949 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1950 | dependencies: 1951 | is-number "^7.0.0" 1952 | 1953 | toidentifier@1.0.0: 1954 | version "1.0.0" 1955 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1956 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1957 | 1958 | toidentifier@1.0.1: 1959 | version "1.0.1" 1960 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1961 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1962 | 1963 | ts-api-utils@^2.1.0: 1964 | version "2.1.0" 1965 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" 1966 | integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== 1967 | 1968 | ts-node@^10.9.2: 1969 | version "10.9.2" 1970 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" 1971 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 1972 | dependencies: 1973 | "@cspotcode/source-map-support" "^0.8.0" 1974 | "@tsconfig/node10" "^1.0.7" 1975 | "@tsconfig/node12" "^1.0.7" 1976 | "@tsconfig/node14" "^1.0.0" 1977 | "@tsconfig/node16" "^1.0.2" 1978 | acorn "^8.4.1" 1979 | acorn-walk "^8.1.1" 1980 | arg "^4.1.0" 1981 | create-require "^1.1.0" 1982 | diff "^4.0.1" 1983 | make-error "^1.1.1" 1984 | v8-compile-cache-lib "^3.0.1" 1985 | yn "3.1.1" 1986 | 1987 | type-check@^0.4.0, type-check@~0.4.0: 1988 | version "0.4.0" 1989 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1990 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1991 | dependencies: 1992 | prelude-ls "^1.2.1" 1993 | 1994 | type-detect@^4.0.0, type-detect@^4.0.5: 1995 | version "4.0.8" 1996 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1997 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1998 | 1999 | type-fest@^0.20.2: 2000 | version "0.20.2" 2001 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2002 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2003 | 2004 | type-is@~1.6.17, type-is@~1.6.18: 2005 | version "1.6.18" 2006 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 2007 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 2008 | dependencies: 2009 | media-typer "0.3.0" 2010 | mime-types "~2.1.24" 2011 | 2012 | typedoc@^0.28.9: 2013 | version "0.28.10" 2014 | resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.28.10.tgz#566a19201e7469dc5ca3cc436049655e0beb0201" 2015 | integrity sha512-zYvpjS2bNJ30SoNYfHSRaFpBMZAsL7uwKbWwqoCNFWjcPnI3e/mPLh2SneH9mX7SJxtDpvDgvd9/iZxGbo7daw== 2016 | dependencies: 2017 | "@gerrit0/mini-shiki" "^3.9.0" 2018 | lunr "^2.3.9" 2019 | markdown-it "^14.1.0" 2020 | minimatch "^9.0.5" 2021 | yaml "^2.8.0" 2022 | 2023 | typescript@^5.9.2: 2024 | version "5.9.2" 2025 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.2.tgz#d93450cddec5154a2d5cabe3b8102b83316fb2a6" 2026 | integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== 2027 | 2028 | uc.micro@^2.0.0, uc.micro@^2.1.0: 2029 | version "2.1.0" 2030 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" 2031 | integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== 2032 | 2033 | undici-types@~6.21.0: 2034 | version "6.21.0" 2035 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" 2036 | integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== 2037 | 2038 | unpipe@1.0.0, unpipe@~1.0.0: 2039 | version "1.0.0" 2040 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2041 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 2042 | 2043 | uri-js@^4.2.2: 2044 | version "4.4.1" 2045 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2046 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2047 | dependencies: 2048 | punycode "^2.1.0" 2049 | 2050 | utils-merge@1.0.1: 2051 | version "1.0.1" 2052 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2053 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 2054 | 2055 | v8-compile-cache-lib@^3.0.1: 2056 | version "3.0.1" 2057 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 2058 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 2059 | 2060 | vary@~1.1.2: 2061 | version "1.1.2" 2062 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2063 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 2064 | 2065 | which@^2.0.1: 2066 | version "2.0.2" 2067 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2068 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2069 | dependencies: 2070 | isexe "^2.0.0" 2071 | 2072 | word-wrap@^1.2.5: 2073 | version "1.2.5" 2074 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 2075 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 2076 | 2077 | workerpool@^6.5.1: 2078 | version "6.5.1" 2079 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" 2080 | integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== 2081 | 2082 | wrap-ansi@^7.0.0: 2083 | version "7.0.0" 2084 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2085 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2086 | dependencies: 2087 | ansi-styles "^4.0.0" 2088 | string-width "^4.1.0" 2089 | strip-ansi "^6.0.0" 2090 | 2091 | wrappy@1: 2092 | version "1.0.2" 2093 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2094 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2095 | 2096 | y18n@^5.0.5: 2097 | version "5.0.8" 2098 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2099 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2100 | 2101 | yaml@^2.8.0: 2102 | version "2.8.1" 2103 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" 2104 | integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== 2105 | 2106 | yargs-parser@^20.2.2, yargs-parser@^20.2.9: 2107 | version "20.2.9" 2108 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 2109 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 2110 | 2111 | yargs-unparser@^2.0.0: 2112 | version "2.0.0" 2113 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 2114 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 2115 | dependencies: 2116 | camelcase "^6.0.0" 2117 | decamelize "^4.0.0" 2118 | flat "^5.0.2" 2119 | is-plain-obj "^2.1.0" 2120 | 2121 | yargs@^16.2.0: 2122 | version "16.2.0" 2123 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 2124 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 2125 | dependencies: 2126 | cliui "^7.0.2" 2127 | escalade "^3.1.1" 2128 | get-caller-file "^2.0.5" 2129 | require-directory "^2.1.1" 2130 | string-width "^4.2.0" 2131 | y18n "^5.0.5" 2132 | yargs-parser "^20.2.2" 2133 | 2134 | yn@3.1.1: 2135 | version "3.1.1" 2136 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2137 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2138 | 2139 | yocto-queue@^0.1.0: 2140 | version "0.1.0" 2141 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2142 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2143 | --------------------------------------------------------------------------------