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,85 @@
1
+ import type { Attribute, IMAPConnection, IMAPError, IMAPServer, Message, MessageRange, ParsedCommand } from '../../types.js';
2
+ /** The type of a search key argument: a type name, or a function that parses the value and throws for an invalid one */
3
+ export type SearchArgumentType = string | ((value: string) => any);
4
+ /** The argument types of a search key, or a function that decides them from the criteria that follow the key */
5
+ export type SearchKeyTypes = SearchArgumentType[] | ((list: Attribute[]) => SearchArgumentType[]);
6
+ /** A node of the query tree that the search builds from the criteria */
7
+ export interface SearchNode {
8
+ key: string;
9
+ args: any[];
10
+ /** the messages of a sequence set (`_SEQ`) or a UID set */
11
+ set?: Set<Message> | undefined;
12
+ /** the lower cased string to look for */
13
+ needle?: string | undefined;
14
+ }
15
+ /** Resolves a sequence set of the criteria */
16
+ export type RangeResolver = (range: string, isUid: boolean) => MessageRange;
17
+ /** The result of a search */
18
+ export interface SearchResult {
19
+ /** the matching messages */
20
+ list: Message[];
21
+ /** sequence numbers by UID */
22
+ numbers: Record<number, number>;
23
+ /** the search keys used in the criteria, other than sequence sets */
24
+ keys: Set<string>;
25
+ /** checks a message against the same criteria later */
26
+ matches: (message: Message, index: number) => boolean;
27
+ }
28
+ /**
29
+ * Creates an error that is reported to the client as BAD
30
+ */
31
+ declare function badError(message: string): IMAPError;
32
+ /**
33
+ * Date of a date-time value, disregarding time and timezone, as a comparable YYYY-MM-DD string,
34
+ * or false when it can not be parsed
35
+ *
36
+ * @param {String} dateTime Date-time value, e.g. "14-Sep-2013 21:22:28 -0300"
37
+ * @return {String|Boolean} date or false
38
+ */
39
+ declare function getDateKey(dateTime: string): string | false;
40
+ /**
41
+ * Converts the parsed search criteria of a command to the values the search takes, parenthesized lists stay nested
42
+ *
43
+ * @param {Array} attributes Parsed arguments
44
+ * @return {Array} values
45
+ * @throws {Error} BAD error for an argument that can not be a search key or its value
46
+ */
47
+ declare function criteriaValues(attributes: Attribute[]): any[];
48
+ /**
49
+ * Answers a failed search with NO, or BAD for `err.imapResponse` "BAD": the BADCHARSET response code with the
50
+ * supported charsets (RFC 3501 section 7.1, RFC 5256 section 3), or the response code a search limit set
51
+ * (`err.responseCode`), and the text
52
+ *
53
+ * @param {Object} connection IMAP connection
54
+ * @param {Object} parsed Parsed command
55
+ * @param {String} data Raw command
56
+ * @param {Error} err Search error
57
+ * @param {String} description Description for output handlers
58
+ */
59
+ declare function sendSearchError(connection: IMAPConnection, parsed: ParsedCommand, data: string, err: IMAPError, description: string): void;
60
+ /**
61
+ * Checks if SEARCH criteria refer to messages by sequence number (RFC 3501 section 5.5), that is,
62
+ * if a sequence set is used as a search key. Arguments of search keys, like the UID set of UID
63
+ * or a string that looks like a number, are not search keys.
64
+ *
65
+ * @param {Object} server IMAP server
66
+ * @param {Array} attributes Parsed SEARCH arguments, nested lists are arrays
67
+ * @return {Boolean} true if a sequence set key occurs
68
+ */
69
+ declare function hasSequenceSetKey(server: IMAPServer, attributes: Attribute[]): boolean;
70
+ /**
71
+ * Searches messages. Errors thrown for the client are answered with BAD when `imapResponse` is "BAD",
72
+ * otherwise NO. SORT and THREAD send `responseCode` (a list of atoms) as the response code
73
+ *
74
+ * @param {Object} connection IMAP connection
75
+ * @param {Array} messageSource Messages of the selected mailbox, as the session sees them
76
+ * @param {Array} params Search criteria: strings, and arrays for parenthesized lists
77
+ * @param {Function} [getMessageRange] Resolves the sequence sets of the criteria, `(range, isUid)`, defaults to
78
+ * the selected mailbox of the connection. Used to search a mailbox that is not selected
79
+ * @return {Object} `{ list, numbers, keys, matches }`, the matching messages, the sequence numbers by UID,
80
+ * the set of search keys used in the criteria and a `matches(message, index)` function that checks
81
+ * a message against the same criteria later. Sequence sets in the criteria stay as they were resolved
82
+ * now, they are not evaluated again
83
+ */
84
+ export default function searchHandlers(connection: IMAPConnection, messageSource: Message[], params: any, getMessageRange?: RangeResolver | null): SearchResult;
85
+ export { hasSequenceSetKey, getDateKey, badError, criteriaValues, sendSearchError };
@@ -1,11 +1,8 @@
1
- 'use strict';
2
-
3
- const { isUtf8 } = require('buffer');
4
- const { getMessageData, render } = require('../../mimeparser');
5
- const { monthIndex, dateKey, parseDateTime, parseHeaderDate } = require('../../dates');
6
- const { MAX_NUMBER, MAX_NUMBER64, isNumber } = require('../../numbers');
7
- const { decodeHeader, decodeUtf8 } = require('../../encoded-words');
8
-
1
+ import { isUtf8 } from 'node:buffer';
2
+ import { getMessageData, render } from '../../mimeparser.js';
3
+ import { monthIndex, dateKey, parseDateTime, parseHeaderDate } from '../../dates.js';
4
+ import { MAX_NUMBER, MAX_NUMBER64, isNumber } from '../../numbers.js';
5
+ import { decodeHeader, decodeUtf8 } from '../../encoded-words.js';
9
6
  // RFC 3501 6.4.4 search keys and their arguments
