imapkit 4.0.3 → 4.1.1

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