google-services-mcp 0.1.0-beta.25

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/dist/auth/config.d.ts +43 -0
  4. package/dist/auth/config.d.ts.map +1 -0
  5. package/dist/auth/config.js +108 -0
  6. package/dist/auth/config.js.map +1 -0
  7. package/dist/auth/manager.d.ts +50 -0
  8. package/dist/auth/manager.d.ts.map +1 -0
  9. package/dist/auth/manager.js +140 -0
  10. package/dist/auth/manager.js.map +1 -0
  11. package/dist/auth/oauth.d.ts +49 -0
  12. package/dist/auth/oauth.d.ts.map +1 -0
  13. package/dist/auth/oauth.js +211 -0
  14. package/dist/auth/oauth.js.map +1 -0
  15. package/dist/auth/store.d.ts +18 -0
  16. package/dist/auth/store.d.ts.map +1 -0
  17. package/dist/auth/store.js +45 -0
  18. package/dist/auth/store.js.map +1 -0
  19. package/dist/cli.d.ts +7 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +128 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/main.d.ts +3 -0
  24. package/dist/main.d.ts.map +1 -0
  25. package/dist/main.js +21 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/server.d.ts +3 -0
  28. package/dist/server.d.ts.map +1 -0
  29. package/dist/server.js +28 -0
  30. package/dist/server.js.map +1 -0
  31. package/dist/services/calendar.d.ts +77 -0
  32. package/dist/services/calendar.d.ts.map +1 -0
  33. package/dist/services/calendar.js +141 -0
  34. package/dist/services/calendar.js.map +1 -0
  35. package/dist/services/contacts-tasks.d.ts +61 -0
  36. package/dist/services/contacts-tasks.d.ts.map +1 -0
  37. package/dist/services/contacts-tasks.js +103 -0
  38. package/dist/services/contacts-tasks.js.map +1 -0
  39. package/dist/services/docs.d.ts +30 -0
  40. package/dist/services/docs.d.ts.map +1 -0
  41. package/dist/services/docs.js +60 -0
  42. package/dist/services/docs.js.map +1 -0
  43. package/dist/services/drive.d.ts +51 -0
  44. package/dist/services/drive.d.ts.map +1 -0
  45. package/dist/services/drive.js +80 -0
  46. package/dist/services/drive.js.map +1 -0
  47. package/dist/services/forms.d.ts +28 -0
  48. package/dist/services/forms.d.ts.map +1 -0
  49. package/dist/services/forms.js +54 -0
  50. package/dist/services/forms.js.map +1 -0
  51. package/dist/services/gmail.d.ts +64 -0
  52. package/dist/services/gmail.d.ts.map +1 -0
  53. package/dist/services/gmail.js +144 -0
  54. package/dist/services/gmail.js.map +1 -0
  55. package/dist/services/sheets.d.ts +44 -0
  56. package/dist/services/sheets.d.ts.map +1 -0
  57. package/dist/services/sheets.js +53 -0
  58. package/dist/services/sheets.js.map +1 -0
  59. package/dist/services/slides.d.ts +28 -0
  60. package/dist/services/slides.d.ts.map +1 -0
  61. package/dist/services/slides.js +54 -0
  62. package/dist/services/slides.js.map +1 -0
  63. package/dist/services/youtube.d.ts +40 -0
  64. package/dist/services/youtube.d.ts.map +1 -0
  65. package/dist/services/youtube.js +91 -0
  66. package/dist/services/youtube.js.map +1 -0
  67. package/dist/tools/index.d.ts +3 -0
  68. package/dist/tools/index.d.ts.map +1 -0
  69. package/dist/tools/index.js +659 -0
  70. package/dist/tools/index.js.map +1 -0
  71. package/dist/util/result.d.ts +29 -0
  72. package/dist/util/result.d.ts.map +1 -0
  73. package/dist/util/result.js +21 -0
  74. package/dist/util/result.js.map +1 -0
  75. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../../src/services/drive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,yFAAyF;AACzF,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAS5G;AAED,sCAAsC;AACtC,wBAAsB,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAOvG;AAED,qFAAqF;AACrF,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAU7G;AAED,+CAA+C;AAC/C,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAW7G;AAED,iCAAiC;AACjC,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrG;AAED,yCAAyC;AACzC,wBAAsB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAYhH"}
