bookr-cli
Version:
A terminal-based CLI tool to book time in Jira using the Tempo plugin by parsing your current Git branch name
94 lines • 3.2 kB
JavaScript
/**
* Parse time string and convert to seconds
* Supports formats like: "2h30m", "1h15m", "45m", "2.5h", "90m"
*/
export function parseTimeToSeconds(timeString) {
const normalized = timeString.toLowerCase().trim();
// Handle decimal hours: "2.5h", "1.25h"
const decimalHoursMatch = normalized.match(/^(\d+(?:\.\d+)?)h?$/);
if (decimalHoursMatch?.[1]) {
const hours = Number.parseFloat(decimalHoursMatch[1]);
return Math.round(hours * 3600);
}
// Handle hours and minutes: "2h30m", "1h15m", "2h", "30m"
const hoursMatch = normalized.match(/(\d+)h/);
const minutesMatch = normalized.match(/(\d+)m/);
const hours = hoursMatch?.[1] ? Number.parseInt(hoursMatch[1], 10) : 0;
const minutes = minutesMatch?.[1] ? Number.parseInt(minutesMatch[1], 10) : 0;
return hours * 3600 + minutes * 60;
}
/**
* Convert seconds to JIRA time format (e.g., "2h 30m")
*/
export function secondsToJiraFormat(seconds) {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
if (hours > 0 && minutes > 0) {
return `${hours}h ${minutes}m`;
}
if (hours > 0) {
return `${hours}h`;
}
if (minutes > 0) {
return `${minutes}m`;
}
return '0m';
}
/**
* Validate time string format
*/
export function isValidTimeFormat(timeString) {
const normalized = timeString.toLowerCase().trim();
// Check for decimal hours
if (/^\d+(?:\.\d+)?h?$/.test(normalized)) {
return true;
}
// Check for hours and minutes
if (/^\d+h\d+m$/.test(normalized)) {
return true;
}
// Check for just hours
if (/^\d+h$/.test(normalized)) {
return true;
}
// Check for just minutes
if (/^\d+m$/.test(normalized)) {
return true;
}
return false;
}
/**
* Get human-readable time format for display
*/
export function formatTimeForDisplay(timeString) {
const seconds = parseTimeToSeconds(timeString);
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
if (hours > 0 && minutes > 0) {
return `${hours} hour${hours !== 1 ? 's' : ''} and ${minutes} minute${minutes !== 1 ? 's' : ''}`;
}
if (hours > 0) {
return `${hours} hour${hours !== 1 ? 's' : ''}`;
}
if (minutes > 0) {
return `${minutes} minute${minutes !== 1 ? 's' : ''}`;
}
return '0 minutes';
}
export function formatJiraDate(date) {
const pad = (n) => n.toString().padStart(2, '0');
const yyyy = date.getFullYear();
const MM = pad(date.getMonth() + 1);
const dd = pad(date.getDate());
const HH = pad(date.getHours());
const mm = pad(date.getMinutes());
const ss = pad(date.getSeconds());
const SSS = date.getMilliseconds().toString().padStart(3, '0');
// Correct sign and offset for local timezone
const tzOffset = -date.getTimezoneOffset();
const sign = tzOffset >= 0 ? '+' : '-';
const tzHH = pad(Math.floor(Math.abs(tzOffset) / 60));
const tzmm = pad(Math.abs(tzOffset) % 60);
return `${yyyy}-${MM}-${dd}T${HH}:${mm}:${ss}.${SSS}${sign}${tzHH}${tzmm}`;
}
//# sourceMappingURL=time-parser.js.map