@fluxmail/provider-outlook 0.4.0

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.
package/LICENSE.md ADDED
@@ -0,0 +1,111 @@
1
+ # Fluxmail Proprietary License Agreement
2
+
3
+ Version 1.0, July 12, 2026
4
+
5
+ Copyright © 2026 Fluxmail. All rights reserved.
6
+
7
+ This Fluxmail Proprietary License Agreement (the “Agreement”) is between Fluxmail and the individual or entity accepting this Agreement (“you”). If you use the Software for an organization, you represent that you have authority to bind that organization, and “you” includes that organization.
8
+
9
+ By downloading, copying, installing, modifying, or using the Software, you accept this Agreement. If you do not accept it, do not use the Software.
10
+
11
+ ## 1. Definitions
12
+
13
+ “Software” means the Fluxmail software distributed with this Agreement, including its source code, object code, documentation, and any Fluxmail updates or modifications provided under this Agreement. Software does not include Third-Party Software.
14
+
15
+ “License Entitlement” means the users, mailboxes, instances, features, usage limits, term, and other rights authorized by a license key, built-in plan, order form, subscription record, or other written authorization issued by Fluxmail.
16
+
17
+ “Production Use” means using the Software for live personal, business, organizational, customer-facing, or revenue-generating operations. It includes processing live mailbox data or making the Software available to users other than solely for development, testing, security review, or evaluation.
18
+
19
+ “Non-Production Use” means private development, testing, security review, or evaluation that does not process live operations or provide a service to end users.
20
+
21
+ “Third-Party Software” means software identified as third-party or open-source software, including dependencies distributed with or used by the Software.
22
+
23
+ “Competing Product” means a product or service whose primary purpose is to provide third parties with a self-hosted or hosted email integration server, email-agent interface, or email API offering substantially similar core functionality to the Software. It does not include software developed and used solely for your own internal operations.
24
+
25
+ ## 2. License grant
26
+
27
+ Subject to this Agreement, Fluxmail grants you a limited, worldwide, non-exclusive, non-transferable, non-sublicensable license to:
28
+
29
+ 1. view, audit, download, copy, compile, and run the Software for Non-Production Use;
30
+ 2. make private modifications to the Software for your own use;
31
+ 3. make reasonable backup and archival copies;
32
+ 4. use GitHub’s standard public-repository features to view and fork the Software solely as needed to exercise the rights in items 1 through 3; and
33
+ 5. use the Software in Production Use only within a valid License Entitlement.
34
+
35
+ A License Entitlement may be offered without charge. A zero-dollar or built-in entitlement remains subject to this Agreement and to its stated limits.
36
+
37
+ All rights not expressly granted in this Agreement are reserved by Fluxmail.
38
+
39
+ ## 3. License Entitlements and technical controls
40
+
41
+ Your Production Use must stay within your License Entitlement. A License Entitlement applies only to the person, organization, and instances it covers. You may not share a license key outside that person or organization or use it on more instances than authorized.
42
+
43
+ You may not modify, remove, disable, circumvent, bypass, or interfere with any license-key validation, entitlement enforcement, usage metering, plan limitation, or other technical restriction in the Software. You may not enable or expose functionality protected by any of those controls except as authorized by your License Entitlement.
44
+
45
+ Modified versions and derivative works containing any part of the Software remain subject to this Agreement. Production Use of them requires a valid License Entitlement covering that use.
46
+
47
+ ## 4. Restrictions
48
+
49
+ Unless Fluxmail gives you separate written permission, you may not:
50
+
51
+ 1. distribute, publish, sell, sublicense, rent, lease, or otherwise provide the Software or a modified version to a third party;
52
+ 2. publish or maintain a fork for distributing the Software, providing production-ready builds to others, avoiding License Entitlements, or operating a Competing Product;
53
+ 3. offer the Software or its substantial features to third parties as a hosted, managed, time-sharing, or service-bureau product;
54
+ 4. white-label the Software or represent it as your own product;
55
+ 5. embed or incorporate the Software into a product or service distributed or provided to third parties;
56
+ 6. use the Software or its source code to develop, train, support, or operate a Competing Product;
57
+ 7. exceed or help another person exceed a License Entitlement;
58
+ 8. remove, alter, or obscure copyright, license, attribution, or trademark notices; or
59
+ 9. use Fluxmail names, logos, or trademarks except as allowed by applicable law or separate written permission.
60
+
61
+ These restrictions do not limit rights that applicable law does not allow Fluxmail to restrict.
62
+
63
+ ## 5. Ownership and modifications
64
+
65
+ Fluxmail and its licensors retain all right, title, and interest in the Software, including all intellectual property rights. This Agreement does not transfer ownership of the Software to you.
66
+
67
+ As between you and Fluxmail, you retain ownership of code you write independently. Your ownership of a modification does not give you rights in the underlying Software or permission to distribute or commercially exploit a combined or derivative work.
68
+
69
+ ## 6. Third-Party Software
70
+
71
+ Third-Party Software is licensed under its own terms, not this Agreement. If a third-party license conflicts with this Agreement for that Third-Party Software, the third-party license controls for that component. You are responsible for complying with applicable third-party terms.
72
+
73
+ ## 7. Orders, subscriptions, and other agreements
74
+
75
+ Pricing, payment, renewal, cancellation, support, and service terms may be stated in an order form, subscription terms, or another agreement with Fluxmail. If that agreement conflicts with this Agreement, it controls for the specific subject and parties it covers.
76
+
77
+ Each release of the Software is governed by the license version distributed with that release. Fluxmail may distribute later releases under updated terms, but updated terms do not change the license for a release you already received unless you agree otherwise.
78
+
79
+ ## 8. Term and termination
80
+
81
+ This Agreement continues until terminated. It terminates automatically if you materially breach it and do not cure the breach within 30 days after receiving notice from Fluxmail. A breach involving circumvention of technical controls, unauthorized distribution, or misuse of a license key may be terminated immediately if it cannot reasonably be cured.
82
+
83
+ When this Agreement terminates, you must stop using and delete all copies of the Software in your possession or control, except copies you must retain by law. Sections 4 through 12 survive termination. Termination does not affect rights or remedies that accrued before termination.
84
+
85
+ Expiration, cancellation, or downgrade of a License Entitlement may reduce or end your authorized Production Use without terminating this Agreement. Any grace period or restricted mode is determined by the applicable License Entitlement and the Software release you use.
86
+
87
+ ## 9. Disclaimer of warranties
88
+
89
+ TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED “AS IS” AND “AS AVAILABLE,” WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND. FLUXMAIL DISCLAIMS ALL EXPRESS, IMPLIED, AND STATUTORY WARRANTIES, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NON-INFRINGEMENT, AND THAT THE SOFTWARE WILL BE SECURE, UNINTERRUPTED, OR ERROR-FREE.
90
+
91
+ ## 10. Limitation of liability
92
+
93
+ TO THE MAXIMUM EXTENT PERMITTED BY LAW, FLUXMAIL WILL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR ANY LOSS OF DATA, REVENUE, PROFITS, GOODWILL, OR BUSINESS OPPORTUNITY, ARISING OUT OF OR RELATED TO THE SOFTWARE OR THIS AGREEMENT, EVEN IF FLUXMAIL WAS ADVISED THAT SUCH DAMAGES WERE POSSIBLE.
94
+
95
+ TO THE MAXIMUM EXTENT PERMITTED BY LAW, FLUXMAIL’S TOTAL LIABILITY ARISING OUT OF OR RELATED TO THE SOFTWARE OR THIS AGREEMENT WILL NOT EXCEED THE GREATER OF (A) THE AMOUNT YOU PAID FLUXMAIL FOR THE SOFTWARE DURING THE 12 MONTHS BEFORE THE EVENT GIVING RISE TO THE CLAIM OR (B) US$100.
96
+
97
+ Some jurisdictions do not allow certain warranty disclaimers or liability limitations. In those jurisdictions, these provisions apply only to the extent permitted by law.
98
+
99
+ ## 11. Notices
100
+
101
+ Fluxmail may give you notice under this Agreement by email to any address you provided in connection with a License Entitlement, order, subscription, support request, or other communication with Fluxmail. An email notice is deemed received on the first business day after it is sent unless Fluxmail receives a delivery-failure message. You are responsible for keeping your contact information current.
102
+
103
+ ## 12. General terms
104
+
105
+ You may not assign or transfer this Agreement or your License Entitlement without Fluxmail’s prior written consent. Fluxmail may assign this Agreement in connection with a merger, acquisition, reorganization, or sale of substantially all related assets.
106
+
107
+ If any provision of this Agreement is unenforceable, it will be enforced to the maximum extent permitted, and the remaining provisions will remain in effect. A waiver must be in writing and applies only to the specific instance stated. Headings are for convenience and do not affect interpretation.
108
+
109
+ This Agreement is governed by the laws of the State of New Jersey, excluding its conflict-of-law rules. Any dispute arising out of or relating to the Software or this Agreement must be brought exclusively in a state or federal court of competent jurisdiction located in New Jersey. You and Fluxmail consent to the personal jurisdiction of those courts. This paragraph does not limit rights that applicable law does not allow a party to waive.
110
+
111
+ This Agreement, together with any applicable License Entitlement and agreement described in Section 7, is the entire agreement between you and Fluxmail about the Software and replaces prior discussions or understandings about its licensing.
@@ -0,0 +1,16 @@
1
+ import { EmailError } from '@fluxmail/core';
2
+ export interface GraphErrorLike {
3
+ status?: number;
4
+ code?: string;
5
+ message?: string;
6
+ retryAfterMs?: number;
7
+ }
8
+ export declare class GraphHttpError extends Error implements GraphErrorLike {
9
+ readonly status: number;
10
+ readonly code: string | undefined;
11
+ readonly retryAfterMs?: number | undefined;
12
+ constructor(status: number, code: string | undefined, message: string, retryAfterMs?: number | undefined);
13
+ }
14
+ export declare function isRetryableGraphError(err: unknown): boolean;
15
+ export declare function toEmailError(err: unknown): EmailError;
16
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAe,SAAQ,KAAM,YAAW,cAAc;IAE/D,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAEjC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;gBAHrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GAAG,SAAS,EACjC,OAAO,EAAE,MAAM,EACN,YAAY,CAAC,EAAE,MAAM,YAAA;CAKjC;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG3D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAoBrD"}
package/dist/errors.js ADDED
@@ -0,0 +1,40 @@
1
+ import { EmailError } from '@fluxmail/core';
2
+ export class GraphHttpError extends Error {
3
+ status;
4
+ code;
5
+ retryAfterMs;
6
+ constructor(status, code, message, retryAfterMs) {
7
+ super(message);
8
+ this.status = status;
9
+ this.code = code;
10
+ this.retryAfterMs = retryAfterMs;
11
+ this.name = 'GraphHttpError';
12
+ }
13
+ }
14
+ export function isRetryableGraphError(err) {
15
+ const status = err.status;
16
+ return status === 429 || status === 500 || status === 502 || status === 503 || status === 504;
17
+ }
18
+ export function toEmailError(err) {
19
+ if (err instanceof EmailError)
20
+ return err;
21
+ const graph = err;
22
+ const message = graph.message ?? 'Microsoft Graph request failed';
23
+ if (graph.status === 401 || /InvalidAuthenticationToken|invalid_grant/i.test(graph.code ?? message)) {
24
+ return new EmailError('auth_expired', `Microsoft authorization expired or was revoked: ${message}`);
25
+ }
26
+ if (graph.status === 429 || graph.code === 'ErrorQuotaExceeded') {
27
+ return new EmailError('rate_limited', `Microsoft Graph rate limit hit: ${message}`);
28
+ }
29
+ if (graph.status === 403 || graph.code === 'ErrorAccessDenied') {
30
+ return new EmailError('permission_denied', `Microsoft Graph denied this operation: ${message}`);
31
+ }
32
+ if (graph.status === 404 || graph.code === 'ErrorItemNotFound') {
33
+ return new EmailError('not_found', `Not found in Microsoft Graph: ${message}`);
34
+ }
35
+ if (graph.status === 400 || graph.status === 409 || graph.status === 412) {
36
+ return new EmailError('invalid_request', `Microsoft Graph rejected the request: ${message}`);
37
+ }
38
+ return new EmailError('provider_unavailable', `Microsoft Graph unavailable: ${message}`);
39
+ }
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAS5C,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B;IACA;IAEA;IAJX,YACW,MAAc,EACd,IAAwB,EACjC,OAAe,EACN,YAAqB;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QALN,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAoB;QAExB,iBAAY,GAAZ,YAAY,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,MAAM,MAAM,GAAI,GAAsB,CAAC,MAAM,CAAC;IAC9C,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,UAAU;QAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,KAAK,GAAG,GAAqB,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,gCAAgC,CAAC;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;QACpG,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,mDAAmD,OAAO,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;QAChE,OAAO,IAAI,UAAU,CAAC,cAAc,EAAE,mCAAmC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAC/D,OAAO,IAAI,UAAU,CAAC,mBAAmB,EAAE,0CAA0C,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAC/D,OAAO,IAAI,UAAU,CAAC,WAAW,EAAE,iCAAiC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzE,OAAO,IAAI,UAAU,CAAC,iBAAiB,EAAE,yCAAyC,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,sBAAsB,EAAE,gCAAgC,OAAO,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { OutlookProvider, OUTLOOK_CAPABILITIES } from './outlookProvider.js';
2
+ export type { OutlookProviderOptions, MicrosoftAccessTokenProvider } from './outlookProvider.js';
3
+ export { GraphHttpError, isRetryableGraphError, toEmailError as toOutlookEmailError } from './errors.js';
4
+ export { toGraphQuery } from './query.js';
5
+ export { parseGraphAttachment, parseGraphMessage, toGraphRecipients } from './parse.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { OutlookProvider, OUTLOOK_CAPABILITIES } from './outlookProvider.js';
2
+ export { GraphHttpError, isRetryableGraphError, toEmailError as toOutlookEmailError } from './errors.js';
3
+ export { toGraphQuery } from './query.js';
4
+ export { parseGraphAttachment, parseGraphMessage, toGraphRecipients } from './parse.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { type AttachmentMeta, type Capabilities, type DraftInput, type EmailProvider, type EmailQuery, type Folder, type GetAttachmentOpts, type GetMessageOpts, type Message, type ModifyAction, type Page, type PageOpts, type SendResult, type Thread } from '@fluxmail/core';
2
+ export interface MicrosoftAccessTokenProvider {
3
+ getAccessToken(forceRefresh?: boolean): Promise<string>;
4
+ }
5
+ export interface OutlookProviderOptions {
6
+ accountId: string;
7
+ tokenProvider: MicrosoftAccessTokenProvider;
8
+ fetch?: typeof globalThis.fetch;
9
+ }
10
+ export declare const OUTLOOK_CAPABILITIES: Capabilities;
11
+ export declare class OutlookProvider implements EmailProvider {
12
+ readonly capabilities: Capabilities;
13
+ private readonly accountId;
14
+ private readonly tokenProvider;
15
+ private readonly fetchImpl;
16
+ private folderCache;
17
+ constructor(options: OutlookProviderOptions);
18
+ private url;
19
+ private request;
20
+ testConnection(): Promise<void>;
21
+ private collection;
22
+ private folderSnapshot;
23
+ listFolders(): Promise<Folder[]>;
24
+ private resolveFolder;
25
+ listMessages(query: EmailQuery, page?: PageOpts): Promise<Page<Message>>;
26
+ private rawMessage;
27
+ getMessage(id: string, options?: GetMessageOpts): Promise<Message>;
28
+ getThread(threadId: string): Promise<Thread>;
29
+ private draftPayload;
30
+ private decodedAttachment;
31
+ private addAttachment;
32
+ private replaceAttachments;
33
+ createDraft(draft: DraftInput): Promise<Message>;
34
+ getDraft(draftId: string): Promise<Message>;
35
+ updateDraft(draftId: string, draft: DraftInput): Promise<Message>;
36
+ deleteDraft(draftId: string): Promise<void>;
37
+ send(input: DraftInput | {
38
+ draftId: string;
39
+ }): Promise<SendResult>;
40
+ private move;
41
+ private assertMessagesOutsideTrash;
42
+ modify(ids: string[], action: ModifyAction): Promise<void>;
43
+ getAttachment(messageId: string, attachmentId: string, options?: GetAttachmentOpts): Promise<{
44
+ meta: AttachmentMeta;
45
+ content: Buffer;
46
+ }>;
47
+ }
48
+ //# sourceMappingURL=outlookProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outlookProvider.d.ts","sourceRoot":"","sources":["../src/outlookProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,MAAM,EAEX,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,MAAM,EACZ,MAAM,gBAAgB,CAAC;AA+CxB,MAAM,WAAW,4BAA4B;IAC3C,cAAc,CAAC,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,4BAA4B,CAAC;IAC5C,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,eAAO,MAAM,oBAAoB,EAAE,YAKlC,CAAC;AA4HF,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,YAAY,eAAwB;IAE7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,WAAW,CAA8D;gBAErE,OAAO,EAAE,sBAAsB;IAM3C,OAAO,CAAC,GAAG;YASG,OAAO;IAmDf,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;YAIvB,UAAU;YAWV,cAAc;IA4EtB,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAIxB,aAAa;IAWrB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAmDpE,UAAU;IAQlB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IActE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAclD,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,iBAAiB;YAQX,aAAa;YA8Cb,kBAAkB;IAmB1B,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BhD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBjE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3C,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YAsB1D,IAAI;YAaJ,0BAA0B;IAelC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA0D1D,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAkBtD"}
@@ -0,0 +1,605 @@
1
+ import { EmailError, replySubject, } from '@fluxmail/core';
2
+ import { GraphHttpError, isRetryableGraphError, toEmailError } from './errors.js';
3
+ import { parseGraphAttachment, parseGraphMessage, toGraphRecipients } from './parse.js';
4
+ import { toGraphQuery } from './query.js';
5
+ const GRAPH_ROOT = 'https://graph.microsoft.com/v1.0';
6
+ const DEFAULT_PAGE_SIZE = 25;
7
+ const MAX_PAGE_SIZE = 100;
8
+ const FOLDER_CACHE_TTL_MS = 60_000;
9
+ const MAX_RETRIES = 3;
10
+ const SMALL_ATTACHMENT_LIMIT = 3 * 1024 * 1024;
11
+ const UPLOAD_CHUNK_BYTES = 12 * 320 * 1024;
12
+ const MESSAGE_LIST_FIELDS = [
13
+ 'id',
14
+ 'conversationId',
15
+ 'parentFolderId',
16
+ 'from',
17
+ 'toRecipients',
18
+ 'ccRecipients',
19
+ 'bccRecipients',
20
+ 'replyTo',
21
+ 'subject',
22
+ 'receivedDateTime',
23
+ 'sentDateTime',
24
+ 'createdDateTime',
25
+ 'bodyPreview',
26
+ 'isRead',
27
+ 'isDraft',
28
+ 'flag',
29
+ 'hasAttachments',
30
+ ].join(',');
31
+ const MESSAGE_FULL_FIELDS = `${MESSAGE_LIST_FIELDS},body`;
32
+ const ATTACHMENT_SELECT = 'id,name,contentType,size,isInline,contentId';
33
+ const ATTACHMENT_METADATA_SELECT = 'id,name,contentType,size,isInline';
34
+ const WELL_KNOWN_FOLDERS = [
35
+ { id: 'inbox', role: 'inbox', name: 'Inbox' },
36
+ { id: 'sentitems', role: 'sent', name: 'Sent Items' },
37
+ { id: 'drafts', role: 'drafts', name: 'Drafts' },
38
+ { id: 'deleteditems', role: 'trash', name: 'Deleted Items' },
39
+ { id: 'junkemail', role: 'spam', name: 'Junk Email' },
40
+ { id: 'archive', role: 'archive', name: 'Archive' },
41
+ ];
42
+ export const OUTLOOK_CAPABILITIES = {
43
+ labels: false,
44
+ serverThreads: true,
45
+ serverSearch: 'rich',
46
+ snippets: true,
47
+ };
48
+ function sleep(ms) {
49
+ return new Promise((resolve) => setTimeout(resolve, ms));
50
+ }
51
+ function assertAttachmentSize(sizeBytes, maxBytes) {
52
+ if (maxBytes !== undefined && sizeBytes > maxBytes) {
53
+ throw new EmailError('invalid_request', 'Attachment is too large to return through MCP.', {
54
+ sizeBytes,
55
+ maxBytes,
56
+ });
57
+ }
58
+ }
59
+ function bodyFor(draft) {
60
+ if (draft.body.html !== undefined)
61
+ return { contentType: 'HTML', content: draft.body.html };
62
+ return { contentType: 'Text', content: draft.body.text ?? '' };
63
+ }
64
+ function encodePageToken(url, localFilter) {
65
+ const payload = { url, ...(localFilter ? { localFilter } : {}) };
66
+ return Buffer.from(JSON.stringify(payload)).toString('base64url');
67
+ }
68
+ function decodePageToken(token) {
69
+ try {
70
+ const value = Buffer.from(token, 'base64url').toString('utf8');
71
+ let parsed;
72
+ try {
73
+ parsed = JSON.parse(value);
74
+ }
75
+ catch {
76
+ // Accept tokens issued before local search filters were added.
77
+ parsed = { url: value };
78
+ }
79
+ if (!parsed || typeof parsed !== 'object' || typeof parsed.url !== 'string') {
80
+ throw new Error();
81
+ }
82
+ const payload = parsed;
83
+ const url = new URL(payload.url);
84
+ if (url.origin !== 'https://graph.microsoft.com' || !url.pathname.startsWith('/v1.0/'))
85
+ throw new Error();
86
+ let localFilter;
87
+ if (payload.localFilter !== undefined) {
88
+ if (!payload.localFilter || typeof payload.localFilter !== 'object' || Array.isArray(payload.localFilter)) {
89
+ throw new Error();
90
+ }
91
+ const entries = Object.entries(payload.localFilter);
92
+ const booleanKeys = new Set(['unreadOnly', 'starredOnly', 'hasAttachment', 'allMailScope']);
93
+ if (entries.some(([key, value]) => !booleanKeys.has(key) || value !== true)) {
94
+ throw new Error();
95
+ }
96
+ localFilter = payload.localFilter;
97
+ }
98
+ return { url: url.toString(), ...(localFilter ? { localFilter } : {}) };
99
+ }
100
+ catch {
101
+ throw new EmailError('invalid_request', 'Invalid Microsoft Graph page token');
102
+ }
103
+ }
104
+ function localMessageFilter(query, allMailScope = false) {
105
+ const filter = {
106
+ ...(query.unreadOnly ? { unreadOnly: true } : {}),
107
+ ...(query.starredOnly ? { starredOnly: true } : {}),
108
+ ...(query.hasAttachment ? { hasAttachment: true } : {}),
109
+ ...(allMailScope ? { allMailScope: true } : {}),
110
+ };
111
+ return Object.keys(filter).length ? filter : undefined;
112
+ }
113
+ function matchesLocalMessageFilter(message, filter, allMailExcludedFolderIds) {
114
+ if (!filter)
115
+ return true;
116
+ if (filter.unreadOnly && message.isRead !== false)
117
+ return false;
118
+ if (filter.starredOnly && message.flag?.flagStatus !== 'flagged')
119
+ return false;
120
+ if (filter.hasAttachment && message.hasAttachments !== true)
121
+ return false;
122
+ if (filter.allMailScope && message.parentFolderId && allMailExcludedFolderIds.has(message.parentFolderId))
123
+ return false;
124
+ return true;
125
+ }
126
+ function escapeOData(value) {
127
+ return value.replaceAll("'", "''");
128
+ }
129
+ function graphAttachment(input) {
130
+ return {
131
+ '@odata.type': '#microsoft.graph.fileAttachment',
132
+ name: input.filename,
133
+ contentType: input.mimeType,
134
+ contentBytes: input.content,
135
+ ...(input.contentId ? { contentId: input.contentId } : {}),
136
+ isInline: input.disposition === 'inline',
137
+ };
138
+ }
139
+ export class OutlookProvider {
140
+ capabilities = OUTLOOK_CAPABILITIES;
141
+ accountId;
142
+ tokenProvider;
143
+ fetchImpl;
144
+ folderCache;
145
+ constructor(options) {
146
+ this.accountId = options.accountId;
147
+ this.tokenProvider = options.tokenProvider;
148
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
149
+ }
150
+ url(pathOrUrl) {
151
+ if (!/^https?:/i.test(pathOrUrl))
152
+ return `${GRAPH_ROOT}${pathOrUrl.startsWith('/') ? '' : '/'}${pathOrUrl}`;
153
+ const url = new URL(pathOrUrl);
154
+ if (url.origin !== 'https://graph.microsoft.com' || !url.pathname.startsWith('/v1.0/')) {
155
+ throw new EmailError('invalid_request', 'Microsoft Graph returned an invalid continuation URL');
156
+ }
157
+ return url.toString();
158
+ }
159
+ async request(pathOrUrl, init = {}, options = {}) {
160
+ const url = this.url(pathOrUrl);
161
+ let forceRefresh = false;
162
+ let lastError;
163
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {
164
+ try {
165
+ const headers = new Headers(init.headers);
166
+ headers.set('accept', 'application/json');
167
+ headers.set('prefer', 'IdType="ImmutableId"');
168
+ if (options.includeAuth !== false) {
169
+ headers.set('authorization', `Bearer ${await this.tokenProvider.getAccessToken(forceRefresh)}`);
170
+ }
171
+ if (init.body !== undefined && !headers.has('content-type'))
172
+ headers.set('content-type', 'application/json');
173
+ const response = await this.fetchImpl(url, { ...init, headers });
174
+ if (response.ok) {
175
+ if (response.status === 202 || response.status === 204)
176
+ return undefined;
177
+ const text = await response.text();
178
+ return (text ? JSON.parse(text) : undefined);
179
+ }
180
+ let payload = {};
181
+ try {
182
+ payload = (await response.json());
183
+ }
184
+ catch {
185
+ // Some Exchange gateways return an HTML or empty error response.
186
+ }
187
+ const retryAfter = response.headers.get('retry-after');
188
+ const retryAfterMs = retryAfter ? Math.max(0, Number(retryAfter) * 1_000) : undefined;
189
+ const error = new GraphHttpError(response.status, payload.error?.code, payload.error?.message ?? response.statusText ?? 'Microsoft Graph request failed', retryAfterMs);
190
+ if (response.status === 401 && !forceRefresh) {
191
+ forceRefresh = true;
192
+ lastError = error;
193
+ continue;
194
+ }
195
+ throw error;
196
+ }
197
+ catch (error) {
198
+ lastError = error;
199
+ const retryable = isRetryableGraphError(error) && (!options.nonIdempotent || error.status === 429);
200
+ if (!retryable || attempt === MAX_RETRIES)
201
+ break;
202
+ const retryAfterMs = error.retryAfterMs;
203
+ await sleep(retryAfterMs ?? 250 * 2 ** attempt);
204
+ }
205
+ }
206
+ throw toEmailError(lastError);
207
+ }
208
+ async testConnection() {
209
+ await this.request('/me/mailFolders/inbox?$select=id');
210
+ }
211
+ async collection(pathOrUrl) {
212
+ const items = [];
213
+ let next = pathOrUrl;
214
+ while (next) {
215
+ const page = await this.request(next);
216
+ items.push(...(page.value ?? []));
217
+ next = page['@odata.nextLink'];
218
+ }
219
+ return items;
220
+ }
221
+ async folderSnapshot(forceRefresh = false) {
222
+ if (!forceRefresh && this.folderCache && Date.now() - this.folderCache.fetchedAt < FOLDER_CACHE_TTL_MS) {
223
+ return this.folderCache.snapshot;
224
+ }
225
+ const roleById = new Map();
226
+ await Promise.all(WELL_KNOWN_FOLDERS.map(async (known) => {
227
+ try {
228
+ const raw = await this.request(`/me/mailFolders/${known.id}?$select=id`);
229
+ if (raw.id)
230
+ roleById.set(raw.id, known.role);
231
+ }
232
+ catch (error) {
233
+ if (!(error instanceof EmailError) || error.code !== 'not_found' || known.role !== 'archive')
234
+ throw error;
235
+ }
236
+ }));
237
+ const trashFolderId = [...roleById].find(([, role]) => role === 'trash')?.[0];
238
+ const spamFolderId = [...roleById].find(([, role]) => role === 'spam')?.[0];
239
+ const trashFolderIds = new Set(trashFolderId ? [trashFolderId] : []);
240
+ const allMailExcludedRootFolderIds = new Set([trashFolderId, spamFolderId].filter((id) => Boolean(id)));
241
+ const allMailExcludedFolderIds = new Set(allMailExcludedRootFolderIds);
242
+ const rawFolders = [];
243
+ const visited = new Set();
244
+ const walk = async (path, parentPath, visibleBranch = true, insideTrash = false, insideAllMailExcluded = false) => {
245
+ const children = await this.collection(path);
246
+ for (const raw of children) {
247
+ if (!raw.id || !raw.displayName || visited.has(raw.id))
248
+ continue;
249
+ visited.add(raw.id);
250
+ const folderIsVisible = visibleBranch && !raw.isHidden;
251
+ const folderIsInTrash = insideTrash || raw.id === trashFolderId;
252
+ const folderIsAllMailExcluded = insideAllMailExcluded || raw.id === trashFolderId || raw.id === spamFolderId;
253
+ if (folderIsVisible)
254
+ rawFolders.push({ raw, parentPath });
255
+ if (folderIsInTrash)
256
+ trashFolderIds.add(raw.id);
257
+ if (folderIsAllMailExcluded)
258
+ allMailExcludedFolderIds.add(raw.id);
259
+ if ((raw.childFolderCount ?? 0) > 0 && (folderIsVisible || folderIsInTrash || folderIsAllMailExcluded)) {
260
+ const childPath = `${parentPath ? `${parentPath}/` : ''}${raw.displayName}`;
261
+ await walk(`/me/mailFolders/${encodeURIComponent(raw.id)}/childFolders?includeHiddenFolders=true&$top=100`, childPath, folderIsVisible, folderIsInTrash, folderIsAllMailExcluded);
262
+ }
263
+ }
264
+ };
265
+ await walk('/me/mailFolders?includeHiddenFolders=true&$top=100', '');
266
+ const folders = rawFolders.map(({ raw, parentPath }) => ({
267
+ id: raw.id,
268
+ name: parentPath ? `${parentPath}/${raw.displayName}` : raw.displayName,
269
+ ...(roleById.get(raw.id) ? { role: roleById.get(raw.id) } : {}),
270
+ ...(typeof raw.unreadItemCount === 'number' ? { unreadCount: raw.unreadItemCount } : {}),
271
+ }));
272
+ folders.push({ id: 'starred', name: 'Flagged', role: 'starred' }, { id: 'all', name: 'All mail', role: 'all' });
273
+ const snapshot = {
274
+ folders,
275
+ byId: new Map(folders.map((folder) => [folder.id, folder])),
276
+ byRole: new Map(folders.filter((folder) => folder.role).map((folder) => [folder.role, folder])),
277
+ trashFolderIds,
278
+ allMailExcludedRootFolderIds,
279
+ allMailExcludedFolderIds,
280
+ };
281
+ this.folderCache = { fetchedAt: Date.now(), snapshot };
282
+ return snapshot;
283
+ }
284
+ async listFolders() {
285
+ return (await this.folderSnapshot(true)).folders;
286
+ }
287
+ async resolveFolder(value) {
288
+ const normalized = value.toLowerCase();
289
+ const folders = await this.folderSnapshot();
290
+ const wellKnownRole = WELL_KNOWN_FOLDERS.find((folder) => folder.id === normalized)?.role;
291
+ const role = folders.byRole.get(wellKnownRole ?? normalized);
292
+ const match = role ?? folders.byId.get(value) ?? folders.folders.find((folder) => folder.name.toLowerCase() === normalized);
293
+ if (!match)
294
+ throw new EmailError('not_found', `No Outlook folder named "${value}"`);
295
+ return match;
296
+ }
297
+ async listMessages(query, page = {}) {
298
+ const resolvedFolder = query.folder ? await this.resolveFolder(query.folder) : undefined;
299
+ const starredFolder = resolvedFolder?.role === 'starred';
300
+ const folder = resolvedFolder?.role === 'all' || starredFolder ? undefined : resolvedFolder;
301
+ const normalizedQuery = { ...query, ...(starredFolder ? { starredOnly: true } : {}), folder: undefined };
302
+ const graphQuery = toGraphQuery(normalizedQuery);
303
+ const folders = await this.folderSnapshot();
304
+ const allMailScope = !folder;
305
+ const excludedRootFolderIds = allMailScope ? [...folders.allMailExcludedRootFolderIds] : [];
306
+ const allMailFilter = excludedRootFolderIds.map((id) => `parentFolderId ne '${escapeOData(id)}'`).join(' and ');
307
+ let requestUrl;
308
+ let localFilter;
309
+ if (page.pageToken) {
310
+ const decoded = decodePageToken(page.pageToken);
311
+ requestUrl = decoded.url;
312
+ localFilter = decoded.localFilter;
313
+ }
314
+ else {
315
+ const base = folder ? `/me/mailFolders/${encodeURIComponent(folder.id)}/messages` : '/me/messages';
316
+ const params = new URLSearchParams({
317
+ $top: String(Math.min(Math.max(page.pageSize ?? DEFAULT_PAGE_SIZE, 1), MAX_PAGE_SIZE)),
318
+ $select: MESSAGE_LIST_FIELDS,
319
+ });
320
+ if (graphQuery.search)
321
+ params.set('$search', graphQuery.search);
322
+ if (graphQuery.search) {
323
+ localFilter = localMessageFilter(normalizedQuery, allMailScope);
324
+ }
325
+ else {
326
+ const filter = [graphQuery.filter, allMailFilter].filter(Boolean).join(' and ');
327
+ if (filter)
328
+ params.set('$filter', filter);
329
+ if (allMailScope)
330
+ localFilter = { allMailScope: true };
331
+ }
332
+ requestUrl = `${base}?${params}`;
333
+ }
334
+ const response = await this.request(requestUrl);
335
+ const items = (response.value ?? [])
336
+ .filter((raw) => matchesLocalMessageFilter(raw, localFilter, folders.allMailExcludedFolderIds))
337
+ .map((raw) => parseGraphMessage(raw, {
338
+ accountId: this.accountId,
339
+ ...(raw.parentFolderId && folders.byId.get(raw.parentFolderId)
340
+ ? { folder: folders.byId.get(raw.parentFolderId) }
341
+ : {}),
342
+ }));
343
+ return {
344
+ items,
345
+ ...(response['@odata.nextLink']
346
+ ? { nextPageToken: encodePageToken(response['@odata.nextLink'], localFilter) }
347
+ : {}),
348
+ };
349
+ }
350
+ async rawMessage(id, includeHeaders = false) {
351
+ const params = new URLSearchParams({
352
+ $select: `${MESSAGE_FULL_FIELDS}${includeHeaders ? ',internetMessageHeaders' : ''}`,
353
+ $expand: `attachments($select=${ATTACHMENT_SELECT})`,
354
+ });
355
+ return this.request(`/me/messages/${encodeURIComponent(id)}?${params}`);
356
+ }
357
+ async getMessage(id, options = {}) {
358
+ const raw = await this.rawMessage(id, options.includeHeaders ?? false);
359
+ const folders = await this.folderSnapshot();
360
+ return parseGraphMessage(raw, {
361
+ accountId: this.accountId,
362
+ ...(raw.parentFolderId && folders.byId.get(raw.parentFolderId)
363
+ ? { folder: folders.byId.get(raw.parentFolderId) }
364
+ : {}),
365
+ includeBody: true,
366
+ includeAttachments: true,
367
+ includeHeaders: options.includeHeaders,
368
+ });
369
+ }
370
+ async getThread(threadId) {
371
+ const params = new URLSearchParams({
372
+ $filter: `conversationId eq '${escapeOData(threadId)}'`,
373
+ $select: 'id',
374
+ $top: '100',
375
+ });
376
+ const raw = await this.collection(`/me/messages?${params}`);
377
+ const messageIds = raw.flatMap((message) => (message.id ? [message.id] : []));
378
+ if (!messageIds.length)
379
+ throw new EmailError('not_found', `No Outlook thread with id "${threadId}"`);
380
+ const messages = await Promise.all(messageIds.map((id) => this.getMessage(id)));
381
+ messages.sort((a, b) => a.date.localeCompare(b.date));
382
+ return { id: threadId, subject: messages[0]?.subject ?? '', messages };
383
+ }
384
+ draftPayload(draft, newMessage) {
385
+ return {
386
+ ...(newMessage || draft.subject !== undefined ? { subject: draft.subject ?? '' } : {}),
387
+ body: bodyFor(draft),
388
+ ...(newMessage || draft.to !== undefined ? { toRecipients: toGraphRecipients(draft.to) } : {}),
389
+ ...(newMessage || draft.cc !== undefined ? { ccRecipients: toGraphRecipients(draft.cc) } : {}),
390
+ ...(newMessage || draft.bcc !== undefined ? { bccRecipients: toGraphRecipients(draft.bcc) } : {}),
391
+ };
392
+ }
393
+ decodedAttachment(input) {
394
+ const content = Buffer.from(input.content, 'base64');
395
+ if (content.toString('base64').replace(/=+$/, '') !== input.content.replace(/\s/g, '').replace(/=+$/, '')) {
396
+ throw new EmailError('invalid_request', `Attachment "${input.filename}" is not valid base64`);
397
+ }
398
+ return content;
399
+ }
400
+ async addAttachment(messageId, input) {
401
+ const content = this.decodedAttachment(input);
402
+ if (content.length < SMALL_ATTACHMENT_LIMIT) {
403
+ await this.request(`/me/messages/${encodeURIComponent(messageId)}/attachments`, { method: 'POST', body: JSON.stringify(graphAttachment(input)) }, { nonIdempotent: true });
404
+ return;
405
+ }
406
+ const session = await this.request(`/me/messages/${encodeURIComponent(messageId)}/attachments/createUploadSession`, {
407
+ method: 'POST',
408
+ body: JSON.stringify({
409
+ AttachmentItem: {
410
+ attachmentType: 'file',
411
+ name: input.filename,
412
+ size: content.length,
413
+ contentType: input.mimeType,
414
+ isInline: input.disposition === 'inline',
415
+ ...(input.contentId ? { contentId: input.contentId } : {}),
416
+ },
417
+ }),
418
+ }, { nonIdempotent: true });
419
+ if (!session.uploadUrl)
420
+ throw new EmailError('provider_unavailable', 'Microsoft Graph returned no attachment upload URL');
421
+ for (let start = 0; start < content.length; start += UPLOAD_CHUNK_BYTES) {
422
+ const end = Math.min(start + UPLOAD_CHUNK_BYTES, content.length) - 1;
423
+ const response = await this.fetchImpl(session.uploadUrl, {
424
+ method: 'PUT',
425
+ headers: {
426
+ 'content-length': String(end - start + 1),
427
+ 'content-range': `bytes ${start}-${end}/${content.length}`,
428
+ 'content-type': 'application/octet-stream',
429
+ },
430
+ body: content.subarray(start, end + 1),
431
+ });
432
+ if (!response.ok) {
433
+ throw new EmailError('provider_unavailable', `Microsoft Graph attachment upload failed (${response.status})`);
434
+ }
435
+ }
436
+ }
437
+ async replaceAttachments(messageId, attachments = []) {
438
+ const current = await this.collection(`/me/messages/${encodeURIComponent(messageId)}/attachments?$select=id`);
439
+ await Promise.all(current
440
+ .filter((attachment) => attachment.id)
441
+ .map((attachment) => this.request(`/me/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachment.id)}`, {
442
+ method: 'DELETE',
443
+ })));
444
+ for (const attachment of attachments)
445
+ await this.addAttachment(messageId, attachment);
446
+ }
447
+ async createDraft(draft) {
448
+ let created;
449
+ if (draft.replyToMessageId) {
450
+ created = await this.request(`/me/messages/${encodeURIComponent(draft.replyToMessageId)}/createReply`, { method: 'POST' }, { nonIdempotent: true });
451
+ if (!created.id)
452
+ throw new EmailError('provider_unavailable', 'Microsoft Graph returned a reply draft without an id');
453
+ await this.request(`/me/messages/${encodeURIComponent(created.id)}`, {
454
+ method: 'PATCH',
455
+ body: JSON.stringify(this.draftPayload(draft, false)),
456
+ });
457
+ }
458
+ else {
459
+ created = await this.request('/me/messages', { method: 'POST', body: JSON.stringify(this.draftPayload(draft, true)) }, { nonIdempotent: true });
460
+ }
461
+ if (!created.id)
462
+ throw new EmailError('provider_unavailable', 'Microsoft Graph returned a draft without an id');
463
+ for (const attachment of draft.attachments ?? [])
464
+ await this.addAttachment(created.id, attachment);
465
+ return this.getDraft(created.id);
466
+ }
467
+ async getDraft(draftId) {
468
+ const message = await this.getMessage(draftId);
469
+ if (!message.flags.draft)
470
+ throw new EmailError('not_found', `Message ${draftId} is not an Outlook draft`);
471
+ message.draftId = draftId;
472
+ return message;
473
+ }
474
+ async updateDraft(draftId, draft) {
475
+ const existing = await this.getDraft(draftId);
476
+ let replacement = draft;
477
+ if (draft.replyToMessageId) {
478
+ const replyTarget = await this.getMessage(draft.replyToMessageId);
479
+ if (existing.threadId !== replyTarget.threadId) {
480
+ throw new EmailError('unsupported_capability', 'Outlook cannot move an existing draft to another conversation');
481
+ }
482
+ if (draft.subject === undefined) {
483
+ replacement = { ...draft, subject: replySubject(replyTarget.subject) };
484
+ }
485
+ }
486
+ await this.request(`/me/messages/${encodeURIComponent(draftId)}`, {
487
+ method: 'PATCH',
488
+ body: JSON.stringify(this.draftPayload(replacement, true)),
489
+ });
490
+ await this.replaceAttachments(draftId, draft.attachments);
491
+ return this.getDraft(draftId);
492
+ }
493
+ async deleteDraft(draftId) {
494
+ await this.getDraft(draftId);
495
+ await this.request(`/me/messages/${encodeURIComponent(draftId)}/permanentDelete`, { method: 'POST' }, { nonIdempotent: true });
496
+ }
497
+ async send(input) {
498
+ if (!('draftId' in input) &&
499
+ !input.replyToMessageId &&
500
+ !input.to?.length &&
501
+ !input.cc?.length &&
502
+ !input.bcc?.length) {
503
+ throw new EmailError('invalid_request', 'Cannot send a message with no recipients');
504
+ }
505
+ const draft = 'draftId' in input ? await this.getDraft(input.draftId) : await this.createDraft(input);
506
+ if (!draft.to.length && !draft.cc?.length && !draft.bcc?.length) {
507
+ throw new EmailError('invalid_request', 'Cannot send a message with no recipients');
508
+ }
509
+ await this.request(`/me/messages/${encodeURIComponent(draft.draftId ?? draft.id)}/send`, { method: 'POST' }, { nonIdempotent: true });
510
+ return { id: draft.id, threadId: draft.threadId };
511
+ }
512
+ async move(ids, destinationId) {
513
+ for (const id of ids) {
514
+ await this.request(`/me/messages/${encodeURIComponent(id)}/move`, {
515
+ method: 'POST',
516
+ body: JSON.stringify({ destinationId }),
517
+ }, { nonIdempotent: true });
518
+ }
519
+ }
520
+ async assertMessagesOutsideTrash(ids) {
521
+ const folders = await this.folderSnapshot();
522
+ for (const id of ids) {
523
+ const message = await this.request(`/me/messages/${encodeURIComponent(id)}?${new URLSearchParams({ $select: 'parentFolderId' })}`);
524
+ if (!message.parentFolderId) {
525
+ throw new EmailError('provider_unavailable', `Microsoft Graph returned no parent folder for message "${id}"`);
526
+ }
527
+ if (folders.trashFolderIds.has(message.parentFolderId)) {
528
+ throw new EmailError('invalid_request', 'Use the untrash action before moving a message from Trash');
529
+ }
530
+ }
531
+ }
532
+ async modify(ids, action) {
533
+ if (!ids.length)
534
+ return;
535
+ if (typeof action === 'object' && ('addLabels' in action || 'removeLabels' in action)) {
536
+ throw new EmailError('unsupported_capability', 'Outlook folders do not support Gmail-style labels');
537
+ }
538
+ if (action === 'archive') {
539
+ const archive = await this.resolveFolder('archive');
540
+ if (!archive)
541
+ throw new EmailError('not_found', 'This Outlook mailbox has no archive folder');
542
+ await this.assertMessagesOutsideTrash(ids);
543
+ return this.move(ids, archive.id);
544
+ }
545
+ if (action === 'trash')
546
+ return this.move(ids, 'deleteditems');
547
+ if (action === 'untrash')
548
+ return this.move(ids, 'inbox');
549
+ if (typeof action === 'object' && 'move' in action) {
550
+ const target = await this.resolveFolder(action.move);
551
+ const targetIsInTrash = (await this.folderSnapshot()).trashFolderIds.has(target.id);
552
+ if (!target ||
553
+ target.role === 'all' ||
554
+ target.role === 'starred' ||
555
+ target.role === 'archive' ||
556
+ target.role === 'trash' ||
557
+ targetIsInTrash) {
558
+ throw new EmailError('invalid_request', `Cannot move messages to "${action.move}"`);
559
+ }
560
+ await this.assertMessagesOutsideTrash(ids);
561
+ return this.move(ids, target.id);
562
+ }
563
+ if (action === 'delete') {
564
+ for (const id of ids) {
565
+ await this.request(`/me/messages/${encodeURIComponent(id)}/permanentDelete`, {
566
+ method: 'POST',
567
+ }, { nonIdempotent: true });
568
+ }
569
+ return;
570
+ }
571
+ let patch;
572
+ if (action === 'markRead')
573
+ patch = { isRead: true };
574
+ else if (action === 'markUnread')
575
+ patch = { isRead: false };
576
+ else if (action === 'star')
577
+ patch = { flag: { flagStatus: 'flagged' } };
578
+ else if (action === 'unstar')
579
+ patch = { flag: { flagStatus: 'notFlagged' } };
580
+ else
581
+ throw new EmailError('unsupported_capability', 'Outlook does not support this message action');
582
+ await Promise.all(ids.map((id) => this.request(`/me/messages/${encodeURIComponent(id)}`, {
583
+ method: 'PATCH',
584
+ body: JSON.stringify(patch),
585
+ })));
586
+ }
587
+ async getAttachment(messageId, attachmentId, options = {}) {
588
+ const path = `/me/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`;
589
+ const metadata = await this.request(options.maxBytes === undefined ? path : `${path}?$select=${ATTACHMENT_METADATA_SELECT}`);
590
+ const meta = parseGraphAttachment(metadata);
591
+ if (!meta)
592
+ throw new EmailError('not_found', `Attachment ${attachmentId} not found on message ${messageId}`);
593
+ assertAttachmentSize(meta.sizeBytes, options.maxBytes);
594
+ if (metadata['@odata.type'] && metadata['@odata.type'] !== '#microsoft.graph.fileAttachment') {
595
+ throw new EmailError('unsupported_capability', 'Only Outlook file attachments can be downloaded');
596
+ }
597
+ const attachment = options.maxBytes === undefined ? metadata : await this.request(path);
598
+ if (attachment.contentBytes == null)
599
+ throw new EmailError('provider_unavailable', 'Microsoft Graph returned no attachment data');
600
+ const content = Buffer.from(attachment.contentBytes, 'base64');
601
+ assertAttachmentSize(content.length, options.maxBytes);
602
+ return { meta, content };
603
+ }
604
+ }
605
+ //# sourceMappingURL=outlookProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outlookProvider.js","sourceRoot":"","sources":["../src/outlookProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AttachmentMeta, EmailAddress, Folder, Message } from '@fluxmail/core';
2
+ import type { GraphAttachment, GraphMessage, GraphRecipient } from './types.js';
3
+ export declare function parseGraphAttachment(raw: GraphAttachment, index?: number): AttachmentMeta | undefined;
4
+ export declare function parseGraphMessage(raw: GraphMessage, context: {
5
+ accountId: string;
6
+ folder?: Folder;
7
+ includeBody?: boolean;
8
+ includeAttachments?: boolean;
9
+ includeHeaders?: boolean;
10
+ }): Message;
11
+ export declare function toGraphRecipients(values: EmailAddress[] | undefined): GraphRecipient[];
12
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAahF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,SAAI,GAAG,cAAc,GAAG,SAAS,CAWhG;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GACA,OAAO,CAwCT;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,SAAS,GAAG,cAAc,EAAE,CAItF"}
package/dist/parse.js ADDED
@@ -0,0 +1,68 @@
1
+ function address(recipient) {
2
+ const email = recipient?.emailAddress?.address?.trim();
3
+ if (!email)
4
+ return undefined;
5
+ const name = recipient?.emailAddress?.name?.trim();
6
+ return { ...(name ? { name } : {}), email };
7
+ }
8
+ function addresses(recipients) {
9
+ return (recipients ?? []).map(address).filter((value) => !!value);
10
+ }
11
+ export function parseGraphAttachment(raw, index = 0) {
12
+ if (!raw.id)
13
+ return undefined;
14
+ const filename = raw.name?.trim() || `attachment-${index + 1}`;
15
+ return {
16
+ id: raw.id,
17
+ filename,
18
+ mimeType: raw.contentType?.trim() || 'application/octet-stream',
19
+ sizeBytes: raw.size ?? 0,
20
+ ...(raw.contentId ? { contentId: raw.contentId.replace(/^<|>$/g, '') } : {}),
21
+ disposition: raw.isInline ? 'inline' : 'attachment',
22
+ };
23
+ }
24
+ export function parseGraphMessage(raw, context) {
25
+ const id = raw.id ?? '';
26
+ const date = raw.receivedDateTime ?? raw.sentDateTime ?? raw.createdDateTime ?? new Date(0).toISOString();
27
+ const message = {
28
+ id,
29
+ threadId: raw.conversationId ?? id,
30
+ accountId: context.accountId,
31
+ ...(raw.isDraft ? { draftId: id } : {}),
32
+ ...(context.folder ? { folder: context.folder } : {}),
33
+ ...(address(raw.from) ? { from: address(raw.from) } : {}),
34
+ to: addresses(raw.toRecipients),
35
+ ...(addresses(raw.ccRecipients).length ? { cc: addresses(raw.ccRecipients) } : {}),
36
+ ...(addresses(raw.bccRecipients).length ? { bcc: addresses(raw.bccRecipients) } : {}),
37
+ ...(addresses(raw.replyTo).length ? { replyTo: addresses(raw.replyTo) } : {}),
38
+ subject: raw.subject ?? '',
39
+ date: new Date(date).toISOString(),
40
+ ...(raw.bodyPreview != null ? { snippet: raw.bodyPreview } : {}),
41
+ flags: {
42
+ read: raw.isRead ?? false,
43
+ starred: raw.flag?.flagStatus === 'flagged',
44
+ draft: raw.isDraft ?? false,
45
+ },
46
+ };
47
+ if (context.includeBody) {
48
+ const content = raw.body?.content ?? '';
49
+ message.body = raw.body?.contentType?.toLowerCase() === 'text' ? { text: content } : { html: content };
50
+ }
51
+ if (context.includeAttachments) {
52
+ message.attachments = (raw.attachments ?? [])
53
+ .map(parseGraphAttachment)
54
+ .filter((item) => !!item);
55
+ }
56
+ if (context.includeHeaders) {
57
+ message.headers = Object.fromEntries((raw.internetMessageHeaders ?? [])
58
+ .filter((header) => header.name && header.value != null)
59
+ .map((header) => [header.name, header.value]));
60
+ }
61
+ return message;
62
+ }
63
+ export function toGraphRecipients(values) {
64
+ return (values ?? []).map((value) => ({
65
+ emailAddress: { address: value.email, ...(value.name ? { name: value.name } : {}) },
66
+ }));
67
+ }
68
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type EmailQuery } from '@fluxmail/core';
2
+ /** Translate Fluxmail's structured query into Graph KQL and OData filters. */
3
+ export declare function toGraphQuery(q: EmailQuery): {
4
+ search?: string;
5
+ filter?: string;
6
+ };
7
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgB7D,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBhF"}
package/dist/query.js ADDED
@@ -0,0 +1,46 @@
1
+ import { EmailError } from '@fluxmail/core';
2
+ function quoteKqlClause(value) {
3
+ return `"${value.replaceAll('\\', '\\\\').replaceAll('"', '\\"')}"`;
4
+ }
5
+ function quoteKqlValue(value) {
6
+ return `"${value.replaceAll('"', '""')}"`;
7
+ }
8
+ function dateOnly(value, field) {
9
+ const date = new Date(value);
10
+ if (Number.isNaN(date.valueOf()))
11
+ throw new EmailError('invalid_request', `${field} must be a valid ISO date`);
12
+ return date.toISOString().slice(0, 10);
13
+ }
14
+ /** Translate Fluxmail's structured query into Graph KQL and OData filters. */
15
+ export function toGraphQuery(q) {
16
+ if (q.rawProviderQuery && q.text) {
17
+ throw new EmailError('invalid_request', 'rawProviderQuery cannot be combined with text');
18
+ }
19
+ const kql = [];
20
+ if (q.rawProviderQuery)
21
+ kql.push(q.rawProviderQuery);
22
+ else if (q.text)
23
+ kql.push(q.text);
24
+ if (q.from)
25
+ kql.push(`from:${quoteKqlValue(q.from)}`);
26
+ if (q.to)
27
+ kql.push(`to:${quoteKqlValue(q.to)}`);
28
+ if (q.subject)
29
+ kql.push(`subject:${quoteKqlValue(q.subject)}`);
30
+ if (q.after)
31
+ kql.push(`received>=${dateOnly(q.after, 'after')}`);
32
+ if (q.before)
33
+ kql.push(`received<${dateOnly(q.before, 'before')}`);
34
+ const filter = [];
35
+ if (q.unreadOnly)
36
+ filter.push('isRead eq false');
37
+ if (q.starredOnly)
38
+ filter.push("flag/flagStatus eq 'flagged'");
39
+ if (q.hasAttachment)
40
+ filter.push('hasAttachments eq true');
41
+ return {
42
+ ...(kql.length ? { search: quoteKqlClause(kql.join(' AND ')) } : {}),
43
+ ...(filter.length ? { filter: filter.join(' and ') } : {}),
44
+ };
45
+ }
46
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,gBAAgB,CAAC;AAE7D,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;AAC5C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,GAAG,KAAK,2BAA2B,CAAC,CAAC;IAC/G,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,CAAa;IACxC,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,+CAA+C,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC,CAAC,gBAAgB;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;SAChD,IAAI,CAAC,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,WAAW,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,KAAK;QAAE,GAAG,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEnE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,CAAC,UAAU;QAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,WAAW;QAAE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,aAAa;QAAE,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAE3D,OAAO;QACL,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ export interface GraphEmailAddress {
2
+ name?: string | null;
3
+ address?: string | null;
4
+ }
5
+ export interface GraphRecipient {
6
+ emailAddress?: GraphEmailAddress | null;
7
+ }
8
+ export interface GraphItemBody {
9
+ contentType?: 'text' | 'html' | string | null;
10
+ content?: string | null;
11
+ }
12
+ export interface GraphInternetHeader {
13
+ name?: string | null;
14
+ value?: string | null;
15
+ }
16
+ export interface GraphAttachment {
17
+ '@odata.type'?: string;
18
+ id?: string | null;
19
+ name?: string | null;
20
+ contentType?: string | null;
21
+ size?: number | null;
22
+ isInline?: boolean | null;
23
+ contentId?: string | null;
24
+ contentBytes?: string | null;
25
+ }
26
+ export interface GraphMessage {
27
+ id?: string | null;
28
+ conversationId?: string | null;
29
+ parentFolderId?: string | null;
30
+ from?: GraphRecipient | null;
31
+ toRecipients?: GraphRecipient[] | null;
32
+ ccRecipients?: GraphRecipient[] | null;
33
+ bccRecipients?: GraphRecipient[] | null;
34
+ replyTo?: GraphRecipient[] | null;
35
+ subject?: string | null;
36
+ receivedDateTime?: string | null;
37
+ sentDateTime?: string | null;
38
+ createdDateTime?: string | null;
39
+ bodyPreview?: string | null;
40
+ body?: GraphItemBody | null;
41
+ isRead?: boolean | null;
42
+ isDraft?: boolean | null;
43
+ flag?: {
44
+ flagStatus?: string | null;
45
+ } | null;
46
+ hasAttachments?: boolean | null;
47
+ attachments?: GraphAttachment[] | null;
48
+ internetMessageHeaders?: GraphInternetHeader[] | null;
49
+ }
50
+ export interface GraphFolder {
51
+ id?: string | null;
52
+ displayName?: string | null;
53
+ parentFolderId?: string | null;
54
+ childFolderCount?: number | null;
55
+ unreadItemCount?: number | null;
56
+ isHidden?: boolean | null;
57
+ }
58
+ export interface GraphCollection<T> {
59
+ value?: T[];
60
+ '@odata.nextLink'?: string;
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@fluxmail/provider-outlook",
3
+ "version": "0.4.0",
4
+ "description": "Microsoft Graph adapter for the Fluxmail unified email API",
5
+ "license": "SEE LICENSE IN LICENSE.md",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "LICENSE.md"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "dependencies": {
23
+ "@fluxmail/core": "0.4.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.15.0"
27
+ },
28
+ "scripts": {
29
+ "build": "tsc -p tsconfig.json",
30
+ "typecheck": "tsc -p tsconfig.json --noEmit",
31
+ "test": "vitest run"
32
+ }
33
+ }