@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.
Files changed (38) hide show
  1. package/README.md +158 -0
  2. package/dist/account-storage.d.ts +21 -0
  3. package/dist/account-storage.d.ts.map +1 -0
  4. package/dist/account-storage.js +96 -0
  5. package/dist/account-storage.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +405 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/index.d.ts +5 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/oauth-flow.d.ts +27 -0
  15. package/dist/oauth-flow.d.ts.map +1 -0
  16. package/dist/oauth-flow.js +156 -0
  17. package/dist/oauth-flow.js.map +1 -0
  18. package/dist/services/base-service.d.ts +13 -0
  19. package/dist/services/base-service.d.ts.map +1 -0
  20. package/dist/services/base-service.js +40 -0
  21. package/dist/services/base-service.js.map +1 -0
  22. package/dist/services/index.d.ts +4 -0
  23. package/dist/services/index.d.ts.map +1 -0
  24. package/dist/services/index.js +4 -0
  25. package/dist/services/index.js.map +1 -0
  26. package/dist/services/task-service.d.ts +19 -0
  27. package/dist/services/task-service.d.ts.map +1 -0
  28. package/dist/services/task-service.js +152 -0
  29. package/dist/services/task-service.js.map +1 -0
  30. package/dist/services/tasklist-service.d.ts +15 -0
  31. package/dist/services/tasklist-service.d.ts.map +1 -0
  32. package/dist/services/tasklist-service.js +76 -0
  33. package/dist/services/tasklist-service.js.map +1 -0
  34. package/dist/types.d.ts +88 -0
  35. package/dist/types.d.ts.map +1 -0
  36. package/dist/types.js +2 -0
  37. package/dist/types.js.map +1 -0
  38. 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;AACrC,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;AACrD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAE7C,SAAS,KAAK;IACb,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CA2DgC,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,GAAW;IACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,KAAK,EAAE,CAAC;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC;QACJ,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC7C,CAAC;QAED,QAAQ,OAAO,EAAE,CAAC;YACjB,KAAK,OAAO;gBACX,MAAM,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACxC,MAAM;YACP,KAAK,OAAO;gBACX,MAAM,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACxC,MAAM;YACP;gBACC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;AACF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAElE,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACP,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;oBAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACF,CAAC;YACD,MAAM;QACP,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ;gBAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,SAAS;gBAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAClD,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,MAAM;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,YAAY,KAAK,kBAAkB,CAAC,CAAC;YAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,+EAA+E,CAAC,CAAC;YACnG,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;YAC3F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAY;gBACxB,KAAK;gBACL,MAAM,EAAE;oBACP,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,WAAW,EAAE,MAAM,CAAC,WAAW;iBAC/B;aACD,CAAC;YACF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC;YACxC,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM;QACP,CAAC;QACD;YACC,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;AACF,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,IAAc;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,qEAAqE;IACrE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC5B,IAAI;YACJ,OAAO,EAAE;gBACR,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aACpC;SACD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE;YAClD,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YACvD,SAAS,EAAE,MAAM,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO;IACR,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACzC,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAClD,gBAAgB,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC9B,KAAK,CAAC,8CAA8C,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACnD,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACjE,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,eAAe,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM;QACP,CAAC;QACD;YACC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,IAAc;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9B,oDAAoD;IACpD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC5B,IAAI,EAAE,OAAO;YACb,OAAO,EAAE;gBACR,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACvC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aACpC;SACD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE;YACtD,aAAa,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;YACxC,UAAU,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;YAClC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YACvD,SAAS,EAAE,MAAM,CAAC,IAAI;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO;IACR,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QACjB,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACzC,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;oBACrC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;oBACnC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;iBACtC;gBACD,gBAAgB,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,+DAA+D,CAAC,CAAC;YACnF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE;gBACtD,KAAK;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,MAAM,EAAE,MAAM,CAAC,MAAM;aACrB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACzC,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;oBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;oBACrC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;oBACnC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;iBACtC;gBACD,gBAAgB,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,4EAA4E,CAAC,CAAC;YACjG,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC9D,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,MAAM,EAAE,MAAM,CAAC,MAAiD;aAChE,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM;QACP,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YACjB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACpD,MAAM;QACP,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM;QACP,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC5D,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM;QACP,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;gBACzC,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE;oBACR,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;oBACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,gBAAgB,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACxF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE;gBAC5D,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAChD,MAAM;QACP,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACd,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,MAAM;QACP,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC1E,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM;QACP,CAAC;QACD;YACC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -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,5 @@
1
+ export { AccountStorage } from "./account-storage.js";
2
+ export { OAuthFlow } from "./oauth-flow.js";
3
+ export { BaseService, TaskListService, TaskService } from "./services/index.js";
4
+ export * from "./types.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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"}