@bobfrankston/gcal 0.1.14 → 0.1.16

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.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * gcal - Google Calendar CLI tool
4
+ * Manage Google Calendar events with ICS import support
5
+ *
6
+ * Can be associated with .ics files for direct import:
7
+ * assoc .ics=icsfile
8
+ * ftype icsfile=gcal "%1"
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=gcal.d.ts.map
package/gcal.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcal.d.ts","sourceRoot":"","sources":["gcal.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
package/gcal.js ADDED
@@ -0,0 +1,557 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * gcal - Google Calendar CLI tool
4
+ * Manage Google Calendar events with ICS import support
5
+ *
6
+ * Can be associated with .ics files for direct import:
7
+ * assoc .ics=icsfile
8
+ * ftype icsfile=gcal "%1"
9
+ */
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { authenticateOAuth } from '@bobfrankston/oauthsupport';
13
+ import { CREDENTIALS_FILE, loadConfig, saveConfig, getUserPaths, ensureUserDir, formatDateTime, formatDuration, parseDuration, parseDateTime, ts, normalizeUser } from './glib/gutils.js';
14
+ const CALENDAR_API_BASE = 'https://www.googleapis.com/calendar/v3';
15
+ const CALENDAR_SCOPE_READ = 'https://www.googleapis.com/auth/calendar.readonly';
16
+ const CALENDAR_SCOPE_WRITE = 'https://www.googleapis.com/auth/calendar';
17
+ let abortController = null;
18
+ function setupAbortHandler() {
19
+ abortController = new AbortController();
20
+ process.on('SIGINT', () => {
21
+ abortController?.abort();
22
+ console.log('\n\nCtrl+C pressed - aborting...');
23
+ });
24
+ }
25
+ async function getAccessToken(user, writeAccess = false, forceRefresh = false) {
26
+ if (!fs.existsSync(CREDENTIALS_FILE)) {
27
+ console.error(`\nCredentials file not found: ${CREDENTIALS_FILE}\n`);
28
+ console.error(`gcal uses the same credentials as gcards.`);
29
+ console.error(`Make sure gcards is set up with OAuth credentials first.`);
30
+ console.error(`See: https://github.com/BobFrankston/oauthsupport/blob/master/SETUP-GOOGLE-OAUTH.md`);
31
+ process.exit(1);
32
+ }
33
+ const paths = getUserPaths(user);
34
+ ensureUserDir(user);
35
+ const scope = writeAccess ? CALENDAR_SCOPE_WRITE : CALENDAR_SCOPE_READ;
36
+ const tokenFileName = writeAccess ? 'token-write.json' : 'token.json';
37
+ const tokenFilePath = path.join(paths.userDir, tokenFileName);
38
+ if (forceRefresh && fs.existsSync(tokenFilePath)) {
39
+ fs.unlinkSync(tokenFilePath);
40
+ console.log(`${ts()} Token expired, refreshing...`);
41
+ }
42
+ const token = await authenticateOAuth(CREDENTIALS_FILE, {
43
+ scope,
44
+ tokenDirectory: paths.userDir,
45
+ tokenFileName,
46
+ credentialsKey: 'web',
47
+ signal: abortController?.signal
48
+ });
49
+ if (!token) {
50
+ throw new Error('OAuth authentication failed');
51
+ }
52
+ return token.access_token;
53
+ }
54
+ async function apiFetch(url, accessToken, options = {}) {
55
+ const headers = {
56
+ 'Authorization': `Bearer ${accessToken}`,
57
+ 'Content-Type': 'application/json',
58
+ ...options.headers
59
+ };
60
+ return fetch(url, { ...options, headers });
61
+ }
62
+ async function listCalendars(accessToken) {
63
+ const url = `${CALENDAR_API_BASE}/users/me/calendarList`;
64
+ const res = await apiFetch(url, accessToken);
65
+ if (!res.ok) {
66
+ throw new Error(`Failed to list calendars: ${res.status} ${res.statusText}`);
67
+ }
68
+ const data = await res.json();
69
+ return data.items || [];
70
+ }
71
+ async function listEvents(accessToken, calendarId = 'primary', maxResults = 10, timeMin, timeMax) {
72
+ const params = new URLSearchParams({
73
+ maxResults: maxResults.toString(),
74
+ singleEvents: 'true',
75
+ orderBy: 'startTime'
76
+ });
77
+ if (timeMin)
78
+ params.set('timeMin', timeMin);
79
+ if (timeMax)
80
+ params.set('timeMax', timeMax);
81
+ if (!timeMin && !timeMax)
82
+ params.set('timeMin', new Date().toISOString());
83
+ const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events?${params}`;
84
+ const res = await apiFetch(url, accessToken);
85
+ if (!res.ok) {
86
+ throw new Error(`Failed to list events: ${res.status} ${res.statusText}`);
87
+ }
88
+ const data = await res.json();
89
+ return data.items || [];
90
+ }
91
+ async function createEvent(accessToken, event, calendarId = 'primary') {
92
+ const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events`;
93
+ const res = await apiFetch(url, accessToken, {
94
+ method: 'POST',
95
+ body: JSON.stringify(event)
96
+ });
97
+ if (!res.ok) {
98
+ const errText = await res.text();
99
+ throw new Error(`Failed to create event: ${res.status} ${errText}`);
100
+ }
101
+ return await res.json();
102
+ }
103
+ async function deleteEvent(accessToken, eventId, calendarId = 'primary') {
104
+ const url = `${CALENDAR_API_BASE}/calendars/${encodeURIComponent(calendarId)}/events/${encodeURIComponent(eventId)}`;
105
+ const res = await apiFetch(url, accessToken, { method: 'DELETE' });
106
+ if (!res.ok) {
107
+ const errText = await res.text();
108
+ throw new Error(`Failed to delete event: ${res.status} ${errText}`);
109
+ }
110
+ }
111
+ async function importIcsFile(filePath, accessToken, calendarId = 'primary') {
112
+ const ICAL = await import('ical.js');
113
+ const result = { imported: 0, errors: [] };
114
+ const icsContent = fs.readFileSync(filePath, 'utf-8');
115
+ try {
116
+ const jcalData = ICAL.default.parse(icsContent);
117
+ const vcalendar = new ICAL.default.Component(jcalData);
118
+ const vevents = vcalendar.getAllSubcomponents('vevent');
119
+ console.log(`Found ${vevents.length} event(s)\n`);
120
+ for (const vevent of vevents) {
121
+ try {
122
+ const event = new ICAL.default.Event(vevent);
123
+ const googleEvent = {
124
+ summary: event.summary || 'Untitled Event',
125
+ description: event.description || undefined,
126
+ location: event.location || undefined,
127
+ start: {},
128
+ end: {}
129
+ };
130
+ const startDate = event.startDate;
131
+ if (startDate) {
132
+ if (startDate.isDate) {
133
+ googleEvent.start.date = startDate.toJSDate().toISOString().split('T')[0];
134
+ }
135
+ else {
136
+ googleEvent.start.dateTime = startDate.toJSDate().toISOString();
137
+ googleEvent.start.timeZone = startDate.zone?.tzid || Intl.DateTimeFormat().resolvedOptions().timeZone;
138
+ }
139
+ }
140
+ const endDate = event.endDate;
141
+ if (endDate) {
142
+ if (endDate.isDate) {
143
+ googleEvent.end.date = endDate.toJSDate().toISOString().split('T')[0];
144
+ }
145
+ else {
146
+ googleEvent.end.dateTime = endDate.toJSDate().toISOString();
147
+ googleEvent.end.timeZone = endDate.zone?.tzid || Intl.DateTimeFormat().resolvedOptions().timeZone;
148
+ }
149
+ }
150
+ const attendees = vevent.getAllProperties('attendee');
151
+ if (attendees.length > 0) {
152
+ googleEvent.attendees = attendees.map(att => {
153
+ const emailValue = att.getFirstValue();
154
+ const email = (typeof emailValue === 'string' ? emailValue.replace('mailto:', '') : emailValue?.toString() || '');
155
+ const cn = att.getParameter('cn');
156
+ const displayName = Array.isArray(cn) ? cn[0] : cn;
157
+ return { email, displayName: displayName || undefined };
158
+ });
159
+ }
160
+ const rrule = vevent.getFirstPropertyValue('rrule');
161
+ if (rrule) {
162
+ googleEvent.recurrence = [`RRULE:${rrule.toString()}`];
163
+ }
164
+ await createEvent(accessToken, googleEvent, calendarId);
165
+ console.log(` + ${googleEvent.summary}`);
166
+ result.imported++;
167
+ }
168
+ catch (e) {
169
+ const summary = vevent.getFirstPropertyValue('summary') || 'unknown';
170
+ result.errors.push(`${summary}: ${e.message}`);
171
+ console.error(` ! Failed: ${summary}`);
172
+ }
173
+ }
174
+ }
175
+ catch (e) {
176
+ result.errors.push(`Parse error: ${e.message}`);
177
+ }
178
+ return result;
179
+ }
180
+ function showUsage() {
181
+ console.log(`
182
+ gcal - Google Calendar CLI
183
+
184
+ Usage:
185
+ gcal <file.ics> Import ICS file (file association)
186
+ gcal <command> [options] Run command
187
+
188
+ Commands:
189
+ list [n] List upcoming n events (default: 10)
190
+ past [n] List past n events (default: 10)
191
+ add <title> <when> [duration] Add event
192
+ del|delete <id> [id2...] Delete event(s) by ID (prefix match)
193
+ import <file.ics> Import events from ICS file
194
+ calendars List available calendars
195
+ help Show this help
196
+
197
+ Options:
198
+ -u, -user <email> Google account (one-time)
199
+ -defaultUser <email> Set default user for future use
200
+ -c, -calendar <id> Calendar ID (default: primary)
201
+ -n <count> Number of events to list
202
+ -r, -reminder <time> Reminder before event (10, 30m, 1h, 1d)
203
+ -v, -verbose Show event IDs and links
204
+
205
+ Examples:
206
+ gcal meeting.ics Import ICS file
207
+ gcal list List next 10 events
208
+ gcal add "Dentist" "Friday 3pm" "1h"
209
+ gcal add "Lunch" "1/14/2026 12:00" "1h"
210
+ gcal add "Meeting" "tomorrow 10:00"
211
+ gcal add "Appointment" "jan 15 2pm" -r 1h
212
+ gcal -defaultUser bob@gmail.com Set default user
213
+
214
+ File Association (Windows):
215
+ assoc .ics=icsfile
216
+ ftype icsfile=gcal "%1"
217
+ `);
218
+ }
219
+ /** Parse reminder string: number (minutes), or suffix m/h/d */
220
+ function parseReminder(val) {
221
+ const match = val.match(/^(\d+)(m|h|d)?$/i);
222
+ if (!match)
223
+ return -1;
224
+ const num = parseInt(match[1]);
225
+ const unit = (match[2] || 'm').toLowerCase();
226
+ switch (unit) {
227
+ case 'h': return num * 60;
228
+ case 'd': return num * 60 * 24;
229
+ default: return num;
230
+ }
231
+ }
232
+ function parseArgs(argv) {
233
+ const result = {
234
+ command: '',
235
+ args: [],
236
+ user: '',
237
+ defaultUser: '',
238
+ calendar: 'primary',
239
+ count: 10,
240
+ help: false,
241
+ verbose: false,
242
+ icsFile: '',
243
+ reminder: 60
244
+ };
245
+ const unknown = [];
246
+ let i = 0;
247
+ while (i < argv.length) {
248
+ const arg = argv[i];
249
+ switch (arg) {
250
+ case '-u':
251
+ case '-user':
252
+ case '--user':
253
+ result.user = argv[++i] || '';
254
+ break;
255
+ case '-defaultUser':
256
+ case '--defaultUser':
257
+ result.defaultUser = argv[++i] || '';
258
+ break;
259
+ case '-c':
260
+ case '-calendar':
261
+ case '--calendar':
262
+ result.calendar = argv[++i] || 'primary';
263
+ break;
264
+ case '-n':
265
+ result.count = parseInt(argv[++i]) || 10;
266
+ break;
267
+ case '-v':
268
+ case '-verbose':
269
+ case '--verbose':
270
+ result.verbose = true;
271
+ break;
272
+ case '-r':
273
+ case '-reminder':
274
+ case '--reminder':
275
+ result.reminder = parseReminder(argv[++i] || '');
276
+ break;
277
+ case '-h':
278
+ case '-help':
279
+ case '--help':
280
+ case 'help':
281
+ result.help = true;
282
+ break;
283
+ default:
284
+ if (arg.startsWith('-')) {
285
+ unknown.push(arg);
286
+ }
287
+ else if (!result.command) {
288
+ // Check if it's an .ics file
289
+ if (arg.toLowerCase().endsWith('.ics')) {
290
+ result.icsFile = arg;
291
+ result.command = 'import';
292
+ }
293
+ else {
294
+ result.command = arg;
295
+ }
296
+ }
297
+ else {
298
+ result.args.push(arg);
299
+ }
300
+ }
301
+ i++;
302
+ }
303
+ if (unknown.length > 0) {
304
+ console.error(`Unknown options: ${unknown.join(', ')}`);
305
+ process.exit(1);
306
+ }
307
+ return result;
308
+ }
309
+ function resolveUser(cliUser, setAsDefault = false) {
310
+ if (cliUser) {
311
+ const normalized = normalizeUser(cliUser);
312
+ if (setAsDefault) {
313
+ const config = loadConfig();
314
+ config.lastUser = normalized;
315
+ saveConfig(config);
316
+ }
317
+ return normalized;
318
+ }
319
+ const config = loadConfig();
320
+ if (config.lastUser) {
321
+ return config.lastUser;
322
+ }
323
+ return '';
324
+ }
325
+ async function main() {
326
+ setupAbortHandler();
327
+ const parsed = parseArgs(process.argv.slice(2));
328
+ // Handle -defaultUser first (can be combined with other commands)
329
+ if (parsed.defaultUser) {
330
+ const normalized = normalizeUser(parsed.defaultUser);
331
+ const config = loadConfig();
332
+ config.lastUser = normalized;
333
+ saveConfig(config);
334
+ console.log(`Default user set to: ${normalized}`);
335
+ // If no command, exit after setting default
336
+ if (!parsed.command && !parsed.icsFile) {
337
+ process.exit(0);
338
+ }
339
+ }
340
+ if (parsed.help) {
341
+ showUsage();
342
+ process.exit(0);
343
+ }
344
+ if (!parsed.command) {
345
+ showUsage();
346
+ process.exit(1);
347
+ }
348
+ // Resolve user
349
+ const user = resolveUser(parsed.user, false);
350
+ if (!user) {
351
+ console.error('No user configured.');
352
+ console.error('Use -u <email> for one-time, or -defaultUser <email> to set default.');
353
+ process.exit(1);
354
+ }
355
+ console.log(`${ts()} User: ${user}`);
356
+ switch (parsed.command) {
357
+ case 'import': {
358
+ const filePath = parsed.icsFile || parsed.args[0];
359
+ if (!filePath) {
360
+ console.error('Usage: gcal import <file.ics> or gcal <file.ics>');
361
+ process.exit(1);
362
+ }
363
+ const resolvedPath = path.resolve(filePath);
364
+ if (!fs.existsSync(resolvedPath)) {
365
+ console.error(`File not found: ${resolvedPath}`);
366
+ process.exit(1);
367
+ }
368
+ console.log(`Importing: ${path.basename(resolvedPath)}`);
369
+ console.log(`Calendar: ${parsed.calendar}\n`);
370
+ const token = await getAccessToken(user, true);
371
+ const result = await importIcsFile(resolvedPath, token, parsed.calendar);
372
+ console.log(`\n${result.imported} event(s) imported`);
373
+ if (result.errors.length > 0) {
374
+ console.log(`${result.errors.length} error(s)`);
375
+ }
376
+ break;
377
+ }
378
+ case 'list': {
379
+ const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
380
+ const token = await getAccessToken(user, false);
381
+ const events = await listEvents(token, parsed.calendar, count);
382
+ if (events.length === 0) {
383
+ console.log('No upcoming events found.');
384
+ }
385
+ else {
386
+ console.log(`\nUpcoming events (${events.length}):\n`);
387
+ // Build table data
388
+ const rows = [];
389
+ for (const event of events) {
390
+ const shortId = (event.id || '').slice(0, 8);
391
+ const start = event.start ? formatDateTime(event.start) : '?';
392
+ const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
393
+ const summary = event.summary || '(no title)';
394
+ const loc = event.location || '';
395
+ if (parsed.verbose) {
396
+ rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
397
+ }
398
+ else {
399
+ rows.push([shortId, start, duration, summary, loc]);
400
+ }
401
+ }
402
+ // Calculate column widths
403
+ const headers = parsed.verbose
404
+ ? ['ID', 'When', 'Dur', 'Event', 'Location', 'Link']
405
+ : ['ID', 'When', 'Dur', 'Event', 'Location'];
406
+ const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map(r => (r[i] || '').length)));
407
+ // Print header
408
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
409
+ console.log(headerLine);
410
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
411
+ // Print rows
412
+ for (const row of rows) {
413
+ const line = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');
414
+ console.log(line);
415
+ }
416
+ }
417
+ break;
418
+ }
419
+ case 'past': {
420
+ const count = parsed.args[0] ? parseInt(parsed.args[0]) : parsed.count;
421
+ const token = await getAccessToken(user, false);
422
+ // Get events before now, then reverse to show most recent first
423
+ const now = new Date();
424
+ const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
425
+ const events = await listEvents(token, parsed.calendar, count, thirtyDaysAgo.toISOString(), now.toISOString());
426
+ events.reverse(); // Most recent first
427
+ if (events.length === 0) {
428
+ console.log('No past events found in last 30 days.');
429
+ }
430
+ else {
431
+ console.log(`\nPast events (${events.length}):\n`);
432
+ // Build table data (same format as list)
433
+ const rows = [];
434
+ for (const event of events) {
435
+ const shortId = (event.id || '').slice(0, 8);
436
+ const start = event.start ? formatDateTime(event.start) : '?';
437
+ const duration = (event.start && event.end) ? formatDuration(event.start, event.end) : '';
438
+ const summary = event.summary || '(no title)';
439
+ const loc = event.location || '';
440
+ if (parsed.verbose) {
441
+ rows.push([shortId, start, duration, summary, loc, event.htmlLink || '']);
442
+ }
443
+ else {
444
+ rows.push([shortId, start, duration, summary, loc]);
445
+ }
446
+ }
447
+ // Calculate column widths
448
+ const headers = parsed.verbose
449
+ ? ['ID', 'When', 'Dur', 'Event', 'Location', 'Link']
450
+ : ['ID', 'When', 'Dur', 'Event', 'Location'];
451
+ const colWidths = headers.map((h, i) => Math.max(h.length, ...rows.map(r => (r[i] || '').length)));
452
+ // Print header
453
+ const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');
454
+ console.log(headerLine);
455
+ console.log(colWidths.map(w => '-'.repeat(w)).join(' '));
456
+ // Print rows
457
+ for (const row of rows) {
458
+ const line = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');
459
+ console.log(line);
460
+ }
461
+ }
462
+ break;
463
+ }
464
+ case 'add': {
465
+ if (parsed.args.length < 2) {
466
+ console.error('Usage: gcal add <title> <when> [duration]');
467
+ console.error('Example: gcal add "Meeting" "tomorrow 2pm" "1h"');
468
+ process.exit(1);
469
+ }
470
+ const [title, when, duration = '1h'] = parsed.args;
471
+ const startTime = parseDateTime(when);
472
+ const durationMins = parseDuration(duration);
473
+ const endTime = new Date(startTime.getTime() + durationMins * 60 * 1000);
474
+ const event = {
475
+ summary: title,
476
+ start: {
477
+ dateTime: startTime.toISOString(),
478
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
479
+ },
480
+ end: {
481
+ dateTime: endTime.toISOString(),
482
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
483
+ }
484
+ };
485
+ if (parsed.reminder >= 0) {
486
+ event.reminders = {
487
+ useDefault: false,
488
+ overrides: [{ method: 'popup', minutes: parsed.reminder }]
489
+ };
490
+ }
491
+ const token = await getAccessToken(user, true);
492
+ const created = await createEvent(token, event, parsed.calendar);
493
+ console.log(`\nEvent created: ${created.summary}`);
494
+ console.log(` When: ${formatDateTime(created.start)} - ${formatDateTime(created.end)}`);
495
+ if (parsed.reminder >= 0) {
496
+ const mins = parsed.reminder;
497
+ const reminderStr = mins >= 1440 ? `${mins / 1440}d` : mins >= 60 ? `${mins / 60}h` : `${mins}m`;
498
+ console.log(` Reminder: ${reminderStr} before`);
499
+ }
500
+ if (created.htmlLink) {
501
+ console.log(` Link: ${created.htmlLink}`);
502
+ }
503
+ break;
504
+ }
505
+ case 'del':
506
+ case 'delete': {
507
+ if (parsed.args.length === 0) {
508
+ console.error('Usage: gcal delete <id> [id2] [id3] ...');
509
+ console.error('Use "gcal list" to see event IDs');
510
+ process.exit(1);
511
+ }
512
+ const token = await getAccessToken(user, true);
513
+ const events = await listEvents(token, parsed.calendar, 50);
514
+ for (const idPrefix of parsed.args) {
515
+ const matches = events.filter(e => e.id?.startsWith(idPrefix));
516
+ if (matches.length === 0) {
517
+ console.error(`${idPrefix}: not found`);
518
+ continue;
519
+ }
520
+ if (matches.length > 1) {
521
+ console.error(`${idPrefix}: ambiguous (${matches.length} matches)`);
522
+ for (const e of matches) {
523
+ console.error(` ${e.id?.slice(0, 8)} - ${e.summary}`);
524
+ }
525
+ continue;
526
+ }
527
+ const event = matches[0];
528
+ await deleteEvent(token, event.id, parsed.calendar);
529
+ console.log(`Deleted: ${event.summary}`);
530
+ }
531
+ break;
532
+ }
533
+ case 'calendars': {
534
+ const token = await getAccessToken(user, false);
535
+ const calendars = await listCalendars(token);
536
+ console.log(`\nCalendars (${calendars.length}):\n`);
537
+ for (const cal of calendars) {
538
+ const primary = cal.primary ? ' (primary)' : '';
539
+ const role = cal.accessRole ? ` [${cal.accessRole}]` : '';
540
+ console.log(` ${cal.summary || cal.id}${primary}${role}`);
541
+ console.log(` ID: ${cal.id}`);
542
+ }
543
+ break;
544
+ }
545
+ default:
546
+ console.error(`Unknown command: ${parsed.command}`);
547
+ showUsage();
548
+ process.exit(1);
549
+ }
550
+ }
551
+ if (import.meta.main) {
552
+ main().catch(e => {
553
+ console.error(`Error: ${e.message}`);
554
+ process.exit(1);
555
+ });
556
+ }
557
+ //# sourceMappingURL=gcal.js.map
package/gcal.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcal.js","sourceRoot":"","sources":["gcal.ts"],"names":[],"mappings":"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"}
package/gcal.ts CHANGED
@@ -11,11 +11,11 @@
11
11
  import fs from 'fs';
