@kiyasov/platform-hono 1.0.6 → 1.0.8

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 (235) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/dist/cjs/index.d.ts +1 -0
  3. package/dist/cjs/index.js +1 -0
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/src/adapters/hono-adapter.d.ts +11 -11
  6. package/dist/cjs/src/adapters/hono-adapter.js +24 -24
  7. package/dist/cjs/src/adapters/hono-adapter.js.map +1 -1
  8. package/dist/cjs/src/drivers/constants/apollo.constants.d.ts +1 -0
  9. package/dist/cjs/src/drivers/constants/apollo.constants.js +5 -0
  10. package/dist/cjs/src/drivers/constants/apollo.constants.js.map +1 -0
  11. package/dist/cjs/src/drivers/constants/index.d.ts +1 -0
  12. package/dist/cjs/src/drivers/constants/index.js +18 -0
  13. package/dist/cjs/src/drivers/constants/index.js.map +1 -0
  14. package/dist/cjs/src/drivers/graphql.driver.d.ts +7 -3
  15. package/dist/cjs/src/drivers/graphql.driver.js +32 -12
  16. package/dist/cjs/src/drivers/graphql.driver.js.map +1 -1
  17. package/dist/cjs/src/drivers/services/plugins-explorer.service.d.ts +9 -0
  18. package/dist/cjs/src/drivers/services/plugins-explorer.service.js +25 -0
  19. package/dist/cjs/src/drivers/services/plugins-explorer.service.js.map +1 -0
  20. package/dist/cjs/src/multer/crypto/index.d.ts +2 -0
  21. package/dist/cjs/src/multer/crypto/index.js +7 -0
  22. package/dist/cjs/src/multer/crypto/index.js.map +1 -0
  23. package/dist/cjs/src/multer/decorators/index.d.ts +2 -0
  24. package/dist/cjs/src/multer/decorators/index.js +19 -0
  25. package/dist/cjs/src/multer/decorators/index.js.map +1 -0
  26. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
  27. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js +10 -0
  28. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
  29. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
  30. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js +10 -0
  31. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
  32. package/dist/cjs/src/multer/fs/index.d.ts +2 -0
  33. package/dist/cjs/src/multer/fs/index.js +23 -0
  34. package/dist/cjs/src/multer/fs/index.js.map +1 -0
  35. package/dist/cjs/src/multer/index.d.ts +4 -0
  36. package/dist/cjs/src/multer/index.js +21 -0
  37. package/dist/cjs/src/multer/index.js.map +1 -0
  38. package/dist/cjs/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
  39. package/dist/cjs/src/multer/interceptors/any-files-interceptor.js +27 -0
  40. package/dist/cjs/src/multer/interceptors/any-files-interceptor.js.map +1 -0
  41. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
  42. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js +28 -0
  43. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
  44. package/dist/cjs/src/multer/interceptors/file-interceptor.d.ts +3 -0
  45. package/dist/cjs/src/multer/interceptors/file-interceptor.js +27 -0
  46. package/dist/cjs/src/multer/interceptors/file-interceptor.js.map +1 -0
  47. package/dist/cjs/src/multer/interceptors/files-interceptor.d.ts +3 -0
  48. package/dist/cjs/src/multer/interceptors/files-interceptor.js +27 -0
  49. package/dist/cjs/src/multer/interceptors/files-interceptor.js.map +1 -0
  50. package/dist/cjs/src/multer/interceptors/index.d.ts +4 -0
  51. package/dist/cjs/src/multer/interceptors/index.js +21 -0
  52. package/dist/cjs/src/multer/interceptors/index.js.map +1 -0
  53. package/dist/cjs/src/multer/multipart/exceptions.d.ts +1 -0
  54. package/dist/cjs/src/multer/multipart/exceptions.js +22 -0
  55. package/dist/cjs/src/multer/multipart/exceptions.js.map +1 -0
  56. package/dist/cjs/src/multer/multipart/file.d.ts +10 -0
  57. package/dist/cjs/src/multer/multipart/file.js +10 -0
  58. package/dist/cjs/src/multer/multipart/file.js.map +1 -0
  59. package/dist/cjs/src/multer/multipart/filter.d.ts +6 -0
  60. package/dist/cjs/src/multer/multipart/filter.js +22 -0
  61. package/dist/cjs/src/multer/multipart/filter.js.map +1 -0
  62. package/dist/cjs/src/multer/multipart/handlers/any-files.d.ts +8 -0
  63. package/dist/cjs/src/multer/multipart/handlers/any-files.js +33 -0
  64. package/dist/cjs/src/multer/multipart/handlers/any-files.js.map +1 -0
  65. package/dist/cjs/src/multer/multipart/handlers/file-fields.d.ts +14 -0
  66. package/dist/cjs/src/multer/multipart/handlers/file-fields.js +57 -0
  67. package/dist/cjs/src/multer/multipart/handlers/file-fields.js.map +1 -0
  68. package/dist/cjs/src/multer/multipart/handlers/index.d.ts +1 -0
  69. package/dist/cjs/src/multer/multipart/handlers/index.js +3 -0
  70. package/dist/cjs/src/multer/multipart/handlers/index.js.map +1 -0
  71. package/dist/cjs/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
  72. package/dist/cjs/src/multer/multipart/handlers/multiple-files.js +40 -0
  73. package/dist/cjs/src/multer/multipart/handlers/multiple-files.js.map +1 -0
  74. package/dist/cjs/src/multer/multipart/handlers/single-file.d.ts +8 -0
  75. package/dist/cjs/src/multer/multipart/handlers/single-file.js +45 -0
  76. package/dist/cjs/src/multer/multipart/handlers/single-file.js.map +1 -0
  77. package/dist/cjs/src/multer/multipart/index.d.ts +3 -0
  78. package/dist/cjs/src/multer/multipart/index.js +19 -0
  79. package/dist/cjs/src/multer/multipart/index.js.map +1 -0
  80. package/dist/cjs/src/multer/multipart/options.d.ts +22 -0
  81. package/dist/cjs/src/multer/multipart/options.js +23 -0
  82. package/dist/cjs/src/multer/multipart/options.js.map +1 -0
  83. package/dist/cjs/src/multer/multipart/request.d.ts +16 -0
  84. package/dist/cjs/src/multer/multipart/request.js +25 -0
  85. package/dist/cjs/src/multer/multipart/request.js.map +1 -0
  86. package/dist/cjs/src/multer/storage/disk-storage.d.ts +31 -0
  87. package/dist/cjs/src/multer/storage/disk-storage.js +62 -0
  88. package/dist/cjs/src/multer/storage/disk-storage.js.map +1 -0
  89. package/dist/cjs/src/multer/storage/index.d.ts +3 -0
  90. package/dist/cjs/src/multer/storage/index.js +20 -0
  91. package/dist/cjs/src/multer/storage/index.js.map +1 -0
  92. package/dist/cjs/src/multer/storage/memory-storage.d.ts +17 -0
  93. package/dist/cjs/src/multer/storage/memory-storage.js +21 -0
  94. package/dist/cjs/src/multer/storage/memory-storage.js.map +1 -0
  95. package/dist/cjs/src/multer/storage/storage.d.ts +13 -0
  96. package/dist/cjs/src/multer/storage/storage.js +3 -0
  97. package/dist/cjs/src/multer/storage/storage.js.map +1 -0
  98. package/dist/cjs/src/multer/stream/index.d.ts +3 -0
  99. package/dist/cjs/src/multer/stream/index.js +7 -0
  100. package/dist/cjs/src/multer/stream/index.js.map +1 -0
  101. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  102. package/dist/esm/index.d.ts +1 -0
  103. package/dist/esm/index.js +1 -0
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/src/adapters/hono-adapter.d.ts +11 -11
  106. package/dist/esm/src/adapters/hono-adapter.js +35 -35
  107. package/dist/esm/src/adapters/hono-adapter.js.map +1 -1
  108. package/dist/esm/src/drivers/constants/apollo.constants.d.ts +1 -0
  109. package/dist/esm/src/drivers/constants/apollo.constants.js +2 -0
  110. package/dist/esm/src/drivers/constants/apollo.constants.js.map +1 -0
  111. package/dist/esm/src/drivers/constants/index.d.ts +1 -0
  112. package/dist/esm/src/drivers/constants/index.js +2 -0
  113. package/dist/esm/src/drivers/constants/index.js.map +1 -0
  114. package/dist/esm/src/drivers/graphql.driver.d.ts +7 -3
  115. package/dist/esm/src/drivers/graphql.driver.js +36 -16
  116. package/dist/esm/src/drivers/graphql.driver.js.map +1 -1
  117. package/dist/esm/src/drivers/services/plugins-explorer.service.d.ts +9 -0
  118. package/dist/esm/src/drivers/services/plugins-explorer.service.js +21 -0
  119. package/dist/esm/src/drivers/services/plugins-explorer.service.js.map +1 -0
  120. package/dist/esm/src/multer/crypto/index.d.ts +2 -0
  121. package/dist/esm/src/multer/crypto/index.js +4 -0
  122. package/dist/esm/src/multer/crypto/index.js.map +1 -0
  123. package/dist/esm/src/multer/decorators/index.d.ts +2 -0
  124. package/dist/esm/src/multer/decorators/index.js +3 -0
  125. package/dist/esm/src/multer/decorators/index.js.map +1 -0
  126. package/dist/esm/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
  127. package/dist/esm/src/multer/decorators/uploaded-file-decorator.js +7 -0
  128. package/dist/esm/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
  129. package/dist/esm/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
  130. package/dist/esm/src/multer/decorators/uploaded-files-decorator.js +7 -0
  131. package/dist/esm/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
  132. package/dist/esm/src/multer/fs/index.d.ts +2 -0
  133. package/dist/esm/src/multer/fs/index.js +18 -0
  134. package/dist/esm/src/multer/fs/index.js.map +1 -0
  135. package/dist/esm/src/multer/index.d.ts +4 -0
  136. package/dist/esm/src/multer/index.js +5 -0
  137. package/dist/esm/src/multer/index.js.map +1 -0
  138. package/dist/esm/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
  139. package/dist/esm/src/multer/interceptors/any-files-interceptor.js +23 -0
  140. package/dist/esm/src/multer/interceptors/any-files-interceptor.js.map +1 -0
  141. package/dist/esm/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
  142. package/dist/esm/src/multer/interceptors/file-fields-interceptor.js +24 -0
  143. package/dist/esm/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
  144. package/dist/esm/src/multer/interceptors/file-interceptor.d.ts +3 -0
  145. package/dist/esm/src/multer/interceptors/file-interceptor.js +23 -0
  146. package/dist/esm/src/multer/interceptors/file-interceptor.js.map +1 -0
  147. package/dist/esm/src/multer/interceptors/files-interceptor.d.ts +3 -0
  148. package/dist/esm/src/multer/interceptors/files-interceptor.js +23 -0
  149. package/dist/esm/src/multer/interceptors/files-interceptor.js.map +1 -0
  150. package/dist/esm/src/multer/interceptors/index.d.ts +4 -0
  151. package/dist/esm/src/multer/interceptors/index.js +5 -0
  152. package/dist/esm/src/multer/interceptors/index.js.map +1 -0
  153. package/dist/esm/src/multer/multipart/exceptions.d.ts +1 -0
  154. package/dist/esm/src/multer/multipart/exceptions.js +18 -0
  155. package/dist/esm/src/multer/multipart/exceptions.js.map +1 -0
  156. package/dist/esm/src/multer/multipart/file.d.ts +10 -0
  157. package/dist/esm/src/multer/multipart/file.js +6 -0
  158. package/dist/esm/src/multer/multipart/file.js.map +1 -0
  159. package/dist/esm/src/multer/multipart/filter.d.ts +6 -0
  160. package/dist/esm/src/multer/multipart/filter.js +18 -0
  161. package/dist/esm/src/multer/multipart/filter.js.map +1 -0
  162. package/dist/esm/src/multer/multipart/handlers/any-files.d.ts +8 -0
  163. package/dist/esm/src/multer/multipart/handlers/any-files.js +29 -0
  164. package/dist/esm/src/multer/multipart/handlers/any-files.js.map +1 -0
  165. package/dist/esm/src/multer/multipart/handlers/file-fields.d.ts +14 -0
  166. package/dist/esm/src/multer/multipart/handlers/file-fields.js +52 -0
  167. package/dist/esm/src/multer/multipart/handlers/file-fields.js.map +1 -0
  168. package/dist/esm/src/multer/multipart/handlers/index.d.ts +1 -0
  169. package/dist/esm/src/multer/multipart/handlers/index.js +2 -0
  170. package/dist/esm/src/multer/multipart/handlers/index.js.map +1 -0
  171. package/dist/esm/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
  172. package/dist/esm/src/multer/multipart/handlers/multiple-files.js +36 -0
  173. package/dist/esm/src/multer/multipart/handlers/multiple-files.js.map +1 -0
  174. package/dist/esm/src/multer/multipart/handlers/single-file.d.ts +8 -0
  175. package/dist/esm/src/multer/multipart/handlers/single-file.js +41 -0
  176. package/dist/esm/src/multer/multipart/handlers/single-file.js.map +1 -0
  177. package/dist/esm/src/multer/multipart/index.d.ts +3 -0
  178. package/dist/esm/src/multer/multipart/index.js +3 -0
  179. package/dist/esm/src/multer/multipart/index.js.map +1 -0
  180. package/dist/esm/src/multer/multipart/options.d.ts +22 -0
  181. package/dist/esm/src/multer/multipart/options.js +19 -0
  182. package/dist/esm/src/multer/multipart/options.js.map +1 -0
  183. package/dist/esm/src/multer/multipart/request.d.ts +16 -0
  184. package/dist/esm/src/multer/multipart/request.js +20 -0
  185. package/dist/esm/src/multer/multipart/request.js.map +1 -0
  186. package/dist/esm/src/multer/storage/disk-storage.d.ts +31 -0
  187. package/dist/esm/src/multer/storage/disk-storage.js +58 -0
  188. package/dist/esm/src/multer/storage/disk-storage.js.map +1 -0
  189. package/dist/esm/src/multer/storage/index.d.ts +3 -0
  190. package/dist/esm/src/multer/storage/index.js +4 -0
  191. package/dist/esm/src/multer/storage/index.js.map +1 -0
  192. package/dist/esm/src/multer/storage/memory-storage.d.ts +17 -0
  193. package/dist/esm/src/multer/storage/memory-storage.js +17 -0
  194. package/dist/esm/src/multer/storage/memory-storage.js.map +1 -0
  195. package/dist/esm/src/multer/storage/storage.d.ts +13 -0
  196. package/dist/esm/src/multer/storage/storage.js +2 -0
  197. package/dist/esm/src/multer/storage/storage.js.map +1 -0
  198. package/dist/esm/src/multer/stream/index.d.ts +3 -0
  199. package/dist/esm/src/multer/stream/index.js +4 -0
  200. package/dist/esm/src/multer/stream/index.js.map +1 -0
  201. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  202. package/index.ts +1 -0
  203. package/package.json +3 -1
  204. package/src/adapters/hono-adapter.ts +51 -50
  205. package/src/drivers/constants/apollo.constants.ts +1 -0
  206. package/src/drivers/constants/index.ts +1 -0
  207. package/src/drivers/graphql.driver.ts +52 -21
  208. package/src/drivers/services/plugins-explorer.service.ts +27 -0
  209. package/src/multer/crypto/index.ts +4 -0
  210. package/src/multer/decorators/index.ts +2 -0
  211. package/src/multer/decorators/uploaded-file-decorator.ts +12 -0
  212. package/src/multer/decorators/uploaded-files-decorator.ts +15 -0
  213. package/src/multer/fs/index.ts +22 -0
  214. package/src/multer/index.ts +4 -0
  215. package/src/multer/interceptors/any-files-interceptor.ts +46 -0
  216. package/src/multer/interceptors/file-fields-interceptor.ts +56 -0
  217. package/src/multer/interceptors/file-interceptor.ts +48 -0
  218. package/src/multer/interceptors/files-interceptor.ts +50 -0
  219. package/src/multer/interceptors/index.ts +4 -0
  220. package/src/multer/multipart/exceptions.ts +25 -0
  221. package/src/multer/multipart/file.ts +18 -0
  222. package/src/multer/multipart/filter.ts +38 -0
  223. package/src/multer/multipart/handlers/any-files.ts +39 -0
  224. package/src/multer/multipart/handlers/file-fields.ts +89 -0
  225. package/src/multer/multipart/handlers/index.ts +1 -0
  226. package/src/multer/multipart/handlers/multiple-files.ts +55 -0
  227. package/src/multer/multipart/handlers/single-file.ts +56 -0
  228. package/src/multer/multipart/index.ts +3 -0
  229. package/src/multer/multipart/options.ts +29 -0
  230. package/src/multer/multipart/request.ts +44 -0
  231. package/src/multer/storage/disk-storage.ts +107 -0
  232. package/src/multer/storage/index.ts +3 -0
  233. package/src/multer/storage/memory-storage.ts +25 -0
  234. package/src/multer/storage/storage.ts +15 -0
  235. package/src/multer/stream/index.ts +4 -0
