gcalendar-cli
Version:
Google Calendar cli tool for Node.js
1 lines • 56.2 kB
Source Map (JSON)
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"lodash\"","webpack:///./src/commands/index.ts","webpack:///./src/modules/google-calendar/google-calendar.ts","webpack:///external \"chalk\"","webpack:///external \"date-fns/add_days\"","webpack:///external \"date-fns/format\"","webpack:///./src/modules/google-calendar/fns/util.fns.ts","webpack:///external \"googleapis\"","webpack:///external \"inquirer\"","webpack:///external \"date-fns/parse\"","webpack:///external \"date-fns/set_hours\"","webpack:///external \"date-fns/set_minutes\"","webpack:///external \"date-fns/set_seconds\"","webpack:///./src/modules/google-calendar/fns/event.fns.ts","webpack:///external \"date-fns/is_same_day\"","webpack:///external \"sherlockjs\"","webpack:///./src/modules/promise-loading/promise-loading.ts","webpack:///./src/index.ts","webpack:///external \"update-notifier\"","webpack:///external \"yargs\"","webpack:///./src/commands/list.ts","webpack:///./src/modules/google-oauth2/google-oauth2.ts","webpack:///external \"fs\"","webpack:///external \"util\"","webpack:///external \"opn\"","webpack:///./src/modules/google-calendar/models/calendar.ts","webpack:///external \"class-transformer\"","webpack:///./src/modules/google-calendar/models/event.ts","webpack:///external \"date-fns/difference_in_calendar_days\"","webpack:///external \"date-fns/add_weeks\"","webpack:///./src/config.ts","webpack:///external \"path\"","webpack:///external \"os\"","webpack:///./src/modules/google-calendar/renderer/cli-renderer.ts","webpack:///external \"date-fns/set_milliseconds\"","webpack:///external \"date-fns/difference_in_seconds\"","webpack:///external \"date-fns/is_before\"","webpack:///external \"date-fns/is_after\"","webpack:///external \"date-fns/sub_milliseconds\"","webpack:///external \"cli-table3\"","webpack:///./src/modules/google-calendar-holiday/google-calendar-holiday.ts","webpack:///external \"date-fns/is_saturday\"","webpack:///external \"date-fns/is_sunday\"","webpack:///external \"ora\"","webpack:///./src/commands/insert.ts","webpack:///external \"date-fns/add_hours\"","webpack:///external \"sentence-case\"","webpack:///./src/commands/setup.ts","webpack:///external \"node-emoji\""],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","registerCommands","argv","command","SetupCommand","ListCommand","InsertCommand","log","console","pretty","obj","JSON","stringify","error","SCOPES","getCalendarClient","oauth2Client","authorize","scopes","tokenPath","TOKEN_PATH","credentialPath","CRED_PATH","google","calendar","version","auth","listCalendars","data","calendarList","list","maxResults","items","plainToClass","Calendar","listEvents","calendarClient","calendarId","options","params","timeMin","toISOString","Date","timeMax","singleEvents","orderBy","events","pageToken","pagingParams","nextPageToken","concat","isEmpty","flatten","map","GCalEvent","gen","e","insertEvent","summary","start","end","isAllDay","event","date","dateTime","resource","insert","resetTime","formatString","ppObjDate","objClone","entries","diffHours","dateLeft","dateRight","toFixed","num","fixed","re","RegExp","toString","match","diffHoursToMinutes","hours","Math","floor","minuteHour","minutes","diffHoursToString","diffHoursString","maxMillis","maxDate","minDate","filterWithRange","from","to","gCalEvents","filter","gCalEvent","valid","checkDateIsBeforeToDate","checkDateIsAfterFromDate","endTime","sortWithinDay","sorter","allDay","startTime","sortBy","groupAcrossDays","groupedWithTimeKey","groupBy","getTime","sortedWithTimeKey","sortObjKeys","mapKeys","_","timeString","groupAndSort","grouped","each","chain","toPairs","fromPairs","promiseMiddleware","optionAction","before","success","failed","promiseIn","then","res","Promise","resolve","catch","err","reject","DEFAULT_LOADING_OPTIONS","message","spinner","color","loading","defaults","text","succeed","fail","pkg","notify","MAIN_JS_REGEX","test","process","demandCommand","help","aliases","describe","builder","table","alias","type","days","range","handler","dayOffset","fromDate","toDate","startDate","endDate","parse","calendarIds","id","listEventPromises","eventPromiseResponses","all","holidayCalendarUrls","filterCalendarUrl","holidayCalendar","HolidayCalendar","prefetchRange","renderEventsTable","renderEventsList","readFileAsync","promisify","readFile","writeFileAsync","writeFile","content","client_id","clientId","client_secret","clientSecret","redirect_uris","redirectUris","installed","oAuth2Client","OAuth2","credentials","readTokenFromFile","authUrl","generateAuthUrl","access_type","scope","greenBright","code","prompt","tokens","getToken","fetchNewToken","genSummarySuffix","diffDays","index","Error","genGCalEvent","suffix","action","organizer","email","calendarDisplayName","displayName","genAllDayGCalEvent","getDate","diff","push","startSuffix","startEvent","endSuffix","endEvent","join","homedir","_renderEvents","renderDateHeader","renderEventItem","checkHoliday","length","today","gCalEventDict","dateString","redBright","timeRange","checkWithHolidayCalendar","isHoliday","colSpan","hAlign","bold","HOLIDAY_REGEX","verifyCalendarUrl","url","urls","calendarUrls","holidays","forEach","this","fetchedHolidays","Holiday","find","holiday","calendarUrl","calendarName","parseInsertCommand","info","duration","eventTitle","yellowBright","title","sentenceCase","question","default","confirm","insertEventPromise"],"mappings":"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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 17);\n","module.exports = require(\"lodash\");","import { Argv } from \"yargs\";\r\nimport { ListCommand } from \"./list\";\r\nimport { InsertCommand } from \"./insert\";\r\nimport { SetupCommand } from \"./setup\";\r\n\r\nexport const registerCommands = (argv: Argv) => {\r\n argv.command(SetupCommand);\r\n argv.command(ListCommand);\r\n argv.command(InsertCommand);\r\n return argv;\r\n};\r\n\r\nexport const log = console.log;\r\nexport const pretty = obj => JSON.stringify(obj, null, 2);\r\n","import { google, calendar_v3 } from \"googleapis\";\r\nimport { authorize } from \"../google-oauth2/google-oauth2\";\r\nimport { Calendar } from \"./models/calendar\";\r\nimport { plainToClass } from \"class-transformer\";\r\nimport { GCalEvent } from \"./models/event\";\r\nimport { flatten, isEmpty } from \"lodash\";\r\nimport addWeeks from \"date-fns/add_weeks\";\r\nimport format from \"date-fns/format\";\r\nimport { CRED_PATH, TOKEN_PATH } from \"../../config\";\r\n\r\nconst error = console.error;\r\n\r\nconst SCOPES = [\r\n \"https://www.googleapis.com/auth/calendar\",\r\n \"https://www.googleapis.com/auth/calendar.readonly\",\r\n];\r\n\r\nconst INSERT_DATE_FORMAT = \"YYYY-MM-DD\";\r\nconst INSERT_DATETIME_FORMAT = \"YYYY-MM-DDTHH:mm:ss.SSSZ\";\r\n\r\nexport const getCalendarClient = async (): Promise<calendar_v3.Calendar> => {\r\n const oauth2Client = await authorize({\r\n scopes: SCOPES,\r\n tokenPath: TOKEN_PATH,\r\n credentialPath: CRED_PATH,\r\n });\r\n return google.calendar({ version: \"v3\", auth: oauth2Client });\r\n};\r\n\r\nexport const listCalendars = async (calendar: calendar_v3.Calendar) => {\r\n const params: calendar_v3.Params$Resource$Calendarlist$List = {\r\n maxResults: 100,\r\n };\r\n const { data } = await calendar.calendarList.list(params);\r\n const { items } = data;\r\n const calendars = plainToClass<Calendar, {}[]>(Calendar, items);\r\n return calendars;\r\n};\r\n\r\nexport interface ListEventOptions {\r\n timeMin?: Date;\r\n timeMax?: Date;\r\n}\r\n\r\nexport const listEvents = async (\r\n calendarClient: calendar_v3.Calendar,\r\n calendarId = \"primary\",\r\n options: ListEventOptions = {}\r\n) => {\r\n const params: calendar_v3.Params$Resource$Events$List = {\r\n calendarId: calendarId,\r\n timeMin: options.timeMin\r\n ? options.timeMin.toISOString()\r\n : new Date().toISOString(),\r\n timeMax: options.timeMax\r\n ? options.timeMax.toISOString()\r\n : addWeeks(new Date(), 1).toISOString(),\r\n maxResults: 100,\r\n singleEvents: true,\r\n orderBy: \"startTime\",\r\n };\r\n\r\n try {\r\n let events = [];\r\n let pageToken = \"\";\r\n do {\r\n const pagingParams: calendar_v3.Params$Resource$Events$List = {\r\n ...params,\r\n pageToken: pageToken,\r\n };\r\n const { data } = await calendarClient.events.list(pagingParams);\r\n const { nextPageToken, items } = data;\r\n pageToken = nextPageToken;\r\n events = events.concat(items);\r\n } while (!isEmpty(pageToken));\r\n\r\n const gCalEvents = flatten(events.map(GCalEvent.gen));\r\n return gCalEvents;\r\n } catch (e) {\r\n error(`calendarId(${calendarId}) has error`, e);\r\n throw e;\r\n }\r\n};\r\n\r\nexport interface InsertEventOptions {\r\n summary: string;\r\n start: Date;\r\n end: Date;\r\n isAllDay?: boolean;\r\n}\r\n\r\nexport const insertEvent = (calendarClient: calendar_v3.Calendar) => (\r\n options: InsertEventOptions\r\n) => async (calendarId: string = \"primary\") => {\r\n const { summary, start, end, isAllDay } = options;\r\n let event: any = {\r\n summary: summary,\r\n };\r\n if (isAllDay) {\r\n event = {\r\n ...event,\r\n start: {\r\n date: format(start, INSERT_DATE_FORMAT),\r\n },\r\n end: {\r\n date: format(end, INSERT_DATE_FORMAT),\r\n },\r\n };\r\n } else {\r\n event = {\r\n ...event,\r\n start: {\r\n dateTime: format(start, INSERT_DATETIME_FORMAT),\r\n },\r\n end: {\r\n dateTime: format(end, INSERT_DATETIME_FORMAT),\r\n },\r\n };\r\n }\r\n let params: any = {\r\n calendarId: calendarId,\r\n resource: event,\r\n };\r\n try {\r\n const { data } = await calendarClient.events.insert(params);\r\n const gCalEvents = GCalEvent.gen(data);\r\n return gCalEvents;\r\n } catch (e) {\r\n error(`calendarId(${calendarId}) insert event error occured`, e);\r\n throw e;\r\n }\r\n};\r\n","module.exports = require(\"chalk\");","module.exports = require(\"date-fns/add_days\");","module.exports = require(\"date-fns/format\");","import setHours from \"date-fns/set_hours\";\r\nimport setMinutes from \"date-fns/set_minutes\";\r\nimport setSeconds from \"date-fns/set_seconds\";\r\nimport setMilliseconds from \"date-fns/set_milliseconds\";\r\nimport format from \"date-fns/format\";\r\nimport differenceInSeconds from \"date-fns/difference_in_seconds\";\r\n\r\nexport const resetTime = (date: Date) =>\r\n setMilliseconds(setHours(setMinutes(setSeconds(date, 0), 0), 0), 0);\r\n\r\nconst formatDate = (formatString: string) => (obj) => {\r\n const objClone = { ...obj };\r\n for (const [key, value] of Object.entries(objClone)) {\r\n if (value instanceof Date) {\r\n objClone[key] = format(value, formatString);\r\n }\r\n }\r\n return objClone;\r\n};\r\nexport const ppObjDate = formatDate(\"MMM D YYYY h:mm A\");\r\n\r\nexport const diffHours = (dateLeft: Date, dateRight: Date) => {\r\n const diffSeconds = differenceInSeconds(dateLeft, dateRight);\r\n return diffSeconds / 3600;\r\n};\r\n\r\nexport const toFixed = (num, fixed) => {\r\n var re = new RegExp(\"^-?\\\\d+(?:.\\\\d{0,\" + (fixed || -1) + \"})?\");\r\n return num.toString().match(re)[0];\r\n};\r\n\r\nexport const diffHoursToMinutes = (\r\n diffHours: number\r\n): { hours: number; minutes: number } => {\r\n const hours = Math.floor(diffHours);\r\n const minuteHour = diffHours - hours;\r\n const minutes = Math.floor(minuteHour * 60);\r\n return { hours, minutes };\r\n};\r\n\r\nexport const diffHoursToString = (diffHours: number): string => {\r\n const { hours, minutes } = diffHoursToMinutes(diffHours);\r\n let diffHoursString = \"\";\r\n if (hours) {\r\n diffHoursString += `${hours} hour${hours > 1 ? \"s\" : \"\"}`;\r\n }\r\n if (hours && minutes) {\r\n diffHoursString += \" and \";\r\n }\r\n if (minutes) {\r\n diffHoursString += `${minutes} minute${minutes > 1 ? \"s\" : \"\"}`;\r\n }\r\n return diffHoursString;\r\n};\r\n","module.exports = require(\"googleapis\");","module.exports = require(\"inquirer\");","module.exports = require(\"date-fns/parse\");","module.exports = require(\"date-fns/set_hours\");","module.exports = require(\"date-fns/set_minutes\");","module.exports = require(\"date-fns/set_seconds\");","import { GCalEvent } from \"../models/event\";\r\nimport {\r\n groupBy,\r\n Dictionary,\r\n sortBy,\r\n each,\r\n filter,\r\n mapKeys,\r\n toPairs,\r\n fromPairs,\r\n chain,\r\n} from \"lodash\";\r\nimport { resetTime } from \"./util.fns\";\r\nimport addDays from \"date-fns/add_days\";\r\nimport isBefore from \"date-fns/is_before\";\r\nimport isAfter from \"date-fns/is_after\";\r\nimport subMilliseconds from \"date-fns/sub_milliseconds\";\r\nimport addMilliseconds from \"date-fns/add_milliseconds\";\r\n\r\nconst maxMillis = 10 ** 8 * 24 * 60 * 60 * 1000;\r\nconst maxDate = new Date(maxMillis);\r\nconst minDate = new Date(-maxMillis);\r\n\r\nconst checkDateIsAfterFromDate = (from, date) => {\r\n return isAfter(date, subMilliseconds(resetTime(from), 1));\r\n};\r\n\r\nconst checkDateIsBeforeToDate = (to, date) => {\r\n return isBefore(date, resetTime(to));\r\n};\r\n\r\nexport const filterWithRange = (from: Date, to: Date) => (\r\n gCalEvents: GCalEvent[]\r\n): GCalEvent[] => {\r\n return filter(gCalEvents, (gCalEvent) => {\r\n let valid =\r\n checkDateIsBeforeToDate(to, gCalEvent.date) &&\r\n checkDateIsAfterFromDate(from, gCalEvent.date);\r\n\r\n if (gCalEvent.endTime) {\r\n valid = valid && isBefore(from, gCalEvent.endTime);\r\n }\r\n return valid;\r\n });\r\n};\r\n\r\nexport const sortWithinDay = (gCalEvent: GCalEvent[]): GCalEvent[] => {\r\n const sorter = [\r\n (gCalEvent: GCalEvent) => {\r\n return gCalEvent.allDay;\r\n },\r\n (gCalEvent: GCalEvent) => {\r\n if (gCalEvent.startTime) {\r\n return gCalEvent.startTime;\r\n }\r\n if (!gCalEvent.startTime && gCalEvent.endTime) {\r\n return minDate;\r\n }\r\n return maxDate;\r\n },\r\n (gCalEvent: GCalEvent) => {\r\n return gCalEvent.summary;\r\n },\r\n ];\r\n return sortBy(gCalEvent, sorter);\r\n};\r\n\r\nexport const groupAcrossDays = (\r\n gCalEvents: GCalEvent[]\r\n): Dictionary<GCalEvent[]> => {\r\n const groupedWithTimeKey = groupBy(gCalEvents, (event) =>\r\n event.date.getTime()\r\n );\r\n const sortedWithTimeKey = sortObjKeys(groupedWithTimeKey);\r\n const grouped = mapKeys(sortedWithTimeKey, (_, timeString) =>\r\n new Date(+timeString).toISOString()\r\n );\r\n return grouped;\r\n};\r\n\r\nexport const groupAndSort = (\r\n gCalEvent: GCalEvent[]\r\n): Dictionary<GCalEvent[]> => {\r\n const grouped = groupAcrossDays(gCalEvent);\r\n each(grouped, (value, key, list) => {\r\n list[key] = sortWithinDay(value);\r\n });\r\n return grouped;\r\n};\r\n\r\nconst sortObjKeys = <T>(obj: T) => {\r\n return (chain(obj).toPairs() as any).sortBy(0).fromPairs().value() as T;\r\n};\r\n","module.exports = require(\"date-fns/is_same_day\");","module.exports = require(\"sherlockjs\");","import Ora from \"ora\";\r\nimport { defaults } from \"lodash\";\r\n\r\nexport interface PromiseMiddleWareOptions {\r\n before: () => void;\r\n success: (res) => void;\r\n failed: (err) => void;\r\n}\r\n\r\nexport const promiseMiddleware = (\r\n optionAction: () => PromiseMiddleWareOptions\r\n) => {\r\n const { before, success, failed } = optionAction();\r\n return <T>(promiseIn: Promise<T>) => {\r\n before();\r\n return promiseIn\r\n .then((res) => {\r\n success(res);\r\n return Promise.resolve(res);\r\n })\r\n .catch((err) => {\r\n failed(err);\r\n return Promise.reject(err);\r\n });\r\n };\r\n};\r\n\r\nexport interface PromiseLoadingOptions {\r\n message: string;\r\n spinner?: string;\r\n color?: string;\r\n}\r\n\r\nconst DEFAULT_LOADING_OPTIONS: PromiseLoadingOptions = {\r\n message: \"Loading\",\r\n spinner: \"shark\",\r\n color: \"white\",\r\n};\r\n\r\nexport const loading = (options?: PromiseLoadingOptions) =>\r\n promiseMiddleware(() => {\r\n let spinner: any;\r\n options = defaults(options, DEFAULT_LOADING_OPTIONS);\r\n return {\r\n before: () => {\r\n spinner = new Ora({\r\n text: options.message,\r\n spinner: <any>options.spinner,\r\n color: <any>options.color,\r\n }).start();\r\n },\r\n success: (res) => {\r\n spinner.succeed();\r\n },\r\n failed: (err) => {\r\n spinner.fail();\r\n },\r\n };\r\n });\r\n","const pkg = require(\"./../package.json\");\r\nimport updateNotifier from \"update-notifier\";\r\nupdateNotifier({ pkg: pkg }).notify();\r\n\r\nconst scriptName = \"gcal\";\r\nconst MAIN_JS_REGEX = new RegExp(\"(main.js)$\");\r\nconst INDEX_MAX = 1;\r\nfor (let i = 0; i <= INDEX_MAX; i++) {\r\n if (MAIN_JS_REGEX.test(process.argv[i])) {\r\n process.argv[i] = scriptName;\r\n }\r\n}\r\n\r\nimport yargs from \"yargs\";\r\nimport { registerCommands } from \"./commands\";\r\n\r\nconst argv = registerCommands(yargs);\r\nargv.demandCommand(1, \"You need at least one command before moving on\").help()\r\n .argv;\r\n","module.exports = require(\"update-notifier\");","module.exports = require(\"yargs\");","import { CommandModule } from \"yargs\";\r\nimport {\r\n getCalendarClient,\r\n listCalendars,\r\n listEvents,\r\n} from \"../modules/google-calendar/google-calendar\";\r\nimport { flatten } from \"lodash\";\r\nimport {\r\n renderEventsTable,\r\n renderEventsList,\r\n} from \"../modules/google-calendar/renderer/cli-renderer\";\r\nimport Sherlock from \"sherlockjs\";\r\nimport addDays from \"date-fns/add_days\";\r\n\r\nimport { resetTime, ppObjDate } from \"../modules/google-calendar/fns/util.fns\";\r\nimport { filterWithRange } from \"../modules/google-calendar/fns/event.fns\";\r\nimport {\r\n HolidayCalendar,\r\n filterCalendarUrl,\r\n} from \"../modules/google-calendar-holiday/google-calendar-holiday\";\r\nimport { log, pretty } from \"./index\";\r\nimport { loading } from \"./../modules/promise-loading/promise-loading\";\r\n\r\nconst TO_DAY_OFFSET = 3;\r\n\r\nexport const ListCommand: CommandModule = {\r\n command: \"list\",\r\n aliases: \"ls\",\r\n describe: \"List google calendar events\",\r\n builder: {\r\n table: {\r\n alias: \"t\",\r\n describe: \"Display events in table\",\r\n type: \"boolean\",\r\n },\r\n days: {\r\n alias: \"d\",\r\n describe: \"Number of days for events\",\r\n type: \"number\",\r\n },\r\n range: {\r\n alias: \"r\",\r\n describe: \"Date range of events in natural language\",\r\n type: \"string\",\r\n },\r\n },\r\n handler: async (argv) => {\r\n const { range, table, days } = argv;\r\n\r\n const dayOffset = days != null ? days + 1 : TO_DAY_OFFSET;\r\n let fromDate = new Date();\r\n let toDate = null;\r\n\r\n if (range) {\r\n const { startDate, endDate } = Sherlock.parse(range);\r\n if (startDate) {\r\n fromDate = startDate;\r\n }\r\n if (endDate) {\r\n toDate = endDate;\r\n }\r\n }\r\n\r\n const options = {\r\n from: fromDate,\r\n to: toDate ? toDate : resetTime(addDays(fromDate, dayOffset)),\r\n };\r\n log(pretty(ppObjDate(options)));\r\n\r\n const calendarClient = await loading({\r\n message: \"Creating calendar client\",\r\n })(getCalendarClient());\r\n let calendars = await listCalendars(calendarClient);\r\n const calendarIds = calendars.map((calendar) => calendar.id);\r\n\r\n const listEventPromises = calendarIds.map((calendarId) =>\r\n listEvents(calendarClient, calendarId, {\r\n timeMin: options.from,\r\n timeMax: options.to,\r\n })\r\n );\r\n const eventPromiseResponses = await loading({ message: \"Fetching events\" })(\r\n Promise.all(listEventPromises)\r\n );\r\n let gCalEvents = flatten(eventPromiseResponses);\r\n gCalEvents = filterWithRange(options.from, options.to)(gCalEvents);\r\n\r\n const holidayCalendarUrls = filterCalendarUrl(calendarIds);\r\n const holidayCalendar = new HolidayCalendar(holidayCalendarUrls);\r\n await loading({ message: \"Fetching holidays\" })(\r\n holidayCalendar.prefetchRange(calendarClient, options.from, options.to)\r\n );\r\n\r\n if (table) {\r\n renderEventsTable(holidayCalendar)(gCalEvents);\r\n } else {\r\n renderEventsList(holidayCalendar)(gCalEvents);\r\n }\r\n },\r\n};\r\n","import { google, Auth } from \"googleapis\";\r\nimport fs from \"fs\";\r\nimport { promisify } from \"util\";\r\nimport chalk from \"chalk\";\r\nimport opn from \"opn\";\r\nimport inquirer from \"inquirer\";\r\n\r\nconst readFileAsync = promisify(fs.readFile);\r\nconst writeFileAsync = promisify(fs.writeFile);\r\n\r\ninterface AuthorizeOptions {\r\n scopes: string[];\r\n tokenPath: string;\r\n credentialPath: string;\r\n}\r\nexport async function authorize({\r\n scopes,\r\n tokenPath,\r\n credentialPath,\r\n}: AuthorizeOptions): Promise<Auth.OAuth2Client> {\r\n let content: Buffer;\r\n try {\r\n content = await readFileAsync(credentialPath);\r\n } catch (err) {\r\n console.error(\"Error loading client secret file:\", err);\r\n throw err;\r\n }\r\n const {\r\n client_id: clientId,\r\n client_secret: clientSecret,\r\n redirect_uris: redirectUris,\r\n } = JSON.parse(content.toString(\"utf8\")).installed;\r\n const oAuth2Client = new google.auth.OAuth2(\r\n clientId,\r\n clientSecret,\r\n redirectUris[0]\r\n );\r\n\r\n let credentials: Auth.Credentials;\r\n try {\r\n credentials = await readTokenFromFile(tokenPath);\r\n } catch (e) {\r\n credentials = await fetchNewToken({ scopes, tokenPath, oAuth2Client });\r\n }\r\n oAuth2Client.credentials = credentials;\r\n return oAuth2Client;\r\n}\r\n\r\nasync function readTokenFromFile(tokenPath: string): Promise<Auth.Credentials> {\r\n const content = await readFileAsync(tokenPath);\r\n return JSON.parse(content.toString(\"utf8\"));\r\n}\r\n\r\nasync function fetchNewToken({\r\n oAuth2Client,\r\n scopes,\r\n tokenPath,\r\n}: {\r\n oAuth2Client: Auth.OAuth2Client;\r\n scopes: string[];\r\n tokenPath: string;\r\n}): Promise<Auth.Credentials> {\r\n const authUrl = oAuth2Client.generateAuthUrl({\r\n access_type: \"offline\",\r\n scope: scopes,\r\n });\r\n console.log(\r\n `Authorize this app by visiting this url:\\n${chalk.greenBright(authUrl)}`\r\n );\r\n opn(authUrl);\r\n\r\n const question: inquirer.Question = {\r\n type: \"input\",\r\n message: \"Enter the code from that page here:\",\r\n name: \"code\",\r\n };\r\n const { code } = await inquirer.prompt(question);\r\n try {\r\n const { tokens } = await oAuth2Client.getToken(code);\r\n await writeFileAsync(tokenPath, JSON.stringify(tokens));\r\n console.log(\"Token stored to\", tokenPath);\r\n return tokens;\r\n } catch (err) {\r\n console.error(\"Failed to retrieve OAuth2 token\", err);\r\n throw err;\r\n }\r\n}\r\n","module.exports = require(\"fs\");","module.exports = require(\"util\");","module.exports = require(\"opn\");","export class Calendar {\r\n id: string;\r\n summary: string;\r\n colorId: string;\r\n}\r\n","module.exports = require(\"class-transformer\");","import isSameDay from \"date-fns/is_same_day\";\r\nimport differenceInCalendarDays from \"date-fns/difference_in_calendar_days\";\r\nimport differenceInDays from \"date-fns/difference_in_days\";\r\nimport addDays from \"date-fns/add_days\";\r\nimport parse from \"date-fns/parse\";\r\nimport setHours from \"date-fns/set_hours\";\r\nimport setMinutes from \"date-fns/set_minutes\";\r\nimport setSeconds from \"date-fns/set_seconds\";\r\n\r\nconst isAllDay = (event: any) => event.start.date;\r\n\r\nconst genSummarySuffix = (diffDays: number, index: number) => {\r\n if (index >= diffDays) {\r\n throw new Error(\r\n `index(${index}) is greater or equal to diffDays(${diffDays})`\r\n );\r\n }\r\n return ` (Day ${index + 1}/${diffDays})`;\r\n};\r\n\r\nconst genGCalEvent = (suffix: string) => (\r\n event: any,\r\n action: (gcalEvent: GCalEvent) => GCalEvent\r\n) => {\r\n const gCalEvent = new GCalEvent();\r\n gCalEvent.summary = event.summary + suffix;\r\n gCalEvent.calendarId = event.organizer.email;\r\n gCalEvent.calendarDisplayName = event.organizer.displayName;\r\n return action(gCalEvent);\r\n};\r\n\r\nconst genAllDayGCalEvent = (suffix: string) => (\r\n event: any,\r\n action: (gcalEvent: GCalEvent) => GCalEvent\r\n) => {\r\n const gCalEvent = genGCalEvent(suffix)(event, action);\r\n gCalEvent.allDay = true;\r\n return gCalEvent;\r\n};\r\n\r\nconst getDate = (dateTime: Date) => {\r\n let date = setHours(dateTime, 0);\r\n date = setMinutes(date, 0);\r\n date = setSeconds(date, 0);\r\n return date;\r\n};\r\n\r\nexport class GCalEvent {\r\n summary: string;\r\n calendarId: string;\r\n calendarDisplayName: string;\r\n date: Date;\r\n startTime?: Date;\r\n endTime?: Date;\r\n allDay?: boolean;\r\n\r\n // Mimic google calendar mobile event\r\n public static gen(event: any): GCalEvent[] {\r\n if (isAllDay(event)) {\r\n const startDate = parse(event.start.date);\r\n const endDate = parse(event.end.date);\r\n const diff = differenceInCalendarDays(endDate, startDate);\r\n if (diff > 1) {\r\n const events: GCalEvent[] = [];\r\n for (let i = 0; i < diff; i++) {\r\n const date = addDays(startDate, i);\r\n const suffix = genSummarySuffix(diff, i);\r\n const gCalEvent = genAllDayGCalEvent(suffix)(event, (gCalEvent) => {\r\n gCalEvent.date = date;\r\n return gCalEvent;\r\n });\r\n events.push(gCalEvent);\r\n }\r\n return events;\r\n } else {\r\n const gCalEvent = genAllDayGCalEvent(\"\")(event, (gCalEvent) => {\r\n gCalEvent.date = startDate;\r\n return gCalEvent;\r\n });\r\n return [gCalEvent];\r\n }\r\n } else {\r\n const startTime = parse(event.start.dateTime);\r\n const endTime = parse(event.end.dateTime);\r\n const diff = differenceInCalendarDays(endTime, startTime) + 1;\r\n if (diff > 1) {\r\n const events: GCalEvent[] = [];\r\n const startSuffix = genSummarySuffix(diff, 0);\r\n const startEvent = genGCalEvent(startSuffix)(event, (gCalEvent) => {\r\n gCalEvent.startTime = startTime;\r\n gCalEvent.date = getDate(startTime);\r\n return gCalEvent;\r\n });\r\n events.push(startEvent);\r\n\r\n for (let i = 1; i < diff - 1; i++) {\r\n let date = addDays(startTime, i);\r\n date = getDate(date);\r\n\r\n const suffix = genSummarySuffix(diff, i);\r\n const gCalEvent = genAllDayGCalEvent(suffix)(event, (gCalEvent) => {\r\n gCalEvent.date = date;\r\n return gCalEvent;\r\n });\r\n events.push(gCalEvent);\r\n }\r\n\r\n const endSuffix = genSummarySuffix(diff, diff - 1);\r\n const endEvent = genGCalEvent(endSuffix)(event, (gCalEvent) => {\r\n gCalEvent.endTime = endTime;\r\n gCalEvent.date = getDate(endTime);\r\n return gCalEvent;\r\n });\r\n events.push(endEvent);\r\n\r\n return events;\r\n } else {\r\n const gCalEvent = genGCalEvent(\"\")(event, (gCalEvent) => {\r\n gCalEvent.date = getDate(startTime);\r\n gCalEvent.startTime = startTime;\r\n gCalEvent.endTime = endTime;\r\n return gCalEvent;\r\n });\r\n return [gCalEvent];\r\n }\r\n }\r\n }\r\n}\r\n","module.exports = require(\"date-fns/difference_in_calendar_days\");","module.exports = require(\"date-fns/add_weeks\");","import path from \"path\";\r\nimport os from \"os\";\r\n\r\nexport const CRED_PATH = path.join(os.homedir(), \"client_secret.json\");\r\nexport const TOKEN_PATH = path.join(os.homedir(), \"calendar_api_token.json\");\r\n","module.exports = require(\"path\");","module.exports = require(\"os\");","import { GCalEvent } from \"../models/event\";\r\nimport { groupAndSort } from \"./../fns/event.fns\";\r\nimport parse from \"date-fns/parse\";\r\nimport format from \"date-fns/format\";\r\nimport Table from \"cli-table3\";\r\nimport { default as chalk } from \"chalk\";\r\nimport emoji from \"node-emoji\";\r\nimport isSameDay from \"date-fns/is_same_day\";\r\nimport { HolidayCalendar } from \"../../google-calendar-holiday/google-calendar-holiday\";\r\n\r\nconst log = console.log;\r\nconst DATE_FORMAT = \"MMM D (ddd)\";\r\nconst TIME_FORMAT = \"h:mm A\";\r\n\r\nclass RenderEventOptions {\r\n renderDateHeader: (dateString: string) => any[];\r\n renderEventItem: (gCalEvent: GCalEvent, timeRange: string) => any[];\r\n checkHoliday: (date: Date) => boolean;\r\n}\r\n\r\nconst _renderEvents = (options: RenderEventOptions) => (\r\n gCalEvents: GCalEvent[]\r\n) => {\r\n const { renderDateHeader, renderEventItem, checkHoliday } = options;\r\n\r\n let table = new Table();\r\n if (gCalEvents.length === 0) {\r\n log(`No events`);\r\n return;\r\n }\r\n\r\n const today = new Date();\r\n\r\n const gCalEventDict = groupAndSort(gCalEvents);\r\n for (const [key, gCalEvents] of Object.entries(gCalEventDict)) {\r\n const date = parse(key);\r\n let dateString = format(date, DATE_FORMAT);\r\n if (isSameDay(today, date)) {\r\n dateString += \"\\n(Today)\";\r\n }\r\n if (checkHoliday && checkHoliday(date)) {\r\n dateString = chalk.redBright(dateString);\r\n }\r\n table.push(renderDateHeader(dateString));\r\n\r\n for (const gCalEvent of gCalEvents) {\r\n let timeRange = \"\";\r\n if (gCalEvent.allDay) {\r\n timeRange = \"All Day\";\r\n } else if (gCalEvent.startTime && !gCalEvent.endTime) {\r\n timeRange = `${format(gCalEvent.startTime, TIME_FORMAT)}`;\r\n } else if (!gCalEvent.startTime && gCalEvent.endTime) {\r\n timeRange = `Until ${format(gCalEvent.endTime, TIME_FORMAT)}`;\r\n } else if (gCalEvent.startTime && gCalEvent.endTime) {\r\n timeRange = `${format(gCalEvent.startTime, TIME_FORMAT)}-${format(\r\n gCalEvent.endTime,\r\n TIME_FORMAT\r\n )}`;\r\n }\r\n table.push(renderEventItem(gCalEvent, timeRange));\r\n }\r\n }\r\n log(table.toString());\r\n};\r\n\r\nconst checkWithHolidayCalendar = (holidayCalendar: HolidayCalendar) => (\r\n date: Date\r\n): boolean => {\r\n if (!holidayCalendar) {\r\n return false;\r\n }\r\n return holidayCalendar.isHoliday(date);\r\n};\r\n\r\nexport const renderEventsList = (holidayCalendar: HolidayCalendar) =>\r\n _renderEvents({\r\n renderDateHeader: (dateString) => {\r\n return [{ colSpan: 3, content: dateString, hAlign: \"center\" }];\r\n },\r\n renderEventItem: (gCalEvent, timeRange) => {\r\n return [\r\n timeRange,\r\n gCalEvent.calendarDisplayName,\r\n chalk.bold(gCalEvent.summary),\r\n ];\r\n },\r\n checkHoliday: checkWithHolidayCalendar(holidayCalendar),\r\n });\r\n\r\nexport const renderEventsTable = (holidayCalendar: HolidayCalendar) =>\r\n _renderEvents({\r\n renderDateHeader: (dateString) => {\r\n return [{ colSpan: 1, content: dateString, hAlign: \"center\" }];\r\n },\r\n renderEventItem: (gCalEvent, timeRange) => {\r\n return [\r\n `${chalk.bold(gCalEvent.summary)}\\n${timeRange}\\n${\r\n gCalEvent.calendarDisplayName\r\n }`,\r\n ];\r\n },\r\n checkHoliday: checkWithHolidayCalendar(holidayCalendar),\r\n });\r\n","module.exports = require(\"date-fns/set_milliseconds\");","module.exports = require(\"date-fns/difference_in_seconds\");","module.exports = require(\"date-fns/is_before\");","module.exports = require(\"date-fns/is_after\");","module.exports = require(\"date-fns/sub_milliseconds\");","module.exports = require(\"cli-table3\");","import isSaturday from \"date-fns/is_saturday\";\r\nimport isSunday from \"date-fns/is_sunday\";\r\nimport isSameDay from \"date-fns/is_same_day\";\r\nimport { flatten, find } from \"lodash\";\r\n\r\nimport { listEvents } from \"../google-calendar/google-calendar\";\r\nimport { GCalEvent } from \"../google-calendar/models/event\";\r\n\r\nconst HOLIDAY_REGEX = new RegExp(\"(#holiday@group.v.calendar.google.com)$\");\r\n\r\nexport const verifyCalendarUrl = (url: string) => {\r\n if (!HOLIDAY_REGEX.test(url)) {\r\n throw new Error(`url(${url}) is not a valid holiday calendar url`);\r\n }\r\n};\r\n\r\nexport const filterCalendarUrl = (urls: st