@sapphire/plugin-api 7.0.0-next.fc8e636 → 7.0.0

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.
Files changed (193) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +0 -1
  3. package/dist/cjs/index.cjs +6 -32
  4. package/dist/cjs/index.cjs.map +1 -1
  5. package/dist/cjs/index.d.cts +91 -109
  6. package/dist/cjs/lib/structures/Augmentations.d.cjs +1 -1
  7. package/dist/cjs/lib/structures/Augmentations.d.cjs.map +1 -1
  8. package/dist/cjs/lib/structures/Middleware.cjs +2 -2
  9. package/dist/cjs/lib/structures/Middleware.cjs.map +1 -1
  10. package/dist/cjs/lib/structures/MiddlewareStore.cjs +2 -2
  11. package/dist/cjs/lib/structures/MiddlewareStore.cjs.map +1 -1
  12. package/dist/cjs/lib/structures/Route.cjs +5 -10
  13. package/dist/cjs/lib/structures/Route.cjs.map +1 -1
  14. package/dist/cjs/lib/structures/RouteLoaderStrategy.cjs +1 -1
  15. package/dist/cjs/lib/structures/RouteLoaderStrategy.cjs.map +1 -1
  16. package/dist/cjs/lib/structures/RouteStore.cjs +2 -2
  17. package/dist/cjs/lib/structures/RouteStore.cjs.map +1 -1
  18. package/dist/cjs/lib/structures/api/ApiRequest.cjs +129 -5
  19. package/dist/cjs/lib/structures/api/ApiRequest.cjs.map +1 -1
  20. package/dist/cjs/lib/structures/api/ApiResponse.cjs +6 -7
  21. package/dist/cjs/lib/structures/api/ApiResponse.cjs.map +1 -1
  22. package/dist/cjs/lib/structures/api/CookieStore.cjs +1 -1
  23. package/dist/cjs/lib/structures/api/CookieStore.cjs.map +1 -1
  24. package/dist/cjs/lib/structures/http/Auth.cjs +2 -2
  25. package/dist/cjs/lib/structures/http/Auth.cjs.map +1 -1
  26. package/dist/cjs/lib/structures/http/HttpCodes.cjs +1 -1
  27. package/dist/cjs/lib/structures/http/HttpCodes.cjs.map +1 -1
  28. package/dist/cjs/lib/structures/http/HttpMethods.cjs +2 -1
  29. package/dist/cjs/lib/structures/http/HttpMethods.cjs.map +1 -1
  30. package/dist/cjs/lib/structures/http/Server.cjs +2 -9
  31. package/dist/cjs/lib/structures/http/Server.cjs.map +1 -1
  32. package/dist/cjs/lib/structures/router/RouterBranch.cjs +1 -1
  33. package/dist/cjs/lib/structures/router/RouterBranch.cjs.map +1 -1
  34. package/dist/cjs/lib/structures/router/RouterNode.cjs +2 -2
  35. package/dist/cjs/lib/structures/router/RouterNode.cjs.map +1 -1
  36. package/dist/cjs/lib/structures/router/RouterRoot.cjs +12 -2
  37. package/dist/cjs/lib/structures/router/RouterRoot.cjs.map +1 -1
  38. package/dist/cjs/lib/utils/MimeType.cjs +4 -0
  39. package/dist/cjs/lib/utils/MimeType.cjs.map +1 -0
  40. package/dist/cjs/lib/utils/_body/RequestHeadersProxy.cjs +100 -0
  41. package/dist/cjs/lib/utils/_body/RequestHeadersProxy.cjs.map +1 -0
  42. package/dist/cjs/lib/utils/_body/RequestProxy.cjs +124 -0
  43. package/dist/cjs/lib/utils/_body/RequestProxy.cjs.map +1 -0
  44. package/dist/cjs/lib/utils/_body/RequestURLProxy.cjs +179 -0
  45. package/dist/cjs/lib/utils/_body/RequestURLProxy.cjs.map +1 -0
  46. package/dist/cjs/lib/utils/constants.cjs +8 -0
  47. package/dist/cjs/lib/utils/constants.cjs.map +1 -0
  48. package/dist/cjs/listeners/PluginRouteError.cjs +1 -1
  49. package/dist/cjs/listeners/PluginRouteError.cjs.map +1 -1
  50. package/dist/cjs/listeners/PluginServerMiddlewareError.cjs +1 -1
  51. package/dist/cjs/listeners/PluginServerMiddlewareError.cjs.map +1 -1
  52. package/dist/cjs/listeners/PluginServerMiddlewareSuccess.cjs +1 -1
  53. package/dist/cjs/listeners/PluginServerMiddlewareSuccess.cjs.map +1 -1
  54. package/dist/cjs/listeners/PluginServerRequest.cjs +2 -2
  55. package/dist/cjs/listeners/PluginServerRequest.cjs.map +1 -1
  56. package/dist/cjs/listeners/PluginServerRouterBranchMethodNotAllowed.cjs +1 -1
  57. package/dist/cjs/listeners/PluginServerRouterBranchMethodNotAllowed.cjs.map +1 -1
  58. package/dist/cjs/listeners/PluginServerRouterBranchNotFound.cjs +1 -1
  59. package/dist/cjs/listeners/PluginServerRouterBranchNotFound.cjs.map +1 -1
  60. package/dist/cjs/listeners/PluginServerRouterFound.cjs +3 -2
  61. package/dist/cjs/listeners/PluginServerRouterFound.cjs.map +1 -1
  62. package/dist/cjs/listeners/_load.cjs +1 -1
  63. package/dist/cjs/listeners/_load.cjs.map +1 -1
  64. package/dist/cjs/middlewares/_load.cjs +1 -1
  65. package/dist/cjs/middlewares/_load.cjs.map +1 -1
  66. package/dist/cjs/middlewares/auth.cjs +2 -2
  67. package/dist/cjs/middlewares/auth.cjs.map +1 -1
  68. package/dist/cjs/middlewares/body.cjs +2 -18
  69. package/dist/cjs/middlewares/body.cjs.map +1 -1
  70. package/dist/cjs/middlewares/cookies.cjs +1 -1
  71. package/dist/cjs/middlewares/cookies.cjs.map +1 -1
  72. package/dist/cjs/middlewares/headers.cjs +1 -1
  73. package/dist/cjs/middlewares/headers.cjs.map +1 -1
  74. package/dist/cjs/register.cjs +3 -4
  75. package/dist/cjs/register.cjs.map +1 -1
  76. package/dist/cjs/register.d.cts +0 -1
  77. package/dist/cjs/routes/_load.cjs +1 -1
  78. package/dist/cjs/routes/_load.cjs.map +1 -1
  79. package/dist/cjs/routes/oauth/callback.post.cjs +3 -3
  80. package/dist/cjs/routes/oauth/callback.post.cjs.map +1 -1
  81. package/dist/cjs/routes/oauth/logout.post.cjs +1 -1
  82. package/dist/cjs/routes/oauth/logout.post.cjs.map +1 -1
  83. package/dist/esm/chunk-S573YWRP.mjs +1 -1
  84. package/dist/esm/chunk-S573YWRP.mjs.map +1 -1
  85. package/dist/esm/index.d.mts +91 -109
  86. package/dist/esm/index.mjs +2 -6
  87. package/dist/esm/index.mjs.map +1 -1
  88. package/dist/esm/lib/structures/Augmentations.d.mjs +1 -1
  89. package/dist/esm/lib/structures/Augmentations.d.mjs.map +1 -1
  90. package/dist/esm/lib/structures/Middleware.mjs +1 -1
  91. package/dist/esm/lib/structures/Middleware.mjs.map +1 -1
  92. package/dist/esm/lib/structures/MiddlewareStore.mjs +1 -1
  93. package/dist/esm/lib/structures/MiddlewareStore.mjs.map +1 -1
  94. package/dist/esm/lib/structures/Route.mjs +5 -10
  95. package/dist/esm/lib/structures/Route.mjs.map +1 -1
  96. package/dist/esm/lib/structures/RouteLoaderStrategy.mjs +1 -1
  97. package/dist/esm/lib/structures/RouteLoaderStrategy.mjs.map +1 -1
  98. package/dist/esm/lib/structures/RouteStore.mjs +1 -1
  99. package/dist/esm/lib/structures/RouteStore.mjs.map +1 -1
  100. package/dist/esm/lib/structures/api/ApiRequest.mjs +123 -6
  101. package/dist/esm/lib/structures/api/ApiRequest.mjs.map +1 -1
  102. package/dist/esm/lib/structures/api/ApiResponse.mjs +5 -6
  103. package/dist/esm/lib/structures/api/ApiResponse.mjs.map +1 -1
  104. package/dist/esm/lib/structures/api/CookieStore.mjs +1 -1
  105. package/dist/esm/lib/structures/api/CookieStore.mjs.map +1 -1
  106. package/dist/esm/lib/structures/http/Auth.mjs +1 -1
  107. package/dist/esm/lib/structures/http/Auth.mjs.map +1 -1
  108. package/dist/esm/lib/structures/http/HttpCodes.mjs +1 -1
  109. package/dist/esm/lib/structures/http/HttpCodes.mjs.map +1 -1
  110. package/dist/esm/lib/structures/http/HttpMethods.mjs +2 -1
  111. package/dist/esm/lib/structures/http/HttpMethods.mjs.map +1 -1
  112. package/dist/esm/lib/structures/http/Server.mjs +2 -9
  113. package/dist/esm/lib/structures/http/Server.mjs.map +1 -1
  114. package/dist/esm/lib/structures/router/RouterBranch.mjs +1 -1
  115. package/dist/esm/lib/structures/router/RouterBranch.mjs.map +1 -1
  116. package/dist/esm/lib/structures/router/RouterNode.mjs +1 -1
  117. package/dist/esm/lib/structures/router/RouterNode.mjs.map +1 -1
  118. package/dist/esm/lib/structures/router/RouterRoot.mjs +12 -2
  119. package/dist/esm/lib/structures/router/RouterRoot.mjs.map +1 -1
  120. package/dist/esm/lib/utils/MimeType.mjs +3 -0
  121. package/dist/esm/lib/utils/MimeType.mjs.map +1 -0
  122. package/dist/esm/lib/utils/_body/RequestHeadersProxy.mjs +95 -0
  123. package/dist/esm/lib/utils/_body/RequestHeadersProxy.mjs.map +1 -0
  124. package/dist/esm/lib/utils/_body/RequestProxy.mjs +112 -0
  125. package/dist/esm/lib/utils/_body/RequestProxy.mjs.map +1 -0
  126. package/dist/esm/lib/utils/_body/RequestURLProxy.mjs +167 -0
  127. package/dist/esm/lib/utils/_body/RequestURLProxy.mjs.map +1 -0
  128. package/dist/esm/lib/utils/constants.mjs +8 -0
  129. package/dist/esm/lib/utils/constants.mjs.map +1 -0
  130. package/dist/esm/listeners/PluginRouteError.mjs +1 -1
  131. package/dist/esm/listeners/PluginRouteError.mjs.map +1 -1
  132. package/dist/esm/listeners/PluginServerMiddlewareError.mjs +1 -1
  133. package/dist/esm/listeners/PluginServerMiddlewareError.mjs.map +1 -1
  134. package/dist/esm/listeners/PluginServerMiddlewareSuccess.mjs +1 -1
  135. package/dist/esm/listeners/PluginServerMiddlewareSuccess.mjs.map +1 -1
  136. package/dist/esm/listeners/PluginServerRequest.mjs +2 -2
  137. package/dist/esm/listeners/PluginServerRequest.mjs.map +1 -1
  138. package/dist/esm/listeners/PluginServerRouterBranchMethodNotAllowed.mjs +1 -1
  139. package/dist/esm/listeners/PluginServerRouterBranchMethodNotAllowed.mjs.map +1 -1
  140. package/dist/esm/listeners/PluginServerRouterBranchNotFound.mjs +1 -1
  141. package/dist/esm/listeners/PluginServerRouterBranchNotFound.mjs.map +1 -1
  142. package/dist/esm/listeners/PluginServerRouterFound.mjs +3 -2
  143. package/dist/esm/listeners/PluginServerRouterFound.mjs.map +1 -1
  144. package/dist/esm/listeners/_load.mjs +1 -1
  145. package/dist/esm/listeners/_load.mjs.map +1 -1
  146. package/dist/esm/middlewares/_load.mjs +1 -1
  147. package/dist/esm/middlewares/_load.mjs.map +1 -1
  148. package/dist/esm/middlewares/auth.mjs +1 -1
  149. package/dist/esm/middlewares/auth.mjs.map +1 -1
  150. package/dist/esm/middlewares/body.mjs +3 -17
  151. package/dist/esm/middlewares/body.mjs.map +1 -1
  152. package/dist/esm/middlewares/cookies.mjs +1 -1
  153. package/dist/esm/middlewares/cookies.mjs.map +1 -1
  154. package/dist/esm/middlewares/headers.mjs +1 -1
  155. package/dist/esm/middlewares/headers.mjs.map +1 -1
  156. package/dist/esm/register.d.mts +0 -1
  157. package/dist/esm/register.mjs +3 -4
  158. package/dist/esm/register.mjs.map +1 -1
  159. package/dist/esm/routes/_load.mjs +1 -1
  160. package/dist/esm/routes/_load.mjs.map +1 -1
  161. package/dist/esm/routes/oauth/callback.post.mjs +2 -2
  162. package/dist/esm/routes/oauth/callback.post.mjs.map +1 -1
  163. package/dist/esm/routes/oauth/logout.post.mjs +1 -1
  164. package/dist/esm/routes/oauth/logout.post.mjs.map +1 -1
  165. package/package.json +14 -12
  166. package/dist/cjs/lib/structures/MediaParser.cjs +0 -79
  167. package/dist/cjs/lib/structures/MediaParser.cjs.map +0 -1
  168. package/dist/cjs/lib/structures/MediaParserStore.cjs +0 -27
  169. package/dist/cjs/lib/structures/MediaParserStore.cjs.map +0 -1
  170. package/dist/cjs/lib/utils/MimeTypes.cjs +0 -26
  171. package/dist/cjs/lib/utils/MimeTypes.cjs.map +0 -1
  172. package/dist/cjs/mediaParsers/_load.cjs +0 -20
  173. package/dist/cjs/mediaParsers/_load.cjs.map +0 -1
  174. package/dist/cjs/mediaParsers/applicationFormUrlEncoded.cjs +0 -23
  175. package/dist/cjs/mediaParsers/applicationFormUrlEncoded.cjs.map +0 -1
  176. package/dist/cjs/mediaParsers/applicationJson.cjs +0 -22
  177. package/dist/cjs/mediaParsers/applicationJson.cjs.map +0 -1
  178. package/dist/cjs/mediaParsers/textPlain.cjs +0 -22
  179. package/dist/cjs/mediaParsers/textPlain.cjs.map +0 -1
  180. package/dist/esm/lib/structures/MediaParser.mjs +0 -76
  181. package/dist/esm/lib/structures/MediaParser.mjs.map +0 -1
  182. package/dist/esm/lib/structures/MediaParserStore.mjs +0 -24
  183. package/dist/esm/lib/structures/MediaParserStore.mjs.map +0 -1
  184. package/dist/esm/lib/utils/MimeTypes.mjs +0 -26
  185. package/dist/esm/lib/utils/MimeTypes.mjs.map +0 -1
  186. package/dist/esm/mediaParsers/_load.mjs +0 -17
  187. package/dist/esm/mediaParsers/_load.mjs.map +0 -1
  188. package/dist/esm/mediaParsers/applicationFormUrlEncoded.mjs +0 -20
  189. package/dist/esm/mediaParsers/applicationFormUrlEncoded.mjs.map +0 -1
  190. package/dist/esm/mediaParsers/applicationJson.mjs +0 -19
  191. package/dist/esm/mediaParsers/applicationJson.mjs.map +0 -1
  192. package/dist/esm/mediaParsers/textPlain.mjs +0 -19
  193. package/dist/esm/mediaParsers/textPlain.mjs.map +0 -1
