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,148 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.updateSession = updateSession;
37
+ const node_buffer_1 = require("node:buffer");
38
+ const mailbox_name_js_1 = __importStar(require("./mailbox-name.js"));
39
+ const enable_js_1 = require("./plugins/enable.js");
40
+ /**
41
+ * UTF-8 support of a session, shared by the UTF8=ACCEPT (RFC 9755) and IMAP4rev2 (RFC 9051) plugins. Both
42
+ * turn on UTF-8 mailbox names and quoted strings with ENABLE, and they can be loaded in any order, so the
43
+ * state of a session is always computed from what it has enabled, see updateSession().
44
+ */
45
+ // RFC 9755 section 3: mailbox names MUST NOT contain control characters, DEL, LINE SEPARATOR or
46
+ // PARAGRAPH SEPARATOR. RFC 5198 section 2 (Net-Unicode) also forbids a leading BOM and unassigned code points
47
+ // eslint-disable-next-line no-control-regex
48
+ const INVALID_NAME_CHARS = /[\u0000-\u001f\u007f-\u009f\u2028\u2029]|^\ufeff|\p{Cn}/u;
49
+ function badError(message) {
50
+ const err = new Error(message);
51
+ err.imapResponse = 'BAD';
52
+ return err;
53
+ }
54
+ /**
55
+ * Throws a BAD error for a mailbox name that is not Net-Unicode (RFC 9755 section 3, RFC 9051 section 5.1).
56
+ * RFC 5198 section 2 also requires Normalization Form C
57
+ *
58
+ * @param {String|Boolean} decoded Mailbox name as a unicode string, false if it could not be decoded
59
+ * @return {String} the decoded name
60
+ */
61
+ function checkNetUnicode(decoded) {
62
+ if (decoded === false || INVALID_NAME_CHARS.test(decoded)) {
63
+ throw badError('Mailbox name must be valid Net-Unicode without control characters (RFC 9755 section 3)');
64
+ }
65
+ if (decoded.normalize('NFC') !== decoded) {
66
+ throw badError('Mailbox name must be in Unicode Normalization Form C (RFC 5198 section 2, RFC 9051 section 5.1)');
67
+ }
68
+ return decoded;
69
+ }
70
+ /**
71
+ * Checks a modified UTF-7 mailbox name from a client that did not enable UTF-8. The RFC 9755
72
+ * section 3 rules apply to these names as well, e.g. "&AA0-" encodes CR
73
+ *
74
+ * @param {String} name Mailbox name as a binary string
75
+ * @return {String} Storage name
76
+ * @throws {Error} BAD error if the name is not valid
77
+ */
78
+ function importMutf7Name(name) {
79
+ const error = (0, mailbox_name_js_1.default)(name);
80
+ if (error) {
81
+ throw badError(error);
82
+ }
83
+ checkNetUnicode((0, mailbox_name_js_1.decode)(name));
84
+ return name;
85
+ }
86
+ /**
87
+ * Converts a UTF-8 mailbox name from the client to the modified UTF-7 storage name
88
+ *
89
+ * @param {String} name Mailbox name as a binary string
90
+ * @return {String} Storage name
91
+ * @throws {Error} BAD error if the name is not valid
92
+ */
93
+ function importUtf8Name(name) {
94
+ const buf = Buffer.from(name, 'binary');
95
+ return (0, mailbox_name_js_1.encode)(checkNetUnicode((0, node_buffer_1.isUtf8)(buf) && buf.toString('utf-8')));
96
+ }
97
+ /**
98
+ * Converts a modified UTF-7 storage name to UTF-8. A name that is not valid modified UTF-7
99
+ * is sent as it is.
100
+ *
101
+ * @param {String} path Storage name
102
+ * @return {String} Mailbox name as a binary string
103
+ */
104
+ function exportUtf8Name(path) {
105
+ const decoded = (0, mailbox_name_js_1.decode)(path);
106
+ return decoded === false ? path : Buffer.from(decoded, 'utf-8').toString('binary');
107
+ }
108
+ /**
109
+ * Sets the UTF-8 options of a session from the extensions it has enabled. Run it when the session starts,
110
+ * after ENABLE and after UNAUTHENTICATE (once the ENABLE plugin has cleared `connection.enabled`).
111
+ *
112
+ * - With the UTF8=ACCEPT plugin, quoted strings may hold UTF-8 even before ENABLE (RFC 9755 section 3) and
113
+ * modified UTF-7 names must decode to Net-Unicode. Without it, 8-bit quoted strings are a syntax error until
114
+ * ENABLE IMAP4rev2, like RFC 3501 says
115
+ * - ENABLE UTF8=ACCEPT or IMAP4rev2: mailbox names are UTF-8 in both directions and strings that are valid
116
+ * UTF-8 are sent quoted (RFC 9755 section 3, RFC 9051 sections 4.3 and 5.1)
117
+ * - ENABLE UTF8=ACCEPT: SEARCH strings are UTF-8 and CHARSET is refused (RFC 9755 section 3)
118
+ * - ENABLE IMAP4rev2: SEARCH strings are UTF-8 unless a CHARSET says otherwise (RFC 9051 section 6.4.4)
119
+ *
120
+ * @param {Object} connection IMAP connection
121
+ */
122
+ function updateSession(connection) {
123
+ const server = connection.server;
124
+ const accept = (0, enable_js_1.isEnabled)(connection, 'UTF8=ACCEPT');
125
+ const rev2 = (0, enable_js_1.isEnabled)(connection, 'IMAP4rev2');
126
+ const utf8Names = accept || rev2;
127
+ // UTF-8 names and quoted strings are on, plugins check this instead of the extension names
128
+ connection.utf8Enabled = utf8Names;
129
+ connection.parserOptions.utf8 = !!server.utf8Accept || rev2;
130
+ connection.compilerOptions.utf8 = utf8Names;
131
+ connection.searchCharset = accept ? 'UTF-8' : false;
132
+ connection.defaultSearchCharset = rev2 ? 'UTF-8' : false;
133
+ if (utf8Names) {
134
+ connection.importMailboxName = importUtf8Name;
135
+ connection.exportMailboxName = exportUtf8Name;
136
+ }
137
+ else {
138
+ // back to the IMAPConnection methods, the overrides are own properties of the connection
139
+ const overrides = connection;
140
+ delete overrides.exportMailboxName;
141
+ if (server.utf8Accept) {
142
+ connection.importMailboxName = importMutf7Name;
143
+ }
144
+ else {
145
+ delete overrides.importMailboxName;
146
+ }
147
+ }
148
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * VANISHED responses (RFC 7162 section 3.2.10) in place of EXPUNGE notifications. Used by QRESYNC
3
+ * and by UIDONLY (RFC 9586 section 3.4), which both report expunged messages by UID.
4
+ */
5
+ import type { IMAPResponse, Notification } from './types.js';
6
+ /**
7
+ * Checks if a queued notification is an EXPUNGE response for a removed message
8
+ *
9
+ * @param {Object} notification Queued notification
10
+ * @return {Boolean} true for an EXPUNGE notification
11
+ */
12
+ declare function isExpungeNotification(notification: Notification): boolean;
13
+ /**
14
+ * Replaces the EXPUNGE notifications of a queue with VANISHED responses, consecutive EXPUNGE
15
+ * notifications become one VANISHED response. The queue is not changed
16
+ *
17
+ * @param {Array} queue Queued notifications
18
+ * @return {Array} notifications to send
19
+ */
20
+ declare function toVanished(queue: Notification[]): IMAPResponse[];
21
+ export { isExpungeNotification, toVanished };
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * VANISHED responses (RFC 7162 section 3.2.10) in place of EXPUNGE notifications. Used by QRESYNC
4
+ * and by UIDONLY (RFC 9586 section 3.4), which both report expunged messages by UID.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isExpungeNotification = isExpungeNotification;
8
+ exports.toVanished = toVanished;
9
+ const esearch_js_1 = require("./esearch.js");
10
+ /**
11
+ * Checks if a queued notification is an EXPUNGE response for a removed message
12
+ *
13
+ * @param {Object} notification Queued notification
14
+ * @return {Boolean} true for an EXPUNGE notification
15
+ */
16
+ function isExpungeNotification(notification) {
17
+ const name = !!notification.message && !!notification.attributes && notification.attributes[1];
18
+ return !!name && name.type === 'ATOM' && String(name.value).toUpperCase() === 'EXPUNGE';
19
+ }
20
+ /**
21
+ * Replaces the EXPUNGE notifications of a queue with VANISHED responses, consecutive EXPUNGE
22
+ * notifications become one VANISHED response. The queue is not changed
23
+ *
24
+ * @param {Array} queue Queued notifications
25
+ * @return {Array} notifications to send
26
+ */
27
+ function toVanished(queue) {
28
+ if (!queue.some(isExpungeNotification)) {
29
+ return queue;
30
+ }
31
+ // groups of consecutive expunges, as lists of UIDs, between the other notifications
32
+ const groups = [];
33
+ queue.forEach(notification => {
34
+ if (!isExpungeNotification(notification)) {
35
+ groups.push(notification);
36
+ }
37
+ else if (Array.isArray(groups[groups.length - 1])) {
38
+ // an EXPUNGE notification always carries its message
39
+ groups[groups.length - 1].push(notification.message);
40
+ }
41
+ else {
42
+ groups.push([notification.message]);
43
+ }
44
+ });
45
+ // the removed messages go with the response for output handlers, like `message` of EXPUNGE
46
+ return groups.map(group => Array.isArray(group)
47
+ ? {
48
+ tag: '*',
49
+ command: 'VANISHED',
50
+ attributes: [{ type: 'SEQUENCE', value: (0, esearch_js_1.toSequenceSet)(group.map(message => message.uid)) }],
51
+ notification: true,
52
+ messages: group
53
+ }
54
+ : group);
55
+ }
@@ -0,0 +1,21 @@
1
+ /** An address, or a group with its member addresses */
2
+ export interface ParsedAddress {
3
+ name: string;
4
+ address?: string;
5
+ group?: ParsedAddress[];
6
+ }
7
+ /**
8
+ * Parses structured e-mail addresses from an address field
9
+ *
10
+ * Example:
11
+ *
12
+ * "Name <address@domain>"
13
+ *
14
+ * will be converted to
15
+ *
16
+ * [{name: "Name", address: "address@domain"}]
17
+ *
18
+ * @param {String} str Address field
19
+ * @return {Array} An array of address objects
20
+ */
21
+ export default function parse(str: string, inGroup?: boolean): ParsedAddress[];
@@ -1,5 +1,3 @@
1
- 'use strict';
2
-
3
1
  /**
4
2
  * Parses structured e-mail addresses from an address field
5
3
  *
@@ -14,39 +12,34 @@
14
12
  * @param {String} str Address field
15
13
  * @return {Array} An array of address objects
16
14
  */
17
- const parse = (module.exports = function (str, inGroup) {
15
+ export default function parse(str, inGroup) {
18
16
  const tokenizer = new Tokenizer(str);
19
17
  const tokens = tokenizer.tokenize();
20
-
21
18
  const addresses = [];
22
19
  let address = [];
23
20
  let parsedAddresses = [];
24
-
25
21
  tokens.forEach(token => {
26
22
  if (token.type === 'operator' && (token.value === ',' || token.value === ';')) {
27
23
  if (address.length) {
28
24
  addresses.push(address);
29
25
  }
30
26
  address = [];
31
- } else {
27
+ }
28
+ else {
32
29
  address.push(token);
33
30
  }
34
31
  });
35
-
36
32
  if (address.length) {
37
33
  addresses.push(address);
38
34
  }
39
-
40
35
  addresses.forEach(address => {
41
- address = _handleAddress(address, inGroup);
42
- if (address.length) {
43
- parsedAddresses = parsedAddresses.concat(address);
36
+ const handled = _handleAddress(address, inGroup);
37
+ if (handled.length) {
38
+ parsedAddresses = parsedAddresses.concat(handled);
44
39
  }
45
40
  });
46
-
47
41
  return parsedAddresses;
48
- });
49
-
42
+ }
50
43
  /**
51
44
  * Converts tokens for a single address into an address object
52
45
  *
@@ -59,7 +52,6 @@ function _handleAddress(tokens, inGroup) {
59
52
  let token;
60
53
  let isGroup = false;
61
54
  let state = 'text';
62
- let address;
63
55
  const addresses = [];
64
56
  const data = {
65
57
  address: [],
@@ -69,11 +61,9 @@ function _handleAddress(tokens, inGroup) {
69
61
  };
70
62
  let i;
71
63
  let len;
72
-
73
64
  // Filter out <addresses>, (comments) and regular text
74
65
  for (i = 0, len = tokens.length; i < len; i++) {
75
66
  token = tokens[i];
76
-
77
67
  if (token.type === 'operator') {
78
68
  switch (token.value) {
79
69
  case '<':
@@ -93,27 +83,28 @@ function _handleAddress(tokens, inGroup) {
93
83
  default:
94
84
  state = 'text';
95
85
  }
96
- } else {
86
+ }
87
+ else {
97
88
  if (token.value) {
98
89
  data[state].push(token.value);
99
90
  }
100
91
  }
101
92
  }
102
-
103
93
  // If there is no text but a comment, replace the two
104
94
  if (!data.text.length && data.comment.length) {
105
95
  data.text = data.comment;
106
96
  data.comment = [];
107
97
  }
108
-
109
98
  if (isGroup) {
110
99
  // http://tools.ietf.org/html/rfc2822#appendix-A.1.3
111
- data.text = data.text.join(' ');
100
+ const text = data.text.join(' ');
112
101
  addresses.push({
113
- name: data.text || address.name,
102
+ // RFC 5322 section 3.4 requires a display name, but a group like ":a@b;" still parses, with an empty name
103
+ name: text,
114
104
  group: data.group.length ? parse(data.group.join(','), true) : []
115
105
  });
116
- } else {
106
+ }
107
+ else {
117
108
  // If no address was found, try to detect one from regular text
118
109
  if (!data.address.length && data.text.length) {
119
110
  for (i = data.text.length - 1; i >= 0; i--) {
@@ -122,16 +113,15 @@ function _handleAddress(tokens, inGroup) {
122
113
  break;
123
114
  }
124
115
  }
125
-
126
116
  const _regexHandler = function (address) {
127
117
  if (!data.address.length) {
128
118
  data.address = [address.trim()];
129
119
  return ' ';
130
- } else {
120
+ }
121
+ else {
131
122
  return address;
132
123
  }
133
124
  };
134
-
135
125
  // still no address
136
126
  if (!data.address.length) {
137
127
  for (i = data.text.length - 1; i >= 0; i--) {
@@ -142,61 +132,118 @@ function _handleAddress(tokens, inGroup) {
142
132
  }
143
133
  }
144
134
  }
145
-
146
135
  // If there's still is no text but a comment exixts, replace the two
147
136
  if (!data.text.length && data.comment.length) {
148
137
  data.text = data.comment;
149
138
  data.comment = [];
150
139
  }
151
-
152
140
  // Keep only the first address occurence, push others to regular text
153
141
  if (data.address.length > 1) {
154
142
  data.text = data.text.concat(data.address.splice(1));
155
143
  }
156
-
157
144
  // Join values with spaces
158
- data.text = data.text.join(' ');
159
- data.address = data.address.join(' ');
160
-
161
- if (!data.address && isGroup) {
162
- return [];
163
- } else {
164
- address = {
165
- address: data.address || data.text || '',
166
- name: data.text || data.address || ''
167
- };
168
-
169
- if (address.address === address.name) {
170
- if ((address.address || '').match(/@/)) {
171
- address.name = '';
172
- } else {
173
- address.address = '';
174
- }
145
+ const text = data.text.join(' ');
146
+ const addressText = data.address.join(' ');
147
+ const address = {
148
+ address: addressText || text || '',
149
+ name: text || addressText || ''
150
+ };
151
+ if (address.address === address.name) {
152
+ if ((address.address || '').match(/@/)) {
153
+ address.name = '';
154
+ }
155
+ else {
156
+ address.address = '';
175
157
  }
176
-
177
- addresses.push(address);
178
158
  }
159
+ addresses.push(address);
179
160
  }
180
-
181
161
  return addresses;
182
162
  }
183
-
184
163
  /**
185
164
  * Creates a Tokenizer object for tokenizing address field strings
186
165
  *
187
166
  * @constructor
188
167
  * @param {String} str Address field string
189
168
  */
190
- function Tokenizer(str) {
191
- this.str = (str || '').toString();
192
- this.operatorCurrent = '';
193
- this.operatorExpecting = '';
194
- this.node = null;
195
- this.escaped = false;
196
-
197
- this.list = [];
169
+ class Tokenizer {
170
+ constructor(str) {
171
+ this.str = (str || '').toString();
172
+ this.operatorCurrent = '';
173
+ this.operatorExpecting = '';
174
+ this.node = null;
175
+ this.escaped = false;
176
+ this.list = [];
177
+ }
178
+ /**
179
+ * Tokenizes the original input string
180
+ *
181
+ * @return {Array} An array of operator|text tokens
182
+ */
183
+ tokenize() {
184
+ let chr;
185
+ const list = [];
186
+ for (let i = 0, len = this.str.length; i < len; i++) {
187
+ chr = this.str.charAt(i);
188
+ this.checkChar(chr);
189
+ }
190
+ this.list.forEach(node => {
191
+ node.value = (node.value || '').toString().trim();
192
+ if (node.value) {
193
+ list.push(node);
194
+ }
195
+ });
196
+ return list;
197
+ }
198
+ /**
199
+ * Checks if a character is an operator or text and acts accordingly
200
+ *
201
+ * @param {String} chr Character from the address field
202
+ */
203
+ checkChar(chr) {
204
+ if ((chr in this.operators || chr === '\\') && this.escaped) {
205
+ this.escaped = false;
206
+ }
207
+ else if (this.operatorExpecting && chr === this.operatorExpecting) {
208
+ this.node = {
209
+ type: 'operator',
210
+ value: chr
211
+ };
212
+ this.list.push(this.node);
213
+ this.node = null;
214
+ this.operatorExpecting = '';
215
+ this.escaped = false;
216
+ return;
217
+ }
218
+ else if (!this.operatorExpecting && chr in this.operators) {
219
+ this.node = {
220
+ type: 'operator',
221
+ value: chr
222
+ };
223
+ this.list.push(this.node);
224
+ this.node = null;
225
+ this.operatorExpecting = this.operators[chr];
226
+ this.escaped = false;
227
+ return;
228
+ }
229
+ if (!this.escaped && chr === '\\') {
230
+ this.escaped = true;
231
+ return;
232
+ }
233
+ if (!this.node) {
234
+ this.node = {
235
+ type: 'text',
236
+ value: ''
237
+ };
238
+ this.list.push(this.node);
239
+ }
240
+ if (this.escaped && chr !== '\\') {
241
+ this.node.value += '\\';
242
+ }
243
+ this.node.value += chr;
244
+ this.escaped = false;
245
+ }
198
246
  }
199
-
200
247
  /**
201
248
  * Operator tokens and which tokens are expected to end the sequence
202
249
  */
@@ -207,77 +254,3 @@ Tokenizer.prototype.operators = {
207
254
  ',': '',
208
255
  ':': ';'
209
256
  };
210
-
211
- /**
212
- * Tokenizes the original input string
213
- *
214
- * @return {Array} An array of operator|text tokens
215
- */
216
- Tokenizer.prototype.tokenize = function () {
217
- let chr;
218
- const list = [];
219
- for (let i = 0, len = this.str.length; i < len; i++) {
220
- chr = this.str.charAt(i);
221
- this.checkChar(chr);
222
- }
223
-
224
- this.list.forEach(node => {
225
- node.value = (node.value || '').toString().trim();
226
- if (node.value) {
227
- list.push(node);
228
- }
229
- });
230
-
231
- return list;
232
- };
233
-
234
- /**
235
- * Checks if a character is an operator or text and acts accordingly
236
- *
237
- * @param {String} chr Character from the address field
238
- */
239
- Tokenizer.prototype.checkChar = function (chr) {
240
- if ((chr in this.operators || chr === '\\') && this.escaped) {
241
- this.escaped = false;
242
- } else if (this.operatorExpecting && chr === this.operatorExpecting) {
243
- this.node = {
244
- type: 'operator',
245
- value: chr
246
- };
247
- this.list.push(this.node);
248
- this.node = null;
249
- this.operatorExpecting = '';
250
- this.escaped = false;
251
- return;
252
- } else if (!this.operatorExpecting && chr in this.operators) {
253
- this.node = {
254
- type: 'operator',
255
- value: chr
256
- };
257
- this.list.push(this.node);
258
- this.node = null;
259
- this.operatorExpecting = this.operators[chr];
260
- this.escaped = false;
261
- return;
262
- }
263
-
264
- if (!this.escaped && chr === '\\') {
265
- this.escaped = true;
266
- return;
267
- }
268
-
269
- if (!this.node) {
270
- this.node = {
271
- type: 'text',
272
- value: ''
273
- };
274
- this.list.push(this.node);
275
- }
276
-
277
- if (this.escaped && chr !== '\\') {
278
- this.node.value += '\\';
279
- }
280
-
281
- this.node.value += chr;
282
- this.escaped = false;
283
- };
@@ -0,0 +1,31 @@
1
+ import type { Attribute, ParsedCommand } from './types.js';
2
+ /**
3
+ * Checks if a parsed argument is an atom, optionally a specific one
4
+ *
5
+ * @param {Object} value Parsed argument
6
+ * @param {String} [name] Upper case atom to match, the value is compared case-insensitively
7
+ * @return {Boolean} true for an atom (with that name)
8
+ */
9
+ declare function isAtom(value: Attribute, name?: string): boolean;
10
+ /**
11
+ * Checks if a parsed argument is an astring (RFC 3501 section 9): an atom, a quoted string or a literal. An
12
+ * atom the parser split into a section or partial range (like BODY[1]<0.5>) is not
13
+ *
14
+ * @param {Object} value Parsed argument
15
+ * @return {Boolean} true for an astring
16
+ */
17
+ declare function isAstring(value: Attribute): boolean;
18
+ /**
19
+ * The parser turns every NIL atom into null, as in an nstring. Where the grammar has an astring (mailbox names, user
20
+ * names, search strings, ...) NIL is an ordinary atom, so these nulls are turned back into atoms with the spelling
21
+ * the client used
22
+ *
23
+ * @param {Object} parsed Parsed command, changed in place
24
+ * @param {String} data Raw command line with its literals
25
+ * @param {Function} select `(path)` returns true for the nulls to restore, `path` lists the indexes from the
26
+ * top-level arguments down, e.g. [2, 0] for the first item of a list in the third argument
27
+ */
28
+ /** Indexes from the top-level arguments down to a nested value, `'section'` steps into the section of an atom */
29
+ export type ArgumentPath = (number | string)[];
30
+ declare function restoreNilAtoms(parsed: ParsedCommand, data: string, select: (path: ArgumentPath) => boolean): void;
31
+ export { isAtom, isAstring, restoreNilAtoms };