package/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./src/adapters";
2
2
  export * from "./src/interfaces";
3
3
  export * from "./src/drivers";
4
+ export * from "./src/multer";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kiyasov/platform-hono",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Nest adapter for Hono",
5
5
  "author": "Islam Kiiasov",
6
6
  "license": "MIT",
@@ -29,6 +29,8 @@
29
29
  "@nestjs/graphql": "^12.1.1",
30
30
  "@swc/cli": "^0.3.12",
31
31
  "@swc/core": "^1.5.24",
32
+ "@types/busboy": "^1.5.4",
33
+ "graphql-subscriptions": "^2.0.0",
32
34
  "reflect-metadata": "^0.2.2",
33
35
  "rxjs": "^7.8.1",
34
36
  "tsc": "^2.0.4",
@@ -1,27 +1,27 @@
1
- import { Server } from "node:net";
2
- import { HttpBindings, createAdaptorServer } from "@hono/node-server";
3
- import { RESPONSE_ALREADY_SENT } from "@hono/node-server/utils/response";
4
- import { RequestMethod } from "@nestjs/common";
5
- import { HttpStatus, Logger } from "@nestjs/common";
6
- import { bodyLimit } from "hono/body-limit";
1
+ import { Server } from 'node:net';
2
+ import { HttpBindings, createAdaptorServer } from '@hono/node-server';
3
+ import { RESPONSE_ALREADY_SENT } from '@hono/node-server/utils/response';
4
+ import { RequestMethod } from '@nestjs/common';
5
+ import { HttpStatus, Logger } from '@nestjs/common';
6
+ import { bodyLimit } from 'hono/body-limit';
7
7
  import {
8
8
  ErrorHandler,
9
9
  NestApplicationOptions,
10
10
  RequestHandler,
11
- } from "@nestjs/common/interfaces";
11
+ } from '@nestjs/common/interfaces';
12
12
  import {
13
13
  ServeStaticOptions,
14
14
  serveStatic,
15
- } from "@hono/node-server/serve-static";
16
- import { AbstractHttpAdapter } from "@nestjs/core/adapters/http-adapter";
17
- import { Context, HonoRequest, Next } from "hono";
18
- import { Hono } from "hono";
19
- import { cors } from "hono/cors";
20
- import { RedirectStatusCode, StatusCode } from "hono/utils/http-status";
21
- import * as http from "http";
22
- import { Http2SecureServer, Http2Server } from "http2";
23
- import * as https from "https";
24
- import { TypeBodyParser } from "../interfaces";
15
+ } from '@hono/node-server/serve-static';
16
+ import { AbstractHttpAdapter } from '@nestjs/core/adapters/http-adapter';
17
+ import { Context, HonoRequest, Next } from 'hono';
18
+ import { Hono } from 'hono';
19
+ import { cors } from 'hono/cors';
20
+ import { RedirectStatusCode, StatusCode } from 'hono/utils/http-status';
21
+ import * as http from 'http';
22
+ import { Http2SecureServer, Http2Server } from 'http2';
23
+ import * as https from 'https';
24
+ import { TypeBodyParser } from '../interfaces';
25
25
 
