@bobfrankston/mailx-service 0.1.47

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 (54) hide show
  1. package/ai-usage.d.ts +32 -0
  2. package/ai-usage.d.ts.map +1 -0
  3. package/ai-usage.js +98 -0
  4. package/ai-usage.js.map +1 -0
  5. package/charset.d.ts +15 -0
  6. package/charset.d.ts.map +1 -0
  7. package/charset.js +61 -0
  8. package/charset.js.map +1 -0
  9. package/db-worker-client.d.ts +32 -0
  10. package/db-worker-client.d.ts.map +1 -0
  11. package/db-worker-client.js +66 -0
  12. package/db-worker-client.js.map +1 -0
  13. package/db-worker.d.ts +39 -0
  14. package/db-worker.d.ts.map +1 -0
  15. package/db-worker.js +115 -0
  16. package/db-worker.js.map +1 -0
  17. package/google-sync.d.ts +151 -0
  18. package/google-sync.d.ts.map +1 -0
  19. package/google-sync.js +259 -0
  20. package/google-sync.js.map +1 -0
  21. package/html-to-docx.d.ts +1 -0
  22. package/index.d.ts +1102 -0
  23. package/index.d.ts.map +1 -0
  24. package/index.js +5476 -0
  25. package/index.js.map +1 -0
  26. package/jsonrpc.d.ts +29 -0
  27. package/jsonrpc.d.ts.map +1 -0
  28. package/jsonrpc.js +481 -0
  29. package/jsonrpc.js.map +1 -0
  30. package/local-store.d.ts +10 -0
  31. package/local-store.d.ts.map +1 -0
  32. package/local-store.js +9 -0
  33. package/local-store.js.map +1 -0
  34. package/package.json +53 -0
  35. package/reconciler.d.ts +90 -0
  36. package/reconciler.d.ts.map +1 -0
  37. package/reconciler.js +277 -0
  38. package/reconciler.js.map +1 -0
  39. package/sync-queue.d.ts +127 -0
  40. package/sync-queue.d.ts.map +1 -0
  41. package/sync-queue.js +271 -0
  42. package/sync-queue.js.map +1 -0
  43. package/sync-worker-client.d.ts +33 -0
  44. package/sync-worker-client.d.ts.map +1 -0
  45. package/sync-worker-client.js +89 -0
  46. package/sync-worker-client.js.map +1 -0
  47. package/sync-worker.d.ts +33 -0
  48. package/sync-worker.d.ts.map +1 -0
  49. package/sync-worker.js +143 -0
  50. package/sync-worker.js.map +1 -0
  51. package/word-html.d.ts +41 -0
  52. package/word-html.d.ts.map +1 -0
  53. package/word-html.js +122 -0
  54. package/word-html.js.map +1 -0
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Google Calendar / Tasks / People (Contacts) two-way sync helpers.
3
+ *
4
+ * Used by MailxService to push local edits to Google and pull server
5
+ * changes into the local cache. All functions take a `getToken` function
6
+ * and a fetch implementation so they stay platform-agnostic (Node uses
7
+ * global `fetch` on Node 18+; browsers use window.fetch).
8
+ *
9
+ * Error handling: throws on network / HTTP errors. Caller catches and
10
+ * either retries via the store_sync drainer or surfaces to the UI.
11
+ */
12
+ type TokenProvider = () => Promise<string>;
13
+ export declare class GoogleHttpError extends Error {
14
+ status: number;
15
+ statusText: string;
16
+ body: string;
17
+ constructor(status: number, statusText: string, body: string);
18
+ }
19
+ export interface GCalEvent {
20
+ id: string;
21
+ summary: string;
22
+ start: {
23
+ dateTime?: string;
24
+ date?: string;
25
+ };
26
+ end: {
27
+ dateTime?: string;
28
+ date?: string;
29
+ };
30
+ location?: string;
31
+ description?: string;
32
+ etag?: string;
33
+ /** Set on instances expanded from a recurring series (singleEvents=true).
34
+ * Absent for singletons. Lets the UI filter out recurring expansions. */
35
+ recurringEventId?: string;
36
+ /** Link to open the event in Google Calendar web. */
37
+ htmlLink?: string;
38
+ /** Per-event reminder configuration. `useDefault: true` means apply
39
+ * the calendar's `defaultReminders` (carried separately on the
40
+ * calendarList entry); when false, `overrides` lists each popup /
41
+ * email reminder offset for this specific event. */
42
+ reminders?: {
43
+ useDefault?: boolean;
44
+ overrides?: Array<{
45
+ method: string;
46
+ minutes: number;
47
+ }>;
48
+ };
49
+ }
50
+ export declare function listCalendarEvents(tokenProvider: TokenProvider, fromMs: number, toMs: number, calendarId?: string): Promise<GCalEvent[]>;
51
+ /** Enumerate the user's Google Calendars (everything in their
52
+ * `calendarList` — owned, shared, subscribed). Used so refreshCalendarEvents
53
+ * doesn't hard-code `primary` and miss events on secondary calendars
54
+ * (Bob 2026-05-12: recurring Statin event showed in Thunderbird but not
55
+ * rmfmail because it's on a secondary calendar, not primary).
56
+ *
57
+ * Returns each entry's id (use as `calendarId` in subsequent fetches),
58
+ * summary (display name), and `selected` flag (matches the "show in
59
+ * Google web UI" toggle — a sensible default filter for "which calendars
60
+ * should mailx show"). Hidden / explicitly-unselected calendars are
61
+ * filtered out by the caller; we still return them so a future UI can
62
+ * expose the full list. */
63
+ export interface GCalendarListEntry {
64
+ id: string;
65
+ summary: string;
66
+ selected: boolean;
67
+ primary: boolean;
68
+ /** Hex color Google assigns the calendar (`backgroundColor`). Used to
69
+ * tint the per-calendar icon/monogram badge in the sidebar. */
70
+ backgroundColor: string;
71
+ /** Calendar-wide default reminder offsets, applied to events whose
72
+ * `reminders.useDefault === true`. Each entry is `{ method, minutes }`;
73
+ * client carries only the minutes for popup reminders. */
74
+ defaultReminderMinutes: number[];
75
+ /** Google's accessRole: "owner" | "writer" | "reader" | "freeBusyReader".
76
+ * Only the first two can take a new event — the New event dialog
77
+ * offers those (Bob 2026-09-10: "when creating an event I should be
78
+ * able to specify which calendar"). */
79
+ accessRole: string;
80
+ }
81
+ export declare function listCalendars(tokenProvider: TokenProvider): Promise<GCalendarListEntry[]>;
82
+ export declare function createCalendarEvent(tokenProvider: TokenProvider, event: any, calendarId?: string): Promise<GCalEvent>;
83
+ export declare function updateCalendarEvent(tokenProvider: TokenProvider, eventId: string, event: any, calendarId?: string): Promise<GCalEvent>;
84
+ export declare function deleteCalendarEvent(tokenProvider: TokenProvider, eventId: string, calendarId?: string): Promise<void>;
85
+ export interface GTask {
86
+ id: string;
87
+ title: string;
88
+ notes?: string;
89
+ due?: string;
90
+ completed?: string;
91
+ status?: "needsAction" | "completed";
92
+ etag?: string;
93
+ }
94
+ /** Enumerate all of the user's Google task lists. Mirrors `listCalendars`
95
+ * — Google "Reminders" are stored as TASKS as of late 2023, and a user
96
+ * can have many task lists, each potentially holding reminders. Without
97
+ * this enumeration mailx only ever sees the `@default` list and misses
98
+ * every reminder filed elsewhere. Bob 2026-05-12. */
99
+ export interface GTaskListEntry {
100
+ id: string;
101
+ title: string;
102
+ }
103
+ export declare function listTaskLists(tokenProvider: TokenProvider): Promise<GTaskListEntry[]>;
104
+ export declare function listTasks(tokenProvider: TokenProvider, listId?: string, showCompleted?: boolean): Promise<GTask[]>;
105
+ export declare function createTask(tokenProvider: TokenProvider, task: any, listId?: string): Promise<GTask>;
106
+ export declare function updateTask(tokenProvider: TokenProvider, taskId: string, task: any, listId?: string): Promise<GTask>;
107
+ export declare function deleteTask(tokenProvider: TokenProvider, taskId: string, listId?: string): Promise<void>;
108
+ export declare function createContact(tokenProvider: TokenProvider, person: any): Promise<any>;
109
+ export declare function updateContact(tokenProvider: TokenProvider, resourceName: string, updatePersonFields: string, person: any): Promise<any>;
110
+ export declare function deleteContact(tokenProvider: TokenProvider, resourceName: string): Promise<void>;
111
+ export declare function calendarEventToLocal(ev: GCalEvent, accountId: string, calendarDefaultReminderMinutes?: number[]): {
112
+ providerId: string;
113
+ accountId: string;
114
+ title: string;
115
+ startMs: number;
116
+ endMs: number;
117
+ allDay: boolean;
118
+ location: string;
119
+ notes: string;
120
+ etag: string;
121
+ recurringEventId: string | undefined;
122
+ htmlLink: string | undefined;
123
+ reminderMinutes: number[];
124
+ };
125
+ export declare function localToCalendarEvent(local: {
126
+ title: string;
127
+ startMs: number;
128
+ endMs: number;
129
+ allDay?: boolean;
130
+ location?: string;
131
+ notes?: string;
132
+ birthday?: boolean;
133
+ free?: boolean;
134
+ }): any;
135
+ export declare function taskToLocal(t: GTask, accountId: string): {
136
+ providerId: string;
137
+ accountId: string;
138
+ title: string;
139
+ notes: string;
140
+ dueMs: number | undefined;
141
+ completedMs: number | undefined;
142
+ etag: string;
143
+ };
144
+ export declare function localToTask(local: {
145
+ title: string;
146
+ notes?: string;
147
+ dueMs?: number;
148
+ completedMs?: number;
149
+ }): any;
150
+ export {};
151
+ //# sourceMappingURL=google-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-sync.d.ts","sourceRoot":"","sources":["google-sync.ts"],"names":[],"mappings":"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"}
package/google-sync.js ADDED
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Google Calendar / Tasks / People (Contacts) two-way sync helpers.
3
+ *
4
+ * Used by MailxService to push local edits to Google and pull server
5
+ * changes into the local cache. All functions take a `getToken` function
6
+ * and a fetch implementation so they stay platform-agnostic (Node uses
7
+ * global `fetch` on Node 18+; browsers use window.fetch).
8
+ *
9
+ * Error handling: throws on network / HTTP errors. Caller catches and
10
+ * either retries via the store_sync drainer or surfaces to the UI.
11
+ */
12
+ export class GoogleHttpError extends Error {
13
+ status;
14
+ statusText;
15
+ body;
16
+ constructor(status, statusText, body) {
17
+ super(`Google API ${status} ${statusText}: ${body.slice(0, 300)}`);
18
+ this.status = status;
19
+ this.statusText = statusText;
20
+ this.body = body;
21
+ }
22
+ }
23
+ async function googleFetch(tokenProvider, url, init = {}) {
24
+ const token = await tokenProvider();
25
+ const headers = new Headers(init.headers || {});
26
+ headers.set("Authorization", `Bearer ${token}`);
27
+ if (init.body && !headers.has("Content-Type"))
28
+ headers.set("Content-Type", "application/json");
29
+ const res = await fetch(url, { ...init, headers });
30
+ if (!res.ok) {
31
+ const body = await res.text().catch(() => "");
32
+ throw new GoogleHttpError(res.status, res.statusText, body);
33
+ }
34
+ return res;
35
+ }
36
+ export async function listCalendarEvents(tokenProvider, fromMs, toMs, calendarId = "primary") {
37
+ const from = new Date(fromMs).toISOString();
38
+ const to = new Date(toMs).toISOString();
39
+ const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events`
40
+ + `?timeMin=${encodeURIComponent(from)}&timeMax=${encodeURIComponent(to)}`
41
+ + `&singleEvents=true&orderBy=startTime&maxResults=250`;
42
+ const all = [];
43
+ let pageToken;
44
+ do {
45
+ const pagedUrl = pageToken ? `${url}&pageToken=${encodeURIComponent(pageToken)}` : url;
46
+ const res = await googleFetch(tokenProvider, pagedUrl);
47
+ const data = await res.json();
48
+ for (const ev of (data.items || []))
49
+ all.push(ev);
50
+ pageToken = data.nextPageToken;
51
+ } while (pageToken);
52
+ return all;
53
+ }
54
+ export async function listCalendars(tokenProvider) {
55
+ const url = "https://www.googleapis.com/calendar/v3/users/me/calendarList?minAccessRole=reader&maxResults=250";
56
+ const out = [];
57
+ let pageToken;
58
+ do {
59
+ const pagedUrl = pageToken ? `${url}&pageToken=${encodeURIComponent(pageToken)}` : url;
60
+ const res = await googleFetch(tokenProvider, pagedUrl);
61
+ const data = await res.json();
62
+ for (const item of (data.items || [])) {
63
+ const dr = Array.isArray(item.defaultReminders)
64
+ ? item.defaultReminders
65
+ .filter((r) => (r.method === "popup" || !r.method) && Number.isFinite(r.minutes))
66
+ .map((r) => r.minutes)
67
+ : [];
68
+ out.push({
69
+ id: item.id,
70
+ summary: item.summary || item.id,
71
+ selected: !!item.selected,
72
+ primary: !!item.primary,
73
+ accessRole: item.accessRole || "reader",
74
+ backgroundColor: item.backgroundColor || "",
75
+ defaultReminderMinutes: dr,
76
+ });
77
+ }
78
+ pageToken = data.nextPageToken;
79
+ } while (pageToken);
80
+ return out;
81
+ }
82
+ export async function createCalendarEvent(tokenProvider, event, calendarId = "primary") {
83
+ const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events`;
84
+ const res = await googleFetch(tokenProvider, url, { method: "POST", body: JSON.stringify(event) });
85
+ return res.json();
86
+ }
87
+ export async function updateCalendarEvent(tokenProvider, eventId, event, calendarId = "primary") {
88
+ const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
89
+ const res = await googleFetch(tokenProvider, url, { method: "PATCH", body: JSON.stringify(event) });
90
+ return res.json();
91
+ }
92
+ export async function deleteCalendarEvent(tokenProvider, eventId, calendarId = "primary") {
93
+ const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
94
+ await googleFetch(tokenProvider, url, { method: "DELETE" });
95
+ }
96
+ export async function listTaskLists(tokenProvider) {
97
+ const url = "https://tasks.googleapis.com/tasks/v1/users/@me/lists?maxResults=100";
98
+ const res = await googleFetch(tokenProvider, url);
99
+ const data = await res.json();
100
+ return (data.items || []).map((it) => ({ id: it.id, title: it.title || it.id }));
101
+ }
102
+ export async function listTasks(tokenProvider, listId = "@default", showCompleted = false) {
103
+ const url = `https://tasks.googleapis.com/tasks/v1/lists/${encodeURIComponent(listId)}/tasks`
104
+ + `?showCompleted=${showCompleted}&maxResults=100`;
105
+ const res = await googleFetch(tokenProvider, url);
106
+ const data = await res.json();
107
+ return data.items || [];
108
+ }
109
+ export async function createTask(tokenProvider, task, listId = "@default") {
110
+ const url = `https://tasks.googleapis.com/tasks/v1/lists/${encodeURIComponent(listId)}/tasks`;
111
+ const res = await googleFetch(tokenProvider, url, { method: "POST", body: JSON.stringify(task) });
112
+ return res.json();
113
+ }
114
+ export async function updateTask(tokenProvider, taskId, task, listId = "@default") {
115
+ const url = `https://tasks.googleapis.com/tasks/v1/lists/${encodeURIComponent(listId)}/tasks/${encodeURIComponent(taskId)}`;
116
+ const res = await googleFetch(tokenProvider, url, { method: "PATCH", body: JSON.stringify(task) });
117
+ return res.json();
118
+ }
119
+ export async function deleteTask(tokenProvider, taskId, listId = "@default") {
120
+ const url = `https://tasks.googleapis.com/tasks/v1/lists/${encodeURIComponent(listId)}/tasks/${encodeURIComponent(taskId)}`;
121
+ await googleFetch(tokenProvider, url, { method: "DELETE" });
122
+ }
123
+ // ── Contacts (People API) ──
124
+ export async function createContact(tokenProvider, person) {
125
+ const url = `https://people.googleapis.com/v1/people:createContact`;
126
+ const res = await googleFetch(tokenProvider, url, { method: "POST", body: JSON.stringify(person) });
127
+ return res.json();
128
+ }
129
+ export async function updateContact(tokenProvider, resourceName, updatePersonFields, person) {
130
+ const url = `https://people.googleapis.com/v1/${resourceName}:updateContact`
131
+ + `?updatePersonFields=${encodeURIComponent(updatePersonFields)}`;
132
+ const res = await googleFetch(tokenProvider, url, { method: "PATCH", body: JSON.stringify(person) });
133
+ return res.json();
134
+ }
135
+ export async function deleteContact(tokenProvider, resourceName) {
136
+ const url = `https://people.googleapis.com/v1/${resourceName}:deleteContact`;
137
+ await googleFetch(tokenProvider, url, { method: "DELETE" });
138
+ }
139
+ // ── Conversion helpers ──
140
+ /** Parse a Google all-day `date` ("YYYY-MM-DD") as LOCAL midnight.
141
+ * `Date.parse` treats a date-only string as UTC, so an all-day event
142
+ * renders a day early for any user west of UTC — a June 14 birthday
143
+ * showed as June 13 in US Eastern (Bob 2026-05-16). Build the Date from
144
+ * explicit Y/M/D components so midnight is local. */
145
+ function dateOnlyToLocalMs(d) {
146
+ const m = d.match(/^(\d{4})-(\d{2})-(\d{2})/);
147
+ if (!m)
148
+ return Date.parse(d);
149
+ return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime();
150
+ }
151
+ /** Format a local-midnight ms as its LOCAL "YYYY-MM-DD". The inverse of
152
+ * dateOnlyToLocalMs. `toISOString().slice(0, 10)` is the UTC date — for a
153
+ * user east of UTC, local midnight is still the *previous* UTC day, so an
154
+ * all-day event or date-only task written that way lands a day early. */
155
+ function localMsToDateOnly(ms) {
156
+ const d = new Date(ms);
157
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
158
+ }
159
+ export function calendarEventToLocal(ev, accountId, calendarDefaultReminderMinutes = []) {
160
+ const allDay = !!ev.start.date && !ev.start.dateTime;
161
+ const startMs = allDay
162
+ ? dateOnlyToLocalMs(ev.start.date)
163
+ : Date.parse(ev.start.dateTime);
164
+ const endMs = allDay
165
+ ? dateOnlyToLocalMs(ev.end.date)
166
+ : Date.parse(ev.end.dateTime);
167
+ // Per-event reminder offsets. Google sends `useDefault: true` to mean
168
+ // "apply the calendar's defaultReminders" (which we passed in from the
169
+ // calendarList entry). When `useDefault: false`, the event's own
170
+ // `overrides` array wins. We only fire `popup` reminders client-side
171
+ // — email reminders are Google's job, sending a duplicate from mailx
172
+ // would be redundant. Bob 2026-05-12: "use the reminder times in the
173
+ // event (there can be multiple)".
174
+ let reminderMinutes = [];
175
+ if (ev.reminders?.useDefault) {
176
+ reminderMinutes = calendarDefaultReminderMinutes.slice();
177
+ }
178
+ else if (Array.isArray(ev.reminders?.overrides)) {
179
+ reminderMinutes = ev.reminders.overrides
180
+ .filter(r => (r.method === "popup" || !r.method) && Number.isFinite(r.minutes))
181
+ .map(r => r.minutes);
182
+ }
183
+ return {
184
+ providerId: ev.id, accountId,
185
+ title: ev.summary || "(no title)",
186
+ startMs, endMs, allDay,
187
+ location: ev.location || "", notes: ev.description || "",
188
+ etag: ev.etag || "",
189
+ recurringEventId: ev.recurringEventId,
190
+ htmlLink: ev.htmlLink,
191
+ reminderMinutes,
192
+ };
193
+ }
194
+ export function localToCalendarEvent(local) {
195
+ const toIso = (ms) => new Date(ms).toISOString();
196
+ const toDate = localMsToDateOnly;
197
+ // 2026-09-21 — Claude Code (Fable 5.1), at Bob's direction: a birthday
198
+ // becomes a Google birthday event, the same payload gcal's
199
+ // makeBirthdayEvent builds (Y:/dev/utils/cardx/gcal/gcal.ts). The API's
200
+ // rules for eventType "birthday": all-day spanning exactly one day,
201
+ // RRULE:FREQ=YEARLY (Feb 29 needs BYMONTH=2;BYMONTHDAY=-1), visibility
202
+ // private, transparency transparent, birthdayProperties.type "birthday",
203
+ // and no other properties except colorId, summary and reminders — so
204
+ // location/description are deliberately left off.
205
+ if (local.birthday) {
206
+ const startD = new Date(local.startMs);
207
+ startD.setHours(0, 0, 0, 0);
208
+ const endD = new Date(startD);
209
+ endD.setDate(endD.getDate() + 1); // end.date is exclusive
210
+ const isLeapDay = startD.getMonth() === 1 && startD.getDate() === 29;
211
+ return {
212
+ summary: local.title,
213
+ eventType: "birthday",
214
+ birthdayProperties: { type: "birthday" },
215
+ start: { date: toDate(startD.getTime()) },
216
+ end: { date: toDate(endD.getTime()) },
217
+ recurrence: [isLeapDay ? "RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=-1" : "RRULE:FREQ=YEARLY"],
218
+ visibility: "private",
219
+ transparency: "transparent",
220
+ };
221
+ }
222
+ return {
223
+ summary: local.title,
224
+ start: local.allDay ? { date: toDate(local.startMs) } : { dateTime: toIso(local.startMs) },
225
+ end: local.allDay ? { date: toDate(local.endMs) } : { dateTime: toIso(local.endMs) },
226
+ location: local.location || undefined,
227
+ description: local.notes || undefined,
228
+ // "free" (tentative / FYI / hold) shows as not busy; absent = Google's default (busy).
229
+ transparency: local.free ? "transparent" : undefined,
230
+ };
231
+ }
232
+ export function taskToLocal(t, accountId) {
233
+ return {
234
+ providerId: t.id, accountId, title: t.title || "",
235
+ notes: t.notes || "",
236
+ // `due` is a date-ONLY field (Google Tasks discards the time part)
237
+ // transmitted as UTC midnight. Raw Date.parse made it "yesterday
238
+ // 20:00" in US Eastern — the task displayed a day early and went
239
+ // overdue the evening before its due date. Parse as local midnight,
240
+ // same as all-day calendar events.
241
+ dueMs: t.due ? dateOnlyToLocalMs(t.due) : undefined,
242
+ completedMs: t.completed ? Date.parse(t.completed) : undefined,
243
+ etag: t.etag || "",
244
+ };
245
+ }
246
+ export function localToTask(local) {
247
+ return {
248
+ title: local.title,
249
+ notes: local.notes || undefined,
250
+ // Date-only semantics both ways: write the LOCAL calendar date at
251
+ // UTC midnight (the shape Google itself sends back). Raw
252
+ // toISOString() of a local-midnight ms shifts the date a day for
253
+ // any user east of UTC.
254
+ due: local.dueMs ? `${localMsToDateOnly(local.dueMs)}T00:00:00.000Z` : undefined,
255
+ completed: local.completedMs ? new Date(local.completedMs).toISOString() : undefined,
256
+ status: local.completedMs ? "completed" : "needsAction",
257
+ };
258
+ }
259
+ //# sourceMappingURL=google-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-sync.js","sourceRoot":"","sources":["google-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ declare module "html-to-docx";