imapkit 4.0.2 → 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 +34 -75
  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
@@ -1,31 +1,23 @@
1
- 'use strict';
2
-
3
1
  /**
4
2
  * @help Adds CONTEXT=SEARCH [RFC5267] capability, loads ESEARCH as well
5
3
  * @help SEARCH RETURN (UPDATE) sends ADDTO and REMOVEFROM updates as the result changes, until CANCELUPDATE or the mailbox is closed
6
4
  * @help SEARCH RETURN (PARTIAL 1:100) returns a window of the results, the CONTEXT hint is accepted and ignored
7
5
  * @help Server option "maxSearchContexts" (default 10) limits the updating contexts of a session, above it NOUPDATE is sent
8
6
  */
9
-
10
- const esearch = require('./esearch');
11
- const { buildCorrelator, registerPartialOption, toSequenceSet, toOrderedSet } = require('../esearch');
12
- const { states } = require('../command-states');
13
-
7
+ import esearch from './esearch.js';
8
+ import { buildCorrelator, registerPartialOption, toSequenceSet, toOrderedSet } from '../esearch.js';
9
+ import { states } from '../command-states.js';
14
10
  const DEFAULT_MAX_CONTEXTS = 10;
15
-
16
11
  // commands that close the selected mailbox, updates cease with them (RFC 5267 section 4.3)
17
12
  const CLOSING_COMMANDS = new Set(['SELECT', 'EXAMINE', 'CLOSE', 'UNSELECT']);
18
-
19
13
  // searching commands that can create updating contexts, SORT and UID SORT only with CONTEXT=SORT (see the ESORT plugin)
20
14
  const SEARCHING_COMMANDS = new Set(['SEARCH', 'UID SEARCH', 'SORT', 'UID SORT']);
