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
@@ -1,9 +1,6 @@
1
- 'use strict';
2
-
3
- const { toVanished } = require('../vanished');
4
- const { isAtom } = require('../arguments');
5
- const { registerEnable, isEnabled } = require('./enable');
6
-
1
+ import { toVanished } from '../vanished.js';
2
+ import { isAtom } from '../arguments.js';
3
+ import { registerEnable, isEnabled } from './enable.js';
7
4
  /**
8
5
  * @help Adds UIDONLY [RFC9586] capability, loads ENABLE as well
9
6
  * @help After ENABLE UIDONLY: FETCH, STORE, SEARCH, COPY, MOVE, SORT, THREAD, REPLACE and
@@ -13,17 +10,12 @@ const { registerEnable, isEnabled } = require('./enable');
13
10
  *
14
11
  * UIDONLY: https://www.rfc-editor.org/rfc/rfc9586
15
12
  */
16
-
17
- module.exports = function (server) {
13
+ export default function uidonlyPlugin(server) {
18
14
  server.registerCapability('UIDONLY');
19
-
20
15
  registerEnable(server, 'UIDONLY');
21
-
22
16
  // UNAUTHENTICATE clears the ENABLEd extensions (RFC 8437 section 4.1)
23
- const isUidonly = connection => isEnabled(connection, 'UIDONLY');
24
-
25
- const refuse = text => ({ command: 'BAD', code: 'UIDREQUIRED', text });
26
-
17
+ const isUidonly = (connection) => isEnabled(connection, 'UIDONLY');
18
+ const refuse = (text) => ({ command: 'BAD', code: 'UIDREQUIRED', text });
27
19
  // RFC 9586 section 3: once UIDONLY is enabled, message numbers in any argument MUST be answered with a
28
20
  // tagged BAD that has the UIDREQUIRED response code
29
21
  const getRefusal = (connection, parsed) => {
@@ -31,45 +23,37 @@ module.exports = function (server) {
31
23
  const options = server.getCommandOptions(command);
32
24
  // the ESEARCH command of MULTISEARCH always returns UIDs (RFC 7377 section 2), like a UID command
33
25
  const isUid = /^UID /.test(command) || command === 'ESEARCH';
34
-
35
26
  // sections 3.2 and 3.8: FETCH, STORE, SEARCH, COPY, MOVE, SORT and THREAD are prohibited, also REPLACE
36
27
  // (RFC 8508), its message argument is a sequence number. These have the sequenceSet or searchCriteria
37
28
  // command option
38
29
  if (!isUid && (options.sequenceSet !== false || options.searchCriteria !== false)) {
39
30
  return refuse(command + ' is not allowed once UIDONLY is enabled, use UID ' + command);
40
31
  }
41
-
42
32
  // section 3.5: the <sequence set> search key is prohibited, also in UID SORT and UID THREAD
43
33
  if (isUid && options.searchCriteria !== false && connection.usesSequenceNumbers(parsed)) {
44
34
  return refuse('Message numbers are not allowed in the search criteria once UIDONLY is enabled, use UID <sequence set>');
45
35
  }
46
-
47
36
  // section 3.7: the fourth QRESYNC parameter (message sequence match data) MUST NOT be used
48
- if ((command === 'SELECT' || command === 'EXAMINE') && Array.isArray(parsed.attributes && parsed.attributes[1])) {
37
+ if ((command === 'SELECT' || command === 'EXAMINE') && parsed.attributes && Array.isArray(parsed.attributes[1])) {
49
38
  const params = parsed.attributes[1];
50
- const position = params.findIndex(param => isAtom(param, 'QRESYNC'));
39
+ const position = params.findIndex((param) => isAtom(param, 'QRESYNC'));
51
40
  const value = position >= 0 && params[position + 1];
52
41
  if (Array.isArray(value) && value.slice(2).some(Array.isArray)) {
53
42
  return refuse('QRESYNC message sequence match data is not allowed once UIDONLY is enabled');
54
43
  }
55
44
  }
56
-
57
45
  return false;
58
46
  };
59
-
60
47
  server.commandChecks.push((connection, parsed) => isUidonly(connection) && getRefusal(connection, parsed));
61
-
62
48
  // a prohibited command is refused before its literal is sent, before other checks that would answer NO
63
49
  server.literalFilters.unshift((connection, command) => isUidonly(connection) && getRefusal(connection, { command }));
64
-
65
- server.connectionHandlers.push(connection => {
50
+ server.connectionHandlers.push((connection) => {
66
51
  // RFC 3501 section 5.5 is about commands with message numbers, these are all refused with
67
52
  // BAD [UIDREQUIRED] once UIDONLY is enabled, as if they had waited
68
53
  const isAmbiguous = connection.isAmbiguous;
69
54
  connection.isAmbiguous = function (parsed) {
70
55
  return !isUidonly(this) && isAmbiguous.call(this, parsed);
71
56
  };
72
-
73
57
  // RFC 9586 sections 3.4 and 3.6: expunges are announced with VANISHED instead of EXPUNGE, EXISTS and
74
58
  // RECENT stay as they are
75
59
  const prepareNotifications = connection.prepareNotifications;
@@ -78,24 +62,20 @@ module.exports = function (server) {
78
62
  return isUidonly(this) ? toVanished(queue) : queue;
79
63
  };
80
64
  });
81
-
82
65
  // RFC 9586 section 3: the server MUST NOT return message sequence numbers in any response
83
66
  const outputHandler = (connection, response, description, parsed, data, extra) => {
84
67
  if (!response || response.tag !== '*' || !Array.isArray(response.attributes) || !isUidonly(connection)) {
85
68
  return;
86
69
  }
87
70
  const attributes = response.attributes;
88
-
89
71
  // the UNSEEN response code of SELECT and EXAMINE is a message number (RFC 3501 section 7.1)
90
72
  if (response.command === 'OK' && attributes[0] && attributes[0].type === 'SECTION' && isAtom(attributes[0].section[0], 'UNSEEN')) {
91
73
  response.skipResponse = true;
92
74
  return;
93
75
  }
94
-
95
76
  if (!isAtom(attributes[1], 'FETCH') || !Array.isArray(attributes[2])) {
96
77
  return;
97
78
  }
98
-
99
79
  // section 3.3: uidfetch-resp = uniqueid SP "UIDFETCH" SP msg-att
100
80
  // FETCH responses pass their message as `extra`, notifications like the MessageNew FETCH of NOTIFY carry it
101
81
  const list = attributes[2];
@@ -107,7 +87,6 @@ module.exports = function (server) {
107
87
  response.skipResponse = true;
108
88
  return;
109
89
  }
110
-
111
90
  // the UID data item is only included if the client asked for it, like in the examples of section 3.3
112
91
  if (parsed && !('uidonlyKeepUid' in parsed)) {
113
92
  parsed.uidonlyKeepUid = requestsUid(parsed);
@@ -118,12 +97,10 @@ module.exports = function (server) {
118
97
  }
119
98
  response.attributes = [uid, { type: 'ATOM', value: 'UIDFETCH' }, items];
120
99
  };
121
-
122
100
  // registered once every plugin is loaded, so that the other output handlers see the FETCH responses they
123
101
  // know before these are turned into UIDFETCH responses
124
102
  server.once('pluginsLoaded', () => server.outputHandlers.push(outputHandler));
125
- };
126
-
103
+ }
127
104
  // Checks if a UID FETCH command lists the UID data item
128
105
  function requestsUid(parsed) {
129
106
  if (String(parsed.command || '').toUpperCase() !== 'UID FETCH' || !parsed.attributes) {
@@ -131,5 +108,4 @@ function requestsUid(parsed) {
131
108
  }
132
109
  return [].concat(parsed.attributes[1] || []).some(item => isAtom(item, 'UID'));
133
110
  }
134
-
135
- module.exports.requires = ['ENABLE'];
111
+ uidonlyPlugin.requires = ['ENABLE'];
@@ -0,0 +1,15 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds UIDPLUS [RFC4315] capability
4
+ *
5
+ * UIDPLUS: http://tools.ietf.org/html/rfc4315
6
+ *
7
+ * Additional commands:
8
+ * - UID EXPUNGE
9
+ *
10
+ * Additional response codes:
11
+ * - APPENDUID (with a UID set for MULTIAPPEND, and in an untagged OK for REPLACE)
12
+ * - COPYUID
13
+ * - Not implemented: UIDNOTSTICKY
14
+ */
15
+ export default function uidplusPlugin(server: IMAPServer): void;
@@ -1,7 +1,4 @@
1
- 'use strict';
2
-
3
- const { toSequenceSet } = require('../esearch');
4
-
1
+ import { toSequenceSet } from '../esearch.js';
5
2
  /**
6
3
  * @help Adds UIDPLUS [RFC4315] capability
7
4
  *
@@ -15,63 +12,47 @@ const { toSequenceSet } = require('../esearch');
15
12
  * - COPYUID
16
13
  * - Not implemented: UIDNOTSTICKY
17
14
  */
18
- module.exports = function (server) {
15
+ export default function uidplusPlugin(server) {
19
16
  server.registerCapability('UIDPLUS');
20
-
21
17
  server.setCommandHandler('UID EXPUNGE', (connection, parsed, data, callback) => {
22
18
  if (!parsed.attributes || parsed.attributes.length !== 1 || !parsed.attributes[0] || ['ATOM', 'SEQUENCE'].indexOf(parsed.attributes[0].type) < 0) {
23
- connection.send(
24
- {
25
- tag: parsed.tag,
26
- command: 'BAD',
27
- attributes: [
28
- {
29
- type: 'TEXT',
30
- value: 'UID EXPUNGE expects uid sequence set'
31
- }
32
- ]
33
- },
34
- 'INVALID COMMAND',
35
- parsed,
36
- data
37
- );
19
+ connection.send({
20
+ tag: parsed.tag,
21
+ command: 'BAD',
22
+ attributes: [
23
+ {
24
+ type: 'TEXT',
25
+ value: 'UID EXPUNGE expects uid sequence set'
26
+ }
27
+ ]
28
+ }, 'INVALID COMMAND', parsed, data);
38
29
  return callback();
39
30
  }
40
-
41
31
  if (connection.refuseReadOnly(parsed, data, 'UID EXPUNGE FAILED')) {
42
32
  return callback();
43
33
  }
44
-
45
34
  const sequence = parsed.attributes[0].value;
46
35
  const range = connection.limitRange(parsed, connection.getMessageRange(sequence, true));
47
36
  // Only messages with the \Deleted flag are removed (RFC 4315 section 2.1)
48
- const rangeMessages = range.map(x => x[1]).filter(message => message.flags.indexOf('\\Deleted') >= 0);
49
-
37
+ const rangeMessages = range.map(x => x[1]).filter((message) => message.flags.indexOf('\\Deleted') >= 0);
50
38
  connection.expungeSpecificMessages(connection.selectedMailbox, rangeMessages, false, true, !!parsed.highestFirst);
51
-
52
- connection.send(
53
- {
54
- tag: parsed.tag,
55
- command: 'OK',
56
- attributes: [
57
- {
58
- type: 'TEXT',
59
- value: 'UID EXPUNGE completed'
60
- }
61
- ]
62
- },
63
- 'UID EXPUNGE',
64
- parsed,
65
- data
66
- );
39
+ connection.send({
40
+ tag: parsed.tag,
41
+ command: 'OK',
42
+ attributes: [
43
+ {
44
+ type: 'TEXT',
45
+ value: 'UID EXPUNGE completed'
46
+ }
47
+ ]
48
+ }, 'UID EXPUNGE', parsed, data);
67
49
  callback();
68
50
  });
69
-
70
51
  server.outputHandlers.push((connection, response, description, parsed, data, extra) => {
71
52
  if (description === 'APPEND' || description === 'REPLACE APPENDUID') {
72
53
  // OK [APPENDUID <target-mailbox-uidvalidity> <uid>] APPEND Completed. With MULTIAPPEND the
73
54
  // second value is a UID set, but never for a single message (RFC 4315 section 3)
74
- const uids = extra.messages.map(message => message.uid);
55
+ const uids = extra.messages.map((message) => message.uid);
75
56
  response.attributes = [
76
57
  {
77
58
  type: 'SECTION',
@@ -89,7 +70,6 @@ module.exports = function (server) {
89
70
  response.skipResponse = false;
90
71
  return;
91
72
  }
92
-
93
73
  if (description === 'COPY' || description === 'UID COPY' || description === 'MOVE COPYUID' || description === 'UID MOVE COPYUID') {
94
74
  // Nothing was copied, an empty COPYUID would break the response grammar
95
75
  if (!extra || !extra.sourceUids || !extra.sourceUids.length) {
@@ -121,4 +101,4 @@ module.exports = function (server) {
121
101
  return;
122
102
  }
123
103
  });
124
- };
104
+ }
@@ -0,0 +1,7 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds UNAUTHENTICATE [RFC8437] capability
4
+ * @help Returns to the Not Authenticated state, everything
5
+ * @help but TLS is reset (selected mailbox, ENABLE, COMPRESS)
6
+ */
7
+ export default function unauthenticatePlugin(server: IMAPServer): void;
@@ -0,0 +1,17 @@
1
+ import { states } from '../command-states.js';
2
+ /**
3
+ * @help Adds UNAUTHENTICATE [RFC8437] capability
4
+ * @help Returns to the Not Authenticated state, everything
5
+ * @help but TLS is reset (selected mailbox, ENABLE, COMPRESS)
6
+ */
7
+ export default function unauthenticatePlugin(server) {
8
+ server.registerCapability('UNAUTHENTICATE');
9
+ server.setCommandHandler('UNAUTHENTICATE', (connection, parsed, data, callback) => {
10
+ // RFC 8437 section 3: a NO response is not permitted, the reset can not fail here
11
+ connection.sendStatus(parsed, data, 'OK', 'Completed, now in not authenticated state');
12
+ // RFC 8437 sections 3 and 4.1: the mailbox is closed without EXPUNGE responses, ENABLEd
13
+ // extensions and CONDSTORE are turned off, and compression ends after the CRLF of the OK
14
+ connection.resetSession();
15
+ return callback();
16
+ }, { states: states.AUTHENTICATED, noArguments: true });
17
+ }
@@ -0,0 +1,5 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds UNSELECT [RFC3691] capability
4
+ */
5
+ export default function unselectPlugin(server: IMAPServer): void;
@@ -0,0 +1,21 @@
1
+ import { states } from '../command-states.js';
2
+ /**
3
+ * @help Adds UNSELECT [RFC3691] capability
4
+ */
5
+ export default function unselectPlugin(server) {
6
+ server.registerCapability('UNSELECT');
7
+ server.setCommandHandler('UNSELECT', (connection, parsed, data, callback) => {
8
+ connection.send({
9
+ tag: parsed.tag,
10
+ command: 'OK',
11
+ attributes: [
12
+ {
13
+ type: 'TEXT',
14
+ value: 'Mailbox closed'
15
+ }
16
+ ]
17
+ }, 'CLOSE', parsed, data);
18
+ connection.closeMailbox();
19
+ return callback();
20
+ }, { states: states.SELECTED, noArguments: true });
21
+ }
@@ -0,0 +1,6 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ declare function utf8AcceptPlugin(server: IMAPServer): void;
3
+ declare namespace utf8AcceptPlugin {
4
+ var requires: string[];
5
+ }
6
+ export default utf8AcceptPlugin;
@@ -1,14 +1,10 @@
1
- 'use strict';
2
-
3
- const { updateSession } = require('../utf8-session');
4
- const { registerEnable } = require('./enable');
5
-
1
+ import { updateSession } from '../utf8-session.js';
2
+ import { registerEnable } from './enable.js';
6
3
  /**
7
4
  * @help Adds UTF8=ACCEPT [RFC9755] capability, loads ENABLE as well
8
5
  * @help After ENABLE UTF8=ACCEPT mailbox names are UTF-8 instead of
9
6
  * @help modified UTF-7 and strings are sent quoted as UTF-8
10
7
  */
11
-
12
8
  /**
13
9
  * Checks if the header of a message holds 8-bit octets
14
10
  *
@@ -19,21 +15,17 @@ function has8bitHeader(raw) {
19
15
  const match = raw.match(/\r?\n\r?\n/);
20
16
  return /[\x80-\xff]/.test(match ? raw.substr(0, match.index) : raw);
21
17
  }
22
-
23
- module.exports = function (server) {
18
+ export default function utf8AcceptPlugin(server) {
24
19
  // RFC 9755 section 3: the client turns UTF-8 support on with ENABLE
25
20
  server.registerCapability('UTF8=ACCEPT');
26
-
27
21
  registerEnable(server, 'UTF8=ACCEPT');
28
-
29
22
  // RFC 9755 section 3: a server that supports UTF8=ACCEPT accepts UTF-8 in quoted strings. Before
30
23
  // ENABLE, mailbox names must still be modified UTF-7 and SEARCH needs CHARSET UTF-8 for 8-bit strings.
31
- // See lib/utf8-session.js, the session state is shared with IMAP4rev2
24
+ // See src/utf8-session.ts, the session state is shared with IMAP4rev2
32
25
  server.utf8Accept = true;
33
26
  server.connectionHandlers.push(updateSession);
34
27
  // RFC 8437 section 3: UNAUTHENTICATE resets the ENABLEd extensions
35
28
  server.resetHandlers.push(updateSession);
36
-
37
29
  server.outputHandlers.push((connection, response, description, parsed, data, extra) => {
38
30
  if (description === 'ENABLED' && Array.isArray(extra) && extra.indexOf('UTF8=ACCEPT') >= 0) {
39
31
  // strings that are valid UTF-8 are sent quoted, mailbox names are UTF-8 in both directions
@@ -41,7 +33,6 @@ module.exports = function (server) {
41
33
  updateSession(connection);
42
34
  }
43
35
  });
44
-
45
36
  // RFC 9755 section 4: without ENABLE UTF8=ACCEPT, APPEND MUST be refused with NO
46
37
  // if the message header has 8-bit characters
47
38
  const appendHandler = server.getCommandHandler('APPEND');
@@ -49,20 +40,18 @@ module.exports = function (server) {
49
40
  const args = parsed.attributes || [];
50
41
  const raw = args[args.length - 1];
51
42
  if (
52
- // UTF-8 is on after ENABLE UTF8=ACCEPT, or IMAP4rev2, which permits 8-bit characters in the message
53
- // (RFC 9051 section 6.3.12) and which RFC 9755 does not extend
54
- !connection.utf8Enabled &&
43
+ // UTF-8 is on after ENABLE UTF8=ACCEPT, or IMAP4rev2, which permits 8-bit characters in the message
44
+ // (RFC 9051 section 6.3.12) and which RFC 9755 does not extend
45
+ !connection.utf8Enabled &&
55
46
  args.length >= 2 &&
56
47
  raw &&
57
48
  ['LITERAL', 'LITERAL8'].indexOf(raw.type) >= 0 &&
58
- has8bitHeader(raw.value || '')
59
- ) {
49
+ has8bitHeader(raw.value || '')) {
60
50
  connection.sendStatus(parsed, data, 'NO', 'Message header has 8-bit characters, ENABLE UTF8=ACCEPT first (RFC 9755 section 4)');
61
51
  return callback();
62
52
  }
63
53
  return appendHandler(connection, parsed, data, callback);
64
54
  });
65
- };
66
-
55
+ }
67
56
  // ENABLE UTF8=ACCEPT is the only way to use this extension
68
- module.exports.requires = ['ENABLE'];
57
+ utf8AcceptPlugin.requires = ['ENABLE'];
@@ -0,0 +1,26 @@
1
+ import type { IMAPServer } from '../types.js';
2
+ /**
3
+ * @help Adds Gmail specific X-GM-EXT-1 capability
4
+ * @help (https://developers.google.com/workspace/gmail/imap/imap-extensions)
5
+ * @help X-GM-MSGID and X-GM-THRID: FETCH and SEARCH. X-GM-THRID is the
6
+ * @help X-GM-MSGID of the message unless storage sets an X-GM-THRID
7
+ * @help value, so every message is its own thread unless the
8
+ * @help fixture groups messages. With OBJECTID, the messages of a
9
+ * @help THREADID share the X-GM-THRID of its first message
10
+ * @help X-GM-LABELS: FETCH, STORE (+/-, .SILENT) and SEARCH. System
11
+ * @help labels are atoms that start with "\" (\Inbox for INBOX, the
12
+ * @help special-use attribute for special-use mailboxes), other labels
13
+ * @help are mailbox names, sent like mailbox names (modified UTF-7, or
14
+ * @help UTF-8 after ENABLE UTF8=ACCEPT, quoted when not atoms). Labels
15
+ * @help have no side effects: the message is not copied to or removed
16
+ * @help from other mailboxes. In SEARCH a label that starts with "\"
17
+ * @help is a system label
18
+ * @help X-GM-RAW: a subset of the Gmail search syntax. Words and "quoted
19
+ * @help phrases" (TEXT), -term, OR, (groups), {any of}, from: to: cc:
20
+ * @help bcc: subject: label: in: (inbox sent drafts trash spam
21
+ * @help anywhere, or a label) is: (read unread starred important)
22
+ * @help larger: smaller: (k and m suffixes) after: before:
23
+ * @help (YYYY/MM/DD) and rfc822msgid:. Other Gmail operators are
24
+ * @help answered with NO
25
+ */
26
+ export default function xGmExt1Plugin(server: IMAPServer): void;