Commit a524dd8d authored by nanahira's avatar nanahira

adapt Koishi 4.8 and migrate to satori-decorators

parent 40c85300
import 'reflect-metadata';
export * from './src/register';
export * from './src/decorators';
export * from 'cordis-decorators';
export * from './src/cosmotype-exports';
export * from './src/base-plugin';
export * from './src/plugin-operators';
export * from './src/plugin-factory';
export * from './src/def/interfaces';
export * from 'schemastery-gen';
export * from 'koishi-decorators/dist/src/def/select';
export * from './src/decorators';
......@@ -9,14 +9,10 @@
"version": "10.3.2",
"license": "MIT",
"dependencies": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"koishi-decorators": "^2.1.7",
"lodash": "^4.17.21",
"minato-decorators": "^2.0.7",
"reflect-metadata": "^0.1.13",
"schemastery-gen": "^3.1.14",
"typed-reflector": "^1.0.10"
"minato-decorators": "^2.0.8",
"rxjs": "^7.5.6",
"satori-decorators": "^1.0.7"
},
"devDependencies": {
"@koishijs/plugin-adapter-onebot": "^4.2.4",
......@@ -34,11 +30,10 @@
"rimraf": "^3.0.2",
"supertest": "^6.1.6",
"ts-jest": "^27.0.7",
"typescript": "^4.6.4",
"ws": "^8.2.3"
"typescript": "^4.6.4"
},
"peerDependencies": {
"koishi": "^4.7.5",
"koishi": "^4.8.1",
"schemastery": "^3.4.3"
}
},
......@@ -1028,18 +1023,16 @@
}
},
"node_modules/@koishijs/core": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.7.5.tgz",
"integrity": "sha512-So8tBtSTVIq8dTGs/0o92Om3bQhgYUhmzVhnYTqJbx+kW3kSowl/ORiBhJFK3GR6Dj+JyKLptsqQNE4DjZdNhw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.8.1.tgz",
"integrity": "sha512-dHYWOox4RdZu6YwrmazTEbafCP4QmfGKBZoDDKx6cGwJYRcU09RxZ4nNL/1mPGyJBPgqngzpiY0C+4kwD2R4cw==",
"peer": true,
"dependencies": {
"@koishijs/utils": "^5.4.5",
"cordis": "^1.5.5",
"@koishijs/utils": "^6.0.0",
"@satorijs/core": "^1.0.3",
"cordis": "^2.0.6",
"fastest-levenshtein": "^1.0.12",
"minato": "^1.2.1"
},
"engines": {
"node": ">=12.0.0"
"minato": "^1.2.3"
}
},
"node_modules/@koishijs/plugin-adapter-onebot": {
......@@ -1055,38 +1048,15 @@
"koishi": "^4.7.1"
}
},
"node_modules/@koishijs/segment": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@koishijs/segment/-/segment-1.1.1.tgz",
"integrity": "sha512-HmLRKJiIX++U+ow+RP0BVGwgAFzDRqwHusUzjoZcZdcnG8yudTsvB6MXnzBMnBL7k9LBxUlfB5P8ukkM1roZFQ==",
"peer": true
},
"node_modules/@koishijs/utils": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/@koishijs/utils/-/utils-5.4.5.tgz",
"integrity": "sha512-tOmhFFcnuhFAudRcG9Bq7OeVmX1yxGvlSsJMbaSBHvb/hUrFzpXjEd2onqnJw4fyx/QLgYYFBeiFcKXDSujoLg==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@koishijs/utils/-/utils-6.0.0.tgz",
"integrity": "sha512-xMwZAkrCnjVXYLmZTSnI8ZYyNU8YcNynyK+njkNKivuQywfU3l/SgwLUqpv2x2uSsqaKIn8ZNXOrPYXMBpPdQg==",
"peer": true,
"dependencies": {
"@koishijs/segment": "^1.1.1",
"cosmokit": "^1.1.2",
"cosmokit": "^1.2.1",
"reggol": "^1.0.3",
"schemastery": "^3.4.3",
"supports-color": "^8.1.1"
}
},
"node_modules/@koishijs/utils/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
"schemastery": "^3.4.3"
}
},
"node_modules/@nodelib/fs.scandir": {
......@@ -1124,6 +1094,49 @@
"node": ">= 8"
}
},
"node_modules/@satorijs/core": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@satorijs/core/-/core-1.0.3.tgz",
"integrity": "sha512-ewAZmkSeWzwzIuIPIzJ9G1xRWq1tL8+2kgmE8nf4zE/uU4xmf9DQSApSGj2ZnNs2gLhIzZW0TKghIA1R1bMUCA==",
"peer": true,
"dependencies": {
"@satorijs/message": "^1.0.1",
"cordis": "^2.0.6",
"cosmokit": "^1.2.1"
}
},
"node_modules/@satorijs/message": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@satorijs/message/-/message-1.0.1.tgz",
"integrity": "sha512-AbWf2xsaCEM5Vu76BEHsLs8bx7SyHjIwSea74phG9mQYE5Qean1LWxClWdPfCmN7AGyosh1zkqm34SCMSPBt+w==",
"peer": true
},
"node_modules/@satorijs/satori": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@satorijs/satori/-/satori-1.0.3.tgz",
"integrity": "sha512-XQCIXtVTGqbBWdsArI87ouwIS5MxCTEzVcNooURE9jQRi1CgXz330IqSaqvR00EY673PEB4RpVdMZvDeDv4u7w==",
"peer": true,
"dependencies": {
"@koa/router": "^10.1.1",
"@satorijs/core": "^1.0.3",
"@types/koa": "*",
"@types/koa__router": "*",
"@types/ws": "^8.5.3",
"axios": "^0.24.0",
"koa": "^2.13.4",
"koa-bodyparser": "^4.3.0",
"parseurl": "^1.3.3",
"path-to-regexp": "^6.2.1",
"portfinder": "^1.0.28",
"proxy-agent": "^5.0.0",
"reggol": "^1.0.3",
"schemastery": "^3.4.3",
"ws": "^8.6.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
......@@ -1206,9 +1219,9 @@
}
},
"node_modules/@types/body-parser": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
"integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==",
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
"integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
"dependencies": {
"@types/connect": "*",
"@types/node": "*"
......@@ -1223,9 +1236,9 @@
}
},
"node_modules/@types/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz",
"integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA=="
},
"node_modules/@types/cookiejar": {
"version": "2.1.2",
......@@ -1256,9 +1269,9 @@
}
},
"node_modules/@types/express-serve-static-core": {
"version": "4.17.25",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz",
"integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==",
"version": "4.17.29",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
"integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
"dependencies": {
"@types/node": "*",
"@types/qs": "*",
......@@ -1280,9 +1293,9 @@
"integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
},
"node_modules/@types/http-errors": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz",
"integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q=="
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
"integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
},
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.3",
......@@ -1330,9 +1343,9 @@
"integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
},
"node_modules/@types/koa": {
"version": "2.13.4",
"resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
"integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
"version": "2.13.5",
"resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz",
"integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==",
"dependencies": {
"@types/accepts": "*",
"@types/content-disposition": "*",
......@@ -1632,13 +1645,13 @@
"dev": true
},
"node_modules/accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"peer": true,
"dependencies": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
},
"engines": {
"node": ">= 0.6"
......@@ -1815,9 +1828,9 @@
}
},
"node_modules/ast-types/node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
"peer": true
},
"node_modules/astral-regex": {
......@@ -2055,9 +2068,9 @@
"dev": true
},
"node_modules/bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"peer": true,
"engines": {
"node": ">= 0.8"
......@@ -2234,17 +2247,37 @@
"dev": true
},
"node_modules/content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"peer": true,
"dependencies": {
"safe-buffer": "5.1.2"
"safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-disposition/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"peer": true
},
"node_modules/content-type": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
......@@ -2294,16 +2327,33 @@
"node_modules/copy-to": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
"integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=",
"integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==",
"peer": true
},
"node_modules/cordis": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-1.5.5.tgz",
"integrity": "sha512-vCw6FA+OLO5e40so5XjhRnIw1ldGH1L74q/wlnuckqFtIq8teYkfnnmlNTS24RJNcgPz2DWdbVgCnoc+5Lc+UQ==",
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-2.0.6.tgz",
"integrity": "sha512-Q85Y2iY3myX340TiUV97DtTuPTls/pZoYqP2eWHlkLYcIzs7cIBTX3C8FqxaZ2hRgOJ6kMcXSXSIPWsZGcyCHQ==",
"peer": true,
"dependencies": {
"cosmokit": "^1.1.2"
"cosmokit": "^1.2.1"
}
},
"node_modules/cordis-decorators": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/cordis-decorators/-/cordis-decorators-1.0.15.tgz",
"integrity": "sha512-xk7U04hXfH1kA7aSRE17sfgs9AFimgkjonIByXP1TRJlOaWJHkCf2+CdeH20ajANLqh/39rhcrBrIEqkmJlxGg==",
"dependencies": {
"lodash": "^4.17.21",
"mustache": "^4.2.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.6",
"schemastery-gen": "^3.1.14",
"typed-reflector": "^1.0.11"
},
"peerDependencies": {
"cordis": "^2.0.6",
"schemastery": "^3.4.3"
}
},
"node_modules/core-util-is": {
......@@ -2313,9 +2363,9 @@
"peer": true
},
"node_modules/cosmokit": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cosmokit/-/cosmokit-1.1.2.tgz",
"integrity": "sha512-cSNrcyxZ3GT+tjSlUzWIzMiK7Wndq1Nm/2tlRhT65RXltSIcH5zaHdmnz1TnIhLuOViaO9qfSdnRPzxNkxMv0g==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/cosmokit/-/cosmokit-1.2.1.tgz",
"integrity": "sha512-BTn7vRr31WUwX7Tq8Q/r+Qz+LPKTE3vA0d7xzVaYNes2NPvGPmIWiljYP0m/PIrdpqLLtdHpY1zGNr+OwDhA7A==",
"peer": true
},
"node_modules/cross-spawn": {
......@@ -2410,7 +2460,7 @@
"node_modules/deep-equal": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
"integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==",
"peer": true
},
"node_modules/deep-is": {
......@@ -2428,15 +2478,15 @@
}
},
"node_modules/degenerator": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz",
"integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz",
"integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==",
"peer": true,
"dependencies": {
"ast-types": "^0.13.2",
"escodegen": "^1.8.1",
"esprima": "^4.0.0",
"vm2": "^3.9.3"
"vm2": "^3.9.8"
},
"engines": {
"node": ">= 6"
......@@ -2454,23 +2504,27 @@
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
"peer": true
},
"node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
"peer": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
"peer": true
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"peer": true,
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/detect-newline": {
"version": "3.1.0",
......@@ -2538,7 +2592,7 @@
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"peer": true
},
"node_modules/electron-to-chromium": {
......@@ -2568,7 +2622,7 @@
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"peer": true,
"engines": {
"node": ">= 0.8"
......@@ -2598,7 +2652,7 @@
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"peer": true
},
"node_modules/escape-string-regexp": {
......@@ -2638,7 +2692,7 @@
"node_modules/escodegen/node_modules/levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
"peer": true,
"dependencies": {
"prelude-ls": "~1.1.2",
......@@ -2668,7 +2722,7 @@
"node_modules/escodegen/node_modules/prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
"peer": true,
"engines": {
"node": ">= 0.8.0"
......@@ -2677,7 +2731,7 @@
"node_modules/escodegen/node_modules/type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
"peer": true,
"dependencies": {
"prelude-ls": "~1.1.2"
......@@ -3031,10 +3085,13 @@
"dev": true
},
"node_modules/fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
"integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
"peer": true
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz",
"integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==",
"peer": true,
"engines": {
"node": ">= 4.9.1"
}
},
"node_modules/fastq": {
"version": "1.13.0",
......@@ -3137,9 +3194,9 @@
"dev": true
},
"node_modules/follow-redirects": {
"version": "1.14.7",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
"integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"funding": [
{
"type": "individual",
......@@ -3183,7 +3240,7 @@
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"peer": true,
"engines": {
"node": ">= 0.6"
......@@ -3226,7 +3283,7 @@
"node_modules/ftp": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
"integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
"integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==",
"peer": true,
"dependencies": {
"readable-stream": "1.1.x",
......@@ -3465,16 +3522,16 @@
}
},
"node_modules/http-errors": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
"integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
"integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
"peer": true,
"dependencies": {
"depd": "~1.1.2",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.6"
......@@ -3598,7 +3655,7 @@
"node_modules/inflation": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz",
"integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=",
"integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==",
"peer": true,
"engines": {
"node": ">= 0.8.0"
......@@ -3620,9 +3677,9 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
"integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
"peer": true
},
"node_modules/is-core-module": {
......@@ -3727,7 +3784,7 @@
"node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"peer": true
},
"node_modules/isexe": {
......@@ -4663,7 +4720,7 @@
"node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"peer": true,
"optionalDependencies": {
"graceful-fs": "^4.1.6"
......@@ -4766,49 +4823,21 @@
}
},
"node_modules/koishi": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.7.5.tgz",
"integrity": "sha512-Q+czD5hZIsikYwdoKUOZFZIuvXoamikXK6iX4FXnHUPsoXX16PjqX3D1sBKd9JLVMA49KSAGoFW0fN9IMHykYw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.8.1.tgz",
"integrity": "sha512-4ogJzbSmGWq4ek33rb2eLeFzdcwFM9zi6ZMUzm52tbHWDcJ+c1WqARj/0tc4tQ/7oAj5hNTC+yo3ddFOGgf0Sg==",
"peer": true,
"dependencies": {
"@koa/router": "^10.1.1",
"@koishijs/core": "^4.7.5",
"@koishijs/utils": "^5.4.5",
"@types/koa": "*",
"@types/koa__router": "*",
"@types/ws": "^8.5.3",
"axios": "^0.24.0",
"@koishijs/core": "^4.8.1",
"@koishijs/utils": "^6.0.0",
"@satorijs/satori": "^1.0.3",
"file-type": "^16.5.3",
"koa": "^2.13.4",
"koa-bodyparser": "^4.3.0",
"ns-require": "^1.1.4",
"parseurl": "^1.3.3",
"path-to-regexp": "^6.2.1",
"portfinder": "^1.0.28",
"proxy-agent": "^5.0.0",
"ws": "^8.6.0"
"ns-require": "^1.1.4"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/koishi-decorators": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-2.1.7.tgz",
"integrity": "sha512-OoExVOdpVEmv8FywtdjR8JUPQtBz1P2rabkIfmt3SQpp3jrkm67EgdQNH+Nw8+6CfSDukMP3+/xWsA64VE5VEQ==",
"dependencies": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"lodash": "^4.17.21",
"mustache": "^4.2.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.5",
"typed-reflector": "^1.0.10"
},
"peerDependencies": {
"koishi": "^4.7.5"
}
},
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
......@@ -4920,7 +4949,7 @@
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"peer": true,
"engines": {
"node": ">= 0.6"
......@@ -5003,25 +5032,25 @@
}
},
"node_modules/minato": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/minato/-/minato-1.2.1.tgz",
"integrity": "sha512-BYY18rr82aXAAVtMKkN4yDFsTUtsAmeDmyTRVOXG3mEzG74sNF5TU1nVT1QSC9dpvAcCFFs/vZO2rJoC8vSetQ==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/minato/-/minato-1.2.3.tgz",
"integrity": "sha512-06+ytX+prjYykoaqYe48tAGRbbG5WME1MEpb1WQUPhT6qxGSYmeqJyFX97Hlux4HruJfKpRCzsX6dhYRc9XkTA==",
"peer": true,
"dependencies": {
"cosmokit": "^1.1.2",
"cosmokit": "^1.2.1",
"ns-require": "^1.1.4"
}
},
"node_modules/minato-decorators": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/minato-decorators/-/minato-decorators-2.0.7.tgz",
"integrity": "sha512-at/tp2GlrnzZ6BIsBH8kzV6u4Od41sc4Mw8wZRVlEe3rccKMDGSBYXelrofj7sF/t66KRbwrc57xAVCg2PaFGg==",
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/minato-decorators/-/minato-decorators-2.0.8.tgz",
"integrity": "sha512-W1fukpqMBwTyE5lBkVmSdwGSl6eLzdRmPqAxyDxbfSJxva0FzXgx9VXQPOdkxLqDyWORa+uj/CQhIqDRVdEWpw==",
"dependencies": {
"lodash": "^4.17.21",
"typed-reflector": "^1.0.10"
},
"peerDependencies": {
"minato": "^1.1.0"
"minato": "^1.2.3"
}
},
"node_modules/minimatch": {
......@@ -5073,9 +5102,9 @@
"dev": true
},
"node_modules/negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"peer": true,
"engines": {
"node": ">= 0.6"
......@@ -5153,9 +5182,9 @@
}
},
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"peer": true,
"dependencies": {
"ee-first": "1.1.1"
......@@ -5191,7 +5220,7 @@
"node_modules/only": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
"integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=",
"integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==",
"peer": true
},
"node_modules/optionator": {
......@@ -5268,14 +5297,14 @@
}
},
"node_modules/pac-resolver": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz",
"integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz",
"integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==",
"peer": true,
"dependencies": {
"degenerator": "^3.0.1",
"degenerator": "^3.0.2",
"ip": "^1.1.5",
"netmask": "^2.0.1"
"netmask": "^2.0.2"
},
"engines": {
"node": ">= 8"
......@@ -5612,13 +5641,13 @@
]
},
"node_modules/raw-body": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
"integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"peer": true,
"dependencies": {
"bytes": "3.1.0",
"http-errors": "1.7.3",
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
......@@ -5626,27 +5655,39 @@
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"peer": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/http-errors": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
"integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"peer": true,
"dependencies": {
"depd": "~1.1.2",
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.6"
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
"peer": true
"node_modules/raw-body/node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"peer": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/react-is": {
"version": "17.0.2",
......@@ -5657,7 +5698,7 @@
"node_modules/readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
"peer": true,
"dependencies": {
"core-util-is": "~1.0.0",
......@@ -5886,9 +5927,9 @@
}
},
"node_modules/rxjs": {
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
"integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
"integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==",
"dependencies": {
"tslib": "^2.1.0"
}
......@@ -5901,13 +5942,28 @@
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/satori-decorators": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/satori-decorators/-/satori-decorators-1.0.7.tgz",
"integrity": "sha512-fN+zaO/1gn9PxKqCfEdZx7xeqJWm4HYMLYuJai5wejdVOir6pJQkCJ0LEC5LdyZTho3Gtm7YpPuiPj8OpM4SxQ==",
"dependencies": {
"@types/koa": "^2.13.5",
"@types/koa__router": "^8.0.11",
"cordis-decorators": "^1.0.15",
"lodash": "^4.17.21"
},
"peerDependencies": {
"@satorijs/satori": "^1.0.3"
}
},
"node_modules/saxes": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
......@@ -6046,13 +6102,13 @@
}
},
"node_modules/socks": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz",
"integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==",
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz",
"integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==",
"peer": true,
"dependencies": {
"ip": "^1.1.5",
"smart-buffer": "^4.1.0"
"ip": "^2.0.0",
"smart-buffer": "^4.2.0"
},
"engines": {
"node": ">= 10.13.0",
......@@ -6073,6 +6129,12 @@
"node": ">= 6"
}
},
"node_modules/socks/node_modules/ip": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
"peer": true
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
......@@ -6122,7 +6184,7 @@
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"peer": true,
"engines": {
"node": ">= 0.6"
......@@ -6131,7 +6193,7 @@
"node_modules/string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
"peer": true
},
"node_modules/string-length": {
......@@ -6437,9 +6499,9 @@
}
},
"node_modules/toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"peer": true,
"engines": {
"node": ">=0.6"
......@@ -6605,9 +6667,9 @@
}
},
"node_modules/typed-reflector": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.10.tgz",
"integrity": "sha512-AqjdFGE/DGzbyFHTJ/xDY6mPHAJJKiVhn3vQ01sXz5eEJvY82jOllPGanFJ/Bo6ObPbLWa2fAZW19kcybiFPNA==",
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.11.tgz",
"integrity": "sha512-OhryVYaR+tBEW9Yt2PsPqAniNfbVk1idKbnLxBCBPUSHVRm+Ajik/QxifoJUuGoaXAZDLW9JlJTO6ctXGZX9gQ==",
"dependencies": {
"reflect-metadata": "^0.1.13"
}
......@@ -6645,7 +6707,7 @@
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"peer": true,
"engines": {
"node": ">= 0.8"
......@@ -6697,17 +6759,21 @@
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"peer": true,
"engines": {
"node": ">= 0.8"
}
},
"node_modules/vm2": {
"version": "3.9.5",
"resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz",
"integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==",
"version": "3.9.10",
"resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.10.tgz",
"integrity": "sha512-AuECTSvwu2OHLAZYhG716YzwodKCIJxB6u1zG7PgSQwIgAlEaoXH52bxdcvT8GkGjnYK7r7yWDW0m0sOsPuBjQ==",
"peer": true,
"dependencies": {
"acorn": "^8.7.0",
"acorn-walk": "^8.2.0"
},
"bin": {
"vm2": "bin/vm2"
},
......@@ -6715,6 +6781,27 @@
"node": ">=6.0"
}
},
"node_modules/vm2/node_modules/acorn": {
"version": "8.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/vm2/node_modules/acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"peer": true,
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/w3c-hr-time": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
......@@ -6876,7 +6963,7 @@
"node_modules/xregexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
"integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
"integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==",
"peer": true,
"engines": {
"node": "*"
......@@ -6925,9 +7012,9 @@
}
},
"node_modules/ylru": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
"integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz",
"integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==",
"peer": true,
"engines": {
"node": ">= 4.0.0"
......@@ -7704,15 +7791,16 @@
}
},
"@koishijs/core": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.7.5.tgz",
"integrity": "sha512-So8tBtSTVIq8dTGs/0o92Om3bQhgYUhmzVhnYTqJbx+kW3kSowl/ORiBhJFK3GR6Dj+JyKLptsqQNE4DjZdNhw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/@koishijs/core/-/core-4.8.1.tgz",
"integrity": "sha512-dHYWOox4RdZu6YwrmazTEbafCP4QmfGKBZoDDKx6cGwJYRcU09RxZ4nNL/1mPGyJBPgqngzpiY0C+4kwD2R4cw==",
"peer": true,
"requires": {
"@koishijs/utils": "^5.4.5",
"cordis": "^1.5.5",
"@koishijs/utils": "^6.0.0",
"@satorijs/core": "^1.0.3",
"cordis": "^2.0.6",
"fastest-levenshtein": "^1.0.12",
"minato": "^1.2.1"
"minato": "^1.2.3"
}
},
"@koishijs/plugin-adapter-onebot": {
......@@ -7725,34 +7813,15 @@
"ws": "^8.6.0"
}
},
"@koishijs/segment": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@koishijs/segment/-/segment-1.1.1.tgz",
"integrity": "sha512-HmLRKJiIX++U+ow+RP0BVGwgAFzDRqwHusUzjoZcZdcnG8yudTsvB6MXnzBMnBL7k9LBxUlfB5P8ukkM1roZFQ==",
"peer": true
},
"@koishijs/utils": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/@koishijs/utils/-/utils-5.4.5.tgz",
"integrity": "sha512-tOmhFFcnuhFAudRcG9Bq7OeVmX1yxGvlSsJMbaSBHvb/hUrFzpXjEd2onqnJw4fyx/QLgYYFBeiFcKXDSujoLg==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/@koishijs/utils/-/utils-6.0.0.tgz",
"integrity": "sha512-xMwZAkrCnjVXYLmZTSnI8ZYyNU8YcNynyK+njkNKivuQywfU3l/SgwLUqpv2x2uSsqaKIn8ZNXOrPYXMBpPdQg==",
"peer": true,
"requires": {
"@koishijs/segment": "^1.1.1",
"cosmokit": "^1.1.2",
"cosmokit": "^1.2.1",
"reggol": "^1.0.3",
"schemastery": "^3.4.3",
"supports-color": "^8.1.1"
},
"dependencies": {
"supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"peer": true,
"requires": {
"has-flag": "^4.0.0"
}
}
"schemastery": "^3.4.3"
}
},
"@nodelib/fs.scandir": {
......@@ -7781,6 +7850,46 @@
"fastq": "^1.6.0"
}
},
"@satorijs/core": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@satorijs/core/-/core-1.0.3.tgz",
"integrity": "sha512-ewAZmkSeWzwzIuIPIzJ9G1xRWq1tL8+2kgmE8nf4zE/uU4xmf9DQSApSGj2ZnNs2gLhIzZW0TKghIA1R1bMUCA==",
"peer": true,
"requires": {
"@satorijs/message": "^1.0.1",
"cordis": "^2.0.6",
"cosmokit": "^1.2.1"
}
},
"@satorijs/message": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@satorijs/message/-/message-1.0.1.tgz",
"integrity": "sha512-AbWf2xsaCEM5Vu76BEHsLs8bx7SyHjIwSea74phG9mQYE5Qean1LWxClWdPfCmN7AGyosh1zkqm34SCMSPBt+w==",
"peer": true
},
"@satorijs/satori": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@satorijs/satori/-/satori-1.0.3.tgz",
"integrity": "sha512-XQCIXtVTGqbBWdsArI87ouwIS5MxCTEzVcNooURE9jQRi1CgXz330IqSaqvR00EY673PEB4RpVdMZvDeDv4u7w==",
"peer": true,
"requires": {
"@koa/router": "^10.1.1",
"@satorijs/core": "^1.0.3",
"@types/koa": "*",
"@types/koa__router": "*",
"@types/ws": "^8.5.3",
"axios": "^0.24.0",
"koa": "^2.13.4",
"koa-bodyparser": "^4.3.0",
"parseurl": "^1.3.3",
"path-to-regexp": "^6.2.1",
"portfinder": "^1.0.28",
"proxy-agent": "^5.0.0",
"reggol": "^1.0.3",
"schemastery": "^3.4.3",
"ws": "^8.6.0"
}
},
"@sinonjs/commons": {
"version": "1.8.3",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz",
......@@ -7860,9 +7969,9 @@
}
},
"@types/body-parser": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz",
"integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==",
"version": "1.19.2",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
"integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
"requires": {
"@types/connect": "*",
"@types/node": "*"
......@@ -7877,9 +7986,9 @@
}
},
"@types/content-disposition": {
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ=="
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz",
"integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA=="
},
"@types/cookiejar": {
"version": "2.1.2",
......@@ -7910,9 +8019,9 @@
}
},
"@types/express-serve-static-core": {
"version": "4.17.25",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz",
"integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==",
"version": "4.17.29",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz",
"integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==",
"requires": {
"@types/node": "*",
"@types/qs": "*",
......@@ -7934,9 +8043,9 @@
"integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA=="
},
"@types/http-errors": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz",
"integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q=="
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.2.tgz",
"integrity": "sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w=="
},
"@types/istanbul-lib-coverage": {
"version": "2.0.3",
......@@ -7984,9 +8093,9 @@
"integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw=="
},
"@types/koa": {
"version": "2.13.4",
"resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz",
"integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==",
"version": "2.13.5",
"resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz",
"integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==",
"requires": {
"@types/accepts": "*",
"@types/content-disposition": "*",
......@@ -8205,13 +8314,13 @@
"dev": true
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"peer": true,
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
}
},
"acorn": {
......@@ -8336,9 +8445,9 @@
},
"dependencies": {
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
"peer": true
}
}
......@@ -8534,9 +8643,9 @@
"dev": true
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"peer": true
},
"cache-content-type": {
......@@ -8675,12 +8784,20 @@
"dev": true
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"peer": true,
"requires": {
"safe-buffer": "5.1.2"
"safe-buffer": "5.2.1"
},
"dependencies": {
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"peer": true
}
}
},
"content-type": {
......@@ -8725,16 +8842,29 @@
"copy-to": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz",
"integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=",
"integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==",
"peer": true
},
"cordis": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-1.5.5.tgz",
"integrity": "sha512-vCw6FA+OLO5e40so5XjhRnIw1ldGH1L74q/wlnuckqFtIq8teYkfnnmlNTS24RJNcgPz2DWdbVgCnoc+5Lc+UQ==",
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/cordis/-/cordis-2.0.6.tgz",
"integrity": "sha512-Q85Y2iY3myX340TiUV97DtTuPTls/pZoYqP2eWHlkLYcIzs7cIBTX3C8FqxaZ2hRgOJ6kMcXSXSIPWsZGcyCHQ==",
"peer": true,
"requires": {
"cosmokit": "^1.1.2"
"cosmokit": "^1.2.1"
}
},
"cordis-decorators": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/cordis-decorators/-/cordis-decorators-1.0.15.tgz",
"integrity": "sha512-xk7U04hXfH1kA7aSRE17sfgs9AFimgkjonIByXP1TRJlOaWJHkCf2+CdeH20ajANLqh/39rhcrBrIEqkmJlxGg==",
"requires": {
"lodash": "^4.17.21",
"mustache": "^4.2.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.6",
"schemastery-gen": "^3.1.14",
"typed-reflector": "^1.0.11"
}
},
"core-util-is": {
......@@ -8744,9 +8874,9 @@
"peer": true
},
"cosmokit": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cosmokit/-/cosmokit-1.1.2.tgz",
"integrity": "sha512-cSNrcyxZ3GT+tjSlUzWIzMiK7Wndq1Nm/2tlRhT65RXltSIcH5zaHdmnz1TnIhLuOViaO9qfSdnRPzxNkxMv0g==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/cosmokit/-/cosmokit-1.2.1.tgz",
"integrity": "sha512-BTn7vRr31WUwX7Tq8Q/r+Qz+LPKTE3vA0d7xzVaYNes2NPvGPmIWiljYP0m/PIrdpqLLtdHpY1zGNr+OwDhA7A==",
"peer": true
},
"cross-spawn": {
......@@ -8823,7 +8953,7 @@
"deep-equal": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
"integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==",
"peer": true
},
"deep-is": {
......@@ -8838,15 +8968,15 @@
"dev": true
},
"degenerator": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz",
"integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz",
"integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==",
"peer": true,
"requires": {
"ast-types": "^0.13.2",
"escodegen": "^1.8.1",
"esprima": "^4.0.0",
"vm2": "^3.9.3"
"vm2": "^3.9.8"
}
},
"delayed-stream": {
......@@ -8858,19 +8988,19 @@
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
"peer": true
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
"peer": true
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"peer": true
},
"detect-newline": {
......@@ -8923,7 +9053,7 @@
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"peer": true
},
"electron-to-chromium": {
......@@ -8947,7 +9077,7 @@
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"peer": true
},
"enquirer": {
......@@ -8968,7 +9098,7 @@
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"peer": true
},
"escape-string-regexp": {
......@@ -8993,7 +9123,7 @@
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
"peer": true,
"requires": {
"prelude-ls": "~1.1.2",
......@@ -9017,13 +9147,13 @@
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
"peer": true
},
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
"peer": true,
"requires": {
"prelude-ls": "~1.1.2"
......@@ -9292,9 +9422,9 @@
"dev": true
},
"fastest-levenshtein": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
"integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz",
"integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==",
"peer": true
},
"fastq": {
......@@ -9377,9 +9507,9 @@
"dev": true
},
"follow-redirects": {
"version": "1.14.7",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
"integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"peer": true
},
"form-data": {
......@@ -9402,7 +9532,7 @@
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"peer": true
},
"fs-extra": {
......@@ -9432,7 +9562,7 @@
"ftp": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
"integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=",
"integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==",
"peer": true,
"requires": {
"readable-stream": "1.1.x",
......@@ -9602,16 +9732,16 @@
}
},
"http-errors": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz",
"integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==",
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz",
"integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
"peer": true,
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
"toidentifier": "1.0.1"
}
},
"http-proxy-agent": {
......@@ -9688,7 +9818,7 @@
"inflation": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz",
"integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=",
"integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==",
"peer": true
},
"inflight": {
......@@ -9707,9 +9837,9 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
"integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
"peer": true
},
"is-core-module": {
......@@ -9784,7 +9914,7 @@
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"peer": true
},
"isexe": {
......@@ -10501,7 +10631,7 @@
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"peer": true,
"requires": {
"graceful-fs": "^4.1.6"
......@@ -10588,41 +10718,16 @@
}
},
"koishi": {
"version": "4.7.5",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.7.5.tgz",
"integrity": "sha512-Q+czD5hZIsikYwdoKUOZFZIuvXoamikXK6iX4FXnHUPsoXX16PjqX3D1sBKd9JLVMA49KSAGoFW0fN9IMHykYw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/koishi/-/koishi-4.8.1.tgz",
"integrity": "sha512-4ogJzbSmGWq4ek33rb2eLeFzdcwFM9zi6ZMUzm52tbHWDcJ+c1WqARj/0tc4tQ/7oAj5hNTC+yo3ddFOGgf0Sg==",
"peer": true,
"requires": {
"@koa/router": "^10.1.1",
"@koishijs/core": "^4.7.5",
"@koishijs/utils": "^5.4.5",
"@types/koa": "*",
"@types/koa__router": "*",
"@types/ws": "^8.5.3",
"axios": "^0.24.0",
"@koishijs/core": "^4.8.1",
"@koishijs/utils": "^6.0.0",
"@satorijs/satori": "^1.0.3",
"file-type": "^16.5.3",
"koa": "^2.13.4",
"koa-bodyparser": "^4.3.0",
"ns-require": "^1.1.4",
"parseurl": "^1.3.3",
"path-to-regexp": "^6.2.1",
"portfinder": "^1.0.28",
"proxy-agent": "^5.0.0",
"ws": "^8.6.0"
}
},
"koishi-decorators": {
"version": "2.1.7",
"resolved": "https://registry.npmjs.org/koishi-decorators/-/koishi-decorators-2.1.7.tgz",
"integrity": "sha512-OoExVOdpVEmv8FywtdjR8JUPQtBz1P2rabkIfmt3SQpp3jrkm67EgdQNH+Nw8+6CfSDukMP3+/xWsA64VE5VEQ==",
"requires": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"lodash": "^4.17.21",
"mustache": "^4.2.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.5",
"typed-reflector": "^1.0.10"
"ns-require": "^1.1.4"
}
},
"leven": {
......@@ -10717,7 +10822,7 @@
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"peer": true
},
"merge-stream": {
......@@ -10773,19 +10878,19 @@
"dev": true
},
"minato": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/minato/-/minato-1.2.1.tgz",
"integrity": "sha512-BYY18rr82aXAAVtMKkN4yDFsTUtsAmeDmyTRVOXG3mEzG74sNF5TU1nVT1QSC9dpvAcCFFs/vZO2rJoC8vSetQ==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/minato/-/minato-1.2.3.tgz",
"integrity": "sha512-06+ytX+prjYykoaqYe48tAGRbbG5WME1MEpb1WQUPhT6qxGSYmeqJyFX97Hlux4HruJfKpRCzsX6dhYRc9XkTA==",
"peer": true,
"requires": {
"cosmokit": "^1.1.2",
"cosmokit": "^1.2.1",
"ns-require": "^1.1.4"
}
},
"minato-decorators": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/minato-decorators/-/minato-decorators-2.0.7.tgz",
"integrity": "sha512-at/tp2GlrnzZ6BIsBH8kzV6u4Od41sc4Mw8wZRVlEe3rccKMDGSBYXelrofj7sF/t66KRbwrc57xAVCg2PaFGg==",
"version": "2.0.8",
"resolved": "https://registry.npmjs.org/minato-decorators/-/minato-decorators-2.0.8.tgz",
"integrity": "sha512-W1fukpqMBwTyE5lBkVmSdwGSl6eLzdRmPqAxyDxbfSJxva0FzXgx9VXQPOdkxLqDyWORa+uj/CQhIqDRVdEWpw==",
"requires": {
"lodash": "^4.17.21",
"typed-reflector": "^1.0.10"
......@@ -10831,9 +10936,9 @@
"dev": true
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"peer": true
},
"netmask": {
......@@ -10893,9 +10998,9 @@
"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"peer": true,
"requires": {
"ee-first": "1.1.1"
......@@ -10922,7 +11027,7 @@
"only": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz",
"integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=",
"integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==",
"peer": true
},
"optionator": {
......@@ -10981,14 +11086,14 @@
}
},
"pac-resolver": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz",
"integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz",
"integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==",
"peer": true,
"requires": {
"degenerator": "^3.0.1",
"degenerator": "^3.0.2",
"ip": "^1.1.5",
"netmask": "^2.0.1"
"netmask": "^2.0.2"
}
},
"parent-module": {
......@@ -11235,34 +11340,40 @@
"dev": true
},
"raw-body": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
"integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
"integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"peer": true,
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.3",
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"peer": true
},
"http-errors": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
"integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"peer": true,
"requires": {
"depd": "~1.1.2",
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
"statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"peer": true
}
}
......@@ -11276,7 +11387,7 @@
"readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
"peer": true,
"requires": {
"core-util-is": "~1.0.0",
......@@ -11430,9 +11541,9 @@
}
},
"rxjs": {
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
"integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
"version": "7.5.6",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz",
"integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==",
"requires": {
"tslib": "^2.1.0"
},
......@@ -11447,13 +11558,25 @@
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"satori-decorators": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/satori-decorators/-/satori-decorators-1.0.7.tgz",
"integrity": "sha512-fN+zaO/1gn9PxKqCfEdZx7xeqJWm4HYMLYuJai5wejdVOir6pJQkCJ0LEC5LdyZTho3Gtm7YpPuiPj8OpM4SxQ==",
"requires": {
"@types/koa": "^2.13.5",
"@types/koa__router": "^8.0.11",
"cordis-decorators": "^1.0.15",
"lodash": "^4.17.21"
}
},
"saxes": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
......@@ -11558,13 +11681,21 @@
"peer": true
},
"socks": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz",
"integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==",
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz",
"integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==",
"peer": true,
"requires": {
"ip": "^1.1.5",
"smart-buffer": "^4.1.0"
"ip": "^2.0.0",
"smart-buffer": "^4.2.0"
},
"dependencies": {
"ip": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
"integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
"peer": true
}
}
},
"socks-proxy-agent": {
......@@ -11620,13 +11751,13 @@
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"peer": true
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
"peer": true
},
"string-length": {
......@@ -11857,9 +11988,9 @@
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"peer": true
},
"token-types": {
......@@ -11961,9 +12092,9 @@
}
},
"typed-reflector": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.10.tgz",
"integrity": "sha512-AqjdFGE/DGzbyFHTJ/xDY6mPHAJJKiVhn3vQ01sXz5eEJvY82jOllPGanFJ/Bo6ObPbLWa2fAZW19kcybiFPNA==",
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/typed-reflector/-/typed-reflector-1.0.11.tgz",
"integrity": "sha512-OhryVYaR+tBEW9Yt2PsPqAniNfbVk1idKbnLxBCBPUSHVRm+Ajik/QxifoJUuGoaXAZDLW9JlJTO6ctXGZX9gQ==",
"requires": {
"reflect-metadata": "^0.1.13"
}
......@@ -11991,7 +12122,7 @@
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"peer": true
},
"uri-js": {
......@@ -12036,14 +12167,32 @@
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"peer": true
},
"vm2": {
"version": "3.9.5",
"resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz",
"integrity": "sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng==",
"peer": true
"version": "3.9.10",
"resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.10.tgz",
"integrity": "sha512-AuECTSvwu2OHLAZYhG716YzwodKCIJxB6u1zG7PgSQwIgAlEaoXH52bxdcvT8GkGjnYK7r7yWDW0m0sOsPuBjQ==",
"peer": true,
"requires": {
"acorn": "^8.7.0",
"acorn-walk": "^8.2.0"
},
"dependencies": {
"acorn": {
"version": "8.7.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
"integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
"peer": true
},
"acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"peer": true
}
}
},
"w3c-hr-time": {
"version": "1.0.2",
......@@ -12168,7 +12317,7 @@
"xregexp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
"integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=",
"integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==",
"peer": true
},
"y18n": {
......@@ -12205,9 +12354,9 @@
"dev": true
},
"ylru": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz",
"integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz",
"integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==",
"peer": true
}
}
......
......@@ -44,18 +44,13 @@
"rimraf": "^3.0.2",
"supertest": "^6.1.6",
"ts-jest": "^27.0.7",
"typescript": "^4.6.4",
"ws": "^8.2.3"
"typescript": "^4.6.4"
},
"dependencies": {
"@types/koa": "^2.13.4",
"@types/koa__router": "^8.0.11",
"koishi-decorators": "^2.1.7",
"lodash": "^4.17.21",
"minato-decorators": "^2.0.7",
"reflect-metadata": "^0.1.13",
"schemastery-gen": "^3.1.14",
"typed-reflector": "^1.0.10"
"minato-decorators": "^2.0.8",
"rxjs": "^7.5.6",
"satori-decorators": "^1.0.7"
},
"jest": {
"moduleFileExtensions": [
......@@ -75,7 +70,7 @@
"testEnvironment": "node"
},
"peerDependencies": {
"koishi": "^4.7.5",
"koishi": "^4.8.1",
"schemastery": "^3.4.3"
}
}
import { Context } from 'koishi';
import { ClassType } from 'schemastery-gen';
import { Fork, InjectConfig, PluginSchema } from './decorators';
import { ExactClassPluginConfig, PluginClass, TypeFromClass } from './def';
import { LifecycleEvents } from './register';
export type PartialDeep<T> = T extends
| string
| number
| bigint
| boolean
| null
| undefined
| symbol
| Date
// eslint-disable-next-line @typescript-eslint/ban-types
| Function
? T | undefined
: // Arrays, Sets and Maps and their readonly counterparts have their items made
// deeply partial, but their own instances are left untouched
T extends Array<infer ArrayType>
? Array<PartialDeep<ArrayType>>
: T extends ReadonlyArray<infer ArrayType>
? ReadonlyArray<ArrayType>
: T extends Set<infer SetType>
? Set<PartialDeep<SetType>>
: T extends ReadonlySet<infer SetType>
? ReadonlySet<SetType>
: T extends Map<infer KeyType, infer ValueType>
? Map<PartialDeep<KeyType>, PartialDeep<ValueType>>
: T extends ReadonlyMap<infer KeyType, infer ValueType>
? ReadonlyMap<PartialDeep<KeyType>, PartialDeep<ValueType>>
: // ...and finally, all other objects.
{
[K in keyof T]?: PartialDeep<T[K]>;
};
export class BasePlugin<C, PC = PartialDeep<C>> {
constructor(public ctx: Context, config: PC) {}
@InjectConfig()
config: C;
}
export function StarterPlugin<C>(config: ClassType<C>) {
const plugin = class StarterPluginBase extends BasePlugin<C> {};
PluginSchema(config)(plugin);
return plugin;
}
export function ParentPlugin<PC extends PluginClass>(child: PC) {
const plugin = class ParentPluginBase
extends StarterPlugin<ExactClassPluginConfig<PC>>(child['Config'])
implements LifecycleEvents
{
onFork(instance: TypeFromClass<PC>): void | Promise<void> {}
onForkDisconnect(instance: TypeFromClass<PC>): void | Promise<void> {}
};
Fork(child)(plugin);
return plugin;
}
export function ParentPluginSet<PC extends PluginClass>(child: PC) {
return class ParentPluginSet extends ParentPlugin(child) {
instances = new Set<TypeFromClass<PC>>();
onFork(instance: TypeFromClass<PC>) {
this.instances.add(instance);
}
onForkDisconnect(instance: TypeFromClass<PC>) {
this.instances.delete(instance);
}
};
}
export function ParentPluginMap<PC extends PluginClass, R>(
child: PC,
classifyFunction: (instance: TypeFromClass<PC>) => R,
) {
return class ParentPluginMapBase extends ParentPlugin(child) {
instances = new Map<R, TypeFromClass<PC>>();
onFork(instance: TypeFromClass<PC>) {
this.instances.set(classifyFunction(instance), instance);
}
onForkDisconnect(instance: TypeFromClass<PC>) {
this.instances.delete(classifyFunction(instance));
}
};
}
import { ModelDecorators } from 'minato-decorators';
import { Tables } from 'koishi';
const decorators = new ModelDecorators<Tables>();
export const DefineModel = decorators.DefineModel;
export const ModelField = decorators.ModelField;
export const Primary = decorators.Primary;
export const PrimaryGenerated = decorators.PrimaryGenerated;
export const Foreign = decorators.Foreign;
export const Unique = decorators.Unique;
export const ChildModel = decorators.ChildModel;
export const {
DefineModel,
ModelField,
Primary,
PrimaryGenerated,
Foreign,
Unique,
ChildModel,
} = new ModelDecorators<Tables>();
import 'reflect-metadata';
import { App, Context, Flatten, Keys, Schema, Tables } from 'koishi';
import { Metadata } from './meta/metadata.decorators';
import {
Condition,
KoishiAddUsingList,
KoishiServiceInjectSym,
KoishiServiceInjectSymKeys,
KoishiServiceProvideSym,
KoishiSystemInjectSym,
KoishiSystemInjectSymKeys,
PluginClass,
ProvideOptions,
ServiceName,
SystemInjectFun,
} from './def';
import {
CallbackLayer,
TopLevelAction,
Selection,
selectContext,
} from 'koishi-decorators';
import { ModelClassType, ModelRegistrar } from 'minato-decorators';
import { ClassType } from 'schemastery-gen';
// Export all koishi-decorator decorators
export * from 'koishi-decorators/dist/src/decorators';
export * from 'koishi-decorators/dist/src/http-decorators';
export { PluginDef } from 'koishi-decorators';
// Service API
export function Inject(
name?: ServiceName,
addUsing?: boolean,
): PropertyDecorator;
export function Inject(addUsing?: boolean): PropertyDecorator;
export function Inject(
...args: [(ServiceName | boolean)?, boolean?]
): PropertyDecorator {
let name: ServiceName;
let addUsing = false;
if (args.length === 1) {
if (typeof args[0] === 'boolean') {
addUsing = args[0];
} else {
name = args[0];
}
} else if (args.length >= 2) {
name = args[0] as ServiceName;
addUsing = args[1];
}
return (obj, key) => {
if (!name) {
const functionType = Reflect.getMetadata('design:type', obj, key);
let dec: PropertyDecorator;
if (functionType === Context) {
dec = InjectContext();
} else if (functionType === App) {
dec = InjectApp();
}
if (dec) {
return dec(obj, key);
}
}
const serviceName = name || (key as ServiceName);
if (addUsing) {
Metadata.appendUnique(KoishiAddUsingList, serviceName)(obj.constructor);
}
const dec = Metadata.set(
KoishiServiceInjectSym,
serviceName,
KoishiServiceInjectSymKeys,
);
return dec(obj, key);
};
}
export function Provide(
name: ServiceName,
options?: ProvideOptions,
): ClassDecorator {
Context.service(name, options);
return Metadata.append(KoishiServiceProvideSym, {
...options,
serviceName: name,
});
}
const InjectSystem = (fun: SystemInjectFun) =>
Metadata.set(KoishiSystemInjectSym, fun, KoishiSystemInjectSymKeys);
export const InjectContext = (select?: Selection) =>
InjectSystem((obj) => {
if (select) {
return selectContext(obj.__ctx, select);
} else {
return obj.__ctx;
}
});
export const InjectApp = () => InjectSystem((obj) => obj.__ctx.app);
export const InjectConfig = () => InjectSystem((obj) => obj.__config);
export const InjectLogger = (name?: string) =>
InjectSystem((obj) => obj.__ctx.logger(name || obj.constructor.name));
export const InjectParent = () => InjectSystem((obj) => obj.__ctx.__parent);
export const Caller = () =>
InjectSystem((obj) => {
const targetCtx: Context = obj[Context.current] || obj.__ctx;
return targetCtx;
});
export function UsingService(
...services: ServiceName[]
): ClassDecorator & MethodDecorator {
return (obj, key?, des?) => {
for (const service of services) {
if (!key) {
// fallback to KoishiAddUsingList
Metadata.appendUnique(KoishiAddUsingList, service)(obj);
} else {
const dec = CallbackLayer((ctx, cb) => {
ctx.plugin({
name: `${ctx.state.runtime.uid}_${key.toString()}`,
using: services,
apply: cb,
});
});
dec(obj, key, des);
}
}
};
}
export const PluginSchema = (schema: Schema | ClassType<any>) =>
Metadata.set('KoishiPredefineSchema', schema);
export const PluginName = (name: string) =>
Metadata.set('KoishiPredefineName', name);
export const If = <T>(
func: Condition<boolean, T, [Record<string, any>]>,
): MethodDecorator =>
Metadata.append('KoishiControl', { type: 'if', condition: func });
export const For = <T>(
func: Condition<Iterable<Record<string, any>>, T, [Record<string, any>]>,
): MethodDecorator =>
Metadata.append('KoishiControl', { type: 'for', condition: func });
export const UseModel = (...models: ModelClassType[]): ClassDecorator =>
TopLevelAction((ctx) => {
const registrar = new ModelRegistrar(ctx.model);
models.forEach((m) => registrar.registerModel(m));
});
export const MixinModel = <K extends Keys<Tables>>(
tableName: K,
classDict: {
[F in Keys<Tables[K]>]?: ModelClassType<Flatten<Tables[K][F]>>;
},
): ClassDecorator =>
TopLevelAction((ctx) => {
const registrar = new ModelRegistrar(ctx.model);
registrar.mixinModel(tableName, classDict);
});
export const Fork = (forkPlugin: PluginClass) =>
Metadata.set('KoishiFork', forkPlugin);
export const Reusable = (value = true) => Metadata.set('KoishiReusable', value);
import { koishiRegistrar } from '../registrar';
import {
CommandConfigExtended,
CommandLocaleDef,
CommandOptionConfigWithDescription,
CommandReturnType,
} from '../def';
import {
adaptLocaleDict,
applyOptionToCommand,
registerTemplate,
} from '../utility/utility';
import { Argv, Command, Dict, FieldCollector, Session, User } from 'koishi';
import { applyNativeTypeToArg } from '../utility/native-type-mapping';
import { TypedMethodDecorator } from 'satori-decorators';
export * from 'satori-decorators/dist/src/decorators/common';
const methodDecorators = koishiRegistrar.methodDecorators();
export const { UseEvent, UseBeforeEvent, UseMiddleware } = methodDecorators;
export function UseCommand<D extends string>(
def: D,
config?: CommandConfigExtended,
): TypedMethodDecorator<(...args: any[]) => CommandReturnType>;
export function UseCommand<D extends string>(
def: D,
desc: string,
config?: CommandConfigExtended,
): TypedMethodDecorator<(...args: any[]) => CommandReturnType>;
export function UseCommand(
...args:
| [string, CommandConfigExtended?]
| [string, string, CommandConfigExtended?]
): TypedMethodDecorator<(...args: any[]) => CommandReturnType> {
return methodDecorators.UseCommand(...args);
}
export const CommandLocale = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, locale: string, def: CommandLocaleDef) => {
ctx.i18n.define(locale, `commands.${cmd.name}`, def);
return cmd;
},
);
export const CommandDescription = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, desc: string | Dict<string>) => {
for (const localData of Object.entries(adaptLocaleDict(desc))) {
const [locale, text] = localData;
ctx.i18n.define(locale, `commands.${cmd.name}.description`, text);
}
return cmd;
},
);
export const CommandAlias = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, ...names: string[]) => cmd.alias(...names),
);
export const CommandShortcut = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, name: string | RegExp, config: Command.Shortcut = {}) =>
cmd.shortcut(name, config),
);
export const CommandUsage = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, text: Command.Usage) => cmd.usage(text),
);
export const CommandExample = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, text: string) => cmd.example(text),
);
export const CommandOption = koishiRegistrar.decorateCommandTransformer(
(
ctx,
cmd,
name: string,
desc: string,
config: CommandOptionConfigWithDescription = {},
) => applyOptionToCommand(ctx, cmd, { name, desc, config }),
);
export const CommandUserFields = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, fields: FieldCollector<'user'>) => cmd.userFields(fields),
);
export const CommandChannelFields = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, fields: FieldCollector<'channel'>) => cmd.channelFields(fields),
);
export const CommandBefore = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, callback: Command.Action, append = false) =>
cmd.before(callback, append),
);
export const CommandAction = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, callback: Command.Action, prepend = false) =>
cmd.action(callback, prepend),
);
export const CommandTemplate = koishiRegistrar.decorateCommandTransformer(
(ctx, cmd, name: string, text: string | Dict<string>) => {
registerTemplate({ name, text: adaptLocaleDict(text) }, ctx, cmd);
return cmd;
},
);
export const PutValue = koishiRegistrar.decorateCommandPut((data, v: any) => v);
export const PutArgv = koishiRegistrar.decorateCommandPut(
(data, field?: keyof Argv) => (field ? data.argv[field] : data.argv),
);
export const PutSession = koishiRegistrar.decorateCommandPut(
(data, field?: keyof Session) =>
field ? data.argv.session[field] : data.argv.session,
);
export const PutContext = koishiRegistrar.decorateCommandPut(
(data) => data.ctx,
);
export const PutCommand = koishiRegistrar.decorateCommandPut(
(data) => data.command,
);
export const PutArg = koishiRegistrar.decorateCommandPut(
(data, index: number, decl?: Argv.Declaration) => data.args[index],
(data, index, decl) => {
const cmd = data.command;
let arg = cmd._arguments[index];
if (!arg) {
arg = {};
cmd._arguments[index] = arg;
}
applyNativeTypeToArg(arg, data.nativeType);
if (decl) {
Object.assign(arg, decl);
}
},
);
export const PutArgs = koishiRegistrar.decorateCommandPut((data) => data.args);
export const PutOption = koishiRegistrar.decorateCommandPut(
(
data,
name: string,
desc: string,
config?: CommandOptionConfigWithDescription,
) => data.argv.options[name],
(data, name, desc, config) =>
applyOptionToCommand(
data.ctx,
data.command,
{
name,
desc,
config: config || {},
},
data.nativeType,
),
);
export const PutUser = koishiRegistrar.decorateCommandPut(
(data, field: FieldCollector<'user'>) => data.argv.session.user,
(data, field) => data.command.userFields(field),
);
export const PutChannel = koishiRegistrar.decorateCommandPut(
(data, field: FieldCollector<'channel'>) => data.argv.session.channel,
(data, field) => data.command.channelFields(field),
);
export const PutGuild = koishiRegistrar.decorateCommandPut(
(data, field: FieldCollector<'channel'>) => data.argv.session.guild,
(data, field) => data.command.channelFields(field),
);
export const PutUserName = koishiRegistrar.decorateCommandPut(
(data, useDatabase?: boolean) => {
const { argv } = data;
if (useDatabase) {
const user = argv.session.user as User.Observed<'name'>;
if (user?.name) {
return user?.name;
}
}
return (
argv.session.author?.nickname ||
argv.session.author?.username ||
argv.session.userId
);
},
(data, useDatabase) => {
if (useDatabase !== false) {
data.command.userFields(['name']);
}
},
);
export const PutUserId = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.userId,
);
export const PutChannelName = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.channelName,
);
export const PutChannelId = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.channelId,
);
export const PutGuildName = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.guildName,
);
export const PutGuildId = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.guildId,
);
export const PutBot = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.bot,
);
export const PutSelfId = koishiRegistrar.decorateCommandPut(
(data) => data.argv.session.selfId,
);
export const PutNext = koishiRegistrar.decorateCommandPut(
(data) => data.argv.next,
);
export const PutRenderer = koishiRegistrar.decorateCommandPut(
(data, path?: string) =>
path
? // eslint-disable-next-line @typescript-eslint/ban-types
(params: object) => data.argv.session.text(path, params)
: // eslint-disable-next-line @typescript-eslint/ban-types
(path: string, params: object) => data.argv.session.text(path, params),
);
export const PutCommonRenderer = PutRenderer;
export const PutTemplate = koishiRegistrar.decorateCommandPut(
// eslint-disable-next-line @typescript-eslint/ban-types
(data, name: string, text: string | Dict<string>) => (params: object) =>
data.argv.session.text(`.${name}`, params),
(data, name, text) =>
registerTemplate(
{
name,
text: adaptLocaleDict(text),
},
data.ctx,
data.command,
),
);
export const PutObject = koishiRegistrar.decorateCommandPut(
(data) => {
const targetClass = data.nativeType as { new (): any };
if (!targetClass) {
return;
}
const instance = new targetClass();
const keys = koishiRegistrar.reflector.getArray(
'KoishiCommandPutObjectKeys',
instance,
);
for (const key of keys) {
const meta = koishiRegistrar.reflector.get(
'KoishiCommandPutObject',
instance,
key,
);
if (meta) {
const propertyNativeType = Reflect.getMetadata(
'design:type',
targetClass.prototype,
key,
);
instance[key] = meta.run(data.view, {
...data,
nativeType: propertyNativeType,
});
}
}
return instance;
},
(data) => {
const targetClass = data.nativeType as { new (): any };
if (!targetClass) {
return;
}
const keys = koishiRegistrar.reflector.getArray(
'KoishiCommandPutObjectKeys',
targetClass,
);
for (const key of keys) {
const meta = koishiRegistrar.reflector.get(
'KoishiCommandPutObject',
targetClass,
key,
)?.info?.pre;
if (meta) {
const propertyNativeType = Reflect.getMetadata(
'design:type',
targetClass.prototype,
key,
);
meta.run(data.view, {
...data,
nativeType: propertyNativeType,
});
}
}
},
);
export * from 'satori-decorators/dist/src/decorators/http';
export * from './common';
export * from './http';
export * from './plugin';
import { koishiRegistrar } from '../registrar';
import { ModelClassType, ModelRegistrar } from 'minato-decorators';
import { Flatten, Keys, Tables } from 'koishi';
export * from 'satori-decorators/dist/src/decorators/plugin';
export const { DefinePlugin } = koishiRegistrar.pluginDecorators();
export const UseModel = koishiRegistrar.decorateTopLevelAction(
(ctx, obj, ...models: ModelClassType[]) => {
const registrar = new ModelRegistrar(ctx.model);
models.forEach((m) => registrar.registerModel(m));
},
);
export const MixinModel = <K extends Keys<Tables>>(
tableName: K,
classDict: {
[F in Keys<Tables[K]>]?: ModelClassType<Flatten<Tables[K][F]>>;
},
): ClassDecorator =>
koishiRegistrar.decorateTopLevelAction((ctx, obj) => {
const registrar = new ModelRegistrar(ctx.model);
registrar.mixinModel(tableName, classDict);
})();
// metadatas
import { Schema } from 'koishi';
import {
ControlType,
PluginClass,
ProvideDefinition,
ServiceName,
SystemInjectFun,
} from './interfaces';
import { ClassType } from 'schemastery-gen';
export const KoishiServiceInjectSym = 'KoishiServiceInjectSym';
export const KoishiServiceInjectSymKeys = 'KoishiServiceInjectSymKeys';
export const KoishiServiceProvideSym = 'KoishiServiceProvideSym';
export const KoishiSystemInjectSym = 'KoishiSystemInjectSym';
export const KoishiSystemInjectSymKeys = 'KoishiSystemInjectSymKeys';
export const KoishiAddUsingList = 'KoishiAddUsingList';
// metadata map
export interface MetadataArrayMap {
KoishiServiceProvideSym: ProvideDefinition;
KoishiServiceInjectSymKeys: string;
KoishiSystemInjectSymKeys: string;
KoishiAddUsingList: ServiceName;
KoishiControl: ControlType;
}
export interface MetadataMap {
KoishiServiceInjectSym: ServiceName;
KoishiSystemInjectSym: SystemInjectFun;
KoishiPredefineSchema: Schema | ClassType<any>;
KoishiPredefineName: string;
KoishiFork: PluginClass;
KoishiReusable: boolean;
}
export const ThirdEyeSym = Symbol('ThirdEyeSym');
export * from './interfaces';
export * from './constants';
import { Context, Dict } from 'koishi';
import { PluginMeta } from '../register';
import { Selection } from 'koishi-decorators';
import { Argv, Command, Context, Dict, I18n } from 'koishi';
import { CanBeObserved } from '../utility/rxjs-session';
export * from 'koishi-decorators/dist/src/def/interfaces';
type CommandReg<A extends any[] = any[], R = any> = (
ctx: Context,
command: Command,
...args: A
) => R;
export type CommandTransformer<A extends any[] = any[]> = CommandReg<
A,
Command
>;
export interface CommandPutData {
ctx: Context;
command: Command;
// eslint-disable-next-line @typescript-eslint/ban-types
nativeType: Function;
view: any;
}
// Command stuff
export interface CommandPutRuntime extends CommandPutData {
args: any[];
argv: Argv;
}
export type SystemInjectFun = <T = any>(
obj: PluginMeta<T>,
cl: PluginClass,
export type CommandPutPre<A extends any[] = any[]> = (
data: CommandPutData,
...args: A
) => any;
export type ServiceName = keyof Context | string;
export type CommandPut<A extends any[] = any[]> = (
data: CommandPutRuntime,
...args: A
) => any;
export interface ProvideOptions extends Context.ServiceOptions {
immediate?: boolean;
export interface CommandConfigExtended extends Command.Config {
empty?: boolean;
}
export interface ProvideDefinition extends ProvideOptions {
serviceName: ServiceName;
export interface CommandOptionConfigWithDescription extends Argv.OptionConfig {
description?: string | Dict<string>;
}
export type Condition<R, T = any, Ext extends any[] = []> = (
o: T,
...ext: Ext
) => R;
export interface Instances<T> {
instances: T[];
export interface CommandLocaleDef extends I18n.Store {
description?: string;
options?: Dict<string>;
usage?: string;
examples?: string;
messages?: I18n.Store;
}
export type TypeFromClass<T> = T extends { new (...args: any[]): infer U }
? U
: never;
// eslint-disable-next-line @typescript-eslint/ban-types
export type Renderer<T = any> = (params?: T) => string;
// eslint-disable-next-line @typescript-eslint/ban-types
export type CRenderer = (path: string, params?: object) => string;
export type ParamsFromClass<T> = T extends { new (...args: infer U): any }
? U
: never;
export type PluginClass<C = any, P = any> = new (ctx: Context, config: C) => P;
export type ClassPluginConfig<P extends PluginClass> = P extends PluginClass<
infer C
>
? C
: never;
export type ExactClassPluginConfig<P extends PluginClass> =
P extends PluginClass<any, { config: infer IC }> ? IC : ClassPluginConfig<P>;
export interface TemplateConfig {
name: string;
text: Dict<string>;
}
export type MapPluginToConfig<M extends Dict<PluginClass>> = {
[K in keyof M]: ClassPluginConfig<M[K]>;
};
export interface CommandArgDef {
index: number;
decl?: Argv.Declaration;
}
export type MapPluginToConfigWithSelection<M extends Dict<PluginClass>> = {
[K in keyof M]: ClassPluginConfig<M[K]> & Selection;
};
export interface CommandRegisterConfig<D extends string = string> {
def: D;
desc?: string;
config?: CommandConfigExtended;
// putOptions?: CommandPut.Config[];
// eslint-disable-next-line @typescript-eslint/ban-types
paramTypes: Function[];
}
export interface ControlTypeMap {
if: boolean;
for: Iterable<Record<string, any>>;
export interface CommandConfigExtended extends Command.Config {
empty?: boolean;
}
export interface ControlType<
T extends keyof ControlTypeMap = keyof ControlTypeMap,
> {
type: T;
condition: Condition<ControlTypeMap[T], any, [Record<string, any>]>;
export interface CommandOptionConfig {
name: string;
desc: string;
config?: CommandOptionConfigWithDescription;
}
export type Prop<T> = T;
export type CommandReturnType = CanBeObserved<string | void>;
import 'reflect-metadata';
import { Reflector } from 'typed-reflector';
import { MetadataArrayMap, MetadataMap } from '../def';
export const reflector = new Reflector<MetadataMap, MetadataArrayMap>();
import 'reflect-metadata';
import { MetadataSetter } from 'typed-reflector';
import { MetadataArrayMap, MetadataMap } from '../def';
export const Metadata = new MetadataSetter<MetadataMap, MetadataArrayMap>();
import { Context } from 'koishi';
import { AnyClass, ClassType, Mixin } from 'schemastery-gen';
import { PluginSchema } from './decorators';
import { PartialDeep } from './base-plugin';
import { PluginClass } from './def';
export function CreatePluginFactory<C, IC, P extends { config: IC }>(
basePlugin: PluginClass<C, P>,
baseConfig: ClassType<IC>,
): <S>(specificConfig?: ClassType<S>) => new (
ctx: Context,
config: PartialDeep<S> & C,
) => P & {
config: IC & S;
};
export function CreatePluginFactory(
basePlugin: PluginClass,
baseConfig: AnyClass,
) {
return (specificConfig: AnyClass) => {
const plugin = class specificPlugin extends basePlugin {};
const config = specificConfig
? Mixin(specificConfig, baseConfig)
: baseConfig;
PluginSchema(config)(plugin);
return plugin;
};
}
export * from './map-plugin';
export * from './multi-plugin';
export * from './merge-plugin';
import { Dict } from 'koishi';
import { MapPluginToConfigWithSelection, PluginClass } from '../def';
import { ClassType, SchemaProperty } from 'schemastery-gen';
import { CreatePluginFactory } from '../plugin-factory';
import { MappingPluginBase } from './mapping-base';
import { getPluginSchema } from '../utility/get-schema';
function MappedConfig<M extends Dict<PluginClass>>(
dict: M,
): ClassType<MapPluginToConfigWithSelection<M>> {
const PropertySchema = class SpecificPropertySchema {} as ClassType<
MapPluginToConfigWithSelection<M>
>;
for (const [key, plugin] of Object.entries(dict)) {
SchemaProperty({
type: getPluginSchema(plugin),
})(PropertySchema.prototype, key);
}
return PropertySchema;
}
export function MapPlugin<M extends Dict<PluginClass>, OuterConfig>(
dict: M,
outerConfig?: ClassType<OuterConfig>,
) {
const basePlugin = class SpecificMapPlugin extends MappingPluginBase<
M,
MapPluginToConfigWithSelection<M>,
Partial<MapPluginToConfigWithSelection<M>>
> {
_getDict() {
return dict;
}
_getPluginConfig(key: keyof M): any {
return this.config[key];
}
};
const schema = MappedConfig(dict);
const factory = CreatePluginFactory(basePlugin, schema);
return factory(outerConfig);
}
import { Dict } from 'koishi';
import { PluginClass } from '../../def';
import { BasePlugin, PartialDeep } from '../../base-plugin';
import { LifecycleEvents } from '../../register';
import { ClonePlugin } from '../../utility/clone-plugin';
import { Apply, selectContext, UseEvent } from 'koishi-decorators';
export class MappingPluginBase<
M extends Dict<PluginClass>,
C,
PC = PartialDeep<C>,
>
extends BasePlugin<C, PC>
implements LifecycleEvents
{
_getDict(): M {
throw new Error('not implemented');
}
_instanceMap = new Map<string, PluginClass>();
getInstance<K extends keyof M>(key: K): M[K] {
return this._instanceMap?.get(key as string) as M[K];
}
_getPluginConfig(key: keyof M): any {
return {};
}
@Apply()
_registerInstances() {
const dict = this._getDict();
for (const [key, plugin] of Object.entries(dict)) {
const config = this._getPluginConfig(key);
if (config == null) continue;
const ctx =
typeof config === 'object' ? selectContext(this.ctx, config) : this.ctx;
const clonedPlugin = ClonePlugin(
plugin,
`${this.constructor.name}_${plugin.name}_dict_${key}`,
(o) => this._instanceMap.set(key, o),
);
ctx.plugin(clonedPlugin, config);
}
}
onApply() {}
@UseEvent('dispose')
_onThingsDispose() {
delete this._instanceMap;
}
}
import { MapPluginToConfig, PluginClass } from '../def';
import { Dict } from 'koishi';
import { ClassType, Mixin } from 'schemastery-gen';
import { MappingPluginBase } from './mapping-base';
import { CreatePluginFactory } from '../plugin-factory';
import _ from 'lodash';
import { getPluginSchema } from '../utility/get-schema';
type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (
x: infer R,
) => any
? R
: never;
type MergePluginConfig<M extends Dict<PluginClass>> = UnionToIntersection<
MapPluginToConfig<M>[keyof M]
>;
export function MergePlugin<M extends Dict<PluginClass>, OuterConfig>(
dict: M,
outerConfig?: ClassType<OuterConfig>,
) {
const basePlugin = class SpecificMapPlugin extends MappingPluginBase<
M,
MergePluginConfig<M>,
MergePluginConfig<M>
> {
_getDict() {
return dict;
}
_getPluginConfig(key: keyof M): any {
return this.config;
}
};
const schemas = _.compact(
Object.values(dict).map((plugin) => getPluginSchema(plugin)),
);
const factory = CreatePluginFactory(basePlugin, Mixin(...schemas));
return factory(outerConfig);
}
import { ClonePlugin } from '../utility/clone-plugin';
import { selectContext, Selection } from 'koishi-decorators';
import { BasePlugin } from '../base-plugin';
import {
ClassPluginConfig,
Instances,
PluginClass,
ServiceName,
TypeFromClass,
} from '../def';
import { ClassType } from 'schemastery-gen';
import { ToInstancesConfig } from '../utility/to-instance-config';
import Schema from 'schemastery';
import { UsingService } from '../decorators';
import { Apply, UseEvent } from 'koishi-decorators';
import { CreatePluginFactory } from '../plugin-factory';
import { LifecycleEvents } from '../register';
export class MultiInstancePluginFramework<InnerPlugin extends PluginClass>
extends BasePlugin<
Instances<ClassPluginConfig<InnerPlugin>>,
Instances<ClassPluginConfig<InnerPlugin> & Selection>
>
implements LifecycleEvents
{
instances: TypeFromClass<InnerPlugin>[] = [];
_getInnerPlugin(): InnerPlugin {
throw new Error(`Not implemented`);
}
@Apply()
_registerInstances() {
const innerPlugin = this._getInnerPlugin();
for (let i = 0; i < this.config.instances.length; i++) {
const clonedInnerPlugin = ClonePlugin(
innerPlugin,
`${this.constructor.name}_${innerPlugin.name}_instance_${i}`,
(instance) => this.instances.push(instance),
);
const instanceConfig = this.config.instances[i];
const instanceContext =
typeof instanceConfig === 'object'
? selectContext(this.ctx, instanceConfig)
: this.ctx;
instanceContext.plugin(clonedInnerPlugin, instanceConfig);
}
}
@UseEvent('dispose')
_onThingsDispose() {
delete this.instances;
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
onApply() {}
}
export function MultiInstancePlugin<
InnerPlugin extends PluginClass,
OuterConfig,
>(innerPlugin: InnerPlugin, outerConfig?: ClassType<OuterConfig>) {
const basePlugin = class SpecificMultiInstancePlugin extends MultiInstancePluginFramework<InnerPlugin> {
_getInnerPlugin() {
return innerPlugin;
}
};
const schema = ToInstancesConfig(
(innerPlugin['Config'] ||
innerPlugin['schema'] ||
Schema.any()) as ClassType<ClassPluginConfig<InnerPlugin>>,
);
const factory = CreatePluginFactory(basePlugin, schema);
const plugin = factory(outerConfig);
if (innerPlugin['using']) {
UsingService(...(innerPlugin['using'] as ServiceName[]))(plugin);
}
return plugin;
}
import { Context, Schema, WebSocketLayer } from 'koishi';
import {
ControlType,
KoishiAddUsingList,
KoishiServiceInjectSym,
KoishiServiceInjectSymKeys,
KoishiServiceProvideSym,
KoishiSystemInjectSym,
KoishiSystemInjectSymKeys,
PluginClass,
ServiceName,
ThirdEyeSym,
} from './def';
import { reflector } from './meta/meta-fetch';
import { SchemaClass } from 'schemastery-gen';
import _ from 'lodash';
import { Registrar, Type } from 'koishi-decorators';
import { PluginName, PluginSchema, UsingService } from './decorators';
import { getFork } from './utility/get-fork';
export interface KoishiPluginRegistrationOptions<T = any> {
name?: string;
schema?: Schema<T> | Type<T>;
Config?: Schema<T> | Type<T>;
using?: ServiceName[];
reusable?: boolean;
}
export interface PluginMeta<T = any> {
__ctx: Context;
__config: T;
__registrar: Registrar;
__pluginOptions: KoishiPluginRegistrationOptions<T>;
__promisesToWaitFor: Promise<void>[];
__disposables: (() => void)[];
}
export interface OnApply {
onApply(): void;
}
export interface OnConnect {
onConnect(): void | Promise<void>;
}
export interface OnDisconnect {
onDisconnect(): void | Promise<void>;
}
export interface LifecycleEvents {
onApply?(): void;
onConnect?(): void | Promise<void>;
onDisconnect?(): void | Promise<void>;
onFork?(instance: any): void | Promise<void>;
onForkDisconnect?(instance: any): void | Promise<void>;
}
declare module 'koishi' {
interface Context {
__parent?: any;
}
}
export function DefinePlugin<T>(
options?: KoishiPluginRegistrationOptions<T>,
): <C extends PluginClass<T>>(
plugin: C,
) => C & KoishiPluginRegistrationOptions<T>;
export function DefinePlugin<T>(
options: KoishiPluginRegistrationOptions<T> = {},
) {
return function <
C extends {
new (...args: any[]): any;
},
>(originalClass: C) {
if (options.name) {
PluginName(options.name)(originalClass);
}
if (options.schema) {
PluginSchema(options.schema)(originalClass);
}
if (options.using) {
UsingService(...options.using)(originalClass);
}
if (originalClass[ThirdEyeSym]) {
return originalClass;
}
const newClass = class extends originalClass implements PluginMeta {
static get Config() {
const schemaType = reflector.get('KoishiPredefineSchema', newClass);
return schemaType ? SchemaClass(schemaType) : undefined;
}
static get using() {
let list = reflector.getArray(KoishiAddUsingList, newClass);
const fork = getFork(newClass);
if (fork) {
list = [...list, ...fork.using];
}
return _.uniq(list);
}
static get reusable() {
return reflector.get('KoishiReusable', newClass);
}
__ctx: Context;
__config: T;
__pluginOptions: KoishiPluginRegistrationOptions<T>;
__registrar: Registrar;
__promisesToWaitFor: Promise<void>[];
__disposables: (() => void)[];
_handleSystemInjections() {
const injectKeys = reflector.getArray(KoishiSystemInjectSymKeys, this);
for (const key of injectKeys) {
const valueFunction = reflector.get(KoishiSystemInjectSym, this, key);
if (!valueFunction) {
continue;
}
Object.defineProperty(this, key, {
configurable: true,
enumerable: true,
get: () => valueFunction(this, newClass),
});
}
}
_handleServiceInjections() {
const injectKeys = reflector.getArray(KoishiServiceInjectSymKeys, this);
for (const key of injectKeys) {
const name = reflector.get(KoishiServiceInjectSym, this, key);
if (!name) {
continue;
}
Object.defineProperty(this, key, {
enumerable: true,
configurable: true,
get: () => {
return this.__ctx[name];
},
set: (val: any) => {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
this.__ctx[name] = val;
},
});
}
}
_registerDeclarationsProcess(
ctx: Context,
methodKey: keyof C & string,
view: Record<string, any> = {},
) {
const result = this.__registrar.register(ctx, methodKey, false, view);
const type = result?.type;
if (type === 'ws') {
const layer = result.result as WebSocketLayer;
ctx.on('dispose', () => layer.close());
} else {
const mayBePromise = result?.result;
if (mayBePromise instanceof Promise) {
this.__promisesToWaitFor.push(mayBePromise);
}
}
}
_registerDeclarationsWithStack(
ctx: Context,
methodKey: keyof C & string,
stack: ControlType[],
existing: Record<string, any> = {},
) {
if (!stack.length) {
return this._registerDeclarationsProcess(ctx, methodKey, existing);
}
const rest = [...stack];
const control = rest.pop();
switch (control.type) {
case 'if':
if (!(control as ControlType<'if'>).condition(this, existing))
return;
return this._registerDeclarationsWithStack(
ctx,
methodKey,
rest,
existing,
);
case 'for':
for (const view of (control as ControlType<'for'>).condition(
this,
existing,
)) {
this._registerDeclarationsWithStack(ctx, methodKey, rest, {
...existing,
...view,
});
}
return;
}
}
_registerDeclarationsFor(ctx: Context, methodKey: keyof C & string) {
const scopeCtx = this.__registrar.getScopeContext(
this.__ctx,
methodKey,
false,
);
const stack = reflector.getArray('KoishiControl', this, methodKey);
const sub = this.__registrar
.runLayers(
scopeCtx,
(innerCtx) =>
this._registerDeclarationsWithStack(innerCtx, methodKey, stack),
methodKey,
)
.subscribe();
scopeCtx.on('dispose', () => sub.unsubscribe());
}
_registerDeclarations() {
const methodKeys =
this.__registrar.getAllFieldsToRegister() as (keyof C & string)[];
const sub = this.__registrar
.runLayers(this.__ctx, (innerCtx) =>
methodKeys.forEach((methodKey) =>
this._registerDeclarationsFor(innerCtx, methodKey),
),
)
.subscribe();
this.__disposables.push(() => sub.unsubscribe());
}
_getProvidingServices() {
return reflector.getArray(KoishiServiceProvideSym, this);
}
_handleServiceProvide(immediate: boolean) {
const providingServices = this._getProvidingServices().filter(
(serviceDef) => !serviceDef.immediate === !immediate,
);
for (const key of providingServices) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
this.__ctx[key.serviceName] = this as any;
}
}
_uninstallServiceProvide() {
const providingServices = this._getProvidingServices();
for (const key of providingServices) {
if (this.__ctx[key.serviceName] === (this as never)) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
this.__ctx[key.serviceName] = null;
}
}
}
_registerAfterInit() {
this.__ctx.on('ready', async () => {
if (this.__promisesToWaitFor.length) {
await Promise.all(this.__promisesToWaitFor);
this.__promisesToWaitFor = [];
}
if (typeof this.onConnect === 'function') {
await this.onConnect();
}
this._handleServiceProvide(false);
});
this.__ctx.on('dispose', async () => {
this._uninstallServiceProvide();
if (typeof this.onDisconnect === 'function') {
await this.onDisconnect();
}
this.__disposables.forEach((dispose) => dispose());
delete this.__ctx;
delete this.__config;
delete this.__pluginOptions;
delete this.__registrar;
delete this.__promisesToWaitFor;
delete this.__disposables;
});
}
_initializeFork() {
const fork = getFork(this);
if (!fork) {
return;
}
this.__ctx.on('fork', (ctx, options) => {
ctx.__parent = this;
const instance = new fork(ctx, options);
ctx.on('dispose', () => {
if (typeof this.onForkDisconnect === 'function') {
this.onForkDisconnect(instance);
}
delete ctx.__parent;
});
if (typeof this.onFork === 'function') {
this.onFork(instance);
}
});
}
_initializePluginClass() {
this._handleSystemInjections();
this._handleServiceInjections();
this.__registrar.performTopActions(this.__ctx);
this._registerDeclarations();
if (typeof this.onApply === 'function') {
this.onApply();
}
this._handleServiceProvide(true);
this._initializeFork();
this._registerAfterInit();
}
constructor(...args: any[]) {
const originalCtx: Context = args[0];
const config = args[1];
const ctx = new Registrar(newClass).getScopeContext(originalCtx);
super(ctx, config, ...args.slice(2));
this.__ctx = ctx;
this.__config = config;
this.__pluginOptions = options;
this.__registrar = new Registrar(this, undefined, config);
this.__promisesToWaitFor = [];
this.__disposables = [];
this._initializePluginClass();
}
};
Object.defineProperty(newClass, 'name', {
enumerable: true,
configurable: true,
get: () => {
const nameFromMeta = reflector.get('KoishiPredefineName', newClass);
if (nameFromMeta) {
return nameFromMeta;
}
const nameFromFork = getFork(newClass)?.name;
if (nameFromFork) {
return nameFromFork;
}
return originalClass.name;
},
});
newClass[ThirdEyeSym] = true;
return newClass;
};
}
export const KoishiPlugin = DefinePlugin;
import { RegisterMeta, SatoriRegistrar } from 'satori-decorators';
import { BeforeEventMap, Command, Context, Next, Session } from 'koishi';
import { CanBeObserved, sessionRxToPromise } from './utility/rxjs-session';
import {
CommandConfigExtended,
CommandPut,
CommandPutPre,
CommandReturnType,
CommandTransformer,
} from './def';
type PutMeta = RegisterMeta<CommandPut, { pre?: RegisterMeta<CommandPutPre> }>;
declare module 'satori-decorators' {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Registrar {
interface MetadataMap {
KoishiCommandPutObject: PutMeta;
}
interface MetadataArrayMap {
KoishiCommandTransformer: RegisterMeta<CommandTransformer>;
KoishiCommandPut: PutMeta;
KoishiCommandPutObjectKeys: string;
}
}
}
export class KoishiRegistrar extends SatoriRegistrar<Context> {
decorateCommandTransformer<A extends any[]>(
transformer: CommandTransformer<A>,
) {
return (...args: A): ClassDecorator & MethodDecorator =>
this.metadata.append(
'KoishiCommandTransformer',
new RegisterMeta(transformer, args),
);
}
decorateCommandPut<A extends any[]>(
put: CommandPut<A>,
pre?: CommandPutPre<A>,
) {
return (...args: A): ParameterDecorator & PropertyDecorator =>
(obj, key, i?) => {
const meta = new RegisterMeta(put, args, {
pre: pre && new RegisterMeta(pre, args),
});
if (typeof i === 'number') {
this.metadata.param('KoishiCommandPut', meta)(obj, key, i);
} else {
this.metadata.set(
'KoishiCommandPutObject',
meta,
'KoishiCommandPutObjectKeys',
)(obj, key, i);
}
};
}
override methodDecorators() {
return {
...super.methodDecorators(),
UseMiddleware: this.decorateMethod(
'middleware',
(
{ ctx },
fun: (session: Session, next: Next) => CanBeObserved<string>,
prepend?: boolean,
) =>
ctx.middleware(
(s, next) => sessionRxToPromise(s, fun(s, next)),
prepend,
),
),
UseBeforeEvent: this.decorateMethod(
'before',
(
{ ctx },
fun: BeforeEventMap[keyof BeforeEventMap],
event: keyof BeforeEventMap,
append?: boolean,
) => ctx.before(event, fun, append),
),
UseCommand: this.decorateMethod(
'command',
(
info,
fun: (...args: any[]) => CommandReturnType,
...args:
| [string, CommandConfigExtended?]
| [string, string, CommandConfigExtended?]
) => {
const { ctx, view, obj, key } = info;
const def = args.shift() as string;
const desc =
typeof args[0] === 'string' ? (args.shift() as string) : '';
const config = args[0] as CommandConfigExtended;
const transformers = this.reflector.getProperty(
'KoishiCommandTransformer',
obj,
key,
);
let command: Command = ctx.command(def, desc, config);
for (const transformer of transformers) {
command = transformer.run(view, ctx, command) || command;
}
if (config?.empty) {
return command;
}
// eslint-disable-next-line @typescript-eslint/ban-types
const paramTypes: Function[] = Reflect.getMetadata(
'design:paramtypes',
obj,
key,
);
const putOptions = this.reflector.getArray(
'KoishiCommandPut',
obj,
key,
);
for (let i = 0; i < putOptions.length; i++) {
const prePutOption = putOptions[i]?.info?.pre;
if (!prePutOption) {
continue;
}
const nativeType = paramTypes[i];
prePutOption.run(view, { ctx, command, nativeType, view });
}
command.action(async (argv, ...args) => {
const params = putOptions.map((option, i) =>
option?.run(view, {
ctx,
command,
nativeType: paramTypes[i],
argv,
args,
view,
}),
);
return sessionRxToPromise(
argv.session,
fun(...params) as CanBeObserved<string>,
);
});
return command;
},
),
};
}
}
export const koishiRegistrar = new KoishiRegistrar(Context);
export const StarterPlugin = koishiRegistrar.starterPluginFactory();
import { TypeFromClass } from '../def';
export function ClonePlugin<P extends { new (...args: any[]): any }>(
target: P,
name: string,
callback?: (instance: TypeFromClass<P>) => void,
): P {
const clonedPlugin = class extends target {
constructor(...args: any[]) {
super(...args);
if (callback) {
callback(this as any);
}
}
};
for (const property of ['Config', 'schema', 'using']) {
Object.defineProperty(clonedPlugin, property, {
enumerable: true,
configurable: true,
writable: true,
value: target[property],
});
}
Object.defineProperty(clonedPlugin, 'name', {
enumerable: true,
configurable: true,
writable: true,
value: name,
});
return clonedPlugin;
}
import { reflector } from '../meta/meta-fetch';
import { DefinePlugin } from '../register';
export function getFork(obj: any) {
const fork = reflector.get('KoishiFork', obj);
if (!fork) {
return;
}
return DefinePlugin()(fork);
}
import { PluginClass } from '../def';
import { BasePlugin } from '../base-plugin';
import { ClassType } from 'schemastery-gen';
import { reflector } from '../meta/meta-fetch';
export function getPluginSchema<P extends PluginClass>(
plugin: P,
): ClassType<
P extends BasePlugin<any, infer PC>
? PC
: P extends PluginClass<infer C>
? C
: never
> {
return (
plugin['Config'] ||
plugin['schema'] ||
reflector.get('KoishiPredefineSchema', plugin)
);
}
import { Argv } from 'koishi';
// eslint-disable-next-line @typescript-eslint/ban-types
export const nativeTypeMapping = new Map<Function, Argv.Type>();
nativeTypeMapping.set(String, 'string');
nativeTypeMapping.set(Number, 'number');
nativeTypeMapping.set(Boolean, 'boolean');
nativeTypeMapping.set(Date, 'date');
export function applyNativeTypeToArg(
arg: Argv.Declaration,
// eslint-disable-next-line @typescript-eslint/ban-types
nativeType: Function,
) {
if (arg.type || !nativeType) {
return;
}
if (nativeTypeMapping.has(nativeType)) {
arg.type = nativeTypeMapping.get(nativeType);
}
}
import { Awaitable, Session } from 'koishi';
import { isObservable, Observable } from 'rxjs';
export type CanBeObserved<T> = Awaitable<T | Observable<T>>;
export async function sessionRxToPromise(
session: Session,
obs: CanBeObserved<string>,
) {
const obsAwaited = await obs;
if (!isObservable(obsAwaited)) {
return obsAwaited;
}
return new Promise<string>((resolve, reject) => {
let lastValue: string;
obsAwaited.subscribe({
next: async (value) => {
if (lastValue && session.send) {
await session.send(lastValue);
}
lastValue = value;
},
error: async (error) => {
if (lastValue && session.send) {
await session.send(lastValue);
}
reject(error);
},
complete: () => {
resolve(lastValue);
},
});
});
}
import { SchemaClass, SchemaProperty } from 'schemastery-gen';
import { Instances, TypeFromClass } from '../def';
export function ToInstancesConfig<Inner extends new (...args: any[]) => any>(
instanceConfig: Inner,
): new () => Instances<TypeFromClass<Inner>> {
const instanceConfigClass = class InstancesConfig {
instances: TypeFromClass<Inner>[];
};
SchemaProperty({
type: SchemaClass(instanceConfig),
default: [],
array: true,
})(instanceConfigClass.prototype, 'instances');
return instanceConfigClass;
}
import { Command, Context, Dict } from 'koishi';
import { CommandOptionConfig, TemplateConfig } from '../def';
import { applyNativeTypeToArg } from './native-type-mapping';
export function adaptLocaleDict(value: string | Dict<string>): Dict<string> {
if (typeof value === 'string') {
return {
'': value,
};
}
return value;
}
export const registerTemplate = (
templateConfig: TemplateConfig,
ctx: Context,
command?: Command,
) => {
const key =
(command ? `commands.${command.name}.messages.` : '') + templateConfig.name;
for (const [locale, text] of Object.entries(templateConfig.text)) {
ctx.i18n.define(locale, key, text);
}
};
export function applyOptionToCommand(
ctx: Context,
cmd: Command,
def: CommandOptionConfig,
// eslint-disable-next-line @typescript-eslint/ban-types
nativeType?: Function,
) {
const { name, config } = def;
const { desc } = def;
if (config?.description) {
const desc = adaptLocaleDict(config.description);
for (const [locale, text] of Object.entries(desc)) {
ctx.i18n.define(locale, `commands.${cmd.name}.options.${name}`, text);
}
}
const clonedConfig = { ...(config || {}) };
delete clonedConfig.description;
cmd = cmd.option(name, desc, clonedConfig);
const option = cmd._options[name];
applyNativeTypeToArg(option, nativeType);
return cmd;
}
import { DefinePlugin } from '../src/register';
import { BasePlugin } from '../src/base-plugin';
import { Caller, Provide } from '../src/decorators';
import { App } from 'koishi';
declare module 'koishi' {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Context {
interface Services {
callerTester: CallerTester;
}
}
}
@Provide('callerTester')
@DefinePlugin()
class CallerTester extends BasePlugin<any> {
@Caller()
caller: string;
}
describe('Caller', () => {
let app: App;
beforeEach(async () => {
app = new App();
app.plugin(CallerTester);
await app.start();
});
it('should put caller with correct values', async () => {
const ctx1 = app.any();
const ctx2 = app.any();
const caller1 = ctx1.callerTester.caller;
const caller2 = ctx2.callerTester.caller;
expect(caller1).toEqual(ctx1);
expect(caller2).toEqual(ctx2);
expect(app.callerTester.caller).toEqual(app);
});
});
import { CommandExample, CommandUsage, UseCommand } from '../src/decorators';
import { BasePlugin } from '../src/base-plugin';
import { DefinePlugin } from '../src/register';
import {
CommandExample,
CommandUsage,
DefinePlugin,
PutArg,
PutObject,
PutOption,
UseCommand,
} from '../src/decorators';
import { App, Command } from 'koishi';
import { StarterPlugin } from '../src/registrar';
class Sound {
@PutArg(0)
sound: string;
@PutOption('volume', '-v <volume>')
volume: number;
getMessage() {
return `${this.sound} in ${this.volume}`;
}
}
@CommandUsage('乒乓球真好玩!') // 会适用于 ping 和 pang 两个指令
@DefinePlugin()
class MyPlugin extends BasePlugin<any> {
class MyPlugin extends StarterPlugin() {
@UseCommand('ping', 'Ping!')
@CommandExample('枰!')
onPing() {
return 'pong';
onPing(@PutOption('sound', '-s <sound>') sound: string) {
return `pong ${sound}`;
}
@UseCommand('pang', 'Pang!')
@CommandExample('乓!')
onPang() {
return 'peng';
onPang(@PutArg(0) sound: string) {
return `pong ${sound}`;
}
@UseCommand('peng', 'Peng!')
onPeng(@PutObject() sound: Sound) {
return sound.getMessage();
}
}
describe('Top level command def', () => {
describe('Command', () => {
let app: App;
let pingCommand: Command;
let pangCommand: Command;
......@@ -39,4 +63,26 @@ describe('Top level command def', () => {
expect(pingCommand._examples[0]).toEqual('枰!');
expect(pangCommand._examples[0]).toEqual('乓!');
});
it('Should infer option types', () => {
expect(pingCommand._options.sound.type).toEqual('string');
});
it('should call command', async () => {
expect(await pingCommand.execute({ options: { sound: '' } })).toBe(
'pong 枰',
);
expect(await pangCommand.execute({ args: [''] })).toBe('pong 乓');
});
it('should resolve put object', async () => {
const pengCommand = app.command('peng');
expect(pengCommand._options.volume.type).toBe('number');
expect(
await pengCommand.execute({
args: ['吵死了!'],
options: { volume: 20 },
}),
).toBe('吵死了! in 20');
});
});
import { RegisterSchema, SchemaProperty } from 'schemastery-gen';
import { DefinePlugin } from '../src/register';
import { ParentPluginMap, StarterPlugin } from '../src/base-plugin';
import { Fork, InjectParent, Provide, Reusable } from '../src/decorators';
import { Apply, UseCommand } from 'koishi-decorators';
import { App } from 'koishi';
import { Prop } from '../src/def';
declare module 'koishi' {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Context {
interface Services {
forkTest: MyPlugin;
}
}
}
@RegisterSchema()
class Config {
@SchemaProperty()
name: string;
getName() {
return this.name;
}
}
@DefinePlugin()
class ChildPlugin extends StarterPlugin(Config) {
@InjectParent()
parent: Prop<MyPlugin>;
@UseCommand('parent{{name}}')
async onParentCommand() {
return this.parent.config.getName();
}
@UseCommand('child{{name}}')
async onSelfCommand() {
return this.config.getName();
}
@Apply()
increase() {
this.parent.loadCount++;
// console.log('fork loaded: ', this.parent.loadCount);
}
}
@Provide('forkTest', { immediate: true })
@DefinePlugin()
class MyPlugin extends ParentPluginMap(ChildPlugin, (p) => p.config.getName()) {
loadCount = 0;
isParent = true;
@Apply()
onLoad() {
// console.log('load', this.config);
}
}
@Reusable()
@DefinePlugin()
class MyReusablePlugin extends StarterPlugin(Config) {
@Apply()
onLoad() {
this.ctx.app['count']++;
}
}
describe('Fork', () => {
let app: App;
beforeEach(async () => {
app = new App();
await app.start();
app['count'] = 0;
});
it('should fork a plugin', async () => {
// console.log('before 1');
app.plugin(MyPlugin, { name: 'a' });
// console.log('after 1: ' + app.forkTest.loadCount);
const myPlugin = app.forkTest;
expect(app.forkTest.config.getName()).toEqual('a');
expect(app.forkTest.instances.get('a').config.getName()).toEqual('a');
// console.log(myPlugin.instances.get('a').parent);
// console.log(myPlugin);
expect(myPlugin.instances.get('a').parent === myPlugin).toBe(true);
expect(app.forkTest.instances.get('b')).toBeUndefined();
expect(app.forkTest.loadCount).toBe(1);
// console.log('before 2: ' + app.forkTest.loadCount);
app.plugin(MyPlugin, { name: 'b' });
// console.log('after 2: ' + app.forkTest.loadCount);
expect(app.forkTest.instances.get('b').config.getName()).toEqual('b');
// console.log(myPlugin.instances.get('b').parent);
// console.log(myPlugin);
expect(myPlugin.instances.get('b').parent === myPlugin).toBe(true);
expect(app.forkTest.loadCount).toBe(2);
// console.log('before 3: ' + app.forkTest.loadCount);
app.plugin(MyPlugin, { name: 'c' });
// console.log('after 3: ' + app.forkTest.loadCount);
expect(app.forkTest.instances.get('c').config.getName()).toEqual('c');
// console.log(myPlugin.instances.get('c').parent);
// console.log(myPlugin);
expect(myPlugin.instances.get('c').parent === myPlugin).toBe(true);
expect(app.forkTest.loadCount).toBe(3);
const commandChildA = app.command('childa');
const commandChildB = app.command('childb');
const commandParentA = app.command('parenta');
const commandParentB = app.command('parentb');
expect(await commandChildA.execute({})).toEqual('a');
expect(await commandChildB.execute({})).toEqual('b');
expect(await commandParentA.execute({})).toEqual('a');
expect(await commandParentB.execute({})).toEqual('a');
});
it('it should work on reusable', async () => {
expect(app['count']).toBe(0);
app.plugin(MyReusablePlugin, { name: 'a' });
expect(app['count']).toBe(1);
app.plugin(MyReusablePlugin, { name: 'b' });
expect(app['count']).toBe(2);
});
});
import { App } from 'koishi';
import { DefinePlugin } from '../src/register';
import { Get } from '../src/decorators';
import request from 'supertest';
import { KoaContext } from 'koishi-decorators';
@DefinePlugin()
class MyPlugin {
@Get('ping')
async ping(ctx: KoaContext) {
ctx.status = 233;
ctx.body = 'pong';
}
}
describe('Http Routes', () => {
let app: App;
beforeEach(() => {
app = new App();
});
it('should be able to get a route', async () => {
app.plugin(MyPlugin);
await app.start();
return request(app._httpServer).get('/ping').expect(233).expect('pong');
});
});
import { DefinePlugin } from '../src/register';
import { PutValue, UseCommand } from 'koishi-decorators';
import { For, If } from '../src/decorators';
import { App } from 'koishi';
import { BasePlugin } from '../src/base-plugin';
@DefinePlugin()
class MyPlugin extends BasePlugin<{ foo: boolean; bar: boolean }> {
@If<MyPlugin>((o) => o.config.foo)
@UseCommand('foo')
foo() {
return 'foo';
}
@If<MyPlugin>((o) => o.config.bar)
@UseCommand('bar')
bar() {
return 'bar';
}
}
@DefinePlugin()
class MyPlugin2 extends BasePlugin<{
prefix: string;
commands: { name: string; return: string }[];
matrix: { commands: { name: string; return: string }[] }[];
}> {
@For<MyPlugin2>(({ config }) => config.commands)
@If<MyPlugin2>((_, def) => def.name !== 'badthing')
@UseCommand('{{name}}')
onCommand(
@PutValue('{{return}}') returnValue: string,
@PutValue('{{prefix}}') prefix: string,
) {
return prefix + returnValue;
}
@For<MyPlugin2>(({ config }) => config.matrix)
@For<MyPlugin2>((_, matrix) => matrix.commands)
@If<MyPlugin2>((_, def) => def.name !== 'badthing')
@UseCommand('{{name}}')
onMatrix(
@PutValue('{{return}}') returnValue: string,
@PutValue('{{prefix}}') prefix: string,
) {
return prefix + returnValue;
}
}
describe('It should register conditionally', () => {
it('registers command on condition', async () => {
const app = new App();
app.plugin(MyPlugin, { foo: true, bar: false });
await app.start();
const commandFoo = app.command('foo');
const commandBar = app.command('bar');
expect(await commandFoo.execute({})).toBe('foo');
expect(await commandBar.execute({})).toBeFalsy();
});
it('iterates commands on condition', async () => {
const app = new App();
app.plugin(MyPlugin2, {
commands: [
{ name: 'foo', return: 'bar' },
{ name: 'bar', return: 'baz' },
{ name: 'badthing', return: 'bad' },
],
matrix: [
{
commands: [
{ name: 'foo1', return: 'bar1' },
{ name: 'bar1', return: 'baz1' },
{ name: 'badthing', return: 'bad' },
],
},
{
commands: [
{ name: 'foo2', return: 'bar2' },
{ name: 'bar2', return: 'baz2' },
{ name: 'badthing', return: 'bad' },
],
},
],
prefix: '> ',
});
await app.start();
const commandFoo = app.command('foo');
const commandBar = app.command('bar');
expect(await commandFoo.execute({})).toBe('> bar');
expect(await commandBar.execute({})).toBe('> baz');
const commandFoo1 = app.command('foo1');
const commandBar1 = app.command('bar1');
expect(await commandFoo1.execute({})).toBe('> bar1');
expect(await commandBar1.execute({})).toBe('> baz1');
const commandFoo2 = app.command('foo2');
const commandBar2 = app.command('bar2');
expect(await commandFoo2.execute({})).toBe('> bar2');
expect(await commandBar2.execute({})).toBe('> baz2');
expect(await app.command('badthing').execute({})).toBeFalsy();
});
});
import { Fork, RegisterSchema, SchemaProperty, StarterPlugin } from '..';
import { Assets, Bot, Cache } from 'koishi';
import { Inject, PluginName, UsingService } from '../src/decorators';
import { DefinePlugin } from '../src/register';
import { ServiceName } from '../src/def';
@RegisterSchema()
class Config {
@SchemaProperty()
foo: string;
}
describe('InjectUsing', () => {
@DefinePlugin()
@UsingService('foo')
class MyFork extends StarterPlugin(Config) {}
@PluginName('foo-plugin')
@UsingService('router')
@DefinePlugin({ using: ['database'], schema: Config })
@UsingService('http')
@Fork(MyFork)
class MyPlugin extends StarterPlugin(Config) {
@Inject(true)
cache: Cache;
@Inject('assets', true)
assets: Assets;
@Inject('bots')
bots: Bot[];
}
it('Should include injected using services', () => {
expect(MyPlugin.name).toBe('foo-plugin');
expect(MyPlugin['Config']).toEqual(Config);
const usingList = (MyPlugin as any).using as ServiceName[];
expect(usingList).toBeInstanceOf(Array);
expect(usingList.length).toEqual(6);
expect(usingList.includes('database')).toEqual(true);
expect(usingList.includes('assets')).toEqual(true);
expect(usingList.includes('cache')).toEqual(true);
expect(usingList.includes('router')).toEqual(true);
expect(usingList.includes('bots')).toEqual(false);
expect(usingList.includes('http')).toEqual(true);
expect(usingList.includes('foo')).toEqual(true);
});
});
import { App } from 'koishi';
import { DefinePlugin } from '../src/register';
import { UsePlugin } from '../src/decorators';
import PluginOnebot from '@koishijs/plugin-adapter-onebot';
import { BasePlugin } from '../src/base-plugin';
import { PluginDef } from 'koishi-decorators';
@DefinePlugin()
class MyPlugin extends BasePlugin<any> {
@UsePlugin()
loadOnebot() {
return PluginDef(PluginOnebot, {
bots: [{ protocol: 'wsreverse', selfId: '11111' }],
});
}
}
@DefinePlugin()
class MyLazyPlugin extends BasePlugin<any> {
@UsePlugin()
async loadOnebot() {
await new Promise((resolve) => setTimeout(resolve, 1000));
this.ctx.app['_flag'] = 2;
return PluginDef((ctx) => (ctx.app['_flag1'] = 1));
}
}
describe('Inner plugin', () => {
let app: App;
it('should load inner plugin properly', async () => {
app = new App();
await app.start();
app.plugin(MyPlugin);
expect(app.bots.length).toBe(1);
//expect(app.cache).toBeDefined();
});
it('should wait for plugin to load', async () => {
app = new App();
app['_flag'] = 1;
app['_flag1'] = 0;
app.plugin(MyLazyPlugin);
expect(app['_flag']).toBe(1);
expect(app['_flag1']).toBe(0);
await app.start();
expect(app['_flag']).toBe(2);
expect(app['_flag1']).toBe(1);
});
});
import { SchemaProperty } from 'schemastery-gen';
import { StarterPlugin } from '../src/base-plugin';
import { DefinePlugin } from '../src/register';
import { UseCommand } from 'koishi-decorators';
import { MapPlugin } from '../src/plugin-operators';
import { App } from 'koishi';
import { MergePlugin } from '../src/plugin-operators/merge-plugin';
class DressConfig {
@SchemaProperty()
color: string;
}
@DefinePlugin()
class DressPlugin extends StarterPlugin(DressConfig) {
@UseCommand('dressColor')
dressColor() {
return this.config.color;
}
}
class SkirtConfig {
@SchemaProperty({ default: 'S' })
size: string;
}
@DefinePlugin()
class SkirtPlugin extends StarterPlugin(SkirtConfig) {
@UseCommand('skirtSize')
skirtSize() {
return this.config.size;
}
}
class WearingConfig {
@SchemaProperty()
strip: string;
}
@DefinePlugin()
class WearingPlugin extends MapPlugin(
{ dress: DressPlugin, skirt: SkirtPlugin },
WearingConfig,
) {
@UseCommand('wearingStrip')
wearingStrip() {
return this.config.strip;
}
}
@DefinePlugin()
class MergedWearingPlugin extends MergePlugin(
{ dress: DressPlugin, skirt: SkirtPlugin },
WearingConfig,
) {
@UseCommand('wearingStrip')
wearingStrip() {
return this.config.strip;
}
}
describe('register map plugin instance', () => {
it('should work on each level', async () => {
const app = new App();
app.plugin(WearingPlugin, {
dress: { color: 'red' },
skirt: { size: 'XL' },
strip: 'pink',
});
await app.start();
expect(await app.command('dressColor').execute({})).toBe('red');
expect(await app.command('skirtSize').execute({})).toBe('XL');
expect(await app.command('wearingStrip').execute({})).toBe('pink');
});
it('should partial register', async () => {
const app = new App();
app.plugin(WearingPlugin, {
dress: { color: 'red' },
strip: 'pink',
});
await app.start();
expect(await app.command('dressColor').execute({})).toBe('red');
expect(await app.command('wearingStrip').execute({})).toBe('pink');
expect(await app.command('skirtSize').execute({})).toBe('S');
});
it('should work on merge plugin', async () => {
const app = new App();
app.plugin(MergedWearingPlugin, {
color: 'red',
size: 'XL',
strip: 'pink',
});
await app.start();
expect(await app.command('dressColor').execute({})).toBe('red');
expect(await app.command('skirtSize').execute({})).toBe('XL');
expect(await app.command('wearingStrip').execute({})).toBe('pink');
});
});
import { DefinePlugin } from '../src/register';
import { RegisterSchema, SchemaProperty } from 'schemastery-gen';
import { BasePlugin } from '../src/base-plugin';
import { UseCommand } from 'koishi-decorators';
import { MultiInstancePlugin } from '../src/plugin-operators';
import { App, Schema } from 'koishi';
class MessageConfig {
@SchemaProperty()
msg: string;
getMsg() {
return this.msg;
}
}
@RegisterSchema()
class InnerMessageConfig extends MessageConfig {}
@RegisterSchema()
class OuterMessageConfig extends MessageConfig {}
@DefinePlugin({ schema: InnerMessageConfig })
class Inner extends BasePlugin<InnerMessageConfig> {
@UseCommand('message')
async onMessage() {
return this.config.getMsg();
}
}
@DefinePlugin({ schema: Schema.object({ msg: Schema.string() }) })
class Inner2 extends BasePlugin<InnerMessageConfig> {
@UseCommand('message')
async onMessage() {
return this.config.msg;
}
}
@DefinePlugin()
class Outer extends MultiInstancePlugin(Inner, OuterMessageConfig) {
@UseCommand('message2')
async onMessage() {
return this.config.getMsg();
}
@UseCommand('message3')
async onInnerMessage() {
return this.instances[0].config.getMsg();
}
}
@DefinePlugin()
class Outer2 extends MultiInstancePlugin(Inner2, OuterMessageConfig) {
@UseCommand('message2')
async onMessage() {
return this.config.getMsg();
}
@UseCommand('message3')
async onInnerMessage() {
return this.instances[0].config.msg;
}
}
describe('register multi plugin instance', () => {
it('should work on schemastery-gen', async () => {
const app = new App();
app.plugin(Outer, { msg: 'hello', instances: [{ msg: 'world' }] });
await app.start();
const innerCommand = app.command('message');
const outerCommand = app.command('message2');
const innerInnerCommand = app.command('message3');
expect(await innerCommand.execute({})).toBe('world');
expect(await outerCommand.execute({})).toBe('hello');
expect(await innerInnerCommand.execute({})).toBe('world');
});
it('should work on common schemastery', async () => {
const app = new App();
app.plugin(Outer2, { msg: 'hello', instances: [{ msg: 'world' }] });
await app.start();
const innerCommand = app.command('message');
const outerCommand = app.command('message2');
const innerInnerCommand = app.command('message3');
expect(await innerCommand.execute({})).toBe('world');
expect(await outerCommand.execute({})).toBe('hello');
expect(await innerInnerCommand.execute({})).toBe('world');
});
});
import { App, Context, Logger } from 'koishi';
import {
DefinePlugin,
OnApply,
OnConnect,
OnDisconnect,
} from '../src/register';
import {
Inject,
InjectContext,
InjectLogger,
Provide,
} from '../src/decorators';
import { BasePlugin } from '../src/base-plugin';
declare module 'koishi' {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Context {
interface Services {
immediateDependency: ImmediateDependency;
nonImmediateDependency: NonImmediateDependency;
myPlugin: TestingBase;
}
}
}
@Provide('immediateDependency', { immediate: true })
@DefinePlugin()
class ImmediateDependency {}
@Provide('nonImmediateDependency')
@DefinePlugin()
class NonImmediateDependency {}
@Provide('myPlugin', { immediate: true })
@DefinePlugin()
class TestingBase
extends BasePlugin<any>
implements OnConnect, OnDisconnect, OnApply
{
@InjectLogger()
logger: Logger;
onApply() {
this.applied = true;
}
onConnect() {
this.connected = true;
}
onDisconnect() {
this.disconnected = true;
}
applied = false;
connected = false;
disconnected = false;
}
class MyPlugin extends TestingBase {}
class MyPlugin2 extends TestingBase {
@Inject(true)
immediateDependency: ImmediateDependency;
}
class MyPlugin3 extends TestingBase {
@Inject(true)
nonImmediateDependency: NonImmediateDependency;
}
async function RunApplyTest(app: App, plugin: any) {
app.plugin(plugin);
await app.start();
const myPlugin = app.myPlugin;
expect(myPlugin.applied).toBe(true);
expect(myPlugin.connected).toBe(true);
expect(myPlugin.disconnected).toBe(false);
app.dispose(plugin);
expect(myPlugin.disconnected).toBe(true);
expect(app.immediateDependency).toBeDefined();
expect(app.nonImmediateDependency).toBeDefined();
await app.stop();
}
describe('Apply and Connect in koishi-thirdeye', () => {
let app: App;
beforeEach(() => {
app = new App();
app.plugin(ImmediateDependency);
app.plugin(NonImmediateDependency);
});
it('should be applied and connected', async () => {
await RunApplyTest(app, MyPlugin);
});
it('should be applied and connected with immediate dependency', async () => {
await RunApplyTest(app, MyPlugin2);
});
it('should be applied and connected with non-immediate dependency', async () => {
await RunApplyTest(app, MyPlugin3);
});
it('should name logger correctly', () => {
app.plugin(MyPlugin);
const myPlugin = app.myPlugin;
expect(myPlugin.logger.name).toBe('MyPlugin');
});
});
import { SchemaProperty } from 'schemastery-gen';
import { UseCommand } from 'koishi-decorators';
import { CreatePluginFactory } from '../src/plugin-factory';
import { App } from 'koishi';
import { DefinePlugin } from '../src/register';
import { BasePlugin } from '../src/base-plugin';
class MessageConfig {
@SchemaProperty()
msg: string;
getMsg() {
return this.msg;
}
}
class Base extends BasePlugin<MessageConfig> {
@UseCommand('message')
async onMessage() {
return this.config.getMsg();
}
}
const Factory = CreatePluginFactory(Base, MessageConfig);
class SpecificConfig {
@SchemaProperty()
msg2: string;
getMsg2() {
return this.msg2;
}
}
@DefinePlugin()
class SpecificPlugin extends Factory(SpecificConfig) {
@UseCommand('message2')
async onMessage2() {
return this.config.getMsg2();
}
}
describe('plugin factory', () => {
it('should register SpecificPlugin', async () => {
const app = new App();
app.plugin(SpecificPlugin, { msg: 'hello', msg2: 'world' });
await app.start();
const innerCommand = app.command('message');
const outerCommand = app.command('message2');
expect(await innerCommand.execute({})).toBe('hello');
expect(await outerCommand.execute({})).toBe('world');
});
});
import { App, Session } from 'koishi';
import { OnGuild, OnPlatform, UseCommand } from 'koishi-decorators';
import { DefinePlugin } from '../src/register';
@OnPlatform('discord')
@DefinePlugin()
class MyClass {
@OnGuild('1111111111')
@UseCommand('foo')
foo() {}
}
describe('Scope', () => {
let app: App;
beforeEach(async () => {
app = new App();
await app.start();
});
it('should check scope', () => {
const correctSession = {
guildId: '1111111111',
platform: 'discord',
} as Session;
const wrongSession1 = {
guildId: '2222222222',
platform: 'discord',
} as Session;
const wrongSession2 = {
guildId: '1111111111',
platform: 'telegram',
} as Session;
app.plugin(MyClass);
const methodCtx = app.command('foo').ctx;
expect(methodCtx.filter(correctSession)).toBe(true);
expect(methodCtx.filter(wrongSession1)).toBe(false);
expect(methodCtx.filter(wrongSession2)).toBe(false);
});
});
import { App, Context } from 'koishi';
import { DefinePlugin } from '../src/register';
import { Inject, Provide, UseEvent, UsingService } from '../src/decorators';
import { BasePlugin } from '../src/base-plugin';
import { ServiceName } from '../src/def';
declare module 'koishi' {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Context {
interface Services {
myProvider: MyProvider;
myEagerProvider: MyEagerProvider;
myConsumer: MyConsumer;
myUsingConsumer: MyUsingConsumer;
myPartialConsumer: MyPartialConsumer;
dummyProvider: any;
}
}
interface EventMap {
'pang'(message: string): Promise<string>;
'pong'(message: string): Promise<string>;
}
}
@Provide('myProvider')
@DefinePlugin()
class MyProvider extends BasePlugin<any> {
ping() {
return 'pong';
}
dispose() {
return this.ctx.dispose();
}
}
@Provide('myEagerProvider', { immediate: true })
@DefinePlugin()
class MyEagerProvider extends BasePlugin<any> {
ping() {
return 'pong eager';
}
dispose() {
return this.ctx.dispose();
}
}
@Provide('myConsumer', { immediate: true })
@DefinePlugin()
class MyConsumer {
@Inject()
myProvider: MyProvider;
@Inject()
myEagerProvider: MyEagerProvider;
pongResult: string;
eagerPongResult: string;
@UseEvent('internal/service')
async onService(name: ServiceName) {
if (name === 'myProvider') {
this.pongResult = this.myProvider.ping();
} else if (name === 'myEagerProvider') {
this.eagerPongResult = this.myEagerProvider.ping();
}
}
}
@Provide('myUsingConsumer', { immediate: true })
@DefinePlugin()
class MyUsingConsumer {
@Inject(true)
myProvider: MyProvider;
@Inject(true)
myEagerProvider: MyEagerProvider;
pongResult: string;
eagerPongResult: string;
@UseEvent('internal/service')
async onService(name: ServiceName) {
if (name === 'myProvider') {
this.pongResult = this.myProvider.ping();
} else if (name === 'myEagerProvider') {
this.eagerPongResult = this.myEagerProvider.ping();
}
}
emitResult: string;
}
@Provide('myPartialConsumer', { immediate: true })
@DefinePlugin()
class MyPartialConsumer {
@Inject()
dummyProvider: number;
pongResult: string;
@UsingService('dummyProvider')
@UseEvent('pang')
async onPang(content: string) {
const msg = `pang: ${content}`;
console.log(msg);
return msg;
}
@UseEvent('pong')
async onPong(content: string) {
const msg = `pong: ${content}`;
console.log(msg);
return msg;
}
}
describe('On service', () => {
let app: App;
it('Should call service', async () => {
app = new App();
app.plugin(MyProvider);
app.plugin(MyEagerProvider);
app.plugin(MyConsumer);
expect(app.myEagerProvider).toBeDefined();
expect(app.myEagerProvider.ping()).toBe('pong eager');
expect(app.myProvider).toBeUndefined();
await app.start();
expect(app.myConsumer).toBeDefined();
expect(app.myProvider).toBeDefined();
// expect(app.myConsumer.eagerPongResult).toBe('pong eager');
expect(app.myConsumer.pongResult).toBe('pong');
});
it('Should call service with using', async () => {
app = new App();
app.plugin(MyUsingConsumer);
expect(app.myUsingConsumer).toBeUndefined();
app.plugin(MyProvider);
expect(app.myUsingConsumer).toBeUndefined();
app.plugin(MyEagerProvider);
expect(app.myUsingConsumer).toBeUndefined();
await app.start();
expect(app.myUsingConsumer).toBeDefined();
expect(app.myProvider).toBeDefined();
expect(app.myProvider.ping()).toBe('pong');
expect(app.myEagerProvider).toBeDefined();
expect(app.myEagerProvider.ping()).toBe('pong eager');
//expect(app.myUsingConsumer.eagerPongResult).toBe('pong eager');
//expect(app.myUsingConsumer.pongResult).toBe('pong');
});
it('Should handle partial using deps', async () => {
Context.service('dummyProvider');
app = new App();
await app.start();
app.plugin(MyPartialConsumer);
expect(app.myPartialConsumer).toBeDefined();
expect(await app.waterfall('pang', 'hello')).toEqual('hello');
expect(await app.waterfall('pong', 'hello')).toEqual('pong: hello');
app.dummyProvider = { foo: 'bar' };
expect(await app.waterfall('pang', 'hello')).toEqual('pang: hello');
expect(await app.waterfall('pong', 'hello')).toEqual('pong: hello');
app.dummyProvider = undefined;
expect(await app.waterfall('pang', 'hi')).toEqual('hi');
expect(await app.waterfall('pong', 'hi')).toEqual('pong: hi');
app.dummyProvider = { foo: 'baz' };
expect(await app.waterfall('pang', 'hi')).toEqual('pang: hi');
expect(await app.waterfall('pong', 'hi')).toEqual('pong: hi');
});
});
import { MixinModel, UseModel } from '../src/decorators';
import { DefinePlugin, MixinModel, UseModel } from '../src/decorators';
import { App } from 'koishi';
import { BasePlugin } from '../src/base-plugin';
import { DefinePlugin } from '../src/register';
import {
ChildModel,
DefineModel,
......@@ -10,6 +8,7 @@ import {
PrimaryGenerated,
Unique,
} from '../src/cosmotype-exports';
import { StarterPlugin } from '../src/registrar';
declare module 'koishi' {
interface Tables {
......@@ -79,7 +78,7 @@ class Wearing {
@MixinModel('user', { shirt: Wearing })
@UseModel(Dress)
@DefinePlugin()
class MyPlugin extends BasePlugin<any> {}
class MyPlugin extends StarterPlugin() {}
describe('Test of model', () => {
it('should register model', async () => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment