gcal-commander
Version:
A command-line interface for Google Calendar operations
103 lines (102 loc) • 4.54 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@oclif/core");
const base_command_1 = require("../../base-command");
const date_formatter_1 = require("../../utils/date-formatter");
const table_formatter_1 = require("../../utils/table-formatter");
class EventsList extends base_command_1.BaseCommand {
static args = {
calendar: core_1.Args.string({
default: 'primary',
description: 'Calendar ID to list events from',
}),
};
static description = 'List upcoming calendar events';
static examples = [
'<%= config.bin %> <%= command.id %>',
'<%= config.bin %> <%= command.id %> my-calendar@gmail.com',
'<%= config.bin %> <%= command.id %> --max-results 20',
'<%= config.bin %> <%= command.id %> --days 7',
];
static flags = {
...base_command_1.BaseCommand.baseFlags,
days: core_1.Flags.integer({
char: 'd',
default: 30,
description: 'Number of days to look ahead',
}),
'max-results': core_1.Flags.integer({
char: 'n',
default: 10,
description: 'Maximum number of events to return',
}),
};
async run() {
const { args, flags } = await this.parse(EventsList);
try {
await this.initI18nService();
this.logStatus(this.t('events.list.authenticating'));
await this.initCalendarService();
// Get configuration values
// Determine calendar to use: explicit CLI arg > config > default 'primary'
const defaultCalendar = await this.configService.get('defaultCalendar');
const calendarId = args.calendar === 'primary' ? defaultCalendar || 'primary' : args.calendar;
// Apply config defaults for other settings
const configMaxResults = (await this.configService.get('events.maxResults')) || 10;
const configDays = (await this.configService.get('events.days')) || 30;
const configFormat = (await this.configService.get('events.format')) || 'table';
const maxResults = flags['max-results'] || configMaxResults;
const days = flags.days || configDays;
const format = this.format === 'table' ? configFormat : this.format;
const timeMin = new Date().toISOString();
const timeMax = new Date(Date.now() + days * 24 * 60 * 60 * 1000).toISOString();
this.logStatus(this.t('events.list.fetching', { calendarId }));
const events = await this.calendarService.listEvents({
calendarId,
maxResults,
timeMax,
timeMin,
});
if (events.length === 0) {
this.logResult(this.t('events.list.noEventsFound'));
return;
}
if (format === 'json' || format === 'pretty-json') {
this.outputJson(events);
}
else {
this.displayEventsTable(events);
}
}
catch (error) {
this.logError(this.t('events.list.error', { error: String(error) }));
}
}
displayEventsTable(events) {
this.logResult(this.t('events.list.tableHeader', { count: events.length }));
const columns = [
{ key: 'title', label: this.t('events.list.columns.title'), width: 30 },
{ key: 'date', label: this.t('events.list.columns.date'), width: 15 },
{ key: 'time', label: this.t('events.list.columns.time'), width: 15 },
{ key: 'location', label: this.t('events.list.columns.location'), width: 20 },
{ key: 'description', label: this.t('events.list.columns.description'), width: 30 },
];
const formatter = new table_formatter_1.TableFormatter({
columns,
fields: this.fields,
});
const tableData = events.map((event) => {
const timeInfo = date_formatter_1.DateFormatter.formatListEventTime(event);
return {
title: event.summary || this.t('events.list.noTitle'),
date: timeInfo?.dateStr || '',
time: timeInfo?.timeStr || '',
location: event.location || '',
description: event.description || '',
};
});
const table = formatter.format(tableData);
this.logResult(table);
}
}
exports.default = EventsList;