@tjboudreaux/gtcli 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/README.md +158 -0
- package/dist/account-storage.d.ts +21 -0
- package/dist/account-storage.d.ts.map +1 -0
- package/dist/account-storage.js +96 -0
- package/dist/account-storage.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +405 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth-flow.d.ts +27 -0
- package/dist/oauth-flow.d.ts.map +1 -0
- package/dist/oauth-flow.js +156 -0
- package/dist/oauth-flow.js.map +1 -0
- package/dist/services/base-service.d.ts +13 -0
- package/dist/services/base-service.d.ts.map +1 -0
- package/dist/services/base-service.js +40 -0
- package/dist/services/base-service.js.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +4 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/task-service.d.ts +19 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +152 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/services/tasklist-service.d.ts +15 -0
- package/dist/services/tasklist-service.d.ts.map +1 -0
- package/dist/services/tasklist-service.js +76 -0
- package/dist/services/tasklist-service.js.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import { parseArgs } from "node:util";
|
|
4
|
+
import { AccountStorage } from "./account-storage.js";
|
|
5
|
+
import { OAuthFlow } from "./oauth-flow.js";
|
|
6
|
+
import { TaskService } from "./services/task-service.js";
|
|
7
|
+
import { TaskListService } from "./services/tasklist-service.js";
|
|
8
|
+
const storage = new AccountStorage();
|
|
9
|
+
const taskListService = new TaskListService(storage);
|
|
10
|
+
const taskService = new TaskService(storage);
|
|
11
|
+
function usage() {
|
|
12
|
+
console.log(`gtcli - Google Tasks CLI
|
|
13
|
+
|
|
14
|
+
USAGE
|
|
15
|
+
|
|
16
|
+
gtcli accounts <action> Account management
|
|
17
|
+
gtcli <email> lists [command] [options] Task list operations
|
|
18
|
+
gtcli <email> tasks <listId> [command] Task operations
|
|
19
|
+
|
|
20
|
+
ACCOUNT COMMANDS
|
|
21
|
+
|
|
22
|
+
gtcli accounts credentials <file.json> Set OAuth credentials (once)
|
|
23
|
+
gtcli accounts list List configured accounts
|
|
24
|
+
gtcli accounts add <email> [--manual] Add account (--manual for browserless OAuth)
|
|
25
|
+
gtcli accounts remove <email> Remove account
|
|
26
|
+
|
|
27
|
+
TASK LIST COMMANDS
|
|
28
|
+
|
|
29
|
+
gtcli <email> lists List all task lists
|
|
30
|
+
gtcli <email> lists get <listId> Get task list details
|
|
31
|
+
gtcli <email> lists create <title> Create new task list
|
|
32
|
+
gtcli <email> lists update <listId> --title <title>
|
|
33
|
+
Update task list title
|
|
34
|
+
gtcli <email> lists delete <listId> Delete task list
|
|
35
|
+
gtcli <email> lists url <listIds...> Generate web URLs
|
|
36
|
+
|
|
37
|
+
TASK COMMANDS
|
|
38
|
+
|
|
39
|
+
gtcli <email> tasks <listId> List tasks in list
|
|
40
|
+
gtcli <email> tasks <listId> --completed Include completed tasks
|
|
41
|
+
gtcli <email> tasks <listId> --hidden Include hidden tasks
|
|
42
|
+
|
|
43
|
+
gtcli <email> tasks <listId> get <taskId> Get task details
|
|
44
|
+
|
|
45
|
+
gtcli <email> tasks <listId> create <title> [--notes N] [--due DATE]
|
|
46
|
+
Create task
|
|
47
|
+
|
|
48
|
+
gtcli <email> tasks <listId> update <taskId> [--title T] [--notes N] [--due DATE] [--status STATUS]
|
|
49
|
+
Update task
|
|
50
|
+
|
|
51
|
+
gtcli <email> tasks <listId> complete <taskId>
|
|
52
|
+
Mark task as completed
|
|
53
|
+
|
|
54
|
+
gtcli <email> tasks <listId> uncomplete <taskId>
|
|
55
|
+
Mark task as needs action
|
|
56
|
+
|
|
57
|
+
gtcli <email> tasks <listId> delete <taskId>
|
|
58
|
+
Delete task
|
|
59
|
+
|
|
60
|
+
gtcli <email> tasks <listId> move <taskId> [--parent ID] [--previous ID]
|
|
61
|
+
Move/reorder task
|
|
62
|
+
|
|
63
|
+
gtcli <email> tasks <listId> clear Clear completed tasks
|
|
64
|
+
|
|
65
|
+
gtcli <email> tasks <listId> url <taskIds...>
|
|
66
|
+
Generate web URLs
|
|
67
|
+
|
|
68
|
+
DATA STORAGE
|
|
69
|
+
|
|
70
|
+
~/.gtcli/credentials.json OAuth client credentials
|
|
71
|
+
~/.gtcli/accounts.json Account tokens`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
function error(msg) {
|
|
75
|
+
console.error("Error:", msg);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
async function main() {
|
|
79
|
+
const args = process.argv.slice(2);
|
|
80
|
+
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
81
|
+
usage();
|
|
82
|
+
}
|
|
83
|
+
const first = args[0];
|
|
84
|
+
const rest = args.slice(1);
|
|
85
|
+
try {
|
|
86
|
+
if (first === "accounts") {
|
|
87
|
+
await handleAccounts(rest);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const account = first;
|
|
91
|
+
const service = rest[0];
|
|
92
|
+
const serviceArgs = rest.slice(1);
|
|
93
|
+
if (!service) {
|
|
94
|
+
error("Missing service. Use: lists, tasks");
|
|
95
|
+
}
|
|
96
|
+
switch (service) {
|
|
97
|
+
case "lists":
|
|
98
|
+
await handleLists(account, serviceArgs);
|
|
99
|
+
break;
|
|
100
|
+
case "tasks":
|
|
101
|
+
await handleTasks(account, serviceArgs);
|
|
102
|
+
break;
|
|
103
|
+
default:
|
|
104
|
+
error(`Unknown service: ${service}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
error(e instanceof Error ? e.message : String(e));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function handleAccounts(args) {
|
|
112
|
+
const action = args[0];
|
|
113
|
+
if (!action)
|
|
114
|
+
error("Missing action: list|add|remove|credentials");
|
|
115
|
+
switch (action) {
|
|
116
|
+
case "list": {
|
|
117
|
+
const accounts = storage.getAllAccounts();
|
|
118
|
+
if (accounts.length === 0) {
|
|
119
|
+
console.log("No accounts configured");
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
for (const a of accounts) {
|
|
123
|
+
console.log(a.email);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "credentials": {
|
|
129
|
+
const credFile = args[1];
|
|
130
|
+
if (!credFile)
|
|
131
|
+
error("Usage: accounts credentials <credentials.json>");
|
|
132
|
+
const creds = JSON.parse(fs.readFileSync(credFile, "utf8"));
|
|
133
|
+
const installed = creds.installed || creds.web;
|
|
134
|
+
if (!installed)
|
|
135
|
+
error("Invalid credentials file");
|
|
136
|
+
storage.setCredentials(installed.client_id, installed.client_secret);
|
|
137
|
+
console.log("Credentials saved");
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
case "add": {
|
|
141
|
+
const manual = args.includes("--manual");
|
|
142
|
+
const filtered = args.slice(1).filter((a) => a !== "--manual");
|
|
143
|
+
const email = filtered[0];
|
|
144
|
+
if (!email)
|
|
145
|
+
error("Usage: accounts add <email> [--manual]");
|
|
146
|
+
if (storage.hasAccount(email))
|
|
147
|
+
error(`Account '${email}' already exists`);
|
|
148
|
+
const creds = storage.getCredentials();
|
|
149
|
+
if (!creds)
|
|
150
|
+
error("No credentials configured. Run: gtcli accounts credentials <credentials.json>");
|
|
151
|
+
const flow = new OAuthFlow({ clientId: creds.clientId, clientSecret: creds.clientSecret });
|
|
152
|
+
const result = await flow.authorize(manual);
|
|
153
|
+
const account = {
|
|
154
|
+
email,
|
|
155
|
+
oauth2: {
|
|
156
|
+
clientId: creds.clientId,
|
|
157
|
+
clientSecret: creds.clientSecret,
|
|
158
|
+
refreshToken: result.refreshToken,
|
|
159
|
+
accessToken: result.accessToken,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
storage.addAccount(account);
|
|
163
|
+
console.log(`Account '${email}' added`);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case "remove": {
|
|
167
|
+
const email = args[1];
|
|
168
|
+
if (!email)
|
|
169
|
+
error("Usage: accounts remove <email>");
|
|
170
|
+
const deleted = storage.deleteAccount(email);
|
|
171
|
+
console.log(deleted ? `Removed '${email}'` : `Not found: ${email}`);
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
default:
|
|
175
|
+
error(`Unknown action: ${action}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async function handleLists(account, args) {
|
|
179
|
+
const command = args[0];
|
|
180
|
+
// If no command or command looks like an option, list all task lists
|
|
181
|
+
if (!command || command.startsWith("-")) {
|
|
182
|
+
const { values } = parseArgs({
|
|
183
|
+
args,
|
|
184
|
+
options: {
|
|
185
|
+
max: { type: "string", short: "m" },
|
|
186
|
+
page: { type: "string", short: "p" },
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
const result = await taskListService.list(account, {
|
|
190
|
+
maxResults: values.max ? Number(values.max) : undefined,
|
|
191
|
+
pageToken: values.page,
|
|
192
|
+
});
|
|
193
|
+
console.log("ID\tTITLE\tUPDATED");
|
|
194
|
+
for (const list of result.items) {
|
|
195
|
+
const updated = list.updated ? list.updated.slice(0, 16).replace("T", " ") : "-";
|
|
196
|
+
console.log(`${list.id}\t${list.title}\t${updated}`);
|
|
197
|
+
}
|
|
198
|
+
if (result.nextPageToken) {
|
|
199
|
+
console.log(`\n# Next page: --page ${result.nextPageToken}`);
|
|
200
|
+
}
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const cmdArgs = args.slice(1);
|
|
204
|
+
switch (command) {
|
|
205
|
+
case "get": {
|
|
206
|
+
const listId = cmdArgs[0];
|
|
207
|
+
if (!listId)
|
|
208
|
+
error("Usage: lists get <listId>");
|
|
209
|
+
const list = await taskListService.get(account, listId);
|
|
210
|
+
console.log(JSON.stringify(list, null, 2));
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
case "create": {
|
|
214
|
+
const title = cmdArgs.join(" ");
|
|
215
|
+
if (!title)
|
|
216
|
+
error("Usage: lists create <title>");
|
|
217
|
+
const list = await taskListService.create(account, title);
|
|
218
|
+
console.log(`Created: ${list.id}\t${list.title}`);
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
case "update": {
|
|
222
|
+
const { values, positionals } = parseArgs({
|
|
223
|
+
args: cmdArgs,
|
|
224
|
+
options: { title: { type: "string", short: "t" } },
|
|
225
|
+
allowPositionals: true,
|
|
226
|
+
});
|
|
227
|
+
const listId = positionals[0];
|
|
228
|
+
if (!listId || !values.title) {
|
|
229
|
+
error("Usage: lists update <listId> --title <title>");
|
|
230
|
+
}
|
|
231
|
+
const list = await taskListService.update(account, listId, values.title);
|
|
232
|
+
console.log(`Updated: ${list.id}\t${list.title}`);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
case "delete": {
|
|
236
|
+
const listId = cmdArgs[0];
|
|
237
|
+
if (!listId)
|
|
238
|
+
error("Usage: lists delete <listId>");
|
|
239
|
+
await taskListService.delete(account, listId);
|
|
240
|
+
console.log("Deleted");
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
case "url": {
|
|
244
|
+
if (cmdArgs.length === 0)
|
|
245
|
+
error("Usage: lists url <listIds...>");
|
|
246
|
+
for (const id of cmdArgs) {
|
|
247
|
+
console.log(`${id}\t${taskListService.generateWebUrl(id)}`);
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
default:
|
|
252
|
+
error(`Unknown lists command: ${command}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
async function handleTasks(account, args) {
|
|
256
|
+
const listId = args[0];
|
|
257
|
+
if (!listId)
|
|
258
|
+
error("Usage: tasks <listId> [command] [options]");
|
|
259
|
+
const command = args[1];
|
|
260
|
+
const cmdArgs = args.slice(2);
|
|
261
|
+
// If no command or command is an option, list tasks
|
|
262
|
+
if (!command || command.startsWith("-")) {
|
|
263
|
+
const allArgs = args.slice(1);
|
|
264
|
+
const { values } = parseArgs({
|
|
265
|
+
args: allArgs,
|
|
266
|
+
options: {
|
|
267
|
+
completed: { type: "boolean", short: "c" },
|
|
268
|
+
hidden: { type: "boolean", short: "h" },
|
|
269
|
+
max: { type: "string", short: "m" },
|
|
270
|
+
page: { type: "string", short: "p" },
|
|
271
|
+
},
|
|
272
|
+
});
|
|
273
|
+
const result = await taskService.list(account, listId, {
|
|
274
|
+
showCompleted: values.completed ?? false,
|
|
275
|
+
showHidden: values.hidden ?? false,
|
|
276
|
+
maxResults: values.max ? Number(values.max) : undefined,
|
|
277
|
+
pageToken: values.page,
|
|
278
|
+
});
|
|
279
|
+
console.log("ID\tSTATUS\tTITLE\tDUE");
|
|
280
|
+
for (const task of result.items) {
|
|
281
|
+
const status = task.status === "completed" ? "✓" : "○";
|
|
282
|
+
const due = task.due ? task.due.slice(0, 10) : "-";
|
|
283
|
+
console.log(`${task.id}\t${status}\t${task.title}\t${due}`);
|
|
284
|
+
}
|
|
285
|
+
if (result.nextPageToken) {
|
|
286
|
+
console.log(`\n# Next page: --page ${result.nextPageToken}`);
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
switch (command) {
|
|
291
|
+
case "get": {
|
|
292
|
+
const taskId = cmdArgs[0];
|
|
293
|
+
if (!taskId)
|
|
294
|
+
error("Usage: tasks <listId> get <taskId>");
|
|
295
|
+
const task = await taskService.get(account, listId, taskId);
|
|
296
|
+
console.log(JSON.stringify(task, null, 2));
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case "create": {
|
|
300
|
+
const { values, positionals } = parseArgs({
|
|
301
|
+
args: cmdArgs,
|
|
302
|
+
options: {
|
|
303
|
+
notes: { type: "string", short: "n" },
|
|
304
|
+
due: { type: "string", short: "d" },
|
|
305
|
+
parent: { type: "string", short: "p" },
|
|
306
|
+
},
|
|
307
|
+
allowPositionals: true,
|
|
308
|
+
});
|
|
309
|
+
const title = positionals.join(" ");
|
|
310
|
+
if (!title)
|
|
311
|
+
error("Usage: tasks <listId> create <title> [--notes N] [--due DATE]");
|
|
312
|
+
const task = await taskService.create(account, listId, {
|
|
313
|
+
title,
|
|
314
|
+
notes: values.notes,
|
|
315
|
+
due: values.due,
|
|
316
|
+
parent: values.parent,
|
|
317
|
+
});
|
|
318
|
+
console.log(`Created: ${task.id}\t${task.title}`);
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case "update": {
|
|
322
|
+
const { values, positionals } = parseArgs({
|
|
323
|
+
args: cmdArgs,
|
|
324
|
+
options: {
|
|
325
|
+
title: { type: "string", short: "t" },
|
|
326
|
+
notes: { type: "string", short: "n" },
|
|
327
|
+
due: { type: "string", short: "d" },
|
|
328
|
+
status: { type: "string", short: "s" },
|
|
329
|
+
},
|
|
330
|
+
allowPositionals: true,
|
|
331
|
+
});
|
|
332
|
+
const taskId = positionals[0];
|
|
333
|
+
if (!taskId)
|
|
334
|
+
error("Usage: tasks <listId> update <taskId> [--title T] [--notes N] [--due DATE]");
|
|
335
|
+
const task = await taskService.update(account, listId, taskId, {
|
|
336
|
+
title: values.title,
|
|
337
|
+
notes: values.notes,
|
|
338
|
+
due: values.due,
|
|
339
|
+
status: values.status,
|
|
340
|
+
});
|
|
341
|
+
console.log(`Updated: ${task.id}\t${task.title}`);
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
case "complete": {
|
|
345
|
+
const taskId = cmdArgs[0];
|
|
346
|
+
if (!taskId)
|
|
347
|
+
error("Usage: tasks <listId> complete <taskId>");
|
|
348
|
+
const task = await taskService.complete(account, listId, taskId);
|
|
349
|
+
console.log(`Completed: ${task.id}\t${task.title}`);
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
case "uncomplete": {
|
|
353
|
+
const taskId = cmdArgs[0];
|
|
354
|
+
if (!taskId)
|
|
355
|
+
error("Usage: tasks <listId> uncomplete <taskId>");
|
|
356
|
+
const task = await taskService.uncomplete(account, listId, taskId);
|
|
357
|
+
console.log(`Uncompleted: ${task.id}\t${task.title}`);
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
case "delete": {
|
|
361
|
+
const taskId = cmdArgs[0];
|
|
362
|
+
if (!taskId)
|
|
363
|
+
error("Usage: tasks <listId> delete <taskId>");
|
|
364
|
+
await taskService.delete(account, listId, taskId);
|
|
365
|
+
console.log("Deleted");
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
case "move": {
|
|
369
|
+
const { values, positionals } = parseArgs({
|
|
370
|
+
args: cmdArgs,
|
|
371
|
+
options: {
|
|
372
|
+
parent: { type: "string", short: "p" },
|
|
373
|
+
previous: { type: "string" },
|
|
374
|
+
},
|
|
375
|
+
allowPositionals: true,
|
|
376
|
+
});
|
|
377
|
+
const taskId = positionals[0];
|
|
378
|
+
if (!taskId)
|
|
379
|
+
error("Usage: tasks <listId> move <taskId> [--parent ID] [--previous ID]");
|
|
380
|
+
const task = await taskService.move(account, listId, taskId, {
|
|
381
|
+
parent: values.parent,
|
|
382
|
+
previous: values.previous,
|
|
383
|
+
});
|
|
384
|
+
console.log(`Moved: ${task.id}\t${task.title}`);
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
case "clear": {
|
|
388
|
+
await taskService.clear(account, listId);
|
|
389
|
+
console.log("Cleared completed tasks");
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
case "url": {
|
|
393
|
+
if (cmdArgs.length === 0)
|
|
394
|
+
error("Usage: tasks <listId> url <taskIds...>");
|
|
395
|
+
for (const id of cmdArgs) {
|
|
396
|
+
console.log(`${id}\t${taskService.generateWebUrl(listId, id)}`);
|
|
397
|
+
}
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
default:
|
|
401
|
+
error(`Unknown tasks command: ${command}`);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
main();
|
|
405
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { AccountStorage } from "./account-storage.js";
|
|
2
|
+
export { OAuthFlow, type OAuthFlowOptions, type OAuthResult } from "./oauth-flow.js";
|
|
3
|
+
export { BaseService, TaskListService, TaskService } from "./services/index.js";
|
|
4
|
+
export * from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChF,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAA2C,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChF,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { OAuth2Client } from "google-auth-library";
|
|
2
|
+
export interface OAuthFlowOptions {
|
|
3
|
+
clientId: string;
|
|
4
|
+
clientSecret: string;
|
|
5
|
+
scopes?: string[];
|
|
6
|
+
redirectPort?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface OAuthResult {
|
|
9
|
+
refreshToken: string;
|
|
10
|
+
accessToken?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class OAuthFlow {
|
|
13
|
+
private oauth2Client;
|
|
14
|
+
private scopes;
|
|
15
|
+
private redirectPort;
|
|
16
|
+
constructor(options: OAuthFlowOptions);
|
|
17
|
+
getAuthUrl(): string;
|
|
18
|
+
exchangeCode(code: string): Promise<OAuthResult>;
|
|
19
|
+
authorize(manual?: boolean): Promise<OAuthResult>;
|
|
20
|
+
private authorizeManual;
|
|
21
|
+
private authorizeBrowser;
|
|
22
|
+
extractCodeFromUrl(url: string): string;
|
|
23
|
+
private openBrowser;
|
|
24
|
+
getOAuth2Client(): OAuth2Client;
|
|
25
|
+
static getDefaultScopes(): string[];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flow.d.ts","sourceRoot":"","sources":["../src/oauth-flow.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOnD,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAS;IACrB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,gBAAgB;IAQrC,UAAU,IAAI,MAAM;IAQd,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAahD,SAAS,CAAC,MAAM,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;YASvC,eAAe;YAwBf,gBAAgB;IAuD9B,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;YAmBzB,WAAW;IAuBzB,eAAe,IAAI,YAAY;IAI/B,MAAM,CAAC,gBAAgB,IAAI,MAAM,EAAE;CAGnC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as http from "node:http";
|
|
2
|
+
import * as readline from "node:readline";
|
|
3
|
+
import { OAuth2Client } from "google-auth-library";
|
|
4
|
+
const SCOPES = ["https://www.googleapis.com/auth/tasks"];
|
|
5
|
+
const REDIRECT_PORT = 3000;
|
|
6
|
+
const REDIRECT_URI = `http://localhost:${REDIRECT_PORT}`;
|
|
7
|
+
export class OAuthFlow {
|
|
8
|
+
oauth2Client;
|
|
9
|
+
scopes;
|
|
10
|
+
redirectPort;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.scopes = options.scopes ?? SCOPES;
|
|
13
|
+
this.redirectPort = options.redirectPort ?? REDIRECT_PORT;
|
|
14
|
+
const redirectUri = `http://localhost:${this.redirectPort}`;
|
|
15
|
+
this.oauth2Client = new OAuth2Client(options.clientId, options.clientSecret, redirectUri);
|
|
16
|
+
}
|
|
17
|
+
getAuthUrl() {
|
|
18
|
+
return this.oauth2Client.generateAuthUrl({
|
|
19
|
+
access_type: "offline",
|
|
20
|
+
scope: this.scopes,
|
|
21
|
+
prompt: "consent",
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async exchangeCode(code) {
|
|
25
|
+
const { tokens } = await this.oauth2Client.getToken(code);
|
|
26
|
+
if (!tokens.refresh_token) {
|
|
27
|
+
throw new Error("No refresh token received. Try revoking app access and re-authorizing.");
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
refreshToken: tokens.refresh_token,
|
|
31
|
+
accessToken: tokens.access_token ?? undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async authorize(manual = false) {
|
|
35
|
+
const authUrl = this.getAuthUrl();
|
|
36
|
+
if (manual) {
|
|
37
|
+
return this.authorizeManual(authUrl);
|
|
38
|
+
}
|
|
39
|
+
return this.authorizeBrowser(authUrl);
|
|
40
|
+
}
|
|
41
|
+
async authorizeManual(authUrl) {
|
|
42
|
+
console.log("Open this URL in your browser:\n");
|
|
43
|
+
console.log(authUrl);
|
|
44
|
+
console.log("\nAfter authorization, paste the redirect URL here:");
|
|
45
|
+
const rl = readline.createInterface({
|
|
46
|
+
input: process.stdin,
|
|
47
|
+
output: process.stdout,
|
|
48
|
+
});
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
rl.question("Redirect URL: ", async (redirectUrl) => {
|
|
51
|
+
rl.close();
|
|
52
|
+
try {
|
|
53
|
+
const code = this.extractCodeFromUrl(redirectUrl);
|
|
54
|
+
const result = await this.exchangeCode(code);
|
|
55
|
+
resolve(result);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
reject(error);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async authorizeBrowser(authUrl) {
|
|
64
|
+
console.log("Opening browser for authorization...");
|
|
65
|
+
console.log(`If browser doesn't open, visit: ${authUrl}\n`);
|
|
66
|
+
await this.openBrowser(authUrl);
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
const server = http.createServer(async (req, res) => {
|
|
69
|
+
const url = new URL(req.url ?? "", REDIRECT_URI);
|
|
70
|
+
const code = url.searchParams.get("code");
|
|
71
|
+
const error = url.searchParams.get("error");
|
|
72
|
+
if (error) {
|
|
73
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
74
|
+
res.end(`<html><body><h1>Authorization Failed</h1><p>${error}</p></body></html>`);
|
|
75
|
+
server.close();
|
|
76
|
+
reject(new Error(`Authorization failed: ${error}`));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (code) {
|
|
80
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
81
|
+
res.end("<html><body><h1>Authorization Successful</h1><p>You can close this window.</p></body></html>");
|
|
82
|
+
server.close();
|
|
83
|
+
try {
|
|
84
|
+
const result = await this.exchangeCode(code);
|
|
85
|
+
resolve(result);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
reject(err);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
93
|
+
res.end("<html><body><h1>Invalid Request</h1></body></html>");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
server.listen(this.redirectPort, () => {
|
|
97
|
+
console.log(`Waiting for authorization on port ${this.redirectPort}...`);
|
|
98
|
+
});
|
|
99
|
+
server.on("error", (err) => {
|
|
100
|
+
reject(new Error(`Failed to start local server: ${err.message}`));
|
|
101
|
+
});
|
|
102
|
+
setTimeout(() => {
|
|
103
|
+
server.close();
|
|
104
|
+
reject(new Error("Authorization timed out after 5 minutes"));
|
|
105
|
+
}, 5 * 60 * 1000);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
extractCodeFromUrl(url) {
|
|
109
|
+
try {
|
|
110
|
+
const parsedUrl = new URL(url);
|
|
111
|
+
const code = parsedUrl.searchParams.get("code");
|
|
112
|
+
if (!code) {
|
|
113
|
+
throw new Error("No authorization code found in URL");
|
|
114
|
+
}
|
|
115
|
+
return code;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
if (url.includes("code=")) {
|
|
119
|
+
const match = url.match(/code=([^&]+)/);
|
|
120
|
+
if (match) {
|
|
121
|
+
return decodeURIComponent(match[1]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw new Error("Invalid redirect URL");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async openBrowser(url) {
|
|
128
|
+
const { exec } = await import("node:child_process");
|
|
129
|
+
const platform = process.platform;
|
|
130
|
+
let command;
|
|
131
|
+
if (platform === "darwin") {
|
|
132
|
+
command = `open "${url}"`;
|
|
133
|
+
}
|
|
134
|
+
else if (platform === "win32") {
|
|
135
|
+
command = `start "" "${url}"`;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
command = `xdg-open "${url}"`;
|
|
139
|
+
}
|
|
140
|
+
return new Promise((resolve) => {
|
|
141
|
+
exec(command, (error) => {
|
|
142
|
+
if (error) {
|
|
143
|
+
console.log("Could not open browser automatically.");
|
|
144
|
+
}
|
|
145
|
+
resolve();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
getOAuth2Client() {
|
|
150
|
+
return this.oauth2Client;
|
|
151
|
+
}
|
|
152
|
+
static getDefaultScopes() {
|
|
153
|
+
return [...SCOPES];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=oauth-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-flow.js","sourceRoot":"","sources":["../src/oauth-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OAuth2Client } from "google-auth-library";
|
|
2
|
+
import { AccountStorage } from "../account-storage.js";
|
|
3
|
+
import type { Account } from "../types.js";
|
|
4
|
+
export declare abstract class BaseService {
|
|
5
|
+
protected accountStorage: AccountStorage;
|
|
6
|
+
protected clients: Map<string, OAuth2Client>;
|
|
7
|
+
constructor(accountStorage?: AccountStorage);
|
|
8
|
+
protected getOAuth2Client(email: string): OAuth2Client;
|
|
9
|
+
protected createOAuth2Client(account: Account): OAuth2Client;
|
|
10
|
+
clearClientCache(email?: string): void;
|
|
11
|
+
getAccountStorage(): AccountStorage;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=base-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-service.d.ts","sourceRoot":"","sources":["../../src/services/base-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,8BAAsB,WAAW;IAChC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IACzC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAa;gBAE7C,cAAc,CAAC,EAAE,cAAc;IAI3C,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAYtD,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY;IAW5D,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAQtC,iBAAiB,IAAI,cAAc;CAGnC"}
|