10
7
  const searchKeys = {
11
8
  ALL: [],
@@ -44,10 +41,8 @@ const searchKeys = {
44
41
  UNKEYWORD: ['string'],
45
42
  UNSEEN: []
46
43
  };
47
-
48
44
  // Charsets accepted for the CHARSET argument (RFC 3501 6.4.4: US-ASCII must be supported)
49
45
  const charsets = ['US-ASCII', 'UTF-8'];
50
-
51
46
  /**
52
47
  * Creates an error that is reported to the client as BAD
53
48
  */
@@ -56,7 +51,6 @@ function badError(message) {
56
51
  err.imapResponse = 'BAD';
57
52
  return err;
58
53
  }
59
-
60
54
  /**
61
55
  * Parses an RFC 3501 date argument (date-day "-" date-month "-" date-year) to a comparable YYYY-MM-DD string
62
56
  */
@@ -68,7 +62,6 @@ function parseQueryDate(value) {
68
62
  }
69
63
  return date;
70
64
  }
71
-
72
65
  /**
73
66
  * Date of a date-time value, disregarding time and timezone, as a comparable YYYY-MM-DD string,
74
67
  * or false when it can not be parsed
@@ -80,14 +73,12 @@ function getDateKey(dateTime) {
80
73
  const date = parseDateTime(dateTime);
81
74
  return date ? dateKey(date.day, date.month, date.year) : false;
82
75
  }
83
-
84
76
  /**
85
77
  * Date of the internal date of a message, disregarding time and timezone, or false when it can not be parsed
86
78
  */
87
79
  function getInternalDate(message) {
88
80
  return getDateKey(message.internaldate);
89
81
  }
