@remit/mailbox-service 0.0.110 → 0.0.112

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 (123) hide show
  1. package/package.json +21 -6
  2. package/src/body-part-mapper.ts +51 -1
  3. package/src/body-sync-queue.test.ts +39 -99
  4. package/src/body-sync-terminal.test.ts +115 -277
  5. package/src/body-sync-terminal.ts +10 -12
  6. package/src/body-sync.test.ts +925 -0
  7. package/src/body-sync.ts +226 -200
  8. package/src/classification-backfill.test.ts +197 -527
  9. package/src/classify-message.test.ts +11 -74
  10. package/src/external-move.test.ts +102 -209
  11. package/src/external-move.ts +13 -0
  12. package/src/filter-operations.test.ts +319 -0
  13. package/src/filter-operations.ts +377 -0
  14. package/src/filter-update.test.ts +313 -0
  15. package/src/filters/filter-config.test.ts +55 -197
  16. package/src/filters/filter-config.ts +4 -39
  17. package/src/filters/match.test.ts +1 -38
  18. package/src/filters/match.ts +3 -52
  19. package/src/filters/pipeline.test.ts +158 -289
  20. package/src/filters/pipeline.ts +56 -170
  21. package/src/flag-push-terminal.ts +9 -11
  22. package/src/flag-push.test.ts +76 -372
  23. package/src/flag-queue.test.ts +197 -0
  24. package/src/folder-operations.test.ts +273 -0
  25. package/src/folder-operations.ts +217 -0
  26. package/src/forwarded-message.test.ts +122 -0
  27. package/src/imapflow-connect-retry.test.ts +76 -113
  28. package/src/imapflow-connection.test.ts +34 -0
  29. package/src/imapflow-connection.ts +19 -15
  30. package/src/index.ts +59 -12
  31. package/src/list-id-backfill.test.ts +133 -499
  32. package/src/mailbox-cursor.test.ts +81 -189
  33. package/src/mailbox-delete-intent.test.ts +78 -205
  34. package/src/mailbox-intent.ts +5 -3
  35. package/src/mailbox-management.test.ts +107 -220
  36. package/src/mailbox-management.ts +1 -2
  37. package/src/mailbox-presence.test.ts +36 -34
  38. package/src/mailbox-queue.ts +2 -20
  39. package/src/mailbox-rename-intent.test.ts +156 -325
  40. package/src/mailbox-rename-subtree.test.ts +205 -582
  41. package/src/mailbox-sync.test.ts +182 -744
  42. package/src/message-move.test.ts +726 -0
  43. package/src/message-move.ts +227 -57
  44. package/src/message-read.ts +87 -0
  45. package/src/message-save-retry.test.ts +90 -0
  46. package/src/message-sync-flags.test.ts +10 -1
  47. package/src/message-sync.test.ts +762 -0
  48. package/src/message-sync.ts +409 -239
  49. package/src/mime-walker.ts +16 -15
  50. package/src/organize-job.ts +93 -0
  51. package/src/outbox-attachment.test.ts +97 -209
  52. package/src/outbox-failed-recovery.test.ts +198 -269
  53. package/src/outbox-queue.test.ts +24 -0
  54. package/src/outbox-queue.ts +25 -8
  55. package/src/ownership.ts +140 -0
  56. package/src/placement-move-terminal.ts +9 -12
  57. package/src/placement-move.ts +33 -6
  58. package/src/placement-settled.ts +28 -4
  59. package/src/placement.test.ts +404 -0
  60. package/src/quarantine.test.ts +90 -148
  61. package/src/quarantine.ts +3 -2
  62. package/src/refusal.ts +29 -0
  63. package/src/restore-source-placement.ts +0 -4
  64. package/src/spam-report.test.ts +238 -710
  65. package/src/sync-warning.test.ts +213 -0
  66. package/src/sync-warning.ts +56 -0
  67. package/src/test-helpers/fake-imap.ts +690 -0
  68. package/src/test-helpers/test-queue.ts +56 -0
  69. package/src/test-helpers/test-store.ts +299 -0
  70. package/src/thread-root.test.ts +29 -0
  71. package/src/thread-root.ts +51 -0
  72. package/src/types/mailparser-augment.d.ts +8 -0
  73. package/src/types.ts +1 -1
  74. package/src/adversarial-mime.e2e.test.ts +0 -307
  75. package/src/body-sync-auto-read-writeonce.test.ts +0 -219
  76. package/src/body-sync-calendar-suggestion.test.ts +0 -433
  77. package/src/body-sync-category-denormalize.test.ts +0 -352
  78. package/src/body-sync-category-override.test.ts +0 -501
  79. package/src/body-sync-category-writeonce.test.ts +0 -234
  80. package/src/body-sync-filter.test.ts +0 -237
  81. package/src/body-sync-placement-flags.test.ts +0 -347
  82. package/src/body-sync-placement-writeonce.test.ts +0 -337
  83. package/src/body-sync-quarantine.test.ts +0 -276
  84. package/src/body-sync-resync.test.ts +0 -605
  85. package/src/body-sync-unclassifiable-once.test.ts +0 -260
  86. package/src/body-sync-unsubscribed-auto-read.test.ts +0 -176
  87. package/src/filters/anchor-drift.ts +0 -55
  88. package/src/filters/message-embedder.test.ts +0 -39
  89. package/src/filters/message-embedder.ts +0 -33
  90. package/src/flag-push-terminal.test.ts +0 -209
  91. package/src/flag-queue-stars.test.ts +0 -171
  92. package/src/imapflow-connection.e2e.test.ts +0 -335
  93. package/src/imapflow-connection.integ.test.ts +0 -316
  94. package/src/message-delete-junk-reconcile.test.ts +0 -117
  95. package/src/message-delete-no-trash.test.ts +0 -245
  96. package/src/message-delete-unsettled-placement.test.ts +0 -396
  97. package/src/message-move-copy.test.ts +0 -562
  98. package/src/message-move-empty-trash.test.ts +0 -326
  99. package/src/message-move-same-mailbox.test.ts +0 -139
  100. package/src/message-move-unsettled-placement.test.ts +0 -378
  101. package/src/message-sync-address-spoof.test.ts +0 -293
  102. package/src/message-sync-category.test.ts +0 -142
  103. package/src/message-sync-changedsince.test.ts +0 -840
  104. package/src/message-sync-junk-harvest.test.ts +0 -244
  105. package/src/message-sync-quarantine.test.ts +0 -416
  106. package/src/message-sync-repoint.test.ts +0 -419
  107. package/src/outbox-queue-settled-row.test.ts +0 -140
  108. package/src/pass-through-unit-of-work.ts +0 -17
  109. package/src/placement-move-terminal.test.ts +0 -300
  110. package/src/placement-move-unsettled.test.ts +0 -275
  111. package/src/placement-transition-race.test.ts +0 -482
  112. package/src/stale-message-reconcile.test.ts +0 -82
  113. package/src/stale-message-reconcile.ts +0 -55
  114. package/src/test-helpers/isolated-mailbox.ts +0 -44
  115. package/src/test-helpers/mailfuzz-connection.ts +0 -27
  116. package/test/fixtures/mime-adversarial-e2e/01-octet-stream-pdf.eml +0 -21
  117. package/test/fixtures/mime-adversarial-e2e/02-nested-related-cid-image.eml +0 -31
  118. package/test/fixtures/mime-adversarial-e2e/03-calendar-invite.eml +0 -33
  119. package/test/fixtures/mime-adversarial-e2e/04-forwarded-rfc822-with-attachments.eml +0 -42
  120. package/test/fixtures/mime-adversarial-e2e/05-tnef-winmail.eml +0 -25
  121. package/test/fixtures/mime-adversarial-e2e/06-8bit-non-ascii.eml +0 -15
  122. package/test/fixtures/mime-adversarial-e2e/07-quoted-printable-soft-breaks.eml +0 -17
  123. package/test/fixtures/mime-adversarial-e2e/08-alternative-empty-text.eml +0 -18