26
26
  type HonoHandler = RequestHandler<HonoRequest, Context>;
27
27
 
@@ -43,10 +43,10 @@ export class HonoAdapter extends AbstractHttpAdapter<
43
43
 
44
44
  private getRouteAndHandler(
45
45
  pathOrHandler: string | HonoHandler,
46
- handler?: HonoHandler
46
+ handler?: HonoHandler,
47
47
  ): [string, HonoHandler] {
48
- let path = typeof pathOrHandler === "function" ? "" : pathOrHandler;
49
- handler = typeof pathOrHandler === "function" ? pathOrHandler : handler;
48
+ let path = typeof pathOrHandler === 'function' ? '' : pathOrHandler;
49
+ handler = typeof pathOrHandler === 'function' ? pathOrHandler : handler;
50
50
  return [path, handler];
51
51
  }
52
52
 
@@ -58,14 +58,14 @@ export class HonoAdapter extends AbstractHttpAdapter<
58
58
  }
59
59
 
60
60
  private send(ctx: Context) {
61
- const body = ctx.get("body");
62
- return typeof body === "string" ? ctx.text(body) : ctx.json(body);
61
+ const body = ctx.get('body');
62
+ return typeof body === 'string' ? ctx.text(body) : ctx.json(body);
63
63
  }