@@ -22,5 +22,5 @@ __name(_Middleware, "Middleware");
22
22
  var Middleware = _Middleware;
23
23
 
24
24
  export { Middleware };
25
- //# sourceMappingURL=out.js.map
25
+ //# sourceMappingURL=Middleware.mjs.map
26
26
  //# sourceMappingURL=Middleware.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/structures/Middleware.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,aAAa;AAQf,IAAe,cAAf,MAAe,oBAA4E,MAA8B;AAAA,EAaxH,YAAY,SAAmC,UAAmB,CAAC,GAAc;AACvF,UAAM,SAAS,OAAO;AAHvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAgB;AAIf,SAAK,WAAW,QAAQ,YAAY;AAAA,EACrC;AASD;AAzBgI;AAAzH,IAAe,aAAf","sourcesContent":["import { Piece } from '@sapphire/pieces';\nimport type { Awaitable } from '@sapphire/utilities';\nimport type { ApiRequest } from './api/ApiRequest';\nimport type { ApiResponse } from './api/ApiResponse';\n\n/**\n * @since 1.0.0\n */\nexport abstract class Middleware<Options extends Middleware.Options = Middleware.Options> extends Piece<Options, 'middlewares'> {\n\t/**\n\t * The position the middleware has. The {@link MiddlewareStore} will run all middlewares with lower position than\n\t * this one.\n\t *\n\t * The built-in middlewares follow the following positions:\n\t * - headers: 10\n\t * - body: 20\n\t * - cookies: 30\n\t * - auth: 40\n\t */\n\tpublic readonly position: number;\n\n\tpublic constructor(context: Middleware.LoaderContext, options: Options = {} as Options) {\n\t\tsuper(context, options);\n\t\tthis.position = options.position ?? 1000;\n\t}\n\n\t/**\n\t * The method to be overridden by other middlewares.\n\t * @param request The client's request.\n\t * @param response The server's response.\n\t * @param route The route that matched this request, will be `null` if none matched.\n\t */\n\tpublic abstract run(request: Middleware.Request, response: Middleware.Response): Awaitable<unknown>;\n}\n\n/**\n * The options for all middlewares.\n */\nexport interface MiddlewareOptions extends Piece.Options {\n\t/**\n\t * The position to insert the middleware at.\n\t * @see Middleware#position\n\t * @default 1000\n\t */\n\tposition?: number;\n}\n\nexport namespace Middleware {\n\t/** @deprecated Use {@linkcode LoaderContext} instead. */\n\texport type Context = LoaderContext;\n\texport type LoaderContext = Piece.LoaderContext<'middlewares'>;\n\texport type Options = MiddlewareOptions;\n\texport type JSON = Piece.JSON;\n\texport type LocationJSON = Piece.LocationJSON;\n\n\texport type Request = ApiRequest;\n\texport type Response = ApiResponse;\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/lib/structures/Middleware.ts"],"names":[],"mappings":";;;AAQO,IAAe,WAAA,GAAf,MAAe,WAAA,SAA4E,KAA8B,CAAA;AAAA,EAaxH,WAAY,CAAA,OAAA,EAAmC,OAAmB,GAAA,EAAe,EAAA;AACvF,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AAHvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAIf,IAAK,IAAA,CAAA,QAAA,GAAW,QAAQ,QAAY,IAAA,GAAA;AAAA;AAUtC,CAAA;AAzBgI,MAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAzH,IAAe,UAAf,GAAA","file":"Middleware.mjs","sourcesContent":["import { Piece } from '@sapphire/pieces';\nimport type { Awaitable } from '@sapphire/utilities';\nimport type { ApiRequest } from './api/ApiRequest';\nimport type { ApiResponse } from './api/ApiResponse';\n\n/**\n * @since 1.0.0\n */\nexport abstract class Middleware<Options extends Middleware.Options = Middleware.Options> extends Piece<Options, 'middlewares'> {\n\t/**\n\t * The position the middleware has. The {@link MiddlewareStore} will run all middlewares with lower position than\n\t * this one.\n\t *\n\t * The built-in middlewares follow the following positions:\n\t * - headers: 10\n\t * - body: 20\n\t * - cookies: 30\n\t * - auth: 40\n\t */\n\tpublic readonly position: number;\n\n\tpublic constructor(context: Middleware.LoaderContext, options: Options = {} as Options) {\n\t\tsuper(context, options);\n\t\tthis.position = options.position ?? 1000;\n\t}\n\n\t/**\n\t * The method to be overridden by other middlewares.\n\t * @param request The client's request.\n\t * @param response The server's response.\n\t * @param route The route that matched this request, will be `null` if none matched.\n\t */\n\tpublic abstract run(request: Middleware.Request, response: Middleware.Response): Awaitable<unknown>;\n}\n\n/**\n * The options for all middlewares.\n */\nexport interface MiddlewareOptions extends Piece.Options {\n\t/**\n\t * The position to insert the middleware at.\n\t * @see Middleware#position\n\t * @default 1000\n\t */\n\tposition?: number;\n}\n\nexport namespace Middleware {\n\t/** @deprecated Use {@linkcode LoaderContext} instead. */\n\texport type Context = LoaderContext;\n\texport type LoaderContext = Piece.LoaderContext<'middlewares'>;\n\texport type Options = MiddlewareOptions;\n\texport type JSON = Piece.JSON;\n\texport type LocationJSON = Piece.LocationJSON;\n\n\texport type Request = ApiRequest;\n\texport type Response = ApiResponse;\n}\n"]}