90
-
91
82
  /**
92
83
  * Date of the Date header of a message, disregarding time and timezone (RFC 3501 section 6.4.4, unlike the
93
84
  * sent date of SORT it is not adjusted to UTC). Falls back to the internal date
@@ -96,7 +87,6 @@ function getSentDate(message) {
96
87
  const date = parseHeaderDate(getMessageData(message).tree.parsedHeader.date);
97
88
  return date ? dateKey(date.day, date.month, date.year) : getInternalDate(message);
98
89
  }
99
-
100
90
  /**
101
91
  * Converts the parsed search criteria of a command to the values the search takes, parenthesized lists stay nested
102
92
  *
@@ -116,7 +106,6 @@ function criteriaValues(attributes) {
116
106
  };
117
107
  return attributes.map(convert);
118
108
  }
119
-
120
109
  /**
121
110
  * Answers a failed search with NO, or BAD for `err.imapResponse` "BAD": the BADCHARSET response code with the
122
111
  * supported charsets (RFC 3501 section 7.1, RFC 5256 section 3), or the response code a search limit set
@@ -133,15 +122,15 @@ function sendSearchError(connection, parsed, data, err, description) {
133
122
  if (err.code === 'BADCHARSET') {
134
123
  attributes.push({
135
124
  type: 'SECTION',
136
- section: [{ type: 'ATOM', value: 'BADCHARSET' }, err.charsets.map(value => ({ type: 'ATOM', value }))]
125
+ section: [{ type: 'ATOM', value: 'BADCHARSET' }, err.charsets.map((value) => ({ type: 'ATOM', value }))]
137
126
  });
138
- } else if (err.responseCode) {
139
- attributes.push({ type: 'SECTION', section: err.responseCode.map(value => ({ type: 'ATOM', value: String(value) })) });
127
+ }
128
+ else if (err.responseCode) {
129
+ attributes.push({ type: 'SECTION', section: err.responseCode.map((value) => ({ type: 'ATOM', value: String(value) })) });
140
130
  }
141
131
  attributes.push({ type: 'TEXT', value: err.message });
142
132
  connection.send({ tag: parsed.tag, command: err.imapResponse === 'BAD' ? 'BAD' : 'NO', attributes }, description, parsed, data);
143
133
  }
144
-
145
134
  /**
146
135
  * Lower cases ASCII letters only, so that 8-bit octets in binary strings stay intact. RFC 9051
147
136
  * section 6.4.4 asks for case insensitive matching only within the ASCII range
@@ -149,7 +138,6 @@ function sendSearchError(connection, parsed, data, err, description) {
149
138
  function asciiLowerCase(str) {
150
139
  return str.replace(/[A-Z]+/g, chars => chars.toLowerCase());
151
140
  }
152
-
153
141
  /**
154
142
  * Checks if a string contains another one, ignoring ASCII case
155
143
  *
@@ -159,7 +147,6 @@ function asciiLowerCase(str) {
159
147
  function contains(haystack, needle) {
160
148
  return asciiLowerCase(haystack).indexOf(needle) >= 0;
161
149
  }
162
-
163
150
  /**
164
151
  * Returns the search keys with the types of their arguments, including the keys that plugins
165
152
  * define in `server.searchHandlers`. If a plugin handler takes more than 3 params
@@ -182,7 +169,6 @@ function getSearchKeys(server) {
182
169
  });
183
170
  return keys;
184
171
  }
185
-
186
172
  /**
187
173
  * Checks if SEARCH criteria refer to messages by sequence number (RFC 3501 section 5.5), that is,
188
174
  * if a sequence set is used as a search key. Arguments of search keys, like the UID set of UID
@@ -194,7 +180,7 @@ function getSearchKeys(server) {
194
180
  */
