@memberjunction/communication-gmail 6.2.0-edge.4 → 6.2.0-edge.6

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.
@@ -0,0 +1,251 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ vi.mock('@memberjunction/communication-types', async () => {
3
+ const addressUtils = await vi.importActual('../../../../base-types/src/AddressUtils');
4
+ const filterUtils = await vi.importActual('../../../../base-types/src/FilterUtils');
5
+ return {
6
+ ...addressUtils,
7
+ ...filterUtils,
8
+ BaseCommunicationProvider: class {
9
+ getSupportedOperations() { return []; }
10
+ },
11
+ resolveCredentialValue: (requestVal, envVal, disableFallback) => {
12
+ if (requestVal)
13
+ return requestVal;
14
+ if (!disableFallback && envVal)
15
+ return envVal;
16
+ return undefined;
17
+ },
18
+ validateRequiredCredentials: (creds, required, provider) => {
19
+ for (const key of required) {
20
+ if (!creds[key]) {
21
+ throw new Error(`${provider}: Missing required credential: ${key}`);
22
+ }
23
+ }
24
+ },
25
+ };
26
+ });
27
+ vi.mock('@memberjunction/global', async (importOriginal) => {
28
+ const actual = await importOriginal();
29
+ return {
30
+ ...actual,
31
+ RegisterClass: () => (target) => target,
32
+ };
33
+ });
34
+ vi.mock('@memberjunction/core', () => ({
35
+ LogError: vi.fn(),
36
+ LogStatus: vi.fn(),
37
+ }));
38
+ vi.mock('env-var', () => {
39
+ const envMap = {
40
+ GMAIL_CLIENT_ID: 'env-client-id',
41
+ GMAIL_CLIENT_SECRET: 'env-client-secret',
42
+ GMAIL_REDIRECT_URI: 'http://localhost:3000/callback',
43
+ GMAIL_REFRESH_TOKEN: 'env-refresh-token',
44
+ GMAIL_SERVICE_ACCOUNT_EMAIL: 'service@example.com',
45
+ };
46
+ return {
47
+ default: {
48
+ get: (key) => ({
49
+ default: (def) => ({
50
+ asString: () => envMap[key] ?? def,
51
+ }),
52
+ }),
53
+ },
54
+ };
55
+ });
56
+ vi.mock('dotenv', () => ({
57
+ default: { config: vi.fn() },
58
+ }));
59
+ const { mockGetProfile, mockEventsList, mockEventsInsert, mockEventsPatch, mockEventsGet, mockEventsDelete, mockFreebusyQuery, mockCalendarsGet } = vi.hoisted(() => ({
60
+ mockGetProfile: vi.fn(),
61
+ mockEventsList: vi.fn(),
62
+ mockEventsInsert: vi.fn(),
63
+ mockEventsPatch: vi.fn(),
64
+ mockEventsGet: vi.fn(),
65
+ mockEventsDelete: vi.fn(),
66
+ mockFreebusyQuery: vi.fn(),
67
+ mockCalendarsGet: vi.fn(),
68
+ }));
69
+ vi.mock('googleapis', () => {
70
+ class FakeOAuth2 {
71
+ constructor() {
72
+ this.setCredentials = vi.fn();
73
+ }
74
+ }
75
+ return {
76
+ default: {
77
+ google: {
78
+ auth: {
79
+ OAuth2: FakeOAuth2,
80
+ },
81
+ gmail: vi.fn().mockReturnValue({
82
+ users: {
83
+ getProfile: mockGetProfile,
84
+ },
85
+ }),
86
+ calendar: vi.fn().mockReturnValue({
87
+ events: {
88
+ list: mockEventsList,
89
+ insert: mockEventsInsert,
90
+ patch: mockEventsPatch,
91
+ get: mockEventsGet,
92
+ delete: mockEventsDelete,
93
+ },
94
+ freebusy: {
95
+ query: mockFreebusyQuery,
96
+ },
97
+ calendars: {
98
+ get: mockCalendarsGet,
99
+ },
100
+ }),
101
+ },
102
+ },
103
+ };
104
+ });
105
+ import { GmailProvider } from '../GmailProvider.js';
106
+ describe('GmailProvider Calendar, Free/Busy & Mailbox Preflight Operations', () => {
107
+ let provider;
108
+ beforeEach(() => {
109
+ vi.clearAllMocks();
110
+ provider = new GmailProvider();
111
+ mockGetProfile.mockResolvedValue({ data: { emailAddress: 'alice@example.com' } });
112
+ mockCalendarsGet.mockResolvedValue({ data: { id: 'alice@example.com' } });
113
+ });
114
+ it('includes Google Calendar and mailbox preflight operations in getSupportedOperations()', () => {
115
+ const ops = provider.getSupportedOperations();
116
+ expect(ops).toContain('GetEvents');
117
+ expect(ops).toContain('GetFreeBusy');
118
+ expect(ops).toContain('CreateCalendarEvent');
119
+ expect(ops).toContain('UpdateCalendarEvent');
120
+ expect(ops).toContain('RespondToCalendarEvent');
121
+ expect(ops).toContain('CancelCalendarEvent');
122
+ expect(ops).toContain('VerifyMailboxAccess');
123
+ });
124
+ it('lists and normalizes Google Calendar events via GetEvents', async () => {
125
+ mockEventsList.mockResolvedValue({
126
+ data: {
127
+ items: [
128
+ {
129
+ id: 'gcal-1',
130
+ summary: 'Product Sync',
131
+ description: 'Weekly review',
132
+ start: { dateTime: '2026-10-20T14:00:00Z' },
133
+ end: { dateTime: '2026-10-20T14:30:00Z' },
134
+ organizer: { email: 'alice@example.com' },
135
+ attendees: [
136
+ { email: 'alice@example.com' },
137
+ { email: 'bob@example.com' },
138
+ ],
139
+ status: 'confirmed',
140
+ },
141
+ ],
142
+ },
143
+ });
144
+ const res = await provider.GetEvents({
145
+ Identifier: 'alice@example.com',
146
+ NumEvents: 10,
147
+ StartDateTime: new Date('2026-10-20T00:00:00Z'),
148
+ EndDateTime: new Date('2026-10-21T00:00:00Z'),
149
+ });
150
+ expect(res.Success).toBe(true);
151
+ expect(res.RecurrenceExpanded).toBe(true);
152
+ expect(res.Events).toHaveLength(1);
153
+ expect(res.Events[0].ExternalSystemRecordID).toBe('gcal-1');
154
+ expect(res.Events[0].Subject).toBe('Product Sync');
155
+ expect(res.Events[0].Attendees).toEqual(['bob@example.com']);
156
+ });
157
+ it('queries Google Calendar free/busy via GetFreeBusy', async () => {
158
+ mockFreebusyQuery.mockResolvedValue({
159
+ data: {
160
+ calendars: {
161
+ 'alice@example.com': {
162
+ busy: [
163
+ { start: '2026-10-20T14:00:00Z', end: '2026-10-20T15:00:00Z' },
164
+ ],
165
+ },
166
+ },
167
+ },
168
+ });
169
+ const res = await provider.GetFreeBusy({
170
+ Identifier: 'alice@example.com',
171
+ Schedules: ['alice@example.com'],
172
+ StartDateTime: new Date('2026-10-20T12:00:00Z'),
173
+ EndDateTime: new Date('2026-10-20T18:00:00Z'),
174
+ });
175
+ expect(res.Success).toBe(true);
176
+ expect(res.Schedules).toHaveLength(1);
177
+ expect(res.Schedules[0].Slots).toHaveLength(1);
178
+ expect(res.Schedules[0].Slots[0].Status).toBe('Busy');
179
+ });
180
+ it('supports DryRun and live execution for CreateCalendarEvent, UpdateCalendarEvent, RespondToCalendarEvent, and CancelCalendarEvent', async () => {
181
+ const dryRes = await provider.CreateCalendarEvent({
182
+ Identifier: 'alice@example.com',
183
+ Subject: 'Dry Run Meeting',
184
+ StartTime: new Date('2026-10-20T14:00:00Z'),
185
+ EndTime: new Date('2026-10-20T14:30:00Z'),
186
+ DryRun: true,
187
+ });
188
+ expect(dryRes.Success).toBe(true);
189
+ expect(dryRes.DryRun).toBe(true);
190
+ expect(mockEventsInsert).not.toHaveBeenCalled();
191
+ mockEventsInsert.mockResolvedValue({
192
+ data: {
193
+ id: 'gcal-new-1',
194
+ summary: 'Live Meeting',
195
+ start: { dateTime: '2026-10-20T14:00:00Z' },
196
+ end: { dateTime: '2026-10-20T14:30:00Z' },
197
+ hangoutLink: 'https://meet.google.com/abc-defg-hij',
198
+ },
199
+ });
200
+ const liveRes = await provider.CreateCalendarEvent({
201
+ Identifier: 'alice@example.com',
202
+ Subject: 'Live Meeting',
203
+ StartTime: new Date('2026-10-20T14:00:00Z'),
204
+ EndTime: new Date('2026-10-20T14:30:00Z'),
205
+ IsOnlineMeeting: true,
206
+ });
207
+ expect(liveRes.Success).toBe(true);
208
+ expect(liveRes.Event?.ExternalSystemRecordID).toBe('gcal-new-1');
209
+ expect(liveRes.OnlineMeetingUrl).toBe('https://meet.google.com/abc-defg-hij');
210
+ mockEventsGet.mockResolvedValue({
211
+ data: {
212
+ id: 'gcal-new-1',
213
+ attendees: [{ email: 'alice@example.com', responseStatus: 'needsAction' }],
214
+ },
215
+ });
216
+ mockEventsPatch.mockResolvedValue({ data: { id: 'gcal-new-1' } });
217
+ const rsvpRes = await provider.RespondToCalendarEvent({
218
+ Identifier: 'alice@example.com',
219
+ EventID: 'gcal-new-1',
220
+ Response: 'Accept',
221
+ });
222
+ expect(rsvpRes.Success).toBe(true);
223
+ expect(mockEventsPatch).toHaveBeenCalled();
224
+ mockEventsDelete.mockResolvedValue({});
225
+ const cancelRes = await provider.CancelCalendarEvent({
226
+ Identifier: 'alice@example.com',
227
+ EventID: 'gcal-new-1',
228
+ });
229
+ expect(cancelRes.Success).toBe(true);
230
+ expect(mockEventsDelete).toHaveBeenCalled();
231
+ });
232
+ it('verifies mailbox and calendar access and detects profile mismatch in VerifyMailboxAccess', async () => {
233
+ const okRes = await provider.VerifyMailboxAccess({
234
+ Identifier: 'alice@example.com',
235
+ CheckMailRead: true,
236
+ CheckCalendarRead: true,
237
+ });
238
+ expect(okRes.Success).toBe(true);
239
+ expect(okRes.CanReadMail).toBe(true);
240
+ expect(okRes.CanReadCalendar).toBe(true);
241
+ const mismatchRes = await provider.VerifyMailboxAccess({
242
+ Identifier: 'other-user@example.com',
243
+ CheckMailRead: true,
244
+ CheckCalendarRead: true,
245
+ });
246
+ expect(mismatchRes.Success).toBe(false);
247
+ expect(mismatchRes.CanReadMail).toBe(false);
248
+ expect(mismatchRes.MailErrorMessage).toContain('does not match target mailbox');
249
+ });
250
+ });
251
+ //# sourceMappingURL=GmailCalendarAndPreflight.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GmailCalendarAndPreflight.test.js","sourceRoot":"","sources":["../../src/__tests__/GmailCalendarAndPreflight.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { CalendarAttendeeResponse, CalendarEvent, CalendarEventChange, CalendarEventInput } from '@memberjunction/communication-types';
2
+ import googleApis from 'googleapis';
3
+ type GoogleEvent = googleApis.calendar_v3.Schema$Event;
4
+ type GoogleEventDateTime = googleApis.calendar_v3.Schema$EventDateTime;
5
+ /**
6
+ * The request body for `events.insert` (all fields) or `events.patch` (only those present).
7
+ *
8
+ * A timed slot is the instant (RFC 3339, UTC) plus the zone the event is shown and recurs in; an
9
+ * all-day slot is the calendar day in that zone. Google's descriptions take HTML, so `BodyType`
10
+ * needs no translation.
11
+ */
12
+ export declare function BuildGoogleEventBody(input: Partial<CalendarEventInput>, isPatch?: boolean): GoogleEvent;
13
+ /** A Google event as MemberJunction's read model. */
14
+ export declare function ToCalendarEvent(raw: GoogleEvent): CalendarEvent;
15
+ /**
16
+ * A synced item as a change. Google reports a deleted event, or one its organizer cancelled, as an
17
+ * item with `status: cancelled` and little else, so that is a `Removed`.
18
+ */
19
+ export declare function ToCalendarChange(item: GoogleEvent): CalendarEventChange;
20
+ /** A timed value carries its own offset; an all-day `date` is midnight UTC of that day. Null when neither parses. */
21
+ export declare function GoogleInstant(slot: GoogleEventDateTime | null | undefined): Date | null;
22
+ /** Google's `responseStatus` as MemberJunction's. `needsAction` and anything unknown read as `None`. */
23
+ export declare function MapGoogleResponse(response: string | null | undefined): CalendarAttendeeResponse;
24
+ export {};
25
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,wBAAwB,EACxB,aAAa,EAEb,mBAAmB,EACnB,kBAAkB,EAErB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,KAAK,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC;AACvD,KAAK,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC;AAEvE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,OAAO,UAAQ,GAAG,WAAW,CAqBrG;AAcD,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,aAAa,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAKvE;AAED,qHAAqH;AACrH,wBAAgB,aAAa,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CAKvF;AAED,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,wBAAwB,CAW/F"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Pure mapping between MemberJunction's calendar shapes and Google Calendar's `Event` resource. No
3
+ * client, no network: {@link GmailProvider} does the calls and these build the bodies and read the
4
+ * replies.
5
+ */
6
+ import { randomUUID } from 'crypto';
7
+ import { CalendarWallClock } from '@memberjunction/communication-types';
8
+ /**
9
+ * The request body for `events.insert` (all fields) or `events.patch` (only those present).
10
+ *
11
+ * A timed slot is the instant (RFC 3339, UTC) plus the zone the event is shown and recurs in; an
12
+ * all-day slot is the calendar day in that zone. Google's descriptions take HTML, so `BodyType`
13
+ * needs no translation.
14
+ */
15
+ export function BuildGoogleEventBody(input, isPatch = false) {
16
+ const body = {};
17
+ const zone = input.TimeZone?.trim() || 'UTC';
18
+ if (input.Subject !== undefined)
19
+ body.summary = input.Subject;
20
+ if (input.Body !== undefined)
21
+ body.description = input.Body;
22
+ if (input.Start)
23
+ body.start = googleSlot(input.Start, zone, input.IsAllDay === true, isPatch);
24
+ if (input.End)
25
+ body.end = googleSlot(input.End, zone, input.IsAllDay === true, isPatch);
26
+ if (input.Location !== undefined)
27
+ body.location = input.Location;
28
+ if (input.Attendees) {
29
+ body.attendees = input.Attendees.map((a) => ({
30
+ email: a.Email,
31
+ ...(a.Name ? { displayName: a.Name } : {}),
32
+ ...(a.Type === 'Optional' ? { optional: true } : {})
33
+ }));
34
+ }
35
+ if (input.IsOnlineMeeting) {
36
+ // Google creates the Meet link asynchronously from this request; the call must also pass
37
+ // conferenceDataVersion: 1 or the request is silently ignored.
38
+ body.conferenceData = { createRequest: { requestId: randomUUID(), conferenceSolutionKey: { type: 'hangoutsMeet' } } };
39
+ }
40
+ return body;
41
+ }
42
+ /**
43
+ * On a patch the other form is sent as null: `events.patch` merges `start`/`end` into the stored
44
+ * value, so without it an event switched between all-day and timed would carry both `date` and
45
+ * `dateTime`. An insert has nothing to merge, so it sends only the form in use.
46
+ */
47
+ function googleSlot(when, zone, allDay, isPatch) {
48
+ const slot = allDay
49
+ ? { date: CalendarWallClock(when, zone).slice(0, 10) }
50
+ : { dateTime: when.toISOString(), timeZone: zone };
51
+ return isPatch ? { date: null, dateTime: null, timeZone: null, ...slot } : slot;
52
+ }
53
+ /** A Google event as MemberJunction's read model. */
54
+ export function ToCalendarEvent(raw) {
55
+ const organizer = raw.organizer?.email?.trim();
56
+ return {
57
+ ExternalEventID: raw.id ?? '',
58
+ SeriesID: raw.recurringEventId ?? null,
59
+ ICalUID: raw.iCalUID ?? null,
60
+ Subject: raw.summary ?? '',
61
+ Body: raw.description ?? '',
62
+ Start: GoogleInstant(raw.start),
63
+ End: GoogleInstant(raw.end),
64
+ IsAllDay: !!raw.start?.date && !raw.start?.dateTime,
65
+ Location: raw.location ?? null,
66
+ Organizer: organizer ? { Email: organizer, ...(raw.organizer?.displayName ? { Name: raw.organizer.displayName } : {}) } : null,
67
+ Attendees: (raw.attendees ?? []).map(toAttendee).filter((a) => a !== null),
68
+ IsCancelled: raw.status === 'cancelled',
69
+ OnlineMeetingUrl: meetingUrl(raw),
70
+ LastModified: raw.updated ? new Date(raw.updated) : null
71
+ };
72
+ }
73
+ /**
74
+ * A synced item as a change. Google reports a deleted event, or one its organizer cancelled, as an
75
+ * item with `status: cancelled` and little else, so that is a `Removed`.
76
+ */
77
+ export function ToCalendarChange(item) {
78
+ if (item.status === 'cancelled') {
79
+ return { Kind: 'Removed', ExternalEventID: item.id ?? '' };
80
+ }
81
+ return { Kind: 'Upserted', ExternalEventID: item.id ?? '', Event: ToCalendarEvent(item) };
82
+ }
83
+ /** A timed value carries its own offset; an all-day `date` is midnight UTC of that day. Null when neither parses. */
84
+ export function GoogleInstant(slot) {
85
+ const raw = slot?.dateTime?.trim() || (slot?.date?.trim() ? `${slot.date.trim()}T00:00:00Z` : '');
86
+ if (!raw)
87
+ return null;
88
+ const parsed = new Date(raw);
89
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
90
+ }
91
+ /** Google's `responseStatus` as MemberJunction's. `needsAction` and anything unknown read as `None`. */
92
+ export function MapGoogleResponse(response) {
93
+ switch (response) {
94
+ case 'accepted':
95
+ return 'Accepted';
96
+ case 'tentative':
97
+ return 'Tentative';
98
+ case 'declined':
99
+ return 'Declined';
100
+ default:
101
+ return 'None';
102
+ }
103
+ }
104
+ function toAttendee(raw) {
105
+ const email = raw.email?.trim();
106
+ if (!email)
107
+ return null;
108
+ return {
109
+ Email: email,
110
+ ...(raw.displayName ? { Name: raw.displayName } : {}),
111
+ Type: raw.optional ? 'Optional' : 'Required',
112
+ Response: MapGoogleResponse(raw.responseStatus)
113
+ };
114
+ }
115
+ function meetingUrl(raw) {
116
+ const video = (raw.conferenceData?.entryPoints ?? []).find((e) => e.entryPointType === 'video' && !!e.uri);
117
+ return video?.uri ?? raw.hangoutLink ?? null;
118
+ }
119
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../src/calendar.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@memberjunction/communication-gmail",
3
3
  "license": "BUSL-1.1",
4
4
  "type": "module",
5
- "version": "6.2.0-edge.4",
5
+ "version": "6.2.0-edge.6",
6
6
  "description": "Gmail/Google Suite provider for MemberJunction Communication framework",
7
7
  "main": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
@@ -10,9 +10,9 @@
10
10
  "dist/**/*"
11
11
  ],
12
12
  "dependencies": {
13
- "@memberjunction/communication-types": "6.2.0-edge.4",
14
- "@memberjunction/core": "6.2.0-edge.4",
15
- "@memberjunction/global": "6.2.0-edge.4",
13
+ "@memberjunction/communication-types": "6.2.0-edge.6",
14
+ "@memberjunction/core": "6.2.0-edge.6",
15
+ "@memberjunction/global": "6.2.0-edge.6",
16
16
  "dotenv": "^17.2.4",
17
17
  "env-var": "^7.4.1",
18
18
  "googleapis": "^171.4.0"