|
| 1 | +import {Command, flags} from '@oclif/command' |
| 2 | +import chalk from 'chalk' |
| 3 | +import * as moment from 'moment-timezone' //has both momentjs and timezone support |
| 4 | + |
| 5 | +// @ts-ignore |
| 6 | +moment.suppressDeprecationWarnings = true |
| 7 | + |
| 8 | +import Logger from '../utilities/logger' |
| 9 | + |
| 10 | +// TODO: add timezone support for input and output |
| 11 | +export default class Datetime extends Command { |
| 12 | + static description = 'Date and Time utility' |
| 13 | + |
| 14 | + static defaultFormat = 'Do MMMM YYYY, h:m:s A, Z UTC' |
| 15 | + |
| 16 | + static flags = { |
| 17 | + help: flags.help({char: 'h'}), |
| 18 | + date: flags.string({char: 'd', description: 'Datetime input string, default: Current Datetime, could also be passed through argument'}), |
| 19 | + format: flags.string({char: 'f', description: `Datetime format, default: ${Datetime.defaultFormat}`}), |
| 20 | + timezone: flags.string({char: 'z', description: 'Timezone for Datetime parsing, default: Your timezone'}), |
| 21 | + locale: flags.string({char: 'l', description: 'Locale, default: en'}), |
| 22 | + } |
| 23 | + |
| 24 | + static args = [{name: 'date'}] |
| 25 | + |
| 26 | + //arguments 'date' ( default now() ), 'format' ( default 'dd-MMM-YYYY' ), 'timezone' (default user local) |
| 27 | + async run() { |
| 28 | + const {args, flags} = this.parse(Datetime) |
| 29 | + |
| 30 | + args.date = this.getDateString(flags, args) // getting date object |
| 31 | + args.locale = this.getLocale(flags, args) // getting date object |
| 32 | + args.format = this.getFormat(flags, args) // getting date object |
| 33 | + args.timezone = this.getTimezone(flags, args) // getting date object |
| 34 | + |
| 35 | + Logger.info(this, `Input String: ${ args.date ? args.date : chalk.magenta('Not Provided, using Current timestamp') }`) |
| 36 | + Logger.info(this, `Locale: ${chalk.magenta(args.locale)}`) |
| 37 | + Logger.info(this, `Format: ${chalk.magenta(args.format)}`) |
| 38 | + Logger.info(this, `Timezone: ${chalk.magenta(args.timezone)}`) // true - do not used cached timezone, find every time |
| 39 | + |
| 40 | + args.momentDate = this.getMomentDate(flags, args) |
| 41 | + this.checkParameters(flags, args) |
| 42 | + |
| 43 | + Logger.success(this, `${args.momentDate.tz(args.timezone).format(args.format)}`) |
| 44 | + |
| 45 | + } |
| 46 | + |
| 47 | + // tslint:disable-next-line:no-unused |
| 48 | + private getTimezone(flags: any, args: any) { |
| 49 | + if (flags.timezone) |
| 50 | + return flags.timezone |
| 51 | + else |
| 52 | + return moment.tz.guess(true) |
| 53 | + } |
| 54 | + |
| 55 | + // tslint:disable-next-line:no-unused |
| 56 | + private getLocale(flags: any, args: any) { |
| 57 | + if (flags.locale) |
| 58 | + return flags.locale |
| 59 | + else |
| 60 | + return 'en' |
| 61 | + } |
| 62 | + |
| 63 | + private getDateString(flags: any, args: any) { |
| 64 | + let dateString: string | undefined |
| 65 | + |
| 66 | + if (args.date) |
| 67 | + dateString = args.date |
| 68 | + else if (flags.date) |
| 69 | + dateString = flags.date |
| 70 | + else |
| 71 | + dateString = undefined // will be set to now() |
| 72 | + |
| 73 | + return dateString |
| 74 | + } |
| 75 | + |
| 76 | + private getMomentDate(flags: any, args: any) { |
| 77 | + let date: moment.Moment |
| 78 | + |
| 79 | + if (args.date) |
| 80 | + date = moment.tz(args.date, args.timezone) |
| 81 | + else |
| 82 | + date = moment.tz([], args.timezone) // return now() if args.date is undefined |
| 83 | + |
| 84 | + // set locale |
| 85 | + date.locale(flags.locale) |
| 86 | + return date |
| 87 | + } |
| 88 | + |
| 89 | + // tslint:disable-next-line:no-unused |
| 90 | + private checkParameters(flags: any, args: any) { |
| 91 | + if (!args.momentDate.isValid()) |
| 92 | + Logger.error(this, 'Invalid Date String Passed') |
| 93 | + } |
| 94 | + |
| 95 | + // tslint:disable-next-line:no-unused |
| 96 | + private getFormat(flags: any, args: any) { |
| 97 | + return flags.format ? flags.format : Datetime.defaultFormat |
| 98 | + } |
| 99 | +} |
0 commit comments