12
12
  import path from 'path';
13
13
  import { authenticateOAuth } from '@bobfrankston/oauthsupport';
14
- import type { GoogleEvent, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.ts';
14
+ import type { GoogleEvent, EventsListResponse, CalendarListEntry, CalendarListResponse } from './glib/types.js';
15
15
  import {
16
16
  CREDENTIALS_FILE, loadConfig, saveConfig, getUserPaths,
17
17
  ensureUserDir, formatDateTime, formatDuration, parseDuration, parseDateTime, ts, normalizeUser
18
- } from './glib/gutils.ts';
18
+ } from './glib/gutils.js';
19
19
 
20
20
  const CALENDAR_API_BASE = 'https://www.googleapis.com/calendar/v3';
21
21
  const CALENDAR_SCOPE_READ = 'https://www.googleapis.com/auth/calendar.readonly';
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Shared utilities for gcal tools
3
+ */
4
+ export interface GcalConfig {
5
+ lastUser?: string;
6
+ defaultCalendar?: string;
7
+ }
8
+ export interface UserPaths {
9
+ userDir: string;
10
+ eventsDir: string;
11
+ tokenFile: string;
12
+ tokenWriteFile: string;
13
+ syncTokenFile: string;
14
+ configFile: string;
15
+ }
16
+ export declare const APP_DIR: string;
17
+ /** Get the app directory (%APPDATA%\gcal or ~/.config/gcal) */
18
+ export declare function getAppDir(): string;
19
+ /** Get the data directory (app directory/data, or local data/ symlink for dev) */
20
+ export declare function getDataDir(): string;
21
+ export declare const DATA_DIR: string;
22
+ export declare const CONFIG_FILE: string;
23
+ /** Use credentials from gcards (shared OAuth app) */
24
+ export declare const CREDENTIALS_FILE: string;
25
+ export declare function loadConfig(): GcalConfig;
26
+ export declare function saveConfig(config: GcalConfig): void;
27
+ export declare function getUserPaths(user: string): UserPaths;
28
+ export declare function ensureUserDir(user: string): void;
29
+ export declare function normalizeUser(user: string): string;
30
+ export declare function getAllUsers(): string[];
31
+ export declare function matchUsers(pattern: string): string[];
32
+ export declare function resolveUser(cliUser: string, setAsDefault?: boolean): string;
33
+ /** Format datetime for display - yyyy-mm-dd HH:mm format */
34
+ export declare function formatDateTime(dt: {
35
+ date?: string;
36
+ dateTime?: string;
37
+ timeZone?: string;
38
+ }): string;
39
+ /** Format duration in hours (e.g., "1.5 hrs", "2 hrs", "30 min") */
40
+ export declare function formatDuration(start: {
41
+ date?: string;
42
+ dateTime?: string;
43
+ }, end: {
44
+ date?: string;
45
+ dateTime?: string;
46
+ }): string;
47
+ /** Parse duration string like "1h", "30m", "1h30m" to minutes */
48
+ export declare function parseDuration(duration: string): number;
49
+ /** Parse natural date/time strings */
50
+ export declare function parseDateTime(input: string): Date;
51
+ /** Timestamp for logging */
52
+ export declare function ts(): string;
53
+ //# sourceMappingURL=gutils.d.ts.map
@@ -0,0 +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,CAqHjD;AAED,4BAA4B;AAC5B,wBAAgB,EAAE,IAAI,MAAM,CAG3B"}
package/glib/gutils.js ADDED
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Shared utilities for gcal tools
3
+ */
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import os from 'os';
7
+ export const APP_DIR = path.dirname(import.meta.dirname); // Parent of glib/
8
+ /** Get the app directory (%APPDATA%\gcal or ~/.config/gcal) */
9
+ export function getAppDir() {
10
+ if (process.platform === 'win32') {
11
+ return path.join(process.env.APPDATA || os.homedir(), 'gcal');
12
+ }
13
+ return path.join(os.homedir(), '.config', 'gcal');
14
+ }
15
+ /** Get the data directory (app directory/data, or local data/ symlink for dev) */
16
+ export function getDataDir() {
17
+ const localData = path.join(APP_DIR, 'data');
18
+ if (fs.existsSync(localData)) {
19
+ return localData;
20
+ }
21
+ return path.join(getAppDir(), 'data');
22
+ }
23
+ export const DATA_DIR = getDataDir();
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');
27
+ export function loadConfig() {
28
+ if (fs.existsSync(CONFIG_FILE)) {
29
+ try {
30
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
31
+ }
32
+ catch (e) {
33
+ throw new Error(`Failed to parse ${CONFIG_FILE}: ${e.message}`);
34
+ }
35
+ }
36
+ return {};
37
+ }
38
+ export function saveConfig(config) {
39
+ const appDir = getAppDir();
40
+ if (!fs.existsSync(appDir)) {
41
+ fs.mkdirSync(appDir, { recursive: true });
42
+ }
43
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
44
+ }
45
+ export function getUserPaths(user) {
46
+ const userDir = path.join(DATA_DIR, user);
47
+ return {
48
+ userDir,
49
+ eventsDir: path.join(userDir, 'events'),
50
+ tokenFile: path.join(userDir, 'token.json'),
51
+ tokenWriteFile: path.join(userDir, 'token-write.json'),
52
+ syncTokenFile: path.join(userDir, 'sync-token.json'),
53
+ configFile: path.join(userDir, 'config.json')
54
+ };
55
+ }
56
+ export function ensureUserDir(user) {
57
+ const paths = getUserPaths(user);
58
+ if (!fs.existsSync(paths.userDir)) {
59
+ fs.mkdirSync(paths.userDir, { recursive: true });
60
+ }
61
+ if (!fs.existsSync(paths.eventsDir)) {
62
+ fs.mkdirSync(paths.eventsDir, { recursive: true });
63
+ }
64
+ }
65
+ export function normalizeUser(user) {
66
+ return user.toLowerCase().split(/[+@]/)[0].replace(/\./g, '');
67
+ }
68
+ export function getAllUsers() {
69
+ if (!fs.existsSync(DATA_DIR)) {
70
+ return [];
71
+ }
72
+ return fs.readdirSync(DATA_DIR)
73
+ .filter(f => {
74
+ const fullPath = path.join(DATA_DIR, f);
75
+ return fs.statSync(fullPath).isDirectory() && !f.startsWith('.');
76
+ });
77
+ }
78
+ export function matchUsers(pattern) {
79
+ const allUsers = getAllUsers();
80
+ const normalizedPattern = pattern.toLowerCase();
81
+ return allUsers.filter(user => user.toLowerCase().includes(normalizedPattern));
82
+ }
83
+ export function resolveUser(cliUser, setAsDefault = false) {
84
+ if (cliUser && cliUser !== 'default') {
85
+ const normalized = normalizeUser(cliUser);
86
+ const matches = matchUsers(normalized);
87
+ if (matches.length === 1) {
88
+ const matched = matches[0];
89
+ console.log(`Matched '${cliUser}' to existing user: ${matched}`);
90
+ if (setAsDefault) {
91
+ const config = loadConfig();
92
+ config.lastUser = matched;
93
+ saveConfig(config);
94
+ }
95
+ return matched;
96
+ }
97
+ else if (matches.length > 1) {
98
+ console.error(`Ambiguous user '${cliUser}' matches multiple users: ${matches.join(', ')}`);
99
+ console.error('Please be more specific.');
100
+ process.exit(1);
101
+ }
102
+ if (!cliUser.includes('@')) {
103
+ console.error(`New user '${cliUser}' must be specified as an email address (e.g., ${cliUser}@gmail.com)`);
104
+ process.exit(1);
105
+ }
106
+ if (setAsDefault) {
107
+ const config = loadConfig();
108
+ config.lastUser = normalized;
109
+ saveConfig(config);
110
+ }
111
+ return normalized;
112
+ }
113
+ const config = loadConfig();
114
+ if (config.lastUser) {
115
+ return config.lastUser;
116
+ }
117
+ const allUsers = getAllUsers();
118
+ if (allUsers.length === 1) {
119
+ const onlyUser = allUsers[0];
120
+ console.log(`Auto-selected only user: ${onlyUser}`);
121
+ config.lastUser = onlyUser;
122
+ saveConfig(config);
123
+ return onlyUser;
124
+ }
125
+ if (allUsers.length > 1) {
126
+ console.error(`Multiple users exist: ${allUsers.join(', ')}`);
127
+ console.error('Use -u <name> to select one.');
128
+ }
129
+ else {
130
+ console.error('No user specified. Use -u <email> on first run (e.g., your Gmail address).');
131
+ }
132
+ process.exit(1);
133
+ }
134
+ /** Format datetime for display - yyyy-mm-dd HH:mm format */
135
+ export function formatDateTime(dt) {
136
+ if (dt.date) {
137
+ return dt.date; // Already yyyy-mm-dd
138
+ }
139
+ if (dt.dateTime) {
140
+ const d = new Date(dt.dateTime);
141
+ const yyyy = d.getFullYear();
142
+ const mm = String(d.getMonth() + 1).padStart(2, '0');
143
+ const dd = String(d.getDate()).padStart(2, '0');
144
+ const hh = String(d.getHours()).padStart(2, '0');
145
+ const min = String(d.getMinutes()).padStart(2, '0');
146
+ return `${yyyy}-${mm}-${dd} ${hh}:${min}`;
147
+ }
148
+ return '(no time)';
149
+ }
150
+ /** Format duration in hours (e.g., "1.5 hrs", "2 hrs", "30 min") */
151
+ export function formatDuration(start, end) {
152
+ if (start.date || end.date) {
153
+ return ''; // All-day event
154
+ }
155
+ if (!start.dateTime || !end.dateTime) {
156
+ return '';
157
+ }
158
+ const startMs = new Date(start.dateTime).getTime();
159
+ const endMs = new Date(end.dateTime).getTime();
160
+ const mins = (endMs - startMs) / 60000;
161
+ if (mins < 60) {
162
+ return `${mins} min`;
163
+ }
164
+ const hrs = mins / 60;
165
+ if (hrs === Math.floor(hrs)) {
166
+ return `${hrs} hr${hrs !== 1 ? 's' : ''}`;
167
+ }
168
+ return `${hrs.toFixed(1)} hrs`;
169
+ }
170
+ /** Parse duration string like "1h", "30m", "1h30m" to minutes */
171
+ export function parseDuration(duration) {
172
+ let minutes = 0;
173
+ const hourMatch = duration.match(/(\d+)h/i);
174
+ const minMatch = duration.match(/(\d+)m/i);
175
+ if (hourMatch)
176
+ minutes += parseInt(hourMatch[1]) * 60;
177
+ if (minMatch)
178
+ minutes += parseInt(minMatch[1]);
179
+ if (!hourMatch && !minMatch) {
180
+ minutes = parseInt(duration) || 60; // Default 60 minutes
181
+ }
182
+ return minutes;
183
+ }
184
+ /** Parse natural date/time strings */
185
+ export function parseDateTime(input) {
186
+ const now = new Date();
187
+ const lower = input.toLowerCase().trim();
188
+ // Handle relative dates
189
+ if (lower === 'today') {
190
+ return now;
191
+ }
192
+ if (lower === 'tomorrow') {
193
+ const d = new Date(now);
194
+ d.setDate(d.getDate() + 1);
195
+ return d;
196
+ }
197
+ // Handle "tomorrow 2pm" or "tomorrow at 2pm"
198
+ const relMatch = lower.match(/^(today|tomorrow)\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?$/i);
199
+ if (relMatch) {
200
+ const [, rel, hour, min, ampm] = relMatch;
201
+ const d = new Date(now);
202
+ if (rel === 'tomorrow')
203
+ d.setDate(d.getDate() + 1);
204
+ let h = parseInt(hour);
205
+ if (ampm?.toLowerCase() === 'pm' && h < 12)
206
+ h += 12;
207
+ if (ampm?.toLowerCase() === 'am' && h === 12)
208
+ h = 0;
209
+ d.setHours(h, parseInt(min || '0'), 0, 0);
210
+ return d;
211
+ }
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) {
216
+ const [, next, day, hour, min, ampm] = dayMatch;
217
+ const targetDay = weekdays.indexOf(day.toLowerCase());
218
+ const d = new Date(now);
219
+ let daysUntil = targetDay - d.getDay();
220
+ if (daysUntil <= 0 || next)
221
+ daysUntil += 7;
222
+ d.setDate(d.getDate() + daysUntil);
223
+ let h = parseInt(hour);
224
+ if (ampm?.toLowerCase() === 'pm' && h < 12)
225
+ h += 12;
226
+ if (ampm?.toLowerCase() === 'am' && h === 12)
227
+ h = 0;
228
+ d.setHours(h, parseInt(min || '0'), 0, 0);
229
+ return d;
230
+ }
231
+ // Handle month names: "jan 15", "jan 15 2026", "jan 15 3pm", "january 15 2026 3pm"
232
+ const months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
233
+ const monthMatch = lower.match(/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*\s+(\d{1,2})(?:\s+(\d{4}))?(?:\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)?)?$/i);
234
+ if (monthMatch) {
235
+ const [, month, day, year, hour, min, ampm] = monthMatch;
236
+ const monthIndex = months.findIndex(m => month.toLowerCase().startsWith(m));
237
+ const d = new Date(parseInt(year || now.getFullYear().toString()), monthIndex, parseInt(day));
238
+ if (hour) {
239
+ let h = parseInt(hour);
240
+ if (ampm?.toLowerCase() === 'pm' && h < 12)
241
+ h += 12;
242
+ if (ampm?.toLowerCase() === 'am' && h === 12)
243
+ h = 0;
244
+ d.setHours(h, parseInt(min || '0'), 0, 0);
245
+ }
246
+ else {
247
+ d.setHours(0, 0, 0, 0);
248
+ }
249
+ if (!isNaN(d.getTime())) {
250
+ return d;
251
+ }
252
+ }
253
+ // Handle explicit date/time formats: "MM/DD/YYYY HH:mm" or "YYYY-MM-DD HH:mm"
254
+ const dateTimeMatch = input.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})\s+(\d{1,2}):(\d{2})$/);
255
+ if (dateTimeMatch) {
256
+ const [, month, day, year, hour, min] = dateTimeMatch;
257
+ const d = new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(min));
258
+ if (!isNaN(d.getTime())) {
259
+ return d;
260
+ }
261
+ }
262
+ const isoDateTimeMatch = input.match(/^(\d{4})-(\d{1,2})-(\d{1,2})\s+(\d{1,2}):(\d{2})$/);
263
+ if (isoDateTimeMatch) {
264
+ const [, year, month, day, hour, min] = isoDateTimeMatch;
265
+ const d = new Date(parseInt(year), parseInt(month) - 1, parseInt(day), parseInt(hour), parseInt(min));
266
+ if (!isNaN(d.getTime())) {
267
+ return d;
268
+ }
269
+ }
270
+ // Handle time only (HH:mm) - assume today, or tomorrow if time already passed
271
+ const timeMatch = input.match(/^(\d{1,2}):(\d{2})$/);
272
+ if (timeMatch) {
273
+ const [, hour, min] = timeMatch;
274
+ const d = new Date(now);
275
+ d.setHours(parseInt(hour), parseInt(min), 0, 0);
276
+ if (d <= now) {
277
+ d.setDate(d.getDate() + 1); // Time passed, use tomorrow
278
+ }
279
+ return d;
280
+ }
281
+ // Handle time with am/pm (2pm, 10am, 2:30pm) - assume today, or tomorrow if time already passed
282
+ const ampmMatch = lower.match(/^(\d{1,2})(?::(\d{2}))?\s*(am|pm)$/);
283
+ if (ampmMatch) {
284
+ const [, hour, min, ampm] = ampmMatch;
285
+ let h = parseInt(hour);
286
+ if (ampm === 'pm' && h < 12)
287
+ h += 12;
288
+ if (ampm === 'am' && h === 12)
289
+ h = 0;
290
+ const d = new Date(now);
291
+ d.setHours(h, parseInt(min || '0'), 0, 0);
292
+ if (d <= now) {
293
+ d.setDate(d.getDate() + 1); // Time passed, use tomorrow
294
+ }
295
+ return d;
296
+ }
297
+ // Try native Date parsing
298
+ const parsed = new Date(input);
299
+ if (!isNaN(parsed.getTime())) {
300
+ return parsed;
301
+ }
302
+ throw new Error(`Cannot parse date/time: ${input}`);
303
+ }
304
+ /** Timestamp for logging */
305
+ export function ts() {
306
+ const now = new Date();
307
+ return `[${now.toTimeString().slice(0, 8)}]`;
308
+ }
309
+ //# sourceMappingURL=gutils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gutils.js","sourceRoot":"","sources":["gutils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Google Calendar API types
3
+ */
4
+ /** Google Calendar Event */
5
+ export interface GoogleEvent {
6
+ kind?: string;
7
+ etag?: string;
8
+ id?: string;
9
+ status?: string;
10
+ htmlLink?: string;
11
+ created?: string;
12
+ updated?: string;
13
+ summary?: string;
14
+ description?: string;
15
+ location?: string;
16
+ colorId?: string;
17
+ creator?: {
18
+ id?: string;
19
+ email?: string;
20
+ displayName?: string;
21
+ self?: boolean;
22
+ };
23
+ organizer?: {
24
+ id?: string;
25
+ email?: string;
26
+ displayName?: string;
27
+ self?: boolean;
28
+ };
29
+ start?: EventDateTime;
30
+ end?: EventDateTime;
31
+ endTimeUnspecified?: boolean;
32
+ recurrence?: string[];
33
+ recurringEventId?: string;
34
+ originalStartTime?: EventDateTime;
35
+ transparency?: string;
36
+ visibility?: string;
37
+ iCalUID?: string;
38
+ sequence?: number;
39
+ attendees?: EventAttendee[];
40
+ attendeesOmitted?: boolean;
41
+ hangoutLink?: string;
42
+ conferenceData?: ConferenceData;
43
+ reminders?: {
44
+ useDefault?: boolean;
45
+ overrides?: EventReminder[];
46
+ };
47
+ source?: {
48
+ url?: string;
49
+ title?: string;
50
+ };
51
+ attachments?: EventAttachment[];
52
+ eventType?: string;
53
+ }
54
+ export interface EventDateTime {
55
+ date?: string; /** Date in YYYY-MM-DD format (all-day event) */
56
+ dateTime?: string; /** RFC3339 timestamp with timezone */
57
+ timeZone?: string; /** IANA timezone */
58
+ }
59
+ export interface EventAttendee {
60
+ id?: string;
61
+ email?: string;
62
+ displayName?: string;
63
+ organizer?: boolean;
64
+ self?: boolean;
65
+ resource?: boolean;
66
+ optional?: boolean;
67
+ responseStatus?: 'needsAction' | 'declined' | 'tentative' | 'accepted';
68
+ comment?: string;
69
+ additionalGuests?: number;
70
+ }
71
+ export interface EventReminder {
72
+ method?: 'email' | 'popup';
73
+ minutes?: number;
74
+ }
75
+ export interface EventAttachment {
76
+ fileUrl?: string;
77
+ title?: string;
78
+ mimeType?: string;
79
+ iconLink?: string;
80
+ fileId?: string;
81
+ }
82
+ export interface ConferenceData {
83
+ createRequest?: {
84
+ requestId?: string;
85
+ conferenceSolutionKey?: {
86
+ type?: string;
87
+ };
88
+ status?: {
89
+ statusCode?: string;
90
+ };
91
+ };
92
+ entryPoints?: {
93
+ entryPointType?: string;
94
+ uri?: string;
95
+ label?: string;
96
+ pin?: string;
97
+ accessCode?: string;
98
+ meetingCode?: string;
99
+ passcode?: string;
100
+ password?: string;
101
+ }[];
102
+ conferenceSolution?: {
103
+ key?: {
104
+ type?: string;
105
+ };
106
+ name?: string;
107
+ iconUri?: string;
108
+ };
109
+ conferenceId?: string;
110
+ signature?: string;
111
+ notes?: string;
112
+ }
113
+ /** Google Calendar list entry */
114
+ export interface CalendarListEntry {
115
+ kind?: string;
116
+ etag?: string;
117
+ id?: string;
118
+ summary?: string;
119
+ description?: string;
120
+ location?: string;
121
+ timeZone?: string;
122
+ summaryOverride?: string;
123
+ colorId?: string;
124
+ backgroundColor?: string;
125
+ foregroundColor?: string;
126
+ hidden?: boolean;
127
+ selected?: boolean;
128
+ accessRole?: 'freeBusyReader' | 'reader' | 'writer' | 'owner';
129
+ defaultReminders?: EventReminder[];
130
+ notificationSettings?: {
131
+ notifications?: {
132
+ type?: string;
133
+ method?: string;
134
+ }[];
135
+ };
136
+ primary?: boolean;
137
+ deleted?: boolean;
138
+ conferenceProperties?: {
139
+ allowedConferenceSolutionTypes?: string[];
140
+ };
141
+ }
142
+ /** Events list response from API */
143
+ export interface EventsListResponse {
144
+ kind?: string;
145
+ etag?: string;
146
+ summary?: string;
147
+ description?: string;
148
+ updated?: string;
149
+ timeZone?: string;
150
+ accessRole?: string;
151
+ defaultReminders?: EventReminder[];
152
+ nextPageToken?: string;
153
+ nextSyncToken?: string;
154
+ items?: GoogleEvent[];
155
+ }
156
+ /** Calendar list response from API */
157
+ export interface CalendarListResponse {
158
+ kind?: string;
159
+ etag?: string;
160
+ nextPageToken?: string;
161
+ nextSyncToken?: string;
162
+ items?: CalendarListEntry[];
163
+ }
164
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"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"}
package/glib/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Google Calendar API types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,15 +1,23 @@
1
1
  {
2
2
  "name": "@bobfrankston/gcal",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "Google Calendar CLI tool with ICS import support",
5
5
  "type": "module",
6
- "main": "gcal.ts",
6
+ "main": "gcal.js",
7
7
  "bin": {
8
- "gcal": "gcal.ts"
8
+ "gcal": "gcal.js"
9
9
  },
10
10
  "files": [
11
11
  "gcal.ts",
12
+ "gcal.js",
13
+ "gcal.js.map",
14
+ "gcal.d.ts",
15
+ "gcal.d.ts.map",
12
16
  "glib/**/*.ts",
17
+ "glib/**/*.js",
18
+ "glib/**/*.js.map",
19
+ "glib/**/*.d.ts",
20
+ "glib/**/*.d.ts.map",
13
21
  "tsconfig.json",
14
22
  "README.md"
15
23
  ],
@@ -18,9 +26,10 @@
18
26
  "url": "git+https://github.com/BobFrankston/gcal.git"
19
27
  },
