@kiyasov/platform-hono 1.3.7 → 1.3.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 (295) hide show
  1. package/dist/cjs/src/adapters/hono-adapter.d.ts +57 -0
  2. package/dist/cjs/src/adapters/hono-adapter.js +227 -0
  3. package/dist/cjs/src/adapters/hono-adapter.js.map +1 -0
  4. package/dist/cjs/src/adapters/index.d.ts +1 -0
  5. package/dist/cjs/src/adapters/index.js +18 -0
  6. package/dist/cjs/src/adapters/index.js.map +1 -0
  7. package/dist/cjs/src/drivers/constants/apollo.constants.d.ts +1 -0
  8. package/dist/cjs/src/drivers/constants/apollo.constants.js +5 -0
  9. package/dist/cjs/src/drivers/constants/apollo.constants.js.map +1 -0
  10. package/dist/cjs/src/drivers/constants/index.d.ts +1 -0
  11. package/dist/cjs/src/drivers/constants/index.js +18 -0
  12. package/dist/cjs/src/drivers/constants/index.js.map +1 -0
  13. package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.d.ts +3 -0
  14. package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.js +21 -0
  15. package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.js.map +1 -0
  16. package/dist/cjs/src/drivers/graphQLUpload/Upload.d.ts +16 -0
  17. package/dist/cjs/src/drivers/graphQLUpload/Upload.js +17 -0
  18. package/dist/cjs/src/drivers/graphQLUpload/Upload.js.map +1 -0
  19. package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.d.ts +42 -0
  20. package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.js +190 -0
  21. package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.js.map +1 -0
  22. package/dist/cjs/src/drivers/graphQLUpload/index.d.ts +4 -0
  23. package/dist/cjs/src/drivers/graphQLUpload/index.js +21 -0
  24. package/dist/cjs/src/drivers/graphQLUpload/index.js.map +1 -0
  25. package/dist/cjs/src/drivers/graphQLUpload/processRequest.d.ts +2 -0
  26. package/dist/cjs/src/drivers/graphQLUpload/processRequest.js +50 -0
  27. package/dist/cjs/src/drivers/graphQLUpload/processRequest.js.map +1 -0
  28. package/dist/cjs/src/drivers/graphql.driver.d.ts +20 -0
  29. package/dist/cjs/src/drivers/graphql.driver.js +126 -0
  30. package/dist/cjs/src/drivers/graphql.driver.js.map +1 -0
  31. package/dist/cjs/src/drivers/index.d.ts +2 -0
  32. package/dist/cjs/src/drivers/index.js +19 -0
  33. package/dist/cjs/src/drivers/index.js.map +1 -0
  34. package/dist/cjs/src/drivers/services/plugins-explorer.service.d.ts +9 -0
  35. package/dist/cjs/src/drivers/services/plugins-explorer.service.js +25 -0
  36. package/dist/cjs/src/drivers/services/plugins-explorer.service.js.map +1 -0
  37. package/dist/cjs/src/interfaces/hono.interface.d.ts +4 -0
  38. package/dist/cjs/src/interfaces/hono.interface.js +3 -0
  39. package/dist/cjs/src/interfaces/hono.interface.js.map +1 -0
  40. package/dist/cjs/src/interfaces/index.d.ts +2 -0
  41. package/dist/cjs/src/interfaces/index.js +19 -0
  42. package/dist/cjs/src/interfaces/index.js.map +1 -0
  43. package/dist/cjs/src/interfaces/nest-hono-application.interface.d.ts +18 -0
  44. package/dist/cjs/src/interfaces/nest-hono-application.interface.js +3 -0
  45. package/dist/cjs/src/interfaces/nest-hono-application.interface.js.map +1 -0
  46. package/dist/cjs/src/multer/crypto/index.d.ts +1 -0
  47. package/dist/cjs/src/multer/crypto/index.js +7 -0
  48. package/dist/cjs/src/multer/crypto/index.js.map +1 -0
  49. package/dist/cjs/src/multer/decorators/index.d.ts +2 -0
  50. package/dist/cjs/src/multer/decorators/index.js +19 -0
  51. package/dist/cjs/src/multer/decorators/index.js.map +1 -0
  52. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
  53. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js +10 -0
  54. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
  55. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
  56. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js +10 -0
  57. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
  58. package/dist/cjs/src/multer/fs/index.d.ts +2 -0
  59. package/dist/cjs/src/multer/fs/index.js +23 -0
  60. package/dist/cjs/src/multer/fs/index.js.map +1 -0
  61. package/dist/cjs/src/multer/index.d.ts +4 -0
  62. package/dist/cjs/src/multer/index.js +21 -0
  63. package/dist/cjs/src/multer/index.js.map +1 -0
  64. package/dist/cjs/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
  65. package/dist/cjs/src/multer/interceptors/any-files-interceptor.js +29 -0
  66. package/dist/cjs/src/multer/interceptors/any-files-interceptor.js.map +1 -0
  67. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
  68. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js +30 -0
  69. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
  70. package/dist/cjs/src/multer/interceptors/file-interceptor.d.ts +3 -0
  71. package/dist/cjs/src/multer/interceptors/file-interceptor.js +29 -0
  72. package/dist/cjs/src/multer/interceptors/file-interceptor.js.map +1 -0
  73. package/dist/cjs/src/multer/interceptors/files-interceptor.d.ts +3 -0
  74. package/dist/cjs/src/multer/interceptors/files-interceptor.js +29 -0
  75. package/dist/cjs/src/multer/interceptors/files-interceptor.js.map +1 -0
  76. package/dist/cjs/src/multer/interceptors/index.d.ts +4 -0
  77. package/dist/cjs/src/multer/interceptors/index.js +21 -0
  78. package/dist/cjs/src/multer/interceptors/index.js.map +1 -0
  79. package/dist/cjs/src/multer/multipart/exceptions.d.ts +1 -0
  80. package/dist/cjs/src/multer/multipart/exceptions.js +22 -0
  81. package/dist/cjs/src/multer/multipart/exceptions.js.map +1 -0
  82. package/dist/cjs/src/multer/multipart/file.d.ts +9 -0
  83. package/dist/cjs/src/multer/multipart/file.js +10 -0
  84. package/dist/cjs/src/multer/multipart/file.js.map +1 -0
  85. package/dist/cjs/src/multer/multipart/filter.d.ts +6 -0
  86. package/dist/cjs/src/multer/multipart/filter.js +22 -0
  87. package/dist/cjs/src/multer/multipart/filter.js.map +1 -0
  88. package/dist/cjs/src/multer/multipart/handlers/any-files.d.ts +8 -0
  89. package/dist/cjs/src/multer/multipart/handlers/any-files.js +33 -0
  90. package/dist/cjs/src/multer/multipart/handlers/any-files.js.map +1 -0
  91. package/dist/cjs/src/multer/multipart/handlers/file-fields.d.ts +14 -0
  92. package/dist/cjs/src/multer/multipart/handlers/file-fields.js +57 -0
  93. package/dist/cjs/src/multer/multipart/handlers/file-fields.js.map +1 -0
  94. package/dist/cjs/src/multer/multipart/handlers/index.d.ts +1 -0
  95. package/dist/cjs/src/multer/multipart/handlers/index.js +3 -0
  96. package/dist/cjs/src/multer/multipart/handlers/index.js.map +1 -0
  97. package/dist/cjs/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
  98. package/dist/cjs/src/multer/multipart/handlers/multiple-files.js +40 -0
  99. package/dist/cjs/src/multer/multipart/handlers/multiple-files.js.map +1 -0
  100. package/dist/cjs/src/multer/multipart/handlers/single-file.d.ts +8 -0
  101. package/dist/cjs/src/multer/multipart/handlers/single-file.js +45 -0
  102. package/dist/cjs/src/multer/multipart/handlers/single-file.js.map +1 -0
  103. package/dist/cjs/src/multer/multipart/index.d.ts +3 -0
  104. package/dist/cjs/src/multer/multipart/index.js +19 -0
  105. package/dist/cjs/src/multer/multipart/index.js.map +1 -0
  106. package/dist/cjs/src/multer/multipart/options.d.ts +21 -0
  107. package/dist/cjs/src/multer/multipart/options.js +23 -0
  108. package/dist/cjs/src/multer/multipart/options.js.map +1 -0
  109. package/dist/cjs/src/multer/multipart/request.d.ts +14 -0
  110. package/dist/cjs/src/multer/multipart/request.js +22 -0
  111. package/dist/cjs/src/multer/multipart/request.js.map +1 -0
  112. package/dist/cjs/src/multer/storage/disk-storage.d.ts +31 -0
  113. package/dist/cjs/src/multer/storage/disk-storage.js +62 -0
  114. package/dist/cjs/src/multer/storage/disk-storage.js.map +1 -0
  115. package/dist/cjs/src/multer/storage/index.d.ts +3 -0
  116. package/dist/cjs/src/multer/storage/index.js +20 -0
  117. package/dist/cjs/src/multer/storage/index.js.map +1 -0
  118. package/dist/cjs/src/multer/storage/memory-storage.d.ts +16 -0
  119. package/dist/cjs/src/multer/storage/memory-storage.js +21 -0
  120. package/dist/cjs/src/multer/storage/memory-storage.js.map +1 -0
  121. package/dist/cjs/src/multer/storage/storage.d.ts +13 -0
  122. package/dist/cjs/src/multer/storage/storage.js +3 -0
  123. package/dist/cjs/src/multer/storage/storage.js.map +1 -0
  124. package/dist/cjs/src/multer/stream/index.d.ts +2 -0
  125. package/dist/cjs/src/multer/stream/index.js +7 -0
  126. package/dist/cjs/src/multer/stream/index.js.map +1 -0
  127. package/dist/esm/src/adapters/hono-adapter.d.ts +57 -0
  128. package/dist/esm/src/adapters/hono-adapter.js +223 -0
  129. package/dist/esm/src/adapters/hono-adapter.js.map +1 -0
  130. package/dist/esm/src/adapters/index.d.ts +1 -0
  131. package/dist/esm/src/adapters/index.js +2 -0
  132. package/dist/esm/src/adapters/index.js.map +1 -0
  133. package/dist/esm/src/drivers/constants/apollo.constants.d.ts +1 -0
  134. package/dist/esm/src/drivers/constants/apollo.constants.js +2 -0
  135. package/dist/esm/src/drivers/constants/apollo.constants.js.map +1 -0
  136. package/dist/esm/src/drivers/constants/index.d.ts +1 -0
  137. package/dist/esm/src/drivers/constants/index.js +2 -0
  138. package/dist/esm/src/drivers/constants/index.js.map +1 -0
  139. package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.d.ts +3 -0
  140. package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.js +18 -0
  141. package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.js.map +1 -0
  142. package/dist/esm/src/drivers/graphQLUpload/Upload.d.ts +16 -0
  143. package/dist/esm/src/drivers/graphQLUpload/Upload.js +13 -0
  144. package/dist/esm/src/drivers/graphQLUpload/Upload.js.map +1 -0
  145. package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.d.ts +42 -0
  146. package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.js +183 -0
  147. package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.js.map +1 -0
  148. package/dist/esm/src/drivers/graphQLUpload/index.d.ts +4 -0
  149. package/dist/esm/src/drivers/graphQLUpload/index.js +5 -0
  150. package/dist/esm/src/drivers/graphQLUpload/index.js.map +1 -0
  151. package/dist/esm/src/drivers/graphQLUpload/processRequest.d.ts +2 -0
  152. package/dist/esm/src/drivers/graphQLUpload/processRequest.js +47 -0
  153. package/dist/esm/src/drivers/graphQLUpload/processRequest.js.map +1 -0
  154. package/dist/esm/src/drivers/graphql.driver.d.ts +20 -0
  155. package/dist/esm/src/drivers/graphql.driver.js +122 -0
  156. package/dist/esm/src/drivers/graphql.driver.js.map +1 -0
  157. package/dist/esm/src/drivers/index.d.ts +2 -0
  158. package/dist/esm/src/drivers/index.js +3 -0
  159. package/dist/esm/src/drivers/index.js.map +1 -0
  160. package/dist/esm/src/drivers/services/plugins-explorer.service.d.ts +9 -0
  161. package/dist/esm/src/drivers/services/plugins-explorer.service.js +21 -0
  162. package/dist/esm/src/drivers/services/plugins-explorer.service.js.map +1 -0
  163. package/dist/esm/src/interfaces/hono.interface.d.ts +4 -0
  164. package/dist/esm/src/interfaces/hono.interface.js +2 -0
  165. package/dist/esm/src/interfaces/hono.interface.js.map +1 -0
  166. package/dist/esm/src/interfaces/index.d.ts +2 -0
  167. package/dist/esm/src/interfaces/index.js +3 -0
  168. package/dist/esm/src/interfaces/index.js.map +1 -0
  169. package/dist/esm/src/interfaces/nest-hono-application.interface.d.ts +18 -0
  170. package/dist/esm/src/interfaces/nest-hono-application.interface.js +2 -0
  171. package/dist/esm/src/interfaces/nest-hono-application.interface.js.map +1 -0
  172. package/dist/esm/src/multer/crypto/index.d.ts +1 -0
  173. package/dist/esm/src/multer/crypto/index.js +4 -0
  174. package/dist/esm/src/multer/crypto/index.js.map +1 -0
  175. package/dist/esm/src/multer/decorators/index.d.ts +2 -0
  176. package/dist/esm/src/multer/decorators/index.js +3 -0
  177. package/dist/esm/src/multer/decorators/index.js.map +1 -0
  178. package/dist/esm/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
  179. package/dist/esm/src/multer/decorators/uploaded-file-decorator.js +7 -0
  180. package/dist/esm/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
  181. package/dist/esm/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
  182. package/dist/esm/src/multer/decorators/uploaded-files-decorator.js +7 -0
  183. package/dist/esm/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
  184. package/dist/esm/src/multer/fs/index.d.ts +2 -0
  185. package/dist/esm/src/multer/fs/index.js +18 -0
  186. package/dist/esm/src/multer/fs/index.js.map +1 -0
  187. package/dist/esm/src/multer/index.d.ts +4 -0
  188. package/dist/esm/src/multer/index.js +5 -0
  189. package/dist/esm/src/multer/index.js.map +1 -0
  190. package/dist/esm/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
  191. package/dist/esm/src/multer/interceptors/any-files-interceptor.js +26 -0
  192. package/dist/esm/src/multer/interceptors/any-files-interceptor.js.map +1 -0
  193. package/dist/esm/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
  194. package/dist/esm/src/multer/interceptors/file-fields-interceptor.js +27 -0
  195. package/dist/esm/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
  196. package/dist/esm/src/multer/interceptors/file-interceptor.d.ts +3 -0
  197. package/dist/esm/src/multer/interceptors/file-interceptor.js +26 -0
  198. package/dist/esm/src/multer/interceptors/file-interceptor.js.map +1 -0
  199. package/dist/esm/src/multer/interceptors/files-interceptor.d.ts +3 -0
  200. package/dist/esm/src/multer/interceptors/files-interceptor.js +26 -0
  201. package/dist/esm/src/multer/interceptors/files-interceptor.js.map +1 -0
  202. package/dist/esm/src/multer/interceptors/index.d.ts +4 -0
  203. package/dist/esm/src/multer/interceptors/index.js +5 -0
  204. package/dist/esm/src/multer/interceptors/index.js.map +1 -0
  205. package/dist/esm/src/multer/multipart/exceptions.d.ts +1 -0
  206. package/dist/esm/src/multer/multipart/exceptions.js +18 -0
  207. package/dist/esm/src/multer/multipart/exceptions.js.map +1 -0
  208. package/dist/esm/src/multer/multipart/file.d.ts +9 -0
  209. package/dist/esm/src/multer/multipart/file.js +6 -0
  210. package/dist/esm/src/multer/multipart/file.js.map +1 -0
  211. package/dist/esm/src/multer/multipart/filter.d.ts +6 -0
  212. package/dist/esm/src/multer/multipart/filter.js +18 -0
  213. package/dist/esm/src/multer/multipart/filter.js.map +1 -0
  214. package/dist/esm/src/multer/multipart/handlers/any-files.d.ts +8 -0
  215. package/dist/esm/src/multer/multipart/handlers/any-files.js +29 -0
  216. package/dist/esm/src/multer/multipart/handlers/any-files.js.map +1 -0
  217. package/dist/esm/src/multer/multipart/handlers/file-fields.d.ts +14 -0
  218. package/dist/esm/src/multer/multipart/handlers/file-fields.js +52 -0
  219. package/dist/esm/src/multer/multipart/handlers/file-fields.js.map +1 -0
  220. package/dist/esm/src/multer/multipart/handlers/index.d.ts +1 -0
  221. package/dist/esm/src/multer/multipart/handlers/index.js +2 -0
  222. package/dist/esm/src/multer/multipart/handlers/index.js.map +1 -0
  223. package/dist/esm/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
  224. package/dist/esm/src/multer/multipart/handlers/multiple-files.js +36 -0
  225. package/dist/esm/src/multer/multipart/handlers/multiple-files.js.map +1 -0
  226. package/dist/esm/src/multer/multipart/handlers/single-file.d.ts +8 -0
  227. package/dist/esm/src/multer/multipart/handlers/single-file.js +41 -0
  228. package/dist/esm/src/multer/multipart/handlers/single-file.js.map +1 -0
  229. package/dist/esm/src/multer/multipart/index.d.ts +3 -0
  230. package/dist/esm/src/multer/multipart/index.js +3 -0
  231. package/dist/esm/src/multer/multipart/index.js.map +1 -0
  232. package/dist/esm/src/multer/multipart/options.d.ts +21 -0
  233. package/dist/esm/src/multer/multipart/options.js +19 -0
  234. package/dist/esm/src/multer/multipart/options.js.map +1 -0
  235. package/dist/esm/src/multer/multipart/request.d.ts +14 -0
  236. package/dist/esm/src/multer/multipart/request.js +17 -0
  237. package/dist/esm/src/multer/multipart/request.js.map +1 -0
  238. package/dist/esm/src/multer/storage/disk-storage.d.ts +31 -0
  239. package/dist/esm/src/multer/storage/disk-storage.js +58 -0
  240. package/dist/esm/src/multer/storage/disk-storage.js.map +1 -0
  241. package/dist/esm/src/multer/storage/index.d.ts +3 -0
  242. package/dist/esm/src/multer/storage/index.js +4 -0
  243. package/dist/esm/src/multer/storage/index.js.map +1 -0
  244. package/dist/esm/src/multer/storage/memory-storage.d.ts +16 -0
  245. package/dist/esm/src/multer/storage/memory-storage.js +17 -0
  246. package/dist/esm/src/multer/storage/memory-storage.js.map +1 -0
  247. package/dist/esm/src/multer/storage/storage.d.ts +13 -0
  248. package/dist/esm/src/multer/storage/storage.js +2 -0
  249. package/dist/esm/src/multer/storage/storage.js.map +1 -0
  250. package/dist/esm/src/multer/stream/index.d.ts +2 -0
  251. package/dist/esm/src/multer/stream/index.js +4 -0
  252. package/dist/esm/src/multer/stream/index.js.map +1 -0
  253. package/package.json +1 -1
  254. package/src/adapters/hono-adapter.ts +333 -0
  255. package/src/adapters/index.ts +1 -0
  256. package/src/drivers/constants/apollo.constants.ts +1 -0
  257. package/src/drivers/constants/index.ts +1 -0
  258. package/src/drivers/graphQLUpload/GraphQLUpload.ts +17 -0
  259. package/src/drivers/graphQLUpload/Upload.ts +35 -0
  260. package/src/drivers/graphQLUpload/fs-capacitor.ts +285 -0
  261. package/src/drivers/graphQLUpload/index.ts +4 -0
  262. package/src/drivers/graphQLUpload/processRequest.ts +57 -0
  263. package/src/drivers/graphql.driver.ts +171 -0
  264. package/src/drivers/index.ts +2 -0
  265. package/src/drivers/services/plugins-explorer.service.ts +27 -0
  266. package/src/interfaces/hono.interface.ts +5 -0
  267. package/src/interfaces/index.ts +2 -0
  268. package/src/interfaces/nest-hono-application.interface.ts +72 -0
  269. package/src/multer/crypto/index.ts +4 -0
  270. package/src/multer/decorators/index.ts +2 -0
  271. package/src/multer/decorators/uploaded-file-decorator.ts +12 -0
  272. package/src/multer/decorators/uploaded-files-decorator.ts +15 -0
  273. package/src/multer/fs/index.ts +22 -0
  274. package/src/multer/index.ts +4 -0
  275. package/src/multer/interceptors/any-files-interceptor.ts +50 -0
  276. package/src/multer/interceptors/file-fields-interceptor.ts +60 -0
  277. package/src/multer/interceptors/file-interceptor.ts +52 -0
  278. package/src/multer/interceptors/files-interceptor.ts +54 -0
  279. package/src/multer/interceptors/index.ts +4 -0
  280. package/src/multer/multipart/exceptions.ts +25 -0
  281. package/src/multer/multipart/file.ts +18 -0
  282. package/src/multer/multipart/filter.ts +38 -0
  283. package/src/multer/multipart/handlers/any-files.ts +39 -0
  284. package/src/multer/multipart/handlers/file-fields.ts +89 -0
  285. package/src/multer/multipart/handlers/index.ts +1 -0
  286. package/src/multer/multipart/handlers/multiple-files.ts +55 -0
  287. package/src/multer/multipart/handlers/single-file.ts +56 -0
  288. package/src/multer/multipart/index.ts +3 -0
  289. package/src/multer/multipart/options.ts +29 -0
  290. package/src/multer/multipart/request.ts +40 -0
  291. package/src/multer/storage/disk-storage.ts +107 -0
  292. package/src/multer/storage/index.ts +3 -0
  293. package/src/multer/storage/memory-storage.ts +25 -0
  294. package/src/multer/storage/storage.ts +15 -0
  295. package/src/multer/stream/index.ts +4 -0