64
64
 
65
65
  public get(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
66
66
  const [routePath, routeHandler] = this.getRouteAndHandler(
67
67
  pathOrHandler,
68
- handler
68
+ handler,
69
69
  );
70
70
  this.instance.get(routePath, this.createRouteHandler(routeHandler));
71
71
  }
@@ -73,7 +73,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
73
73
  public post(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
74
74
  const [routePath, routeHandler] = this.getRouteAndHandler(
75
75
  pathOrHandler,
76
- handler
76
+ handler,
77
77
  );
78
78
  this.instance.post(routePath, this.createRouteHandler(routeHandler));
79
79
  }
@@ -81,7 +81,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
81
81
  public put(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
82
82
  const [routePath, routeHandler] = this.getRouteAndHandler(
83
83
  pathOrHandler,
84
- handler
84
+ handler,
85
85
  );
86
86
  this.instance.put(routePath, this.createRouteHandler(routeHandler));
87
87
  }
@@ -89,7 +89,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
89
89
  public delete(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
90
90
  const [routePath, routeHandler] = this.getRouteAndHandler(
91
91
  pathOrHandler,
92
- handler
92
+ handler,
93
93
  );
94
94
  this.instance.delete(routePath, this.createRouteHandler(routeHandler));
95
95
  }
@@ -97,7 +97,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
97
97
  public use(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
98
98
  const [routePath, routeHandler] = this.getRouteAndHandler(
99
99
  pathOrHandler,
100
- handler
100
+ handler,
101
101
  );
102
102
  this.instance.use(routePath, this.createRouteHandler(routeHandler));
103
103
  }
