@sapphire/plugin-api 6.1.2-next.fe95a62.0 → 7.0.0-next.03b2a90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +78 -47
- package/dist/cjs/lib/structures/MediaParser.cjs +4 -8
- package/dist/cjs/lib/structures/MediaParser.cjs.map +1 -1
- package/dist/cjs/lib/structures/Middleware.cjs +1 -4
- package/dist/cjs/lib/structures/Middleware.cjs.map +1 -1
- package/dist/cjs/lib/structures/MiddlewareStore.cjs +6 -14
- package/dist/cjs/lib/structures/MiddlewareStore.cjs.map +1 -1
- package/dist/cjs/lib/structures/Route.cjs +12 -34
- package/dist/cjs/lib/structures/Route.cjs.map +1 -1
- package/dist/cjs/lib/structures/RouteLoaderStrategy.cjs +28 -0
- package/dist/cjs/lib/structures/RouteLoaderStrategy.cjs.map +1 -0
- package/dist/cjs/lib/structures/RouteStore.cjs +13 -20
- package/dist/cjs/lib/structures/RouteStore.cjs.map +1 -1
- package/dist/cjs/lib/structures/api/ApiRequest.cjs +1 -4
- package/dist/cjs/lib/structures/api/ApiRequest.cjs.map +1 -1
- package/dist/cjs/lib/structures/api/ApiResponse.cjs +1 -4
- package/dist/cjs/lib/structures/api/ApiResponse.cjs.map +1 -1
- package/dist/cjs/lib/structures/api/CookieStore.cjs +6 -11
- package/dist/cjs/lib/structures/api/CookieStore.cjs.map +1 -1
- package/dist/cjs/lib/structures/http/Auth.cjs +13 -33
- package/dist/cjs/lib/structures/http/Auth.cjs.map +1 -1
- package/dist/cjs/lib/structures/http/HttpMethods.cjs +37 -6
- package/dist/cjs/lib/structures/http/HttpMethods.cjs.map +1 -1
- package/dist/cjs/lib/structures/http/Server.cjs +1 -4
- package/dist/cjs/lib/structures/http/Server.cjs.map +1 -1
- package/dist/cjs/lib/utils/RouteData.cjs +10 -21
- package/dist/cjs/lib/utils/RouteData.cjs.map +1 -1
- package/dist/cjs/listeners/PluginRouteError.cjs +1 -2
- package/dist/cjs/listeners/PluginRouteError.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerMatch.cjs +2 -2
- package/dist/cjs/listeners/PluginServerMatch.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerMiddlewareError.cjs +1 -2
- package/dist/cjs/listeners/PluginServerMiddlewareError.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerMiddlewareSuccess.cjs +3 -3
- package/dist/cjs/listeners/PluginServerMiddlewareSuccess.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerNoMatch.cjs +1 -2
- package/dist/cjs/listeners/PluginServerNoMatch.cjs.map +1 -1
- package/dist/cjs/listeners/PluginServerRequest.cjs +5 -5
- package/dist/cjs/listeners/PluginServerRequest.cjs.map +1 -1
- package/dist/cjs/mediaParsers/applicationJson.cjs.map +1 -1
- package/dist/cjs/mediaParsers/textPlain.cjs.map +1 -1
- package/dist/cjs/middlewares/auth.cjs +2 -6
- package/dist/cjs/middlewares/auth.cjs.map +1 -1
- package/dist/cjs/middlewares/body.cjs +3 -8
- package/dist/cjs/middlewares/body.cjs.map +1 -1
- package/dist/cjs/middlewares/cookies.cjs +1 -4
- package/dist/cjs/middlewares/cookies.cjs.map +1 -1
- package/dist/cjs/middlewares/headers.cjs +15 -7
- package/dist/cjs/middlewares/headers.cjs.map +1 -1
- package/dist/cjs/routes/_load.cjs +4 -4
- package/dist/cjs/routes/_load.cjs.map +1 -1
- package/dist/cjs/routes/oauth/{callback.cjs → callback.post.cjs} +5 -10
- package/dist/cjs/routes/oauth/callback.post.cjs.map +1 -0
- package/dist/cjs/routes/oauth/{logout.cjs → logout.post.cjs} +8 -13
- package/dist/cjs/routes/oauth/logout.post.cjs.map +1 -0
- package/dist/esm/chunk-JTFKMR4I.mjs +15 -0
- package/dist/esm/index.d.mts +78 -47
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/lib/structures/MediaParser.mjs +5 -9
- package/dist/esm/lib/structures/MediaParser.mjs.map +1 -1
- package/dist/esm/lib/structures/MediaParserStore.mjs +1 -1
- package/dist/esm/lib/structures/Middleware.mjs +1 -1
- package/dist/esm/lib/structures/Middleware.mjs.map +1 -1
- package/dist/esm/lib/structures/MiddlewareStore.mjs +6 -11
- package/dist/esm/lib/structures/MiddlewareStore.mjs.map +1 -1
- package/dist/esm/lib/structures/Route.mjs +12 -31
- package/dist/esm/lib/structures/Route.mjs.map +1 -1
- package/dist/esm/lib/structures/RouteLoaderStrategy.mjs +25 -0
- package/dist/esm/lib/structures/RouteLoaderStrategy.mjs.map +1 -0
- package/dist/esm/lib/structures/RouteStore.mjs +13 -17
- package/dist/esm/lib/structures/RouteStore.mjs.map +1 -1
- package/dist/esm/lib/structures/api/ApiRequest.mjs +1 -1
- package/dist/esm/lib/structures/api/ApiResponse.mjs +1 -1
- package/dist/esm/lib/structures/api/CookieStore.mjs +6 -8
- package/dist/esm/lib/structures/api/CookieStore.mjs.map +1 -1
- package/dist/esm/lib/structures/http/Auth.mjs +6 -12
- package/dist/esm/lib/structures/http/Auth.mjs.map +1 -1
- package/dist/esm/lib/structures/http/HttpCodes.mjs +1 -1
- package/dist/esm/lib/structures/http/HttpMethods.mjs +39 -5
- package/dist/esm/lib/structures/http/HttpMethods.mjs.map +1 -1
- package/dist/esm/lib/structures/http/Server.mjs +1 -1
- package/dist/esm/lib/structures/http/Server.mjs.map +1 -1
- package/dist/esm/lib/utils/MimeTypes.mjs +1 -1
- package/dist/esm/lib/utils/RouteData.mjs +10 -18
- package/dist/esm/lib/utils/RouteData.mjs.map +1 -1
- package/dist/esm/listeners/PluginRouteError.mjs +2 -3
- package/dist/esm/listeners/PluginRouteError.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerMatch.mjs +3 -3
- package/dist/esm/listeners/PluginServerMatch.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerMiddlewareError.mjs +2 -3
- package/dist/esm/listeners/PluginServerMiddlewareError.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerMiddlewareSuccess.mjs +4 -4
- package/dist/esm/listeners/PluginServerMiddlewareSuccess.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerNoMatch.mjs +2 -3
- package/dist/esm/listeners/PluginServerNoMatch.mjs.map +1 -1
- package/dist/esm/listeners/PluginServerRequest.mjs +6 -6
- package/dist/esm/listeners/PluginServerRequest.mjs.map +1 -1
- package/dist/esm/listeners/_load.mjs +1 -1
- package/dist/esm/mediaParsers/_load.mjs +1 -1
- package/dist/esm/mediaParsers/applicationFormUrlEncoded.mjs +1 -1
- package/dist/esm/mediaParsers/applicationJson.mjs +1 -1
- package/dist/esm/mediaParsers/applicationJson.mjs.map +1 -1
- package/dist/esm/mediaParsers/textPlain.mjs +1 -1
- package/dist/esm/mediaParsers/textPlain.mjs.map +1 -1
- package/dist/esm/middlewares/_load.mjs +1 -1
- package/dist/esm/middlewares/auth.mjs +2 -3
- package/dist/esm/middlewares/auth.mjs.map +1 -1
- package/dist/esm/middlewares/body.mjs +3 -5
- package/dist/esm/middlewares/body.mjs.map +1 -1
- package/dist/esm/middlewares/cookies.mjs +1 -1
- package/dist/esm/middlewares/cookies.mjs.map +1 -1
- package/dist/esm/middlewares/headers.mjs +15 -4
- package/dist/esm/middlewares/headers.mjs.map +1 -1
- package/dist/esm/register.mjs +1 -1
- package/dist/esm/routes/_load.mjs +3 -3
- package/dist/esm/routes/_load.mjs.map +1 -1
- package/dist/esm/routes/oauth/{callback.mjs → callback.post.mjs} +5 -7
- package/dist/esm/routes/oauth/callback.post.mjs.map +1 -0
- package/dist/esm/routes/oauth/{logout.mjs → logout.post.mjs} +8 -13
- package/dist/esm/routes/oauth/logout.post.mjs.map +1 -0
- package/package.json +9 -9
- package/dist/cjs/routes/oauth/callback.cjs.map +0 -1
- package/dist/cjs/routes/oauth/logout.cjs.map +0 -1
- package/dist/esm/chunk-PYETHG4R.mjs +0 -29
- package/dist/esm/routes/oauth/callback.mjs.map +0 -1
- package/dist/esm/routes/oauth/logout.mjs.map +0 -1
- /package/dist/esm/{chunk-PYETHG4R.mjs.map → chunk-JTFKMR4I.mjs.map} +0 -0
|
@@ -1,43 +1,38 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var pieces = require('@sapphire/pieces');
|
|
4
|
+
var utilities = require('@sapphire/utilities');
|
|
4
5
|
var discord_js = require('discord.js');
|
|
5
6
|
var url = require('url');
|
|
6
|
-
var HttpMethods_cjs = require('./http/HttpMethods.cjs');
|
|
7
7
|
var Route_cjs = require('./Route.cjs');
|
|
8
|
+
var RouteLoaderStrategy_cjs = require('./RouteLoaderStrategy.cjs');
|
|
8
9
|
|
|
9
10
|
var __defProp = Object.defineProperty;
|
|
10
11
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
12
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
12
|
-
var __publicField = (obj, key, value) =>
|
|
13
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
14
|
-
return value;
|
|
15
|
-
};
|
|
13
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
16
14
|
var slash = "/".charCodeAt(0);
|
|
17
15
|
var _RouteStore = class _RouteStore extends pieces.Store {
|
|
18
16
|
constructor() {
|
|
19
|
-
super(Route_cjs.Route, { name: "routes" });
|
|
20
|
-
__publicField(this, "
|
|
21
|
-
for (const [method] of HttpMethods_cjs.methodEntries)
|
|
22
|
-
this.table.set(method, new discord_js.Collection());
|
|
17
|
+
super(Route_cjs.Route, { name: "routes", strategy: new RouteLoaderStrategy_cjs.RouteLoaderStrategy() });
|
|
18
|
+
__publicField(this, "methods", new discord_js.Collection());
|
|
23
19
|
}
|
|
24
20
|
match(request) {
|
|
25
21
|
const { method } = request;
|
|
26
22
|
if (typeof method === "undefined") {
|
|
27
23
|
return null;
|
|
28
24
|
}
|
|
29
|
-
const methodTable = this.
|
|
30
|
-
if (
|
|
25
|
+
const methodTable = this.methods.get(method);
|
|
26
|
+
if (utilities.isNullish(methodTable)) {
|
|
31
27
|
return null;
|
|
32
28
|
}
|
|
33
29
|
const { splits, querystring } = this.parseURL(request.url);
|
|
34
|
-
for (const [route,
|
|
35
|
-
const result =
|
|
36
|
-
if (result === null)
|
|
37
|
-
continue;
|
|
30
|
+
for (const [route, router] of methodTable.entries()) {
|
|
31
|
+
const result = router.match(splits);
|
|
32
|
+
if (result === null) continue;
|
|
38
33
|
request.params = result;
|
|
39
34
|
request.query = Object.fromEntries(new url.URLSearchParams(querystring).entries());
|
|
40
|
-
return
|
|
35
|
+
return route;
|
|
41
36
|
}
|
|
42
37
|
return null;
|
|
43
38
|
}
|
|
@@ -52,10 +47,8 @@ var _RouteStore = class _RouteStore extends pieces.Store {
|
|
|
52
47
|
pathname = url.substring(0, index);
|
|
53
48
|
querystring = url.substring(index + 1);
|
|
54
49
|
}
|
|
55
|
-
if (pathname.charCodeAt(0) === slash)
|
|
56
|
-
|
|
57
|
-
if (pathname.length > 0 && pathname.charCodeAt(pathname.length - 1) === slash)
|
|
58
|
-
pathname = pathname.substring(0, pathname.length - 1);
|
|
50
|
+
if (pathname.charCodeAt(0) === slash) pathname = pathname.substring(1);
|
|
51
|
+
if (pathname.length > 0 && pathname.charCodeAt(pathname.length - 1) === slash) pathname = pathname.substring(0, pathname.length - 1);
|
|
59
52
|
const splits = pathname.split("/");
|
|
60
53
|
return { splits, querystring };
|
|
61
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/structures/RouteStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/structures/RouteStore.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEhC,SAAS,aAAa;AACtB,SAAS,2BAA2B;AAGpC,IAAM,QAAQ,IAAI,WAAW,CAAC;AAKvB,IAAM,cAAN,MAAM,oBAAmB,MAAuB;AAAA,EAG/C,cAAc;AACpB,UAAM,OAAO,EAAE,MAAM,UAAU,UAAU,IAAI,oBAAoB,EAAE,CAAC;AAHrE,wBAAgB,WAAU,IAAI,WAAqD;AAAA,EAInF;AAAA,EAEO,MAAM,SAAsC;AAClD,UAAM,EAAE,OAAO,IAAI;AAGnB,QAAI,OAAO,WAAW,aAAa;AAClC,aAAO;AAAA,IACR;AAGA,UAAM,cAAc,KAAK,QAAQ,IAAI,MAAoB;AAGzD,QAAI,UAAU,WAAW,GAAG;AAC3B,aAAO;AAAA,IACR;AAEA,UAAM,EAAE,QAAQ,YAAY,IAAI,KAAK,SAAS,QAAQ,GAAG;AAEzD,eAAW,CAAC,OAAO,MAAM,KAAK,YAAY,QAAQ,GAAG;AACpD,YAAM,SAAS,OAAO,MAAM,MAAM;AAClC,UAAI,WAAW,KAAM;AAErB,cAAQ,SAAS;AACjB,cAAQ,QAAQ,OAAO,YAAY,IAAI,gBAAgB,WAAW,EAAE,QAAQ,CAAC;AAE7E,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAAA,EAEQ,SAAS,MAAM,IAAI;AAC1B,UAAM,QAAQ,IAAI,QAAQ,GAAG;AAE7B,QAAI;AACJ,QAAI;AACJ,QAAI,UAAU,IAAI;AACjB,iBAAW;AACX,oBAAc;AAAA,IACf,OAAO;AACN,iBAAW,IAAI,UAAU,GAAG,KAAK;AACjC,oBAAc,IAAI,UAAU,QAAQ,CAAC;AAAA,IACtC;AAEA,QAAI,SAAS,WAAW,CAAC,MAAM,MAAO,YAAW,SAAS,UAAU,CAAC;AACrE,QAAI,SAAS,SAAS,KAAK,SAAS,WAAW,SAAS,SAAS,CAAC,MAAM,MAAO,YAAW,SAAS,UAAU,GAAG,SAAS,SAAS,CAAC;AAEnI,UAAM,SAAS,SAAS,MAAM,GAAG;AAEjC,WAAO,EAAE,QAAQ,YAAY;AAAA,EAC9B;AACD;AA1DuD;AAAhD,IAAM,aAAN","sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { isNullish } from '@sapphire/utilities';\nimport { Collection } from 'discord.js';\nimport { URLSearchParams } from 'url';\nimport type { RouteData } from '../utils/RouteData';\nimport { Route } from './Route';\nimport { RouteLoaderStrategy } from './RouteLoaderStrategy';\nimport type { MethodName } from './http/HttpMethods';\n\nconst slash = '/'.charCodeAt(0);\n\n/**\n * @since 1.0.0\n */\nexport class RouteStore extends Store<Route, 'routes'> {\n\tpublic readonly methods = new Collection<MethodName, Collection<Route, RouteData>>();\n\n\tpublic constructor() {\n\t\tsuper(Route, { name: 'routes', strategy: new RouteLoaderStrategy() });\n\t}\n\n\tpublic match(request: Route.Request): Route | null {\n\t\tconst { method } = request;\n\n\t\t// If there is no method, we can't match a route so return null\n\t\tif (typeof method === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\n\t\t// We get all the routes that are tied to the provided method to have a smaller list to filter through\n\t\tconst methodTable = this.methods.get(method as MethodName);\n\n\t\t// If there are no routes of the provided type then we won't find any route so we return null\n\t\tif (isNullish(methodTable)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { splits, querystring } = this.parseURL(request.url);\n\n\t\tfor (const [route, router] of methodTable.entries()) {\n\t\t\tconst result = router.match(splits);\n\t\t\tif (result === null) continue;\n\n\t\t\trequest.params = result;\n\t\t\trequest.query = Object.fromEntries(new URLSearchParams(querystring).entries());\n\n\t\t\treturn route;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate parseURL(url = '') {\n\t\tconst index = url.indexOf('?');\n\n\t\tlet pathname: string;\n\t\tlet querystring: string;\n\t\tif (index === -1) {\n\t\t\tpathname = url;\n\t\t\tquerystring = '';\n\t\t} else {\n\t\t\tpathname = url.substring(0, index);\n\t\t\tquerystring = url.substring(index + 1);\n\t\t}\n\n\t\tif (pathname.charCodeAt(0) === slash) pathname = pathname.substring(1);\n\t\tif (pathname.length > 0 && pathname.charCodeAt(pathname.length - 1) === slash) pathname = pathname.substring(0, pathname.length - 1);\n\n\t\tconst splits = pathname.split('/');\n\n\t\treturn { splits, querystring };\n\t}\n}\n"]}
|
|
@@ -5,10 +5,7 @@ var http = require('http');
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
7
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
|
-
var __publicField = (obj, key, value) =>
|
|
9
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
-
return value;
|
|
11
|
-
};
|
|
8
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
12
9
|
var _ApiRequest = class _ApiRequest extends http.IncomingMessage {
|
|
13
10
|
constructor() {
|
|
14
11
|
super(...arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/structures/api/ApiRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/structures/api/ApiRequest.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,uBAAuB;AAGzB,IAAM,cAAN,MAAM,oBAAmB,gBAAgB;AAAA,EAAzC;AAAA;AAIN;AAAA;AAAA;AAAA,wBAAO,SAA2C,CAAC;AAKnD;AAAA;AAAA;AAAA,wBAAO,UAAiC,CAAC;AAKzC;AAAA;AAAA;AAAA,wBAAO;AASP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAO;AAAA;AACR;AAxBgD;AAAzC,IAAM,aAAN","sourcesContent":["import { IncomingMessage } from 'node:http';\nimport type { AuthData } from '../http/Auth';\n\nexport class ApiRequest extends IncomingMessage {\n\t/**\n\t * The query parameters.\n\t */\n\tpublic query: Record<string, string | string[]> = {};\n\n\t/**\n\t * The URI parameters.\n\t */\n\tpublic params: Record<string, string> = {};\n\n\t/**\n\t * The body that was sent by the user.\n\t */\n\tpublic body?: unknown;\n\n\t/**\n\t * The authorization information. This field indicates three possible values:\n\t *\n\t * - `undefined`: The authorization middleware has not been executed yet.\n\t * - `null`: The user is not authorized.\n\t * - `AuthData`: The user is authorized.\n\t */\n\tpublic auth?: AuthData | null;\n}\n"]}
|
|
@@ -9,10 +9,7 @@ var HttpCodes_cjs = require('../http/HttpCodes.cjs');
|
|
|
9
9
|
var __defProp = Object.defineProperty;
|
|
10
10
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
11
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
12
|
-
var __publicField = (obj, key, value) =>
|
|
13
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
14
|
-
return value;
|
|
15
|
-
};
|
|
12
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
16
13
|
var _ApiResponse = class _ApiResponse extends http.ServerResponse {
|
|
17
14
|
constructor() {
|
|
18
15
|
super(...arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/structures/api/ApiResponse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/structures/api/ApiResponse.ts"],"names":[],"mappings":";;;;;;AAAA,SAA0B,gBAAgB,oBAAoB;AAC9D,SAAS,gBAAgB;AACzB,OAA+B;AAC/B,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAMnB,IAAM,eAAN,MAAM,qBAAuE,eAAwB;AAAA,EAArG;AAAA;AAIN;AAAA;AAAA;AAAA,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,OAAgB,aAAa,UAAU,EAAE,GAAS;AAC3D,SAAK,OAAO,UAAU,EAAE;AACxB,WAAO,KAAK,QAAQ,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,OAAgB,aAAa,UAAU,OAAO,GAAS;AACrE,SAAK,OAAO,UAAU,OAAO;AAC7B,WAAO,KAAK,QAAQ,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU,OAAgB,aAAa,UAAU,SAAS,GAAS;AACzE,SAAK,OAAO,UAAU,SAAS;AAC/B,WAAO,KAAK,QAAQ,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW,MAAsB;AACvC,WAAO,KAAK,MAAM,UAAU,YAAY,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKO,aAAa,MAAsB;AACzC,WAAO,KAAK,MAAM,UAAU,cAAc,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU,MAAsB;AACtC,WAAO,KAAK,MAAM,UAAU,WAAW,IAAI;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,SAAS,MAAsB;AACrC,WAAO,KAAK,MAAM,UAAU,UAAU,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,SAAS,MAAgB;AAC/B,WAAO,KAAK,MAAM,UAAU,UAAU,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,MAAM,OAAwB,MAAsB;AAC1D,QAAI,OAAO,UAAU,UAAU;AAC9B,aAAO,KAAK,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,MAAM,CAAC;AAAA,IACjE;AAEA,WAAO,KAAK,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,QAAQ,aAAa,KAAK,EAAE,CAAC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ,MAAqB;AACnC,WAAO,OAAO,SAAS,WAAW,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,MAAoB;AACjC,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,MAAiB;AAC5B,SAAK,eAAe,UAAU,eAAe,EAAE,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,MAAoB;AAC/B,SAAK,eAAe,UAAU,SAAS,EAAE,IAAI,IAAI;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,MACN,MACA,MACO;AACP,QAAI,gBAAgB,UAAU;AAC7B,WAAK,eAAe,IAAI;AACxB,WAAK,KAAK,IAAI;AAAA,IACf,OAAO;AACN,WAAK,eAAe,IAAI,EAAE,IAAI,IAAI;AAAA,IACnC;AAAA,EACD;AAAA;AAAA;AAAA;AAAA,EAKO,KAAK,MAAc,MAAoB;AAC7C,SAAK,eAAe,UAAU,QAAQ,EAAE,OAAO,IAAI,EAAE,IAAI,IAAI;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKO,eAAe,aAA8B;AACnD,SAAK,UAAU,gBAAgB,WAAW;AAC1C,WAAO;AAAA,EACR;AACD;AA3I4G;AAArG,IAAM,cAAN","sourcesContent":["import { IncomingMessage, ServerResponse, STATUS_CODES } from 'node:http';\nimport { Readable } from 'node:stream';\nimport { ReadableStream } from 'node:stream/web';\nimport { MimeTypes } from '../../utils/MimeTypes';\nimport { HttpCodes } from '../http/HttpCodes';\nimport type { CookieStore } from './CookieStore';\n\n/**\n * @since 1.0.0\n */\nexport class ApiResponse<Request extends IncomingMessage = IncomingMessage> extends ServerResponse<Request> {\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic cookies!: CookieStore;\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic ok(data: unknown = STATUS_CODES[HttpCodes.OK]): void {\n\t\tthis.status(HttpCodes.OK);\n\t\treturn this.respond(data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic created(data: unknown = STATUS_CODES[HttpCodes.Created]): void {\n\t\tthis.status(HttpCodes.Created);\n\t\treturn this.respond(data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic noContent(data: unknown = STATUS_CODES[HttpCodes.NoContent]): void {\n\t\tthis.status(HttpCodes.NoContent);\n\t\treturn this.respond(data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic badRequest(data?: unknown): void {\n\t\treturn this.error(HttpCodes.BadRequest, data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic unauthorized(data?: unknown): void {\n\t\treturn this.error(HttpCodes.Unauthorized, data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic forbidden(data?: unknown): void {\n\t\treturn this.error(HttpCodes.Forbidden, data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic notFound(data?: unknown): void {\n\t\treturn this.error(HttpCodes.NotFound, data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic conflict(data?: unknown) {\n\t\treturn this.error(HttpCodes.Conflict, data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic error(error: number | string, data?: unknown): void {\n\t\tif (typeof error === 'string') {\n\t\t\treturn this.status(HttpCodes.InternalServerError).json({ error });\n\t\t}\n\n\t\treturn this.status(error).json({ error: data ?? STATUS_CODES[error] });\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic respond(data: unknown): void {\n\t\treturn typeof data === 'string' ? this.text(data) : this.json(data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic status(code: number): this {\n\t\tthis.statusCode = code;\n\t\treturn this;\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic json(data: any): void {\n\t\tthis.setContentType(MimeTypes.ApplicationJson).end(JSON.stringify(data));\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic text(data: string): void {\n\t\tthis.setContentType(MimeTypes.TextPlain).end(data);\n\t}\n\n\t/**\n\t * @since 6.1.0\n\t *\n\t * Sets the image content type and sends the image data in the response.\n\t *\n\t * @param type - The MIME type of the image (e.g., {@link MimeTypes.ImagePng}).\n\t * @param data - The image data as a `string`, {@link Buffer}, {@link Uint8Array}, or {@link ReadableStream}.\n\t */\n\tpublic image(\n\t\ttype: MimeTypes.ImageGif | MimeTypes.ImageJpg | MimeTypes.ImagePng | MimeTypes.ImageWebp | MimeTypes.ImageXIcon,\n\t\tdata: string | Buffer | Uint8Array | Readable\n\t): void {\n\t\tif (data instanceof Readable) {\n\t\t\tthis.setContentType(type);\n\t\t\tdata.pipe(this);\n\t\t} else {\n\t\t\tthis.setContentType(type).end(data);\n\t\t}\n\t}\n\n\t/**\n\t * @since 5.1.0\n\t */\n\tpublic html(code: number, data: string): void {\n\t\tthis.setContentType(MimeTypes.TextHtml).status(code).end(data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic setContentType(contentType: MimeTypes): this {\n\t\tthis.setHeader('Content-Type', contentType);\n\t\treturn this;\n\t}\n}\n"]}
|
|
@@ -5,10 +5,7 @@ var tldts = require('tldts');
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
7
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
|
-
var __publicField = (obj, key, value) =>
|
|
9
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
-
return value;
|
|
11
|
-
};
|
|
8
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
12
9
|
var _CookieStore = class _CookieStore extends Map {
|
|
13
10
|
constructor(request, response, secure, domainOverwrite) {
|
|
14
11
|
super();
|
|
@@ -22,10 +19,9 @@ var _CookieStore = class _CookieStore extends Map {
|
|
|
22
19
|
const pairs = cookie.split(";");
|
|
23
20
|
for (const pair of pairs) {
|
|
24
21
|
const index = pair.indexOf("=");
|
|
25
|
-
if (index === -1)
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
const value = decodeURIComponent(pair.substr(index + 1).trim());
|
|
22
|
+
if (index === -1) continue;
|
|
23
|
+
const key = decodeURIComponent(pair.slice(0, index).trim());
|
|
24
|
+
const value = decodeURIComponent(pair.slice(index + 1).trim());
|
|
29
25
|
this.set(key, value);
|
|
30
26
|
}
|
|
31
27
|
const [splitHost] = this.request.headers.host?.split(":") ?? [""];
|
|
@@ -48,7 +44,7 @@ var _CookieStore = class _CookieStore extends Map {
|
|
|
48
44
|
} else if (!Array.isArray(set)) {
|
|
49
45
|
set = [set.toString()];
|
|
50
46
|
}
|
|
51
|
-
set = set.filter((i) => i.
|
|
47
|
+
set = set.filter((i) => i.slice(0, i.indexOf("=")) !== name);
|
|
52
48
|
set.push(entry);
|
|
53
49
|
this.response.setHeader("Set-Cookie", set);
|
|
54
50
|
}
|
|
@@ -85,8 +81,7 @@ var _CookieStore = class _CookieStore extends Map {
|
|
|
85
81
|
getHostDomain(host) {
|
|
86
82
|
const lowercaseHost = host.toLowerCase();
|
|
87
83
|
const tldParsedInfo = tldts.getDomain(lowercaseHost);
|
|
88
|
-
if (!tldParsedInfo)
|
|
89
|
-
return lowercaseHost;
|
|
84
|
+
if (!tldParsedInfo) return lowercaseHost;
|
|
90
85
|
return `.${tldParsedInfo}`;
|
|
91
86
|
}
|
|
92
87
|
static encodeCookieOctet(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/structures/api/CookieStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/structures/api/CookieStore.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) 2018 Stanislav Woodger. All rights reserved. MIT license.\n// Source: https://github.com/woodger/cookie-httponly\n\nimport { getDomain } from 'tldts';\nimport type { ApiRequest } from './ApiRequest';\nimport type { ApiResponse } from './ApiResponse';\n\nexport class CookieStore extends Map<string, string> {\n\tprotected request: ApiRequest;\n\tprotected response: ApiResponse;\n\tprivate domain: string;\n\tprivate secure: boolean;\n\n\tpublic constructor(request: ApiRequest, response: ApiResponse, secure: boolean, domainOverwrite?: string | null) {\n\t\tsuper();\n\n\t\tthis.request = request;\n\t\tthis.response = response;\n\n\t\t// Read cookies\n\t\tconst { cookie = '' } = request.headers;\n\t\tconst pairs = cookie.split(';');\n\n\t\tfor (const pair of pairs) {\n\t\t\tconst index = pair.indexOf('=');\n\t\t\tif (index === -1) continue;\n\n\t\t\tconst key = decodeURIComponent(pair.slice(0, index).trim());\n\t\t\tconst value = decodeURIComponent(pair.slice(index + 1).trim());\n\t\t\tthis.set(key, value);\n\t\t}\n\n\t\tconst [splitHost] = this.request.headers.host?.split(':') ?? [''];\n\n\t\tthis.domain = domainOverwrite ?? this.getHostDomain(splitHost);\n\n\t\tif (this.request.socket.remoteAddress === this.domain) {\n\t\t\tthrow new Error('The connection must be established from the domain name (i.e., not an IP address)');\n\t\t}\n\n\t\t// RFC 6265 4.1.2.5. The Secure Attribute\n\t\tthis.secure = secure;\n\t}\n\n\tpublic add(name: string, value: string, options?: SecureCookieStoreSetOptions) {\n\t\tthis.insert(name, this.prepare(name, value, options));\n\t}\n\n\tpublic remove(name: string) {\n\t\tthis.add(name, '', { expires: new Date(0) });\n\t}\n\n\tprotected insert(name: string, entry: string) {\n\t\tlet set = this.response.getHeader('Set-Cookie');\n\n\t\tif (set === undefined) {\n\t\t\tset = [];\n\t\t} else if (!Array.isArray(set)) {\n\t\t\tset = [set.toString()];\n\t\t}\n\n\t\tset = set.filter((i) => i.slice(0, i.indexOf('=')) !== name);\n\t\tset.push(entry);\n\n\t\tthis.response.setHeader('Set-Cookie', set);\n\t}\n\n\tprotected prepare(name: string, value: string, { expires, maxAge, domain, path, httpOnly }: SecureCookieStoreSetOptions = {}) {\n\t\tconst now = new Date();\n\n\t\tif (expires === undefined) {\n\t\t\texpires = now;\n\t\t}\n\n\t\t// RFC 6265 4.1.1. Syntax\n\t\tname = CookieStore.encodeCookieOctet(name);\n\t\tvalue = CookieStore.encodeCookieOctet(value);\n\n\t\tlet entry = `${name}=${value}`;\n\n\t\tif (expires !== now) {\n\t\t\tentry += `; Expires=${expires.toUTCString()}`;\n\t\t} else if (maxAge) {\n\t\t\tentry += `; Max-Age=${maxAge}`;\n\t\t}\n\n\t\t// RFC 6265 5.1.3 Domain Matching\n\t\tdomain = (domain ?? this.domain).toLowerCase();\n\n\t\tentry += `; Domain=${domain}`;\n\t\tentry += `; Path=${path ?? '/'}`;\n\n\t\tif (this.secure) {\n\t\t\tentry += `; Secure`;\n\t\t}\n\n\t\tif (httpOnly ?? true) {\n\t\t\tentry += `; HttpOnly`;\n\t\t}\n\n\t\treturn entry;\n\t}\n\n\t/**\n\t * Parses a host using the {@linkplain https://github.com/remusao/tldts tldts} library to extract the domain.\n\t * This is used for the domain of the cookie\n\t * @param host The hot to parse\n\t * @returns Either the host in all lower case or the parsed domain, ready for use on cookies\n\t */\n\tprivate getHostDomain(host: string): string {\n\t\t// Transform the host to lower case\n\t\tconst lowercaseHost = host.toLowerCase();\n\n\t\t// Try parsing the host with tldts\n\t\tconst tldParsedInfo = getDomain(lowercaseHost);\n\n\t\t// If the domain is not defined then return the host in lowercase\n\t\tif (!tldParsedInfo) return lowercaseHost;\n\n\t\t// If the domain was found from parsing then prefix it with a . for a cookie that works with subdomains and return it\n\t\treturn `.${tldParsedInfo}`;\n\t}\n\n\t// RFC 6265 4.1.1. Syntax\n\tprivate static readonly octetRegExp = /[^\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]/g;\n\n\tprivate static encodeCookieOctet(value: string) {\n\t\tif (CookieStore.octetRegExp.test(value)) {\n\t\t\tthrow new Error(`Invalid character in value`);\n\t\t}\n\n\t\treturn encodeURIComponent(value);\n\t}\n}\n\nexport interface SecureCookieStoreSetOptions {\n\texpires?: Date;\n\tmaxAge?: number;\n\tdomain?: string;\n\tpath?: string;\n\thttpOnly?: boolean;\n}\n"]}
|
|
@@ -6,30 +6,16 @@ var discord_js = require('discord.js');
|
|
|
6
6
|
var undici = require('undici');
|
|
7
7
|
|
|
8
8
|
var __defProp = Object.defineProperty;
|
|
9
|
+
var __typeError = (msg) => {
|
|
10
|
+
throw TypeError(msg);
|
|
11
|
+
};
|
|
9
12
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
13
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
11
|
-
var __publicField = (obj, key, value) =>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var
|
|
16
|
-
if (!member.has(obj))
|
|
17
|
-
throw TypeError("Cannot " + msg);
|
|
18
|
-
};
|
|
19
|
-
var __privateGet = (obj, member, getter) => {
|
|
20
|
-
__accessCheck(obj, member, "read from private field");
|
|
21
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
22
|
-
};
|
|
23
|
-
var __privateAdd = (obj, member, value) => {
|
|
24
|
-
if (member.has(obj))
|
|
25
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
26
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
27
|
-
};
|
|
28
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
29
|
-
__accessCheck(obj, member, "write to private field");
|
|
30
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
31
|
-
return value;
|
|
32
|
-
};
|
|
14
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
15
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
16
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
17
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
18
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
33
19
|
var _secret;
|
|
34
20
|
var _Auth = class _Auth {
|
|
35
21
|
constructor(options) {
|
|
@@ -59,7 +45,7 @@ var _Auth = class _Auth {
|
|
|
59
45
|
*/
|
|
60
46
|
__publicField(this, "transformers");
|
|
61
47
|
__publicField(this, "domainOverwrite", null);
|
|
62
|
-
__privateAdd(this, _secret
|
|
48
|
+
__privateAdd(this, _secret);
|
|
63
49
|
this.id = options.id;
|
|
64
50
|
this.cookie = options.cookie ?? "SAPPHIRE_AUTH";
|
|
65
51
|
this.scopes = options.scopes ?? [discord_js.OAuth2Scopes.Identify];
|
|
@@ -79,7 +65,6 @@ var _Auth = class _Auth {
|
|
|
79
65
|
* Encrypts an object with aes-256-cbc to use as a token.
|
|
80
66
|
* @since 1.0.0
|
|
81
67
|
* @param data An object to encrypt
|
|
82
|
-
* @param secret The secret to encrypt the data with
|
|
83
68
|
*/
|
|
84
69
|
encrypt(data) {
|
|
85
70
|
const iv = crypto.randomBytes(16);
|
|
@@ -90,7 +75,6 @@ var _Auth = class _Auth {
|
|
|
90
75
|
* Decrypts an object with aes-256-cbc to use as a token.
|
|
91
76
|
* @since 1.0.0
|
|
92
77
|
* @param token An data to decrypt
|
|
93
|
-
* @param secret The secret to decrypt the data with
|
|
94
78
|
*/
|
|
95
79
|
decrypt(token) {
|
|
96
80
|
const [data, iv] = token.split(".");
|
|
@@ -120,16 +104,13 @@ var _Auth = class _Auth {
|
|
|
120
104
|
let data = { user, guilds, connections };
|
|
121
105
|
for (const transformer of this.transformers) {
|
|
122
106
|
const result = transformer(data);
|
|
123
|
-
if (utilities.isThenable(result))
|
|
124
|
-
|
|
125
|
-
else
|
|
126
|
-
data = result;
|
|
107
|
+
if (utilities.isThenable(result)) data = await result;
|
|
108
|
+
else data = result;
|
|
127
109
|
}
|
|
128
110
|
return data;
|
|
129
111
|
}
|
|
130
112
|
async fetchInformation(scope, token, url) {
|
|
131
|
-
if (!this.scopes.includes(scope))
|
|
132
|
-
return void 0;
|
|
113
|
+
if (!this.scopes.includes(scope)) return void 0;
|
|
133
114
|
const result = await undici.fetch(url, {
|
|
134
115
|
headers: {
|
|
135
116
|
authorization: `Bearer ${token}`
|
|
@@ -138,8 +119,7 @@ var _Auth = class _Auth {
|
|
|
138
119
|
return result.ok ? await result.json() : null;
|
|
139
120
|
}
|
|
140
121
|
static create(options) {
|
|
141
|
-
if (!options?.secret || !options.id)
|
|
142
|
-
return null;
|
|
122
|
+
if (!options?.secret || !options.id) return null;
|
|
143
123
|
return new _Auth(options);
|
|
144
124
|
}
|
|
145
125
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/structures/http/Auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/structures/http/Auth.ts"],"names":[],"mappings":"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","sourcesContent":["import { isThenable, type Awaitable } from '@sapphire/utilities';\nimport { createCipheriv, createDecipheriv, randomBytes } from 'crypto';\nimport {\n\tOAuth2Scopes,\n\tRouteBases,\n\tRoutes,\n\ttype RESTGetAPICurrentUserConnectionsResult,\n\ttype RESTGetAPICurrentUserGuildsResult,\n\ttype RESTGetAPICurrentUserResult,\n\ttype Snowflake\n} from 'discord.js';\nimport { fetch } from 'undici';\n\nexport class Auth {\n\t/**\n\t * The client's application id, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tpublic id: Snowflake;\n\n\t/**\n\t * The name for the cookie, this will be used to identify a Secure HttpOnly cookie.\n\t * @since 1.0.0\n\t */\n\tpublic cookie: string;\n\n\t/**\n\t * The scopes defined at https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes.\n\t * @since 1.0.0\n\t */\n\tpublic scopes: readonly OAuth2Scopes[];\n\n\t/**\n\t * The redirect uri.\n\t * @since 1.0.0\n\t */\n\tpublic redirect: string | undefined;\n\n\t/**\n\t * The transformers used for {@link Auth.fetchData}.\n\t * @since 1.4.0\n\t */\n\tpublic transformers: LoginDataTransformer[];\n\n\tpublic domainOverwrite: string | null = null;\n\n\t#secret: string;\n\n\tprivate constructor(options: ServerOptionsAuth) {\n\t\tthis.id = options.id as Snowflake;\n\t\tthis.cookie = options.cookie ?? 'SAPPHIRE_AUTH';\n\t\tthis.scopes = options.scopes ?? [OAuth2Scopes.Identify];\n\t\tthis.redirect = options.redirect;\n\t\tthis.#secret = options.secret;\n\t\tthis.transformers = options.transformers ?? [];\n\t\tthis.domainOverwrite = options.domainOverwrite ?? null;\n\t}\n\n\t/**\n\t * The client secret, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tpublic get secret() {\n\t\treturn this.#secret;\n\t}\n\n\t/**\n\t * Encrypts an object with aes-256-cbc to use as a token.\n\t * @since 1.0.0\n\t * @param data An object to encrypt\n\t */\n\tpublic encrypt(data: AuthData): string {\n\t\tconst iv = randomBytes(16);\n\t\tconst cipher = createCipheriv('aes-256-cbc', this.#secret, iv);\n\t\treturn `${cipher.update(JSON.stringify(data), 'utf8', 'base64') + cipher.final('base64')}.${iv.toString('base64')}`;\n\t}\n\n\t/**\n\t * Decrypts an object with aes-256-cbc to use as a token.\n\t * @since 1.0.0\n\t * @param token An data to decrypt\n\t */\n\tpublic decrypt(token: string): AuthData | null {\n\t\tconst [data, iv] = token.split('.');\n\t\tconst decipher = createDecipheriv('aes-256-cbc', this.#secret, Buffer.from(iv, 'base64'));\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(decipher.update(data, 'base64', 'utf8') + decipher.final('utf8')) as AuthData;\n\t\t\t// If the token expired, return null:\n\t\t\treturn parsed.expires >= Date.now() ? parsed : null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves the data for a specific user.\n\t * @since 1.4.0\n\t * @param token The access token from the user.\n\t */\n\tpublic async fetchData(token: string): Promise<LoginData> {\n\t\t// Fetch the information:\n\t\tconst [user, guilds, connections] = await Promise.all([\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserResult>(OAuth2Scopes.Identify, token, `${RouteBases.api}${Routes.user()}`),\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserGuildsResult>(OAuth2Scopes.Guilds, token, `${RouteBases.api}${Routes.userGuilds()}`),\n\t\t\tthis.fetchInformation<RESTGetAPICurrentUserConnectionsResult>(\n\t\t\t\tOAuth2Scopes.Connections,\n\t\t\t\ttoken,\n\t\t\t\t`${RouteBases.api}${Routes.userConnections()}`\n\t\t\t)\n\t\t]);\n\n\t\t// Transform the information:\n\t\tlet data: LoginData = { user, guilds, connections };\n\t\tfor (const transformer of this.transformers) {\n\t\t\tconst result = transformer(data);\n\t\t\tif (isThenable(result)) data = await result;\n\t\t\telse data = result as LoginData;\n\t\t}\n\n\t\treturn data;\n\t}\n\n\tprivate async fetchInformation<T>(scope: OAuth2Scopes, token: string, url: string): Promise<T | null | undefined> {\n\t\tif (!this.scopes.includes(scope)) return undefined;\n\n\t\tconst result = await fetch(url, {\n\t\t\theaders: {\n\t\t\t\tauthorization: `Bearer ${token}`\n\t\t\t}\n\t\t});\n\n\t\treturn result.ok ? ((await result.json()) as T) : null;\n\t}\n\n\tpublic static create(options?: ServerOptionsAuth): Auth | null {\n\t\tif (!options?.secret || !options.id) return null;\n\t\treturn new Auth(options);\n\t}\n}\n\n/**\n * Defines the authentication data, this is to be encrypted and decrypted by the server.\n * @since 1.0.0\n */\nexport interface AuthData {\n\t/**\n\t * The user ID.\n\t * @since 1.0.0\n\t */\n\tid: string;\n\n\t/**\n\t * The timestamp at which the token expires.\n\t * @since 1.0.0\n\t */\n\texpires: number;\n\n\t/**\n\t * The refresh token.\n\t * @since 1.0.0\n\t */\n\trefresh: string;\n\n\t/**\n\t * The access token.\n\t * @since 1.0.0\n\t */\n\ttoken: string;\n}\n\n/**\n * Defines the authentication options.\n * @since 1.0.0\n */\nexport interface ServerOptionsAuth {\n\t/**\n\t * The client's application id, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tid: string;\n\n\t/**\n\t * The name for the cookie, this will be used to identify a Secure HttpOnly cookie.\n\t * @since 1.0.0\n\t * @default 'SAPPHIRE_AUTH'\n\t */\n\tcookie?: string;\n\n\t/**\n\t * The client secret, this can be retrieved in Discord Developer Portal at https://discord.com/developers/applications.\n\t * @since 1.0.0\n\t */\n\tsecret: string;\n\n\t/**\n\t * The scopes defined at https://discord.com/developers/docs/topics/oauth2#shared-resources-oauth2-scopes.\n\t * @since 1.0.0\n\t * @default [OAuth2Scopes.Identify]\n\t */\n\tscopes?: OAuth2Scopes[];\n\n\t/**\n\t * The redirect uri. This will default to {@link OAuth2BodyData.redirectUri} if missing.\n\t * @since 1.0.0\n\t */\n\tredirect?: string;\n\n\t/**\n\t * The login data transformers used for {@link Auth.fetchData}.\n\t * @since 1.4.0\n\t * @default []\n\t */\n\ttransformers?: LoginDataTransformer[];\n\t/**\n\t * The domain that should be used for the cookie. This overwrites the automatic detection of the domain.\n\t * @remark if you want to support subdomains (`one.example.two` and `two.example.com`) then you need to use prefix your domain with a `.`, for example `.example.com`\n\t * @since 2.1.0\n\t * @default undefined\n\t */\n\tdomainOverwrite?: string;\n}\n\n/**\n * The login data sent when fetching data from a user.\n * @since 1.4.0\n */\nexport interface LoginData {\n\t/**\n\t * The user data, defined when the `'identify'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tuser?: RESTGetAPICurrentUserResult | null;\n\n\t/**\n\t * The guilds data, defined when the `'guilds'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tguilds?: RESTGetAPICurrentUserGuildsResult | null;\n\n\t/**\n\t * The connections data, defined when the `'connections'` scope is defined.\n\t * @since 1.4.0\n\t */\n\tconnections?: RESTGetAPICurrentUserConnectionsResult | null;\n}\n\n/**\n * A login data transformer.\n * @since 1.4.0\n */\nexport interface LoginDataTransformer<T extends LoginData = LoginData> {\n\t/**\n\t * Transforms the object by mutating its properties or adding new ones.\n\t * @since 1.4.0\n\t */\n\t(data: LoginData): Awaitable<T>;\n}\n"]}
|
|
@@ -1,12 +1,43 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var http = require('http');
|
|
4
|
-
|
|
5
3
|
// src/lib/structures/http/HttpMethods.ts
|
|
6
|
-
var
|
|
7
|
-
|
|
4
|
+
var MethodNames = [
|
|
5
|
+
"ACL",
|
|
6
|
+
"BIND",
|
|
7
|
+
"CHECKOUT",
|
|
8
|
+
"CONNECT",
|
|
9
|
+
"COPY",
|
|
10
|
+
"DELETE",
|
|
11
|
+
"GET",
|
|
12
|
+
"HEAD",
|
|
13
|
+
"LINK",
|
|
14
|
+
"LOCK",
|
|
15
|
+
"M-SEARCH",
|
|
16
|
+
"MERGE",
|
|
17
|
+
"MKACTIVITY",
|
|
18
|
+
"MKCALENDAR",
|
|
19
|
+
"MKCOL",
|
|
20
|
+
"MOVE",
|
|
21
|
+
"NOTIFY",
|
|
22
|
+
"OPTIONS",
|
|
23
|
+
"PATCH",
|
|
24
|
+
"POST",
|
|
25
|
+
"PROPFIND",
|
|
26
|
+
"PROPPATCH",
|
|
27
|
+
"PURGE",
|
|
28
|
+
"PUT",
|
|
29
|
+
"REBIND",
|
|
30
|
+
"REPORT",
|
|
31
|
+
"SEARCH",
|
|
32
|
+
"SOURCE",
|
|
33
|
+
"SUBSCRIBE",
|
|
34
|
+
"TRACE",
|
|
35
|
+
"UNBIND",
|
|
36
|
+
"UNLINK",
|
|
37
|
+
"UNLOCK",
|
|
38
|
+
"UNSUBSCRIBE"
|
|
39
|
+
];
|
|
8
40
|
|
|
9
|
-
exports.
|
|
10
|
-
exports.methods = methods;
|
|
41
|
+
exports.MethodNames = MethodNames;
|
|
11
42
|
//# sourceMappingURL=out.js.map
|
|
12
43
|
//# sourceMappingURL=HttpMethods.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/structures/http/HttpMethods.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/structures/http/HttpMethods.ts"],"names":[],"mappings":";AAEO,IAAM,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD","sourcesContent":["export type MethodName = (typeof MethodNames)[number];\n\nexport const MethodNames = [\n\t'ACL',\n\t'BIND',\n\t'CHECKOUT',\n\t'CONNECT',\n\t'COPY',\n\t'DELETE',\n\t'GET',\n\t'HEAD',\n\t'LINK',\n\t'LOCK',\n\t'M-SEARCH',\n\t'MERGE',\n\t'MKACTIVITY',\n\t'MKCALENDAR',\n\t'MKCOL',\n\t'MOVE',\n\t'NOTIFY',\n\t'OPTIONS',\n\t'PATCH',\n\t'POST',\n\t'PROPFIND',\n\t'PROPPATCH',\n\t'PURGE',\n\t'PUT',\n\t'REBIND',\n\t'REPORT',\n\t'SEARCH',\n\t'SOURCE',\n\t'SUBSCRIBE',\n\t'TRACE',\n\t'UNBIND',\n\t'UNLINK',\n\t'UNLOCK',\n\t'UNSUBSCRIBE'\n] as const;\n"]}
|
|
@@ -13,10 +13,7 @@ var Auth_cjs = require('./Auth.cjs');
|
|
|
13
13
|
var __defProp = Object.defineProperty;
|
|
14
14
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
15
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
16
|
-
var __publicField = (obj, key, value) =>
|
|
17
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
18
|
-
return value;
|
|
19
|
-
};
|
|
16
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
20
17
|
var ServerEvents = /* @__PURE__ */ ((ServerEvents2) => {
|
|
21
18
|
ServerEvents2["Error"] = "error";
|
|
22
19
|
ServerEvents2["Request"] = "request";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/structures/http/Server.ts"],"names":["ServerEvents","error"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/structures/http/Server.ts"],"names":["ServerEvents","error"],"mappings":";;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAA+B,gBAAgB,wBAA2D;AAE1G,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAEhC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,YAAoC;AAEtC,IAAK,eAAL,kBAAKA,kBAAL;AACN,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,WAAQ;AACR,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,gBAAa;AACb,EAAAA,cAAA,uBAAoB;AACpB,EAAAA,cAAA,qBAAkB;AAClB,EAAAA,cAAA,uBAAoB;AART,SAAAA;AAAA,GAAA;AAcL,IAAM,UAAN,MAAM,gBAAe,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCjC,YAAY,EAAE,MAAM,GAAG,QAAQ,IAAmB,CAAC,GAAG;AAC5D,UAAM;AArCP;AAAA;AAAA;AAAA;AAAA,wBAAgB;AAMhB;AAAA;AAAA;AAAA;AAAA,wBAAgB;AAMhB;AAAA;AAAA;AAAA;AAAA,wBAAgB;AAMhB;AAAA;AAAA;AAAA;AAAA,wBAAgB;AAMhB;AAAA;AAAA;AAAA;AAAA,wBAAgB;AAMhB;AAAA;AAAA;AAAA;AAAA,wBAAgB;AASf,cAAU,SAAS;AAEnB,SAAK,UAAU;AACf,SAAK,SAAS,iBAAiB;AAAA,MAC9B,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,GAAI,QAAQ,UAAU,CAAC;AAAA,IACxB,CAAC;AACD,SAAK,SAAS,IAAI,WAAW;AAC7B,SAAK,cAAc,IAAI,gBAAgB;AACvC,SAAK,eAAe,IAAI,iBAAiB;AACzC,SAAK,OAAO,KAAK,OAAO,IAAI;AAC5B,SAAK,OAAO,GAAG,SAAS,KAAK,KAAK,KAAK,MAAM,mBAAkB,CAAC;AAChE,SAAK,OAAO,GAAG,WAAW,KAAK,KAAK,KAAK,MAAM,uBAAoB,CAAC;AAAA,EACrE;AAAA,EAEO,UAAU;AAChB,UAAM,EAAE,OAAO,IAAI;AACnB,WAAO,OAAO;AAAA,MACb,MAAM;AAAA,MACN,GAAI,KAAK,QAAQ,iBAAiB,CAAC;AAAA,IACpC,CAAC;AAED,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC7C,eAAS,YAAY;AACpB,gBAAQ;AACR,gBAAQ;AAAA,MACT;AAHS;AAKT,eAAS,MAAMC,QAAc;AAC5B,gBAAQ;AACR,eAAOA,MAAK;AAAA,MACb;AAHS;AAKT,eAAS,QAAQ;AAChB,gBAAQ;AACR,eAAO,IAAI,MAAM,sBAAsB,CAAC;AAAA,MACzC;AAHS;AAKT,eAAS,UAAU;AAClB,eAAO,IAAI,aAAa,SAAS;AACjC,eAAO,IAAI,SAAS,KAAK;AACzB,eAAO,IAAI,SAAS,KAAK;AAAA,MAC1B;AAJS;AAMT,aAAO,GAAG,aAAa,SAAS;AAChC,aAAO,GAAG,SAAS,KAAK;AACxB,aAAO,GAAG,SAAS,KAAK;AAAA,IACzB,CAAC;AAAA,EACF;AAAA,EAEO,aAAa;AACnB,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC7C,WAAK,OAAO,MAAM,CAAC,UAAW,QAAQ,QAAQ,IAAI,OAAO,KAAK,CAAE;AAAA,IACjE,CAAC;AAAA,EACF;AACD;AApGyC;AAAlC,IAAM,SAAN","sourcesContent":["import { container } from '@sapphire/pieces';\nimport { EventEmitter } from 'node:events';\nimport { Server as HttpServer, createServer as httpCreateServer, type ServerOptions as HttpOptions } from 'node:http';\nimport type { ListenOptions } from 'node:net';\nimport { MediaParserStore } from '../MediaParserStore';\nimport { MiddlewareStore } from '../MiddlewareStore';\nimport type { Route } from '../Route';\nimport { RouteStore } from '../RouteStore';\nimport { ApiRequest } from '../api/ApiRequest';\nimport { ApiResponse } from '../api/ApiResponse';\nimport { Auth, type ServerOptionsAuth } from './Auth';\n\nexport enum ServerEvents {\n\tError = 'error',\n\tRequest = 'request',\n\tMatch = 'match',\n\tNoMatch = 'noMatch',\n\tRouteError = 'routeError',\n\tMiddlewareFailure = 'middlewareFailure',\n\tMiddlewareError = 'middlewareError',\n\tMiddlewareSuccess = 'middlewareSuccess'\n}\n\n/**\n * @since 1.0.0\n */\nexport class Server extends EventEmitter {\n\t/**\n\t * The routes this server holds.\n\t * @since 1.0.0\n\t */\n\tpublic readonly routes: RouteStore;\n\n\t/**\n\t * The middlewares this server holds.\n\t * @since 1.0.0\n\t */\n\tpublic readonly middlewares: MiddlewareStore;\n\n\t/**\n\t * The media parsers this server holds.\n\t * @since 1.3.0\n\t */\n\tpublic readonly mediaParsers: MediaParserStore;\n\n\t/**\n\t * The authentication system.\n\t * @since 1.0.0\n\t */\n\tpublic readonly auth: Auth | null;\n\n\t/**\n\t * The http.Server instance that manages the recieved HTTP requests.\n\t * @since 1.0.0\n\t */\n\tpublic readonly server: HttpServer;\n\n\t/**\n\t * The options for this server.\n\t * @since 1.0.0\n\t */\n\tpublic readonly options: AuthLessServerOptions;\n\n\t/**\n\t * @since 1.0.0\n\t * @param options The options for this server\n\t */\n\tpublic constructor({ auth, ...options }: ServerOptions = {}) {\n\t\tsuper();\n\n\t\tcontainer.server = this;\n\n\t\tthis.options = options;\n\t\tthis.server = httpCreateServer({\n\t\t\tIncomingMessage: ApiRequest,\n\t\t\tServerResponse: ApiResponse,\n\t\t\t...(options.server ?? {})\n\t\t});\n\t\tthis.routes = new RouteStore();\n\t\tthis.middlewares = new MiddlewareStore();\n\t\tthis.mediaParsers = new MediaParserStore();\n\t\tthis.auth = Auth.create(auth);\n\t\tthis.server.on('error', this.emit.bind(this, ServerEvents.Error));\n\t\tthis.server.on('request', this.emit.bind(this, ServerEvents.Request));\n\t}\n\n\tpublic connect() {\n\t\tconst { server } = this;\n\t\tserver.listen({\n\t\t\tport: 4000,\n\t\t\t...(this.options.listenOptions ?? {})\n\t\t});\n\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tfunction listening() {\n\t\t\t\tcleanup();\n\t\t\t\tresolve();\n\t\t\t}\n\n\t\t\tfunction error(error: Error) {\n\t\t\t\tcleanup();\n\t\t\t\treject(error);\n\t\t\t}\n\n\t\t\tfunction close() {\n\t\t\t\tcleanup();\n\t\t\t\treject(new Error('Closed unexpectedly.'));\n\t\t\t}\n\n\t\t\tfunction cleanup() {\n\t\t\t\tserver.off('listening', listening);\n\t\t\t\tserver.off('error', error);\n\t\t\t\tserver.off('close', close);\n\t\t\t}\n\n\t\t\tserver.on('listening', listening);\n\t\t\tserver.on('error', error);\n\t\t\tserver.on('close', close);\n\t\t});\n\t}\n\n\tpublic disconnect() {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tthis.server.close((error) => (error ? resolve() : reject(error)));\n\t\t});\n\t}\n}\n\n/**\n * RFC 1341 4: Defines a Content-Type's type, which follows the following structure:\n *\n * - `type` = `text` | `multipart` | `message` | `image` | `audio` | `video` | `application` | x-token\n * - `x-token` = The two characters \"X-\" followed, with no intervening white space, by any token\n * @since 1.3.0\n */\nexport type ContentTypeType = 'text' | 'multipart' | 'message' | 'image' | 'audio' | 'video' | 'application' | `X-${string}`;\n\n/**\n * RFC 1341 4: Defines a Content-Type's parameter, which follows the following structure:\n *\n * - `parameter` = `attribute` \"=\" `value`\n * - `attribute` = `token`\n * - `value` = `token` / `quoted-string`\n * - `token` = `1*<any CHAR except \"SPACE\", \"CTLs\", or \"tspecials\">`\n * - `tspecials` = `(` | `)` | `<` | `>` | `@` | `,` | `;` | `:` | `\\` | `\"` | `/` | `[` | `]` | `?` | `.` | `=`\n *\n * @note `tspecials` must be in quoted-string, to use within parameter values.\n * @note The definition of `tspecials` is the same as the RFC 822 definition of `specials` with the addition of the\n * three characters `/`, `?`, and `=`.\n * @since 1.3.0\n */\nexport type ContentTypeParameter = `; ${string}=${string}`;\n\n/**\n * RFC 1341 4: Defines the syntax for a Content-Type field without parameters, which follows the following structure:\n * `type \"/\" subtype`.\n */\nexport type MimeTypeWithoutParameters = `${ContentTypeType}/${string}`;\n\n/**\n * RFC 1341 4: Defines the syntax for a Content-Type field, which follows the following structure:\n * `type \"/\" subtype *[\";\" parameter]`.\n * @since 1.3.0\n */\nexport type MimeType = `${MimeTypeWithoutParameters}${'' | ContentTypeParameter}`;\n\n/**\n * The API options.\n * @since 1.0.0\n */\nexport interface ServerOptions {\n\t/**\n\t * The prefix for all routes, e.g. `v1/`.\n\t * @since 1.0.0\n\t * @default ''\n\t */\n\tprefix?: string;\n\n\t/**\n\t * The origin header to be set on every request at 'Access-Control-Allow-Origin'.\n\t * @since 1.0.0\n\t * @default '*'\n\t */\n\torigin?: string;\n\n\t/**\n\t * (RFC 7230 3.3.2) The maximum decimal number of octets.\n\t * @since 1.0.0\n\t * @default 1024 * 1024 * 50\n\t */\n\tmaximumBodyLength?: number;\n\n\t/**\n\t * The accepted content types for this route. If set to null, the route will accept any data.\n\t * @since 1.3.0\n\t * @default null\n\t */\n\tacceptedContentMimeTypes?: MimeTypeWithoutParameters[] | null;\n\n\t/**\n\t * The HTTP server options.\n\t * @since 1.0.0\n\t * @default {}\n\t */\n\tserver?: HttpOptions;\n\n\t/**\n\t * The HTTP listen options.\n\t * @since 1.0.0\n\t * @default { port: 4000 }\n\t */\n\tlistenOptions?: ListenOptions;\n\n\t/**\n\t * The auth options. If neither `auth` nor `auth.secret` are defined, auth-related routes and middlewares will be\n\t * automatically disabled.\n\t * @since 1.0.0\n\t * @default {}\n\t */\n\tauth?: ServerOptionsAuth;\n\n\t/**\n\t * Whether the server should connect upon being when the plugin is loaded.\n\t * @since 3.2.0\n\t * @default true\n\t */\n\tautomaticallyConnect?: boolean;\n}\n\n/**\n * The {@link ServerOptions} without {@link ServerOptions.auth}.\n * @since 1.0.0\n */\nexport type AuthLessServerOptions = Omit<ServerOptions, 'auth'>;\n\n/**\n * The context sent in the error events.\n * @since 1.2.0\n */\nexport interface MiddlewareErrorContext {\n\t/**\n\t * The erroneous request.\n\t * @since 1.2.0\n\t */\n\trequest: ApiRequest;\n\n\t/**\n\t * The server's response.\n\t * @since 1.2.0\n\t */\n\tresponse: ApiResponse;\n\n\t/**\n\t * The route match.\n\t * @since 1.2.0\n\t */\n\troute: Route;\n}\n"]}
|
|
@@ -3,13 +3,9 @@
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
5
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
-
var __publicField = (obj, key, value) =>
|
|
7
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
-
return value;
|
|
9
|
-
};
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
7
|
|
|
11
8
|
// src/lib/utils/RouteData.ts
|
|
12
|
-
var [slash, colon] = [47, 58];
|
|
13
9
|
var TypeState = /* @__PURE__ */ ((TypeState2) => {
|
|
14
10
|
TypeState2[TypeState2["Static"] = 0] = "Static";
|
|
15
11
|
TypeState2[TypeState2["Dynamic"] = 1] = "Dynamic";
|
|
@@ -21,21 +17,18 @@ var _RouteData = class _RouteData {
|
|
|
21
17
|
__publicField(this, "static");
|
|
22
18
|
__publicField(this, "parts");
|
|
23
19
|
this.path = path;
|
|
24
|
-
this.parts = _RouteData.split(path).map(_RouteData.parsePart
|
|
20
|
+
this.parts = _RouteData.split(path).map((value) => _RouteData.parsePart(value));
|
|
25
21
|
this.static = this.parts.every((part) => part.type === 0 /* Static */);
|
|
26
22
|
}
|
|
27
23
|
match(split) {
|
|
28
|
-
if (split.length !== this.parts.length)
|
|
29
|
-
|
|
30
|
-
if (this.static)
|
|
31
|
-
return this.parts.every((part, index) => part.value === split[index]) ? {} : null;
|
|
24
|
+
if (split.length !== this.parts.length) return null;
|
|
25
|
+
if (this.static) return this.parts.every((part, index) => part.value === split[index]) ? {} : null;
|
|
32
26
|
const parameters = [];
|
|
33
27
|
for (let i = 0; i < this.parts.length; ++i) {
|
|
34
28
|
const part = this.parts[i];
|
|
35
29
|
const value = split[i];
|
|
36
30
|
if (part.type === 0 /* Static */) {
|
|
37
|
-
if (part.value === value)
|
|
38
|
-
continue;
|
|
31
|
+
if (part.value === value) continue;
|
|
39
32
|
return null;
|
|
40
33
|
}
|
|
41
34
|
parameters.push([part.value, value]);
|
|
@@ -46,21 +39,17 @@ var _RouteData = class _RouteData {
|
|
|
46
39
|
* @since 1.0.0
|
|
47
40
|
*/
|
|
48
41
|
static parsePart(value) {
|
|
49
|
-
const type = value.
|
|
50
|
-
if (type === 1 /* Dynamic */)
|
|
51
|
-
value = value.substring(1);
|
|
42
|
+
const type = value.length > 2 && value.at(0) === "[" && value.at(-1) === "]" ? 1 /* Dynamic */ : 0 /* Static */;
|
|
43
|
+
if (type === 1 /* Dynamic */) value = value.slice(1, -1);
|
|
52
44
|
return { value, type };
|
|
53
45
|
}
|
|
54
46
|
/**
|
|
55
47
|
* @since 1.0.0
|
|
56
48
|
*/
|
|
57
49
|
static split(url) {
|
|
58
|
-
if (url.length === 1 && url.
|
|
59
|
-
|
|
60
|
-
if (url.
|
|
61
|
-
url = url.substring(1);
|
|
62
|
-
if (url.length > 0 && url.charCodeAt(url.length - 1) === slash)
|
|
63
|
-
url = url.substring(0, url.length - 1);
|
|
50
|
+
if (url.length === 1 && url.at(0) === "/") return [""];
|
|
51
|
+
if (url.at(0) === "/") url = url.slice(1);
|
|
52
|
+
if (url.length > 0 && url.at(-1) === "/") url = url.slice(0, -1);
|
|
64
53
|
return url.split("/");
|
|
65
54
|
}
|
|
66
55
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/utils/RouteData.ts"],"names":["TypeState"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/utils/RouteData.ts"],"names":["TypeState"],"mappings":";;;;;;AAGO,IAAK,YAAL,kBAAKA,eAAL;AAIN,EAAAA,sBAAA;AAKA,EAAAA,sBAAA;AATW,SAAAA;AAAA,GAAA;AAcL,IAAM,aAAN,MAAM,WAAU;AAAA,EAKf,YAAY,MAAc;AAJjC,wBAAgB;AAChB,wBAAiB;AACjB,wBAAiB;AAGhB,SAAK,OAAO;AACZ,SAAK,QAAQ,WAAU,MAAM,IAAI,EAAE,IAAI,CAAC,UAAU,WAAU,UAAU,KAAK,CAAC;AAC5E,SAAK,SAAS,KAAK,MAAM,MAAM,CAAC,SAAS,KAAK,SAAS,cAAgB;AAAA,EACxE;AAAA,EAEO,MAAM,OAAqC;AACjD,QAAI,MAAM,WAAW,KAAK,MAAM,OAAQ,QAAO;AAC/C,QAAI,KAAK,OAAQ,QAAO,KAAK,MAAM,MAAM,CAAC,MAAM,UAAU,KAAK,UAAU,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI;AAE9F,UAAM,aAAiC,CAAC;AACxC,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,EAAE,GAAG;AAC3C,YAAM,OAAO,KAAK,MAAM,CAAC;AACzB,YAAM,QAAQ,MAAM,CAAC;AAErB,UAAI,KAAK,SAAS,gBAAkB;AACnC,YAAI,KAAK,UAAU,MAAO;AAC1B,eAAO;AAAA,MACR;AAEA,iBAAW,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC;AAAA,IACpC;AAEA,WAAO,OAAO,YAAY,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,UAAU,OAA2B;AACnD,UAAM,OAAO,MAAM,SAAS,KAAK,MAAM,GAAG,CAAC,MAAM,OAAO,MAAM,GAAG,EAAE,MAAM,MAAM,kBAAoB;AACnG,QAAI,SAAS,gBAAmB,SAAQ,MAAM,MAAM,GAAG,EAAE;AACzD,WAAO,EAAE,OAAO,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,MAAM,KAAuB;AAC3C,QAAI,IAAI,WAAW,KAAK,IAAI,GAAG,CAAC,MAAM,IAAK,QAAO,CAAC,EAAE;AACrD,QAAI,IAAI,GAAG,CAAC,MAAM,IAAK,OAAM,IAAI,MAAM,CAAC;AACxC,QAAI,IAAI,SAAS,KAAK,IAAI,GAAG,EAAE,MAAM,IAAK,OAAM,IAAI,MAAM,GAAG,EAAE;AAC/D,WAAO,IAAI,MAAM,GAAG;AAAA,EACrB;AACD;AAjDuB;AAAhB,IAAM,YAAN","sourcesContent":["/**\n * @since 1.0.0\n */\nexport enum TypeState {\n\t/**\n\t * @since 1.0.0\n\t */\n\tStatic,\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tDynamic\n}\n\nexport type MatchData = Record<string, string> | null;\n\nexport class RouteData {\n\tpublic readonly path: string;\n\tprivate readonly static: boolean;\n\tprivate readonly parts: readonly ParsedPart[];\n\n\tpublic constructor(path: string) {\n\t\tthis.path = path;\n\t\tthis.parts = RouteData.split(path).map((value) => RouteData.parsePart(value));\n\t\tthis.static = this.parts.every((part) => part.type === TypeState.Static);\n\t}\n\n\tpublic match(split: readonly string[]): MatchData {\n\t\tif (split.length !== this.parts.length) return null;\n\t\tif (this.static) return this.parts.every((part, index) => part.value === split[index]) ? {} : null;\n\n\t\tconst parameters: [string, string][] = [];\n\t\tfor (let i = 0; i < this.parts.length; ++i) {\n\t\t\tconst part = this.parts[i];\n\t\t\tconst value = split[i];\n\n\t\t\tif (part.type === TypeState.Static) {\n\t\t\t\tif (part.value === value) continue;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tparameters.push([part.value, value]);\n\t\t}\n\n\t\treturn Object.fromEntries(parameters);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tprivate static parsePart(value: string): ParsedPart {\n\t\tconst type = value.length > 2 && value.at(0) === '[' && value.at(-1) === ']' ? TypeState.Dynamic : TypeState.Static;\n\t\tif (type === TypeState.Dynamic) value = value.slice(1, -1);\n\t\treturn { value, type };\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tprivate static split(url: string): string[] {\n\t\tif (url.length === 1 && url.at(0) === '/') return [''];\n\t\tif (url.at(0) === '/') url = url.slice(1);\n\t\tif (url.length > 0 && url.at(-1) === '/') url = url.slice(0, -1);\n\t\treturn url.split('/');\n\t}\n}\n\nexport interface ParsedPart {\n\tvalue: string;\n\ttype: TypeState;\n}\n"]}
|
|
@@ -12,8 +12,7 @@ var _PluginListener = class _PluginListener extends framework.Listener {
|
|
|
12
12
|
}
|
|
13
13
|
run(error, { response }) {
|
|
14
14
|
this.container.logger.fatal(error);
|
|
15
|
-
if (!response.writableEnded)
|
|
16
|
-
response.status(HttpCodes_cjs.HttpCodes.InternalServerError).json({ error: error.message ?? error });
|
|
15
|
+
if (!response.writableEnded) response.status(HttpCodes_cjs.HttpCodes.InternalServerError).json({ error: error.message ?? error });
|
|
17
16
|
}
|
|
18
17
|
};
|
|
19
18
|
__name(_PluginListener, "PluginListener");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/listeners/PluginRouteError.ts"],"names":[],"mappings":";;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,oBAAiD;AAEnD,IAAM,kBAAN,MAAM,wBAAuB,SAAS;AAAA,EACrC,YAAY,SAAiC;AACnD,UAAM,SAAS,EAAE,SAAS,UAAU,OAAO,aAAa,WAAW,CAAC;AAAA,EACrE;AAAA,EAEgB,IAAI,OAAc,EAAE,SAAS,GAA2B;AAEvE,SAAK,UAAU,OAAO,MAAM,KAAK;AAGjC,QAAI,CAAC,SAAS
|
|
1
|
+
{"version":3,"sources":["../../../src/listeners/PluginRouteError.ts"],"names":[],"mappings":";;;;AAAA,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,oBAAiD;AAEnD,IAAM,kBAAN,MAAM,wBAAuB,SAAS;AAAA,EACrC,YAAY,SAAiC;AACnD,UAAM,SAAS,EAAE,SAAS,UAAU,OAAO,aAAa,WAAW,CAAC;AAAA,EACrE;AAAA,EAEgB,IAAI,OAAc,EAAE,SAAS,GAA2B;AAEvE,SAAK,UAAU,OAAO,MAAM,KAAK;AAGjC,QAAI,CAAC,SAAS,cAAe,UAAS,OAAO,UAAU,mBAAmB,EAAE,KAAK,EAAE,OAAO,MAAM,WAAW,MAAM,CAAC;AAAA,EACnH;AACD;AAZ6C;AAAtC,IAAM,iBAAN","sourcesContent":["import { Listener } from '@sapphire/framework';\nimport { HttpCodes } from '../lib/structures/http/HttpCodes';\nimport { ServerEvents, type MiddlewareErrorContext } from '../lib/structures/http/Server';\n\nexport class PluginListener extends Listener {\n\tpublic constructor(context: Listener.LoaderContext) {\n\t\tsuper(context, { emitter: 'server', event: ServerEvents.RouteError });\n\t}\n\n\tpublic override run(error: Error, { response }: MiddlewareErrorContext) {\n\t\t// Log the error to console:\n\t\tthis.container.logger.fatal(error);\n\n\t\t// Send a response to the client if none was sent:\n\t\tif (!response.writableEnded) response.status(HttpCodes.InternalServerError).json({ error: error.message ?? error });\n\t}\n}\n"]}
|