imapflow 1.7.8 → 2.0.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 (296) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +8 -2
  3. package/dist/cjs/charsets.d.ts +1 -0
  4. package/dist/cjs/charsets.js +294 -0
  5. package/dist/cjs/commands/append.d.ts +22 -0
  6. package/dist/cjs/commands/append.js +151 -0
  7. package/dist/cjs/commands/authenticate.d.ts +24 -0
  8. package/dist/cjs/commands/authenticate.js +223 -0
  9. package/dist/cjs/commands/capability.d.ts +8 -0
  10. package/dist/cjs/commands/capability.js +32 -0
  11. package/dist/cjs/commands/close.d.ts +8 -0
  12. package/dist/cjs/commands/close.js +39 -0
  13. package/dist/cjs/commands/compress.d.ts +8 -0
  14. package/dist/cjs/commands/compress.js +56 -0
  15. package/dist/cjs/commands/copy.d.ts +13 -0
  16. package/dist/cjs/commands/copy.js +44 -0
  17. package/dist/cjs/commands/copyuid-parser.d.ts +11 -0
  18. package/dist/cjs/commands/copyuid-parser.js +32 -0
  19. package/dist/cjs/commands/create.d.ts +11 -0
  20. package/dist/cjs/commands/create.js +80 -0
  21. package/dist/cjs/commands/delete.d.ts +11 -0
  22. package/dist/cjs/commands/delete.js +40 -0
  23. package/dist/cjs/commands/enable.d.ts +9 -0
  24. package/dist/cjs/commands/enable.js +61 -0
  25. package/dist/cjs/commands/esearch-parser.d.ts +17 -0
  26. package/dist/cjs/commands/esearch-parser.js +91 -0
  27. package/dist/cjs/commands/expunge.d.ts +12 -0
  28. package/dist/cjs/commands/expunge.js +60 -0
  29. package/dist/cjs/commands/fetch.d.ts +30 -0
  30. package/dist/cjs/commands/fetch.js +241 -0
  31. package/dist/cjs/commands/id.d.ts +10 -0
  32. package/dist/cjs/commands/id.js +80 -0
  33. package/dist/cjs/commands/idle.d.ts +9 -0
  34. package/dist/cjs/commands/idle.js +347 -0
  35. package/dist/cjs/commands/list.d.ts +16 -0
  36. package/dist/cjs/commands/list.js +520 -0
  37. package/dist/cjs/commands/login.d.ts +11 -0
  38. package/dist/cjs/commands/login.js +42 -0
  39. package/dist/cjs/commands/logout.d.ts +8 -0
  40. package/dist/cjs/commands/logout.js +47 -0
  41. package/dist/cjs/commands/move.d.ts +13 -0
  42. package/dist/cjs/commands/move.js +57 -0
  43. package/dist/cjs/commands/namespace.d.ts +25 -0
  44. package/dist/cjs/commands/namespace.js +139 -0
  45. package/dist/cjs/commands/noop.d.ts +8 -0
  46. package/dist/cjs/commands/noop.js +22 -0
  47. package/dist/cjs/commands/quota.d.ts +10 -0
  48. package/dist/cjs/commands/quota.js +119 -0
  49. package/dist/cjs/commands/rename.d.ts +12 -0
  50. package/dist/cjs/commands/rename.js +48 -0
  51. package/dist/cjs/commands/search.d.ts +15 -0
  52. package/dist/cjs/commands/search.js +228 -0
  53. package/dist/cjs/commands/select.d.ts +25 -0
  54. package/dist/cjs/commands/select.js +250 -0
  55. package/dist/cjs/commands/starttls.d.ts +8 -0
  56. package/dist/cjs/commands/starttls.js +30 -0
  57. package/dist/cjs/commands/status-fields.d.ts +14 -0
  58. package/dist/cjs/commands/status-fields.js +61 -0
  59. package/dist/cjs/commands/status.d.ts +12 -0
  60. package/dist/cjs/commands/status.js +108 -0
  61. package/dist/cjs/commands/store.d.ts +19 -0
  62. package/dist/cjs/commands/store.js +93 -0
  63. package/dist/cjs/commands/subscribe.d.ts +9 -0
  64. package/dist/cjs/commands/subscribe.js +31 -0
  65. package/dist/cjs/commands/unsubscribe.d.ts +9 -0
  66. package/dist/cjs/commands/unsubscribe.js +31 -0
  67. package/dist/cjs/connection-deadline.d.ts +49 -0
  68. package/dist/cjs/connection-deadline.js +91 -0
  69. package/dist/cjs/errors.d.ts +83 -0
  70. package/dist/cjs/errors.js +13 -0
  71. package/dist/cjs/handler/imap-compiler.d.ts +24 -0
  72. package/dist/cjs/handler/imap-compiler.js +285 -0
  73. package/dist/cjs/handler/imap-formal-syntax.d.ts +28 -0
  74. package/dist/cjs/handler/imap-formal-syntax.js +121 -0
  75. package/dist/cjs/handler/imap-handler.d.ts +9 -0
  76. package/dist/cjs/handler/imap-handler.js +10 -0
  77. package/dist/cjs/handler/imap-parser.d.ts +16 -0
  78. package/dist/cjs/handler/imap-parser.js +90 -0
  79. package/dist/cjs/handler/imap-stream.d.ts +181 -0
  80. package/dist/cjs/handler/imap-stream.js +446 -0
  81. package/dist/cjs/handler/limits.d.ts +25 -0
  82. package/dist/cjs/handler/limits.js +51 -0
  83. package/dist/cjs/handler/parser-instance.d.ts +68 -0
  84. package/dist/cjs/handler/parser-instance.js +223 -0
  85. package/dist/cjs/handler/token-parser.d.ts +91 -0
  86. package/dist/cjs/handler/token-parser.js +673 -0
  87. package/dist/cjs/handler/types.d.ts +91 -0
  88. package/dist/cjs/handler/types.js +4 -0
  89. package/dist/cjs/imap-commands.d.ts +16 -0
  90. package/dist/cjs/imap-commands.js +74 -0
  91. package/dist/cjs/imap-flow.d.ts +676 -0
  92. package/dist/cjs/imap-flow.js +3956 -0
  93. package/dist/cjs/jp-decoder.d.ts +12 -0
  94. package/dist/cjs/jp-decoder.js +79 -0
  95. package/dist/cjs/limited-passthrough.d.ts +25 -0
  96. package/dist/cjs/limited-passthrough.js +54 -0
  97. package/dist/cjs/logger.d.ts +3 -0
  98. package/dist/cjs/logger.js +11 -0
  99. package/dist/cjs/package-info.d.ts +3 -0
  100. package/dist/cjs/package-info.js +7 -0
  101. package/dist/cjs/package.json +3 -0
  102. package/dist/cjs/proxy-connection.d.ts +33 -0
  103. package/dist/cjs/proxy-connection.js +392 -0
  104. package/dist/cjs/search-compiler.d.ts +34 -0
  105. package/dist/cjs/search-compiler.js +476 -0
  106. package/dist/cjs/special-use.d.ts +22 -0
  107. package/dist/cjs/special-use.js +911 -0
  108. package/dist/cjs/tools.d.ts +427 -0
  109. package/dist/cjs/tools.js +1496 -0
  110. package/{lib/imap-flow.d.ts → dist/cjs/types.d.ts} +387 -517
  111. package/dist/cjs/types.js +5 -0
  112. package/dist/esm/charsets.d.ts +1 -0
  113. package/{lib → dist/esm}/charsets.js +1 -6
  114. package/dist/esm/commands/append.d.ts +22 -0
  115. package/{lib → dist/esm}/commands/append.js +22 -52
  116. package/dist/esm/commands/authenticate.d.ts +24 -0
  117. package/{lib → dist/esm}/commands/authenticate.js +62 -87
  118. package/dist/esm/commands/capability.d.ts +8 -0
  119. package/{lib → dist/esm}/commands/capability.js +6 -9
  120. package/dist/esm/commands/close.d.ts +8 -0
  121. package/{lib → dist/esm}/commands/close.js +6 -10
  122. package/dist/esm/commands/compress.d.ts +8 -0
  123. package/{lib → dist/esm}/commands/compress.js +7 -11
  124. package/dist/esm/commands/copy.d.ts +13 -0
  125. package/{lib → dist/esm}/commands/copy.js +12 -20
  126. package/dist/esm/commands/copyuid-parser.d.ts +11 -0
  127. package/{lib → dist/esm}/commands/copyuid-parser.js +9 -15
  128. package/dist/esm/commands/create.d.ts +11 -0
  129. package/{lib → dist/esm}/commands/create.js +13 -27
  130. package/dist/esm/commands/delete.d.ts +11 -0
  131. package/{lib → dist/esm}/commands/delete.js +9 -14
  132. package/dist/esm/commands/enable.d.ts +9 -0
  133. package/{lib → dist/esm}/commands/enable.js +23 -30
  134. package/dist/esm/commands/esearch-parser.d.ts +17 -0
  135. package/dist/esm/commands/esearch-parser.js +88 -0
  136. package/dist/esm/commands/expunge.d.ts +12 -0
  137. package/{lib → dist/esm}/commands/expunge.js +17 -22
  138. package/dist/esm/commands/fetch.d.ts +30 -0
  139. package/{lib → dist/esm}/commands/fetch.js +32 -64
  140. package/dist/esm/commands/id.d.ts +10 -0
  141. package/{lib → dist/esm}/commands/id.js +17 -23
  142. package/dist/esm/commands/idle.d.ts +9 -0
  143. package/{lib → dist/esm}/commands/idle.js +47 -81
  144. package/dist/esm/commands/list.d.ts +16 -0
  145. package/{lib → dist/esm}/commands/list.js +60 -123
  146. package/dist/esm/commands/login.d.ts +11 -0
  147. package/{lib → dist/esm}/commands/login.js +10 -15
  148. package/dist/esm/commands/logout.d.ts +8 -0
  149. package/{lib → dist/esm}/commands/logout.js +9 -11
  150. package/dist/esm/commands/move.d.ts +13 -0
  151. package/{lib → dist/esm}/commands/move.js +13 -21
  152. package/dist/esm/commands/namespace.d.ts +25 -0
  153. package/{lib → dist/esm}/commands/namespace.js +34 -44
  154. package/dist/esm/commands/noop.d.ts +8 -0
  155. package/{lib → dist/esm}/commands/noop.js +6 -7
  156. package/dist/esm/commands/quota.d.ts +10 -0
  157. package/{lib → dist/esm}/commands/quota.js +18 -36
  158. package/dist/esm/commands/rename.d.ts +12 -0
  159. package/{lib → dist/esm}/commands/rename.js +10 -15
  160. package/dist/esm/commands/search.d.ts +15 -0
  161. package/{lib → dist/esm}/commands/search.js +36 -135
  162. package/dist/esm/commands/select.d.ts +25 -0
  163. package/{lib → dist/esm}/commands/select.js +33 -64
  164. package/dist/esm/commands/starttls.d.ts +8 -0
  165. package/{lib → dist/esm}/commands/starttls.js +6 -8
  166. package/dist/esm/commands/status-fields.d.ts +14 -0
  167. package/{lib → dist/esm}/commands/status-fields.js +5 -16
  168. package/dist/esm/commands/status.d.ts +12 -0
  169. package/{lib → dist/esm}/commands/status.js +18 -29
  170. package/dist/esm/commands/store.d.ts +19 -0
  171. package/{lib → dist/esm}/commands/store.js +24 -37
  172. package/dist/esm/commands/subscribe.d.ts +9 -0
  173. package/{lib → dist/esm}/commands/subscribe.js +8 -12
  174. package/dist/esm/commands/unsubscribe.d.ts +9 -0
  175. package/{lib → dist/esm}/commands/unsubscribe.js +8 -12
  176. package/dist/esm/connection-deadline.d.ts +49 -0
  177. package/{lib → dist/esm}/connection-deadline.js +14 -25
  178. package/dist/esm/errors.d.ts +83 -0
  179. package/dist/esm/errors.js +9 -0
  180. package/dist/esm/handler/imap-compiler.d.ts +24 -0
  181. package/{lib → dist/esm}/handler/imap-compiler.js +22 -80
  182. package/dist/esm/handler/imap-formal-syntax.d.ts +28 -0
  183. package/dist/esm/handler/imap-formal-syntax.js +117 -0
  184. package/dist/esm/handler/imap-handler.d.ts +9 -0
  185. package/dist/esm/handler/imap-handler.js +9 -0
  186. package/dist/esm/handler/imap-parser.d.ts +16 -0
  187. package/{lib → dist/esm}/handler/imap-parser.js +31 -44
  188. package/dist/esm/handler/imap-stream.d.ts +181 -0
  189. package/{lib → dist/esm}/handler/imap-stream.js +29 -121
  190. package/dist/esm/handler/limits.d.ts +25 -0
  191. package/{lib → dist/esm}/handler/limits.js +13 -22
  192. package/dist/esm/handler/parser-instance.d.ts +68 -0
  193. package/{lib → dist/esm}/handler/parser-instance.js +19 -47
  194. package/dist/esm/handler/token-parser.d.ts +91 -0
  195. package/{lib → dist/esm}/handler/token-parser.js +71 -155
  196. package/dist/esm/handler/types.d.ts +91 -0
  197. package/dist/esm/handler/types.js +3 -0
  198. package/dist/esm/imap-commands.d.ts +16 -0
  199. package/dist/esm/imap-commands.js +67 -0
  200. package/dist/esm/imap-flow.d.ts +676 -0
  201. package/{lib → dist/esm}/imap-flow.js +769 -1790
  202. package/dist/esm/jp-decoder.d.ts +12 -0
  203. package/{lib → dist/esm}/jp-decoder.js +6 -21
  204. package/dist/esm/limited-passthrough.d.ts +25 -0
  205. package/{lib → dist/esm}/limited-passthrough.js +7 -20
  206. package/dist/esm/logger.d.ts +3 -0
  207. package/dist/esm/logger.js +4 -0
  208. package/dist/esm/package-info.d.ts +3 -0
  209. package/dist/esm/package-info.js +4 -0
  210. package/dist/esm/package.json +3 -0
  211. package/dist/esm/proxy-connection.d.ts +33 -0
  212. package/{lib → dist/esm}/proxy-connection.js +56 -127
  213. package/dist/esm/search-compiler.d.ts +34 -0
  214. package/{lib → dist/esm}/search-compiler.js +54 -110
  215. package/dist/esm/special-use.d.ts +22 -0
  216. package/dist/esm/special-use.js +907 -0
  217. package/dist/esm/tools.d.ts +427 -0
  218. package/dist/esm/tools.js +1446 -0
  219. package/dist/esm/types.d.ts +828 -0
  220. package/dist/esm/types.js +4 -0
  221. package/package.json +60 -20
  222. package/.gitattributes +0 -1
  223. package/.github/CODE_OF_CONDUCT.md +0 -76
  224. package/.github/FUNDING.yml +0 -4
  225. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
  226. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
  227. package/.github/contributing.md +0 -17
  228. package/.github/workflows/release.yaml +0 -36
  229. package/.github/workflows/stale.yml +0 -29
  230. package/.github/workflows/test.yml +0 -51
  231. package/.ncurc.js +0 -4
  232. package/.prettierignore +0 -4
  233. package/.prettierrc.js +0 -8
  234. package/.release-please-manifest.json +0 -3
  235. package/CLAUDE.md +0 -104
  236. package/Gruntfile.js +0 -23
  237. package/eslint.config.js +0 -45
  238. package/lib/handler/imap-formal-syntax.js +0 -189
  239. package/lib/handler/imap-handler.js +0 -17
  240. package/lib/imap-commands.js +0 -45
  241. package/lib/logger.js +0 -5
  242. package/lib/special-use.js +0 -923
  243. package/lib/tools.js +0 -1612
  244. package/release-please-config.json +0 -10
  245. package/test/authentication-test.js +0 -101
  246. package/test/auto-idle-test.js +0 -470
  247. package/test/bodystructure-test.js +0 -899
  248. package/test/charsets-test.js +0 -161
  249. package/test/commands-branches-test.js +0 -1095
  250. package/test/commands-integration-test.js +0 -11124
  251. package/test/commands-test.js +0 -73
  252. package/test/connection-edge-cases-test.js +0 -1828
  253. package/test/connection-test.js +0 -162
  254. package/test/copyuid-parser-test.js +0 -173
  255. package/test/fetch-generator-test.js +0 -218
  256. package/test/fixtures/fake-timers.js +0 -115
  257. package/test/fixtures/serialized-mimetorture.js +0 -2738
  258. package/test/fixtures/test-client.js +0 -101
  259. package/test/fixtures/test-tls.js +0 -8
  260. package/test/handler-branches-test.js +0 -310
  261. package/test/idle-polling-test.js +0 -518
  262. package/test/imap-compiler-test.js +0 -809
  263. package/test/imap-flow-compress-test.js +0 -166
  264. package/test/imap-flow-coverage-test.js +0 -612
  265. package/test/imap-flow-fetch-download-test.js +0 -909
  266. package/test/imap-flow-internals-test.js +0 -725
  267. package/test/imap-flow-methods-test.js +0 -889
  268. package/test/imap-flow-proxy-paths-test.js +0 -366
  269. package/test/imap-flow-secure-test.js +0 -573
  270. package/test/imap-flow-server-test.js +0 -1474
  271. package/test/imap-formal-syntax-test.js +0 -293
  272. package/test/imap-parser-test.js +0 -1474
  273. package/test/imap-stream-edge-cases-test.js +0 -666
  274. package/test/imap-stream-test.js +0 -177
  275. package/test/imapflow-test.js +0 -258
  276. package/test/integration/README.md +0 -52
  277. package/test/integration/dovecot-test.conf +0 -27
  278. package/test/integration/rev2-live-test.js +0 -431
  279. package/test/integration/run-rev2-tests.sh +0 -75
  280. package/test/integration-test.js +0 -83
  281. package/test/jp-decoder-test.js +0 -304
  282. package/test/limited-passthrough-test.js +0 -299
  283. package/test/memory-cleanup-test.js +0 -144
  284. package/test/memory-leak-test.js +0 -667
  285. package/test/parser-limits-test.js +0 -292
  286. package/test/proxy-connection-test.js +0 -738
  287. package/test/reliability-improvements-test.js +0 -548
  288. package/test/search-compiler-test.js +0 -1300
  289. package/test/search-test.js +0 -329
  290. package/test/special-use-test.js +0 -418
  291. package/test/starttls-injection-test.js +0 -181
  292. package/test/tag-correlation-test.js +0 -333
  293. package/test/timer-policy-test.js +0 -227
  294. package/test/token-parser-test.js +0 -456
  295. package/test/tools-test.js +0 -2013
  296. package/test/unhandled-rejection-test.js +0 -661