@@ -0,0 +1,57 @@
1
+ import { Context } from "hono";
2
+ import { WriteStream, Upload } from ".";
3
+ import { Readable } from "stream";
4
+
5
+ export async function processRequest(
6
+ ctx: Context
7
+ ): Promise<Record<string, any>> {
8
+ const body = await ctx.req.parseBody();
9
+ const operations = JSON.parse(body.operations as string);
10
+ const map = new Map(Object.entries(JSON.parse(body.map as string)));
11
+
12
+ for (const [fieldName, file] of Object.entries(body)) {
13
+ if (
14
+ fieldName === "operations" ||
15
+ fieldName === "map" ||
16
+ !(file instanceof File)
17
+ )
18
+ continue;
19
+
20
+ const fileKeys = map.get(fieldName);
21
+ if (!Array.isArray(fileKeys) || !fileKeys.length) continue;
22
+
23
+ const buffer = Buffer.from(await file.arrayBuffer());
24
+ const capacitor = new WriteStream();
25
+ Readable.from(buffer).pipe(capacitor);
26
+
27
+ const upload = new Upload();
28
+
29
+ upload.file = {
30
+ filename: file.name,
31
+ mimetype: file.type,
32
+ fieldName,
33
+ encoding: "7bit",
34
+ createReadStream: (options) => {
35
+ const stream = capacitor.createReadStream(options);
36
+ stream.on("close", () => {
37
+ capacitor.release();
38
+ });
39
+ return stream;
40
+ },
41
+ capacitor,
42
+ };
43
+ upload.resolve(upload.file);
44
+
45
+ for (const fileKey of fileKeys) {
46
+ const pathSegments = fileKey.split(".");
47
+ let current = operations;
48
+ for (let i = 0; i < pathSegments.length - 1; i++) {
49
+ if (!current[pathSegments[i]]) current[pathSegments[i]] = {};
50
+ current = current[pathSegments[i]];
51
+ }
52
+ current[pathSegments[pathSegments.length - 1]] = upload;
53
+ }
54
+ }
55
+
56
+ return operations;
57
+ }
@@ -0,0 +1,171 @@
1
+ import { ApolloServer, BaseContext, HeaderMap } from "@apollo/server";
2
+ import { ModulesContainer } from "@nestjs/core";
3
+ import {
4
+ AbstractGraphQLDriver,
5
+ GqlSubscriptionService,
6
+ SubscriptionConfig,
7
+ } from "@nestjs/graphql";
8
+ import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
9
+ import { ApolloDriverConfig } from "@nestjs/apollo";
10
+ import { Context, HonoRequest } from "hono";
11
+ import { StatusCode } from "hono/utils/http-status";
12
+ import { Logger } from "@nestjs/common";
13
+
14
+ import { PluginsExplorerService } from "./services/plugins-explorer.service";
15
+ import { processRequest } from "./graphQLUpload";
16
+
17
+ export class HonoGraphQLDriver<
18
+ T extends Record<string, any> = ApolloDriverConfig
19
+ > extends AbstractGraphQLDriver {
20
+ protected apolloServer: ApolloServer<BaseContext>;
21
+ private _subscriptionService?: GqlSubscriptionService;
22
+ private readonly pluginsExplorerService: PluginsExplorerService;
23
+
24
+ constructor(modulesContainer: ModulesContainer) {
25
+ super();
26
+ this.pluginsExplorerService = new PluginsExplorerService(modulesContainer);
27
+ }
28
+
29
+ get instance(): ApolloServer<BaseContext> {
30
+ return this.apolloServer;
31
+ }
32
+
33
+ async start(options: T): Promise<void> {
34
+ const { httpAdapter } = this.httpAdapterHost;
35
+ const platformName = httpAdapter.getType();
36
+
37
+ if (platformName !== "hono") {
38
+ throw new Error("This driver is only compatible with the Hono platform");
39
+ }
40
+
41
+ await this.registerHono(options);
42
+
43
+ if (options.installSubscriptionHandlers || options.subscriptions) {
44
+ const subscriptionsOptions: SubscriptionConfig =
45
+ options.subscriptions || { "subscriptions-transport-ws": {} };
46
+ this._subscriptionService = new GqlSubscriptionService(
47
+ {
48
+ schema: options.schema,
49
+ path: options.path,
50
+ context: options.context,
51
+ ...subscriptionsOptions,
52
+ },
53
+ this.httpAdapterHost.httpAdapter?.getHttpServer()
54
+ );
55
+ }
56
+ }
57
+
58
+ protected async registerHono(
59
+ options: T,
60
+ { preStartHook }: { preStartHook?: () => void } = {}
61
+ ) {
62
+ const { path, typeDefs, resolvers, schema } = options;
63
+ const { httpAdapter } = this.httpAdapterHost;
64
+ const app = httpAdapter.getInstance();
65
+ const drainHttpServerPlugin = ApolloServerPluginDrainHttpServer({
66
+ httpServer: httpAdapter.getHttpServer(),
67
+ });
68
+
69
+ preStartHook?.();
70
+
71
+ const server = new ApolloServer({
72
+ typeDefs,
73
+ resolvers,
74
+ schema,
75
+ ...options,
76
+ plugins: (options.plugins || []).concat(drainHttpServerPlugin),
77
+ });
78
+
79
+ await server.start();
80
+
81
+ app.use(path, async (ctx: Context) => {
82
+ const bodyData = await this.parseBody(ctx);
83
+
84
+ const defaultContext = () => Promise.resolve({} as BaseContext);
85
+
86
+ const contextFunction = options?.context ?? defaultContext;
87
+
88
+ const httpGraphQLResponse = await server.executeHTTPGraphQLRequest({
89
+ httpGraphQLRequest: {
90
+ body: bodyData,
91
+ method: ctx.req.method,
92
+ headers: this.httpHeadersToMap(ctx.req.raw.headers),
93
+ search: new URL(ctx.req.url).search,
94
+ },
95
+ context: () =>
96
+ contextFunction(ctx, {
97
+ method: ctx.req.method,
98
+ url: ctx.req.url,
99
+ body: ctx.req.raw.body,
100
+ headers: Object.fromEntries(ctx.req.raw.headers),
101
+ }),
102
+ });
103
+
104
+ const { headers, body, status } = httpGraphQLResponse;
105
+
106
+ for (const [headerKey, headerValue] of headers) {
107
+ ctx.header(headerKey, headerValue);
108
+ }
109
+
110
+ ctx.status(status === undefined ? 200 : (status as StatusCode));
111
+
112
+ if (body.kind === "complete") {
113
+ return ctx.body(body.string);
114
+ }
115
+
116
+ const readableStream = new ReadableStream({
117
+ async start(controller) {
118
+ for await (const chunk of body.asyncIterator) {
119
+ controller.enqueue(new TextEncoder().encode(chunk));
120
+ }
121
+ controller.close();
122
+ },
123
+ });
124
+
125
+ return new Response(readableStream, {
126
+ headers: { "Content-Type": "application/octet-stream" },
127
+ });
128
+ });
129
+
130
+ this.apolloServer = server;
131
+ }
132
+
133
+ public async stop() {
134
+ await this._subscriptionService?.stop();
135
+ await this.apolloServer?.stop();
136
+ }
137
+
138
+ private httpHeadersToMap(headers: Headers) {
139
+ const map = new HeaderMap();
140
+ headers.forEach((value, key) => map.set(key, value));
141
+ return map;
142
+ }
143
+
144
+ private async parseBody(ctx: Context): Promise<Record<string, unknown>> {
145
+ const req = ctx.req;
146
+ const contentType = req.header("content-type");
147
+
148
+ if (contentType === "application/graphql")
149
+ return { query: await req.text() };
150
+ if (contentType === "application/json")
151
+ return req.json().catch(this.logError);
152
+ if (contentType === "application/x-www-form-urlencoded")
153
+ return this.parseFormURL(req);
154
+ if (contentType?.startsWith("multipart/form-data")) {
155
+ return processRequest(ctx);
156
+ }
157
+ return {};
158
+ }
159
+
160
+ private logError(e: unknown): void {
161
+ if (e instanceof Error) {
162
+ Logger.error(e.stack || e.message);
163
+ }
164
+ throw new Error(`POST body sent invalid JSON: ${e}`);
165
+ }
166
+
167
+ private async parseFormURL(req: HonoRequest) {
168
+ const searchParams = new URLSearchParams(await req.text());
169
+ return Object.fromEntries(searchParams.entries());
170
+ }
171
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./graphql.driver";
2
+ export * from "./graphQLUpload";
@@ -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,5 @@
1
+ import { HonoRequest as Request } from "hono";
2
+
3
+ export type HonoRequest = Request & {
4
+ headers?: Record<string, string>;
5
+ };
@@ -0,0 +1,2 @@
1
+ export * from "./nest-hono-application.interface";
2
+ export * from "./hono.interface";
@@ -0,0 +1,72 @@
1
+ import { ServeStaticOptions } from "@hono/node-server/serve-static";
2
+ import { HttpServer, INestApplication } from "@nestjs/common";
3
+ import { Context, Hono, MiddlewareHandler } from "hono";
4
+
5
+ export type TypeBodyParser =
6
+ | "application/json"
7
+ | "text/plain"
8
+ | "application/x-www-form-urlencoded";
9
+
10
+ interface HonoViewOptions {
11
+ engine: string;
12
+ templates: string;
13
+ }
14
+
15
+ /**
16
+ * @publicApi
17
+ */
18
+ export interface NestHonoApplication<TServer extends Hono = Hono>
19
+ extends INestApplication<TServer> {
20
+ /**
21
+ * Returns the underlying HTTP adapter bounded to a Hono app.
22
+ *
23
+ * @returns {HttpServer}
24
+ */
25
+ getHttpAdapter(): HttpServer<Context, MiddlewareHandler, Hono>;
26
+
27
+ /**
28
+ * Register Hono body parsers on the fly.
29
+ *
30
+ * @example
31
+ * // enable the json parser with a parser limit of 50mb
32
+ * app.useBodyParser('application/json', 50 * 1024 * 1024);
33
+ *
34
+ * @returns {this}
35
+ */
36
+ useBodyParser(type: TypeBodyParser, bodyLimit?: number): this;
37
+
38
+ /**
39
+ * Sets a base directory for public assets.
40
+ * Example `app.useStaticAssets('public', { root: '/' })`
41
+ * @returns {this}
42
+ */
43
+ useStaticAssets(path: string, options: ServeStaticOptions): this;
44
+
45
+ /**
46
+ * Sets a view engine for templates (views), for example: `pug`, `handlebars`, or `ejs`.
47
+ *
48
+ * Don't pass in a string. The string type in the argument is for compatibility reason and will cause an exception.
49
+ * @returns {this}
50
+ */
51
+ setViewEngine(options: HonoViewOptions | string): this;
52
+
53
+ /**
54
+ * Starts the application.
55
+ * @returns A Promise that, when resolved, is a reference to the underlying HttpServer.
56
+ */
57
+ listen(
58
+ port: number | string,
59
+ callback?: (err: Error, address: string) => void
60
+ ): Promise<TServer>;
61
+ listen(
62
+ port: number | string,
63
+ address: string,
64
+ callback?: (err: Error, address: string) => void
65
+ ): Promise<TServer>;
66
+ listen(
67
+ port: number | string,
68
+ address: string,
69
+ backlog: number,
70
+ callback?: (err: Error, address: string) => void
71
+ ): Promise<TServer>;
72
+ }
@@ -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,50 @@
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
+ if (!req.header("content-type")?.startsWith("multipart/form-data")) {
32
+ return next.handle();
33
+ }
34
+
35
+ const { body, files, remove } = await handleMultipartAnyFiles(
36
+ req,
37
+ this.options
38
+ );
39
+
40
+ req.body = body;
41
+ req.storageFiles = files;
42
+
43
+ return next.handle().pipe(tap(remove));
44
+ }
45
+ }
46
+
47
+ const Interceptor = mixin(MixinInterceptor);
48
+
49
+ return Interceptor;
50
+ }
@@ -0,0 +1,60 @@
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
+ if (!req.header("content-type")?.startsWith("multipart/form-data")) {
41
+ return next.handle();
42
+ }
43
+
44
+ const { body, files, remove } = await handleMultipartFileFields(
45
+ req,
46
+ this.fieldsMap,
47
+ this.options
48
+ );
49
+
50
+ req.body = body;
51
+ req.storageFiles = files;
52
+
53
+ return next.handle().pipe(tap(remove));
54
+ }
55
+ }
56
+
57
+ const Interceptor = mixin(MixinInterceptor);
58
+
59
+ return Interceptor;
60
+ }
@@ -0,0 +1,52 @@
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
+ if (!req.header("content-type")?.startsWith("multipart/form-data")) {
33
+ return next.handle();
34
+ }
35
+
36
+ const { file, body, remove } = await handleMultipartSingleFile(
37
+ req,
38
+ fieldname,
39
+ this.options
40
+ );
41
+
42
+ req.body = body;
43
+ req.storageFile = file;
44
+
45
+ return next.handle().pipe(tap(remove));
46
+ }
47
+ }
48
+
49
+ const Interceptor = mixin(MixinInterceptor);
50
+
51
+ return Interceptor;
52
+ }
@@ -0,0 +1,54 @@
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 { handleMultipartMultipleFiles } from "../multipart/handlers/multiple-files";
13
+
14
+ export function FilesInterceptor(
15
+ fieldname: string,
16
+ maxCount = 1,
17
+ options?: UploadOptions
18
+ ): Type<NestInterceptor> {
19
+ class MixinInterceptor implements NestInterceptor {
20
+ private readonly options: UploadOptions;
21
+
22
+ constructor() {
23
+ this.options = transformUploadOptions(options);
24
+ }
25
+
26
+ async intercept(
27
+ context: ExecutionContext,
28
+ next: CallHandler
29
+ ): Promise<Observable<any>> {
30
+ const ctx = context.switchToHttp();
31
+ const req = getMultipartRequest(ctx);
32
+
33
+ if (!req.header("content-type")?.startsWith("multipart/form-data")) {
34
+ return next.handle();
35
+ }
36
+
37
+ const { body, files, remove } = await handleMultipartMultipleFiles(
38
+ req,
39
+ fieldname,
40
+ maxCount,
41
+ this.options
42
+ );
43
+
44
+ req.body = body;
45
+ req.storageFiles = files;
46
+
47
+ return next.handle().pipe(tap(remove));
48
+ }
49
+ }
50
+
51
+ const Interceptor = mixin(MixinInterceptor);
52
+
53
+ return Interceptor;
54
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./file-fields-interceptor";
2
+ export * from "./file-interceptor";
3
+ export * from "./any-files-interceptor";
4
+ export * from "./files-interceptor";
@@ -0,0 +1,25 @@
1
+ import {
2
+ BadRequestException,
3
+ HttpException,
4
+ PayloadTooLargeException,
5
+ } from '@nestjs/common';
6
+
7
+ export const transformException = (err: Error | undefined) => {
8
+ if (!err || err instanceof HttpException) {
9
+ return err;
10
+ }
11
+
12
+ const code: string = (err as any).code;
13
+
14
+ switch (code) {
15
+ case 'REQ_FILE_TOO_LARGE':
16
+ return new PayloadTooLargeException();
17
+ case 'PARTS_LIMIT':
18
+ case 'FILES_LIMIT':
19
+ case 'PROTO_VIOLATION':
20
+ case 'INVALID_MULTIPART_CONTENT_TYPE':
21
+ return new BadRequestException(err.message);
22
+ }
23
+
24
+ return err;
25
+ };
@@ -0,0 +1,18 @@
1
+ import { Readable } from 'stream';
2
+ import { Storage, StorageFile } from '../storage';
3
+
4
+ export type MultipartFile = Omit<File[], 'file'> & {
5
+ value?: any;
6
+ file: Readable & { truncated?: boolean };
7
+ };
8
+
9
+ export const removeStorageFiles = async (
10
+ storage: Storage,
11
+ files?: (StorageFile | undefined)[],
12
+ force?: boolean,
13
+ ) => {
14
+ if (files == null) return;
15
+ await Promise.all(
16
+ files.map((file) => file && storage.removeFile(file, force)),
17
+ );
18
+ };