@@ -105,7 +105,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
105
105
  public patch(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
106
106
  const [routePath, routeHandler] = this.getRouteAndHandler(
107
107
  pathOrHandler,
108
- handler
108
+ handler,
109
109
  );
110
110
  this.instance.patch(routePath, this.createRouteHandler(routeHandler));
111
111
  }
@@ -113,24 +113,25 @@ export class HonoAdapter extends AbstractHttpAdapter<
113
113
  public options(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
114
114
  const [routePath, routeHandler] = this.getRouteAndHandler(
115
115
  pathOrHandler,
116
- handler
116
+ handler,
117
117
  );
118
118
  this.instance.options(routePath, this.createRouteHandler(routeHandler));
119
119
  }
120
120
 
121
121
  public async reply(ctx: Context, body: any, statusCode?: StatusCode) {
122
122
  if (statusCode) ctx.status(statusCode);
123
- const responseContentType = this.getHeader(ctx, "Content-Type");
123
+
124
+ const responseContentType = this.getHeader(ctx, 'Content-Type');
124
125
  if (
125
- !responseContentType?.startsWith("application/json") &&
126
+ !responseContentType?.startsWith('application/json') &&
126
127
  body?.statusCode >= HttpStatus.BAD_REQUEST
127
128
  ) {
128
129
  Logger.warn(
129
- "Content-Type doesn't match Reply body, you might need a custom ExceptionFilter for non-JSON responses"
130
+ "Content-Type doesn't match Reply body, you might need a custom ExceptionFilter for non-JSON responses",
130
131
  );
131
- this.setHeader(ctx, "Content-Type", "application/json");
132
+ this.setHeader(ctx, 'Content-Type', 'application/json');
132
133
  }
133
- ctx.set("body", body);
134
+ ctx.set('body', body);
134
135
  }
135
136
 
136
137
  public status(ctx: Context, statusCode: StatusCode) {
@@ -142,7 +143,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
142
143
  }
143
144
 
144
145
  public render(response: any, view: string, options: any) {
145
- throw new Error("Method not implemented.");
146
+ throw new Error('Method not implemented.');
146
147
  }
147
148
 
148
149
  public redirect(ctx: Context, statusCode: RedirectStatusCode, url: string) {
@@ -164,12 +165,12 @@ export class HonoAdapter extends AbstractHttpAdapter<
164
165
  }
165
166
 
166
167
  public useStaticAssets(path: string, options: ServeStaticOptions) {
167
- Logger.log("Registering static assets middleware");
168
+ Logger.log('Registering static assets middleware');
168
169
  this.instance.use(path, serveStatic(options));
169
170
  }
170
171
 
171
172
  public setViewEngine(options: any | string) {
172
- throw new Error("Method not implemented.");
173
+ throw new Error('Method not implemented.');
173
174
  }
174
175
 
175
176
  public isHeadersSent(ctx: Context): boolean {
@@ -205,16 +206,16 @@ export class HonoAdapter extends AbstractHttpAdapter<
205
206
  }
206
207
 