@@ -36,5 +36,5 @@ __name(_MiddlewareStore, "MiddlewareStore");
36
36
  var MiddlewareStore = _MiddlewareStore;
37
37
 
38
38
  export { MiddlewareStore };
39
- //# sourceMappingURL=out.js.map
39
+ //# sourceMappingURL=MiddlewareStore.mjs.map
40
40
  //# sourceMappingURL=MiddlewareStore.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/structures/MiddlewareStore.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAKpB,IAAM,mBAAN,MAAM,yBAAwB,MAAiC;AAAA,EAM9D,cAAc;AACpB,UAAM,YAAY,EAAE,MAAM,cAAc,CAAC;AAH1C;AAAA;AAAA;AAAA,wBAAgB,qBAAkC,CAAC;AAAA,EAInD;AAAA,EAEA,MAAa,IAAI,SAA6B,UAA8C;AAC3F,eAAW,cAAc,KAAK,mBAAmB;AAChD,UAAI,SAAS,cAAe;AAC5B,UAAI,WAAW,QAAS,OAAM,WAAW,IAAI,SAAS,QAAQ;AAAA,IAC/D;AAAA,EACD;AAAA,EAEgB,IAAI,KAAa,OAAyB;AACzD,UAAM,QAAQ,KAAK,kBAAkB,UAAU,CAAC,eAAe,WAAW,YAAY,MAAM,QAAQ;AAGpG,QAAI,UAAU,GAAI,MAAK,kBAAkB,KAAK,KAAK;AAAA,QAC9C,MAAK,kBAAkB,OAAO,OAAO,GAAG,KAAK;AAElD,WAAO,MAAM,IAAI,KAAK,KAAK;AAAA,EAC5B;AAAA,EAEgB,OAAO,KAAsB;AAC5C,UAAM,QAAQ,KAAK,kBAAkB,UAAU,CAAC,eAAe,WAAW,SAAS,GAAG;AAGtF,QAAI,UAAU,GAAI,MAAK,kBAAkB,OAAO,OAAO,CAAC;AAExD,WAAO,MAAM,OAAO,GAAG;AAAA,EACxB;AAAA,EAEgB,QAAc;AAC7B,SAAK,kBAAkB,SAAS;AAChC,WAAO,MAAM,MAAM;AAAA,EACpB;AACD;AAxCsE;AAA/D,IAAM,kBAAN","sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { Middleware } from './Middleware';\n\n/**\n * @since 1.0.0\n */\nexport class MiddlewareStore extends Store<Middleware, 'middlewares'> {\n\t/**\n\t * The sorted middlewares, in ascending order of see {@link Middleware.position}.\n\t */\n\tpublic readonly sortedMiddlewares: Middleware[] = [];\n\n\tpublic constructor() {\n\t\tsuper(Middleware, { name: 'middlewares' });\n\t}\n\n\tpublic async run(request: Middleware.Request, response: Middleware.Response): Promise<void> {\n\t\tfor (const middleware of this.sortedMiddlewares) {\n\t\t\tif (response.writableEnded) return;\n\t\t\tif (middleware.enabled) await middleware.run(request, response);\n\t\t}\n\t}\n\n\tpublic override set(key: string, value: Middleware): this {\n\t\tconst index = this.sortedMiddlewares.findIndex((middleware) => middleware.position >= value.position);\n\n\t\t// If a middleware with lower priority wasn't found, push to the end of the array\n\t\tif (index === -1) this.sortedMiddlewares.push(value);\n\t\telse this.sortedMiddlewares.splice(index, 0, value);\n\n\t\treturn super.set(key, value);\n\t}\n\n\tpublic override delete(key: string): boolean {\n\t\tconst index = this.sortedMiddlewares.findIndex((middleware) => middleware.name === key);\n\n\t\t// If the middleware was found, remove it\n\t\tif (index !== -1) this.sortedMiddlewares.splice(index, 1);\n\n\t\treturn super.delete(key);\n\t}\n\n\tpublic override clear(): void {\n\t\tthis.sortedMiddlewares.length = 0;\n\t\treturn super.clear();\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/lib/structures/MiddlewareStore.ts"],"names":[],"mappings":";;;;AAMO,IAAM,gBAAA,GAAN,MAAM,gBAAA,SAAwB,KAAiC,CAAA;AAAA,EAM9D,WAAc,GAAA;AACpB,IAAA,KAAA,CAAM,UAAY,EAAA,EAAE,IAAM,EAAA,aAAA,EAAe,CAAA;AAH1C;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAgB,qBAAkC,EAAC,CAAA;AAAA;AAInD,EAEA,MAAa,GAAI,CAAA,OAAA,EAA6B,QAA8C,EAAA;AAC3F,IAAW,KAAA,MAAA,UAAA,IAAc,KAAK,iBAAmB,EAAA;AAChD,MAAA,IAAI,SAAS,aAAe,EAAA;AAC5B,MAAA,IAAI,WAAW,OAAS,EAAA,MAAM,UAAW,CAAA,GAAA,CAAI,SAAS,QAAQ,CAAA;AAAA;AAC/D;AACD,EAEgB,GAAA,CAAI,KAAa,KAAyB,EAAA;AACzD,IAAM,MAAA,KAAA,GAAQ,KAAK,iBAAkB,CAAA,SAAA,CAAU,CAAC,UAAe,KAAA,UAAA,CAAW,QAAY,IAAA,KAAA,CAAM,QAAQ,CAAA;AAGpG,IAAA,IAAI,KAAU,KAAA,CAAA,CAAA,EAAS,IAAA,CAAA,iBAAA,CAAkB,KAAK,KAAK,CAAA;AAAA,SACzC,IAAA,CAAA,iBAAA,CAAkB,MAAO,CAAA,KAAA,EAAO,GAAG,KAAK,CAAA;AAElD,IAAO,OAAA,KAAA,CAAM,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AAC5B,EAEgB,OAAO,GAAsB,EAAA;AAC5C,IAAM,MAAA,KAAA,GAAQ,KAAK,iBAAkB,CAAA,SAAA,CAAU,CAAC,UAAe,KAAA,UAAA,CAAW,SAAS,GAAG,CAAA;AAGtF,IAAA,IAAI,UAAU,CAAI,CAAA,EAAA,IAAA,CAAK,iBAAkB,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAExD,IAAO,OAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA;AACxB,EAEgB,KAAc,GAAA;AAC7B,IAAA,IAAA,CAAK,kBAAkB,MAAS,GAAA,CAAA;AAChC,IAAA,OAAO,MAAM,KAAM,EAAA;AAAA;AAErB,CAAA;AAxCsE,MAAA,CAAA,gBAAA,EAAA,iBAAA,CAAA;AAA/D,IAAM,eAAN,GAAA","file":"MiddlewareStore.mjs","sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { Middleware } from './Middleware';\n\n/**\n * @since 1.0.0\n */\nexport class MiddlewareStore extends Store<Middleware, 'middlewares'> {\n\t/**\n\t * The sorted middlewares, in ascending order of see {@link Middleware.position}.\n\t */\n\tpublic readonly sortedMiddlewares: Middleware[] = [];\n\n\tpublic constructor() {\n\t\tsuper(Middleware, { name: 'middlewares' });\n\t}\n\n\tpublic async run(request: Middleware.Request, response: Middleware.Response): Promise<void> {\n\t\tfor (const middleware of this.sortedMiddlewares) {\n\t\t\tif (response.writableEnded) return;\n\t\t\tif (middleware.enabled) await middleware.run(request, response);\n\t\t}\n\t}\n\n\tpublic override set(key: string, value: Middleware): this {\n\t\tconst index = this.sortedMiddlewares.findIndex((middleware) => middleware.position >= value.position);\n\n\t\t// If a middleware with lower priority wasn't found, push to the end of the array\n\t\tif (index === -1) this.sortedMiddlewares.push(value);\n\t\telse this.sortedMiddlewares.splice(index, 0, value);\n\n\t\treturn super.set(key, value);\n\t}\n\n\tpublic override delete(key: string): boolean {\n\t\tconst index = this.sortedMiddlewares.findIndex((middleware) => middleware.name === key);\n\n\t\t// If the middleware was found, remove it\n\t\tif (index !== -1) this.sortedMiddlewares.splice(index, 1);\n\n\t\treturn super.delete(key);\n\t}\n\n\tpublic override clear(): void {\n\t\tthis.sortedMiddlewares.length = 0;\n\t\treturn super.clear();\n\t}\n}\n"]}