21
-
22
- const getContexts = connection => {
15
+ const getContexts = (connection) => {
23
16
  if (!connection.searchContexts) {
24
17
  connection.searchContexts = new Map();
25
18
  }
26
19
  return connection.searchContexts;
27
20
  };
28
-
29
21
  /**
30
22
  * Groups updates of one kind into context position and result set pairs (RFC 5267 sections 4.3.3 and
31
23
  * 4.3.4). Updates of a searching command all use position 0 and form one set in mailbox order. Updates of
@@ -43,7 +35,8 @@ const groupUpdates = (updates, isRemoval) => {
43
35
  const next = last && (isRemoval || !position ? last.position : last.position + last.values.length);
44
36
  if (last && position === next) {
45
37
  last.values.push(value);
46
- } else {
38
+ }
39
+ else {
47
40
  groups.push({ position, values: [value] });
48
41
  }
49
42
  });
@@ -54,7 +47,6 @@ const groupUpdates = (updates, isRemoval) => {
54
47
  });
55
48
  return payload;
56
49
  };
57
-
58
50
  /**
59
51
  * Sends ADDTO and REMOVEFROM updates of a context (RFC 5267 sections 4.3.3 and 4.3.4)
60
52
  *
@@ -76,12 +68,11 @@ const sendUpdate = (connection, context, removed, added) => {
76
68
  }
77
69
  connection.send({ tag: '*', command: 'ESEARCH', attributes }, 'ESEARCH UPDATE', null, null, context);
78
70
  };
79
-
80
71
  /**
81
72
  * Checks every updating context against the selected mailbox as the session sees it, and sends the
82
73
  * changes. Expunged messages are handled when their EXPUNGE response is sent
83
74
  */
84
- const checkContexts = connection => {
75
+ const checkContexts = (connection) => {
85
76
  const contexts = connection.searchContexts;
86
77
  const mailbox = connection.selectedMailbox;
87
78
  const messages = mailbox ? mailbox.messages : [];
@@ -92,32 +83,34 @@ const checkContexts = connection => {
92
83
  return;
93
84
  }
94
85
  const matching = messages.filter((message, i) => context.matches(message, i + 1));
95
- const getValue = message => (context.isUid ? message.uid : numbers.get(message));
86
+ // only messages of the mailbox get a value
87
+ const getValue = (message) => (context.isUid ? message.uid : numbers.get(message));
96
88
  const current = new Set(matching);
97
89
  const removed = [];
98
90
  const added = [];
99
-
100
91
  if (!context.compare) {
101
92
  // a searching command, positions are 0 (RFC 5267 section 4.3.3)
102
- context.results.forEach(message => {
93
+ context.results.forEach((message) => {
103
94
  // a message that is gone without an EXPUNGE response for this session is just dropped
104
95
  if (!current.has(message) && numbers.has(message)) {
105
96
  removed.push([0, getValue(message)]);
106
97
  }
107
98
  });
108
- matching.forEach(message => {
99
+ matching.forEach((message) => {
109
100
  if (!context.results.has(message)) {
110
101
  added.push([0, getValue(message)]);
111
102
  }
112
103
  });
113
- } else {
104
+ }
105
+ else {
114
106
  // a sorting command. The sort values of a message do not change, so the results that stay keep their order.
115
107
  // Removals are counted on the list as it shrinks, insertions in ascending order of their final position
116
108
  let kept = 0;
117
- context.order.forEach(message => {
109
+ context.order.forEach((message) => {
118
110
  if (current.has(message)) {
119
111
  kept++;
120
- } else if (numbers.has(message)) {
112
+ }
113
+ else if (numbers.has(message)) {
121
114
  removed.push([kept + 1, getValue(message)]);
122
115
  }
123
116
  });
@@ -128,14 +121,12 @@ const checkContexts = connection => {
128
121
  }
129
122
  });
130
123
  }
131
-
132
124
  context.results = current;
133
125
  if (removed.length || added.length) {
134
126
  sendUpdate(connection, context, removed, added);
135
127
  }
136
128
  });
137
129
  };
138
-
139
130
  /**
140
131
  * Removes expunged messages from the contexts that hold them, with one REMOVEFROM update per context
141
132
  *
@@ -144,7 +135,7 @@ const checkContexts = connection => {
144
135
  * @param {Number} seq Sequence number of the EXPUNGE response for a single message, null when there is none (VANISHED)
145
136
  */
146
137
  const removeExpunged = (connection, messages, seq) => {
147
- connection.searchContexts.forEach(context => {
138
+ connection.searchContexts.forEach((context) => {
148
139
  if (context.mailbox !== connection.selectedMailbox) {
149
140
  return;
150
141
  }
@@ -167,34 +158,24 @@ const removeExpunged = (connection, messages, seq) => {
167
158
  }
168
159
  });
169
160
  };
170
-
171
- module.exports = function (server) {
161
+ export default function contextSearchPlugin(server) {
172
162
  // CONTEXT=SORT loads this plugin as well, so it may be called twice
173
163
  if (server.addSearchContext) {
174
164
  return;
175
165
  }
176
-
177
166
  // the result options of CONTEXT=SEARCH extend the extended SEARCH command (RFC 5267 section 4.1)
178
167
  esearch(server);
179
-
180
168
  server.registerCapability('CONTEXT=SEARCH');
181
-
182
169
  const maxContexts = Math.max(Number(server.options.maxSearchContexts) || DEFAULT_MAX_CONTEXTS, 1);
183
-
184
170
  // RFC 5267 section 4.2: the server MAY ignore the CONTEXT hint
185
171
  server.searchReturnOptions.set('CONTEXT', { hint: true });
186
172
  // RFC 5267 section 4.3: UPDATE has no data of its own, but the ESEARCH response is still sent
187
173
  server.searchReturnOptions.set('UPDATE', { data: false, response: true, once: true });
188
174
  // RFC 5267 section 4.4
189
175
  registerPartialOption(server);
190
-
191
176
  // RFC 5267 section 4.3: UPDATE with the tag of an earlier searching command that still has an updating
192
177
  // context SHALL be rejected with BAD
193
- server.searchReturnChecks.push(
194
- (options, connection, parsed) =>
195
- options.has('UPDATE') && getContexts(connection).has(parsed.tag) && 'Tag ' + parsed.tag + ' is already in use by an updating search'
196
- );
197
-
178
+ server.searchReturnChecks.push((options, connection, parsed) => options.has('UPDATE') && getContexts(connection).has(parsed.tag) && 'Tag ' + parsed.tag + ' is already in use by an updating search');
198
179
  /**
199
180
  * Creates an updating context once a searching command with UPDATE has completed. Also used by
200
181
  * CONTEXT=SORT and by the ESEARCH command of MULTISEARCH
@@ -211,25 +192,20 @@ module.exports = function (server) {
211
192
  const contexts = getContexts(connection);
212
193
  if (contexts.size >= maxContexts) {
213
194
  // RFC 5267 section 4.3.1: an untagged NO with NOUPDATE, the other result options are still honoured
214
- connection.send(
215
- {
216
- tag: '*',
217
- command: 'NO',
218
- attributes: [
219
- {
220
- type: 'SECTION',
221
- section: [
222
- { type: 'ATOM', value: 'NOUPDATE' },
223
- { type: 'STRING', value: parsed.tag }
224
- ]
225
- },
226
- { type: 'TEXT', value: 'Too many updating contexts' }
227
- ]
228
- },
229
- 'NOUPDATE',
230
- parsed,
231
- data
232
- );
195
+ connection.send({
196
+ tag: '*',
197
+ command: 'NO',
198
+ attributes: [
199
+ {
200
+ type: 'SECTION',
201
+ section: [
202
+ { type: 'ATOM', value: 'NOUPDATE' },
203
+ { type: 'STRING', value: parsed.tag }
204
+ ]
205
+ },
206
+ { type: 'TEXT', value: 'Too many updating contexts' }
207
+ ]
208
+ }, 'NOUPDATE', parsed, data);
233
209
  return;
234
210
  }
235
211
  contexts.set(parsed.tag, {
@@ -243,36 +219,29 @@ module.exports = function (server) {
243
219
  correlatorMailbox: correlatorMailbox || null
244
220
  });
245
221
  };
246
-
247
222
  // RFC 5267 section 4.3.5: command-select =/ "CANCELUPDATE" 1*(SP quoted)
248
- server.setCommandHandler(
249
- 'CANCELUPDATE',
250
- (connection, parsed, data, callback) => {
251
- const tags = parsed.attributes || [];
252
- if (!tags.length || tags.some(tag => !tag || tag.type !== 'STRING')) {
253
- connection.sendStatus(parsed, data, 'BAD', 'CANCELUPDATE expects one or more quoted tags', false, 'CANCELUPDATE FAILED');
254
- return callback();
255
- }
256
- const contexts = getContexts(connection);
257
- const unknown = tags.find(tag => !contexts.has(tag.value));
258
- if (unknown) {
259
- // nothing is cancelled when a tag has no updating context
260
- connection.sendStatus(parsed, data, 'NO', 'Unknown tag', false, 'CANCELUPDATE FAILED');
261
- return callback();
262
- }
263
- tags.forEach(tag => contexts.delete(tag.value));
264
- connection.sendStatus(parsed, data, 'OK', 'Updates cancelled', false, 'CANCELUPDATE');
223
+ server.setCommandHandler('CANCELUPDATE', (connection, parsed, data, callback) => {
224
+ const tags = parsed.attributes || [];
225
+ if (!tags.length || tags.some(tag => !tag || tag.type !== 'STRING')) {
226
+ connection.sendStatus(parsed, data, 'BAD', 'CANCELUPDATE expects one or more quoted tags', false, 'CANCELUPDATE FAILED');
265
227
  return callback();
266
- },
267
- { states: states.SELECTED }
268
- );
269
-
228
+ }
229
+ const contexts = getContexts(connection);
230
+ const unknown = tags.find(tag => !contexts.has(tag.value));
231
+ if (unknown) {
232
+ // nothing is cancelled when a tag has no updating context
233
+ connection.sendStatus(parsed, data, 'NO', 'Unknown tag', false, 'CANCELUPDATE FAILED');
234
+ return callback();
235
+ }
236
+ tags.forEach(tag => contexts.delete(tag.value));
237
+ connection.sendStatus(parsed, data, 'OK', 'Updates cancelled', false, 'CANCELUPDATE');
238
+ return callback();
239
+ }, { states: states.SELECTED });
270
240
  // UNAUTHENTICATE (RFC 8437) closes the mailbox, so the updates end
271
- server.resetHandlers.push(connection => {
241
+ server.resetHandlers.push((connection) => {
272
242
  connection.searchContexts = null;
273
243
  });
274
-
275
- server.connectionHandlers.push(connection => {
244
+ server.connectionHandlers.push((connection) => {
276
245
  // Notifications from other sessions (and this one) are flushed here. Once none are pending, the session
277
246
  // knows the current message list, so new matches can be reported after their EXISTS and FETCH responses
278
247
  // (RFC 5267 section 4.3.2). A command that closes the mailbox gets no updates, its tagged response ends them
@@ -285,7 +254,6 @@ module.exports = function (server) {
285
254
  }
286
255
  };
287
256
  });
288
-
289
257
  server.outputHandlers.push((connection, response, description, parsed, data, extra) => {
290
258
  // RFC 5267 section 4.3.4: REMOVEFROM for an expunged message MUST be sent before the EXPUNGE response. After
291
259
  // ENABLE QRESYNC a VANISHED response reports the expunged messages (RFC 7162 section 3.2.10), it has no sequence
@@ -295,22 +263,19 @@ module.exports = function (server) {
295
263
  removeExpunged(connection, expunged, response.message ? response.attributes[0] : null);
296
264
  return;
297
265
  }
298
-
299
266
  if (!parsed) {
300
267
  return;
301
268
  }
302
269
  const command = (parsed.command || '').toUpperCase();
303
-
304
270
  if (response.tag === parsed.tag && CLOSING_COMMANDS.has(command)) {
305
271
  connection.searchContexts = null;
306
272
  return;
307
273
  }
308
-
309
274
  if (!SEARCHING_COMMANDS.has(command) || !parsed.searchReturn || !parsed.searchReturn.has('UPDATE')) {
310
275
  return;
311
276
  }
312
277
  // the full search result, the context is created when the command succeeded
313
- if (response.tag === '*' && command.endsWith(response.command) && description === command && extra && Array.isArray(extra.list)) {
278
+ if (response.tag === '*' && command.endsWith(String(response.command)) && description === command && extra && Array.isArray(extra.list)) {
314
279
  parsed.contextResult = extra;
315
280
  return;
316
281
  }
@@ -318,4 +283,4 @@ module.exports = function (server) {
318
283
  server.addSearchContext(connection, parsed, data, parsed.contextResult, command.startsWith('UID '));
319
284
  }
320
285
  });
321
- };
286
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @help Adds CONTEXT=SORT [RFC5267] capability, loads ESORT and CONTEXT=SEARCH as well
3
+ * @help SORT RETURN (UPDATE) sends ADDTO and REMOVEFROM updates with context positions in sort order, PARTIAL and CONTEXT work for SORT too
4
+ */
5
+ import type { IMAPServer } from '../types.js';
6
+ export default function contextSortPlugin(server: IMAPServer): void;
@@ -1,19 +1,14 @@
1
- 'use strict';
2
-
3
1
  /**
4
2
  * @help Adds CONTEXT=SORT [RFC5267] capability, loads ESORT and CONTEXT=SEARCH as well
5
3
  * @help SORT RETURN (UPDATE) sends ADDTO and REMOVEFROM updates with context positions in sort order, PARTIAL and CONTEXT work for SORT too
6
4
  */
7
-
8
- const esort = require('./esort');
9
- const contextSearch = require('./context-search');
10
-
11
- module.exports = function (server) {
5
+ import esort from './esort.js';
6
+ import contextSearch from './context-search.js';
7
+ export default function contextSortPlugin(server) {
12
8
  // RFC 5267 section 4.1: CONTEXT=SORT means SORT and the extended SORT syntax of section 3. The updating
13
9
  // contexts are shared with CONTEXT=SEARCH, so that is loaded (and advertised) as well
14
10
  esort(server);
15
11
  contextSearch(server);
16
-
17
12
  server.registerCapability('CONTEXT=SORT');
18
13
  server.contextSort = true;
19
- };
14
+ }
@@ -0,0 +1,7 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Enables CREATE-SPECIAL-USE [RFC6154] capability
4
+ * @help Allowed special flags can be set with server
5
+ * @help option "special-use"
6
+ */
7
+ export default function createSpecialUsePlugin(server: IMAPServer): void;
@@ -1,18 +1,13 @@
1
- 'use strict';
2
-
3
1
  /**
4
2
  * @help Enables CREATE-SPECIAL-USE [RFC6154] capability
5
3
  * @help Allowed special flags can be set with server
6
4
  * @help option "special-use"
7
5
  */
8
-
9
- module.exports = function (server) {
6
+ export default function createSpecialUsePlugin(server) {
10
7
  // Register capability
11
8
  server.registerCapability('CREATE-SPECIAL-USE');
12
-
13
9
  const createHandler = server.getCommandHandler('CREATE');
14
10
  const allowedList = [].concat(server.options['special-use'] || ['\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash']);
15
-
16
11
  server.setCommandHandler('CREATE', (connection, parsed, data, callback) => {
17
12
  let i;
18
13
  let len;
@@ -20,71 +15,57 @@ module.exports = function (server) {
20
15
  const mailboxSpecialUse = [];
21
16
  if (parsed.attributes && Array.isArray(parsed.attributes[1])) {
22
17
  for (i = 0; i < parsed.attributes[1].length; i += 2) {
23
- if (
24
- parsed.attributes[1][i] &&
18
+ if (parsed.attributes[1][i] &&
25
19
  parsed.attributes[1][i].type === 'ATOM' &&
26
20
  parsed.attributes[1][i].value.toUpperCase() === 'USE' &&
27
- Array.isArray(parsed.attributes[1][i + 1])
28
- ) {
21
+ Array.isArray(parsed.attributes[1][i + 1])) {
29
22
  specialUseList = parsed.attributes[1][i + 1];
30
23
  parsed.attributes[1].splice(i, 2);
31
24
  i -= 2;
32
25
  }
33
26
  }
34
-
35
27
  // Remove extra arguments if no members were left
36
28
  if (!parsed.attributes[1].length) {
37
29
  parsed.attributes.splice(1, 1);
38
30
  }
39
31
  }
40
-
41
32
  if (specialUseList) {
42
33
  for (i = 0, len = specialUseList.length; i < len; i++) {
43
34
  if (['ATOM', 'STRING', 'LITERAL'].indexOf(specialUseList[i].type) < 0) {
44
- connection.send(
45
- {
46
- tag: parsed.tag,
47
- command: 'BAD',
48
- attributes: [
49
- {
50
- type: 'TEXT',
51
- value: 'Invalid syntax for special use flag #' + (i + 1)
52
- }
53
- ]
54
- },
55
- 'CREATE-SPECIAL-USE FAILED',
56
- parsed,
57
- data
58
- );
35
+ connection.send({
36
+ tag: parsed.tag,
37
+ command: 'BAD',
38
+ attributes: [
39
+ {
40
+ type: 'TEXT',
41
+ value: 'Invalid syntax for special use flag #' + (i + 1)
42
+ }
43
+ ]
44
+ }, 'CREATE-SPECIAL-USE FAILED', parsed, data);
59
45
  return callback();
60
46
  }
61
47
  // attribute names are case-insensitive, store the canonical form
62
48
  const specialUse = allowedList.find(value => value.toLowerCase() === String(specialUseList[i].value).toLowerCase());
63
49
  if (!specialUse) {
64
- connection.send(
65
- {
66
- tag: parsed.tag,
67
- command: 'NO',
68
- attributes: [
69
- {
70
- type: 'SECTION',
71
- section: [
72
- {
73
- type: 'ATOM',
74
- value: 'USEATTR'
75
- }
76
- ]
77
- },
78
- {
79
- type: 'TEXT',
80
- value: specialUseList[i].value + ' not supported'
81
- }
82
- ]
83
- },
84
- 'CREATE-SPECIAL-USE FAILED',
85
- parsed,
86
- data
87
- );
50
+ connection.send({
51
+ tag: parsed.tag,
52
+ command: 'NO',
53
+ attributes: [
54
+ {
55
+ type: 'SECTION',
56
+ section: [
57
+ {
58
+ type: 'ATOM',
59
+ value: 'USEATTR'
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ type: 'TEXT',
65
+ value: specialUseList[i].value + ' not supported'
66
+ }
67
+ ]
68
+ }, 'CREATE-SPECIAL-USE FAILED', parsed, data);
88
69
  return callback();
89
70
  }
90
71
  if (mailboxSpecialUse.indexOf(specialUse) < 0) {
@@ -92,17 +73,14 @@ module.exports = function (server) {
92
73
  }
93
74
  }
94
75
  }
95
-
96
76
  if (mailboxSpecialUse.length) {
97
77
  parsed.mailboxSpecialUse = mailboxSpecialUse;
98
78
  }
99
-
100
79
  createHandler(connection, parsed, data, callback);
101
80
  });
102
-
103
81
  server.outputHandlers.push((connection, response, description, parsed, data, folder) => {
104
82
  if (description === 'CREATE' && folder && parsed.mailboxSpecialUse) {
105
83
  folder['special-use'] = parsed.mailboxSpecialUse;
106
84
  }
107
85
  });
108
- };
86
+ }
@@ -0,0 +1,23 @@
1
+ import type { IMAPConnection, IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds ENABLE capability [RFC5161]
4
+ * @help Plugins that can be enabled (eg. CONDSTORE)
5
+ * @help can be loaded in any order
6
+ */
7
+ /**
8
+ * Makes an extension available for ENABLE. Plugins call it whether the ENABLE plugin is loaded before or after them
9
+ *
10
+ * @param {Object} server IMAPServer instance
11
+ * @param {String} name Capability name in the spelling it is advertised in, e.g. "IMAP4rev2"
12
+ */
13
+ declare function registerEnable(server: IMAPServer, name: string): void;
14
+ /**
15
+ * Checks if a session has enabled an extension with ENABLE. UNAUTHENTICATE clears the list (RFC 8437 section 4.1)
16
+ *
17
+ * @param {Object} connection IMAP connection
18
+ * @param {String} name Capability name in the spelling it was registered with, see registerEnable
19
+ * @return {Boolean} true if the extension is enabled
20
+ */
21
+ declare function isEnabled(connection: IMAPConnection, name: string): boolean;
22
+ export default function enablePlugin(server: IMAPServer): void;
23
+ export { registerEnable, isEnabled };
@@ -0,0 +1,111 @@
1
+ import { states } from '../command-states.js';
2
+ /**
3
+ * @help Adds ENABLE capability [RFC5161]
4
+ * @help Plugins that can be enabled (eg. CONDSTORE)
5
+ * @help can be loaded in any order
6
+ */
7
+ /**
8
+ * Makes an extension available for ENABLE. Plugins call it whether the ENABLE plugin is loaded before or after them
9
+ *
10
+ * @param {Object} server IMAPServer instance
11
+ * @param {String} name Capability name in the spelling it is advertised in, e.g. "IMAP4rev2"
12
+ */
13
+ function registerEnable(server, name) {
14
+ server.enableAvailable = server.enableAvailable || [];
15
+ if (server.enableAvailable.indexOf(name) < 0) {
16
+ server.enableAvailable.push(name);
17
+ }
18
+ }
19
+ /**
20
+ * Checks if a session has enabled an extension with ENABLE. UNAUTHENTICATE clears the list (RFC 8437 section 4.1)
21
+ *
22
+ * @param {Object} connection IMAP connection
23
+ * @param {String} name Capability name in the spelling it was registered with, see registerEnable
24
+ * @return {Boolean} true if the extension is enabled
25
+ */
26
+ function isEnabled(connection, name) {
27
+ return !!connection.enabled && connection.enabled.indexOf(name) >= 0;
28
+ }
29
+ export default function enablePlugin(server) {
30
+ server.registerCapability('ENABLE');
31
+ // Shared with plugins that can be enabled, these might be loaded before or after this one
32
+ server.enableAvailable = server.enableAvailable || [];
33
+ server.connectionHandlers.push((connection) => {
34
+ connection.enabled = connection.enabled || [];
35
+ });
36
+ // RFC 8437 section 4.1: extensions enabled with ENABLE cease to be enabled after UNAUTHENTICATE
37
+ server.resetHandlers.push((connection) => {
38
+ connection.enabled = [];
39
+ });
40
+ server.setCommandHandler('ENABLE', (connection, parsed, data, callback) => {
41
+ let capability;
42
+ let i;
43
+ let len;
44
+ // RFC 5161 section 3.1: "Clients MUST NOT issue ENABLE once they SELECT/EXAMINE a mailbox".
45
+ // Servers do not have to check this, ImapKit does to catch the client bug.
46
+ if (connection.everSelected) {
47
+ connection.sendStatus(parsed, data, 'BAD', 'ENABLE is not allowed after SELECT or EXAMINE');
48
+ return callback();
49
+ }
50
+ if (!parsed.attributes) {
51
+ connection.send({
52
+ tag: parsed.tag,
53
+ command: 'BAD',
54
+ attributes: [
55
+ {
56
+ type: 'TEXT',
57
+ value: 'ENABLE expects capability list'
58
+ }
59
+ ]
60
+ }, 'INVALID COMMAND', parsed, data);
61
+ return callback();
62
+ }
63
+ for (i = 0, len = parsed.attributes.length; i < len; i++) {
64
+ if (!parsed.attributes[i] || parsed.attributes[i].type !== 'ATOM') {
65
+ connection.send({
66
+ tag: parsed.tag,
67
+ command: 'BAD',
68
+ attributes: [
69
+ {
70
+ type: 'TEXT',
71
+ value: 'Attribute nr ' + (i + 1) + ' is not an ATOM'
72
+ }
73
+ ]
74
+ }, 'INVALID COMMAND', parsed, data);
75
+ return callback();
76
+ }
77
+ }
78
+ // The ENABLED response lists only the extensions enabled by this command
79
+ // Capability names are matched case-insensitively and listed in the spelling the server advertises them
80
+ // (`server.enableAvailable`), e.g. "IMAP4rev2", so plugins look them up in `connection.enabled` by that name
81
+ const enabled = [];
82
+ for (i = 0, len = parsed.attributes.length; i < len; i++) {
83
+ const requested = parsed.attributes[i].value.toUpperCase();
84
+ capability = server.enableAvailable.find((name) => name.toUpperCase() === requested);
85
+ if (capability && connection.enabled.indexOf(capability) < 0) {
86
+ connection.enabled.push(capability);
87
+ enabled.push(capability);
88
+ }
89
+ }
90
+ connection.send({
91
+ tag: '*',
92
+ command: 'ENABLED',
93
+ attributes: enabled.map(capability => ({
94
+ type: 'ATOM',
95
+ value: capability
96
+ }))
97
+ }, 'ENABLED', parsed, data, enabled);
98
+ connection.send({
99
+ tag: parsed.tag,
100
+ command: 'OK',
101
+ attributes: [
102
+ {
103
+ type: 'TEXT',
104
+ value: 'ENABLE completed'
105
+ }
106
+ ]
107
+ }, 'ENABLE', parsed, data);
108
+ return callback();
109
+ }, { states: states.AUTHENTICATED });
110
+ }
111
+ export { registerEnable, isEnabled };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @help Adds ESEARCH [RFC4731] capability
3
+ * @help SEARCH and UID SEARCH take the RETURN (MIN MAX ALL COUNT) result options and answer with ESEARCH
4
+ */
5
+ import type { IMAPServer } from '../types.js';
6
+ export default function esearchPlugin(server: IMAPServer): void;