207
208
  public useBodyParser(type: TypeBodyParser, bodyLimit: number = 1e6) {
208
- Logger.log("Registering body parser middleware");
209
+ Logger.log('Registering body parser middleware');
209
210
  this.instance.use(this.bodyLimit(bodyLimit), async (ctx, next) => {
210
- const contentType = ctx.req.header("content-type");
211
+ const contentType = ctx.req.header('content-type');
211
212
  switch (type) {
212
- case "application/json":
213
- if (contentType === "application/json")
213
+ case 'application/json':
214
+ if (contentType === 'application/json')
214
215
  (ctx.req as any).body = await ctx.req.json();
215
216
  break;
216
- case "text/plain":
217
- if (contentType === "text/plain") {
217
+ case 'text/plain':
218
+ if (contentType === 'text/plain') {
218
219
  (ctx.req as any).rawBody = Buffer.from(await ctx.req.text());
219
220
  (ctx.req as any).body = await ctx.req.json();
220
221
  }
@@ -244,14 +245,14 @@ export class HonoAdapter extends AbstractHttpAdapter<
244
245
  }
245
246
 
246
247
  public getType(): string {
247
- return "hono";
248
+ return 'hono';
248
249
  }
249
250
 
250
251
  public registerParserMiddleware(prefix?: string, rawBody?: boolean) {
251
- Logger.log("Registering parser middleware");
252
- this.useBodyParser("application/x-www-form-urlencoded");
253
- this.useBodyParser("application/json");
254
- this.useBodyParser("text/plain");
252
+ Logger.log('Registering parser middleware');
253
+ this.useBodyParser('application/x-www-form-urlencoded');
254
+ this.useBodyParser('application/json');
255
+ this.useBodyParser('text/plain');
255
256
  }
256
257
 
257
258
  public async createMiddlewareFactory(requestMethod: RequestMethod) {
@@ -275,7 +276,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
275
276
  }
276
277
 
277
278
  public applyVersionFilter(): () => () => any {
278
- throw new Error("Versioning not yet supported in Hono");
279
+ throw new Error('Versioning not yet supported in Hono');
279
280
  }
280
281
 
281
282
  public listen(port: string | number, ...args: any[]): ServerType {
@@ -286,7 +287,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
286
287
  return bodyLimit({
287
288
  maxSize,
288
289
  onError: () => {
289
- throw new Error("Body too large");
290
+ throw new Error('Body too large');
290
291
  },
291
292
  });
292
293
  }
@@ -0,0 +1 @@
1
+ export const PLUGIN_METADATA = 'graphql:plugin';
@@ -0,0 +1 @@
1
+ export * from './apollo.constants';
@@ -1,15 +1,29 @@
1
- import { ApolloServer, BaseContext, HeaderMap } from "@apollo/server";
2
- import { AbstractGraphQLDriver } from "@nestjs/graphql";
3
- import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
4
- import { ApolloDriverConfig } from "@nestjs/apollo";
5
- import { Context, HonoRequest } from "hono";
6
- import { StatusCode } from "hono/utils/http-status";
7
- import { Logger } from "@nestjs/common";
1
+ import { ApolloServer, BaseContext, HeaderMap } from '@apollo/server';
2
+ import {
3
+ AbstractGraphQLDriver,
4
+ GqlSubscriptionService,
5
+ SubscriptionConfig,
6
+ } from '@nestjs/graphql';
7
+ import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer';
8
+ import { ApolloDriverConfig } from '@nestjs/apollo';
9
+ import { Context, HonoRequest } from 'hono';
10
+ import { StatusCode } from 'hono/utils/http-status';
11
+ import { Logger } from '@nestjs/common';
12
+
13
+ import { PluginsExplorerService } from './services/plugins-explorer.service';
14
+ import { ModulesContainer } from '@nestjs/core';
8
15
 
9
16
  export class HonoGraphQLDriver<
10
- T extends Record<string, any> = ApolloDriverConfig
17
+ T extends Record<string, any> = ApolloDriverConfig,
11
18
  > extends AbstractGraphQLDriver {
12
19
  protected apolloServer: ApolloServer<BaseContext>;
20
+ private _subscriptionService?: GqlSubscriptionService;
21
+ private readonly pluginsExplorerService: PluginsExplorerService;
22
+
23
+ constructor(modulesContainer: ModulesContainer) {
24
+ super();
25
+ this.pluginsExplorerService = new PluginsExplorerService(modulesContainer);
26
+ }
13
27
 
14
28
  get instance(): ApolloServer<BaseContext> {
15
29
  return this.apolloServer;
@@ -19,16 +33,30 @@ export class HonoGraphQLDriver<
19
33
  const { httpAdapter } = this.httpAdapterHost;
20
34
  const platformName = httpAdapter.getType();
21
35
 
22
- if (platformName !== "hono") {
23
- throw new Error("This driver is only compatible with the Hono platform");
36
+ if (platformName !== 'hono') {
37
+ throw new Error('This driver is only compatible with the Hono platform');
24
38
  }
25
39
 
26
- return this.registerHono(options);
40
+ await this.registerHono(options);
41
+
42
+ if (options.installSubscriptionHandlers || options.subscriptions) {
43
+ const subscriptionsOptions: SubscriptionConfig =
44
+ options.subscriptions || { 'subscriptions-transport-ws': {} };
45
+ this._subscriptionService = new GqlSubscriptionService(
46
+ {
47
+ schema: options.schema,
48
+ path: options.path,
49
+ context: options.context,
50
+ ...subscriptionsOptions,
51
+ },
52
+ this.httpAdapterHost.httpAdapter?.getHttpServer(),
53
+ );
54
+ }
27
55
  }
28
56
 
29
57
  protected async registerHono(
30
58
  options: T,
31
- { preStartHook }: { preStartHook?: () => void } = {}
59
+ { preStartHook }: { preStartHook?: () => void } = {},
32
60
  ) {
33
61
  const { path, typeDefs, resolvers, schema } = options;
34
62
  const { httpAdapter } = this.httpAdapterHost;
@@ -65,7 +93,9 @@ export class HonoGraphQLDriver<
65
93
  },
66
94
  context: () =>
67
95
  contextFunction(ctx, {
68
- ...ctx.req.raw,
96
+ method: ctx.req.method,
97
+ url: ctx.req.url,
98
+ body: ctx.req.raw.body,
69
99
  headers: Object.fromEntries(ctx.req.raw.headers),
70
100
  }),
71
101
  });
@@ -78,7 +108,7 @@ export class HonoGraphQLDriver<
78
108
 
79
109
  ctx.status(status === undefined ? 200 : (status as StatusCode));
80
110
 
81
- if (body.kind === "complete") {
111
+ if (body.kind === 'complete') {
82
112
  return ctx.body(body.string);
83
113
  }
84
114
 
@@ -92,15 +122,16 @@ export class HonoGraphQLDriver<
92
122
  });
93
123
 
94
124
  return new Response(readableStream, {
95
- headers: { "Content-Type": "application/octet-stream" },
125
+ headers: { 'Content-Type': 'application/octet-stream' },
96
126
  });
97
127
  });
98
128
 
99
129
  this.apolloServer = server;
100
130
  }
