imapkit 4.0.3 → 4.1.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 (485) hide show
  1. package/README.md +32 -19
  2. package/bin/imapkit.js +12 -16
  3. package/dist/cjs/addressparser.d.ts +21 -0
  4. package/dist/cjs/addressparser.js +277 -0
  5. package/dist/cjs/arguments.d.ts +31 -0
  6. package/{lib → dist/cjs}/arguments.js +9 -21
  7. package/dist/cjs/bodystructure.d.ts +25 -0
  8. package/dist/cjs/bodystructure.js +150 -0
  9. package/dist/cjs/cert.d.ts +2 -0
  10. package/dist/cjs/cert.js +7 -0
  11. package/dist/cjs/command-states.d.ts +36 -0
  12. package/dist/cjs/command-states.js +102 -0
  13. package/dist/cjs/commands/append.d.ts +88 -0
  14. package/dist/cjs/commands/append.js +299 -0
  15. package/dist/cjs/commands/capability.d.ts +2 -0
  16. package/dist/cjs/commands/capability.js +44 -0
  17. package/dist/cjs/commands/check.d.ts +2 -0
  18. package/dist/cjs/commands/check.js +28 -0
  19. package/dist/cjs/commands/close.d.ts +2 -0
  20. package/dist/cjs/commands/close.js +35 -0
  21. package/dist/cjs/commands/copy.d.ts +30 -0
  22. package/dist/cjs/commands/copy.js +107 -0
  23. package/dist/cjs/commands/create.d.ts +2 -0
  24. package/dist/cjs/commands/create.js +53 -0
  25. package/dist/cjs/commands/delete.d.ts +2 -0
  26. package/dist/cjs/commands/delete.js +63 -0
  27. package/dist/cjs/commands/examine.d.ts +2 -0
  28. package/dist/cjs/commands/examine.js +19 -0
  29. package/dist/cjs/commands/expunge.d.ts +2 -0
  30. package/dist/cjs/commands/expunge.js +32 -0
  31. package/dist/cjs/commands/fetch.d.ts +23 -0
  32. package/dist/cjs/commands/fetch.js +208 -0
  33. package/dist/cjs/commands/handlers/fetch.d.ts +12 -0
  34. package/dist/cjs/commands/handlers/fetch.js +195 -0
  35. package/dist/cjs/commands/handlers/flags.d.ts +17 -0
  36. package/dist/cjs/commands/handlers/flags.js +39 -0
  37. package/dist/cjs/commands/handlers/search.d.ts +85 -0
  38. package/dist/cjs/commands/handlers/search.js +504 -0
  39. package/dist/cjs/commands/handlers/status.d.ts +34 -0
  40. package/dist/cjs/commands/handlers/status.js +81 -0
  41. package/dist/cjs/commands/handlers/store.d.ts +3 -0
  42. package/dist/cjs/commands/handlers/store.js +117 -0
  43. package/dist/cjs/commands/index.d.ts +2 -0
  44. package/dist/cjs/commands/index.js +61 -0
  45. package/dist/cjs/commands/list.d.ts +2 -0
  46. package/dist/cjs/commands/list.js +86 -0
  47. package/dist/cjs/commands/login.d.ts +2 -0
  48. package/dist/cjs/commands/login.js +62 -0
  49. package/dist/cjs/commands/logout.d.ts +2 -0
  50. package/dist/cjs/commands/logout.js +40 -0
  51. package/dist/cjs/commands/lsub.d.ts +2 -0
  52. package/dist/cjs/commands/lsub.js +79 -0
  53. package/dist/cjs/commands/noop.d.ts +2 -0
  54. package/dist/cjs/commands/noop.js +28 -0
  55. package/dist/cjs/commands/rename.d.ts +2 -0
  56. package/dist/cjs/commands/rename.js +98 -0
  57. package/dist/cjs/commands/search.d.ts +10 -0
  58. package/dist/cjs/commands/search.js +71 -0
  59. package/dist/cjs/commands/select.d.ts +19 -0
  60. package/dist/cjs/commands/select.js +230 -0
  61. package/dist/cjs/commands/status.d.ts +2 -0
  62. package/dist/cjs/commands/status.js +57 -0
  63. package/dist/cjs/commands/store.d.ts +10 -0
  64. package/dist/cjs/commands/store.js +134 -0
  65. package/dist/cjs/commands/subscribe.d.ts +2 -0
  66. package/dist/cjs/commands/subscribe.js +51 -0
  67. package/dist/cjs/commands/uid-copy.d.ts +2 -0
  68. package/dist/cjs/commands/uid-copy.js +19 -0
  69. package/dist/cjs/commands/uid-fetch.d.ts +3 -0
  70. package/dist/cjs/commands/uid-fetch.js +17 -0
  71. package/dist/cjs/commands/uid-search.d.ts +3 -0
  72. package/dist/cjs/commands/uid-search.js +17 -0
  73. package/dist/cjs/commands/uid-store.d.ts +3 -0
  74. package/dist/cjs/commands/uid-store.js +17 -0
  75. package/dist/cjs/commands/unsubscribe.d.ts +2 -0
  76. package/dist/cjs/commands/unsubscribe.js +50 -0
  77. package/dist/cjs/dates.d.ts +64 -0
  78. package/dist/cjs/dates.js +124 -0
  79. package/dist/cjs/deflate-layer.d.ts +83 -0
  80. package/dist/cjs/deflate-layer.js +232 -0
  81. package/dist/cjs/encoded-words.d.ts +15 -0
  82. package/dist/cjs/encoded-words.js +85 -0
  83. package/dist/cjs/envelope.d.ts +33 -0
  84. package/dist/cjs/envelope.js +86 -0
  85. package/dist/cjs/esearch.d.ts +96 -0
  86. package/dist/cjs/esearch.js +190 -0
  87. package/dist/cjs/framing.d.ts +66 -0
  88. package/{lib → dist/cjs}/framing.js +9 -26
  89. package/dist/cjs/index.d.ts +9 -0
  90. package/dist/cjs/index.js +56 -0
  91. package/dist/cjs/list-extensions.d.ts +50 -0
  92. package/dist/cjs/list-extensions.js +35 -0
  93. package/dist/cjs/load-plugins.d.ts +21 -0
  94. package/dist/cjs/load-plugins.js +89 -0
  95. package/dist/cjs/mailbox-name.d.ts +26 -0
  96. package/dist/cjs/mailbox-name.js +127 -0
  97. package/dist/cjs/mimeparser.d.ts +137 -0
  98. package/dist/cjs/mimeparser.js +727 -0
  99. package/dist/cjs/mock-client.d.ts +39 -0
  100. package/dist/cjs/mock-client.js +236 -0
  101. package/dist/cjs/numbers.d.ts +28 -0
  102. package/dist/cjs/numbers.js +52 -0
  103. package/dist/cjs/package.json +3 -0
  104. package/dist/cjs/plugins/acl.d.ts +2 -0
  105. package/dist/cjs/plugins/acl.js +888 -0
  106. package/dist/cjs/plugins/appendlimit.d.ts +16 -0
  107. package/dist/cjs/plugins/appendlimit.js +87 -0
  108. package/dist/cjs/plugins/auth-plain.d.ts +2 -0
  109. package/dist/cjs/plugins/auth-plain.js +89 -0
  110. package/dist/cjs/plugins/binary.d.ts +30 -0
  111. package/dist/cjs/plugins/binary.js +247 -0
  112. package/dist/cjs/plugins/catenate.d.ts +14 -0
  113. package/dist/cjs/plugins/catenate.js +250 -0
  114. package/dist/cjs/plugins/compress.d.ts +7 -0
  115. package/dist/cjs/plugins/compress.js +79 -0
  116. package/dist/cjs/plugins/condstore.d.ts +5 -0
  117. package/dist/cjs/plugins/condstore.js +492 -0
  118. package/dist/cjs/plugins/context-search.d.ts +8 -0
  119. package/dist/cjs/plugins/context-search.js +304 -0
  120. package/dist/cjs/plugins/context-sort.d.ts +6 -0
  121. package/dist/cjs/plugins/context-sort.js +32 -0
  122. package/dist/cjs/plugins/create-special-use.d.ts +7 -0
  123. package/dist/cjs/plugins/create-special-use.js +101 -0
  124. package/dist/cjs/plugins/enable.d.ts +23 -0
  125. package/dist/cjs/plugins/enable.js +127 -0
  126. package/dist/cjs/plugins/esearch.d.ts +6 -0
  127. package/dist/cjs/plugins/esearch.js +142 -0
  128. package/dist/cjs/plugins/esort.d.ts +6 -0
  129. package/dist/cjs/plugins/esort.js +60 -0
  130. package/dist/cjs/plugins/id.d.ts +5 -0
  131. package/dist/cjs/plugins/id.js +123 -0
  132. package/dist/cjs/plugins/idle.d.ts +5 -0
  133. package/dist/cjs/plugins/idle.js +85 -0
  134. package/dist/cjs/plugins/imap4rev2.d.ts +6 -0
  135. package/dist/cjs/plugins/imap4rev2.js +184 -0
  136. package/dist/cjs/plugins/index.d.ts +2 -0
  137. package/dist/cjs/plugins/index.js +119 -0
  138. package/dist/cjs/plugins/list-extended.d.ts +2 -0
  139. package/dist/cjs/plugins/list-extended.js +235 -0
  140. package/dist/cjs/plugins/list-status.d.ts +6 -0
  141. package/dist/cjs/plugins/list-status.js +42 -0
  142. package/dist/cjs/plugins/literalminus.d.ts +8 -0
  143. package/dist/cjs/plugins/literalminus.js +32 -0
  144. package/dist/cjs/plugins/literalplus.d.ts +6 -0
  145. package/dist/cjs/plugins/literalplus.js +30 -0
  146. package/dist/cjs/plugins/logindisabled.d.ts +5 -0
  147. package/dist/cjs/plugins/logindisabled.js +54 -0
  148. package/dist/cjs/plugins/messagelimit.d.ts +19 -0
  149. package/dist/cjs/plugins/messagelimit.js +227 -0
  150. package/dist/cjs/plugins/metadata-server.d.ts +7 -0
  151. package/dist/cjs/plugins/metadata-server.js +24 -0
  152. package/dist/cjs/plugins/metadata.d.ts +11 -0
  153. package/dist/cjs/plugins/metadata.js +436 -0
  154. package/dist/cjs/plugins/move.d.ts +11 -0
  155. package/dist/cjs/plugins/move.js +96 -0
  156. package/dist/cjs/plugins/multiappend.d.ts +12 -0
  157. package/dist/cjs/plugins/multiappend.js +38 -0
  158. package/dist/cjs/plugins/multisearch.d.ts +6 -0
  159. package/dist/cjs/plugins/multisearch.js +263 -0
  160. package/dist/cjs/plugins/namespace.d.ts +5 -0
  161. package/dist/cjs/plugins/namespace.js +57 -0
  162. package/dist/cjs/plugins/notify.d.ts +2 -0
  163. package/dist/cjs/plugins/notify.js +628 -0
  164. package/dist/cjs/plugins/oauthbearer.d.ts +32 -0
  165. package/dist/cjs/plugins/oauthbearer.js +202 -0
  166. package/dist/cjs/plugins/objectid.d.ts +23 -0
  167. package/dist/cjs/plugins/objectid.js +221 -0
  168. package/dist/cjs/plugins/partial.d.ts +6 -0
  169. package/dist/cjs/plugins/partial.js +78 -0
  170. package/dist/cjs/plugins/preview.d.ts +31 -0
  171. package/dist/cjs/plugins/preview.js +378 -0
  172. package/dist/cjs/plugins/qresync.d.ts +11 -0
  173. package/dist/cjs/plugins/qresync.js +473 -0
  174. package/dist/cjs/plugins/quota.d.ts +18 -0
  175. package/dist/cjs/plugins/quota.js +254 -0
  176. package/dist/cjs/plugins/replace.d.ts +14 -0
  177. package/dist/cjs/plugins/replace.js +130 -0
  178. package/dist/cjs/plugins/sasl-ir.d.ts +5 -0
  179. package/dist/cjs/plugins/sasl-ir.js +24 -0
  180. package/dist/cjs/plugins/savedate.d.ts +17 -0
  181. package/dist/cjs/plugins/savedate.js +64 -0
  182. package/dist/cjs/plugins/savelimit.d.ts +10 -0
  183. package/dist/cjs/plugins/savelimit.js +30 -0
  184. package/dist/cjs/plugins/searchres.d.ts +6 -0
  185. package/dist/cjs/plugins/searchres.js +91 -0
  186. package/dist/cjs/plugins/sort-display.d.ts +11 -0
  187. package/dist/cjs/plugins/sort-display.js +37 -0
  188. package/dist/cjs/plugins/sort.d.ts +11 -0
  189. package/dist/cjs/plugins/sort.js +125 -0
  190. package/dist/cjs/plugins/special-use.d.ts +10 -0
  191. package/dist/cjs/plugins/special-use.js +95 -0
  192. package/dist/cjs/plugins/starttls.d.ts +5 -0
  193. package/dist/cjs/plugins/starttls.js +55 -0
  194. package/dist/cjs/plugins/status-size.d.ts +7 -0
  195. package/dist/cjs/plugins/status-size.js +30 -0
  196. package/dist/cjs/plugins/thread-orderedsubject.d.ts +11 -0
  197. package/dist/cjs/plugins/thread-orderedsubject.js +28 -0
  198. package/dist/cjs/plugins/thread-references.d.ts +11 -0
  199. package/dist/cjs/plugins/thread-references.js +28 -0
  200. package/dist/cjs/plugins/uidonly.d.ts +15 -0
  201. package/dist/cjs/plugins/uidonly.js +126 -0
  202. package/dist/cjs/plugins/uidplus.d.ts +15 -0
  203. package/dist/cjs/plugins/uidplus.js +119 -0
  204. package/dist/cjs/plugins/unauthenticate.d.ts +7 -0
  205. package/dist/cjs/plugins/unauthenticate.js +32 -0
  206. package/dist/cjs/plugins/unselect.d.ts +5 -0
  207. package/dist/cjs/plugins/unselect.js +36 -0
  208. package/dist/cjs/plugins/utf8-accept.d.ts +6 -0
  209. package/dist/cjs/plugins/utf8-accept.js +72 -0
  210. package/dist/cjs/plugins/x-gm-ext-1.d.ts +26 -0
  211. package/dist/cjs/plugins/x-gm-ext-1.js +422 -0
  212. package/dist/cjs/plugins/xoauth2.d.ts +2 -0
  213. package/dist/cjs/plugins/xoauth2.js +155 -0
  214. package/dist/cjs/plugins/xtoybird.d.ts +2 -0
  215. package/dist/cjs/plugins/xtoybird.js +236 -0
  216. package/dist/cjs/server.d.ts +876 -0
  217. package/dist/cjs/server.js +2597 -0
  218. package/dist/cjs/smtp-listener.d.ts +13 -0
  219. package/dist/cjs/smtp-listener.js +47 -0
  220. package/dist/cjs/sorting.d.ts +77 -0
  221. package/dist/cjs/sorting.js +290 -0
  222. package/dist/cjs/threading.d.ts +30 -0
  223. package/dist/cjs/threading.js +318 -0
  224. package/dist/cjs/types.d.ts +327 -0
  225. package/dist/cjs/types.js +3 -0
  226. package/dist/cjs/utf8-session.d.ts +17 -0
  227. package/dist/cjs/utf8-session.js +148 -0
  228. package/dist/cjs/vanished.d.ts +21 -0
  229. package/dist/cjs/vanished.js +55 -0
  230. package/dist/esm/addressparser.d.ts +21 -0
  231. package/{lib → dist/esm}/addressparser.js +102 -123
  232. package/dist/esm/arguments.d.ts +31 -0
  233. package/dist/esm/arguments.js +96 -0
  234. package/dist/esm/bodystructure.d.ts +25 -0
  235. package/{lib → dist/esm}/bodystructure.js +17 -33
  236. package/dist/esm/cert.d.ts +2 -0
  237. package/dist/esm/cert.js +4 -0
  238. package/dist/esm/command-states.d.ts +36 -0
  239. package/{lib → dist/esm}/command-states.js +4 -16
  240. package/dist/esm/commands/append.d.ts +88 -0
  241. package/{lib → dist/esm}/commands/append.js +47 -85
  242. package/dist/esm/commands/capability.d.ts +2 -0
  243. package/dist/esm/commands/capability.js +29 -0
  244. package/dist/esm/commands/check.d.ts +2 -0
  245. package/dist/esm/commands/check.js +13 -0
  246. package/dist/esm/commands/close.d.ts +2 -0
  247. package/dist/esm/commands/close.js +20 -0
  248. package/dist/esm/commands/copy.d.ts +30 -0
  249. package/{lib → dist/esm}/commands/copy.js +31 -55
  250. package/dist/esm/commands/create.d.ts +2 -0
  251. package/{lib → dist/esm}/commands/create.js +25 -39
  252. package/dist/esm/commands/delete.d.ts +2 -0
  253. package/{lib → dist/esm}/commands/delete.js +25 -41
  254. package/dist/esm/commands/examine.d.ts +2 -0
  255. package/dist/esm/commands/examine.js +4 -0
  256. package/dist/esm/commands/expunge.d.ts +2 -0
  257. package/dist/esm/commands/expunge.js +17 -0
  258. package/dist/esm/commands/fetch.d.ts +23 -0
  259. package/{lib → dist/esm}/commands/fetch.js +33 -74
  260. package/dist/esm/commands/handlers/fetch.d.ts +12 -0
  261. package/{lib → dist/esm}/commands/handlers/fetch.js +11 -42
  262. package/dist/esm/commands/handlers/flags.d.ts +17 -0
  263. package/{lib → dist/esm}/commands/handlers/flags.js +3 -11
  264. package/dist/esm/commands/handlers/search.d.ts +85 -0
  265. package/{lib → dist/esm}/commands/handlers/search.js +33 -71
  266. package/dist/esm/commands/handlers/status.d.ts +34 -0
  267. package/{lib → dist/esm}/commands/handlers/status.js +1 -9
  268. package/dist/esm/commands/handlers/store.d.ts +3 -0
  269. package/{lib → dist/esm}/commands/handlers/store.js +20 -44
  270. package/dist/esm/commands/index.d.ts +2 -0
  271. package/dist/esm/commands/index.js +55 -0
  272. package/dist/esm/commands/list.d.ts +2 -0
  273. package/dist/esm/commands/list.js +71 -0
  274. package/dist/esm/commands/login.d.ts +2 -0
  275. package/{lib → dist/esm}/commands/login.js +24 -44
  276. package/dist/esm/commands/logout.d.ts +2 -0
  277. package/dist/esm/commands/logout.js +25 -0
  278. package/dist/esm/commands/lsub.d.ts +2 -0
  279. package/dist/esm/commands/lsub.js +64 -0
  280. package/dist/esm/commands/noop.d.ts +2 -0
  281. package/dist/esm/commands/noop.js +13 -0
  282. package/dist/esm/commands/rename.d.ts +2 -0
  283. package/{lib → dist/esm}/commands/rename.js +32 -51
  284. package/dist/esm/commands/search.d.ts +10 -0
  285. package/dist/esm/commands/search.js +54 -0
  286. package/dist/esm/commands/select.d.ts +19 -0
  287. package/dist/esm/commands/select.js +214 -0
  288. package/dist/esm/commands/status.d.ts +2 -0
  289. package/{lib → dist/esm}/commands/status.js +18 -39
  290. package/dist/esm/commands/store.d.ts +10 -0
  291. package/{lib → dist/esm}/commands/store.js +39 -73
  292. package/dist/esm/commands/subscribe.d.ts +2 -0
  293. package/{lib → dist/esm}/commands/subscribe.js +22 -39
  294. package/dist/esm/commands/uid-copy.d.ts +2 -0
  295. package/dist/esm/commands/uid-copy.js +4 -0
  296. package/dist/esm/commands/uid-fetch.d.ts +3 -0
  297. package/dist/esm/commands/uid-fetch.js +3 -0
  298. package/dist/esm/commands/uid-search.d.ts +3 -0
  299. package/dist/esm/commands/uid-search.js +3 -0
  300. package/dist/esm/commands/uid-store.d.ts +3 -0
  301. package/dist/esm/commands/uid-store.js +3 -0
  302. package/dist/esm/commands/unsubscribe.d.ts +2 -0
  303. package/{lib → dist/esm}/commands/unsubscribe.js +22 -37
  304. package/dist/esm/dates.d.ts +64 -0
  305. package/{lib → dist/esm}/dates.js +6 -14
  306. package/dist/esm/deflate-layer.d.ts +83 -0
  307. package/{lib → dist/esm}/deflate-layer.js +9 -26
  308. package/dist/esm/encoded-words.d.ts +15 -0
  309. package/{lib → dist/esm}/encoded-words.js +9 -25
  310. package/dist/esm/envelope.d.ts +33 -0
  311. package/{lib → dist/esm}/envelope.js +8 -19
  312. package/dist/esm/esearch.d.ts +96 -0
  313. package/{lib → dist/esm}/esearch.js +12 -39
  314. package/dist/esm/framing.d.ts +66 -0
  315. package/dist/esm/framing.js +82 -0
  316. package/dist/esm/index.d.ts +9 -0
  317. package/dist/esm/index.js +6 -0
  318. package/dist/esm/list-extensions.d.ts +50 -0
  319. package/{lib → dist/esm}/list-extensions.js +1 -4
  320. package/dist/esm/load-plugins.d.ts +21 -0
  321. package/{lib → dist/esm}/load-plugins.js +9 -43
  322. package/dist/esm/mailbox-name.d.ts +26 -0
  323. package/{lib → dist/esm}/mailbox-name.js +5 -26
  324. package/dist/esm/mimeparser.d.ts +137 -0
  325. package/{lib → dist/esm}/mimeparser.js +74 -152
  326. package/dist/esm/mock-client.d.ts +39 -0
  327. package/{lib → dist/esm}/mock-client.js +26 -40
  328. package/dist/esm/numbers.d.ts +28 -0
  329. package/{lib → dist/esm}/numbers.js +1 -8
  330. package/dist/esm/package.json +3 -0
  331. package/dist/esm/plugins/acl.d.ts +2 -0
  332. package/{lib → dist/esm}/plugins/acl.js +146 -240
  333. package/dist/esm/plugins/appendlimit.d.ts +16 -0
  334. package/{lib → dist/esm}/plugins/appendlimit.js +5 -16
  335. package/dist/esm/plugins/auth-plain.d.ts +2 -0
  336. package/{lib → dist/esm}/plugins/auth-plain.js +11 -31
  337. package/dist/esm/plugins/binary.d.ts +30 -0
  338. package/{lib → dist/esm}/plugins/binary.js +17 -43
  339. package/dist/esm/plugins/catenate.d.ts +14 -0
  340. package/{lib → dist/esm}/plugins/catenate.js +19 -40
  341. package/dist/esm/plugins/compress.d.ts +7 -0
  342. package/dist/esm/plugins/compress.js +61 -0
  343. package/dist/esm/plugins/condstore.d.ts +5 -0
  344. package/{lib → dist/esm}/plugins/condstore.js +66 -152
  345. package/dist/esm/plugins/context-search.d.ts +8 -0
  346. package/{lib → dist/esm}/plugins/context-search.js +53 -88
  347. package/dist/esm/plugins/context-sort.d.ts +6 -0
  348. package/{lib → dist/esm}/plugins/context-sort.js +4 -9
  349. package/dist/esm/plugins/create-special-use.d.ts +7 -0
  350. package/{lib → dist/esm}/plugins/create-special-use.js +33 -55
  351. package/dist/esm/plugins/enable.d.ts +23 -0
  352. package/dist/esm/plugins/enable.js +111 -0
  353. package/dist/esm/plugins/esearch.d.ts +6 -0
  354. package/{lib → dist/esm}/plugins/esearch.js +13 -42
  355. package/dist/esm/plugins/esort.d.ts +6 -0
  356. package/{lib → dist/esm}/plugins/esort.js +7 -25
  357. package/dist/esm/plugins/id.d.ts +5 -0
  358. package/dist/esm/plugins/id.js +108 -0
  359. package/dist/esm/plugins/idle.d.ts +5 -0
  360. package/dist/esm/plugins/idle.js +70 -0
  361. package/dist/esm/plugins/imap4rev2.d.ts +6 -0
  362. package/{lib → dist/esm}/plugins/imap4rev2.js +24 -60
  363. package/dist/esm/plugins/index.d.ts +2 -0
  364. package/dist/esm/plugins/index.js +113 -0
  365. package/dist/esm/plugins/list-extended.d.ts +2 -0
  366. package/{lib → dist/esm}/plugins/list-extended.js +28 -66
  367. package/dist/esm/plugins/list-status.d.ts +6 -0
  368. package/{lib → dist/esm}/plugins/list-status.js +5 -12
  369. package/dist/esm/plugins/literalminus.d.ts +8 -0
  370. package/{lib → dist/esm}/plugins/literalminus.js +2 -5
  371. package/dist/esm/plugins/literalplus.d.ts +6 -0
  372. package/{lib → dist/esm}/plugins/literalplus.js +2 -5
  373. package/dist/esm/plugins/logindisabled.d.ts +5 -0
  374. package/dist/esm/plugins/logindisabled.js +39 -0
  375. package/dist/esm/plugins/messagelimit.d.ts +19 -0
  376. package/{lib → dist/esm}/plugins/messagelimit.js +18 -41
  377. package/dist/esm/plugins/metadata-server.d.ts +7 -0
  378. package/{lib → dist/esm}/plugins/metadata-server.js +3 -7
  379. package/dist/esm/plugins/metadata.d.ts +11 -0
  380. package/dist/esm/plugins/metadata.js +421 -0
  381. package/dist/esm/plugins/move.d.ts +11 -0
  382. package/{lib → dist/esm}/plugins/move.js +37 -66
  383. package/dist/esm/plugins/multiappend.d.ts +12 -0
  384. package/{lib → dist/esm}/plugins/multiappend.js +2 -5
  385. package/dist/esm/plugins/multisearch.d.ts +6 -0
  386. package/{lib → dist/esm}/plugins/multisearch.js +24 -48
  387. package/dist/esm/plugins/namespace.d.ts +5 -0
  388. package/dist/esm/plugins/namespace.js +42 -0
  389. package/dist/esm/plugins/notify.d.ts +2 -0
  390. package/{lib → dist/esm}/plugins/notify.js +90 -134
  391. package/dist/esm/plugins/oauthbearer.d.ts +32 -0
  392. package/{lib → dist/esm}/plugins/oauthbearer.js +18 -48
  393. package/dist/esm/plugins/objectid.d.ts +23 -0
  394. package/{lib → dist/esm}/plugins/objectid.js +21 -58
  395. package/dist/esm/plugins/partial.d.ts +6 -0
  396. package/{lib → dist/esm}/plugins/partial.js +7 -15
  397. package/dist/esm/plugins/preview.d.ts +31 -0
  398. package/{lib → dist/esm}/plugins/preview.js +28 -66
  399. package/dist/esm/plugins/qresync.d.ts +11 -0
  400. package/{lib → dist/esm}/plugins/qresync.js +64 -134
  401. package/dist/esm/plugins/quota.d.ts +18 -0
  402. package/{lib → dist/esm}/plugins/quota.js +89 -135
  403. package/dist/esm/plugins/replace.d.ts +14 -0
  404. package/{lib → dist/esm}/plugins/replace.js +21 -51
  405. package/dist/esm/plugins/sasl-ir.d.ts +5 -0
  406. package/{lib → dist/esm}/plugins/sasl-ir.js +3 -6
  407. package/dist/esm/plugins/savedate.d.ts +17 -0
  408. package/{lib → dist/esm}/plugins/savedate.js +5 -15
  409. package/dist/esm/plugins/savelimit.d.ts +10 -0
  410. package/{lib → dist/esm}/plugins/savelimit.js +3 -6
  411. package/dist/esm/plugins/searchres.d.ts +6 -0
  412. package/{lib → dist/esm}/plugins/searchres.js +13 -22
  413. package/dist/esm/plugins/sort-display.d.ts +11 -0
  414. package/{lib → dist/esm}/plugins/sort-display.js +6 -10
  415. package/dist/esm/plugins/sort.d.ts +11 -0
  416. package/{lib → dist/esm}/plugins/sort.js +24 -46
  417. package/dist/esm/plugins/special-use.d.ts +10 -0
  418. package/{lib → dist/esm}/plugins/special-use.js +9 -24
  419. package/dist/esm/plugins/starttls.d.ts +5 -0
  420. package/{lib → dist/esm}/plugins/starttls.js +20 -37
  421. package/dist/esm/plugins/status-size.d.ts +7 -0
  422. package/{lib → dist/esm}/plugins/status-size.js +4 -11
  423. package/dist/esm/plugins/thread-orderedsubject.d.ts +11 -0
  424. package/{lib → dist/esm}/plugins/thread-orderedsubject.js +3 -6
  425. package/dist/esm/plugins/thread-references.d.ts +11 -0
  426. package/{lib → dist/esm}/plugins/thread-references.js +3 -6
  427. package/dist/esm/plugins/uidonly.d.ts +15 -0
  428. package/{lib → dist/esm}/plugins/uidonly.js +11 -35
  429. package/dist/esm/plugins/uidplus.d.ts +15 -0
  430. package/{lib → dist/esm}/plugins/uidplus.js +25 -45
  431. package/dist/esm/plugins/unauthenticate.d.ts +7 -0
  432. package/dist/esm/plugins/unauthenticate.js +17 -0
  433. package/dist/esm/plugins/unselect.d.ts +5 -0
  434. package/dist/esm/plugins/unselect.js +21 -0
  435. package/dist/esm/plugins/utf8-accept.d.ts +6 -0
  436. package/{lib → dist/esm}/plugins/utf8-accept.js +10 -21
  437. package/dist/esm/plugins/x-gm-ext-1.d.ts +26 -0
  438. package/{lib → dist/esm}/plugins/x-gm-ext-1.js +48 -100
  439. package/dist/esm/plugins/xoauth2.d.ts +2 -0
  440. package/dist/esm/plugins/xoauth2.js +140 -0
  441. package/dist/esm/plugins/xtoybird.d.ts +2 -0
  442. package/dist/esm/plugins/xtoybird.js +218 -0
  443. package/dist/esm/server.d.ts +876 -0
  444. package/dist/esm/server.js +2543 -0
  445. package/dist/esm/smtp-listener.d.ts +13 -0
  446. package/{lib → dist/esm}/smtp-listener.js +5 -12
  447. package/dist/esm/sorting.d.ts +77 -0
  448. package/{lib → dist/esm}/sorting.js +40 -53
  449. package/dist/esm/threading.d.ts +30 -0
  450. package/{lib → dist/esm}/threading.js +29 -70
  451. package/dist/esm/types.d.ts +327 -0
  452. package/dist/esm/types.js +2 -0
  453. package/dist/esm/utf8-session.d.ts +17 -0
  454. package/{lib → dist/esm}/utf8-session.js +15 -25
  455. package/dist/esm/vanished.d.ts +21 -0
  456. package/{lib → dist/esm}/vanished.js +16 -21
  457. package/dist/plugin-help.json +298 -0
  458. package/package.json +54 -11
  459. package/lib/commands/capability.js +0 -47
  460. package/lib/commands/check.js +0 -21
  461. package/lib/commands/close.js +0 -30
  462. package/lib/commands/examine.js +0 -7
  463. package/lib/commands/expunge.js +0 -27
  464. package/lib/commands/list.js +0 -100
  465. package/lib/commands/logout.js +0 -41
  466. package/lib/commands/lsub.js +0 -87
  467. package/lib/commands/noop.js +0 -21
  468. package/lib/commands/search.js +0 -76
  469. package/lib/commands/select.js +0 -289
  470. package/lib/commands/uid copy.js +0 -7
  471. package/lib/commands/uid fetch.js +0 -5
  472. package/lib/commands/uid search.js +0 -5
  473. package/lib/commands/uid store.js +0 -5
  474. package/lib/plugins/compress.js +0 -76
  475. package/lib/plugins/enable.js +0 -155
  476. package/lib/plugins/id.js +0 -138
  477. package/lib/plugins/idle.js +0 -105
  478. package/lib/plugins/logindisabled.js +0 -50
  479. package/lib/plugins/metadata.js +0 -475
  480. package/lib/plugins/namespace.js +0 -67
  481. package/lib/plugins/unauthenticate.js +0 -28
  482. package/lib/plugins/unselect.js +0 -36
  483. package/lib/plugins/xoauth2.js +0 -188
  484. package/lib/plugins/xtoybird.js +0 -282
  485. package/lib/server.js +0 -2880
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = deleteCommand;
4
+ function deleteCommand(connection, parsed, data, callback) {
5
+ if (!parsed.attributes || parsed.attributes.length !== 1 || !parsed.attributes[0] || ['STRING', 'LITERAL', 'ATOM'].indexOf(parsed.attributes[0].type) < 0) {
6
+ connection.send({
7
+ tag: parsed.tag,
8
+ command: 'BAD',
9
+ attributes: [
10
+ {
11
+ type: 'TEXT',
12
+ value: 'DELETE expects mailbox name'
13
+ }
14
+ ]
15
+ }, 'INVALID COMMAND', parsed, data);
16
+ return callback();
17
+ }
18
+ const path = parsed.attributes[0].value;
19
+ const mailbox = connection.server.getMailbox(path);
20
+ if (!mailbox) {
21
+ connection.sendStatus(parsed, data, 'NO', 'Mailbox does not exist', 'NONEXISTENT', 'DELETE FAILED');
22
+ return callback();
23
+ }
24
+ try {
25
+ connection.server.deleteMailbox(path);
26
+ }
27
+ catch (err) {
28
+ const E = err;
29
+ connection.sendStatus(parsed, data, 'NO', E.message, E.code, 'DELETE FAILED');
30
+ return callback();
31
+ }
32
+ connection.server.mailboxChanged('delete', mailbox.path, { mailbox });
33
+ // RFC 2180 section 3.3: the other sessions that have the mailbox selected are disconnected with an untagged
34
+ // BYE (RFC 2683 section 3.1.2), as they can not be told about the deletion in any other way
35
+ connection.server.connections.forEach(other => {
36
+ if (other !== connection && other.selectedMailbox === mailbox) {
37
+ other.bye('Selected mailbox was deleted', 'MAILBOX DELETED');
38
+ }
39
+ });
40
+ connection.send({
41
+ tag: parsed.tag,
42
+ command: 'OK',
43
+ attributes: [
44
+ {
45
+ type: 'TEXT',
46
+ value: 'DELETE completed'
47
+ }
48
+ ]
49
+ }, 'DELETE', parsed, data);
50
+ return callback();
51
+ }
52
+ {
53
+ const defaultExport = exports.default;
54
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
55
+ for (const key of Object.keys(exports)) {
56
+ if (key !== 'default' && !(key in defaultExport)) {
57
+ defaultExport[key] = exports[key];
58
+ }
59
+ }
60
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
61
+ module.exports = defaultExport;
62
+ }
63
+ }
@@ -0,0 +1,2 @@
1
+ import type { Callback, IMAPConnection, ParsedCommand } from '../types.js';
2
+ export default function examineCommand(connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = examineCommand;
4
+ const select_js_1 = require("./select.js");
5
+ function examineCommand(connection, parsed, data, callback) {
6
+ return (0, select_js_1.selectMailbox)(connection, parsed, data, callback, true);
7
+ }
8
+ {
9
+ const defaultExport = exports.default;
10
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
11
+ for (const key of Object.keys(exports)) {
12
+ if (key !== 'default' && !(key in defaultExport)) {
13
+ defaultExport[key] = exports[key];
14
+ }
15
+ }
16
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
17
+ module.exports = defaultExport;
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ import type { Callback, IMAPConnection, ParsedCommand } from '../types.js';
2
+ export default function expungeCommand(connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = expungeCommand;
4
+ function expungeCommand(connection, parsed, data, callback) {
5
+ if (connection.refuseReadOnly(parsed, data, 'EXPUNGE FAILED')) {
6
+ return callback();
7
+ }
8
+ connection.expungeDeleted(connection.selectedMailbox, false, true);
9
+ connection.send({
10
+ tag: parsed.tag,
11
+ command: 'OK',
12
+ attributes: [
13
+ {
14
+ type: 'TEXT',
15
+ value: 'EXPUNGE Completed'
16
+ }
17
+ ]
18
+ }, 'EXPUNGE', parsed, data);
19
+ callback();
20
+ }
21
+ {
22
+ const defaultExport = exports.default;
23
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
24
+ for (const key of Object.keys(exports)) {
25
+ if (key !== 'default' && !(key in defaultExport)) {
26
+ defaultExport[key] = exports[key];
27
+ }
28
+ }
29
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
30
+ module.exports = defaultExport;
31
+ }
32
+ }
@@ -0,0 +1,23 @@
1
+ import type { Attribute, Callback, FetchHandler, IMAPConnection, Message, ParsedCommand } from '../types.js';
2
+ declare const macros: Record<string, string[]>;
3
+ /**
4
+ * Builds the data list of a FETCH response for a message, without any side effects like setting \Seen
5
+ *
6
+ * @param {Object} connection IMAP connection
7
+ * @param {Object} message Message object
8
+ * @param {Array} params Fetch items
9
+ * @param {Array} [handlers] Handlers from getHandlers
10
+ * @param {Array} [names] Names from responseNames
11
+ * @return {Array} FETCH data items
12
+ * @throws {Error} for an unknown item or invalid item arguments
13
+ */
14
+ declare function fetchResponse(connection: IMAPConnection, message: Message, params: Attribute[], handlers?: FetchHandler[], names?: Attribute[]): Attribute[];
15
+ /**
16
+ * Shared implementation of FETCH and UID FETCH
17
+ *
18
+ * @param {Boolean} isUid If true, the sequence set lists UIDs and UID is always included in the response
19
+ */
20
+ declare function processFetch(isUid: boolean, connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback): void;
21
+ declare const fetchCommand: (connection: IMAPConnection, parsed: ParsedCommand, data: string, callback: Callback) => void;
22
+ export default fetchCommand;
23
+ export { processFetch, macros, fetchResponse };
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.macros = void 0;
7
+ exports.processFetch = processFetch;
8
+ exports.fetchResponse = fetchResponse;
9
+ const fetch_js_1 = __importDefault(require("./handlers/fetch.js"));
10
+ const macros = {
11
+ ALL: ['FLAGS', 'INTERNALDATE', 'RFC822.SIZE', 'ENVELOPE'],
12
+ FAST: ['FLAGS', 'INTERNALDATE', 'RFC822.SIZE'],
13
+ FULL: ['FLAGS', 'INTERNALDATE', 'RFC822.SIZE', 'ENVELOPE', 'BODY']
14
+ };
15
+ exports.macros = macros;
16
+ /**
17
+ * Returns the item names as they appear in a FETCH response, without .PEEK and only with the origin
18
+ * octet of a partial range (RFC 3501 section 7.4.2)
19
+ *
20
+ * @param {Array} params Fetch items
21
+ * @return {Array} names
22
+ */
23
+ function responseNames(params) {
24
+ return params.map((param) => {
25
+ const name = Object.assign({}, param, { value: param.value.replace(/\.PEEK\b/i, '') });
26
+ if (name.partial) {
27
+ name.partial = name.partial.slice(0, 1);
28
+ }
29
+ return name;
30
+ });
31
+ }
32
+ /**
33
+ * Returns the handlers of fetch items
34
+ *
35
+ * @param {Object} connection IMAP connection
36
+ * @param {Array} params Fetch items
37
+ * @return {Array} handlers
38
+ * @throws {Error} for an unknown item
39
+ */
40
+ function getHandlers(connection, params) {
41
+ return params.map((param, i) => {
42
+ const key = (param.value || '').toUpperCase();
43
+ const handler = connection.server.fetchHandlers[key] || fetch_js_1.default[key];
44
+ if (!handler) {
45
+ throw new Error('Invalid FETCH argument ' + (key || '#' + (i + 1)));
46
+ }
47
+ return handler;
48
+ });
49
+ }
50
+ /**
51
+ * Builds the data list of a FETCH response for a message, without any side effects like setting \Seen
52
+ *
53
+ * @param {Object} connection IMAP connection
54
+ * @param {Object} message Message object
55
+ * @param {Array} params Fetch items
56
+ * @param {Array} [handlers] Handlers from getHandlers
57
+ * @param {Array} [names] Names from responseNames
58
+ * @return {Array} FETCH data items
59
+ * @throws {Error} for an unknown item or invalid item arguments
60
+ */
61
+ function fetchResponse(connection, message, params, handlers, names) {
62
+ const itemHandlers = handlers || getHandlers(connection, params);
63
+ const itemNames = names || responseNames(params);
64
+ const response = [];
65
+ params.forEach((param, i) => response.push(itemNames[i], itemHandlers[i](connection, message, param)));
66
+ return response;
67
+ }
68
+ /**
69
+ * Shared implementation of FETCH and UID FETCH
70
+ *
71
+ * @param {Boolean} isUid If true, the sequence set lists UIDs and UID is always included in the response
72
+ */
73
+ function processFetch(isUid, connection, parsed, data, callback) {
74
+ const command = isUid ? 'UID FETCH' : 'FETCH';
75
+ if (!parsed.attributes ||
76
+ parsed.attributes.length !== 2 ||
77
+ !parsed.attributes[0] ||
78
+ ['ATOM', 'SEQUENCE'].indexOf(parsed.attributes[0].type) < 0 ||
79
+ !parsed.attributes[1] ||
80
+ (['ATOM'].indexOf(parsed.attributes[1].type) < 0 && !Array.isArray(parsed.attributes[1]))) {
81
+ connection.send({
82
+ tag: parsed.tag,
83
+ command: 'BAD',
84
+ attributes: [
85
+ {
86
+ type: 'TEXT',
87
+ value: command + ' expects sequence set and message item names'
88
+ }
89
+ ]
90
+ }, 'INVALID COMMAND', parsed, data);
91
+ return callback();
92
+ }
93
+ const range = connection.limitRange(parsed, connection.getCommandRange(parsed.attributes[0].value, isUid));
94
+ let params = [].concat(parsed.attributes[1] || []);
95
+ if (parsed.attributes[1].type === 'ATOM' && Object.prototype.hasOwnProperty.call(macros, parsed.attributes[1].value.toUpperCase())) {
96
+ params = macros[parsed.attributes[1].value.toUpperCase()].slice();
97
+ }
98
+ // messages that get \Seen set by this FETCH
99
+ const seen = [];
100
+ // untagged FETCH responses and their messages
101
+ const responses = [];
102
+ const messages = [];
103
+ try {
104
+ let uidExist = false;
105
+ let flagsExist = false;
106
+ let forceSeen = false;
107
+ params.forEach((param, i) => {
108
+ if (!param || (typeof param !== 'string' && param.type !== 'ATOM')) {
109
+ throw new Error('Invalid FETCH argument #' + (i + 1));
110
+ }
111
+ if (typeof param === 'string') {
112
+ param = params[i] = {
113
+ type: 'ATOM',
114
+ value: param
115
+ };
116
+ }
117
+ const key = param.value.toUpperCase();
118
+ if (key === 'FLAGS') {
119
+ flagsExist = true;
120
+ }
121
+ if (key === 'UID') {
122
+ uidExist = true;
123
+ }
124
+ // RFC 3501 6.4.5: BODY[<section>] and items whose handler is marked with setsSeen set \Seen
125
+ const handler = connection.server.fetchHandlers[key] || fetch_js_1.default[key];
126
+ if (connection.canSetSeen() && ((key === 'BODY' && param.section) || (handler && handler.setsSeen))) {
127
+ forceSeen = true;
128
+ }
129
+ });
130
+ if (forceSeen && !flagsExist) {
131
+ params.push({
132
+ type: 'ATOM',
133
+ value: 'FLAGS'
134
+ });
135
+ }
136
+ if (isUid && !uidExist) {
137
+ params.push({
138
+ type: 'ATOM',
139
+ value: 'UID'
140
+ });
141
+ }
142
+ const handlers = getHandlers(connection, params);
143
+ // item names as they appear in the response
144
+ const names = responseNames(params);
145
+ // nothing is sent before every message is done, so a failing item leaves no partial output
146
+ range.forEach(rangeMessage => {
147
+ for (let i = 0, len = connection.server.fetchFilters.length; i < len; i++) {
148
+ if (!connection.server.fetchFilters[i](connection, rangeMessage[1], parsed, rangeMessage[0])) {
149
+ return;
150
+ }
151
+ }
152
+ if (forceSeen && rangeMessage[1].flags.indexOf('\\Seen') < 0) {
153
+ rangeMessage[1].flags.push('\\Seen');
154
+ seen.push(rangeMessage[1]);
155
+ }
156
+ const response = fetchResponse(connection, rangeMessage[1], params, handlers, names);
157
+ messages.push(rangeMessage[1]);
158
+ responses.push({
159
+ tag: '*',
160
+ attributes: [
161
+ rangeMessage[0],
162
+ {
163
+ type: 'ATOM',
164
+ value: 'FETCH'
165
+ },
166
+ response
167
+ ]
168
+ });
169
+ });
170
+ }
171
+ catch (err) {
172
+ const E = err;
173
+ // the failed FETCH did not set \Seen after all
174
+ seen.forEach(message => connection.server.removeFlag(message.flags, '\\Seen'));
175
+ // a handler can fail with NO and a response code, e.g. NO [UNKNOWN-CTE] (RFC 3516 section 4.3)
176
+ connection.sendStatus(parsed, data, E.imapResponse === 'NO' ? 'NO' : 'BAD', E.message, E.code, command + ' FAILED');
177
+ return callback();
178
+ }
179
+ // the message goes with its response, for output handlers
180
+ responses.forEach((response, i) => connection.send(response, command, parsed, data, messages[i]));
181
+ connection.send({
182
+ tag: parsed.tag,
183
+ command: 'OK',
184
+ attributes: [
185
+ {
186
+ type: 'TEXT',
187
+ value: command + ' Completed'
188
+ }
189
+ ]
190
+ }, command, parsed, data);
191
+ // other sessions that have the mailbox selected learn about the new flags (RFC 3501 section 5.2)
192
+ connection.notifyFlagChanges(seen);
193
+ return callback();
194
+ }
195
+ const fetchCommand = (connection, parsed, data, callback) => processFetch(false, connection, parsed, data, callback);
196
+ exports.default = fetchCommand;
197
+ {
198
+ const defaultExport = exports.default;
199
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
200
+ for (const key of Object.keys(exports)) {
201
+ if (key !== 'default' && !(key in defaultExport)) {
202
+ defaultExport[key] = exports[key];
203
+ }
204
+ }
205
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
206
+ module.exports = defaultExport;
207
+ }
208
+ }
@@ -0,0 +1,12 @@
1
+ import type { FetchHandler } from '../../types.js';
2
+ declare const fetchHandlers: Record<string, FetchHandler>;
3
+ export default fetchHandlers;
4
+ /**
5
+ * Applies the partial range of a BODY[]<start.length> or BINARY[]<start.length> item
6
+ *
7
+ * @param {String} value Section contents
8
+ * @param {Array} [partial] Parsed partial range
9
+ * @return {String} The requested slice, or the whole value without a range
10
+ */
11
+ declare function applyPartial(value: string, partial: number[] | null | undefined): string;
12
+ export { applyPartial };
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.applyPartial = applyPartial;
7
+ const mimeparser_js_1 = require("../../mimeparser.js");
8
+ const bodystructure_js_1 = __importDefault(require("../../bodystructure.js"));
9
+ const envelope_js_1 = __importDefault(require("../../envelope.js"));
10
+ const fetchHandlers = {};
11
+ exports.default = fetchHandlers;
12
+ // not an IMAP item, so not enumerable among the handlers
13
+ Object.defineProperty(fetchHandlers, 'applyPartial', { value: applyPartial });
14
+ fetchHandlers.UID = function (connection, message) {
15
+ return message.uid;
16
+ };
17
+ fetchHandlers.FLAGS = function (connection, message) {
18
+ return connection.getFlags(message).map(flag => {
19
+ return {
20
+ type: 'ATOM',
21
+ value: flag
22
+ };
23
+ });
24
+ };
25
+ fetchHandlers.BODYSTRUCTURE = function (connection, message) {
26
+ return (0, bodystructure_js_1.default)((0, mimeparser_js_1.getMessageData)(message).tree, {
27
+ upperCaseKeys: true,
28
+ skipContentLocation: true,
29
+ messageGlobal: connection.messageGlobal
30
+ });
31
+ };
32
+ fetchHandlers.ENVELOPE = function (connection, message) {
33
+ return (0, envelope_js_1.default)((0, mimeparser_js_1.getMessageData)(message).tree.parsedHeader);
34
+ };
35
+ fetchHandlers['BODY.PEEK'] = function (connection, message, query) {
36
+ if (!query.section) {
37
+ throw new Error('BODY.PEEK requires ans argument list');
38
+ }
39
+ return fetchHandlers.BODY(connection, message, query);
40
+ };
41
+ /**
42
+ * Lists the header field names of a HEADER.FIELDS or HEADER.FIELDS.NOT section
43
+ */
44
+ function getFieldNames(query, key) {
45
+ if (query.section.length !== 2 || !Array.isArray(query.section[1]) || !query.section[1].length) {
46
+ throw new Error(key + ' expects a list of header fields');
47
+ }
48
+ return query.section[1].map((queryKey) => {
49
+ if (['ATOM', 'STRING', 'LITERAL'].indexOf(queryKey.type) < 0) {
50
+ throw new Error('Invalid header field name in list');
51
+ }
52
+ queryKey.type = 'ATOM'; // ensure that literals are not passed back in the response
53
+ return queryKey.value.toUpperCase();
54
+ });
55
+ }
56
+ /**
57
+ * Returns the contents of a BODY[<section>]
58
+ *
59
+ * @param {Object} data Message data from getMessageData()
60
+ * @param {Object} query Parsed fetch item
61
+ * @param {Boolean} [global] message/global parts encapsulate a message, see IMAPConnection#messageGlobal
62
+ * @return {String} Section contents
63
+ */
64
+ function getSection(data, query, global) {
65
+ if (!query.section.length) {
66
+ return data.raw;
67
+ }
68
+ if (query.section[0].type !== 'ATOM') {
69
+ throw new Error('Invalid BODY[<section>] identifier' + (query.section[0].value ? ' ' + query.section[0].type : ''));
70
+ }
71
+ // RFC 3501 9: section-part = nz-number *("." nz-number), optionally followed by a section-msgtext
72
+ // (or MIME for a part)
73
+ const match = (query.section[0].value || '')
74
+ .toUpperCase()
75
+ .match(/^((?:[1-9]\d*)(?:\.[1-9]\d*)*)?(?:(?:^|\.)(HEADER|HEADER\.FIELDS|HEADER\.FIELDS\.NOT|TEXT|MIME))?$/);
76
+ if (!match || (match[2] === 'MIME' && !match[1])) {
77
+ throw new Error('Invalid BODY[<section>] identifier ' + query.section[0].value);
78
+ }
79
+ const path = match[1] || '';
80
+ const key = match[2] || '';
81
+ let fields = [];
82
+ if (['HEADER.FIELDS', 'HEADER.FIELDS.NOT'].indexOf(key) >= 0) {
83
+ fields = getFieldNames(query, key);
84
+ }
85
+ else if (query.section.length > 1) {
86
+ throw new Error((key || 'Part number') + ' does not take any arguments');
87
+ }
88
+ // RFC 3501 6.4.5: a part that does not exist is returned as an empty string
89
+ const node = path ? (0, mimeparser_js_1.resolveNode)(data.tree, path, global) : data.tree;
90
+ if (!node) {
91
+ return '';
92
+ }
93
+ // HEADER and TEXT with a part number refer to the encapsulated message of a message/rfc822 part
94
+ // (and message/global in IMAP4rev2, RFC 9051 section 6.4.5.1), not to the part itself
95
+ const message = path ? (0, mimeparser_js_1.embeddedMessage)(node, global) : node;
96
+ switch (key) {
97
+ case '':
98
+ // BODY[1.2.3] is a part without its MIME header
99
+ return (0, mimeparser_js_1.render)(node, true);
100
+ case 'MIME':
101
+ return (0, mimeparser_js_1.headerSection)(node);
102
+ case 'TEXT':
103
+ return message ? (0, mimeparser_js_1.render)(message, true) : '';
104
+ case 'HEADER':
105
+ return message ? (0, mimeparser_js_1.headerSection)(message) : '';
106
+ default: {
107
+ // HEADER.FIELDS and HEADER.FIELDS.NOT
108
+ if (!message) {
109
+ return '';
110
+ }
111
+ const wanted = key === 'HEADER.FIELDS';
112
+ let value = '';
113
+ (message.header || []).forEach((line) => {
114
+ const name = line.split(':')[0].toUpperCase().trim();
115
+ if (fields.indexOf(name) >= 0 === wanted) {
116
+ value += line + '\r\n';
117
+ }
118
+ });
119
+ return value + '\r\n';
120
+ }
121
+ }
122
+ }
123
+ /**
124
+ * Applies the partial range of a BODY[]<start.length> or BINARY[]<start.length> item
125
+ *
126
+ * @param {String} value Section contents
127
+ * @param {Array} [partial] Parsed partial range
128
+ * @return {String} The requested slice, or the whole value without a range
129
+ */
130
+ function applyPartial(value, partial) {
131
+ if (!partial) {
132
+ return value;
133
+ }
134
+ // RFC 3501 9: partial = "<" number "." nz-number ">"
135
+ if (partial.length !== 2 || !(partial[1] > 0)) {
136
+ throw new Error('Invalid partial range, expecting <start.length>');
137
+ }
138
+ return value.substr(partial[0], partial[1]);
139
+ }
140
+ fetchHandlers.BODY = function (connection, message, query) {
141
+ const data = (0, mimeparser_js_1.getMessageData)(message);
142
+ if (!query.section) {
143
+ if (query.partial) {
144
+ throw new Error('BODY without a section does not take a partial range');
145
+ }
146
+ return (0, bodystructure_js_1.default)(data.tree, {
147
+ body: true,
148
+ upperCaseKeys: true,
149
+ messageGlobal: connection.messageGlobal
150
+ });
151
+ }
152
+ return {
153
+ type: 'LITERAL',
154
+ value: applyPartial(getSection(data, query, connection.messageGlobal), query.partial)
155
+ };
156
+ };
157
+ fetchHandlers.INTERNALDATE = function (connection, message) {
158
+ return message.internaldate;
159
+ };
160
+ fetchHandlers.RFC822 = function (connection, message) {
161
+ return {
162
+ type: 'LITERAL',
163
+ value: (0, mimeparser_js_1.getMessageData)(message).raw
164
+ };
165
+ };
166
+ // RFC 3501 6.4.5: RFC822 and RFC822.TEXT set \Seen, RFC822.HEADER is BODY.PEEK[HEADER] and does not
167
+ fetchHandlers.RFC822.setsSeen = true;
168
+ fetchHandlers['RFC822.SIZE'] = function (connection, message) {
169
+ return (0, mimeparser_js_1.getMessageData)(message).raw.length;
170
+ };
171
+ fetchHandlers['RFC822.HEADER'] = function (connection, message) {
172
+ return {
173
+ type: 'LITERAL',
174
+ value: (0, mimeparser_js_1.headerSection)((0, mimeparser_js_1.getMessageData)(message).tree)
175
+ };
176
+ };
177
+ fetchHandlers['RFC822.TEXT'] = function (connection, message) {
178
+ return {
179
+ type: 'LITERAL',
180
+ value: (0, mimeparser_js_1.render)((0, mimeparser_js_1.getMessageData)(message).tree, true)
181
+ };
182
+ };
183
+ fetchHandlers['RFC822.TEXT'].setsSeen = true;
184
+ {
185
+ const defaultExport = exports.default;
186
+ if (defaultExport && (typeof defaultExport === 'function' || typeof defaultExport === 'object')) {
187
+ for (const key of Object.keys(exports)) {
188
+ if (key !== 'default' && !(key in defaultExport)) {
189
+ defaultExport[key] = exports[key];
190
+ }
191
+ }
192
+ Object.defineProperty(defaultExport, 'default', { value: defaultExport, enumerable: false, writable: true, configurable: true });
193
+ module.exports = defaultExport;
194
+ }
195
+ }
@@ -0,0 +1,17 @@
1
+ import type { IMAPConnection } from '../../types.js';
2
+ declare const INVALID_KEYWORD_CHAR: RegExp;
3
+ /**
4
+ * System flags are case-insensitive, so "\seen" becomes "\Seen"
5
+ *
6
+ * @param {String} flag Flag value
7
+ * @return {String} Normalized flag
8
+ */
9
+ declare function normalizeSystemFlag(flag: string): string;
10
+ /**
11
+ * Throws if a flag can not be stored: an unknown system flag (including \Recent) or an invalid keyword
12
+ *
13
+ * @param {Object} connection IMAP connection
14
+ * @param {String} flag Normalized flag value
15
+ */
16
+ declare function checkSystemFlags(connection: IMAPConnection, flag: string): void;
17
+ export { INVALID_KEYWORD_CHAR, normalizeSystemFlag, checkSystemFlags };
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.INVALID_KEYWORD_CHAR = void 0;
4
+ exports.normalizeSystemFlag = normalizeSystemFlag;
5
+ exports.checkSystemFlags = checkSystemFlags;
6
+ // RFC 3501 9: flag-keyword = atom = 1*ATOM-CHAR, so a keyword can not contain atom-specials:
7
+ // "(" / ")" / "{" / SP / CTL / list-wildcards / quoted-specials / resp-specials. 8-bit octets are
8
+ // allowed, the parser accepts them in atoms as well
9
+ // eslint-disable-next-line no-control-regex
10
+ const INVALID_KEYWORD_CHAR = /[\x00-\x1f\x7f (){%*"\\\]]/;
11
+ exports.INVALID_KEYWORD_CHAR = INVALID_KEYWORD_CHAR;
12
+ /**
13
+ * System flags are case-insensitive, so "\seen" becomes "\Seen"
14
+ *
15
+ * @param {String} flag Flag value
16
+ * @return {String} Normalized flag
17
+ */
18
+ function normalizeSystemFlag(flag) {
19
+ if (flag.charAt(0) === '\\') {
20
+ flag = flag.charAt(0) + flag.charAt(1).toUpperCase() + flag.substr(2).toLowerCase();
21
+ }
22
+ return flag;
23
+ }
24
+ /**
25
+ * Throws if a flag can not be stored: an unknown system flag (including \Recent) or an invalid keyword
26
+ *
27
+ * @param {Object} connection IMAP connection
28
+ * @param {String} flag Normalized flag value
29
+ */
30
+ function checkSystemFlags(connection, flag) {
31
+ if (flag.charAt(0) === '\\') {
32
+ if (connection.server.systemFlags.indexOf(flag) < 0) {
33
+ throw new Error('Invalid system flag ' + flag);
34
+ }
35
+ }
36
+ else if (!flag || INVALID_KEYWORD_CHAR.test(flag)) {
37
+ throw new Error('Invalid flag keyword ' + JSON.stringify(flag));
38
+ }
39
+ }