google-services-mcp 0.1.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 +21 -0
- package/README.md +225 -0
- package/dist/auth/config.d.ts +43 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +108 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/manager.d.ts +50 -0
- package/dist/auth/manager.d.ts.map +1 -0
- package/dist/auth/manager.js +140 -0
- package/dist/auth/manager.js.map +1 -0
- package/dist/auth/oauth.d.ts +49 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +211 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/store.d.ts +18 -0
- package/dist/auth/store.d.ts.map +1 -0
- package/dist/auth/store.js +45 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +21 -0
- package/dist/main.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +11 -0
- package/dist/server.js.map +1 -0
- package/dist/services/calendar.d.ts +77 -0
- package/dist/services/calendar.d.ts.map +1 -0
- package/dist/services/calendar.js +141 -0
- package/dist/services/calendar.js.map +1 -0
- package/dist/services/contacts-tasks.d.ts +61 -0
- package/dist/services/contacts-tasks.d.ts.map +1 -0
- package/dist/services/contacts-tasks.js +103 -0
- package/dist/services/contacts-tasks.js.map +1 -0
- package/dist/services/docs.d.ts +30 -0
- package/dist/services/docs.d.ts.map +1 -0
- package/dist/services/docs.js +60 -0
- package/dist/services/docs.js.map +1 -0
- package/dist/services/drive.d.ts +51 -0
- package/dist/services/drive.d.ts.map +1 -0
- package/dist/services/drive.js +80 -0
- package/dist/services/drive.js.map +1 -0
- package/dist/services/forms.d.ts +28 -0
- package/dist/services/forms.d.ts.map +1 -0
- package/dist/services/forms.js +54 -0
- package/dist/services/forms.js.map +1 -0
- package/dist/services/gmail.d.ts +64 -0
- package/dist/services/gmail.d.ts.map +1 -0
- package/dist/services/gmail.js +144 -0
- package/dist/services/gmail.js.map +1 -0
- package/dist/services/sheets.d.ts +44 -0
- package/dist/services/sheets.d.ts.map +1 -0
- package/dist/services/sheets.js +53 -0
- package/dist/services/sheets.js.map +1 -0
- package/dist/services/slides.d.ts +28 -0
- package/dist/services/slides.d.ts.map +1 -0
- package/dist/services/slides.js +54 -0
- package/dist/services/slides.js.map +1 -0
- package/dist/services/youtube.d.ts +40 -0
- package/dist/services/youtube.d.ts.map +1 -0
- package/dist/services/youtube.js +91 -0
- package/dist/services/youtube.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +659 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/util/result.d.ts +29 -0
- package/dist/util/result.d.ts.map +1 -0
- package/dist/util/result.js +21 -0
- package/dist/util/result.js.map +1 -0
- package/package.json +54 -0
|
@@ -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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAkDpC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,SAAS,WAAW,CAAC,OAA2D,EAAE,IAAY;IAC5F,MAAM,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,CAAgC;IACtD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,iBAAiB,WAAW,iBAAiB,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,2EAA2E;AAC3E,SAAS,WAAW,CAAC,OAAY;IAC/B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,YAAY,CAAC,OAA2D;IAC/E,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QAClC,EAAE,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC;QAC9B,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC;QACxC,IAAI,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QAClC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC;QAC7C,UAAU,EAAE,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAyB,EAAE,IAAsB;IAC/E,MAAM,GAAG,GAAG,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC,IAAyC,CAAC;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAyB,EAAE,IAAsB;IACvF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1C,MAAM,EAAE,IAAI;QACZ,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;QAC1B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;KAClC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAChD,EAAE,EAAE,CAAC,CAAC,EAAY;QAClB,QAAQ,EAAE,CAAC,CAAC,QAA8B;QAC1C,OAAO,EAAE,CAAC,CAAC,OAA6B;KACzC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAyB,EAAE,IAAqB;IACpF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC;IACzG,MAAM,GAAG,GAAG,GAAG,CAAC,IAAW,CAAC;IAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,cAAc,GAClB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtE,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;QAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC;QAC1B,cAAc;KACf,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAyB,EAAE,IAAwB;IAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,MAAM,EAAE,IAAI;QACZ,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,WAAW,EAAE;YACX,WAAW,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;YACjC,cAAc,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;SACxC;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAA0C,CAAC;AACxD,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAyB,EAAE,IAAuB;IACjF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAW,CAAC;IAChG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,MAAM,GAAG,GAAG,WAAW,CACrB;QACE,OAAO,MAAM,CAAC,IAAI,EAAE;QACpB,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;QACpH,gBAAgB,MAAM,CAAC,SAAS,EAAE;QAClC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAChF,mBAAmB;QACnB,iBAAiB,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,iBAAiB;QACvF,6CAA6C;QAC7C,EAAE;QACF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1C,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;KAC9C,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAyC,CAAC;AACvD,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Auth } from "googleapis";
|
|
2
|
+
export interface SearchVideosArgs {
|
|
3
|
+
query: string;
|
|
4
|
+
maxResults?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface GetVideoArgs {
|
|
7
|
+
videoId: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function searchVideos(client: Auth.OAuth2Client, { query, maxResults }: SearchVideosArgs): Promise<Array<{
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
channelTitle?: string;
|
|
14
|
+
}>>;
|
|
15
|
+
export declare function getVideo(client: Auth.OAuth2Client, { videoId }: GetVideoArgs): Promise<any>;
|
|
16
|
+
export declare function getMyVideos(client: Auth.OAuth2Client, { maxResults }: {
|
|
17
|
+
maxResults?: number;
|
|
18
|
+
}): Promise<any>;
|
|
19
|
+
export declare function listPlaylists(client: Auth.OAuth2Client, { maxResults }: {
|
|
20
|
+
maxResults?: number;
|
|
21
|
+
}): Promise<any[]>;
|
|
22
|
+
export declare function createPlaylist(client: Auth.OAuth2Client, { title, description, privacyStatus }: {
|
|
23
|
+
title: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
privacyStatus?: string;
|
|
26
|
+
}): Promise<any>;
|
|
27
|
+
export declare function deletePlaylist(client: Auth.OAuth2Client, { playlistId }: {
|
|
28
|
+
playlistId: string;
|
|
29
|
+
}): Promise<any>;
|
|
30
|
+
export declare function addVideoToPlaylist(client: Auth.OAuth2Client, { playlistId, videoId }: {
|
|
31
|
+
playlistId: string;
|
|
32
|
+
videoId: string;
|
|
33
|
+
}): Promise<any>;
|
|
34
|
+
export declare function listSubscriptions(client: Auth.OAuth2Client, { maxResults }: {
|
|
35
|
+
maxResults?: number;
|
|
36
|
+
}): Promise<Array<{
|
|
37
|
+
title?: string;
|
|
38
|
+
channelId?: string;
|
|
39
|
+
}>>;
|
|
40
|
+
//# sourceMappingURL=youtube.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../src/services/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,KAAK,EAAE,UAAe,EAAE,EAAE,gBAAgB,GAC3C,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAcrF;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAOjG;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAe,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,GAAG,CAAC,CAkBd;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAe,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,GAAG,EAAE,CAAC,CAQhB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,KAAK,EAAE,WAAW,EAAE,aAAkC,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1H,OAAO,CAAC,GAAG,CAAC,CAUd;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CAAC,GAAG,CAAC,CAId;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,GAAG,CAAC,CASd;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAe,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAWxD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export async function searchVideos(client, { query, maxResults = 10 }) {
|
|
3
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
4
|
+
const res = await yt.search.list({
|
|
5
|
+
part: ["snippet"],
|
|
6
|
+
q: query,
|
|
7
|
+
type: ["video"],
|
|
8
|
+
maxResults,
|
|
9
|
+
});
|
|
10
|
+
return (res.data.items ?? []).map((item) => ({
|
|
11
|
+
id: item.id?.videoId ?? item.id?.channelId ?? item.id?.playlistId ?? "",
|
|
12
|
+
type: item.id?.videoId ? "video" : item.id?.channelId ? "channel" : item.id?.playlistId ? "playlist" : "unknown",
|
|
13
|
+
title: item.snippet?.title ?? undefined,
|
|
14
|
+
channelTitle: item.snippet?.channelTitle ?? undefined,
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
export async function getVideo(client, { videoId }) {
|
|
18
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
19
|
+
const res = await yt.videos.list({
|
|
20
|
+
part: ["snippet", "contentDetails", "statistics"],
|
|
21
|
+
id: [videoId],
|
|
22
|
+
});
|
|
23
|
+
return res.data.items?.[0] ?? null;
|
|
24
|
+
}
|
|
25
|
+
export async function getMyVideos(client, { maxResults = 25 }) {
|
|
26
|
+
// Find the uploads playlist for the signed-in channel, then list its items.
|
|
27
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
28
|
+
const playlists = await yt.playlists.list({
|
|
29
|
+
part: ["snippet"],
|
|
30
|
+
mine: true,
|
|
31
|
+
maxResults: 50,
|
|
32
|
+
});
|
|
33
|
+
const uploadsPlaylist = (playlists.data.items ?? []).find((p) => p.id && p.snippet?.title === "Uploads");
|
|
34
|
+
if (!uploadsPlaylist?.id) {
|
|
35
|
+
return { videos: [], uploadsPlaylistId: null };
|
|
36
|
+
}
|
|
37
|
+
const items = await yt.playlistItems.list({
|
|
38
|
+
part: ["snippet", "contentDetails"],
|
|
39
|
+
playlistId: uploadsPlaylist.id,
|
|
40
|
+
maxResults,
|
|
41
|
+
});
|
|
42
|
+
return { uploadsPlaylistId: uploadsPlaylist.id, videos: items.data.items ?? [] };
|
|
43
|
+
}
|
|
44
|
+
export async function listPlaylists(client, { maxResults = 25 }) {
|
|
45
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
46
|
+
const res = await yt.playlists.list({
|
|
47
|
+
part: ["snippet", "contentDetails"],
|
|
48
|
+
mine: true,
|
|
49
|
+
maxResults,
|
|
50
|
+
});
|
|
51
|
+
return res.data.items ?? [];
|
|
52
|
+
}
|
|
53
|
+
export async function createPlaylist(client, { title, description, privacyStatus = "private" }) {
|
|
54
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
55
|
+
const res = await yt.playlists.insert({
|
|
56
|
+
part: ["snippet", "status"],
|
|
57
|
+
requestBody: {
|
|
58
|
+
snippet: { title, description },
|
|
59
|
+
status: { privacyStatus },
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
return res.data;
|
|
63
|
+
}
|
|
64
|
+
export async function deletePlaylist(client, { playlistId }) {
|
|
65
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
66
|
+
await yt.playlists.delete({ id: playlistId });
|
|
67
|
+
return { deleted: true };
|
|
68
|
+
}
|
|
69
|
+
export async function addVideoToPlaylist(client, { playlistId, videoId }) {
|
|
70
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
71
|
+
const res = await yt.playlistItems.insert({
|
|
72
|
+
part: ["snippet"],
|
|
73
|
+
requestBody: {
|
|
74
|
+
snippet: { playlistId, resourceId: { kind: "youtube#video", videoId } },
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return res.data;
|
|
78
|
+
}
|
|
79
|
+
export async function listSubscriptions(client, { maxResults = 50 }) {
|
|
80
|
+
const yt = google.youtube({ version: "v3", auth: client });
|
|
81
|
+
const res = await yt.subscriptions.list({
|
|
82
|
+
part: ["snippet"],
|
|
83
|
+
mine: true,
|
|
84
|
+
maxResults,
|
|
85
|
+
});
|
|
86
|
+
return (res.data.items ?? []).map((item) => ({
|
|
87
|
+
title: item.snippet?.title ?? undefined,
|
|
88
|
+
channelId: item.snippet?.resourceId?.channelId ?? undefined,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=youtube.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/services/youtube.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAWpC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAyB,EACzB,EAAE,KAAK,EAAE,UAAU,GAAG,EAAE,EAAoB;IAE5C,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,CAAC,EAAE,KAAK;QACR,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,UAAU;KACX,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE,EAAE,SAAS,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,IAAI,EAAE;QACvE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAChH,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,SAAS;QACvC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,SAAS;KACtD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAyB,EAAE,EAAE,OAAO,EAAgB;IACjF,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,YAAY,CAAC;QACjD,EAAE,EAAE,CAAC,OAAO,CAAC;KACd,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAyB,EACzB,EAAE,UAAU,GAAG,EAAE,EAA2B;IAE5C,4EAA4E;IAC5E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;QACxC,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,EAAE;KACf,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;IACzG,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;QACxC,IAAI,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC;QACnC,UAAU,EAAE,eAAe,CAAC,EAAE;QAC9B,UAAU;KACX,CAAC,CAAC;IACH,OAAO,EAAE,iBAAiB,EAAE,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAyB,EACzB,EAAE,UAAU,GAAG,EAAE,EAA2B;IAE5C,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC;QAClC,IAAI,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC;QACnC,IAAI,EAAE,IAAI;QACV,UAAU;KACX,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyB,EACzB,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,GAAG,SAAkB,EAAmE;IAE3H,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;QACpC,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC3B,WAAW,EAAE;YACX,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;YAC/B,MAAM,EAAE,EAAE,aAAa,EAAE;SAC1B;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyB,EACzB,EAAE,UAAU,EAA0B;IAEtC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAyB,EACzB,EAAE,UAAU,EAAE,OAAO,EAA2C;IAEhE,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;QACxC,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,WAAW,EAAE;YACX,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE;SACxE;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAyB,EACzB,EAAE,UAAU,GAAG,EAAE,EAA2B;IAE5C,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;QACtC,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,IAAI,EAAE,IAAI;QACV,UAAU;KACX,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,SAAS;QACvC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,IAAI,SAAS;KAC5D,CAAC,CAAC,CAAC;AACN,CAAC"}
|