101
131
 
102
- public stop() {
103
- return this.apolloServer?.stop();
132
+ public async stop() {
133
+ await this._subscriptionService?.stop();
134
+ await this.apolloServer?.stop();
104
135
  }
105
136
 
106
137
  private httpHeadersToMap(headers: Headers) {
@@ -110,12 +141,12 @@ export class HonoGraphQLDriver<
110
141
  }
111
142
 
112
143
  private async parseBody(req: HonoRequest): Promise<Record<string, unknown>> {
113
- const contentType = req.header("content-type");
114
- if (contentType === "application/graphql")
144
+ const contentType = req.header('content-type');
145
+ if (contentType === 'application/graphql')
115
146
  return { query: await req.text() };
116
- if (contentType === "application/json")
147
+ if (contentType === 'application/json')
117
148
  return req.json().catch(this.logError);
118
- if (contentType === "application/x-www-form-urlencoded")
149
+ if (contentType === 'application/x-www-form-urlencoded')
119
150
  return this.parseFormURL(req);
120
151
  return {};
121
152
  }
@@ -0,0 +1,27 @@
1
+ import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
2
+ import { ModulesContainer } from '@nestjs/core/injector/modules-container';
3
+ import { BaseExplorerService, GqlModuleOptions } from '@nestjs/graphql';
4
+ import { PLUGIN_METADATA } from '../constants';
5
+
6
+ export class PluginsExplorerService extends BaseExplorerService {
7
+ constructor(private readonly modulesContainer: ModulesContainer) {
8
+ super();
9
+ }
10
+
11
+ explore(options: GqlModuleOptions) {
12
+ const modules = this.getModules(
13
+ this.modulesContainer,
14
+ options.include || [],
15
+ );
16
+ return this.flatMap(modules, (instance) => this.filterPlugins(instance));
17
+ }
18
+
19
+ filterPlugins<T = any>(wrapper: InstanceWrapper<T>) {
20
+ const { instance } = wrapper;
21
+ if (!instance) {
22
+ return undefined;
23
+ }
24
+ const metadata = Reflect.getMetadata(PLUGIN_METADATA, instance.constructor);
25
+ return metadata ? instance : undefined;
26
+ }
27
+ }
@@ -0,0 +1,4 @@
1
+ import { promisify } from 'node:util';
2
+ import { randomBytes as cryptoRandomBytes } from 'node:crypto';
3
+
4
+ export const randomBytes = promisify(cryptoRandomBytes);
@@ -0,0 +1,2 @@
1
+ export * from "./uploaded-files-decorator";
2
+ export * from "./uploaded-file-decorator";
@@ -0,0 +1,12 @@
1
+ import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2
+
3
+ import { getMultipartRequest } from '../multipart/request';
4
+ import { StorageFile } from '../storage/storage';
5
+
6
+ export const UploadedFile = createParamDecorator(
7
+ async (_data, ctx: ExecutionContext): Promise<StorageFile | undefined> => {
8
+ const req = getMultipartRequest(ctx.switchToHttp());
9
+
10
+ return req?.storageFile;
11
+ },
12
+ );
@@ -0,0 +1,15 @@
1
+ import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2
+
3
+ import { getMultipartRequest } from '../multipart/request';
4
+ import { StorageFile } from '../storage/storage';
5
+
6
+ export const UploadedFiles = createParamDecorator(
7
+ async (
8
+ _data: any,
9
+ ctx: ExecutionContext,
10
+ ): Promise<Record<string, StorageFile[]> | StorageFile[] | undefined> => {
11
+ const req = getMultipartRequest(ctx.switchToHttp());
12
+
13
+ return req?.storageFiles;
14
+ },
15
+ );
@@ -0,0 +1,22 @@
1
+ import fs from 'node:fs/promises';
2
+ import { extname } from 'node:path';
3
+
4
+ import { randomBytes } from '../crypto';
5
+
6
+ export const pathExists = async (path: string) => {
7
+ try {
8
+ await fs.stat(path);
9
+ } catch (err) {
10
+ return false;
11
+ }
12
+
13
+ return true;
14
+ };
15
+
16
+ export const getUniqueFilename = async (filename: string) => {
17
+ const buffer = await randomBytes(16);
18
+
19
+ const ext = extname(filename);
20
+
21
+ return buffer.toString('hex') + ext;
22
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./interceptors";
2
+ export * from "./decorators";
3
+ export * from "./storage";
4
+ export * from "./multipart";
@@ -0,0 +1,46 @@
1
+ import { Observable, tap } from 'rxjs';
2
+ import {
3
+ CallHandler,
4
+ ExecutionContext,
5
+ mixin,
6
+ NestInterceptor,
7
+ Type,
8
+ } from '@nestjs/common';
9
+
10
+ import { getMultipartRequest } from '../multipart/request';
11
+ import { transformUploadOptions, UploadOptions } from '../multipart/options';
12
+ import { handleMultipartAnyFiles } from '../multipart/handlers/any-files';
13
+
14
+ export function AnyFilesInterceptor(
15
+ options?: UploadOptions,
16
+ ): Type<NestInterceptor> {
17
+ class MixinInterceptor implements NestInterceptor {
18
+ private readonly options: UploadOptions;
19
+
20
+ constructor() {
21
+ this.options = transformUploadOptions(options);
22
+ }
23
+
24
+ async intercept(
25
+ context: ExecutionContext,
26
+ next: CallHandler,
27
+ ): Promise<Observable<any>> {
28
+ const ctx = context.switchToHttp();
29
+ const req = getMultipartRequest(ctx);
30
+
31
+ const { body, files, remove } = await handleMultipartAnyFiles(
32
+ req,
33
+ this.options,
34
+ );
35
+
36
+ req.body = body;
37
+ req.storageFiles = files;
38
+
39
+ return next.handle().pipe(tap(remove));
40
+ }
41
+ }
42
+
43
+ const Interceptor = mixin(MixinInterceptor);
44
+
45
+ return Interceptor;
46
+ }
@@ -0,0 +1,56 @@
1
+ import { Observable, tap } from 'rxjs';
2
+ import {
3
+ CallHandler,
4
+ ExecutionContext,
5
+ mixin,
6
+ NestInterceptor,
7
+ Type,
8
+ } from '@nestjs/common';
9
+
10
+ import { getMultipartRequest } from '../multipart/request';
11
+ import { transformUploadOptions, UploadOptions } from '../multipart/options';
12
+ import {
13
+ handleMultipartFileFields,
14
+ UploadField,
15
+ UploadFieldMapEntry,
16
+ uploadFieldsToMap,
17
+ } from '../multipart/handlers/file-fields';
18
+
19
+ export function FileFieldsInterceptor(
20
+ uploadFields: UploadField[],
21
+ options?: UploadOptions,
22
+ ): Type<NestInterceptor> {
23
+ class MixinInterceptor implements NestInterceptor {
24
+ private readonly options: UploadOptions;
25
+
26
+ private readonly fieldsMap: Map<string, UploadFieldMapEntry>;
27
+
28
+ constructor() {
29
+ this.options = transformUploadOptions(options);
30
+ this.fieldsMap = uploadFieldsToMap(uploadFields);
31
+ }
32
+
33
+ async intercept(
34
+ context: ExecutionContext,
35
+ next: CallHandler,
36
+ ): Promise<Observable<any>> {
37
+ const ctx = context.switchToHttp();
38
+ const req = getMultipartRequest(ctx);
39
+
40
+ const { body, files, remove } = await handleMultipartFileFields(
41
+ req,
42
+ this.fieldsMap,
43
+ this.options,
44
+ );
45
+
46
+ req.body = body;
47
+ req.storageFiles = files;
48
+
49
+ return next.handle().pipe(tap(remove));
50
+ }
51
+ }
52
+
53
+ const Interceptor = mixin(MixinInterceptor);
54
+
55
+ return Interceptor;
56
+ }
@@ -0,0 +1,48 @@
1
+ import { Observable, tap } from 'rxjs';
2
+ import {
3
+ CallHandler,
4
+ ExecutionContext,
5
+ mixin,
6
+ NestInterceptor,
7
+ Type,
8
+ } from '@nestjs/common';
9
+
10
+ import { getMultipartRequest } from '../multipart/request';
11
+ import { transformUploadOptions, UploadOptions } from '../multipart/options';
12
+ import { handleMultipartSingleFile } from '../multipart/handlers/single-file';
13
+
14
+ export function FileInterceptor(
15
+ fieldname: string,
16
+ options?: UploadOptions,
17
+ ): Type<NestInterceptor> {
18
+ class MixinInterceptor implements NestInterceptor {
19
+ private readonly options: UploadOptions;
20
+
21
+ constructor() {
22
+ this.options = transformUploadOptions(options);
23
+ }
24
+
25
+ async intercept(
26
+ context: ExecutionContext,
27
+ next: CallHandler,
28
+ ): Promise<Observable<any>> {
29
+ const ctx = context.switchToHttp();
30
+ const req = getMultipartRequest(ctx);
31
+
32
+ const { file, body, remove } = await handleMultipartSingleFile(
33
+ req,
34
+ fieldname,
35
+ this.options,
36
+ );
37
+
38
+ req.body = body;
39
+ req.storageFile = file;
40
+
41
+ return next.handle().pipe(tap(remove));
42
+ }
43
+ }
44
+
45
+ const Interceptor = mixin(MixinInterceptor);
46
+
47
+ return Interceptor;
48
+ }