@bobfrankston/gcal 0.1.25 → 0.1.30

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/gcal.ts CHANGED
@@ -4,19 +4,21 @@
4
4
  * Manage Google Calendar events with ICS import support
5
5
  *
6
6
  * Can be associated with .ics files for direct import:
7
- * gcal assoc
7
+ * assoc .ics=icsfile
8
+ * ftype icsfile=gcal "%1"
8
9
  */
9
10
 
10
11
  import fs from 'fs';
11
12
  import path from 'path';
12
- import { execSync } from 'child_process';
13
13
  import { authenticateOAuth } from '@bobfrankston/oauthsupport';
14
- import type { GoogleEvent, EventReminder, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.ts';
14
+ import type { GoogleEvent, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.ts';
15
15
  import {
16
16
  CREDENTIALS_FILE, loadConfig, saveConfig, getUserPaths,
17
17
  ensureUserDir, formatDateTime, formatDuration, parseDuration, parseDateTime, ts, normalizeUser
18
18
  } from './glib/gutils.js';
19
19
 
20
+ import pkg from './package.json' with { type: 'json' };
21
+ const VERSION: string = pkg.version;
20
22
  const CALENDAR_API_BASE = 'https://www.googleapis.com/calendar/v3';
21
23
  const CALENDAR_SCOPE_READ = 'https://www.googleapis.com/auth/calendar.readonly';
22
24
  const CALENDAR_SCOPE_WRITE = 'https://www.googleapis.com/auth/calendar';
@@ -25,9 +27,15 @@ let abortController: AbortController = null;
25
27
 
26
28
  function setupAbortHandler(): void {
27
29
  abortController = new AbortController();
30
+ let ctrlCCount = 0;
28
31
  process.on('SIGINT', () => {
32
+ ctrlCCount++;
29
33
  abortController?.abort();
30
- console.log('\n\nCtrl+C pressed - aborting...');
34
+ if (ctrlCCount >= 2) {
35
+ console.log('\n\nForce exit.');
36
+ process.exit(1);
37
+ }
38
+ console.log('\n\nCtrl+C pressed - aborting... (press again to force exit)');
31
39
  });
32
40
  }
33
41
 
@@ -56,7 +64,7 @@ async function getAccessToken(user: string, writeAccess = false, forceRefresh =
56
64
  scope,
57
65
  tokenDirectory: paths.userDir,
58
66
  tokenFileName,
59
- credentialsKey: 'web',
67
+ credentialsKey: 'installed',
60
68
  signal: abortController?.signal
61
69
  });
62
70
 
@@ -90,8 +98,7 @@ async function listEvents(
90
98
  accessToken: string,
91
99
  calendarId = 'primary',
92
100
  maxResults = 10,
93
- timeMin?: string,
94
- timeMax?: string
101
+ timeMin?: string
95
102
  ): Promise<GoogleEvent[]> {
96
103
  const params = new URLSearchParams({
97
104
  maxResults: maxResults.toString(),
@@ -99,8 +106,6 @@ async function listEvents(
99
106
  orderBy: 'startTime',
100
107
  timeMin: timeMin || new Date().toISOString()
101
108
  });
102
- if (timeMax)
103
- params.set('timeMax', timeMax);
104
109
 
105
110
  const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events?${params}`;
106
111
  const res = await apiFetch(url, accessToken);
@@ -141,24 +146,6 @@ async function deleteEvent(
141
146
  }
142
147
  }
143
148
 
144
- async function updateEvent(
145
- accessToken: string,
146
- eventId: string,
147
- body: Partial<GoogleEvent>,
148
- calendarId = 'primary'
149
- ): Promise<GoogleEvent> {
150
- const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
151
- const res = await apiFetch(url, accessToken, {
152
- method: 'PATCH',
153
- body: JSON.stringify(body)
154
- });
155
- if (!res.ok) {
156
- const errText = await res.text();
157
- throw new Error(`Failed to update event: ${res.status} ${errText}`);
158
- }
159
- return await res.json() as GoogleEvent;
160
- }
161
-
162
149
  async function importIcsFile(
163
150
  filePath: string,
164
151
  accessToken: string,
@@ -239,44 +226,9 @@ async function importIcsFile(
239
226
  return result;
240
227
  }
241
228
 
242
- function setupFileAssociation(): void {
243
- if (process.platform !== 'win32') {
244
- console.error('File association is only supported on Windows.');
245
- process.exit(1);
246
- }
247
-
248
- const classKey = 'HKCU\\Software\\Classes';
249
- const command = `cmd.exe /c gcal "%1"`;
250
-
251
- try {
252
- execSync(`reg add "${classKey}\\.ics" /ve /d "gcalFile" /f`, { stdio: 'pipe' });
253
- execSync(`reg add "${classKey}\\gcalFile\\shell\\open\\command" /ve /d "${command}" /f`, { stdio: 'pipe' });
254
- console.log('.ics file association set — double-click any .ics to import via gcal');
255
- } catch (e: any) {
256
- console.error(`Failed to set file association: ${e.message}`);
257
- process.exit(1);
258
- }
259
- }
260
-
261
- /** Clean up URLs — replace https URLs with [sitename] labels */
262
- function cleanUrls(text: string): string {
263
- if (!text) return text;
264
- return text.replace(/https?:\/\/([^\/\s]+)\S*/gi, (_match, host: string) => {
265
- // Extract meaningful site name from hostname
266
- const parts = host.split('.');
267
- // Drop common prefixes (www, us02web, events, etc.) and TLD suffixes
268
- // Keep the main domain name: "us02web.zoom.us" → "Zoom", "events.vtools.ieee.org" → "ieee"
269
- if (parts.length >= 2) {
270
- const domain = parts.length > 2 ? parts[parts.length - 2] : parts[0];
271
- return `[${domain.charAt(0).toUpperCase() + domain.slice(1)}]`;
272
- }
273
- return '[link]';
274
- });
275
- }
276
-
277
229
  function showUsage(): void {
278
230
  console.log(`
279
- gcal - Google Calendar CLI
231
+ gcal v${VERSION} - Google Calendar CLI
280
232
 
281
233
  Usage:
282
234
  gcal <file.ics> Import ICS file (file association)
@@ -286,10 +238,8 @@ Commands:
286
238
  list [n] List upcoming n events (default: 10)
287
239
  add <title> <when> [duration] Add event
288
240
  del|delete <id> [id2...] Delete event(s) by ID (prefix match)
289
- update <id> [flags] Update event by ID (prefix match)
290
241
  import <file.ics> Import events from ICS file
291
242
  calendars List available calendars
292
- assoc Associate .ics files with gcal (Windows)
293
243
  help Show this help
294
244
 
295
245
  Options:
@@ -297,34 +247,21 @@ Options:
297
247
  -defaultUser <email> Set default user for future use
298
248
  -c, -calendar <id> Calendar ID (default: primary)
299
249
  -n <count> Number of events to list
300
- -limit <span> Time horizon for list: #d, #w, #m, #y (default: 3m)
301
250
  -v, -verbose Show event IDs and links
302
251
  -b, -birthdays Include birthday events (hidden by default)
303
- -title <text> New title (update command)
304
- -loc <text> New location (update command)
305
- -start <when> New start time (update command)
306
- -dur <duration> New duration (update command)
307
- -r <spec> Reminders: #m, #h, #d with optional :email/:popup
308
- -r 0 No reminders
309
- -r 30m 30 min popup (default kind)
310
- -r 1h:email 1 hour email
311
- -r 15m,1h Multiple: comma-separated
312
252
 
313
253
  Examples:
314
254
  gcal meeting.ics Import ICS file
315
255
  gcal list List next 10 events
316
- gcal add "Dentist" "fri 3pm" "1h"
256
+ gcal add "Dentist" "Friday 3pm" "1h"
317
257
  gcal add "Lunch" "1/14/2026 12:00" "1h"
318
258
  gcal add "Meeting" "tomorrow 10:00"
319
259
  gcal add "Appointment" "jan 15 2pm"
320
- gcal add "Call" "tomorrow 3pm" "30m" -r 15m,1h:email
321
- gcal update abc1 -title "New Title" -loc "Room 5"
322
- gcal update abc1 -start "friday 3pm" -dur 2h
323
- gcal update abc1 -r 15m,1h:email
324
260
  gcal -defaultUser bob@gmail.com Set default user
325
261
 
326
262
  File Association (Windows):
327
- gcal assoc Set up .ics file association
263
+ assoc .ics=icsfile
264
+ ftype icsfile=gcal "%1"
328
265
  `);
329
266
  }
330
267
 
@@ -339,56 +276,6 @@ interface ParsedArgs {
339
276
  verbose: boolean;
340
277
  icsFile: string; /** Direct .ics file path */
341
278
  birthdays: boolean;
342
- reminders: EventReminder[]; /** Reminder overrides, empty = use defaults, null entry = no reminders */
343
- noReminders: boolean; /** -r 0 means no reminders at all */
344
- timeLimit: string; /** Max time horizon for list, e.g. "3m", "1y", "2w" — default "3m" */
345
- title: string; /** New title for update command */
346
- location: string; /** New location for update command */
347
- startTime: string; /** New start time for update command */
348
- duration: string; /** New duration for update command */
349
- }
350
-
351
- /** Parse a reminder spec like "30m", "1h", "2d", "30m:email", "1h:popup" */
352
- function parseReminder(spec: string): EventReminder {
353
- // Split on colon for method: "30m:email" or just "30m"
354
- const [timePart, methodPart] = spec.split(':');
355
- const method: 'email' | 'popup' = methodPart === 'email' ? 'email' : 'popup';
356
-
357
- const match = timePart.match(/^(\d+)\s*([mhd]?)$/i);
358
- if (!match) {
359
- console.error(`Invalid reminder: "${spec}" — use #m, #h, or #d (e.g. 30m, 1h, 2d)`);
360
- process.exit(1);
361
- }
362
-
363
- const num = parseInt(match[1]);
364
- const unit = (match[2] || 'm').toLowerCase();
365
- let minutes: number;
366
- switch (unit) {
367
- case 'h': minutes = num * 60; break;
368
- case 'd': minutes = num * 60 * 24; break;
369
- default: minutes = num; break;
370
- }
371
-
372
- return { method, minutes };
373
- }
374
-
375
- /** Parse a time limit spec like "3m", "1y", "2w", "90d" into a future Date */
376
- function parseTimeLimit(spec: string): Date {
377
- const match = spec.match(/^(\d+)\s*([dwmy]?)$/i);
378
- if (!match) {
379
- console.error(`Invalid time limit: "${spec}" — use #d, #w, #m, or #y (e.g. 3m, 90d, 1y)`);
380
- process.exit(1);
381
- }
382
- const num = parseInt(match[1]);
383
- const unit = (match[2] || 'm').toLowerCase();
384
- const now = new Date();
385
- switch (unit) {
386
- case 'd': now.setDate(now.getDate() + num); break;
387
- case 'w': now.setDate(now.getDate() + num * 7); break;
388
- case 'y': now.setFullYear(now.getFullYear() + num); break;
389
- default: now.setMonth(now.getMonth() + num); break; // 'm' = months
390
- }
391
- return now;
392
279
  }
393
280
 
394
281
  function parseArgs(argv: string[]): ParsedArgs {
@@ -402,14 +289,7 @@ function parseArgs(argv: string[]): ParsedArgs {
402
289
  help: false,
403
290
  verbose: false,
404
291
  icsFile: '',
405
- birthdays: false,
406
- reminders: [],
407
- noReminders: false,
408
- timeLimit: '3m',
409
- title: '',
410
- location: '',
411
- startTime: '',
412
- duration: ''
292
+ birthdays: false
413
293
  };
414
294
 
415
295
  const unknown: string[] = [];
@@ -444,49 +324,17 @@ function parseArgs(argv: string[]): ParsedArgs {
444
324
  case '--birthdays':
445
325
  result.birthdays = true;
446
326
  break;
447
- case '-limit':
448
- case '--limit':
449
- result.timeLimit = argv[++i] || '3m';
450
- break;
451
- case '-title':
452
- case '--title':
453
- result.title = argv[++i] || '';
454
- break;
455
- case '-loc':
456
- case '-location':
457
- case '--location':
458
- result.location = argv[++i] || '';
459
- break;
460
- case '-start':
461
- case '--start':
462
- result.startTime = argv[++i] || '';
463
- break;
464
- case '-dur':
465
- case '-duration':
466
- case '--duration':
467
- result.duration = argv[++i] || '';
468
- break;
469
- case '-r':
470
- case '-reminder':
471
- case '--reminder': {
472
- const rval = argv[++i] || '';
473
- if (rval === '0' || rval === 'none') {
474
- result.noReminders = true;
475
- } else {
476
- for (const part of rval.split(',')) {
477
- const reminder = parseReminder(part.trim());
478
- if (reminder)
479
- result.reminders.push(reminder);
480
- }
481
- }
482
- break;
483
- }
484
327
  case '-h':
485
328
  case '-help':
486
329
  case '--help':
487
330
  case 'help':
488
331
  result.help = true;
489
332
  break;
333
+ case '-V':
334
+ case '-version':
335
+ case '--version':
336
+ console.log(`gcal v${VERSION}`);
337
+ process.exit(0);
490
338
  default:
491
339
  if (arg.startsWith('-')) {
492
340
  unknown.push(arg);
@@ -506,8 +354,7 @@ function parseArgs(argv: string[]): ParsedArgs {
506
354
  }
507
355
 
508
356
  if (unknown.length > 0) {
509
- console.error(`Unknown options: ${unknown.join(', ')}\n`);
510
- showUsage();
357
+ console.error(`Unknown options: ${unknown.join(', ')}`);
511
358
  process.exit(1);
512
359
  }
513
360
 
@@ -562,12 +409,6 @@ async function main(): Promise<void> {
562
409
  process.exit(1);
563
410
  }
564
411
 
565
- // Commands that don't need a user
566
- if (parsed.command === 'assoc') {
567
- setupFileAssociation();
568
- process.exit(0);
569
- }
570
-
571
412
  // Resolve user
572
413
  const user = resolveUser(parsed.user, false);
573
414
  if (!user) {
@@ -607,9 +448,8 @@ async function main(): Promise<void> {
607
448
 
608
449
  case 'list': {
609
450
  const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
610
- const timeMax = parseTimeLimit(parsed.timeLimit).toISOString();
611
451
  const token = await getAccessToken(user, false);
612
- let events = await listEvents(token, parsed.calendar, count, undefined, timeMax);
452
+ let events = await listEvents(token, parsed.calendar, count);
613
453
  const birthdayCount = events.filter(e => e.eventType === 'birthday').length;
614
454
  if (!parsed.birthdays) {
615
455
  events = events.filter(e => e.eventType !== 'birthday');
@@ -626,8 +466,8 @@ async function main(): Promise<void> {
626
466
  const shortId = (event.id || '').slice(0, 8);
627
467
  const start = event.start ? formatDateTime(event.start) : '?';
628
468
  const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
629
- const summary = cleanUrls(event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
630
- const loc = cleanUrls(event.location || '');
469
+ const summary = (event.summary || '(no title)') + (event.eventType === 'birthday' ? ' [from contact]' : '');
470
+ const loc = event.location || '';
631
471
  if (parsed.verbose) {
632
472
  rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
633
473
  } else {
@@ -644,14 +484,13 @@ async function main(): Promise<void> {
644
484
  );
645
485
 
646
486
  // Print header
647
- const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
487
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
648
488
  console.log(headerLine);
649
- console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
489
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
650
490
 
651
- // Print rows — last column not padded to avoid trailing whitespace
491
+ // Print rows
652
492
  for (const row of rows) {
653
- const lastIdx = row.length - 1;
654
- const line = row.map((cell, i) => i < lastIdx ? (cell || '').padEnd(colWidths[i]) : (cell || '')).join(' ');
493
+ const line = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');
655
494
  console.log(line);
656
495
  }
657
496
  }
@@ -685,26 +524,10 @@ async function main(): Promise<void> {
685
524
  }
686
525
  };
687
526
 
688
- if (parsed.noReminders) {
689
- event.reminders = { useDefault: false, overrides: [] };
690
- } else if (parsed.reminders.length > 0) {
691
- event.reminders = { useDefault: false, overrides: parsed.reminders };
692
- }
693
-
694
527
  const token = await getAccessToken(user, true);
695
528
  const created = await createEvent(token, event, parsed.calendar);
696
529
  console.log(`\nEvent created: ${created.summary}`);
697
530
  console.log(` When: ${formatDateTime(created.start)} - ${formatDateTime(created.end)}`);
698
- if (parsed.noReminders) {
699
- console.log(` Reminders: none`);
700
- } else if (parsed.reminders.length > 0) {
701
- const rlist = parsed.reminders.map(r => {
702
- const mins = r.minutes;
703
- const label = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
704
- return `${label}${r.method === 'email' ? ':email' : ''}`;
705
- }).join(', ');
706
- console.log(` Reminders: ${rlist}`);
707
- }
708
531
  if (created.htmlLink) {
709
532
  console.log(` Link: ${created.htmlLink}`);
710
533
  }
@@ -732,12 +555,7 @@ async function main(): Promise<void> {
732
555
  if (matches.length > 1) {
733
556
  console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
734
557
  for (const e of matches) {
735
- // Show enough ID to distinguish recurring instances (base_date)
736
- const displayId = (e.id || '').length > 12 ? e.id!.slice(0, 16) : e.id?.slice(0, 8);
737
- const cleaned = cleanUrls(e.summary || '');
738
- const summary = cleaned.length > 60 ? cleaned.slice(0, 57) + '...' : cleaned;
739
- const when = e.start ? formatDateTime(e.start) : '';
740
- console.error(` ${displayId} ${when} ${summary}`);
558
+ console.error(` ${e.id?.slice(0, 8)} - ${e.summary}`);
741
559
  }
742
560
  continue;
743
561
  }
@@ -748,7 +566,7 @@ async function main(): Promise<void> {
748
566
  continue;
749
567
  }
750
568
  await deleteEvent(token, event.id!, parsed.calendar);
751
- console.log(`Deleted: ${cleanUrls(event.summary || '')}`);
569
+ console.log(`Deleted: ${event.summary}`);
752
570
  }
753
571
  break;
754
572
  }
@@ -767,104 +585,6 @@ async function main(): Promise<void> {
767
585
  break;
768
586
  }
769
587
 
770
- case 'update': {
771
- if (parsed.args.length === 0) {
772
- console.error('Usage: gcal update <id> [-title "..."] [-loc "..."] [-start "..."] [-dur "..."] [-r ...]');
773
- console.error('Use "gcal list -v" to see event IDs');
774
- process.exit(1);
775
- }
776
-
777
- const idPrefix = parsed.args[0];
778
- const token = await getAccessToken(user, true);
779
- const events = await listEvents(token, parsed.calendar, 50);
780
- const matches = events.filter(e => e.id?.startsWith(idPrefix));
781
-
782
- if (matches.length === 0) {
783
- console.error(`${idPrefix}: not found`);
784
- process.exit(1);
785
- }
786
- if (matches.length > 1) {
787
- console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
788
- for (const e of matches) {
789
- const displayId = (e.id || '').length > 12 ? e.id.slice(0, 16) : e.id?.slice(0, 8);
790
- const cleaned = cleanUrls(e.summary || '');
791
- const summary = cleaned.length > 60 ? cleaned.slice(0, 57) + '...' : cleaned;
792
- const when = e.start ? formatDateTime(e.start) : '';
793
- console.error(` ${displayId} ${when} ${summary}`);
794
- }
795
- process.exit(1);
796
- }
797
-
798
- const target = matches[0];
799
- const body: Partial<GoogleEvent> = {};
800
- const changes: string[] = [];
801
-
802
- if (parsed.title) {
803
- body.summary = parsed.title;
804
- changes.push(`title → "${parsed.title}"`);
805
- }
806
- if (parsed.location) {
807
- body.location = parsed.location;
808
- changes.push(`location → "${parsed.location}"`);
809
- }
810
- if (parsed.startTime) {
811
- const newStart = parseDateTime(parsed.startTime);
812
- const durationMs = parsed.duration
813
- ? parseDuration(parsed.duration) * 60 * 1000
814
- : (target.end?.dateTime && target.start?.dateTime)
815
- ? new Date(target.end.dateTime).getTime() - new Date(target.start.dateTime).getTime()
816
- : 60 * 60 * 1000;
817
- const newEnd = new Date(newStart.getTime() + durationMs);
818
- const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
819
- body.start = { dateTime: newStart.toISOString(), timeZone: tz };
820
- body.end = { dateTime: newEnd.toISOString(), timeZone: tz };
821
- changes.push(`start → ${formatDateTime(body.start)}`);
822
- if (parsed.duration) changes.push(`duration → ${parsed.duration}`);
823
- } else if (parsed.duration) {
824
- // Duration change without start change — shift end time
825
- if (target.start?.dateTime) {
826
- const startMs = new Date(target.start.dateTime).getTime();
827
- const newEnd = new Date(startMs + parseDuration(parsed.duration) * 60 * 1000);
828
- const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
829
- body.end = { dateTime: newEnd.toISOString(), timeZone: tz };
830
- changes.push(`duration → ${parsed.duration}`);
831
- } else {
832
- console.error('Cannot change duration of all-day event');
833
- process.exit(1);
834
- }
835
- }
836
-
837
- if (parsed.noReminders) {
838
- body.reminders = { useDefault: false, overrides: [] };
839
- changes.push('reminders → none');
840
- } else if (parsed.reminders.length > 0) {
841
- body.reminders = { useDefault: false, overrides: parsed.reminders };
842
- const rlist = parsed.reminders.map(r => {
843
- const mins = r.minutes;
844
- const label = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
845
- return `${label}${r.method === 'email' ? ':email' : ''}`;
846
- }).join(', ');
847
- changes.push(`reminders → ${rlist}`);
848
- }
849
-
850
- if (changes.length === 0) {
851
- console.error('No update flags provided. Use -title, -loc, -start, -dur, or -r');
852
- process.exit(1);
853
- }
854
-
855
- const updated = await updateEvent(token, target.id, body, parsed.calendar);
856
- console.log(`\nUpdated: ${cleanUrls(updated.summary || '')}`);
857
- for (const c of changes) {
858
- console.log(` ${c}`);
859
- }
860
- break;
861
- }
862
-
863
- case 'assoc': {
864
- setupFileAssociation();
865
- break;
866
- }
867
-
868
588
  default:
869
589
  console.error(`Unknown command: ${parsed.command}`);
870
590
  showUsage();
@@ -873,10 +593,8 @@ async function main(): Promise<void> {
873
593
  }
874
594
 
875
595
  if (import.meta.main) {
876
- main().then(() => {
877
- process.exitCode = 0;
878
- }).catch(e => {
596
+ main().catch(e => {
879
597
  console.error(`Error: ${e.message}`);
880
- process.exitCode = 1;
598
+ process.exit(1);
881
599
  });
882
600
  }
package/glib/gutils.d.ts CHANGED
@@ -20,7 +20,7 @@ export declare function getAppDir(): string;
20
20
  export declare function getDataDir(): string;
21
21
  export declare const DATA_DIR: string;
22
22
  export declare const CONFIG_FILE: string;
23
- /** Use credentials from gcards (shared OAuth app) */
23
+ /** OAuth credentials shipped with the package */
24
24
  export declare const CREDENTIALS_FILE: string;
25
25
  export declare function loadConfig(): GcalConfig;
26
26
  export declare function saveConfig(config: GcalConfig): void;
@@ -1 +1 @@
1
- {"version":3,"file":"gutils.d.ts","sourceRoot":"","sources":["gutils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,OAAO,QAAoC,CAAC;AAEzD,+DAA+D;AAC/D,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,kFAAkF;AAClF,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,eAAO,MAAM,QAAQ,QAAe,CAAC;AACrC,eAAO,MAAM,WAAW,QAAwC,CAAC;AAEjE,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,QAAiE,CAAC;AAE/F,wBAAgB,UAAU,IAAI,UAAU,CASvC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAMnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAUpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAStC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,MAAM,CAsDzE;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAclG;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkB7H;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUtD;AAED,sCAAsC;AACtC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAmHjD;AAED,4BAA4B;AAC5B,wBAAgB,EAAE,IAAI,MAAM,CAG3B"}
1
+ {"version":3,"file":"gutils.d.ts","sourceRoot":"","sources":["gutils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,OAAO,QAAoC,CAAC;AAEzD,+DAA+D;AAC/D,wBAAgB,SAAS,IAAI,MAAM,CAKlC;AAED,kFAAkF;AAClF,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AAED,eAAO,MAAM,QAAQ,QAAe,CAAC;AACrC,eAAO,MAAM,WAAW,QAAwC,CAAC;AAEjE,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,QAA8C,CAAC;AAE5E,wBAAgB,UAAU,IAAI,UAAU,CASvC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAMnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAUpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAStC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAIpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,MAAM,CAsDzE;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAclG;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkB7H;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUtD;AAED,sCAAsC;AACtC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CA+GjD;AAED,4BAA4B;AAC5B,wBAAgB,EAAE,IAAI,MAAM,CAG3B"}
package/glib/gutils.js CHANGED
@@ -22,8 +22,8 @@ export function getDataDir() {
22
22
  }
23
23
  export const DATA_DIR = getDataDir();
24
24
  export const CONFIG_FILE = path.join(getAppDir(), 'config.json');
25
- /** Use credentials from gcards (shared OAuth app) */
26
- export const CREDENTIALS_FILE = path.join(path.dirname(APP_DIR), 'gcards', 'credentials.json');
25
+ /** OAuth credentials shipped with the package */
26
+ export const CREDENTIALS_FILE = path.join(APP_DIR, 'gcal-credentials.json');
27
27
  export function loadConfig() {
28
28
  if (fs.existsSync(CONFIG_FILE)) {
29
29
  try {
@@ -209,16 +209,12 @@ export function parseDateTime(input) {
209
209
  d.setHours(h, parseInt(min || '0'), 0, 0);
210
210
  return d;
211
211
  }
212
- // Handle weekday names (full or 3-letter abbreviations)
213
- const weekdayMap = {
214
- sun: 0, sunday: 0, mon: 1, monday: 1, tue: 2, tuesday: 2,
215
- wed: 3, wednesday: 3, thu: 4, thursday: 4, fri: 5, friday: 5,
216
- sat: 6, saturday: 6
217
- };
218
- const dayMatch = lower.match(/^(next\s+)?([a-z]+)\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?$/i);
219
- if (dayMatch && weekdayMap[dayMatch[2].toLowerCase()] !== undefined) {
212
+ // Handle weekday names
213
+ const weekdays = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
214
+ const dayMatch = lower.match(/^(next\s+)?(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?$/i);
215
+ if (dayMatch) {
220
216
  const [, next, day, hour, min, ampm] = dayMatch;
221
- const targetDay = weekdayMap[day.toLowerCase()];
217
+ const targetDay = weekdays.indexOf(day.toLowerCase());
222
218
  const d = new Date(now);
223
219
  let daysUntil = targetDay - d.getDay();
224
220
  if (daysUntil <= 0 || next)
@@ -1 +1 @@
1
- {"version":3,"file":"gutils.js","sourceRoot":"","sources":["gutils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gutils.js","sourceRoot":"","sources":["gutils.ts"],"names":[],"mappings":"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"}