@@ -0,0 +1,80 @@
1
+ import { google } from "googleapis";
2
+ /** List files, optionally filtered by a Drive query (e.g. "'<folderId>' in parents"). */
3
+ export async function listDriveFiles(client, opts) {
4
+ const drive = google.drive({ version: "v3", auth: client });
5
+ const res = await drive.files.list({
6
+ q: opts.query || undefined,
7
+ pageSize: opts.pageSize ?? 25,
8
+ orderBy: "modifiedTime desc",
9
+ fields: "files(id,name,mimeType,size,createdTime,modifiedTime,webViewLink)",
10
+ });
11
+ return (res.data.files ?? []).map((f) => mapFile(f));
12
+ }
13
+ /** Get metadata for a single file. */
14
+ export async function getDriveFile(client, opts) {
15
+ const drive = google.drive({ version: "v3", auth: client });
16
+ const res = await drive.files.get({
17
+ fileId: opts.fileId,
18
+ fields: "id,name,mimeType,size,createdTime,modifiedTime,webViewLink",
19
+ });
20
+ return mapFile(res.data);
21
+ }
22
+ /** Create a file (text content) or a blank Google-native file (Doc/Sheet/Slides). */
23
+ export async function uploadDriveFile(client, opts) {
24
+ const drive = google.drive({ version: "v3", auth: client });
25
+ const requestBody = { name: opts.name, mimeType: opts.mimeType };
26
+ if (opts.parentFolderId)
27
+ requestBody.parents = [opts.parentFolderId];
28
+ const params = { requestBody };
29
+ if (opts.content !== undefined) {
30
+ params.media = { mimeType: opts.mimeType, body: opts.content };
31
+ }
32
+ const res = await drive.files.create(params);
33
+ return mapFile(res.data);
34
+ }
35
+ /** Update a file's metadata and/or content. */
36
+ export async function updateDriveFile(client, opts) {
37
+ const drive = google.drive({ version: "v3", auth: client });
38
+ const requestBody = {};
39
+ if (opts.name !== undefined)
40
+ requestBody.name = opts.name;
41
+ if (opts.mimeType !== undefined)
42
+ requestBody.mimeType = opts.mimeType;
43
+ const params = { fileId: opts.fileId, requestBody };
44
+ if (opts.content !== undefined) {
45
+ params.media = { mimeType: opts.mimeType ?? "text/plain", body: opts.content };
46
+ }
47
+ const res = await drive.files.update(params);
48
+ return mapFile(res.data);
49
+ }
50
+ /** Permanently delete a file. */
51
+ export async function deleteDriveFile(client, opts) {
52
+ const drive = google.drive({ version: "v3", auth: client });
53
+ await drive.files.delete({ fileId: opts.fileId });
54
+ }
55
+ /** Share a file with a user by email. */
56
+ export async function shareDriveFile(client, opts) {
57
+ const drive = google.drive({ version: "v3", auth: client });
58
+ const res = await drive.permissions.create({
59
+ fileId: opts.fileId,
60
+ requestBody: {
61
+ type: "user",
62
+ role: opts.role,
63
+ emailAddress: opts.email,
64
+ },
65
+ sendNotificationEmail: opts.sendNotificationEmail !== false,
66
+ });
67
+ return { id: (res.data.id ?? "") };
68
+ }
69
+ function mapFile(f) {
70
+ return {
71
+ id: f.id,
72
+ name: f.name,
73
+ mimeType: f.mimeType,
74
+ size: f.size,
75
+ createdTime: f.createdTime,
76
+ modifiedTime: f.modifiedTime,
77
+ webViewLink: f.webViewLink,
78
+ };
79
+ }
80
+ //# sourceMappingURL=drive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive.js","sourceRoot":"","sources":["../../src/services/drive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Auth, forms_v1 } from "googleapis";
2
+ export interface GetFormArgs {
3
+ formId: string;
4
+ }
5
+ export interface AddQuestionArgs {
6
+ formId: string;
7
+ title: string;
8
+ description?: string;
9
+ /** Question type: text (default) or multiple_choice. */
10
+ type?: "text" | "multiple_choice";
11
+ /** Required for multiple_choice. */
12
+ options?: string[];
13
+ required?: boolean;
14
+ }
15
+ export declare function getForm(client: Auth.OAuth2Client, { formId }: GetFormArgs): Promise<any>;
16
+ export declare function getFormResponses(client: Auth.OAuth2Client, { formId, pageSize }: GetFormArgs & {
17
+ pageSize?: number;
18
+ }): Promise<any[]>;
19
+ export declare function createForm(client: Auth.OAuth2Client, { title }: {
20
+ title: string;
21
+ }): Promise<any>;
22
+ export declare function addQuestion(client: Auth.OAuth2Client, { formId, title, description, type, options, required }: AddQuestionArgs): Promise<any>;
23
+ export type BatchUpdateArgs = {
24
+ formId: string;
25
+ requests: forms_v1.Schema$Request[];
26
+ };
27
+ export declare function batchUpdateForm(client: Auth.OAuth2Client, { formId, requests }: BatchUpdateArgs): Promise<any>;
28
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/services/forms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IAClC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAI9F;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,MAAM,EAAE,QAAc,EAAE,EAAE,WAAW,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,GAAG,EAAE,CAAC,CAIhB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAItG;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAsB,EAAE,OAAO,EAAE,QAAgB,EAAE,EAAE,eAAe,GACjG,OAAO,CAAC,GAAG,CAAC,CA8Bd;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;CACrC,CAAC;AAEF,wBAAsB,eAAe,CACnC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,GACpC,OAAO,CAAC,GAAG,CAAC,CAId"}
@@ -0,0 +1,54 @@
1
+ import { google } from "googleapis";
2
+ export async function getForm(client, { formId }) {
3
+ const forms = google.forms({ version: "v1", auth: client });
4
+ const res = await forms.forms.get({ formId });
5
+ return res.data;
6
+ }
7
+ export async function getFormResponses(client, { formId, pageSize = 100 }) {
8
+ const forms = google.forms({ version: "v1", auth: client });
9
+ const res = await forms.forms_responses.list({ formId, pageSize });
10
+ return res.data.responses ?? [];
11
+ }
12
+ export async function createForm(client, { title }) {
13
+ const forms = google.forms({ version: "v1", auth: client });
14
+ const res = await forms.forms.create({ requestBody: { info: { title } } });
15
+ return res.data;
16
+ }
17
+ export async function addQuestion(client, { formId, title, description, type = "text", options, required = false }) {
18
+ const forms = google.forms({ version: "v1", auth: client });
19
+ let question;
20
+ if (type === "multiple_choice") {
21
+ question = {
22
+ questionId: "q",
23
+ required,
24
+ choiceQuestion: {
25
+ type: "RADIO",
26
+ options: (options ?? []).map((value) => ({ value })),
27
+ shuffle: false,
28
+ },
29
+ };
30
+ }
31
+ else {
32
+ question = { questionId: "q", required, textQuestion: {} };
33
+ }
34
+ await forms.forms.batchUpdate({
35
+ formId,
36
+ requestBody: {
37
+ requests: [
38
+ {
39
+ createItem: {
40
+ location: { index: 0 },
41
+ item: { title, description, questionItem: { question } },
42
+ },
43
+ },
44
+ ],
45
+ },
46
+ });
47
+ return { added: true };
48
+ }
49
+ export async function batchUpdateForm(client, { formId, requests }) {
50
+ const forms = google.forms({ version: "v1", auth: client });
51
+ const res = await forms.forms.batchUpdate({ formId, requestBody: { requests } });
52
+ return res.data;
53
+ }
54
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/services/forms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import type { Auth } from "googleapis";
2
+ export interface SendGmailOptions {
3
+ to: string | string[];
4
+ cc?: string | string[];
5
+ bcc?: string | string[];
6
+ subject: string;
7
+ body: string;
8
+ bodyType?: "text" | "html";
9
+ }
10
+ export interface ListGmailOptions {
11
+ query?: string;
12
+ maxResults?: number;
13
+ }
14
+ export interface GetGmailOptions {
15
+ id: string;
16
+ format?: "full" | "metadata" | "minimal";
17
+ }
18
+ export interface ModifyGmailOptions {
19
+ id: string;
20
+ addLabels?: string[];
21
+ removeLabels?: string[];
22
+ }
23
+ export interface ReplyGmailOptions {
24
+ threadId: string;
25
+ messageId: string;
26
+ body: string;
27
+ bodyType?: "text" | "html";
28
+ }
29
+ export interface GmailMessageSummary {
30
+ id: string;
31
+ threadId?: string;
32
+ snippet?: string;
33
+ }
34
+ export interface GmailMessageDetail extends GmailMessageSummary {
35
+ labelIds?: string[];
36
+ from?: string;
37
+ to?: string;
38
+ subject?: string;
39
+ date?: string;
40
+ body: string;
41
+ hasAttachments: boolean;
42
+ }
43
+ /** Build a raw RFC2822 message. Not base64-encoded yet. */
44
+ export declare function buildRawMessage(opts: SendGmailOptions): string;
45
+ /** Send an email. Returns { id, threadId }. */
46
+ export declare function sendGmail(client: Auth.OAuth2Client, opts: SendGmailOptions): Promise<{
47
+ id: string;
48
+ threadId?: string;
49
+ }>;
50
+ /** List messages, newest first, optionally filtered by a Gmail query. */
51
+ export declare function listGmailMessages(client: Auth.OAuth2Client, opts: ListGmailOptions): Promise<GmailMessageSummary[]>;
52
+ /** Get a single message with parsed headers, body and attachment flags. */
53
+ export declare function getGmailMessage(client: Auth.OAuth2Client, opts: GetGmailOptions): Promise<GmailMessageDetail>;
54
+ /** Add/remove labels on a message. Returns the updated labelIds. */
55
+ export declare function modifyGmailMessage(client: Auth.OAuth2Client, opts: ModifyGmailOptions): Promise<{
56
+ id: string;
57
+ labelIds: string[];
58
+ }>;
59
+ /** Reply to an existing message inside its thread, using proper In-Reply-To/References. */
60
+ export declare function replyGmail(client: Auth.OAuth2Client, opts: ReplyGmailOptions): Promise<{
61
+ id: string;
62
+ threadId?: string;
63
+ }>;
64
+ //# sourceMappingURL=gmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.d.ts","sourceRoot":"","sources":["../../src/services/gmail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;CAC1C;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAcD,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAoB9D;AA+BD,+CAA+C;AAC/C,wBAAsB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB;QAItD,MAAM;eAAa,MAAM;GACnD;AAED,yEAAyE;AACzE,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAYzH;AAED,2EAA2E;AAC3E,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsBnH;AAED,oEAAoE;AACpE,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB;QAUjE,MAAM;cAAY,MAAM,EAAE;GACpD;AAED,2FAA2F;AAC3F,wBAAsB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,iBAAiB;QAwBxD,MAAM;eAAa,MAAM;GACnD"}
@@ -0,0 +1,144 @@
1
+ import { google } from "googleapis";
2
+ const CRLF = "\r\n";
3
+ function headerValue(headers, name) {
4
+ const h = headers?.find((x) => x.name.toLowerCase() === name.toLowerCase());
5
+ return h ? h.value : "";
6
+ }
7
+ function joinRecipients(r) {
8
+ if (!r)
9
+ return "";
10
+ return Array.isArray(r) ? r.join(", ") : r;
11
+ }
12
+ /** Build a raw RFC2822 message. Not base64-encoded yet. */
13
+ export function buildRawMessage(opts) {
14
+ const to = joinRecipients(opts.to);
15
+ if (!to)
16
+ throw new Error("A recipient is required (to).");
17
+ if (!opts.subject.trim() && !opts.body.trim()) {
18
+ throw new Error("A subject or a body is required.");
19
+ }
20
+ const lines = [];
21
+ lines.push(`To: ${to}`);
22
+ const cc = joinRecipients(opts.cc);
23
+ if (cc)
24
+ lines.push(`Cc: ${cc}`);
25
+ const bcc = joinRecipients(opts.bcc);
26
+ if (bcc)
27
+ lines.push(`Bcc: ${bcc}`);
28
+ lines.push(`Subject: ${opts.subject.replace(/[\r\n]+/g, " ")}`);
29
+ lines.push("MIME-Version: 1.0");
30
+ const contentType = opts.bodyType === "html" ? "text/html" : "text/plain";
31
+ lines.push(`Content-Type: ${contentType}; charset=UTF-8`);
32
+ lines.push("Content-Transfer-Encoding: quoted-printable");
33
+ lines.push("");
34
+ lines.push(opts.body.replace(/\r?\n/g, CRLF));
35
+ return lines.join(CRLF);
36
+ }
37
+ function toBase64Url(raw) {
38
+ return Buffer.from(raw, "utf8").toString("base64url");
39
+ }
40
+ /** Extract the best body (prefer text/plain) from a Gmail payload tree. */
41
+ function extractBody(payload) {
42
+ if (!payload)
43
+ return "";
44
+ if (payload.body?.data) {
45
+ return Buffer.from(payload.body.data, "base64url").toString("utf8");
46
+ }
47
+ if (Array.isArray(payload.parts)) {
48
+ const plain = payload.parts.find((p) => p.mimeType === "text/plain");
49
+ const chosen = plain ?? payload.parts[0];
50
+ return extractBody(chosen);
51
+ }
52
+ return "";
53
+ }
54
+ function parseHeaders(headers) {
55
+ return {
56
+ from: headerValue(headers, "From"),
57
+ to: headerValue(headers, "To"),
58
+ subject: headerValue(headers, "Subject"),
59
+ date: headerValue(headers, "Date"),
60
+ messageId: headerValue(headers, "Message-ID"),
61
+ references: headerValue(headers, "References"),
62
+ };
63
+ }
64
+ /** Send an email. Returns { id, threadId }. */
65
+ export async function sendGmail(client, opts) {
66
+ const raw = toBase64Url(buildRawMessage(opts));
67
+ const gmail = google.gmail({ version: "v1", auth: client });
68
+ const res = await gmail.users.messages.send({ userId: "me", requestBody: { raw } });
69
+ return res.data;
70
+ }
71
+ /** List messages, newest first, optionally filtered by a Gmail query. */
72
+ export async function listGmailMessages(client, opts) {
73
+ const gmail = google.gmail({ version: "v1", auth: client });
74
+ const res = await gmail.users.messages.list({
75
+ userId: "me",
76
+ q: opts.query || undefined,
77
+ maxResults: opts.maxResults ?? 25,
78
+ });
79
+ return (res.data.messages ?? []).map((m) => ({
80
+ id: m.id,
81
+ threadId: m.threadId,
82
+ snippet: m.snippet,
83
+ }));
84
+ }
85
+ /** Get a single message with parsed headers, body and attachment flags. */
86
+ export async function getGmailMessage(client, opts) {
87
+ const gmail = google.gmail({ version: "v1", auth: client });
88
+ const res = await gmail.users.messages.get({ userId: "me", id: opts.id, format: opts.format ?? "full" });
89
+ const msg = res.data;
90
+ const payload = msg.payload ?? {};
91
+ const headers = payload.headers ?? [];
92
+ const parsed = parseHeaders(headers);
93
+ const hasAttachments = Array.isArray(payload.parts) &&
94
+ payload.parts.some((p) => p.filename && p.filename.length > 0);
95
+ return {
96
+ id: msg.id,
97
+ threadId: msg.threadId,
98
+ labelIds: msg.labelIds ?? [],
99
+ snippet: msg.snippet,
100
+ from: parsed.from,
101
+ to: parsed.to,
102
+ subject: parsed.subject,
103
+ date: parsed.date,
104
+ body: extractBody(payload),
105
+ hasAttachments,
106
+ };
107
+ }
108
+ /** Add/remove labels on a message. Returns the updated labelIds. */
109
+ export async function modifyGmailMessage(client, opts) {
110
+ const gmail = google.gmail({ version: "v1", auth: client });
111
+ const res = await gmail.users.messages.modify({
112
+ userId: "me",
113
+ id: opts.id,
114
+ requestBody: {
115
+ addLabelIds: opts.addLabels ?? [],
116
+ removeLabelIds: opts.removeLabels ?? [],
117
+ },
118
+ });
119
+ return res.data;
120
+ }
121
+ /** Reply to an existing message inside its thread, using proper In-Reply-To/References. */
122
+ export async function replyGmail(client, opts) {
123
+ const gmail = google.gmail({ version: "v1", auth: client });
124
+ const orig = (await gmail.users.messages.get({ userId: "me", id: opts.messageId })).data;
125
+ const headers = orig.payload?.headers ?? [];
126
+ const parsed = parseHeaders(headers);
127
+ const raw = toBase64Url([
128
+ `To: ${parsed.from}`,
129
+ `Subject: ${(parsed.subject.startsWith("Re:") ? parsed.subject : `Re: ${parsed.subject}`).replace(/[\r\n]+/g, " ")}`,
130
+ `In-Reply-To: ${parsed.messageId}`,
131
+ `References: ${[parsed.references, parsed.messageId].filter(Boolean).join(" ")}`,
132
+ "MIME-Version: 1.0",
133
+ `Content-Type: ${opts.bodyType === "html" ? "text/html" : "text/plain"}; charset=UTF-8`,
134
+ "Content-Transfer-Encoding: quoted-printable",
135
+ "",
136
+ opts.body.replace(/\r?\n/g, CRLF),
137
+ ].join(CRLF));
138
+ const res = await gmail.users.messages.send({
139
+ userId: "me",
140
+ requestBody: { raw, threadId: opts.threadId },
141
+ });
142
+ return res.data;
143
+ }
144
+ //# sourceMappingURL=gmail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/services/gmail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Auth, sheets_v4 } from "googleapis";
2
+ export interface GetSpreadsheetArgs {
3
+ spreadsheetId: string;
4
+ /** Optional A1 range to also read values from (e.g. "Sheet1!A1:B5"). */
5
+ range?: string;
6
+ }
7
+ export interface ReadRangeArgs {
8
+ spreadsheetId: string;
9
+ /** A1 notation, e.g. "Sheet1!A1:C10" or "Sheet1!A:C". */
10
+ range: string;
11
+ majorDimension?: "ROWS" | "COLUMNS";
12
+ }
13
+ export interface WriteRangeArgs {
14
+ spreadsheetId: string;
15
+ /** A1 notation of the top-left cell, e.g. "Sheet1!A1". */
16
+ range: string;
17
+ /** Rows of values. */
18
+ values: string[][];
19
+ valueInputOption?: "RAW" | "USER_ENTERED";
20
+ }
21
+ export interface AppendRangeArgs {
22
+ spreadsheetId: string;
23
+ /** A1 range; rows are appended below the existing data. */
24
+ range: string;
25
+ values: string[][];
26
+ valueInputOption?: "RAW" | "USER_ENTERED";
27
+ }
28
+ export interface CreateSpreadsheetArgs {
29
+ title: string;
30
+ /** Optional sheet titles to pre-create. */
31
+ sheets?: string[];
32
+ }
33
+ export interface BatchUpdateArgs {
34
+ spreadsheetId: string;
35
+ /** Sheets batch update requests. */
36
+ requests: sheets_v4.Schema$Request[];
37
+ }
38
+ export declare function getSpreadsheet(client: Auth.OAuth2Client, { spreadsheetId, range }: GetSpreadsheetArgs): Promise<any>;
39
+ export declare function readSheetRange(client: Auth.OAuth2Client, { spreadsheetId, range, majorDimension }: ReadRangeArgs): Promise<string[][]>;
40
+ export declare function writeSheetRange(client: Auth.OAuth2Client, { spreadsheetId, range, values, valueInputOption }: WriteRangeArgs): Promise<any>;
41
+ export declare function appendSheetRange(client: Auth.OAuth2Client, { spreadsheetId, range, values, valueInputOption }: AppendRangeArgs): Promise<any>;
42
+ export declare function createSpreadsheet(client: Auth.OAuth2Client, { title, sheets }: CreateSpreadsheetArgs): Promise<any>;
43
+ export declare function batchUpdateSheet(client: Auth.OAuth2Client, { spreadsheetId, requests }: BatchUpdateArgs): Promise<any>;
44
+ //# sourceMappingURL=sheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.d.ts","sourceRoot":"","sources":["../../src/services/sheets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,KAAK,GAAG,cAAc,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,KAAK,GAAG,cAAc,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,QAAQ,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;CACtC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,kBAAkB,GAC3C,OAAO,CAAC,GAAG,CAAC,CAWd;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,cAAgC,EAAE,EAAE,aAAa,GACxE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAIrB;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAA0C,EAAE,EAAE,cAAc,GAC3F,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAA0C,EAAE,EAAE,eAAe,GAC5F,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,qBAAqB,GACvC,OAAO,CAAC,GAAG,CAAC,CAQd;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,eAAe,GAC3C,OAAO,CAAC,GAAG,CAAC,CAId"}
@@ -0,0 +1,53 @@
1
+ import { google } from "googleapis";
2
+ export async function getSpreadsheet(client, { spreadsheetId, range }) {
3
+ const sheets = google.sheets({ version: "v4", auth: client });
4
+ const meta = await sheets.spreadsheets.get({ spreadsheetId, includeGridData: false });
5
+ const result = meta.data;
6
+ if (range) {
7
+ const values = await sheets.spreadsheets.values.get({ spreadsheetId, range });
8
+ if (values.data?.values) {
9
+ result.values = values.data.values;
10
+ }
11
+ }
12
+ return result;
13
+ }
14
+ export async function readSheetRange(client, { spreadsheetId, range, majorDimension = "ROWS" }) {
15
+ const sheets = google.sheets({ version: "v4", auth: client });
16
+ const res = await sheets.spreadsheets.values.get({ spreadsheetId, range, majorDimension });
17
+ return res.data.values ?? [];
18
+ }
19
+ export async function writeSheetRange(client, { spreadsheetId, range, values, valueInputOption = "USER_ENTERED" }) {
20
+ const sheets = google.sheets({ version: "v4", auth: client });
21
+ const res = await sheets.spreadsheets.values.update({
22
+ spreadsheetId,
23
+ range,
24
+ valueInputOption,
25
+ requestBody: { values },
26
+ });
27
+ return res.data;
28
+ }
29
+ export async function appendSheetRange(client, { spreadsheetId, range, values, valueInputOption = "USER_ENTERED" }) {
30
+ const sheets = google.sheets({ version: "v4", auth: client });
31
+ const res = await sheets.spreadsheets.values.append({
32
+ spreadsheetId,
33
+ range,
34
+ valueInputOption,
35
+ requestBody: { values },
36
+ });
37
+ return res.data;
38
+ }
39
+ export async function createSpreadsheet(client, { title, sheets }) {
40
+ const api = google.sheets({ version: "v4", auth: client });
41
+ const requestBody = { properties: { title } };
42
+ if (sheets?.length) {
43
+ requestBody.sheets = sheets.map((t) => ({ properties: { title: t } }));
44
+ }
45
+ const res = await api.spreadsheets.create({ requestBody });
46
+ return res.data;
47
+ }
48
+ export async function batchUpdateSheet(client, { spreadsheetId, requests }) {
49
+ const sheets = google.sheets({ version: "v4", auth: client });
50
+ const res = await sheets.spreadsheets.batchUpdate({ spreadsheetId, requestBody: { requests } });
51
+ return res.data;
52
+ }
53
+ //# sourceMappingURL=sheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheets.js","sourceRoot":"","sources":["../../src/services/sheets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA4CpC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyB,EACzB,EAAE,aAAa,EAAE,KAAK,EAAsB;IAE5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAW,CAAC;IAChC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyB,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,GAAG,MAAe,EAAiB;IAEzE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3F,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAyB,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,cAAuB,EAAkB;IAE5F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;QAClD,aAAa;QACb,KAAK;QACL,gBAAgB;QAChB,WAAW,EAAE,EAAE,MAAM,EAAE;KACxB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,cAAuB,EAAmB;IAE7F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;QAClD,aAAa;QACb,KAAK;QACL,gBAAgB;QAChB,WAAW,EAAE,EAAE,MAAM,EAAE;KACxB,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAyB,EACzB,EAAE,KAAK,EAAE,MAAM,EAAyB;IAExC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAiC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;IAC5E,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAyB,EACzB,EAAE,aAAa,EAAE,QAAQ,EAAmB;IAE5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChG,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Auth, slides_v1 } from "googleapis";
2
+ export interface GetPresentationArgs {
3
+ presentationId: string;
4
+ }
5
+ export interface ReplaceAllTextArgs {
6
+ presentationId: string;
7
+ find: string;
8
+ replace: string;
9
+ matchCase?: boolean;
10
+ }
11
+ export declare function getPresentation(client: Auth.OAuth2Client, { presentationId }: GetPresentationArgs): Promise<any>;
12
+ export declare function getSlidePage(client: Auth.OAuth2Client, { presentationId, pageObjectId }: GetPresentationArgs & {
13
+ pageObjectId: string;
14
+ }): Promise<any>;
15
+ export declare function createPresentation(client: Auth.OAuth2Client, { title }: {
16
+ title: string;
17
+ }): Promise<any>;
18
+ export declare function replaceAllText(client: Auth.OAuth2Client, { presentationId, find, replace, matchCase }: ReplaceAllTextArgs): Promise<any>;
19
+ export declare function createSlide(client: Auth.OAuth2Client, { presentationId }: GetPresentationArgs): Promise<any>;
20
+ export declare function deleteSlide(client: Auth.OAuth2Client, { presentationId, slideObjectId }: GetPresentationArgs & {
21
+ slideObjectId: string;
22
+ }): Promise<any>;
23
+ export type BatchUpdateArgs = {
24
+ presentationId: string;
25
+ requests: slides_v1.Schema$Request[];
26
+ };
27
+ export declare function batchUpdatePresentation(client: Auth.OAuth2Client, { presentationId, requests }: BatchUpdateArgs): Promise<any>;
28
+ //# sourceMappingURL=slides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides.d.ts","sourceRoot":"","sources":["../../src/services/slides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,CAItH;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,mBAAmB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GAC/E,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAI9G;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,SAAgB,EAAE,EAAE,kBAAkB,GACtE,OAAO,CAAC,GAAG,CAAC,CAWd;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,cAAc,EAAE,EAAE,mBAAmB,GACtC,OAAO,CAAC,GAAG,CAAC,CAWd;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,mBAAmB,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,GACjF,OAAO,CAAC,GAAG,CAAC,CAOd;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;CACtC,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,eAAe,GAC5C,OAAO,CAAC,GAAG,CAAC,CAId"}
@@ -0,0 +1,54 @@
1
+ import { google } from "googleapis";
2
+ export async function getPresentation(client, { presentationId }) {
3
+ const slides = google.slides({ version: "v1", auth: client });
4
+ const res = await slides.presentations.get({ presentationId });
5
+ return res.data;
6
+ }
7
+ export async function getSlidePage(client, { presentationId, pageObjectId }) {
8
+ const slides = google.slides({ version: "v1", auth: client });
9
+ const res = await slides.presentations.pages.get({ presentationId, pageObjectId });
10
+ return res.data;
11
+ }
12
+ export async function createPresentation(client, { title }) {
13
+ const slides = google.slides({ version: "v1", auth: client });
14
+ const res = await slides.presentations.create({ requestBody: { title } });
15
+ return res.data;
16
+ }
17
+ export async function replaceAllText(client, { presentationId, find, replace, matchCase = true }) {
18
+ const slides = google.slides({ version: "v1", auth: client });
19
+ const res = await slides.presentations.batchUpdate({
20
+ presentationId,
21
+ requestBody: {
22
+ requests: [
23
+ { replaceAllText: { containsText: { text: find, matchCase }, replaceText: replace } },
24
+ ],
25
+ },
26
+ });
27
+ return res.data.replies?.[0]?.replaceAllText ?? { occurrencesChanged: 0 };
28
+ }
29
+ export async function createSlide(client, { presentationId }) {
30
+ const slides = google.slides({ version: "v1", auth: client });
31
+ const res = await slides.presentations.batchUpdate({
32
+ presentationId,
33
+ requestBody: {
34
+ requests: [
35
+ { createSlide: { slideLayoutReference: { predefinedLayout: "BLANK" } } },
36
+ ],
37
+ },
38
+ });
39
+ return res.data.replies?.[0]?.createSlide ?? { objectId: undefined };
40
+ }
41
+ export async function deleteSlide(client, { presentationId, slideObjectId }) {
42
+ const slides = google.slides({ version: "v1", auth: client });
43
+ await slides.presentations.batchUpdate({
44
+ presentationId,
45
+ requestBody: { requests: [{ deleteObject: { objectId: slideObjectId } }] },
46
+ });
47
+ return { deleted: true };
48
+ }
49
+ export async function batchUpdatePresentation(client, { presentationId, requests }) {
50
+ const slides = google.slides({ version: "v1", auth: client });
51
+ const res = await slides.presentations.batchUpdate({ presentationId, requestBody: { requests } });
52
+ return res.data;
53
+ }
54
+ //# sourceMappingURL=slides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides.js","sourceRoot":"","sources":["../../src/services/slides.ts"],"names":[],"mappings":"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"}