@@ -1,142 +0,0 @@
1
- /**
2
- * A ThreadMessage row created for a message that is already classified used to
3
- * start at `uncategorized` and stay there: `denormalizeCategory` runs at
4
- * body-sync, and body-sync skips a message whose body is already stored (issue
5
- * #320). A second mailbox does not produce such a row — the ids are
6
- * mailbox-independent — but thread-root drift does: the same message re-saved
7
- * under different `References` mints a second threadId, so a new row for a
8
- * Message whose category is already decided.
9
- *
10
- * The row now carries the category of the Message the same save just wrote.
11
- * These pin the create input, which is where the threading can go wrong; the
12
- * stored round-trip belongs to #322's conformance suite. The negative case is
13
- * here because parameter threading is exactly the change that starts writing the
14
- * wrong value when a caller's variable is undefined — and `uncategorized` is the
15
- * declared pending state, never to be folded into `personal` (issue #45).
16
- */
17
-
18
- import assert from "node:assert/strict";
19
- import { describe, it } from "node:test";
20
- import type {
21
- CreateMessageInput,
22
- CreateThreadMessageInput,
23
- IAddressRepository,
24
- IEnvelopeRepository,
25
- IMailboxRepository,
26
- IMessageRepository,
27
- IThreadMessageRepository,
28
- MailboxItem,
29
- MessageItem,
30
- ThreadMessageItem,
31
- } from "@remit/data-ports";
32
- import { MessageCategory } from "@remit/domain-enums";
33
- import type { ManagedConnectionFactory } from "./connection-factory.js";
34
- import { type AccountFolderRoles, MessageSyncService } from "./message-sync.js";
35
- import { NO_FOLDER_ROLES, noFolderRoles } from "./test-helpers/folder-roles.js";
36
- import type { ImapMessage } from "./types.js";
37
-
38
- const envelope = {
39
- date: new Date(0).toISOString(),
40
- messageId: "<root@example.com>",
41
- subject: "Subject",
42
- from: [{ name: "Sender", mailbox: "sender", host: "example.com" }],
43
- sender: [],
44
- replyTo: [],
45
- to: [],
46
- cc: [],
47
- bcc: [],
48
- inReplyTo: "",
49
- };
50
-
51
- const imapMessage = {
52
- uid: 42,
53
- seq: 1,
54
- size: 100,
55
- internalDate: new Date(0),
56
- flags: [],
57
- envelope,
58
- } as unknown as ImapMessage;
59
-
60
- const stub = <T>(): T => ({}) as T;
61
-
62
- /**
63
- * Drive the real save path so the value the ThreadMessage gets is the one the
64
- * Message write returned, not one a test handed to a private method.
65
- */
66
- const saveIntoMailbox = async (
67
- storedCategory: MessageItem["category"],
68
- ): Promise<CreateThreadMessageInput> => {
69
- const inputs: CreateThreadMessageInput[] = [];
70
-
71
- const messageService = {
72
- upsertWithStatus: async (input: CreateMessageInput) => ({
73
- item: {
74
- ...input,
75
- category: storedCategory,
76
- } as unknown as MessageItem,
77
- created: false,
78
- }),
79
- } as unknown as IMessageRepository;
80
-
81
- const threadMessageService = {
82
- create: async (input: CreateThreadMessageInput) => {
83
- inputs.push(input);
84
- return input as unknown as ThreadMessageItem;
85
- },
86
- } as unknown as IThreadMessageRepository;
87
-
88
- const envelopeService = {
89
- upsertEnvelope: async () => {},
90
- upsertBodyParts: async () => {},
91
- } as unknown as IEnvelopeRepository;
92
-
93
- const addressService = {
94
- upsertCorrespondentAddress: async () => {},
95
- upsertEnvelopeAddress: async () => {},
96
- } as unknown as IAddressRepository;
97
-
98
- const service = new MessageSyncService(
99
- stub<ManagedConnectionFactory>(),
100
- stub<IMailboxRepository>(),
101
- noFolderRoles,
102
- messageService,
103
- envelopeService,
104
- addressService,
105
- threadMessageService,
106
- );
107
-
108
- await (
109
- service as unknown as {
110
- saveMessage: (
111
- mailbox: MailboxItem,
112
- accountId: string,
113
- accountConfigId: string,
114
- msg: ImapMessage,
115
- roles: AccountFolderRoles,
116
- ) => Promise<unknown>;
117
- }
118
- ).saveMessage(
119
- { mailboxId: "mbx-1", fullPath: "INBOX" } as MailboxItem,
120
- "acct-1",
121
- "cfg-1",
122
- imapMessage,
123
- NO_FOLDER_ROLES,
124
- );
125
-
126
- assert.equal(inputs.length, 1);
127
- const [input] = inputs;
128
- assert.ok(input);
129
- return input;
130
- };
131
-
132
- describe("a created ThreadMessage carries the Message's category", () => {
133
- it("gives a row for an already-classified message that message's category", async () => {
134
- const input = await saveIntoMailbox(MessageCategory.newsletter);
135
- assert.equal(input.category, MessageCategory.newsletter);
136
- });
137
-
138
- it("leaves a row for a new, unclassified message at uncategorized", async () => {
139
- const input = await saveIntoMailbox(MessageCategory.uncategorized);
140
- assert.equal(input.category, MessageCategory.uncategorized);
141
- });
142
- });