@@ -0,0 +1,907 @@
1
+ // Generic mail nouns that decorate a special-use folder name without changing what
2
+ // it means: "Sent Mail", "Gelöschte Elemente", "Отправленные письма". Stripping them
3
+ // lets a decorated name fall back to its core word. A name that still has more than
4
+ // one meaningful word left after stripping is treated as a user folder and rejected,
5
+ // which is what separates "Sent Mail" (a real Sent folder) from "Sent to clients".
6
+ // Words that name a special-use folder on their own (like "bin") do not belong here,
7
+ // and neither do hyphenated words, since TOKEN_SPLIT below splits on the hyphen and
8
+ // no such token could ever be produced.
9
+ // Folded by construction so the set matches the form tokens are compared against,
10
+ // the same invariant the name tables are tested for.
11
+ const GENERIC_TOKENS = new Set([
12
+ // English. "e" is here because TOKEN_SPLIT breaks on the hyphen, so the
13
+ // "e-mail" / "e-posta" / "e-kirjad" family arrives as a bare "e" token.
14
+ 'e',
15
+ 'mail',
16
+ 'mails',
17
+ 'email',
18
+ 'emails',
19
+ 'message',
20
+ 'messages',
21
+ 'item',
22
+ 'items',
23
+ 'folder',
24
+ 'my',
25
+ // German, Dutch, Nordic
26
+ 'objekt',
27
+ 'objekte',
28
+ 'objekten',
29
+ 'objekter',
30
+ 'elemente',
31
+ 'elementen',
32
+ 'elementer',
33
+ 'nachrichten',
34
+ 'berichten',
35
+ 'post',
36
+ 'poster',
37
+ 'viestit',
38
+ 'kirjad',
39
+ 'meldinger',
40
+ 'beskeder',
41
+ // Romance
42
+ 'correo',
43
+ 'posta',
44
+ 'courrier',
45
+ 'elementos',
46
+ 'elementi',
47
+ 'éléments',
48
+ 'mensajes',
49
+ 'messaggi',
50
+ 'mensagens',
51
+ 'itens',
52
+ // Slavic
53
+ 'poczta',
54
+ 'pošta',
55
+ 'elementy',
56
+ 'wiadomości',
57
+ 'položky',
58
+ 'správy',
59
+ 'письма',
60
+ 'письмо',
61
+ 'элементы',
62
+ 'сообщения',
63
+ 'пошта',
64
+ // Other
65
+ 'öğeler',
66
+ 'mesajlar',
67
+ 'μηνύματα',
68
+ 'στοιχεία'
69
+ ].map(token => token.toLowerCase().normalize('NFKC')));
70
+ // Word separators seen in folder names across clients.
71
+ const TOKEN_SPLIT = /[\s\-_/.,()[\]]+/;
72
+ // Localized folder name mappings for detecting special-use mailboxes.
73
+ // When the server does not advertise the SPECIAL-USE extension (RFC 6154),
74
+ // we fall back to matching folder names against these lists of known
75
+ // translations in various languages (including non-Latin scripts).
76
+ export const flags = ['\\All', '\\Archive', '\\Drafts', '\\Flagged', '\\Junk', '\\Sent', '\\Trash'];
77
+ export const names = {
78
+ '\\Sent': [
79
+ 'aika',
80
+ 'air a chur',
81
+ 'am post cuirte',
82
+ 'anfonwyd',
83
+ 'bidalia',
84
+ 'bidaliak',
85
+ 'bidalita',
86
+ 'bidalitakoak',
87
+ 'currieru mandatu',
88
+ 'danfonwyd',
89
+ 'dihantar',
90
+ 'e rometsweng',
91
+ 'e tindami',
92
+ 'elementos enviados',
93
+ 'elküldött',
94
+ 'elküldött elemek',
95
+ 'elküldött üzenetek',
96
+ 'elküldöttek',
97
+ 'enviadas',
98
+ 'enviados',
99
+ 'enviat',
100
+ 'enviats',
101
+ 'envoyés',
102
+ 'ethunyelweyo',
103
+ 'expediate',
104
+ 'ezipuru',
105
+ 'ferstjoerd',
106
+ 'gesendet',
107
+ 'gesendete',
108
+ 'gesendete elemente',
109
+ 'gestuur',
110
+ 'gönderilmiş',
111
+ 'gönderilmiş öğeler',
112
+ 'göndərilənlər',
113
+ 'hantar',
114
+ 'iberilen',
115
+ 'inviata',
116
+ 'inviate',
117
+ 'inviati',
118
+ 'išsiųsti',
119
+ 'išsiųsti laiškai',
120
+ 'išsiųstieji',
121
+ 'jo`natilgan xatlar',
122
+ 'jo‘natilgan',
123
+ 'kaset',
124
+ 'kuthunyelwe',
125
+ 'küldöttek',
126
+ 'lasa',
127
+ 'lähetetyt',
128
+ 'mesaje trimise',
129
+ 'messages envoyés',
130
+ 'naipadala',
131
+ 'nalefa',
132
+ 'napadala',
133
+ 'nosūtīts',
134
+ 'nosūtītās',
135
+ 'nosūtītās ziņas',
136
+ 'odeslaná pošta',
137
+ 'odeslané',
138
+ 'odoslaná',
139
+ 'odoslaná pošta',
140
+ 'odoslané',
141
+ 'padala',
142
+ 'poslana pošta',
143
+ 'poslane',
144
+ 'poslano',
145
+ 'poslané',
146
+ 'poslato',
147
+ 'posta inviata',
148
+ 'pósłane',
149
+ 'pósłany',
150
+ 'saadetud',
151
+ 'saadetud kirjad',
152
+ 'saadetud üksused',
153
+ 'senditujo',
154
+ 'sendt',
155
+ 'sendt post',
156
+ 'sendte',
157
+ 'sendte beskeder',
158
+ 'sent',
159
+ 'sent items',
160
+ 'sent messages',
161
+ 'seolta',
162
+ 'siūsti',
163
+ 'skickat',
164
+ 'sända poster',
165
+ 'sänt',
166
+ 'sūtīt',
167
+ 'terkirim',
168
+ 'thư đã gửi',
169
+ 'ti fi ranṣẹ',
170
+ 'titaq',
171
+ 'tramess',
172
+ 'trimis',
173
+ 'trimise',
174
+ 'ttwaznen',
175
+ 'të dërguar',
176
+ 'të dërguara',
177
+ 'unviaos',
178
+ 'unvios fechos',
179
+ 'verschéckt',
180
+ 'verzonden',
181
+ 'verzonden berichten',
182
+ 'vilivyotumwa',
183
+ 'wysłane',
184
+ 'éléments envoyés',
185
+ 'đã gửi',
186
+ 'şandî',
187
+ 'απεσταλμένα',
188
+ 'σταλθέντα',
189
+ 'адпраўлена',
190
+ 'жиберилген',
191
+ 'жіберілген',
192
+ 'жіберілген хаттар',
193
+ 'жіберілгендер',
194
+ 'изпратени',
195
+ 'изпратени писма',
196
+ 'илгээсэн',
197
+ 'ирсол шуд',
198
+ 'испратени',
199
+ 'испратено',
200
+ 'надіслані',
201
+ 'отправленные',
202
+ 'пасланыя',
203
+ 'послате',
204
+ 'послато',
205
+ 'пратени',
206
+ 'юборилган',
207
+ 'ուղարկուած',
208
+ 'ուղարկված',
209
+ 'נשלח',
210
+ 'נשלחו',
211
+ 'פריטים שנשלחו',
212
+ 'ئەۋەتىلگەن',
213
+ 'ارسال شده',
214
+ 'ارسالی',
215
+ 'البريد المرسل',
216
+ 'المرسل',
217
+ 'المرسلة',
218
+ 'المُرسَل',
219
+ 'بھیجا ہوا میل',
220
+ 'بھیجے گئے',
221
+ 'سوزمژہ',
222
+ 'لېږل شوي ليکونه',
223
+ 'لېګل شوی',
224
+ 'موارد ارسال شده',
225
+ 'مُرسَل',
226
+ 'نێردراو',
227
+ 'पठईएका मेलहरु',
228
+ 'पाठवलेले',
229
+ 'पाठविले',
230
+ 'पाठविलेले',
231
+ 'प्रेषित',
232
+ 'भेजा गया',
233
+ 'भेजे गए',
234
+ 'পাঠানো হয়েছে',
235
+ 'প্রেরিত',
236
+ 'প্রেরিত(পাঠানো মেইল)',
237
+ 'প্ৰেৰিত',
238
+ 'ਭੇਜੇ',
239
+ 'મોકલેલા',
240
+ 'મોકલેલ્યા',
241
+ 'ପଠାଗଲା',
242
+ 'அனுப்பிய அஞ்சல்',
243
+ 'அனுப்பியவை',
244
+ 'పంపించబడింది',
245
+ 'ಕಳುಹಿಸಲಾದ',
246
+ 'അയച്ചവ',
247
+ 'അയച്ചു',
248
+ 'යැවු පණිවුඩ',
249
+ 'යැවූ',
250
+ 'ที่ส่งแล้ว',
251
+ 'ส่ง',
252
+ 'ส่งแล้ว',
253
+ 'გაგზავნილი',
254
+ 'ዝተለኣኸ',
255
+ 'የተላኩ',
256
+ 'បាន​ផ្ញើ',
257
+ 'សំបុត្រដែលបានបញ្ជូន',
258
+ '寄件備份',
259
+ '已发信息',
260
+ '已发送',
261
+ '已发送消息',
262
+ '已发送邮件',
263
+ '送信済み',
264
+ '送信済みアイテム',
265
+ '送信済みトレイ',
266
+ '送信済みメール',
267
+ '발신 메시지',
268
+ '보낸 편지함',
269
+ '보냄'
270
+ ],
271
+ '\\Trash': [
272
+ 'an sgudal',
273
+ 'articole șterse',
274
+ 'atkritne',
275
+ 'bin',
276
+ 'borttaget',
277
+ 'borttagna objekt',
278
+ 'bosca bruscair',
279
+ 'bruscar',
280
+ 'cestino',
281
+ 'chanaster da palpiri',
282
+ 'chiqitdon',
283
+ 'corbe a papiro',
284
+ 'corbeille',
285
+ 'coș de gunoi',
286
+ 'curbella',
287
+ 'deleted',
288
+ 'deleted items',
289
+ 'deleted messages',
290
+ 'dzēstie vienumi',
291
+ 'elementi eliminati',
292
+ 'elementos borrados',
293
+ 'elementos eliminados',
294
+ 'elements suprimits',
295
+ 'eliminata',
296
+ 'gelöscht',
297
+ 'gelöschte elemente',
298
+ 'gelöschte objekte',
299
+ 'gunoi',
300
+ 'hedhurina',
301
+ 'item dipadam',
302
+ 'itens apagados',
303
+ 'itens eliminados',
304
+ 'itens excluídos',
305
+ 'ištrinti',
306
+ 'iḍuman',
307
+ 'jiskefet',
308
+ 'jêbirdank',
309
+ 'kanta',
310
+ 'kest',
311
+ 'kosz',
312
+ 'koš',
313
+ 'kuka',
314
+ 'kustutatud',
315
+ 'kustutatud üksused',
316
+ 'kôš',
317
+ 'lixeira',
318
+ 'lixo',
319
+ 'lomtár',
320
+ 'molwuj',
321
+ 'mục đã xóa',
322
+ 'obrisane stavke',
323
+ 'odpadkový kôš',
324
+ 'odstraněná pošta',
325
+ 'odstraněné položky',
326
+ 'papeleira',
327
+ 'papelera',
328
+ 'paperera',
329
+ 'papierkorb',
330
+ 'papirkorg',
331
+ 'papirkurv',
332
+ 'papjernik',
333
+ 'papperskorg',
334
+ 'papperskorgen',
335
+ 'papīrgrozs',
336
+ 'papīrkurvis',
337
+ 'pesan terhapus',
338
+ 'pod-lastez',
339
+ 'poistetut',
340
+ 'poubelle',
341
+ 'praht',
342
+ 'prullenbak',
343
+ 'prügikast',
344
+ 'reciclagem',
345
+ 'roskakori',
346
+ 'rubujo',
347
+ 'rusl',
348
+ 'savat',
349
+ 'sbwriel',
350
+ 'sgudal',
351
+ 'silinmiş öğeler',
352
+ 'skrell',
353
+ 'sletta',
354
+ 'slettede beskeder',
355
+ 'slettede elementer',
356
+ 'slettet',
357
+ 'smeti',
358
+ 'smeće',
359
+ 'snippermandjie',
360
+ 'surat terhapus',
361
+ 'səbət',
362
+ 'thùng rác',
363
+ 'tong sampah',
364
+ 'trash',
365
+ 'törölt',
366
+ 'törölt elemek',
367
+ 'usunięte',
368
+ 'usunięte wiadomości',
369
+ 'verwijderde items',
370
+ 'vymazané správy',
371
+ 'zakarrontzia',
372
+ 'çöp',
373
+ 'çöp kutusu',
374
+ 'éléments supprimés',
375
+ 'šiukšliadėžė',
376
+ 'šiukšlinė',
377
+ 'šiukšlių dėžė',
378
+ 'șterse',
379
+ 'απορρίμματα',
380
+ 'διαγραμμένα',
381
+ 'κάδος απορριμάτων',
382
+ 'κάδος απορριμμάτων',
383
+ 'видалені',
384
+ 'выдаленыя',
385
+ 'жойылғандар',
386
+ 'избришани',
387
+ 'изтрити',
388
+ 'канта',
389
+ 'корзина',
390
+ 'корпа',
391
+ 'кошик',
392
+ 'кошче',
393
+ 'обрисане ставке',
394
+ 'себет',
395
+ 'сметніца',
396
+ 'смеће',
397
+ 'смітник',
398
+ 'удаленные',
399
+ 'удалённые',
400
+ 'хогийн сав',
401
+ 'қоқыс шелегі',
402
+ 'աղբարկղ',
403
+ 'אשפה',
404
+ 'פריטים שנמחקו',
405
+ 'اشغال دانی',
406
+ 'العناصر المحذوفة',
407
+ 'المهملات',
408
+ 'ردی کی ٹوکری',
409
+ 'زباله‌دان',
410
+ 'زبڵدان',
411
+ 'موارد حذف شده',
412
+ 'مُهملات',
413
+ 'کثافت دانۍ',
414
+ 'कचरा',
415
+ 'कचरा पेटी',
416
+ 'रद्दी',
417
+ 'रद्दी टोकरी',
418
+ 'ঝুড়ি',
419
+ 'ডাস্টবিন',
420
+ 'કચરો',
421
+ 'குப்பை',
422
+ 'ചവറ്റുകുട്ട',
423
+ 'ඉවතලන බඳුන',
424
+ 'ถังขยะ',
425
+ 'รายการที่ลบ',
426
+ 'ნაგავი',
427
+ 'ურნა',
428
+ 'წაშლილი',
429
+ 'እንዳጉሓፍ',
430
+ 'ធុងសំរាម',
431
+ 'ごみ箱',
432
+ 'ゴミ箱',
433
+ '削除済みアイテム',
434
+ '回收站',
435
+ '垃圾桶',
436
+ '已删除邮件',
437
+ '已刪除項目',
438
+ '废件箱',
439
+ '지운 편지함',
440
+ '휴지통'
441
+ ],
442
+ '\\Junk': [
443
+ 'aspam',
444
+ 'basura',
445
+ 'brukalas',
446
+ 'bulk mail',
447
+ 'cajk',
448
+ 'correo basura',
449
+ 'correo lixo',
450
+ 'correo no deseado',
451
+ 'correu brossa',
452
+ 'corréu puxarra',
453
+ 'courrier indésirable',
454
+ 'dramhaíl',
455
+ 'dramhphost',
456
+ 'gemors',
457
+ 'gemorspos',
458
+ 'gereksiz',
459
+ 'indesiderata',
460
+ 'indesirate',
461
+ 'indésirables',
462
+ 'istenmeyen',
463
+ 'istenmeyen e-posta',
464
+ 'i̇stenmeyen',
465
+ 'junk',
466
+ 'junk e-mail',
467
+ 'junk email',
468
+ 'junk mail',
469
+ 'junk-e-mail',
470
+ 'kéretlen',
471
+ 'lastez',
472
+ 'levélszemét',
473
+ 'lixo electrónico',
474
+ 'lixo eletrónico',
475
+ 'lixo eletrônico',
476
+ 'mel remeh',
477
+ 'mesaje nedorite',
478
+ 'møsn',
479
+ 'mēstule',
480
+ 'mēstules',
481
+ 'nepoželjne',
482
+ 'nesolicitate',
483
+ 'net-winske',
484
+ 'nevyžiadaná pošta',
485
+ 'nevyžádaná',
486
+ 'nevyžádaná pošta',
487
+ 'nevēlams',
488
+ 'nezaželeno',
489
+ 'neželena pošta',
490
+ 'neželena sporočila',
491
+ 'neželjena pošta',
492
+ 'niechciane',
493
+ 'no deseado',
494
+ 'nungiavischà',
495
+ 'ongewenst',
496
+ 'ongewenste e-mail',
497
+ 'posta indesiderata',
498
+ 'posta indesirate',
499
+ 'pourriel',
500
+ 'pourriels',
501
+ 'puxarra',
502
+ 'roskaa',
503
+ 'roskaposti',
504
+ 'roskapostit',
505
+ 'ruslpóstur',
506
+ 'rämps',
507
+ 'rämpspost',
508
+ 'sbam',
509
+ "seq'",
510
+ 'skräp',
511
+ 'skräppost',
512
+ 'sothach',
513
+ 'spam',
514
+ 'spamowanie',
515
+ 'spamujo',
516
+ 'stroboù',
517
+ 'szemét',
518
+ 'søppelpost',
519
+ 'thư rác',
520
+ 'truilleis',
521
+ 'të pavlera',
522
+ 'të pavlerë',
523
+ 'uønsket',
524
+ 'uønsket e-mail',
525
+ 'uønsket e-post',
526
+ 'uønsket post',
527
+ 'uønskt',
528
+ 'wiadomości-śmieci',
529
+ 'zabor-posta',
530
+ 'zaborra',
531
+ 'önemsiz',
532
+ 'čapor',
533
+ 'šiukšlės',
534
+ 'šlamštas',
535
+ 'ανεπιθύμητα',
536
+ 'ανεπιθύμητη αλληλογραφία',
537
+ 'небажана пошта',
538
+ 'нежелана поща',
539
+ 'нежелательная почта',
540
+ 'непажаданая пошта',
541
+ 'непожељна пошта',
542
+ 'непожељне',
543
+ 'непожељно',
544
+ 'непосакувана пошта',
545
+ 'спам',
546
+ 'қалаусыз пошта',
547
+ 'անպիտան',
548
+ 'թափոն',
549
+ 'սպամ',
550
+ 'דואר זבל',
551
+ 'זבל',
552
+ 'الرسائل العشوائية',
553
+ 'الرسائل غير المرغوب فيها',
554
+ 'بنجل',
555
+ 'بیکاره',
556
+ 'بێکه‌ڵک',
557
+ 'جنک',
558
+ 'جنک میل',
559
+ 'سُخام',
560
+ 'غير المرغوب',
561
+ 'هرزنامه',
562
+ 'नको असलेले कचरा संदेश',
563
+ 'स्पाम',
564
+ 'स्पैम',
565
+ 'আজেবাজে মেইল',
566
+ 'எரிதம்',
567
+ 'ആവശ്യമില്ലാത്തവ',
568
+ 'සුන්බුන්',
569
+ 'กล่องจดหมายขยะ',
570
+ 'ขยะ',
571
+ 'สแปม',
572
+ 'อีเมลขยะ',
573
+ 'სპამი',
574
+ 'ჯართი',
575
+ 'እንዳቅንጠመንጢ',
576
+ 'សំបុត្រមិនល្អ',
577
+ 'ឥត​បាន​ការ',
578
+ '垃圾',
579
+ '垃圾信件',
580
+ '垃圾邮件',
581
+ '垃圾郵件',
582
+ '垃圾電郵',
583
+ '迷惑メール',
584
+ '스팸',
585
+ '스팸 편지함',
586
+ '정크',
587
+ '정크 메일'
588
+ ],
589
+ '\\Drafts': [
590
+ 'arewway',
591
+ 'ba brouillon',
592
+ 'borrador',
593
+ 'borradores',
594
+ 'bozze',
595
+ 'brouilhedoù',
596
+ 'brouillonen',
597
+ 'brouillons',
598
+ 'bruttacopie',
599
+ 'bản thảo',
600
+ 'ciorne',
601
+ 'concepten',
602
+ 'draf',
603
+ 'drafftiau',
604
+ 'draft',
605
+ 'drafts',
606
+ 'dreachdan',
607
+ 'dréachtaí',
608
+ 'drög',
609
+ 'entwürfe',
610
+ 'esborranys',
611
+ 'esbossos',
612
+ 'garalamalar',
613
+ 'ihe edeturu',
614
+ 'iidrafti',
615
+ 'izinhlaka',
616
+ 'juodraščiai',
617
+ 'jusamaj',
618
+ 'kladd',
619
+ 'kladdar',
620
+ 'kladder',
621
+ 'koncepty',
622
+ 'konsep',
623
+ 'konsepte',
624
+ 'konsepten',
625
+ 'kopie robocze',
626
+ 'layihələr',
627
+ 'luonnokset',
628
+ 'malnetujo',
629
+ 'melnraksti',
630
+ 'meralo',
631
+ 'mesaje nefinalizate',
632
+ 'mesazhe të padërguara',
633
+ 'mga draft',
634
+ 'mustandid',
635
+ 'nacerjenja',
636
+ 'nacrti',
637
+ 'naćiski',
638
+ 'nedovršene',
639
+ 'nedovršeno',
640
+ 'onvoltooid',
641
+ 'osnutki',
642
+ 'piszkozatok',
643
+ 'qaralamalar',
644
+ 'qoralama xatlar',
645
+ 'qoralamalar',
646
+ 'rascunhos',
647
+ 'rasimu',
648
+ 'reşnivîs',
649
+ 'rozepsané',
650
+ 'sbozs',
651
+ 'skica',
652
+ 'skice',
653
+ 'skitsur',
654
+ 'szkice',
655
+ 'taslak',
656
+ 'taslaklar',
657
+ 'thư nháp',
658
+ 'tsararrun saƙonni',
659
+ 'utkast',
660
+ 'uzmetumi',
661
+ 'vakiraoka',
662
+ 'versiones provisori',
663
+ 'vázlatok',
664
+ 'wersje robocze',
665
+ 'zirriborroak',
666
+ 'àwọn àkọpamọ́',
667
+ 'προσχέδια',
668
+ 'πρόχειρα',
669
+ 'драфтови',
670
+ 'жоба жазбалар',
671
+ 'жобалар',
672
+ 'нацрти',
673
+ 'недовршене',
674
+ 'недовршено',
675
+ 'непратени',
676
+ 'нооргууд',
677
+ 'ноорог',
678
+ 'сиёҳнавис',
679
+ 'скици',
680
+ 'хомаки хатлар',
681
+ 'чарнавікі',
682
+ 'чернетки',
683
+ 'чернови',
684
+ 'черновики',
685
+ 'черновиктер',
686
+ 'шимай қағаз',
687
+ 'սեւագրեր',
688
+ 'טיוטות',
689
+ 'المسودات',
690
+ 'بارليک',
691
+ 'قوليازمىلار',
692
+ 'مسودات',
693
+ 'مسوّدات',
694
+ 'موسودې',
695
+ 'نامه های ناتکمیل',
696
+ 'پیش نویسها',
697
+ 'پیش‌نویس‌ها',
698
+ 'ڈرافٹ',
699
+ 'ڈرافٹ/',
700
+ 'ڕه‌شنووسەکان',
701
+ 'ड्राफ़ट',
702
+ 'ड्राफ़्ट',
703
+ 'ड्राफ्ट',
704
+ 'ड्राफ्टहरू',
705
+ 'प्रारूप',
706
+ 'मसुदा',
707
+ 'খসড়া',
708
+ 'ড্ৰাফ্ট',
709
+ 'ਡ੍ਰਾਫਟ',
710
+ 'ડ્રાફ્ટ',
711
+ 'ડ્રાફ્ટસ',
712
+ 'ଡ୍ରାଫ୍ଟ',
713
+ 'வரைவுகள்',
714
+ 'చిత్తు ప్రతులు',
715
+ 'ಕರಡುಗಳು',
716
+ 'കരടുകള്‍',
717
+ 'ഡ്രാഫ്റ്റുകൾ',
718
+ 'പൂര്‍ത്തിയാകാത്തവ',
719
+ 'කටු සටහන්',
720
+ 'කෙටුම් පත්',
721
+ 'กล่องจดหมายร่าง',
722
+ 'ฉบับร่าง',
723
+ 'ร่าง',
724
+ 'လိက်အပြောံ',
725
+ 'დროებითი',
726
+ 'მონახაზები',
727
+ 'წინასწარი',
728
+ 'ረቂቆች',
729
+ 'ወጡን ጽሑፍ',
730
+ 'សារព្រាង',
731
+ 'សេចក្ដី​ព្រាង​',
732
+ 'សំបុត្រពង្រៀង',
733
+ '下書き',
734
+ '草稿',
735
+ '草稿匣',
736
+ '草稿箱',
737
+ '임시 보관함',
738
+ '초안'
739
+ ],
740
+ '\\Archive': [
741
+ 'an chartlann',
742
+ 'archief',
743
+ 'archieven',
744
+ 'archif',
745
+ 'archifau',
746
+ 'archiv',
747
+ 'archivados',
748
+ 'archivar',
749
+ 'archive',
750
+ 'archives',
751
+ 'archivi',
752
+ 'archivio',
753
+ 'archivo',
754
+ 'archivos',
755
+ 'archivovať',
756
+ 'archivs',
757
+ 'archivu',
758
+ 'archiválás',
759
+ 'archiwum',
760
+ 'archiwy',
761
+ 'archyvas',
762
+ 'archyvuoti',
763
+ 'archív',
764
+ 'archívum',
765
+ 'archívy',
766
+ 'argief',
767
+ 'argiven',
768
+ 'argyf',
769
+ 'arhiiv',
770
+ 'arhiv',
771
+ 'arhiva',
772
+ 'arhive',
773
+ 'arhivi',
774
+ 'arhivă',
775
+ 'arhīvi',
776
+ 'arhīvs',
777
+ 'arkib',
778
+ 'arkisto',
779
+ 'arkiv',
780
+ 'arkiva',
781
+ 'arkiver',
782
+ 'arkivo',
783
+ 'arkivoje',
784
+ 'arquivamento',
785
+ 'arquivo',
786
+ 'arquivo morto',
787
+ 'arquivos',
788
+ 'arsip',
789
+ 'artxibatu',
790
+ 'artxiboa',
791
+ 'artxiboak',
792
+ 'arxiu',
793
+ 'arxiv',
794
+ 'arxivlar',
795
+ 'arşiv',
796
+ 'arşivler',
797
+ 'aḥraz',
798
+ 'cartlanna',
799
+ 'diell',
800
+ 'dielloù',
801
+ 'erşîv',
802
+ 'geymsla',
803
+ 'goym í skjalasavni',
804
+ 'iɣbaren',
805
+ 'lưu trữ',
806
+ 'skjalageymsla',
807
+ "taq yakb'äl",
808
+ 'tasg-lannan',
809
+ 'αρχειοθέτηση',
810
+ 'αρχειοθήκη',
811
+ 'архив',
812
+ 'архива',
813
+ 'архиве',
814
+ 'архиви',
815
+ 'архивирай',
816
+ 'архивтер',
817
+ 'архивы',
818
+ 'архів',
819
+ 'архіви',
820
+ 'архівы',
821
+ 'архіў',
822
+ 'мұрағат',
823
+ 'արխիվ',
824
+ 'արխիւներ',
825
+ 'ארכיון',
826
+ 'أرشفة',
827
+ 'أرشيف',
828
+ 'ئارخىپ',
829
+ 'ئەرشیف',
830
+ 'ارشیو',
831
+ 'الأرشيف',
832
+ 'بایگانی',
833
+ 'जतन केलेला',
834
+ 'संग्रह',
835
+ 'ശേഖരം',
836
+ 'සංරක්‍ෂණය',
837
+ 'การเก็บถาวร',
838
+ 'ที่เก็บถาวร',
839
+ 'არქივები',
840
+ 'არქივი',
841
+ 'ប័ណ្ណសារ',
842
+ 'ប័ណ្ណសារ​',
843
+ 'アーカイブ',
844
+ '備存',
845
+ '存档',
846
+ '存檔',
847
+ '封存',
848
+ '归档',
849
+ '보관 편지함',
850
+ '보관함',
851
+ '저장 편지함'
852
+ ]
853
+ };
854
+ // Exact lookup index over the tables above, built once at module load. `names` is
855
+ // treated as read-only from here on; nothing in the library mutates it after this point.
856
+ const NAME_INDEX = new Map();
857
+ for (let flag of Object.keys(names)) {
858
+ for (let entry of names[flag]) {
859
+ NAME_INDEX.set(entry, flag);
860
+ }
861
+ }
862
+ // Fold a folder name into the form the name tables are stored in.
863
+ // Remove U+200E (LEFT-TO-RIGHT MARK) which some mail clients (especially for
864
+ // RTL languages like Arabic, Hebrew) insert into folder names for display purposes.
865
+ // These invisible marks would otherwise prevent exact string matching.
866
+ // Normalize with NFKC last: the same folder name can arrive in different but
867
+ // equivalent forms depending on the client that created it, and matching is exact.
868
+ // NFKC rather than NFC because the compatibility folding is what maps halfwidth
869
+ // katakana and fullwidth Latin onto the regular forms that servers actually send.
870
+ // Every entry in the tables above is stored in NFKC form, which a test asserts.
871
+ function normalizeName(name) {
872
+ return name
873
+ .toLowerCase()
874
+ .replace(/\u200e/g, '')
875
+ .trim()
876
+ .normalize('NFKC');
877
+ }
878
+ export const specialUse = (hasSpecialUseExtension, folder) => {
879
+ // If the server supports SPECIAL-USE (RFC 6154), check for special-use flags first.
880
+ // Extension-provided flags take precedence over name-based detection because they
881
+ // are authoritative - the server explicitly marks the folder's role.
882
+ if (hasSpecialUseExtension) {
883
+ const flag = flags.find(flag => folder.flags.has(flag));
884
+ if (flag) {
885
+ return { flag, source: 'extension' };
886
+ }
887
+ }
888
+ let name = normalizeName(folder.name);
889
+ // Fallback 1: the name is exactly a known localized folder name.
890
+ let flag = NAME_INDEX.get(name);
891
+ if (flag) {
892
+ return { flag, source: 'name' };
893
+ }
894
+ // Fallback 2: the name is a known folder name decorated with generic mail nouns
895
+ // ("Sent Mail", "Otpravlennye pisma"). Stripping them has to leave exactly one word,
896
+ // and that word still has to be a known name - this tier never matches approximately.
897
+ // Reported as a separate, lower priority source because the decoration makes it a
898
+ // weaker signal than an exactly named folder.
899
+ let core = name.split(TOKEN_SPLIT).filter(token => token && !GENERIC_TOKENS.has(token));
900
+ if (core.length === 1 && core[0] !== name) {
901
+ flag = NAME_INDEX.get(core[0]);
902
+ if (flag) {
903
+ return { flag, source: 'name-guess' };
904
+ }
905
+ }
906
+ return { flag: null };
907
+ };