195
181
  function hasSequenceSetKey(server, attributes) {
196
182
  const keys = getSearchKeys(server);
197
- const walk = list => {
183
+ const walk = (list) => {
198
184
  // arguments of the previous key that are values, not keys
199
185
  let skip = 0;
200
186
  return list.some((item, i) => {
@@ -209,14 +195,16 @@ function hasSequenceSetKey(server, attributes) {
209
195
  const key = value.toUpperCase();
210
196
  if (key === 'CHARSET' && i === 0) {
211
197
  skip = 1;
212
- } else if (Object.hasOwn(keys, key)) {
198
+ }
199
+ else if (Object.hasOwn(keys, key)) {
213
200
  // NOT and OR take keys as arguments, these are checked as keys
214
201
  let types = keys[key];
215
202
  if (typeof types === 'function') {
216
203
  types = types(list.slice(i + 1).map(next => (Array.isArray(next) ? next : ((next && next.value) || '').toString())));
217
204
  }
218
- skip = types.filter(type => type !== 'key').length;
219
- } else if (/^[\d*][\d*,:]*$/.test(value)) {
205
+ skip = types.filter((type) => type !== 'key').length;
206
+ }
207
+ else if (/^[\d*][\d*,:]*$/.test(value)) {
220
208
  return true;
221
209
  }
222
210
  return false;
@@ -224,7 +212,6 @@ function hasSequenceSetKey(server, attributes) {
224
212
  };
225
213
  return walk([].concat(attributes || []));
226
214
  }
227
-
228
215
  /**
229
216
  * Searches messages. Errors thrown for the client are answered with BAD when `imapResponse` is "BAD",
230
217
  * otherwise NO. SORT and THREAD send `responseCode` (a list of atoms) as the response code
@@ -239,21 +226,18 @@ function hasSequenceSetKey(server, attributes) {
239
226
  * a message against the same criteria later. Sequence sets in the criteria stay as they were resolved
240
227
  * now, they are not evaluated again
241
228
  */
242
- module.exports = function (connection, messageSource, params, getMessageRange) {
229
+ export default function searchHandlers(connection, messageSource, params, getMessageRange) {
243
230
  const resolveRange = getMessageRange || ((range, isUid) => connection.getMessageRange(range, isUid));
244
231
  const numbers = {};
245
232
  // search keys used in the criteria, other than sequence sets
246
233
  const usedKeys = new Set();
247
234
  const keys = getSearchKeys(connection.server);
248
235
  const pluginHandlers = connection.server.searchHandlers;
249
-
250
236
  params = [].concat(params || []);
251
-
252
237
  // IMAP4rev1 search strings are US-ASCII unless a CHARSET is given (RFC 3501 6.4.4). A plugin can
253
238
  // fix the charset of a session with connection.searchCharset, e.g. UTF-8 after ENABLE UTF8=ACCEPT,
254
239
  // or change the default with connection.defaultSearchCharset (IMAP4rev2 assumes UTF-8, RFC 9051 6.4.4)
255
240
  let searchCharset = connection.searchCharset || connection.defaultSearchCharset || 'US-ASCII';
256
-
257
241
  if (typeof params[0] === 'string' && params[0].toUpperCase() === 'CHARSET') {
258
242
  if (connection.searchCharset) {
259
243
  // RFC 9755 section 3: a CHARSET conflicts with the charset of the session
@@ -273,7 +257,6 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
273
257
  }
274
258
  searchCharset = charset.toUpperCase();
275
259
  }
276
-
277
260
  // strings must be valid in the declared charset, a client must not send 8-bit text as US-ASCII
278
261
  const checkString = (key, value) => {
279
262
  if (searchCharset === 'US-ASCII' && /[\u0080-\u00ff]/.test(value)) {
@@ -284,49 +267,42 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
284
267
  }
285
268
  return value;
286
269
  };
287
-
288
270
  if (!params.length) {
289
271
  throw badError('SEARCH expects search criteria, empty query given');
290
272
  }
291
-
292
273
  // Parses one search key and its arguments from a list of criteria into a node of the query tree
293
- const parseKey = list => {
274
+ const parseKey = (list) => {
294
275
  if (!list.length) {
295
276
  throw badError('Unexpected end of search criteria');
296
277
  }
297
-
298
278
  const param = list.shift();
299
-
300
279
  if (Array.isArray(param)) {
301
280
  // a parenthesized list of keys that all must match
302
281
  return { key: 'AND', args: parseList([].concat(param)) };
303
282
  }
304
-
305
283
  const key = param.toUpperCase();
306
-
307
284
  // a plugin can remove keys from a session, e.g. NEW, OLD and RECENT are not in the IMAP4rev2 grammar
308
285
  if (!Object.prototype.hasOwnProperty.call(keys, key) || (connection.disabledSearchKeys && connection.disabledSearchKeys.has(key))) {
309
286
  // a sequence set, plugins may support other forms of it than numbers
310
287
  let range;
311
288
  try {
312
289
  range = resolveRange(param, false);
313
- } catch (E) {
290
+ }
291
+ catch (E) {
314
292
  throw /^[\d,:*]+$/.test(param) ? E : badError('Invalid search key ' + param);
315
293
  }
316
294
  return { key: '_SEQ', args: [range] };
317
295
  }
318
-
319
296
  usedKeys.add(key);
320
- const types = typeof keys[key] === 'function' ? keys[key](list) : keys[key];
321
- const args = types.map(type => {
297
+ const keyTypes = keys[key];
298
+ const types = typeof keyTypes === 'function' ? keyTypes(list) : keyTypes;
299
+ const args = types.map((type) => {
322
300
  if (type === 'key') {
323
301
  return parseKey(list);
324
302
  }
325
-
326
303
  if (!list.length || typeof list[0] !== 'string') {
327
304
  throw badError(key + ' expects ' + types.length + ' argument' + (types.length > 1 ? 's' : ''));
328
305
  }
329
-
330
306
  const value = list.shift();
331
307
  if (typeof type === 'function') {
332
308
  return type(value);
@@ -350,11 +326,9 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
350
326
  return checkString(key, value);
351
327
  }
352
328
  });
353
-
354
329
  return { key, args };
355
330
  };
356
-
357
- const parseList = list => {
331
+ const parseList = (list) => {
358
332
  if (!list.length) {
359
333
  throw badError('Empty search criteria list');
360
334
  }
@@ -364,12 +338,10 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
364
338
  }
365
339
  return nodes;
366
340
  };
367
-
368
341
  const query = { key: 'AND', args: parseList(params) };
369
-
370
342
  // a sequence set argument resolves to [number, message] pairs, turn these into a lookup set
371
- const toMessageSet = range => new Set(range.map(item => item[1]));
372
- const prepare = node => {
343
+ const toMessageSet = (range) => new Set(range.map(item => item[1]));
344
+ const prepare = (node) => {
373
345
  if (node.key === '_SEQ' || node.key === 'UID') {
374
346
  node.set = toMessageSet(node.args[0]);
375
347
  }
@@ -378,40 +350,38 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
378
350
  // decoded too (RFC 9051 section 6.4.4)
379
351
  if (['BODY', 'TEXT'].indexOf(node.key) >= 0) {
380
352
  node.needle = asciiLowerCase(node.args[0]);
381
- } else if (['BCC', 'CC', 'FROM', 'HEADER', 'SUBJECT', 'TO'].indexOf(node.key) >= 0) {
353
+ }
354
+ else if (['BCC', 'CC', 'FROM', 'HEADER', 'SUBJECT', 'TO'].indexOf(node.key) >= 0) {
382
355
  node.needle = asciiLowerCase(decodeUtf8(node.args[node.key === 'HEADER' ? 1 : 0]));
383
356
  }
384
- node.args.forEach(arg => {
357
+ node.args.forEach((arg) => {
385
358
  if (arg && typeof arg === 'object' && arg.key) {
386
359
  prepare(arg);
387
360
  }
388
361
  });
389
362
  };
390
363
  prepare(query);
391
-
392
364
  const hasFlag = (message, flag) => message.flags.indexOf(flag) >= 0;
393
-
394
365
  // compares the unfolded values of the header lines with that name, after decoding their encoded
395
366
  // words. RFC 3501 and RFC 9051 section 6.4.4: [MIME-HDRS] strings in headers MUST be decoded before comparing text
396
367
  const matchHeader = (message, name, needle) => {
397
368
  name = name.toLowerCase();
398
- return (getMessageData(message).tree.header || []).some(line => {
369
+ return (getMessageData(message).tree.header || []).some((line) => {
399
370
  const colon = line.indexOf(':');
400
371
  const lineName = (colon < 0 ? line : line.substr(0, colon)).trim().toLowerCase();
401
372
  const value = colon < 0 ? '' : line.substr(colon + 1).replace(/\r?\n(?=[ \t])/g, '');
402
373
  return lineName === name && contains(decodeHeader(value), needle);
403
374
  });
404
375
  };
405
-
406
376
  const matches = (node, message, index) => {
407
377
  const args = node.args;
408
378
  if (Object.prototype.hasOwnProperty.call(pluginHandlers, node.key)) {
409
379
  // plugin defined search key, which may also override a built-in one
410
- return !!pluginHandlers[node.key].apply(null, [connection, message, index].concat(args));
380
+ return !!pluginHandlers[node.key](connection, message, index, ...args);
411
381
  }
412
382
  switch (node.key) {
413
383
  case 'AND':
414
- return args.every(arg => matches(arg, message, index));
384
+ return args.every((arg) => matches(arg, message, index));
415
385
  case '_SEQ':
416
386
  case 'UID':
417
387
  return node.set.has(message);
@@ -492,11 +462,9 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
492
462
  return false;
493
463
  }
494
464
  };
495
-
496
465
  // plugins can narrow down the messages that are looked at (server.searchLimits), sequence numbers stay as they are
497
466
  const searched = connection.server.searchLimits.reduce((messages, limit) => limit(connection, messages, query) || messages, messageSource);
498
467
  const searchedSet = searched !== messageSource && new Set(searched);
499
-
500
468
  const list = [];
501
469
  messageSource.forEach((message, i) => {
502
470
  if (searchedSet && !searchedSet.has(message)) {
@@ -507,17 +475,11 @@ module.exports = function (connection, messageSource, params, getMessageRange) {
507
475
  list.push(message);
508
476
  }
509
477
  });
510
-
511
478
  return {
512
479
  list,
513
480
  numbers,
514
481
  keys: usedKeys,
515
482
  matches: (message, index) => matches(query, message, index)
516
483
  };
517
- };
518
-
519
- module.exports.hasSequenceSetKey = hasSequenceSetKey;
520
- module.exports.getDateKey = getDateKey;
521
- module.exports.badError = badError;
522
- module.exports.criteriaValues = criteriaValues;
523
- module.exports.sendSearchError = sendSearchError;
484
+ }
485
+ export { hasSequenceSetKey, getDateKey, badError, criteriaValues, sendSearchError };
@@ -0,0 +1,34 @@
1
+ import type { Attribute, IMAPConnection, IMAPResponse, IMAPServer, Mailbox, ParsedCommand } from '../../types.js';
2
+ /**
3
+ * Validates a list of STATUS data item names (RFC 3501 section 9, "(" status-att *(SP status-att) ")")
4
+ *
5
+ * @param {Object} server IMAPServer instance
6
+ * @param {Array} list Parsed list of status items
7
+ * @param {Object} [connection] IMAP connection, its `disabledStatusItems` set lists items the session can not use,
8
+ * `addedStatusItems` the items only this session can use (DELETED after ENABLE IMAP4rev2)
9
+ * @return {Array} upper case item names
10
+ * @throws {Error} if the list is empty or has an invalid item, the message is for the BAD response
11
+ */
12
+ declare function parseStatusItems(server: IMAPServer, list: Attribute, connection?: IMAPConnection | null): string[];
13
+ /**
14
+ * Sends an untagged STATUS response
15
+ *
16
+ * @param {Object} connection IMAPConnection instance
17
+ * @param {String} path Storage name of the mailbox
18
+ * @param {Object} mailbox Mailbox object
19
+ * @param {Array} items Upper case item names from parseStatusItems
20
+ * @param {Object} parsed Parsed command
21
+ * @param {Object} data Command data
22
+ */
23
+ declare function sendStatus(connection: IMAPConnection, path: string, mailbox: Mailbox, items: string[], parsed: ParsedCommand, data: string): void;
24
+ /**
25
+ * Builds an untagged STATUS response
26
+ *
27
+ * @param {Object} connection IMAPConnection instance
28
+ * @param {String} path Storage name of the mailbox
29
+ * @param {Object} mailbox Mailbox object
30
+ * @param {Array} items Upper case item names
31
+ * @return {Object} STATUS response
32
+ */
33
+ declare function statusResponse(connection: IMAPConnection, path: string, mailbox: Mailbox, items: string[]): IMAPResponse;
34
+ export { parseStatusItems, sendStatus, statusResponse };
@@ -1,12 +1,9 @@
1
- 'use strict';
2
-
3
1
  /**
4
2
  * STATUS data items, shared by the STATUS command and the STATUS return option of LIST (LIST-STATUS,
5
3
  * RFC 5819). A STATUS item can only be requested when it is listed in `server.allowedStatus`.
6
4
  * Plugins add their items to `server.statusHandlers` (consulted before the built-in items) and to
7
5
  * `server.allowedStatus`.
8
6
  */
9
-
10
7
  const statusHandlers = {
11
8
  MESSAGES: (connection, mailbox) => mailbox.messages.length,
12
9
  RECENT: (connection, mailbox, status) => status.recent,
@@ -16,9 +13,7 @@ const statusHandlers = {
16
13
  // RFC 9051 section 6.3.11. Not in RFC 3501, QUOTA lists it in allowedStatus, IMAP4rev2 allows it per session
17
14
  DELETED: (connection, mailbox, status) => status.flags['\\Deleted'] || 0
18
15
  };
19
-
20
16
  // RFC 3501 section 9 atom = 1*ATOM-CHAR
21
-
22
17
  /**
23
18
  * Validates a list of STATUS data item names (RFC 3501 section 9, "(" status-att *(SP status-att) ")")
24
19
  *
@@ -43,7 +38,6 @@ function parseStatusItems(server, list, connection) {
43
38
  return name;
44
39
  });
45
40
  }
46
-
47
41
  /**
48
42
  * Sends an untagged STATUS response
49
43
  *
@@ -57,7 +51,6 @@ function parseStatusItems(server, list, connection) {
57
51
  function sendStatus(connection, path, mailbox, items, parsed, data) {
58
52
  connection.send(statusResponse(connection, path, mailbox, items), 'STATUS', parsed, data);
59
53
  }
60
-
61
54
  /**
62
55
  * Builds an untagged STATUS response
63
56
  *
@@ -81,5 +74,4 @@ function statusResponse(connection, path, mailbox, items) {
81
74
  attributes: [{ type: 'MAILBOX', value: path }, list]
82
75
  };
83
76
  }
84
-
85
- module.exports = { parseStatusItems, sendStatus, statusResponse };
77
+ export { parseStatusItems, sendStatus, statusResponse };
@@ -0,0 +1,3 @@
1
+ import type { StoreHandler } from '../../types.js';
2
+ declare const storeHandlers: Record<string, StoreHandler>;
3
+ export default storeHandlers;
@@ -1,52 +1,43 @@
1
- 'use strict';
2
-
3
- const { normalizeSystemFlag, checkSystemFlags } = require('./flags');
4
-
1
+ import { normalizeSystemFlag, checkSystemFlags } from './flags.js';
5
2
  const storeHandlers = {};
6
-
7
- module.exports = storeHandlers;
8
-
3
+ export default storeHandlers;
9
4
  function setFlags(connection, message, flags) {
5
+ // STORE runs in the Selected state
6
+ const mailbox = connection.selectedMailbox;
10
7
  const messageFlags = [];
11
8
  [].concat(flags).forEach(flag => {
12
9
  flag = normalizeSystemFlag(typeof flag === 'string' ? flag : String(flag.value || ''));
13
10
  checkSystemFlags(connection, flag);
14
-
15
11
  // Ignore if it is not in allowed list and only permament flags are allowed to use
16
- if (connection.selectedMailbox.permanentFlags.indexOf(flag) < 0 && !connection.selectedMailbox.allowPermanentFlags) {
12
+ if (mailbox.permanentFlags.indexOf(flag) < 0 && !mailbox.allowPermanentFlags) {
17
13
  return;
18
14
  }
19
-
20
15
  if (messageFlags.indexOf(flag) < 0) {
21
16
  messageFlags.push(flag);
22
17
  }
23
18
  });
24
19
  message.flags = messageFlags;
25
- connection.server.rememberFlags(connection.selectedMailbox, messageFlags);
20
+ connection.server.rememberFlags(mailbox, messageFlags);
26
21
  }
27
-
28
22
  function addFlags(connection, message, flags) {
23
+ const mailbox = connection.selectedMailbox;
29
24
  [].concat(flags).forEach(flag => {
30
25
  flag = normalizeSystemFlag(typeof flag === 'string' ? flag : String(flag.value || ''));
31
26
  checkSystemFlags(connection, flag);
32
-
33
27
  // Ignore if it is not in allowed list and only permament flags are allowed to use
34
- if (connection.selectedMailbox.permanentFlags.indexOf(flag) < 0 && !connection.selectedMailbox.allowPermanentFlags) {
28
+ if (mailbox.permanentFlags.indexOf(flag) < 0 && !mailbox.allowPermanentFlags) {
35
29
  return;
36
30
  }
37
-
38
31
  if (message.flags.indexOf(flag) < 0) {
39
32
  message.flags.push(flag);
40
33
  }
41
34
  });
42
- connection.server.rememberFlags(connection.selectedMailbox, message.flags);
35
+ connection.server.rememberFlags(mailbox, message.flags);
43
36
  }
44
-
45
37
  function removeFlags(connection, message, flags) {
46
38
  [].concat(flags).forEach(flag => {
47
39
  flag = normalizeSystemFlag(typeof flag === 'string' ? flag : String(flag.value || ''));
48
40
  checkSystemFlags(connection, flag);
49
-
50
41
  if (message.flags.indexOf(flag) >= 0) {
51
42
  for (let i = 0; i < message.flags.length; i++) {
52
43
  if (message.flags[i] === flag) {
@@ -57,7 +48,6 @@ function removeFlags(connection, message, flags) {
57
48
  }
58
49
  });
59
50
  }
60
-
61
51
  function sendUpdate(connection, parsed, data, index, message) {
62
52
  const resp = [
63
53
  {
@@ -71,7 +61,6 @@ function sendUpdate(connection, parsed, data, index, message) {
71
61
  };
72
62
  })
73
63
  ];
74
-
75
64
  if ((parsed.command || '').toUpperCase() === 'UID STORE') {
76
65
  resp.push({
77
66
  type: 'ATOM',
@@ -79,49 +68,36 @@ function sendUpdate(connection, parsed, data, index, message) {
79
68
  });
80
69
  resp.push(message.uid);
81
70
  }
82
-
83
- connection.send(
84
- {
85
- tag: '*',
86
- attributes: [
87
- index,
88
- {
89
- type: 'ATOM',
90
- value: 'FETCH'
91
- },
92
- resp
93
- ]
94
- },
95
- 'FLAG UPDATE',
96
- parsed,
97
- data,
98
- message
99
- );
71
+ connection.send({
72
+ tag: '*',
73
+ attributes: [
74
+ index,
75
+ {
76
+ type: 'ATOM',
77
+ value: 'FETCH'
78
+ },
79
+ resp
80
+ ]
81
+ }, 'FLAG UPDATE', parsed, data, message);
100
82
  }
101
-
102
83
  storeHandlers.FLAGS = function (connection, message, flags, index, parsed, data) {
103
84
  setFlags(connection, message, flags);
104
85
  sendUpdate(connection, parsed, data, index, message);
105
86
  };
106
-
107
87
  storeHandlers['+FLAGS'] = function (connection, message, flags, index, parsed, data) {
108
88
  addFlags(connection, message, flags);
109
89
  sendUpdate(connection, parsed, data, index, message);
110
90
  };
111
-
112
91
  storeHandlers['-FLAGS'] = function (connection, message, flags, index, parsed, data) {
113
92
  removeFlags(connection, message, flags);
114
93
  sendUpdate(connection, parsed, data, index, message);
115
94
  };
116
-
117
95
  storeHandlers['FLAGS.SILENT'] = function (connection, message, flags) {
118
96
  setFlags(connection, message, flags);
119
97
  };
120
-
121
98
  storeHandlers['+FLAGS.SILENT'] = function (connection, message, flags) {
122
99
  addFlags(connection, message, flags);
123
100
  };
124
-
125
101
  storeHandlers['-FLAGS.SILENT'] = function (connection, message, flags) {
126
102
  removeFlags(connection, message, flags);
127
103
  };
@@ -0,0 +1,2 @@
1
+ import type { CommandHandler } from '../types.js';
2
+ export declare const commands: Record<string, CommandHandler>;