@@ -10,10 +10,6 @@ var _Route = class _Route extends Piece {
10
10
  * (RFC 7230 3.3.2) The maximum decimal number of octets.
11
11
  */
12
12
  __publicField(this, "maximumBodyLength");
13
- /**
14
- * The accepted content types.
15
- */
16
- __publicField(this, "acceptedContentMimeTypes");
17
13
  /**
18
14
  * The path this route represents.
19
15
  */
@@ -23,10 +19,10 @@ var _Route = class _Route extends Piece {
23
19
  */
24
20
  __publicField(this, "methods");
25
21
  const api = this.container.server.options;
26
- const path = [].concat(
27
- RouterRoot.normalize(api.prefix),
28
- RouterRoot.normalize(options.route ?? (this.location.virtual ? this.name : this.location.directories.concat(this.name).join("/")))
29
- );
22
+ const path = [
23
+ ...RouterRoot.normalize(api.prefix),
24
+ ...RouterRoot.normalize(options.route ?? RouterRoot.makeRoutePathForPiece(this.location.directories, this.name))
25
+ ];
30
26
  const methods = new Set(options.methods);
31
27
  const implied = RouterRoot.extractMethod(path);
32
28
  if (!isNullish(implied)) {
@@ -37,12 +33,11 @@ var _Route = class _Route extends Piece {
37
33
  this.path = path;
38
34
  this.methods = methods;
39
35
  this.maximumBodyLength = options.maximumBodyLength ?? api.maximumBodyLength ?? 1024 * 1024 * 50;
40
- this.acceptedContentMimeTypes = options.acceptedContentMimeTypes ?? api.acceptedContentMimeTypes ?? null;
41
36
  }
42
37
  };
43
38
  __name(_Route, "Route");
44
39
  var Route = _Route;
45
40
 
46
41
  export { Route };
47
- //# sourceMappingURL=out.js.map
42
+ //# sourceMappingURL=Route.mjs.map
48
43
  //# sourceMappingURL=Route.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/structures/Route.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,iBAAiC;AAK1C,SAAS,kBAAkB;AAuCpB,IAAe,SAAf,MAAe,eAA6D,MAAyB;AAAA,EAqBpG,YAAY,SAA8B,UAAmB,CAAC,GAAc;AAClF,UAAM,SAAS,OAAO;AAlBvB;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAgB;AAKhB;AAAA;AAAA;AAAA,wBAAgB;AAKf,UAAM,MAAM,KAAK,UAAU,OAAO;AAClC,UAAM,OAAQ,CAAC,EAAe;AAAA,MAC7B,WAAW,UAAU,IAAI,MAAM;AAAA,MAC/B,WAAW,UAAU,QAAQ,UAAU,KAAK,SAAS,UAAU,KAAK,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,EAAE;AAAA,IAClI;AAEA,UAAM,UAAU,IAAI,IAAI,QAAQ,OAAO;AACvC,UAAM,UAAU,WAAW,cAAc,IAAI;AAC7C,QAAI,CAAC,UAAU,OAAO,GAAG;AACxB,YAAM,YAAY,KAAK,SAAS;AAChC,WAAK,SAAS,IAAI,KAAK,SAAS,EAAE,MAAM,GAAG,KAAK,SAAS,EAAE,SAAS,QAAQ,SAAS,CAAC;AACtF,cAAQ,IAAI,OAAqB;AAAA,IAClC;AAEA,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,oBAAoB,QAAQ,qBAAqB,IAAI,qBAAqB,OAAO,OAAO;AAC7F,SAAK,2BAA2B,QAAQ,4BAA4B,IAAI,4BAA4B;AAAA,EACrG;AAGD;AA7C4G;AAArG,IAAe,QAAf","sourcesContent":["import { Piece } from '@sapphire/pieces';\nimport { isNullish, type Awaitable } from '@sapphire/utilities';\nimport type { ApiRequest } from './api/ApiRequest';\nimport type { ApiResponse } from './api/ApiResponse';\nimport type { MethodName } from './http/HttpMethods';\nimport type { MimeTypeWithoutParameters } from './http/Server';\nimport { RouterRoot } from './router/RouterRoot';\n\n/**\n * @since 1.0.0\n *\n * @example A simple GET route that returns a JSON response:\n * ```typescript\n * // hello.get.ts\n * import { Route } from '@sapphire/plugin-api';\n *\n * export class MyRoute extends Route {\n * public run(request: Route.Request, response: Route.Response) {\n * return response.json({ message: 'Hello, World!' });\n * }\n * }\n * ```\n *\n * ```bash\n * $ curl http://localhost:4000/hello\n * {\"message\":\"Hello, World!\"}\n * ```\n *\n * @example A simple POST route that reads the body and returns it:\n * ```typescript\n * // echo.post.ts\n * import { Route } from '@sapphire/plugin-api';\n *\n * export class MyRoute extends Route {\n * public run(request: Route.Request, response: Route.Response) {\n * return response.json(request.params);\n * }\n * }\n * ```\n *\n * ```bash\n * $ curl -X POST -H \"Content-Type: application/json\" -d '{\"hello\":\"world\"}' http://localhost:4000/echo\n * {\"hello\":\"world\"}\n * ```\n */\nexport abstract class Route<Options extends Route.Options = Route.Options> extends Piece<Options, 'routes'> {\n\t/**\n\t * (RFC 7230 3.3.2) The maximum decimal number of octets.\n\t */\n\tpublic readonly maximumBodyLength: number;\n\n\t/**\n\t * The accepted content types.\n\t */\n\tpublic readonly acceptedContentMimeTypes: readonly MimeTypeWithoutParameters[] | null;\n\n\t/**\n\t * The path this route represents.\n\t */\n\tpublic readonly path: readonly string[];\n\n\t/**\n\t * The methods this route accepts.\n\t */\n\tpublic readonly methods: ReadonlySet<MethodName>;\n\n\tpublic constructor(context: Route.LoaderContext, options: Options = {} as Options) {\n\t\tsuper(context, options);\n\n\t\tconst api = this.container.server.options;\n\t\tconst path = ([] as string[]).concat(\n\t\t\tRouterRoot.normalize(api.prefix),\n\t\t\tRouterRoot.normalize(options.route ?? (this.location.virtual ? this.name : this.location.directories.concat(this.name).join('/')))\n\t\t);\n\n\t\tconst methods = new Set(options.methods);\n\t\tconst implied = RouterRoot.extractMethod(path);\n\t\tif (!isNullish(implied)) {\n\t\t\tconst lastIndex = path.length - 1;\n\t\t\tpath[lastIndex] = path[lastIndex].slice(0, path[lastIndex].length - implied.length - 1);\n\t\t\tmethods.add(implied as MethodName);\n\t\t}\n\n\t\tthis.path = path;\n\t\tthis.methods = methods;\n\t\tthis.maximumBodyLength = options.maximumBodyLength ?? api.maximumBodyLength ?? 1024 * 1024 * 50;\n\t\tthis.acceptedContentMimeTypes = options.acceptedContentMimeTypes ?? api.acceptedContentMimeTypes ?? null;\n\t}\n\n\tpublic abstract run(request: Route.Request, response: Route.Response): Awaitable<unknown>;\n}\n\nexport interface RouteOptions extends Piece.Options {\n\t/**\n\t * The route the piece should represent.\n\t * @since 1.0.0\n\t *\n\t * @defaultValue The filesystem-based path, or the name if the location is virtual.\n\t *\n\t * @example\n\t * ```typescript\n\t * '/users'\n\t * // request.params -> {}\n\t * ```\n\t * @example\n\t * ```typescript\n\t * '/guilds/[guild]/members/[member]'\n\t * // request.params -> { guild: '...', member: '...' }\n\t * ```\n\t */\n\troute?: 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 *\n\t * @defaultValue this.context.server.options.maximumBodyLength ?? 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 *\n\t * @defaultValue this.context.server.options.acceptedContentMimeTypes ?? null\n\t */\n\tacceptedContentMimeTypes?: readonly MimeTypeWithoutParameters[] | null;\n\n\t/**\n\t * The methods this route accepts.\n\t * @since 7.0.0\n\t *\n\t * @defaultValue The method defined in the piece name, or none if not set.\n\t */\n\tmethods?: readonly MethodName[];\n}\n\nexport namespace Route {\n\t/** @deprecated Use {@linkcode LoaderContext} instead. */\n\texport type Context = LoaderContext;\n\texport type LoaderContext = Piece.LoaderContext<'routes'>;\n\texport type Options = RouteOptions;\n\texport type JSON = Piece.JSON;\n\texport type LocationJSON = Piece.LocationJSON;\n\n\texport type Request = ApiRequest;\n\texport type Response = ApiResponse;\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/lib/structures/Route.ts"],"names":[],"mappings":";;;;;AA4CO,IAAe,MAAA,GAAf,MAAe,MAAA,SAA6D,KAAyB,CAAA;AAAA,EAgBpG,WAAY,CAAA,OAAA,EAA8B,OAAmB,GAAA,EAAe,EAAA;AAClF,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AAbvB;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AAKhB;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAKhB;AAAA;AAAA;AAAA,IAAgB,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAKf,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,SAAA,CAAU,MAAO,CAAA,OAAA;AAClC,IAAA,MAAM,IAAO,GAAA;AAAA,MACZ,GAAG,UAAA,CAAW,SAAU,CAAA,GAAA,CAAI,MAAM,CAAA;AAAA,MAClC,GAAG,UAAA,CAAW,SAAU,CAAA,OAAA,CAAQ,KAAS,IAAA,UAAA,CAAW,qBAAsB,CAAA,IAAA,CAAK,QAAS,CAAA,WAAA,EAAa,IAAK,CAAA,IAAI,CAAC;AAAA,KAChH;AAEA,IAAA,MAAM,OAAU,GAAA,IAAI,GAAI,CAAA,OAAA,CAAQ,OAAO,CAAA;AACvC,IAAM,MAAA,OAAA,GAAU,UAAW,CAAA,aAAA,CAAc,IAAI,CAAA;AAC7C,IAAI,IAAA,CAAC,SAAU,CAAA,OAAO,CAAG,EAAA;AACxB,MAAM,MAAA,SAAA,GAAY,KAAK,MAAS,GAAA,CAAA;AAChC,MAAA,IAAA,CAAK,SAAS,CAAA,GAAI,IAAK,CAAA,SAAS,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,IAAA,CAAK,SAAS,CAAA,CAAE,MAAS,GAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AACtF,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA;AAGpB,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA;AACZ,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,IAAA,CAAK,oBAAoB,OAAQ,CAAA,iBAAA,IAAqB,GAAI,CAAA,iBAAA,IAAqB,OAAO,IAAO,GAAA,EAAA;AAAA;AAI/F,CAAA;AAvC4G,MAAA,CAAA,MAAA,EAAA,OAAA,CAAA;AAArG,IAAe,KAAf,GAAA","file":"Route.mjs","sourcesContent":["import { Piece } from '@sapphire/pieces';\nimport { isNullish, type Awaitable } from '@sapphire/utilities';\nimport type { ApiRequest } from './api/ApiRequest';\nimport type { ApiResponse } from './api/ApiResponse';\nimport type { MethodName } from './http/HttpMethods';\nimport { RouterRoot } from './router/RouterRoot';\n\n/**\n * @since 1.0.0\n *\n * @example A simple GET route that returns a JSON response:\n * ```typescript\n * // hello.get.ts\n * import { Route } from '@sapphire/plugin-api';\n *\n * export class MyRoute extends Route {\n * public run(request: Route.Request, response: Route.Response) {\n * return response.json({ message: 'Hello, World!' });\n * }\n * }\n * ```\n *\n * ```bash\n * $ curl http://localhost:4000/hello\n * {\"message\":\"Hello, World!\"}\n * ```\n *\n * @example A simple POST route that reads the body and returns it:\n * ```typescript\n * // echo.post.ts\n * import { Route } from '@sapphire/plugin-api';\n *\n * export class MyRoute extends Route {\n * public run(request: Route.Request, response: Route.Response) {\n * return response.json(request.params);\n * }\n * }\n * ```\n *\n * ```bash\n * $ curl -X POST -H \"Content-Type: application/json\" -d '{\"hello\":\"world\"}' http://localhost:4000/echo\n * {\"hello\":\"world\"}\n * ```\n */\nexport abstract class Route<Options extends Route.Options = Route.Options> extends Piece<Options, 'routes'> {\n\t/**\n\t * (RFC 7230 3.3.2) The maximum decimal number of octets.\n\t */\n\tpublic readonly maximumBodyLength: number;\n\n\t/**\n\t * The path this route represents.\n\t */\n\tpublic readonly path: readonly string[];\n\n\t/**\n\t * The methods this route accepts.\n\t */\n\tpublic readonly methods: ReadonlySet<MethodName>;\n\n\tpublic constructor(context: Route.LoaderContext, options: Options = {} as Options) {\n\t\tsuper(context, options);\n\n\t\tconst api = this.container.server.options;\n\t\tconst path = [\n\t\t\t...RouterRoot.normalize(api.prefix),\n\t\t\t...RouterRoot.normalize(options.route ?? RouterRoot.makeRoutePathForPiece(this.location.directories, this.name))\n\t\t];\n\n\t\tconst methods = new Set(options.methods);\n\t\tconst implied = RouterRoot.extractMethod(path);\n\t\tif (!isNullish(implied)) {\n\t\t\tconst lastIndex = path.length - 1;\n\t\t\tpath[lastIndex] = path[lastIndex].slice(0, path[lastIndex].length - implied.length - 1);\n\t\t\tmethods.add(implied);\n\t\t}\n\n\t\tthis.path = path;\n\t\tthis.methods = methods;\n\t\tthis.maximumBodyLength = options.maximumBodyLength ?? api.maximumBodyLength ?? 1024 * 1024 * 50;\n\t}\n\n\tpublic abstract run(request: Route.Request, response: Route.Response): Awaitable<unknown>;\n}\n\nexport interface RouteOptions extends Piece.Options {\n\t/**\n\t * The route the piece should represent.\n\t * @since 1.0.0\n\t *\n\t * @defaultValue The filesystem-based path, or the name if the location is virtual.\n\t *\n\t * @example\n\t * ```typescript\n\t * '/users'\n\t * // request.params -> {}\n\t * ```\n\t * @example\n\t * ```typescript\n\t * '/guilds/[guild]/members/[member]'\n\t * // request.params -> { guild: '...', member: '...' }\n\t * ```\n\t */\n\troute?: 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 *\n\t * @defaultValue this.context.server.options.maximumBodyLength ?? 1024 * 1024 * 50\n\t */\n\tmaximumBodyLength?: number;\n\n\t/**\n\t * The methods this route accepts.\n\t * @since 7.0.0\n\t *\n\t * @defaultValue The method defined in the piece name, or none if not set.\n\t */\n\tmethods?: readonly MethodName[];\n}\n\nexport namespace Route {\n\t/** @deprecated Use {@linkcode LoaderContext} instead. */\n\texport type Context = LoaderContext; // NOSONAR\n\texport type LoaderContext = Piece.LoaderContext<'routes'>;\n\texport type Options = RouteOptions;\n\texport type JSON = Piece.JSON;\n\texport type LocationJSON = Piece.LocationJSON;\n\n\texport type Request = ApiRequest;\n\texport type Response = ApiResponse;\n}\n"]}
@@ -13,5 +13,5 @@ __name(_RouteLoaderStrategy, "RouteLoaderStrategy");
13
13
  var RouteLoaderStrategy = _RouteLoaderStrategy;
14
14
 
15
15
  export { RouteLoaderStrategy };
16
- //# sourceMappingURL=out.js.map
16
+ //# sourceMappingURL=RouteLoaderStrategy.mjs.map
17
17
  //# sourceMappingURL=RouteLoaderStrategy.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/structures/RouteLoaderStrategy.ts"],"names":[],"mappings":";;;;;AAAA,SAAS,sBAAsB;AAIxB,IAAM,uBAAN,MAAM,6BAA4B,eAAsB;AAAA,EAC9C,OAAO,OAAmB,OAAoB;AAC7D,UAAM,OAAO,IAAI,KAAK;AAAA,EACvB;AAAA,EAEgB,SAAS,OAAmB,OAAoB;AAC/D,UAAM,OAAO,OAAO,KAAK;AAAA,EAC1B;AACD;AAR+D;AAAxD,IAAM,sBAAN","sourcesContent":["import { LoaderStrategy } from '@sapphire/pieces';\nimport type { Route } from './Route';\nimport type { RouteStore } from './RouteStore';\n\nexport class RouteLoaderStrategy extends LoaderStrategy<Route> {\n\tpublic override onLoad(store: RouteStore, piece: Route): void {\n\t\tstore.router.add(piece);\n\t}\n\n\tpublic override onUnload(store: RouteStore, piece: Route): void {\n\t\tstore.router.remove(piece);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/lib/structures/RouteLoaderStrategy.ts"],"names":[],"mappings":";;;AAIO,IAAM,oBAAA,GAAN,MAAM,oBAAA,SAA4B,cAAsB,CAAA;AAAA,EAC9C,MAAA,CAAO,OAAmB,KAAoB,EAAA;AAC7D,IAAM,KAAA,CAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA;AACvB,EAEgB,QAAA,CAAS,OAAmB,KAAoB,EAAA;AAC/D,IAAM,KAAA,CAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA;AAE3B,CAAA;AAR+D,MAAA,CAAA,oBAAA,EAAA,qBAAA,CAAA;AAAxD,IAAM,mBAAN,GAAA","file":"RouteLoaderStrategy.mjs","sourcesContent":["import { LoaderStrategy } from '@sapphire/pieces';\nimport type { Route } from './Route';\nimport type { RouteStore } from './RouteStore';\n\nexport class RouteLoaderStrategy extends LoaderStrategy<Route> {\n\tpublic override onLoad(store: RouteStore, piece: Route): void {\n\t\tstore.router.add(piece);\n\t}\n\n\tpublic override onUnload(store: RouteStore, piece: Route): void {\n\t\tstore.router.remove(piece);\n\t}\n}\n"]}
@@ -14,5 +14,5 @@ __name(_RouteStore, "RouteStore");
14
14
  var RouteStore = _RouteStore;
15
15
 
16
16
  export { RouteStore };
17
- //# sourceMappingURL=out.js.map
17
+ //# sourceMappingURL=RouteStore.mjs.map
18
18
  //# sourceMappingURL=RouteStore.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/structures/RouteStore.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAKpB,IAAM,cAAN,MAAM,oBAAmB,MAAuB;AAAA,EAG/C,cAAc;AACpB,UAAM,OAAO,EAAE,MAAM,UAAU,UAAU,IAAI,oBAAoB,EAAE,CAAC;AAHrE,wBAAgB,UAAS,IAAI,WAAW;AAAA,EAIxC;AACD;AANuD;AAAhD,IAAM,aAAN","sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { Route } from './Route';\nimport { RouteLoaderStrategy } from './RouteLoaderStrategy';\nimport { RouterRoot } from './router/RouterRoot';\n\n/**\n * @since 1.0.0\n */\nexport class RouteStore extends Store<Route, 'routes'> {\n\tpublic readonly router = new RouterRoot();\n\n\tpublic constructor() {\n\t\tsuper(Route, { name: 'routes', strategy: new RouteLoaderStrategy() });\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/lib/structures/RouteStore.ts"],"names":[],"mappings":";;;;;;AAQO,IAAM,WAAA,GAAN,MAAM,WAAA,SAAmB,KAAuB,CAAA;AAAA,EAG/C,WAAc,GAAA;AACpB,IAAM,KAAA,CAAA,KAAA,EAAO,EAAE,IAAM,EAAA,QAAA,EAAU,UAAU,IAAI,mBAAA,IAAuB,CAAA;AAHrE,IAAgB,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,IAAI,UAAW,EAAA,CAAA;AAAA;AAKzC,CAAA;AANuD,MAAA,CAAA,WAAA,EAAA,YAAA,CAAA;AAAhD,IAAM,UAAN,GAAA","file":"RouteStore.mjs","sourcesContent":["import { Store } from '@sapphire/pieces';\nimport { Route } from './Route';\nimport { RouteLoaderStrategy } from './RouteLoaderStrategy';\nimport { RouterRoot } from './router/RouterRoot';\n\n/**\n * @since 1.0.0\n */\nexport class RouteStore extends Store<Route, 'routes'> {\n\tpublic readonly router = new RouterRoot();\n\n\tpublic constructor() {\n\t\tsuper(Route, { name: 'routes', strategy: new RouteLoaderStrategy() });\n\t}\n}\n"]}
@@ -1,9 +1,13 @@
1
- import { __name, __publicField } from '../../../chunk-S573YWRP.mjs';
1
+ import { __name, __privateAdd, __publicField, __privateGet, __privateSet } from '../../../chunk-S573YWRP.mjs';
2
+ import { isNullishOrEmpty } from '@sapphire/utilities';
2
3
  import { IncomingMessage } from 'node:http';
4
+ import { RequestProxy } from '../../utils/_body/RequestProxy.mjs';
3
5
 
6
+ var _cachedRequest, _ApiRequest_instances, isFormContentType_get;
4
7
  var _ApiRequest = class _ApiRequest extends IncomingMessage {
5
8
  constructor() {
6
9
  super(...arguments);
10
+ __privateAdd(this, _ApiRequest_instances);
7
11
  /**
8
12
  * The query parameters.
9
13
  */
@@ -12,10 +16,6 @@ var _ApiRequest = class _ApiRequest extends IncomingMessage {
12
16
  * The URI parameters.
13
17
  */
14
18
  __publicField(this, "params", {});
15
- /**
16
- * The body that was sent by the user.
17
- */
18
- __publicField(this, "body");
19
19
  /**
20
20
  * The authorization information. This field indicates three possible values:
21
21
  *
@@ -50,11 +50,128 @@ var _ApiRequest = class _ApiRequest extends IncomingMessage {
50
50
  * @since 7.0.0
51
51
  */
52
52
  __publicField(this, "route");
53
+ /**
54
+ * The response object. This field is cached to prevent multiple response
55
+ * objects from being created.
56
+ */
57
+ __privateAdd(this, _cachedRequest, null);
58
+ }
59
+ /**
60
+ * The response object, used to validate the request's headers and body.
61
+ */
62
+ asWeb() {
63
+ __privateGet(this, _cachedRequest) ?? __privateSet(this, _cachedRequest, new RequestProxy(this));
64
+ return __privateGet(this, _cachedRequest);
65
+ }
66
+ /**
67
+ * Reads the request body and tries to parse using JSON or form-urlencoded.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * const body = await request.readBody();
72
+ * ```
73
+ *
74
+ * @returns The result of the body parsing
75
+ */
76
+ readBody() {
77
+ return __privateGet(this, _ApiRequest_instances, isFormContentType_get) ? this.readBodyFormData() : this.readBodyJson();
78
+ }
79
+ /**
80
+ * Reads the request body as an {@link ArrayBuffer}.
81
+ *
82
+ * @returns The result of the body parsing
83
+ */
84
+ readBodyArrayBuffer() {
85
+ return this.asWeb().arrayBuffer();
86
+ }
87
+ /**
88
+ * Reads the request body as a {@link Blob}.
89
+ *
90
+ * @returns The result of the body parsing
91
+ */
92
+ readBodyBlob() {
93
+ return this.asWeb().blob();
94
+ }
95
+ /**
96
+ * Reads the request body as a {@link FormData}.
97
+ *
98
+ * @remarks
99
+ *
100
+ * This will throw an error if the content type is not one of the following:
101
+ *
102
+ * - `application/x-www-form-urlencoded`
103
+ * - `multipart/form-data`
104
+ *
105
+ * @returns The result of the body parsing
106
+ */
107
+ readBodyFormData() {
108
+ return this.asWeb().formData();
109
+ }
110
+ /**
111
+ * Reads the request body as text, using {@link TextDecoder}. Afterward, it
112
+ * parses the body as JSON with {@link JSON.parse}.
113
+ *
114
+ * @returns The result of the body parsing
115
+ */
116
+ readBodyJson() {
117
+ return this.asWeb().json();
118
+ }
119
+ /**
120
+ * Reads the request body as text, using {@link TextDecoder}.
121
+ *
122
+ * @returns The result of the body parsing
123
+ */
124
+ readBodyText() {
125
+ return this.asWeb().text();
126
+ }
127
+ /**
128
+ * Identical to {@link ApiRequest.readBody}, but it validates the result.
129
+ *
130
+ * @param validator The validator function to use on the body parsing result
131
+ * @returns The validated body
132
+ */
133
+ readValidatedBody(validator) {
134
+ return this.readBody().then(validator);
135
+ }
136
+ /**
137
+ * Identical to {@link ApiRequest.readBodyFormData}, but it validates the
138
+ * result.
139
+ *
140
+ * @param validator The validator function to use on the body parsing result
141
+ * @returns The validated body
142
+ */
143
+ readValidatedBodyFormData(validator) {
144
+ return this.readBodyFormData().then(validator);
145
+ }
146
+ /**
147
+ * Identical to {@link ApiRequest.readBodyJson}, but it validates the result.
148
+ *
149
+ * @param validator The validator function to use on the body parsing result
150
+ * @returns The validated body
151
+ */
152
+ readValidatedBodyJson(validator) {
153
+ return this.readBodyJson().then(validator);
154
+ }
155
+ /**
156
+ * Identical to {@link ApiRequest.readBodyText}, but it validates the result.
157
+ *
158
+ * @param validator The validator function to use on the body parsing result
159
+ * @returns The validated body
160
+ */
161
+ readValidatedBodyText(validator) {
162
+ return this.readBodyText().then(validator);
53
163
  }
54
164
  };
165
+ _cachedRequest = new WeakMap();
166
+ _ApiRequest_instances = new WeakSet();
167
+ isFormContentType_get = /* @__PURE__ */ __name(function() {
168
+ const contentType = this.asWeb().headers.get("content-type");
169
+ if (isNullishOrEmpty(contentType)) return false;
170
+ return contentType.startsWith("application/x-www-form-urlencoded") || contentType.startsWith("multipart/form-data");
171
+ }, "#isFormContentType");
55
172
  __name(_ApiRequest, "ApiRequest");
56
173
  var ApiRequest = _ApiRequest;
57
174
 
58
175
  export { ApiRequest };
59
- //# sourceMappingURL=out.js.map
176
+ //# sourceMappingURL=ApiRequest.mjs.map
60
177
  //# sourceMappingURL=ApiRequest.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/structures/api/ApiRequest.ts"],"names":[],"mappings":";;;;;;AAAA,SAAS,uBAAuB;AAKzB,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;AAcP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAO;AAcP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAO;AAAA;AACR;AApDgD;AAAzC,IAAM,aAAN","sourcesContent":["import { IncomingMessage } from 'node:http';\nimport type { Route } from '../Route';\nimport type { AuthData } from '../http/Auth';\nimport type { RouterNode } from '../router/RouterNode';\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\t/**\n\t * The router node that matched the request. The field indicates three\n\t * possible values:\n\t *\n\t * - `undefined`: The router handler has not been executed yet.\n\t * - `null`: The router handler has been executed, but no node matched the\n\t * request.\n\t * - `RouterNode`: The router handler has been executed and a node matched\n\t * the request.\n\t *\n\t * @since 7.0.0\n\t */\n\tpublic routerNode?: RouterNode | null;\n\n\t/**\n\t * The route that matched the request. The field indicates three possible\n\t * values:\n\t *\n\t * - `undefined`: The router handler has not been executed yet.\n\t * - `null`: The router handler has been executed, but no route matched the\n\t * request.\n\t * - `Route`: The router handler has been executed and a route matched the\n\t * request.\n\t *\n\t * @since 7.0.0\n\t */\n\tpublic route?: Route | null;\n}\n"]}
1
+ {"version":3,"sources":["../../../../../src/lib/structures/api/ApiRequest.ts"],"names":[],"mappings":"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","file":"ApiRequest.mjs","sourcesContent":["import { isNullishOrEmpty } from '@sapphire/utilities';\nimport type { Blob } from 'node:buffer';\nimport { IncomingMessage } from 'node:http';\nimport type { FormData, Request } from 'undici';\nimport type { MimeType } from '../../utils/MimeType';\nimport { RequestProxy } from '../../utils/_body/RequestProxy';\nimport type { Route } from '../Route';\nimport type { AuthData } from '../http/Auth';\nimport type { RouterNode } from '../router/RouterNode';\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 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\t/**\n\t * The router node that matched the request. The field indicates three\n\t * possible values:\n\t *\n\t * - `undefined`: The router handler has not been executed yet.\n\t * - `null`: The router handler has been executed, but no node matched the\n\t * request.\n\t * - `RouterNode`: The router handler has been executed and a node matched\n\t * the request.\n\t *\n\t * @since 7.0.0\n\t */\n\tpublic routerNode?: RouterNode | null;\n\n\t/**\n\t * The route that matched the request. The field indicates three possible\n\t * values:\n\t *\n\t * - `undefined`: The router handler has not been executed yet.\n\t * - `null`: The router handler has been executed, but no route matched the\n\t * request.\n\t * - `Route`: The router handler has been executed and a route matched the\n\t * request.\n\t *\n\t * @since 7.0.0\n\t */\n\tpublic route?: Route | null;\n\n\t/**\n\t * The response object. This field is cached to prevent multiple response\n\t * objects from being created.\n\t */\n\t#cachedRequest: Request | null = null;\n\n\tget #isFormContentType() {\n\t\tconst contentType = this.asWeb().headers.get('content-type') as MimeType | null;\n\n\t\t// If Content-Type isn't sent, we can't assume it's a form.\n\t\tif (isNullishOrEmpty(contentType)) return false;\n\n\t\t// If the Content-Type is application/x-www-form-urlencoded or multipart/form-data, it's a form.\n\t\treturn contentType.startsWith('application/x-www-form-urlencoded') || contentType.startsWith('multipart/form-data');\n\t}\n\n\t/**\n\t * The response object, used to validate the request's headers and body.\n\t */\n\tpublic asWeb(): Request {\n\t\tthis.#cachedRequest ??= new RequestProxy(this);\n\t\treturn this.#cachedRequest;\n\t}\n\n\t/**\n\t * Reads the request body and tries to parse using JSON or form-urlencoded.\n\t *\n\t * @example\n\t * ```typescript\n\t * const body = await request.readBody();\n\t * ```\n\t *\n\t * @returns The result of the body parsing\n\t */\n\tpublic readBody(): Promise<unknown> {\n\t\treturn this.#isFormContentType ? this.readBodyFormData() : this.readBodyJson();\n\t}\n\n\t/**\n\t * Reads the request body as an {@link ArrayBuffer}.\n\t *\n\t * @returns The result of the body parsing\n\t */\n\tpublic readBodyArrayBuffer(): Promise<ArrayBuffer> {\n\t\treturn this.asWeb().arrayBuffer();\n\t}\n\n\t/**\n\t * Reads the request body as a {@link Blob}.\n\t *\n\t * @returns The result of the body parsing\n\t */\n\tpublic readBodyBlob(): Promise<Blob> {\n\t\treturn this.asWeb().blob();\n\t}\n\n\t/**\n\t * Reads the request body as a {@link FormData}.\n\t *\n\t * @remarks\n\t *\n\t * This will throw an error if the content type is not one of the following:\n\t *\n\t * - `application/x-www-form-urlencoded`\n\t * - `multipart/form-data`\n\t *\n\t * @returns The result of the body parsing\n\t */\n\tpublic readBodyFormData(): Promise<FormData> {\n\t\treturn this.asWeb().formData(); // NOSONAR\n\t}\n\n\t/**\n\t * Reads the request body as text, using {@link TextDecoder}. Afterward, it\n\t * parses the body as JSON with {@link JSON.parse}.\n\t *\n\t * @returns The result of the body parsing\n\t */\n\tpublic readBodyJson(): Promise<unknown> {\n\t\treturn this.asWeb().json();\n\t}\n\n\t/**\n\t * Reads the request body as text, using {@link TextDecoder}.\n\t *\n\t * @returns The result of the body parsing\n\t */\n\tpublic readBodyText(): Promise<string> {\n\t\treturn this.asWeb().text();\n\t}\n\n\t/**\n\t * Identical to {@link ApiRequest.readBody}, but it validates the result.\n\t *\n\t * @param validator The validator function to use on the body parsing result\n\t * @returns The validated body\n\t */\n\tpublic readValidatedBody<Type>(validator: ValidatorFunction<unknown, Type>) {\n\t\treturn this.readBody().then(validator);\n\t}\n\n\t/**\n\t * Identical to {@link ApiRequest.readBodyFormData}, but it validates the\n\t * result.\n\t *\n\t * @param validator The validator function to use on the body parsing result\n\t * @returns The validated body\n\t */\n\tpublic readValidatedBodyFormData<Type>(validator: ValidatorFunction<FormData, Type>) {\n\t\treturn this.readBodyFormData().then(validator);\n\t}\n\n\t/**\n\t * Identical to {@link ApiRequest.readBodyJson}, but it validates the result.\n\t *\n\t * @param validator The validator function to use on the body parsing result\n\t * @returns The validated body\n\t */\n\tpublic readValidatedBodyJson<Type>(validator: ValidatorFunction<unknown, Type>) {\n\t\treturn this.readBodyJson().then(validator);\n\t}\n\n\t/**\n\t * Identical to {@link ApiRequest.readBodyText}, but it validates the result.\n\t *\n\t * @param validator The validator function to use on the body parsing result\n\t * @returns The validated body\n\t */\n\tpublic readValidatedBodyText<Type>(validator: ValidatorFunction<string, Type>) {\n\t\treturn this.readBodyText().then(validator);\n\t}\n}\n\nexport type ValidatorFunction<Data, Type> = (data: Data) => Type;\n"]}
@@ -2,7 +2,6 @@ import { __name, __publicField } from '../../../chunk-S573YWRP.mjs';
2
2
  import { ServerResponse, STATUS_CODES } from 'node:http';
3
3
  import { Readable } from 'node:stream';
4
4
  import 'node:stream/web';
5
- import { MimeTypes } from '../../utils/MimeTypes.mjs';
6
5
  import { HttpCodes } from '../http/HttpCodes.mjs';
7
6
 
8
7
  var _ApiResponse = class _ApiResponse extends ServerResponse {
@@ -96,20 +95,20 @@ var _ApiResponse = class _ApiResponse extends ServerResponse {
96
95
  * @since 1.0.0
97
96
  */
98
97
  json(data) {
99
- this.setContentType(MimeTypes.ApplicationJson).end(JSON.stringify(data));
98
+ this.setContentType("application/json").end(JSON.stringify(data));
100
99
  }
101
100
  /**
102
101
  * @since 1.0.0
103
102
  */
104
103
  text(data) {
105
- this.setContentType(MimeTypes.TextPlain).end(data);
104
+ this.setContentType("text/plain").end(data);
106
105
  }
107
106
  /**
108
107
  * @since 6.1.0
109
108
  *
110
109
  * Sets the image content type and sends the image data in the response.
111
110
  *
112
- * @param type - The MIME type of the image (e.g., {@link MimeTypes.ImagePng}).
111
+ * @param type - The MIME type of the image (e.g., 'image/png').
113
112
  * @param data - The image data as a `string`, {@link Buffer}, {@link Uint8Array}, or {@link ReadableStream}.
114
113
  */
115
114
  image(type, data) {
@@ -124,7 +123,7 @@ var _ApiResponse = class _ApiResponse extends ServerResponse {
124
123
  * @since 5.1.0
125
124
  */
126
125
  html(code, data) {
127
- this.setContentType(MimeTypes.TextHtml).status(code).end(data);
126
+ this.setContentType("text/html").status(code).end(data);
128
127
  }
129
128
  /**
130
129
  * @since 1.0.0
@@ -138,5 +137,5 @@ __name(_ApiResponse, "ApiResponse");
138
137
  var ApiResponse = _ApiResponse;
139
138
 
140
139
  export { ApiResponse };
141
- //# sourceMappingURL=out.js.map
140
+ //# sourceMappingURL=ApiResponse.mjs.map
142
141
  //# sourceMappingURL=ApiResponse.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/structures/api/ApiResponse.ts"],"names":[],"mappings":"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","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 7.0.0\n\t */\n\tpublic methodNotAllowed(data?: unknown): void {\n\t\treturn this.error(HttpCodes.MethodNotAllowed, 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"]}
1
+ {"version":3,"sources":["../../../../../src/lib/structures/api/ApiResponse.ts"],"names":[],"mappings":"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","file":"ApiResponse.mjs","sourcesContent":["import { IncomingMessage, ServerResponse, STATUS_CODES } from 'node:http';\nimport { Readable } from 'node:stream';\nimport { ReadableStream } from 'node:stream/web';\nimport type { MimeType } from '../../utils/MimeType';\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 7.0.0\n\t */\n\tpublic methodNotAllowed(data?: unknown): void {\n\t\treturn this.error(HttpCodes.MethodNotAllowed, 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('application/json').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('text/plain').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., 'image/png').\n\t * @param data - The image data as a `string`, {@link Buffer}, {@link Uint8Array}, or {@link ReadableStream}.\n\t */\n\tpublic image(type: Extract<MimeType, `image/${string}`>, data: string | Buffer | Uint8Array | Readable): 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('text/html').status(code).end(data);\n\t}\n\n\t/**\n\t * @since 1.0.0\n\t */\n\tpublic setContentType(contentType: MimeType): this {\n\t\tthis.setHeader('Content-Type', contentType);\n\t\treturn this;\n\t}\n}\n"]}
@@ -92,5 +92,5 @@ __publicField(_CookieStore, "octetRegExp", /[^\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5
92
92
  var CookieStore = _CookieStore;
93
93
 
94
94
  export { CookieStore };
95
- //# sourceMappingURL=out.js.map
95
+ //# sourceMappingURL=CookieStore.mjs.map
96
96
  //# sourceMappingURL=CookieStore.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/structures/api/CookieStore.ts"],"names":[],"mappings":";;;;;;AAGA,SAAS,iBAAiB;AAInB,IAAM,eAAN,MAAM,qBAAoB,IAAoB;AAAA,EAM7C,YAAY,SAAqB,UAAuB,QAAiB,iBAAiC;AAChH,UAAM;AANP,wBAAU;AACV,wBAAU;AACV,wBAAQ;AACR,wBAAQ;AAKP,SAAK,UAAU;AACf,SAAK,WAAW;AAGhB,UAAM,EAAE,SAAS,GAAG,IAAI,QAAQ;AAChC,UAAM,QAAQ,OAAO,MAAM,GAAG;AAE9B,eAAW,QAAQ,OAAO;AACzB,YAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAI,UAAU,GAAI;AAElB,YAAM,MAAM,mBAAmB,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC;AAC1D,YAAM,QAAQ,mBAAmB,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC;AAC7D,WAAK,IAAI,KAAK,KAAK;AAAA,IACpB;AAEA,UAAM,CAAC,SAAS,IAAI,KAAK,QAAQ,QAAQ,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE;AAEhE,SAAK,SAAS,mBAAmB,KAAK,cAAc,SAAS;AAE7D,QAAI,KAAK,QAAQ,OAAO,kBAAkB,KAAK,QAAQ;AACtD,YAAM,IAAI,MAAM,mFAAmF;AAAA,IACpG;AAGA,SAAK,SAAS;AAAA,EACf;AAAA,EAEO,IAAI,MAAc,OAAe,SAAuC;AAC9E,SAAK,OAAO,MAAM,KAAK,QAAQ,MAAM,OAAO,OAAO,CAAC;AAAA,EACrD;AAAA,EAEO,OAAO,MAAc;AAC3B,SAAK,IAAI,MAAM,IAAI,EAAE,SAAS,oBAAI,KAAK,CAAC,EAAE,CAAC;AAAA,EAC5C;AAAA,EAEU,OAAO,MAAc,OAAe;AAC7C,QAAI,MAAM,KAAK,SAAS,UAAU,YAAY;AAE9C,QAAI,QAAQ,QAAW;AACtB,YAAM,CAAC;AAAA,IACR,WAAW,CAAC,MAAM,QAAQ,GAAG,GAAG;AAC/B,YAAM,CAAC,IAAI,SAAS,CAAC;AAAA,IACtB;AAEA,UAAM,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,QAAQ,GAAG,CAAC,MAAM,IAAI;AAC3D,QAAI,KAAK,KAAK;AAEd,SAAK,SAAS,UAAU,cAAc,GAAG;AAAA,EAC1C;AAAA,EAEU,QAAQ,MAAc,OAAe,EAAE,SAAS,QAAQ,QAAQ,MAAM,SAAS,IAAiC,CAAC,GAAG;AAC7H,UAAM,MAAM,oBAAI,KAAK;AAErB,QAAI,YAAY,QAAW;AAC1B,gBAAU;AAAA,IACX;AAGA,WAAO,aAAY,kBAAkB,IAAI;AACzC,YAAQ,aAAY,kBAAkB,KAAK;AAE3C,QAAI,QAAQ,GAAG,IAAI,IAAI,KAAK;AAE5B,QAAI,YAAY,KAAK;AACpB,eAAS,aAAa,QAAQ,YAAY,CAAC;AAAA,IAC5C,WAAW,QAAQ;AAClB,eAAS,aAAa,MAAM;AAAA,IAC7B;AAGA,cAAU,UAAU,KAAK,QAAQ,YAAY;AAE7C,aAAS,YAAY,MAAM;AAC3B,aAAS,UAAU,QAAQ,GAAG;AAE9B,QAAI,KAAK,QAAQ;AAChB,eAAS;AAAA,IACV;AAEA,QAAI,YAAY,MAAM;AACrB,eAAS;AAAA,IACV;AAEA,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,cAAc,MAAsB;AAE3C,UAAM,gBAAgB,KAAK,YAAY;AAGvC,UAAM,gBAAgB,UAAU,aAAa;AAG7C,QAAI,CAAC,cAAe,QAAO;AAG3B,WAAO,IAAI,aAAa;AAAA,EACzB;AAAA,EAKA,OAAe,kBAAkB,OAAe;AAC/C,QAAI,aAAY,YAAY,KAAK,KAAK,GAAG;AACxC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC7C;AAEA,WAAO,mBAAmB,KAAK;AAAA,EAChC;AACD;AA9HqD;AAAA;AAqHpD,cArHY,cAqHY,eAAc;AArHhC,IAAM,cAAN","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"]}
1
+ {"version":3,"sources":["../../../../../src/lib/structures/api/CookieStore.ts"],"names":[],"mappings":"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","file":"CookieStore.mjs","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"]}
@@ -116,5 +116,5 @@ __name(_Auth, "Auth");
116
116
  var Auth = _Auth;
117
117
 
118
118
  export { Auth };
119
- //# sourceMappingURL=out.js.map
119
+ //# sourceMappingURL=Auth.mjs.map
120
120
  //# sourceMappingURL=Auth.mjs.map
@@ -1 +1 @@
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
+ {"version":3,"sources":["../../../../../src/lib/structures/http/Auth.ts"],"names":[],"mappings":"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","file":"Auth.mjs","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;\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: 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 * @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"]}
@@ -66,5 +66,5 @@ var HttpCodes = /* @__PURE__ */ ((HttpCodes2) => {
66
66
  })(HttpCodes || {});
67
67
 
68
68
  export { HttpCodes };
69
- //# sourceMappingURL=out.js.map
69
+ //# sourceMappingURL=HttpCodes.mjs.map
70
70
  //# sourceMappingURL=HttpCodes.mjs.map