20
28
  "scripts": {
29
+ "build": "tsc",
21
30
  "check": "tsc --noEmit",
22
31
  "prerelease:local": "git add -A && (git diff-index --quiet HEAD || git commit -m \"Pre-release commit\")",
23
- "preversion": "npm run check && git add -A",
32
+ "preversion": "npm run build && git add -A",
24
33
  "postversion": "git push && git push --tags",
25
34
  "release": "npm run prerelease:local && npm version patch && npm publish --access public",
26
35
  "release:local": "npm run prerelease:local && npm version patch && npm publish --access public --ignore-scripts",
@@ -37,7 +46,7 @@
37
46
  "author": "Bob Frankston",
38
47
  "license": "MIT",
39
48
  "devDependencies": {
40
- "@types/node": "^25.0.9"
49
+ "@types/node": "^25.2.1"
41
50
  },
42
51
  "dependencies": {
43
52
  "@bobfrankston/oauthsupport": "^1.0.7",
package/tsconfig.json CHANGED
@@ -6,11 +6,12 @@
6
6
  "allowSyntheticDefaultImports": true,
7
7
  "esModuleInterop": true,
8
8
  "allowJs": true,
9
- "allowImportingTsExtensions": true,
10
9
  "strict": true,
11
10
  "forceConsistentCasingInFileNames": true,
12
11
  "skipLibCheck": true,
13
- "noEmit": true,
12
+ "declaration": true,
13
+ "declarationMap": true,
14
+ "sourceMap": true,
14
15
  "strictNullChecks": false,
15
16
  "noImplicitAny": true,
16
17
  "noImplicitReturns": false,