@mrck-labs/vanaheim-shared 0.3.0 → 0.4.1
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/dist/{database-3Vv5PNDa.d.mts → database-koVAareN.d.mts} +150 -1
- package/dist/{database-3Vv5PNDa.d.ts → database-koVAareN.d.ts} +150 -1
- package/dist/date/index.d.mts +26 -3
- package/dist/date/index.d.ts +26 -3
- package/dist/date/index.js +63 -6
- package/dist/date/index.js.map +1 -1
- package/dist/date/index.mjs +59 -6
- package/dist/date/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +151 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -6
- package/dist/index.mjs.map +1 -1
- package/dist/query/index.d.mts +95 -0
- package/dist/query/index.d.ts +95 -0
- package/dist/query/index.js +88 -0
- package/dist/query/index.js.map +1 -1
- package/dist/query/index.mjs +88 -0
- package/dist/query/index.mjs.map +1 -1
- package/dist/types/index.d.mts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/utils/index.d.mts +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/date/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/date/index.ts"],"sourcesContent":["/**\n * Date Utilities\n *\n * Pure functions for date manipulation and formatting.\n * Works in both Node.js and browser/React Native environments.\n *\n * @example\n * import { getTodayString, addDays, formatRelativeTime } from '@mrck-labs/vanaheim-shared/date'\n *\n * const today = getTodayString() // \"2024-12-16\"\n * const nextWeek = addDays(today, 7) // \"2024-12-23\"\n */\n\n// ============================================================================\n// Core Utilities\n// ============================================================================\n\n/**\n * Normalize a date to midnight (00:00:00.000)\n */\nexport function normalizeToMidnight(date: Date): Date {\n const d = new Date(date)\n d.setHours(0, 0, 0, 0)\n return d\n}\n\n/**\n * Get today's date normalized to midnight\n */\nexport function getTodayMidnight(): Date {\n return normalizeToMidnight(new Date())\n}\n\n/**\n * Format a Date object to YYYY-MM-DD string\n * @example formatDateString(new Date()) => \"2024-12-16\"\n */\nexport function formatDateString(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`\n}\n\n/**\n * Get today's local date string (YYYY-MM-DD)\n */\nexport function getTodayString(): string {\n return formatDateString(new Date())\n}\n\n/**\n * Parse a YYYY-MM-DD string to a local Date object\n * Avoids timezone issues by appending T00:00:00\n */\nexport function parseLocalDate(dateStr: string): Date {\n return new Date(dateStr + 'T00:00:00')\n}\n\n// ============================================================================\n// Date Checks\n// ============================================================================\n\n/**\n * Check if a date string is today\n */\nexport function isToday(dateStr: string | null): boolean {\n if (!dateStr) return false\n return dateStr === getTodayString()\n}\n\n/**\n * Check if a date string is in the past (before today)\n */\nexport function isOverdue(dateStr: string | null): boolean {\n if (!dateStr) return false\n return dateStr < getTodayString()\n}\n\n/**\n * Check if a date is due within a threshold of days\n * @param dateStr - Date in YYYY-MM-DD format\n * @param daysThreshold - Number of days to check (default: 7)\n */\nexport function isDueSoon(dateStr: string | null, daysThreshold: number = 7): boolean {\n if (!dateStr) return false\n if (isOverdue(dateStr)) return false\n\n const today = getTodayMidnight()\n const targetDate = parseLocalDate(dateStr)\n const diffMs = targetDate.getTime() - today.getTime()\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24))\n\n return diffDays >= 0 && diffDays <= daysThreshold\n}\n\n// ============================================================================\n// Date Arithmetic\n// ============================================================================\n\n/**\n * Add days to a date string\n * @param dateStr - Date in YYYY-MM-DD format\n * @param days - Number of days to add (can be negative)\n * @returns New date string in YYYY-MM-DD format\n */\nexport function addDays(dateStr: string, days: number): string {\n const date = parseLocalDate(dateStr)\n date.setDate(date.getDate() + days)\n return formatDateString(date)\n}\n\n/**\n * Subtract days from a date string\n */\nexport function subtractDays(dateStr: string, days: number): string {\n return addDays(dateStr, -days)\n}\n\n/**\n * Get yesterday's date string (YYYY-MM-DD)\n */\nexport function getYesterdayString(): string {\n return subtractDays(getTodayString(), 1)\n}\n\n/**\n * Get tomorrow's date string (YYYY-MM-DD)\n */\nexport function getTomorrowString(): string {\n return addDays(getTodayString(), 1)\n}\n\n// ============================================================================\n// ISO String Helpers (for database queries)\n// ============================================================================\n\n/**\n * Get start of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T00:00:00.000Z\"\n */\nexport function getStartOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).toISOString()\n}\n\n/**\n * Get end of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T23:59:59.999Z\"\n */\nexport function getEndOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n 23,\n 59,\n 59,\n 999\n ).toISOString()\n}\n\n// ============================================================================\n// Week Utilities\n// ============================================================================\n\n/**\n * Get the start of the week (Monday) for a given date\n */\nexport function getWeekStart(date: Date): Date {\n const d = new Date(date)\n const day = d.getDay()\n const diff = d.getDate() - day + (day === 0 ? -6 : 1) // Monday\n d.setDate(diff)\n d.setHours(0, 0, 0, 0)\n return d\n}\n\n/**\n * Get the end of the week (Sunday) for a given week start\n */\nexport function getWeekEnd(weekStart: Date): Date {\n const d = new Date(weekStart)\n d.setDate(d.getDate() + 6)\n return d\n}\n\n/**\n * Get the start of the previous week\n */\nexport function getPreviousWeek(weekStart: Date): Date {\n const d = new Date(weekStart)\n d.setDate(d.getDate() - 7)\n return d\n}\n\n/**\n * Get the start of the next week\n */\nexport function getNextWeek(weekStart: Date): Date {\n const d = new Date(weekStart)\n d.setDate(d.getDate() + 7)\n return d\n}\n\n/**\n * Get start of week (Monday) as date string\n */\nexport function getWeekStartString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekStart(baseDate))\n}\n\n/**\n * Get end of week (Sunday) as date string\n */\nexport function getWeekEndString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekEnd(getWeekStart(baseDate)))\n}\n\n/**\n * Format a week range for display\n * @example \"Dec 2 - 8, 2024\" or \"Nov 25 - Dec 1, 2024\"\n */\nexport function formatWeekRange(weekStart: Date): string {\n const weekEnd = getWeekEnd(weekStart)\n const startMonth = weekStart.toLocaleDateString('en-US', { month: 'short' })\n const endMonth = weekEnd.toLocaleDateString('en-US', { month: 'short' })\n\n if (startMonth === endMonth) {\n return `${startMonth} ${weekStart.getDate()} - ${weekEnd.getDate()}, ${weekStart.getFullYear()}`\n }\n\n return `${startMonth} ${weekStart.getDate()} - ${endMonth} ${weekEnd.getDate()}, ${weekStart.getFullYear()}`\n}\n\n// ============================================================================\n// Display Formatting\n// ============================================================================\n\n/**\n * Format a date string for display with full weekday\n * @example \"Monday, December 15, 2024\"\n */\nexport function formatFullDate(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })\n}\n\n/**\n * Format date for display in long form\n * @example \"Monday, 9 December\"\n */\nexport function formatDateLong(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return date.toLocaleDateString('en-GB', {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n })\n}\n\n/**\n * Format month and year\n * @example \"December 2024\"\n */\nexport function formatMonthYear(date: Date): string {\n return date.toLocaleDateString('en-US', {\n month: 'long',\n year: 'numeric',\n })\n}\n\n/**\n * Format a date/time to HH:MM format\n * Use this for formatting Date objects or ISO strings to time display\n * @example formatTimeHHMM(new Date()) => \"14:30\"\n *\n * Note: For formatting seconds (e.g., timer display), use formatTime from utils\n */\nexport function formatTimeHHMM(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n}\n\n/**\n * Format a date/time to HH:MM:SS format\n */\nexport function formatTimeWithSeconds(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\n// ============================================================================\n// Contextual Formatting\n// ============================================================================\n\n/**\n * Format a date string for display as a header\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n */\nexport function formatDateHeader(dateStr: string): string {\n const today = getTodayString()\n\n if (dateStr < today) {\n return 'Overdue'\n }\n\n if (dateStr === today) {\n return 'Today'\n }\n\n const tomorrowStr = getTomorrowString()\n if (dateStr === tomorrowStr) {\n return 'Tomorrow'\n }\n\n const date = parseLocalDate(dateStr)\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'short',\n day: 'numeric',\n })\n}\n\n/**\n * Format a due date for display in task items (simple string version)\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n *\n * Note: For version that returns { text, isOverdue }, use formatDueDate from utils/formatters\n */\nexport function formatDueDateString(dateStr: string | null): string {\n if (!dateStr) return 'No due date'\n\n const today = getTodayString()\n const tomorrowStr = getTomorrowString()\n\n if (dateStr < today) {\n const date = parseLocalDate(dateStr)\n return `Overdue • ${date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`\n }\n\n if (dateStr === today) {\n return 'Today'\n }\n\n if (dateStr === tomorrowStr) {\n return 'Tomorrow'\n }\n\n const date = parseLocalDate(dateStr)\n const currentYear = new Date().getFullYear()\n const dateYear = date.getFullYear()\n\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: dateYear !== currentYear ? 'numeric' : undefined,\n })\n}\n\n/**\n * Format a date/time as relative time string (extended version)\n * Accepts both Date objects and ISO strings\n * @example \"Just now\", \"5m ago\", \"2h ago\", \"3d ago\"\n *\n * Note: For simple string input, you can also use formatRelativeTime from utils/formatters\n */\nexport function formatRelativeTimeExtended(dateStr: string | Date): string {\n const date = typeof dateStr === 'string' ? new Date(dateStr) : dateStr\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'Just now'\n if (diffMins < 60) return `${diffMins}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n if (diffDays < 7) return `${diffDays}d ago`\n return date.toLocaleDateString()\n}\n\n/**\n * Format a due date relative to today with contextual prefix\n * @example \"Due today\", \"Due tomorrow\", \"Due in 3 days\", \"2 days overdue\"\n */\nexport function formatRelativeDueDate(\n dateStr: string,\n options?: {\n duePrefix?: string\n overduePrefix?: string\n }\n): string {\n const { duePrefix = 'Due', overduePrefix = '' } = options || {}\n const date = parseLocalDate(dateStr)\n const now = normalizeToMidnight(new Date())\n\n const diffMs = date.getTime() - now.getTime()\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24))\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays)\n return overduePrefix\n ? `${overduePrefix} ${absDays} day${absDays !== 1 ? 's' : ''} overdue`\n : `${absDays} day${absDays !== 1 ? 's' : ''} overdue`\n }\n if (diffDays === 0) return `${duePrefix} today`\n if (diffDays === 1) return `${duePrefix} tomorrow`\n if (diffDays <= 7) return `${duePrefix} in ${diffDays} days`\n\n return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' })\n}\n\n/**\n * Format a pay/income date relative to today\n * @example \"Today\", \"Tomorrow\", \"In 3 days\", \"2 days ago\"\n */\nexport function formatRelativePayDate(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n const now = normalizeToMidnight(new Date())\n\n const diffMs = date.getTime() - now.getTime()\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24))\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays)\n return `${absDays} day${absDays !== 1 ? 's' : ''} ago`\n }\n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Tomorrow'\n if (diffDays <= 7) return `In ${diffDays} days`\n\n return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' })\n}\n\n// ============================================================================\n// Localized Formatting\n// ============================================================================\n\nexport type DateFormat = 'short' | 'medium' | 'long' | 'weekday'\nexport type TimeFormat = 'short' | 'withSeconds'\n\n/**\n * Format a date with various preset formats\n */\nexport function formatDateLocalized(date: Date | string, format: DateFormat = 'medium'): string {\n const d = typeof date === 'string' ? new Date(date) : date\n\n switch (format) {\n case 'short':\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n case 'medium':\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })\n case 'long':\n return d.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n case 'weekday':\n return d.toLocaleDateString('en-US', { weekday: 'short' })\n default:\n return d.toLocaleDateString()\n }\n}\n\n/**\n * Format a time with various preset formats\n */\nexport function formatTimeLocalized(date: Date | string, format: TimeFormat = 'short'): string {\n const d = typeof date === 'string' ? new Date(date) : date\n\n switch (format) {\n case 'short':\n return d.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: true })\n case 'withSeconds':\n return d.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: true,\n })\n default:\n return d.toLocaleTimeString()\n }\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBO,SAAS,oBAAoB,MAAkB;AACpD,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,IAAE,SAAS,GAAG,GAAG,GAAG,CAAC;AACrB,SAAO;AACT;AAKO,SAAS,mBAAyB;AACvC,SAAO,oBAAoB,oBAAI,KAAK,CAAC;AACvC;AAMO,SAAS,iBAAiB,MAAoB;AACnD,SAAO,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACzH;AAKO,SAAS,iBAAyB;AACvC,SAAO,iBAAiB,oBAAI,KAAK,CAAC;AACpC;AAMO,SAAS,eAAe,SAAuB;AACpD,SAAO,oBAAI,KAAK,UAAU,WAAW;AACvC;AASO,SAAS,QAAQ,SAAiC;AACvD,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,YAAY,eAAe;AACpC;AAKO,SAAS,UAAU,SAAiC;AACzD,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,UAAU,eAAe;AAClC;AAOO,SAAS,UAAU,SAAwB,gBAAwB,GAAY;AACpF,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,UAAU,OAAO,EAAG,QAAO;AAE/B,QAAM,QAAQ,iBAAiB;AAC/B,QAAM,aAAa,eAAe,OAAO;AACzC,QAAM,SAAS,WAAW,QAAQ,IAAI,MAAM,QAAQ;AACpD,QAAM,WAAW,KAAK,KAAK,UAAU,MAAO,KAAK,KAAK,GAAG;AAEzD,SAAO,YAAY,KAAK,YAAY;AACtC;AAYO,SAAS,QAAQ,SAAiB,MAAsB;AAC7D,QAAM,OAAO,eAAe,OAAO;AACnC,OAAK,QAAQ,KAAK,QAAQ,IAAI,IAAI;AAClC,SAAO,iBAAiB,IAAI;AAC9B;AAKO,SAAS,aAAa,SAAiB,MAAsB;AAClE,SAAO,QAAQ,SAAS,CAAC,IAAI;AAC/B;AAKO,SAAS,qBAA6B;AAC3C,SAAO,aAAa,eAAe,GAAG,CAAC;AACzC;AAKO,SAAS,oBAA4B;AAC1C,SAAO,QAAQ,eAAe,GAAG,CAAC;AACpC;AAWO,SAAS,iBAAiB,SAAyB;AACxD,QAAM,OAAO,eAAe,OAAO;AACnC,SAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ,CAAC,EAAE,YAAY;AACnF;AAOO,SAAS,eAAe,SAAyB;AACtD,QAAM,OAAO,eAAe,OAAO;AACnC,SAAO,IAAI;AAAA,IACT,KAAK,YAAY;AAAA,IACjB,KAAK,SAAS;AAAA,IACd,KAAK,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,YAAY;AAChB;AASO,SAAS,aAAa,MAAkB;AAC7C,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,QAAM,MAAM,EAAE,OAAO;AACrB,QAAM,OAAO,EAAE,QAAQ,IAAI,OAAO,QAAQ,IAAI,KAAK;AACnD,IAAE,QAAQ,IAAI;AACd,IAAE,SAAS,GAAG,GAAG,GAAG,CAAC;AACrB,SAAO;AACT;AAKO,SAAS,WAAW,WAAuB;AAChD,QAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,IAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,SAAO;AACT;AAKO,SAAS,gBAAgB,WAAuB;AACrD,QAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,IAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,SAAO;AACT;AAKO,SAAS,YAAY,WAAuB;AACjD,QAAM,IAAI,IAAI,KAAK,SAAS;AAC5B,IAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC;AACzB,SAAO;AACT;AAKO,SAAS,mBAAmB,WAAiB,oBAAI,KAAK,GAAW;AACtE,SAAO,iBAAiB,aAAa,QAAQ,CAAC;AAChD;AAKO,SAAS,iBAAiB,WAAiB,oBAAI,KAAK,GAAW;AACpE,SAAO,iBAAiB,WAAW,aAAa,QAAQ,CAAC,CAAC;AAC5D;AAMO,SAAS,gBAAgB,WAAyB;AACvD,QAAM,UAAU,WAAW,SAAS;AACpC,QAAM,aAAa,UAAU,mBAAmB,SAAS,EAAE,OAAO,QAAQ,CAAC;AAC3E,QAAM,WAAW,QAAQ,mBAAmB,SAAS,EAAE,OAAO,QAAQ,CAAC;AAEvE,MAAI,eAAe,UAAU;AAC3B,WAAO,GAAG,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,QAAQ,QAAQ,CAAC,KAAK,UAAU,YAAY,CAAC;AAAA,EAChG;AAEA,SAAO,GAAG,UAAU,IAAI,UAAU,QAAQ,CAAC,MAAM,QAAQ,IAAI,QAAQ,QAAQ,CAAC,KAAK,UAAU,YAAY,CAAC;AAC5G;AAUO,SAAS,eAAe,SAAyB;AACtD,QAAM,OAAO,eAAe,OAAO;AACnC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AACH;AAMO,SAAS,eAAe,SAAyB;AACtD,QAAM,OAAO,eAAe,OAAO;AACnC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,SAAS;AAAA,IACT,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AACH;AAMO,SAAS,gBAAgB,MAAoB;AAClD,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACH;AASO,SAAS,eAAe,MAA6B;AAC1D,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,SAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC;AACxE;AAKO,SAAS,sBAAsB,MAA6B;AACjE,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,SAAO,EAAE,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,WAAW,QAAQ,UAAU,CAAC;AAC3F;AAUO,SAAS,iBAAiB,SAAyB;AACxD,QAAM,QAAQ,eAAe;AAE7B,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,kBAAkB;AACtC,MAAI,YAAY,aAAa;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,eAAe,OAAO;AACnC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AACH;AAQO,SAAS,oBAAoB,SAAgC;AAClE,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,eAAe;AAC7B,QAAM,cAAc,kBAAkB;AAEtC,MAAI,UAAU,OAAO;AACnB,UAAMA,QAAO,eAAe,OAAO;AACnC,WAAO,kBAAaA,MAAK,mBAAmB,SAAS,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC,CAAC;AAAA,EAC1F;AAEA,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,aAAa;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,eAAe,OAAO;AACnC,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,WAAW,KAAK,YAAY;AAElC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM,aAAa,cAAc,YAAY;AAAA,EAC/C,CAAC;AACH;AASO,SAAS,2BAA2B,SAAgC;AACzE,QAAM,OAAO,OAAO,YAAY,WAAW,IAAI,KAAK,OAAO,IAAI;AAC/D,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAC5C,QAAM,WAAW,KAAK,MAAM,SAAS,GAAK;AAC1C,QAAM,YAAY,KAAK,MAAM,WAAW,EAAE;AAC1C,QAAM,WAAW,KAAK,MAAM,YAAY,EAAE;AAE1C,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,WAAW,GAAI,QAAO,GAAG,QAAQ;AACrC,MAAI,YAAY,GAAI,QAAO,GAAG,SAAS;AACvC,MAAI,WAAW,EAAG,QAAO,GAAG,QAAQ;AACpC,SAAO,KAAK,mBAAmB;AACjC;AAMO,SAAS,sBACd,SACA,SAIQ;AACR,QAAM,EAAE,YAAY,OAAO,gBAAgB,GAAG,IAAI,WAAW,CAAC;AAC9D,QAAM,OAAO,eAAe,OAAO;AACnC,QAAM,MAAM,oBAAoB,oBAAI,KAAK,CAAC;AAE1C,QAAM,SAAS,KAAK,QAAQ,IAAI,IAAI,QAAQ;AAC5C,QAAM,WAAW,KAAK,MAAM,UAAU,MAAO,KAAK,KAAK,GAAG;AAE1D,MAAI,WAAW,GAAG;AAChB,UAAM,UAAU,KAAK,IAAI,QAAQ;AACjC,WAAO,gBACH,GAAG,aAAa,IAAI,OAAO,OAAO,YAAY,IAAI,MAAM,EAAE,aAC1D,GAAG,OAAO,OAAO,YAAY,IAAI,MAAM,EAAE;AAAA,EAC/C;AACA,MAAI,aAAa,EAAG,QAAO,GAAG,SAAS;AACvC,MAAI,aAAa,EAAG,QAAO,GAAG,SAAS;AACvC,MAAI,YAAY,EAAG,QAAO,GAAG,SAAS,OAAO,QAAQ;AAErD,SAAO,KAAK,mBAAmB,SAAS,EAAE,KAAK,WAAW,OAAO,QAAQ,CAAC;AAC5E;AAMO,SAAS,sBAAsB,SAAyB;AAC7D,QAAM,OAAO,eAAe,OAAO;AACnC,QAAM,MAAM,oBAAoB,oBAAI,KAAK,CAAC;AAE1C,QAAM,SAAS,KAAK,QAAQ,IAAI,IAAI,QAAQ;AAC5C,QAAM,WAAW,KAAK,MAAM,UAAU,MAAO,KAAK,KAAK,GAAG;AAE1D,MAAI,WAAW,GAAG;AAChB,UAAM,UAAU,KAAK,IAAI,QAAQ;AACjC,WAAO,GAAG,OAAO,OAAO,YAAY,IAAI,MAAM,EAAE;AAAA,EAClD;AACA,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,aAAa,EAAG,QAAO;AAC3B,MAAI,YAAY,EAAG,QAAO,MAAM,QAAQ;AAExC,SAAO,KAAK,mBAAmB,SAAS,EAAE,KAAK,WAAW,OAAO,QAAQ,CAAC;AAC5E;AAYO,SAAS,oBAAoB,MAAqB,SAAqB,UAAkB;AAC9F,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AAEtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,mBAAmB,SAAS,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,IACzE,KAAK;AACH,aAAO,EAAE,mBAAmB,SAAS,EAAE,OAAO,SAAS,KAAK,WAAW,MAAM,UAAU,CAAC;AAAA,IAC1F,KAAK;AACH,aAAO,EAAE,mBAAmB,SAAS;AAAA,QACnC,SAAS;AAAA,QACT,OAAO;AAAA,QACP,KAAK;AAAA,QACL,MAAM;AAAA,MACR,CAAC;AAAA,IACH,KAAK;AACH,aAAO,EAAE,mBAAmB,SAAS,EAAE,SAAS,QAAQ,CAAC;AAAA,IAC3D;AACE,aAAO,EAAE,mBAAmB;AAAA,EAChC;AACF;AAKO,SAAS,oBAAoB,MAAqB,SAAqB,SAAiB;AAC7F,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AAEtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,EAAE,mBAAmB,SAAS,EAAE,MAAM,WAAW,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAAA,IAC3F,KAAK;AACH,aAAO,EAAE,mBAAmB,SAAS;AAAA,QACnC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACE,aAAO,EAAE,mBAAmB;AAAA,EAChC;AACF;","names":["date"]}
|
|
1
|
+
{"version":3,"sources":["../../src/date/index.ts"],"sourcesContent":["/**\n * Date Utilities\n *\n * Pure functions for date manipulation and formatting.\n * Works in both Node.js and browser/React Native environments.\n *\n * @example\n * import { getTodayString, addDays, formatRelativeTime } from '@mrck-labs/vanaheim-shared/date'\n *\n * const today = getTodayString() // \"2024-12-16\"\n * const nextWeek = addDays(today, 7) // \"2024-12-23\"\n */\n\n// ============================================================================\n// Core Utilities\n// ============================================================================\n\n/**\n * Normalize a date to midnight (00:00:00.000)\n */\nexport function normalizeToMidnight(date: Date): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * Get today's date normalized to midnight\n */\nexport function getTodayMidnight(): Date {\n return normalizeToMidnight(new Date());\n}\n\n/**\n * Format a Date object to YYYY-MM-DD string\n * @example formatDateString(new Date()) => \"2024-12-16\"\n */\nexport function formatDateString(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}-${String(date.getDate()).padStart(2, \"0\")}`;\n}\n\n/**\n * Get today's local date string (YYYY-MM-DD)\n */\nexport function getTodayString(): string {\n return formatDateString(new Date());\n}\n\n/**\n * Parse a YYYY-MM-DD string to a local Date object\n * Avoids timezone issues by appending T00:00:00\n */\nexport function parseLocalDate(dateStr: string): Date {\n return new Date(dateStr + \"T00:00:00\");\n}\n\n// ============================================================================\n// Date Checks\n// ============================================================================\n\n/**\n * Check if a date string is today\n */\nexport function isToday(dateStr: string | null): boolean {\n if (!dateStr) return false;\n return dateStr === getTodayString();\n}\n\n/**\n * Check if a date string is in the past (before today)\n */\nexport function isOverdue(dateStr: string | null): boolean {\n if (!dateStr) return false;\n return dateStr < getTodayString();\n}\n\n/**\n * Check if a date is due within a threshold of days\n * @param dateStr - Date in YYYY-MM-DD format\n * @param daysThreshold - Number of days to check (default: 7)\n */\nexport function isDueSoon(\n dateStr: string | null,\n daysThreshold: number = 7\n): boolean {\n if (!dateStr) return false;\n if (isOverdue(dateStr)) return false;\n\n const today = getTodayMidnight();\n const targetDate = parseLocalDate(dateStr);\n const diffMs = targetDate.getTime() - today.getTime();\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n return diffDays >= 0 && diffDays <= daysThreshold;\n}\n\n// ============================================================================\n// Date Arithmetic\n// ============================================================================\n\n/**\n * Add days to a date string\n * @param dateStr - Date in YYYY-MM-DD format\n * @param days - Number of days to add (can be negative)\n * @returns New date string in YYYY-MM-DD format\n */\nexport function addDays(dateStr: string, days: number): string {\n const date = parseLocalDate(dateStr);\n date.setDate(date.getDate() + days);\n return formatDateString(date);\n}\n\n/**\n * Subtract days from a date string\n */\nexport function subtractDays(dateStr: string, days: number): string {\n return addDays(dateStr, -days);\n}\n\n/**\n * Get yesterday's date string (YYYY-MM-DD)\n */\nexport function getYesterdayString(): string {\n return subtractDays(getTodayString(), 1);\n}\n\n/**\n * Get tomorrow's date string (YYYY-MM-DD)\n */\nexport function getTomorrowString(): string {\n return addDays(getTodayString(), 1);\n}\n\n// ============================================================================\n// ISO String Helpers (for database queries)\n// ============================================================================\n\n/**\n * Get start of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T00:00:00.000Z\"\n */\nexport function getStartOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n ).toISOString();\n}\n\n/**\n * Get end of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T23:59:59.999Z\"\n */\nexport function getEndOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n 23,\n 59,\n 59,\n 999\n ).toISOString();\n}\n\n// ============================================================================\n// Week Utilities\n// ============================================================================\n\n/**\n * Get the start of the week (Monday) for a given date\n */\nexport function getWeekStart(date: Date): Date {\n const d = new Date(date);\n const day = d.getDay();\n const diff = d.getDate() - day + (day === 0 ? -6 : 1); // Monday\n d.setDate(diff);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * Get the end of the week (Sunday) for a given week start\n */\nexport function getWeekEnd(weekStart: Date): Date {\n const d = new Date(weekStart);\n d.setDate(d.getDate() + 6);\n return d;\n}\n\n/**\n * Get the start of the previous week\n */\nexport function getPreviousWeek(weekStart: Date): Date {\n const d = new Date(weekStart);\n d.setDate(d.getDate() - 7);\n return d;\n}\n\n/**\n * Get the start of the next week\n */\nexport function getNextWeek(weekStart: Date): Date {\n const d = new Date(weekStart);\n d.setDate(d.getDate() + 7);\n return d;\n}\n\n/**\n * Get start of week (Monday) as date string\n */\nexport function getWeekStartString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekStart(baseDate));\n}\n\n/**\n * Get end of week (Sunday) as date string\n */\nexport function getWeekEndString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekEnd(getWeekStart(baseDate)));\n}\n\n/**\n * Get all dates in a week as an array of date strings\n * @param weekStart - Start of the week (Monday) in YYYY-MM-DD format\n * @returns Array of 7 date strings from Monday to Sunday\n * @example getWeekDates(\"2024-12-16\") => [\"2024-12-16\", \"2024-12-17\", ..., \"2024-12-22\"]\n */\nexport function getWeekDates(weekStart: string): string[] {\n const dates: string[] = [];\n for (let i = 0; i < 7; i++) {\n dates.push(addDays(weekStart, i));\n }\n return dates;\n}\n\n/**\n * Get all dates in a week as Date objects\n * @param weekStart - Start of the week (Monday) as Date\n * @returns Array of 7 Date objects from Monday to Sunday\n */\nexport function getWeekDatesAsObjects(weekStart: Date): Date[] {\n const dates: Date[] = [];\n for (let i = 0; i < 7; i++) {\n const day = new Date(weekStart);\n day.setDate(day.getDate() + i);\n dates.push(day);\n }\n return dates;\n}\n\n/**\n * Format a week range for display\n * @example \"Dec 2 - 8, 2024\" or \"Nov 25 - Dec 1, 2024\"\n */\nexport function formatWeekRange(weekStart: Date): string {\n const weekEnd = getWeekEnd(weekStart);\n const startMonth = weekStart.toLocaleDateString(\"en-US\", { month: \"short\" });\n const endMonth = weekEnd.toLocaleDateString(\"en-US\", { month: \"short\" });\n\n if (startMonth === endMonth) {\n return `${startMonth} ${weekStart.getDate()} - ${weekEnd.getDate()}, ${weekStart.getFullYear()}`;\n }\n\n return `${startMonth} ${weekStart.getDate()} - ${endMonth} ${weekEnd.getDate()}, ${weekStart.getFullYear()}`;\n}\n\n// ============================================================================\n// Display Formatting\n// ============================================================================\n\n/**\n * Format a date string for display with full weekday\n * @example \"Monday, December 15, 2024\"\n */\nexport function formatFullDate(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\n/**\n * Format date for display in long form\n * @example \"Monday, 9 December\"\n */\nexport function formatDateLong(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return date.toLocaleDateString(\"en-GB\", {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n });\n}\n\n/**\n * Format month and year\n * @example \"December 2024\"\n */\nexport function formatMonthYear(date: Date): string {\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format a date/time to HH:MM format\n * Use this for formatting Date objects or ISO strings to time display\n * @example formatTimeHHMM(new Date()) => \"14:30\"\n *\n * Note: For formatting seconds (e.g., timer display), use formatTime from utils\n */\nexport function formatTimeHHMM(date: Date | string): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\n/**\n * Format time in short format (12h without seconds)\n * @example formatTimeShort(new Date()) => \"2:30 PM\"\n */\nexport function formatTimeShort(date: Date | string): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/**\n * Format a Date object for display in readable format\n * @example formatDateDisplay(new Date()) => \"Monday, Dec 22\"\n */\nexport function formatDateDisplay(date: Date): string {\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Format a date/time to HH:MM:SS format\n */\nexport function formatTimeWithSeconds(date: Date | string): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\n// ============================================================================\n// Contextual Formatting\n// ============================================================================\n\n/**\n * Format a date string for display as a header\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n */\nexport function formatDateHeader(dateStr: string): string {\n const today = getTodayString();\n\n if (dateStr < today) {\n return \"Overdue\";\n }\n\n if (dateStr === today) {\n return \"Today\";\n }\n\n const tomorrowStr = getTomorrowString();\n if (dateStr === tomorrowStr) {\n return \"Tomorrow\";\n }\n\n const date = parseLocalDate(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Format a due date for display in task items (simple string version)\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n *\n * Note: For version that returns { text, isOverdue }, use formatDueDate from utils/formatters\n */\nexport function formatDueDateString(dateStr: string | null): string {\n if (!dateStr) return \"No due date\";\n\n const today = getTodayString();\n const tomorrowStr = getTomorrowString();\n\n if (dateStr < today) {\n const date = parseLocalDate(dateStr);\n return `Overdue • ${date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n })}`;\n }\n\n if (dateStr === today) {\n return \"Today\";\n }\n\n if (dateStr === tomorrowStr) {\n return \"Tomorrow\";\n }\n\n const date = parseLocalDate(dateStr);\n const currentYear = new Date().getFullYear();\n const dateYear = date.getFullYear();\n\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: dateYear !== currentYear ? \"numeric\" : undefined,\n });\n}\n\n/**\n * Format a date/time as relative time string (extended version)\n * Accepts both Date objects and ISO strings\n * @example \"Just now\", \"5m ago\", \"2h ago\", \"3d ago\"\n *\n * Note: For simple string input, you can also use formatRelativeTime from utils/formatters\n */\nexport function formatRelativeTimeExtended(dateStr: string | Date): string {\n const date = typeof dateStr === \"string\" ? new Date(dateStr) : dateStr;\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n}\n\n/**\n * Format a due date relative to today with contextual prefix\n * @example \"Due today\", \"Due tomorrow\", \"Due in 3 days\", \"2 days overdue\"\n */\nexport function formatRelativeDueDate(\n dateStr: string,\n options?: {\n duePrefix?: string;\n overduePrefix?: string;\n }\n): string {\n const { duePrefix = \"Due\", overduePrefix = \"\" } = options || {};\n const date = parseLocalDate(dateStr);\n const now = normalizeToMidnight(new Date());\n\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays);\n return overduePrefix\n ? `${overduePrefix} ${absDays} day${absDays !== 1 ? \"s\" : \"\"} overdue`\n : `${absDays} day${absDays !== 1 ? \"s\" : \"\"} overdue`;\n }\n if (diffDays === 0) return `${duePrefix} today`;\n if (diffDays === 1) return `${duePrefix} tomorrow`;\n if (diffDays <= 7) return `${duePrefix} in ${diffDays} days`;\n\n return date.toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\n}\n\n/**\n * Format a pay/income date relative to today\n * @example \"Today\", \"Tomorrow\", \"In 3 days\", \"2 days ago\"\n */\nexport function formatRelativePayDate(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n const now = normalizeToMidnight(new Date());\n\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays);\n return `${absDays} day${absDays !== 1 ? \"s\" : \"\"} ago`;\n }\n if (diffDays === 0) return \"Today\";\n if (diffDays === 1) return \"Tomorrow\";\n if (diffDays <= 7) return `In ${diffDays} days`;\n\n return date.toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\n}\n\n// ============================================================================\n// Localized Formatting\n// ============================================================================\n\nexport type DateFormat = \"short\" | \"medium\" | \"long\" | \"weekday\";\nexport type TimeFormat = \"short\" | \"withSeconds\";\n\n/**\n * Format a date with various preset formats\n */\nexport function formatDateLocalized(\n date: Date | string,\n format: DateFormat = \"medium\"\n): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n\n switch (format) {\n case \"short\":\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n case \"medium\":\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n case \"long\":\n return d.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n case \"weekday\":\n return d.toLocaleDateString(\"en-US\", { weekday: \"short\" });\n default:\n return d.toLocaleDateString();\n }\n}\n\n/**\n * Format a time with various preset formats\n */\nexport function formatTimeLocalized(\n date: Date | string,\n format: TimeFormat = \"short\"\n): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n\n switch (format) {\n case \"short\":\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n });\n case \"withSeconds\":\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n });\n default:\n return d.toLocaleTimeString();\n }\n}\n"],"mappings":"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","names":["date"]}
|
package/dist/date/index.mjs
CHANGED
|
@@ -8,7 +8,10 @@ function getTodayMidnight() {
|
|
|
8
8
|
return normalizeToMidnight(/* @__PURE__ */ new Date());
|
|
9
9
|
}
|
|
10
10
|
function formatDateString(date) {
|
|
11
|
-
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
|
|
11
|
+
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(
|
|
12
|
+
2,
|
|
13
|
+
"0"
|
|
14
|
+
)}-${String(date.getDate()).padStart(2, "0")}`;
|
|
12
15
|
}
|
|
13
16
|
function getTodayString() {
|
|
14
17
|
return formatDateString(/* @__PURE__ */ new Date());
|
|
@@ -49,7 +52,11 @@ function getTomorrowString() {
|
|
|
49
52
|
}
|
|
50
53
|
function getStartOfDayISO(dateStr) {
|
|
51
54
|
const date = parseLocalDate(dateStr);
|
|
52
|
-
return new Date(
|
|
55
|
+
return new Date(
|
|
56
|
+
date.getFullYear(),
|
|
57
|
+
date.getMonth(),
|
|
58
|
+
date.getDate()
|
|
59
|
+
).toISOString();
|
|
53
60
|
}
|
|
54
61
|
function getEndOfDayISO(dateStr) {
|
|
55
62
|
const date = parseLocalDate(dateStr);
|
|
@@ -92,6 +99,22 @@ function getWeekStartString(baseDate = /* @__PURE__ */ new Date()) {
|
|
|
92
99
|
function getWeekEndString(baseDate = /* @__PURE__ */ new Date()) {
|
|
93
100
|
return formatDateString(getWeekEnd(getWeekStart(baseDate)));
|
|
94
101
|
}
|
|
102
|
+
function getWeekDates(weekStart) {
|
|
103
|
+
const dates = [];
|
|
104
|
+
for (let i = 0; i < 7; i++) {
|
|
105
|
+
dates.push(addDays(weekStart, i));
|
|
106
|
+
}
|
|
107
|
+
return dates;
|
|
108
|
+
}
|
|
109
|
+
function getWeekDatesAsObjects(weekStart) {
|
|
110
|
+
const dates = [];
|
|
111
|
+
for (let i = 0; i < 7; i++) {
|
|
112
|
+
const day = new Date(weekStart);
|
|
113
|
+
day.setDate(day.getDate() + i);
|
|
114
|
+
dates.push(day);
|
|
115
|
+
}
|
|
116
|
+
return dates;
|
|
117
|
+
}
|
|
95
118
|
function formatWeekRange(weekStart) {
|
|
96
119
|
const weekEnd = getWeekEnd(weekStart);
|
|
97
120
|
const startMonth = weekStart.toLocaleDateString("en-US", { month: "short" });
|
|
@@ -128,9 +151,24 @@ function formatTimeHHMM(date) {
|
|
|
128
151
|
const d = typeof date === "string" ? new Date(date) : date;
|
|
129
152
|
return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
130
153
|
}
|
|
154
|
+
function formatTimeShort(date) {
|
|
155
|
+
const d = typeof date === "string" ? new Date(date) : date;
|
|
156
|
+
return d.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit" });
|
|
157
|
+
}
|
|
158
|
+
function formatDateDisplay(date) {
|
|
159
|
+
return date.toLocaleDateString("en-US", {
|
|
160
|
+
weekday: "long",
|
|
161
|
+
month: "short",
|
|
162
|
+
day: "numeric"
|
|
163
|
+
});
|
|
164
|
+
}
|
|
131
165
|
function formatTimeWithSeconds(date) {
|
|
132
166
|
const d = typeof date === "string" ? new Date(date) : date;
|
|
133
|
-
return d.toLocaleTimeString([], {
|
|
167
|
+
return d.toLocaleTimeString([], {
|
|
168
|
+
hour: "2-digit",
|
|
169
|
+
minute: "2-digit",
|
|
170
|
+
second: "2-digit"
|
|
171
|
+
});
|
|
134
172
|
}
|
|
135
173
|
function formatDateHeader(dateStr) {
|
|
136
174
|
const today = getTodayString();
|
|
@@ -157,7 +195,10 @@ function formatDueDateString(dateStr) {
|
|
|
157
195
|
const tomorrowStr = getTomorrowString();
|
|
158
196
|
if (dateStr < today) {
|
|
159
197
|
const date2 = parseLocalDate(dateStr);
|
|
160
|
-
return `Overdue \u2022 ${date2.toLocaleDateString("en-US", {
|
|
198
|
+
return `Overdue \u2022 ${date2.toLocaleDateString("en-US", {
|
|
199
|
+
month: "short",
|
|
200
|
+
day: "numeric"
|
|
201
|
+
})}`;
|
|
161
202
|
}
|
|
162
203
|
if (dateStr === today) {
|
|
163
204
|
return "Today";
|
|
@@ -222,7 +263,11 @@ function formatDateLocalized(date, format = "medium") {
|
|
|
222
263
|
case "short":
|
|
223
264
|
return d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
|
|
224
265
|
case "medium":
|
|
225
|
-
return d.toLocaleDateString("en-US", {
|
|
266
|
+
return d.toLocaleDateString("en-US", {
|
|
267
|
+
month: "short",
|
|
268
|
+
day: "numeric",
|
|
269
|
+
year: "numeric"
|
|
270
|
+
});
|
|
226
271
|
case "long":
|
|
227
272
|
return d.toLocaleDateString("en-US", {
|
|
228
273
|
weekday: "long",
|
|
@@ -240,7 +285,11 @@ function formatTimeLocalized(date, format = "short") {
|
|
|
240
285
|
const d = typeof date === "string" ? new Date(date) : date;
|
|
241
286
|
switch (format) {
|
|
242
287
|
case "short":
|
|
243
|
-
return d.toLocaleTimeString("en-US", {
|
|
288
|
+
return d.toLocaleTimeString("en-US", {
|
|
289
|
+
hour: "2-digit",
|
|
290
|
+
minute: "2-digit",
|
|
291
|
+
hour12: true
|
|
292
|
+
});
|
|
244
293
|
case "withSeconds":
|
|
245
294
|
return d.toLocaleTimeString("en-US", {
|
|
246
295
|
hour: "2-digit",
|
|
@@ -254,6 +303,7 @@ function formatTimeLocalized(date, format = "short") {
|
|
|
254
303
|
}
|
|
255
304
|
export {
|
|
256
305
|
addDays,
|
|
306
|
+
formatDateDisplay,
|
|
257
307
|
formatDateHeader,
|
|
258
308
|
formatDateLocalized,
|
|
259
309
|
formatDateLong,
|
|
@@ -266,6 +316,7 @@ export {
|
|
|
266
316
|
formatRelativeTimeExtended,
|
|
267
317
|
formatTimeHHMM,
|
|
268
318
|
formatTimeLocalized,
|
|
319
|
+
formatTimeShort,
|
|
269
320
|
formatTimeWithSeconds,
|
|
270
321
|
formatWeekRange,
|
|
271
322
|
getEndOfDayISO,
|
|
@@ -275,6 +326,8 @@ export {
|
|
|
275
326
|
getTodayMidnight,
|
|
276
327
|
getTodayString,
|
|
277
328
|
getTomorrowString,
|
|
329
|
+
getWeekDates,
|
|
330
|
+
getWeekDatesAsObjects,
|
|
278
331
|
getWeekEnd,
|
|
279
332
|
getWeekEndString,
|
|
280
333
|
getWeekStart,
|
package/dist/date/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/date/index.ts"],"sourcesContent":["/**\n * Date Utilities\n *\n * Pure functions for date manipulation and formatting.\n * Works in both Node.js and browser/React Native environments.\n *\n * @example\n * import { getTodayString, addDays, formatRelativeTime } from '@mrck-labs/vanaheim-shared/date'\n *\n * const today = getTodayString() // \"2024-12-16\"\n * const nextWeek = addDays(today, 7) // \"2024-12-23\"\n */\n\n// ============================================================================\n// Core Utilities\n// ============================================================================\n\n/**\n * Normalize a date to midnight (00:00:00.000)\n */\nexport function normalizeToMidnight(date: Date): Date {\n const d = new Date(date)\n d.setHours(0, 0, 0, 0)\n return d\n}\n\n/**\n * Get today's date normalized to midnight\n */\nexport function getTodayMidnight(): Date {\n return normalizeToMidnight(new Date())\n}\n\n/**\n * Format a Date object to YYYY-MM-DD string\n * @example formatDateString(new Date()) => \"2024-12-16\"\n */\nexport function formatDateString(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`\n}\n\n/**\n * Get today's local date string (YYYY-MM-DD)\n */\nexport function getTodayString(): string {\n return formatDateString(new Date())\n}\n\n/**\n * Parse a YYYY-MM-DD string to a local Date object\n * Avoids timezone issues by appending T00:00:00\n */\nexport function parseLocalDate(dateStr: string): Date {\n return new Date(dateStr + 'T00:00:00')\n}\n\n// ============================================================================\n// Date Checks\n// ============================================================================\n\n/**\n * Check if a date string is today\n */\nexport function isToday(dateStr: string | null): boolean {\n if (!dateStr) return false\n return dateStr === getTodayString()\n}\n\n/**\n * Check if a date string is in the past (before today)\n */\nexport function isOverdue(dateStr: string | null): boolean {\n if (!dateStr) return false\n return dateStr < getTodayString()\n}\n\n/**\n * Check if a date is due within a threshold of days\n * @param dateStr - Date in YYYY-MM-DD format\n * @param daysThreshold - Number of days to check (default: 7)\n */\nexport function isDueSoon(dateStr: string | null, daysThreshold: number = 7): boolean {\n if (!dateStr) return false\n if (isOverdue(dateStr)) return false\n\n const today = getTodayMidnight()\n const targetDate = parseLocalDate(dateStr)\n const diffMs = targetDate.getTime() - today.getTime()\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24))\n\n return diffDays >= 0 && diffDays <= daysThreshold\n}\n\n// ============================================================================\n// Date Arithmetic\n// ============================================================================\n\n/**\n * Add days to a date string\n * @param dateStr - Date in YYYY-MM-DD format\n * @param days - Number of days to add (can be negative)\n * @returns New date string in YYYY-MM-DD format\n */\nexport function addDays(dateStr: string, days: number): string {\n const date = parseLocalDate(dateStr)\n date.setDate(date.getDate() + days)\n return formatDateString(date)\n}\n\n/**\n * Subtract days from a date string\n */\nexport function subtractDays(dateStr: string, days: number): string {\n return addDays(dateStr, -days)\n}\n\n/**\n * Get yesterday's date string (YYYY-MM-DD)\n */\nexport function getYesterdayString(): string {\n return subtractDays(getTodayString(), 1)\n}\n\n/**\n * Get tomorrow's date string (YYYY-MM-DD)\n */\nexport function getTomorrowString(): string {\n return addDays(getTodayString(), 1)\n}\n\n// ============================================================================\n// ISO String Helpers (for database queries)\n// ============================================================================\n\n/**\n * Get start of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T00:00:00.000Z\"\n */\nexport function getStartOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).toISOString()\n}\n\n/**\n * Get end of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T23:59:59.999Z\"\n */\nexport function getEndOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n 23,\n 59,\n 59,\n 999\n ).toISOString()\n}\n\n// ============================================================================\n// Week Utilities\n// ============================================================================\n\n/**\n * Get the start of the week (Monday) for a given date\n */\nexport function getWeekStart(date: Date): Date {\n const d = new Date(date)\n const day = d.getDay()\n const diff = d.getDate() - day + (day === 0 ? -6 : 1) // Monday\n d.setDate(diff)\n d.setHours(0, 0, 0, 0)\n return d\n}\n\n/**\n * Get the end of the week (Sunday) for a given week start\n */\nexport function getWeekEnd(weekStart: Date): Date {\n const d = new Date(weekStart)\n d.setDate(d.getDate() + 6)\n return d\n}\n\n/**\n * Get the start of the previous week\n */\nexport function getPreviousWeek(weekStart: Date): Date {\n const d = new Date(weekStart)\n d.setDate(d.getDate() - 7)\n return d\n}\n\n/**\n * Get the start of the next week\n */\nexport function getNextWeek(weekStart: Date): Date {\n const d = new Date(weekStart)\n d.setDate(d.getDate() + 7)\n return d\n}\n\n/**\n * Get start of week (Monday) as date string\n */\nexport function getWeekStartString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekStart(baseDate))\n}\n\n/**\n * Get end of week (Sunday) as date string\n */\nexport function getWeekEndString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekEnd(getWeekStart(baseDate)))\n}\n\n/**\n * Format a week range for display\n * @example \"Dec 2 - 8, 2024\" or \"Nov 25 - Dec 1, 2024\"\n */\nexport function formatWeekRange(weekStart: Date): string {\n const weekEnd = getWeekEnd(weekStart)\n const startMonth = weekStart.toLocaleDateString('en-US', { month: 'short' })\n const endMonth = weekEnd.toLocaleDateString('en-US', { month: 'short' })\n\n if (startMonth === endMonth) {\n return `${startMonth} ${weekStart.getDate()} - ${weekEnd.getDate()}, ${weekStart.getFullYear()}`\n }\n\n return `${startMonth} ${weekStart.getDate()} - ${endMonth} ${weekEnd.getDate()}, ${weekStart.getFullYear()}`\n}\n\n// ============================================================================\n// Display Formatting\n// ============================================================================\n\n/**\n * Format a date string for display with full weekday\n * @example \"Monday, December 15, 2024\"\n */\nexport function formatFullDate(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })\n}\n\n/**\n * Format date for display in long form\n * @example \"Monday, 9 December\"\n */\nexport function formatDateLong(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n return date.toLocaleDateString('en-GB', {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n })\n}\n\n/**\n * Format month and year\n * @example \"December 2024\"\n */\nexport function formatMonthYear(date: Date): string {\n return date.toLocaleDateString('en-US', {\n month: 'long',\n year: 'numeric',\n })\n}\n\n/**\n * Format a date/time to HH:MM format\n * Use this for formatting Date objects or ISO strings to time display\n * @example formatTimeHHMM(new Date()) => \"14:30\"\n *\n * Note: For formatting seconds (e.g., timer display), use formatTime from utils\n */\nexport function formatTimeHHMM(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n}\n\n/**\n * Format a date/time to HH:MM:SS format\n */\nexport function formatTimeWithSeconds(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\n// ============================================================================\n// Contextual Formatting\n// ============================================================================\n\n/**\n * Format a date string for display as a header\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n */\nexport function formatDateHeader(dateStr: string): string {\n const today = getTodayString()\n\n if (dateStr < today) {\n return 'Overdue'\n }\n\n if (dateStr === today) {\n return 'Today'\n }\n\n const tomorrowStr = getTomorrowString()\n if (dateStr === tomorrowStr) {\n return 'Tomorrow'\n }\n\n const date = parseLocalDate(dateStr)\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'short',\n day: 'numeric',\n })\n}\n\n/**\n * Format a due date for display in task items (simple string version)\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n *\n * Note: For version that returns { text, isOverdue }, use formatDueDate from utils/formatters\n */\nexport function formatDueDateString(dateStr: string | null): string {\n if (!dateStr) return 'No due date'\n\n const today = getTodayString()\n const tomorrowStr = getTomorrowString()\n\n if (dateStr < today) {\n const date = parseLocalDate(dateStr)\n return `Overdue • ${date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}`\n }\n\n if (dateStr === today) {\n return 'Today'\n }\n\n if (dateStr === tomorrowStr) {\n return 'Tomorrow'\n }\n\n const date = parseLocalDate(dateStr)\n const currentYear = new Date().getFullYear()\n const dateYear = date.getFullYear()\n\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: dateYear !== currentYear ? 'numeric' : undefined,\n })\n}\n\n/**\n * Format a date/time as relative time string (extended version)\n * Accepts both Date objects and ISO strings\n * @example \"Just now\", \"5m ago\", \"2h ago\", \"3d ago\"\n *\n * Note: For simple string input, you can also use formatRelativeTime from utils/formatters\n */\nexport function formatRelativeTimeExtended(dateStr: string | Date): string {\n const date = typeof dateStr === 'string' ? new Date(dateStr) : dateStr\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) return 'Just now'\n if (diffMins < 60) return `${diffMins}m ago`\n if (diffHours < 24) return `${diffHours}h ago`\n if (diffDays < 7) return `${diffDays}d ago`\n return date.toLocaleDateString()\n}\n\n/**\n * Format a due date relative to today with contextual prefix\n * @example \"Due today\", \"Due tomorrow\", \"Due in 3 days\", \"2 days overdue\"\n */\nexport function formatRelativeDueDate(\n dateStr: string,\n options?: {\n duePrefix?: string\n overduePrefix?: string\n }\n): string {\n const { duePrefix = 'Due', overduePrefix = '' } = options || {}\n const date = parseLocalDate(dateStr)\n const now = normalizeToMidnight(new Date())\n\n const diffMs = date.getTime() - now.getTime()\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24))\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays)\n return overduePrefix\n ? `${overduePrefix} ${absDays} day${absDays !== 1 ? 's' : ''} overdue`\n : `${absDays} day${absDays !== 1 ? 's' : ''} overdue`\n }\n if (diffDays === 0) return `${duePrefix} today`\n if (diffDays === 1) return `${duePrefix} tomorrow`\n if (diffDays <= 7) return `${duePrefix} in ${diffDays} days`\n\n return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' })\n}\n\n/**\n * Format a pay/income date relative to today\n * @example \"Today\", \"Tomorrow\", \"In 3 days\", \"2 days ago\"\n */\nexport function formatRelativePayDate(dateStr: string): string {\n const date = parseLocalDate(dateStr)\n const now = normalizeToMidnight(new Date())\n\n const diffMs = date.getTime() - now.getTime()\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24))\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays)\n return `${absDays} day${absDays !== 1 ? 's' : ''} ago`\n }\n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Tomorrow'\n if (diffDays <= 7) return `In ${diffDays} days`\n\n return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short' })\n}\n\n// ============================================================================\n// Localized Formatting\n// ============================================================================\n\nexport type DateFormat = 'short' | 'medium' | 'long' | 'weekday'\nexport type TimeFormat = 'short' | 'withSeconds'\n\n/**\n * Format a date with various preset formats\n */\nexport function formatDateLocalized(date: Date | string, format: DateFormat = 'medium'): string {\n const d = typeof date === 'string' ? new Date(date) : date\n\n switch (format) {\n case 'short':\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n case 'medium':\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })\n case 'long':\n return d.toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n case 'weekday':\n return d.toLocaleDateString('en-US', { weekday: 'short' })\n default:\n return d.toLocaleDateString()\n }\n}\n\n/**\n * Format a time with various preset formats\n */\nexport function formatTimeLocalized(date: Date | string, format: TimeFormat = 'short'): string {\n const d = typeof date === 'string' ? new Date(date) : date\n\n switch (format) {\n case 'short':\n return d.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: true })\n case 'withSeconds':\n return d.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: true,\n })\n default:\n return d.toLocaleTimeString()\n }\n}\n\n"],"mappings":"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","names":["date"]}
|
|
1
|
+
{"version":3,"sources":["../../src/date/index.ts"],"sourcesContent":["/**\n * Date Utilities\n *\n * Pure functions for date manipulation and formatting.\n * Works in both Node.js and browser/React Native environments.\n *\n * @example\n * import { getTodayString, addDays, formatRelativeTime } from '@mrck-labs/vanaheim-shared/date'\n *\n * const today = getTodayString() // \"2024-12-16\"\n * const nextWeek = addDays(today, 7) // \"2024-12-23\"\n */\n\n// ============================================================================\n// Core Utilities\n// ============================================================================\n\n/**\n * Normalize a date to midnight (00:00:00.000)\n */\nexport function normalizeToMidnight(date: Date): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * Get today's date normalized to midnight\n */\nexport function getTodayMidnight(): Date {\n return normalizeToMidnight(new Date());\n}\n\n/**\n * Format a Date object to YYYY-MM-DD string\n * @example formatDateString(new Date()) => \"2024-12-16\"\n */\nexport function formatDateString(date: Date): string {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(\n 2,\n \"0\"\n )}-${String(date.getDate()).padStart(2, \"0\")}`;\n}\n\n/**\n * Get today's local date string (YYYY-MM-DD)\n */\nexport function getTodayString(): string {\n return formatDateString(new Date());\n}\n\n/**\n * Parse a YYYY-MM-DD string to a local Date object\n * Avoids timezone issues by appending T00:00:00\n */\nexport function parseLocalDate(dateStr: string): Date {\n return new Date(dateStr + \"T00:00:00\");\n}\n\n// ============================================================================\n// Date Checks\n// ============================================================================\n\n/**\n * Check if a date string is today\n */\nexport function isToday(dateStr: string | null): boolean {\n if (!dateStr) return false;\n return dateStr === getTodayString();\n}\n\n/**\n * Check if a date string is in the past (before today)\n */\nexport function isOverdue(dateStr: string | null): boolean {\n if (!dateStr) return false;\n return dateStr < getTodayString();\n}\n\n/**\n * Check if a date is due within a threshold of days\n * @param dateStr - Date in YYYY-MM-DD format\n * @param daysThreshold - Number of days to check (default: 7)\n */\nexport function isDueSoon(\n dateStr: string | null,\n daysThreshold: number = 7\n): boolean {\n if (!dateStr) return false;\n if (isOverdue(dateStr)) return false;\n\n const today = getTodayMidnight();\n const targetDate = parseLocalDate(dateStr);\n const diffMs = targetDate.getTime() - today.getTime();\n const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24));\n\n return diffDays >= 0 && diffDays <= daysThreshold;\n}\n\n// ============================================================================\n// Date Arithmetic\n// ============================================================================\n\n/**\n * Add days to a date string\n * @param dateStr - Date in YYYY-MM-DD format\n * @param days - Number of days to add (can be negative)\n * @returns New date string in YYYY-MM-DD format\n */\nexport function addDays(dateStr: string, days: number): string {\n const date = parseLocalDate(dateStr);\n date.setDate(date.getDate() + days);\n return formatDateString(date);\n}\n\n/**\n * Subtract days from a date string\n */\nexport function subtractDays(dateStr: string, days: number): string {\n return addDays(dateStr, -days);\n}\n\n/**\n * Get yesterday's date string (YYYY-MM-DD)\n */\nexport function getYesterdayString(): string {\n return subtractDays(getTodayString(), 1);\n}\n\n/**\n * Get tomorrow's date string (YYYY-MM-DD)\n */\nexport function getTomorrowString(): string {\n return addDays(getTodayString(), 1);\n}\n\n// ============================================================================\n// ISO String Helpers (for database queries)\n// ============================================================================\n\n/**\n * Get start of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T00:00:00.000Z\"\n */\nexport function getStartOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n ).toISOString();\n}\n\n/**\n * Get end of day as ISO string\n * @param dateStr - Date in YYYY-MM-DD format\n * @returns ISO string like \"2024-12-15T23:59:59.999Z\"\n */\nexport function getEndOfDayISO(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n 23,\n 59,\n 59,\n 999\n ).toISOString();\n}\n\n// ============================================================================\n// Week Utilities\n// ============================================================================\n\n/**\n * Get the start of the week (Monday) for a given date\n */\nexport function getWeekStart(date: Date): Date {\n const d = new Date(date);\n const day = d.getDay();\n const diff = d.getDate() - day + (day === 0 ? -6 : 1); // Monday\n d.setDate(diff);\n d.setHours(0, 0, 0, 0);\n return d;\n}\n\n/**\n * Get the end of the week (Sunday) for a given week start\n */\nexport function getWeekEnd(weekStart: Date): Date {\n const d = new Date(weekStart);\n d.setDate(d.getDate() + 6);\n return d;\n}\n\n/**\n * Get the start of the previous week\n */\nexport function getPreviousWeek(weekStart: Date): Date {\n const d = new Date(weekStart);\n d.setDate(d.getDate() - 7);\n return d;\n}\n\n/**\n * Get the start of the next week\n */\nexport function getNextWeek(weekStart: Date): Date {\n const d = new Date(weekStart);\n d.setDate(d.getDate() + 7);\n return d;\n}\n\n/**\n * Get start of week (Monday) as date string\n */\nexport function getWeekStartString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekStart(baseDate));\n}\n\n/**\n * Get end of week (Sunday) as date string\n */\nexport function getWeekEndString(baseDate: Date = new Date()): string {\n return formatDateString(getWeekEnd(getWeekStart(baseDate)));\n}\n\n/**\n * Get all dates in a week as an array of date strings\n * @param weekStart - Start of the week (Monday) in YYYY-MM-DD format\n * @returns Array of 7 date strings from Monday to Sunday\n * @example getWeekDates(\"2024-12-16\") => [\"2024-12-16\", \"2024-12-17\", ..., \"2024-12-22\"]\n */\nexport function getWeekDates(weekStart: string): string[] {\n const dates: string[] = [];\n for (let i = 0; i < 7; i++) {\n dates.push(addDays(weekStart, i));\n }\n return dates;\n}\n\n/**\n * Get all dates in a week as Date objects\n * @param weekStart - Start of the week (Monday) as Date\n * @returns Array of 7 Date objects from Monday to Sunday\n */\nexport function getWeekDatesAsObjects(weekStart: Date): Date[] {\n const dates: Date[] = [];\n for (let i = 0; i < 7; i++) {\n const day = new Date(weekStart);\n day.setDate(day.getDate() + i);\n dates.push(day);\n }\n return dates;\n}\n\n/**\n * Format a week range for display\n * @example \"Dec 2 - 8, 2024\" or \"Nov 25 - Dec 1, 2024\"\n */\nexport function formatWeekRange(weekStart: Date): string {\n const weekEnd = getWeekEnd(weekStart);\n const startMonth = weekStart.toLocaleDateString(\"en-US\", { month: \"short\" });\n const endMonth = weekEnd.toLocaleDateString(\"en-US\", { month: \"short\" });\n\n if (startMonth === endMonth) {\n return `${startMonth} ${weekStart.getDate()} - ${weekEnd.getDate()}, ${weekStart.getFullYear()}`;\n }\n\n return `${startMonth} ${weekStart.getDate()} - ${endMonth} ${weekEnd.getDate()}, ${weekStart.getFullYear()}`;\n}\n\n// ============================================================================\n// Display Formatting\n// ============================================================================\n\n/**\n * Format a date string for display with full weekday\n * @example \"Monday, December 15, 2024\"\n */\nexport function formatFullDate(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n}\n\n/**\n * Format date for display in long form\n * @example \"Monday, 9 December\"\n */\nexport function formatDateLong(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n return date.toLocaleDateString(\"en-GB\", {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n });\n}\n\n/**\n * Format month and year\n * @example \"December 2024\"\n */\nexport function formatMonthYear(date: Date): string {\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n year: \"numeric\",\n });\n}\n\n/**\n * Format a date/time to HH:MM format\n * Use this for formatting Date objects or ISO strings to time display\n * @example formatTimeHHMM(new Date()) => \"14:30\"\n *\n * Note: For formatting seconds (e.g., timer display), use formatTime from utils\n */\nexport function formatTimeHHMM(date: Date | string): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n}\n\n/**\n * Format time in short format (12h without seconds)\n * @example formatTimeShort(new Date()) => \"2:30 PM\"\n */\nexport function formatTimeShort(date: Date | string): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/**\n * Format a Date object for display in readable format\n * @example formatDateDisplay(new Date()) => \"Monday, Dec 22\"\n */\nexport function formatDateDisplay(date: Date): string {\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Format a date/time to HH:MM:SS format\n */\nexport function formatTimeWithSeconds(date: Date | string): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n return d.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\n// ============================================================================\n// Contextual Formatting\n// ============================================================================\n\n/**\n * Format a date string for display as a header\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n */\nexport function formatDateHeader(dateStr: string): string {\n const today = getTodayString();\n\n if (dateStr < today) {\n return \"Overdue\";\n }\n\n if (dateStr === today) {\n return \"Today\";\n }\n\n const tomorrowStr = getTomorrowString();\n if (dateStr === tomorrowStr) {\n return \"Tomorrow\";\n }\n\n const date = parseLocalDate(dateStr);\n return date.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Format a due date for display in task items (simple string version)\n * Returns \"Overdue\", \"Today\", \"Tomorrow\", or formatted date\n *\n * Note: For version that returns { text, isOverdue }, use formatDueDate from utils/formatters\n */\nexport function formatDueDateString(dateStr: string | null): string {\n if (!dateStr) return \"No due date\";\n\n const today = getTodayString();\n const tomorrowStr = getTomorrowString();\n\n if (dateStr < today) {\n const date = parseLocalDate(dateStr);\n return `Overdue • ${date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n })}`;\n }\n\n if (dateStr === today) {\n return \"Today\";\n }\n\n if (dateStr === tomorrowStr) {\n return \"Tomorrow\";\n }\n\n const date = parseLocalDate(dateStr);\n const currentYear = new Date().getFullYear();\n const dateYear = date.getFullYear();\n\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: dateYear !== currentYear ? \"numeric\" : undefined,\n });\n}\n\n/**\n * Format a date/time as relative time string (extended version)\n * Accepts both Date objects and ISO strings\n * @example \"Just now\", \"5m ago\", \"2h ago\", \"3d ago\"\n *\n * Note: For simple string input, you can also use formatRelativeTime from utils/formatters\n */\nexport function formatRelativeTimeExtended(dateStr: string | Date): string {\n const date = typeof dateStr === \"string\" ? new Date(dateStr) : dateStr;\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n\n if (diffMins < 1) return \"Just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n}\n\n/**\n * Format a due date relative to today with contextual prefix\n * @example \"Due today\", \"Due tomorrow\", \"Due in 3 days\", \"2 days overdue\"\n */\nexport function formatRelativeDueDate(\n dateStr: string,\n options?: {\n duePrefix?: string;\n overduePrefix?: string;\n }\n): string {\n const { duePrefix = \"Due\", overduePrefix = \"\" } = options || {};\n const date = parseLocalDate(dateStr);\n const now = normalizeToMidnight(new Date());\n\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays);\n return overduePrefix\n ? `${overduePrefix} ${absDays} day${absDays !== 1 ? \"s\" : \"\"} overdue`\n : `${absDays} day${absDays !== 1 ? \"s\" : \"\"} overdue`;\n }\n if (diffDays === 0) return `${duePrefix} today`;\n if (diffDays === 1) return `${duePrefix} tomorrow`;\n if (diffDays <= 7) return `${duePrefix} in ${diffDays} days`;\n\n return date.toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\n}\n\n/**\n * Format a pay/income date relative to today\n * @example \"Today\", \"Tomorrow\", \"In 3 days\", \"2 days ago\"\n */\nexport function formatRelativePayDate(dateStr: string): string {\n const date = parseLocalDate(dateStr);\n const now = normalizeToMidnight(new Date());\n\n const diffMs = date.getTime() - now.getTime();\n const diffDays = Math.round(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays < 0) {\n const absDays = Math.abs(diffDays);\n return `${absDays} day${absDays !== 1 ? \"s\" : \"\"} ago`;\n }\n if (diffDays === 0) return \"Today\";\n if (diffDays === 1) return \"Tomorrow\";\n if (diffDays <= 7) return `In ${diffDays} days`;\n\n return date.toLocaleDateString(\"en-GB\", { day: \"numeric\", month: \"short\" });\n}\n\n// ============================================================================\n// Localized Formatting\n// ============================================================================\n\nexport type DateFormat = \"short\" | \"medium\" | \"long\" | \"weekday\";\nexport type TimeFormat = \"short\" | \"withSeconds\";\n\n/**\n * Format a date with various preset formats\n */\nexport function formatDateLocalized(\n date: Date | string,\n format: DateFormat = \"medium\"\n): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n\n switch (format) {\n case \"short\":\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n case \"medium\":\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n case \"long\":\n return d.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n case \"weekday\":\n return d.toLocaleDateString(\"en-US\", { weekday: \"short\" });\n default:\n return d.toLocaleDateString();\n }\n}\n\n/**\n * Format a time with various preset formats\n */\nexport function formatTimeLocalized(\n date: Date | string,\n format: TimeFormat = \"short\"\n): string {\n const d = typeof date === \"string\" ? new Date(date) : date;\n\n switch (format) {\n case \"short\":\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: true,\n });\n case \"withSeconds\":\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: true,\n });\n default:\n return d.toLocaleTimeString();\n }\n}\n"],"mappings":"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","names":["date"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { s as BankConnection, B as BankConnectionStatus, t as BankTransaction, k as ChatConversation, m as ChatMessage, C as ChatMessageRole, o as EFLink, K as ExchangeRate, a as Expense, E as ExpenseCategory, F as FocusCategory, h as FocusSession, j as FocusSessionFilters, g as FocusSessionStatus, H as HealthCategory, z as HealthCompletion, G as HealthCompletionFilters, w as HealthFrequencyConfig, v as HealthFrequencyType, x as HealthHabit, D as HealthHabitFilters, J as HealthStats, d as Income, I as IncomeCategory, q as LieuDay, L as LieuDayType, l as NewChatConversation, n as NewChatMessage, p as NewEFLink, b as NewExpense, N as NewExpenseCategory, f as NewFocusCategory, i as NewFocusSession, u as NewHealthCategory, A as NewHealthCompletion, y as NewHealthHabit, e as NewIncome, c as NewIncomeCategory, r as NewLieuDay, S as Setting, T as TransactionType } from './database-
|
|
1
|
+
export { s as BankConnection, B as BankConnectionStatus, t as BankTransaction, k as ChatConversation, m as ChatMessage, C as ChatMessageRole, O as DailyPlan, M as DailyPriority, o as EFLink, K as ExchangeRate, a as Expense, E as ExpenseCategory, Y as FocusArea, F as FocusCategory, h as FocusSession, j as FocusSessionFilters, g as FocusSessionStatus, H as HealthCategory, z as HealthCompletion, G as HealthCompletionFilters, w as HealthFrequencyConfig, v as HealthFrequencyType, x as HealthHabit, D as HealthHabitFilters, J as HealthStats, d as Income, I as IncomeCategory, q as LieuDay, L as LieuDayType, U as MealPlan, R as MealType, l as NewChatConversation, n as NewChatMessage, P as NewDailyPlan, p as NewEFLink, b as NewExpense, N as NewExpenseCategory, f as NewFocusCategory, i as NewFocusSession, u as NewHealthCategory, A as NewHealthCompletion, y as NewHealthHabit, e as NewIncome, c as NewIncomeCategory, r as NewLieuDay, V as NewMealPlan, a4 as NewNote, a2 as NewNoteFolder, X as NewPrepSession, _ as NewWeeklyPlan, a3 as Note, a5 as NoteFilters, a1 as NoteFolder, a0 as NoteType, Q as ParsedDailyPlan, $ as ParsedWeeklyPlan, W as PrepSession, S as Setting, T as TransactionType, Z as WeeklyPlan } from './database-koVAareN.mjs';
|
|
2
2
|
export { ApiKeyInfo, CloudAgent, CloudAgentConversation, CloudAgentMessage, CloudAgentMessageType, CloudAgentModel, CloudAgentPrompt, CloudAgentSource, CloudAgentStatus, CloudAgentTarget, IssueQueryOptions, LINEAR_PRIORITY_LABELS, LaunchAgentRequest, LinearIssue, LinearPriority, LinearProject, LinearState, LinearStateType, LinearUser, ListAgentsResponse, ModelsResponse, PaginatedIssues } from './types/index.mjs';
|
|
3
3
|
export { API_URLS, CLOUD_AGENT_STATUSES, CLOUD_AGENT_STATUS_COLORS, CLOUD_AGENT_STATUS_EMOJI, CURRENCIES, CURRENCY_NAMES, CURRENCY_SYMBOLS, Currency, DAY_OPTIONS, DEFAULT_FOCUS_DURATIONS, FOCUS_STATUS, FREQUENCIES, FREQUENCY_LABELS, FREQUENCY_MULTIPLIERS, FREQUENCY_OPTIONS, FocusDuration, FocusStatus, Frequency, HEALTH_FREQUENCY_LABELS, HEALTH_FREQUENCY_TYPES, LINEAR_PRIORITIES, LINEAR_PRIORITY_COLORS, LinearPriorityValue, PRESET_COLORS, PRESET_ICONS, SETTING_KEYS, SettingKey } from './constants/index.mjs';
|
|
4
4
|
export { WeeklyProgressItem, calculateFocusStats, calculateLieuBalance, calculateMonthlyExpenses, calculateMonthlyIncome, calculateMonthlySavings, calculateSavingsRate, calculateWeeklyProgress, formatCurrency, formatDate, formatDueDate, formatDuration, formatRelativeTime, formatTime, formatTotalTime, generateId, generateRandomColor, generateShortId, getFrequencyDescription, getRepoName, isNonEmptyString, isPositiveNumber, isValidCurrency, isValidEmail, isValidFrequency, isValidISODate, isValidUrl, parseFrequencyConfig, shouldDoOnDate, shouldDoToday, stringifyFrequencyConfig, toMonthlyAmount, toYearlyAmount, truncate } from './utils/index.mjs';
|
|
5
5
|
export { QueryKeys, queryKeys } from './query/index.mjs';
|
|
6
6
|
export { ActiveSession, TimerStatus, activeSessionAtom, elapsedSecondsAtom, formattedElapsedAtom, formattedRemainingAtom, progressAtom, progressPercentAtom, remainingSecondsAtom, targetSecondsAtom, timerStatusAtom } from './atoms/index.mjs';
|
|
7
|
-
export { DateFormat, TimeFormat, addDays, formatDateHeader, formatDateLocalized, formatDateLong, formatDateString, formatDueDateString, formatFullDate, formatMonthYear, formatRelativeDueDate, formatRelativePayDate, formatRelativeTimeExtended, formatTimeHHMM, formatTimeLocalized, formatTimeWithSeconds, formatWeekRange, getEndOfDayISO, getNextWeek, getPreviousWeek, getStartOfDayISO, getTodayMidnight, getTodayString, getTomorrowString, getWeekEnd, getWeekEndString, getWeekStart, getWeekStartString, getYesterdayString, isDueSoon, isOverdue, isToday, normalizeToMidnight, parseLocalDate, subtractDays } from './date/index.mjs';
|
|
7
|
+
export { DateFormat, TimeFormat, addDays, formatDateDisplay, formatDateHeader, formatDateLocalized, formatDateLong, formatDateString, formatDueDateString, formatFullDate, formatMonthYear, formatRelativeDueDate, formatRelativePayDate, formatRelativeTimeExtended, formatTimeHHMM, formatTimeLocalized, formatTimeShort, formatTimeWithSeconds, formatWeekRange, getEndOfDayISO, getNextWeek, getPreviousWeek, getStartOfDayISO, getTodayMidnight, getTodayString, getTomorrowString, getWeekDates, getWeekDatesAsObjects, getWeekEnd, getWeekEndString, getWeekStart, getWeekStartString, getYesterdayString, isDueSoon, isOverdue, isToday, normalizeToMidnight, parseLocalDate, subtractDays } from './date/index.mjs';
|
|
8
8
|
import 'jotai';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { s as BankConnection, B as BankConnectionStatus, t as BankTransaction, k as ChatConversation, m as ChatMessage, C as ChatMessageRole, o as EFLink, K as ExchangeRate, a as Expense, E as ExpenseCategory, F as FocusCategory, h as FocusSession, j as FocusSessionFilters, g as FocusSessionStatus, H as HealthCategory, z as HealthCompletion, G as HealthCompletionFilters, w as HealthFrequencyConfig, v as HealthFrequencyType, x as HealthHabit, D as HealthHabitFilters, J as HealthStats, d as Income, I as IncomeCategory, q as LieuDay, L as LieuDayType, l as NewChatConversation, n as NewChatMessage, p as NewEFLink, b as NewExpense, N as NewExpenseCategory, f as NewFocusCategory, i as NewFocusSession, u as NewHealthCategory, A as NewHealthCompletion, y as NewHealthHabit, e as NewIncome, c as NewIncomeCategory, r as NewLieuDay, S as Setting, T as TransactionType } from './database-
|
|
1
|
+
export { s as BankConnection, B as BankConnectionStatus, t as BankTransaction, k as ChatConversation, m as ChatMessage, C as ChatMessageRole, O as DailyPlan, M as DailyPriority, o as EFLink, K as ExchangeRate, a as Expense, E as ExpenseCategory, Y as FocusArea, F as FocusCategory, h as FocusSession, j as FocusSessionFilters, g as FocusSessionStatus, H as HealthCategory, z as HealthCompletion, G as HealthCompletionFilters, w as HealthFrequencyConfig, v as HealthFrequencyType, x as HealthHabit, D as HealthHabitFilters, J as HealthStats, d as Income, I as IncomeCategory, q as LieuDay, L as LieuDayType, U as MealPlan, R as MealType, l as NewChatConversation, n as NewChatMessage, P as NewDailyPlan, p as NewEFLink, b as NewExpense, N as NewExpenseCategory, f as NewFocusCategory, i as NewFocusSession, u as NewHealthCategory, A as NewHealthCompletion, y as NewHealthHabit, e as NewIncome, c as NewIncomeCategory, r as NewLieuDay, V as NewMealPlan, a4 as NewNote, a2 as NewNoteFolder, X as NewPrepSession, _ as NewWeeklyPlan, a3 as Note, a5 as NoteFilters, a1 as NoteFolder, a0 as NoteType, Q as ParsedDailyPlan, $ as ParsedWeeklyPlan, W as PrepSession, S as Setting, T as TransactionType, Z as WeeklyPlan } from './database-koVAareN.js';
|
|
2
2
|
export { ApiKeyInfo, CloudAgent, CloudAgentConversation, CloudAgentMessage, CloudAgentMessageType, CloudAgentModel, CloudAgentPrompt, CloudAgentSource, CloudAgentStatus, CloudAgentTarget, IssueQueryOptions, LINEAR_PRIORITY_LABELS, LaunchAgentRequest, LinearIssue, LinearPriority, LinearProject, LinearState, LinearStateType, LinearUser, ListAgentsResponse, ModelsResponse, PaginatedIssues } from './types/index.js';
|
|
3
3
|
export { API_URLS, CLOUD_AGENT_STATUSES, CLOUD_AGENT_STATUS_COLORS, CLOUD_AGENT_STATUS_EMOJI, CURRENCIES, CURRENCY_NAMES, CURRENCY_SYMBOLS, Currency, DAY_OPTIONS, DEFAULT_FOCUS_DURATIONS, FOCUS_STATUS, FREQUENCIES, FREQUENCY_LABELS, FREQUENCY_MULTIPLIERS, FREQUENCY_OPTIONS, FocusDuration, FocusStatus, Frequency, HEALTH_FREQUENCY_LABELS, HEALTH_FREQUENCY_TYPES, LINEAR_PRIORITIES, LINEAR_PRIORITY_COLORS, LinearPriorityValue, PRESET_COLORS, PRESET_ICONS, SETTING_KEYS, SettingKey } from './constants/index.js';
|
|
4
4
|
export { WeeklyProgressItem, calculateFocusStats, calculateLieuBalance, calculateMonthlyExpenses, calculateMonthlyIncome, calculateMonthlySavings, calculateSavingsRate, calculateWeeklyProgress, formatCurrency, formatDate, formatDueDate, formatDuration, formatRelativeTime, formatTime, formatTotalTime, generateId, generateRandomColor, generateShortId, getFrequencyDescription, getRepoName, isNonEmptyString, isPositiveNumber, isValidCurrency, isValidEmail, isValidFrequency, isValidISODate, isValidUrl, parseFrequencyConfig, shouldDoOnDate, shouldDoToday, stringifyFrequencyConfig, toMonthlyAmount, toYearlyAmount, truncate } from './utils/index.js';
|
|
5
5
|
export { QueryKeys, queryKeys } from './query/index.js';
|
|
6
6
|
export { ActiveSession, TimerStatus, activeSessionAtom, elapsedSecondsAtom, formattedElapsedAtom, formattedRemainingAtom, progressAtom, progressPercentAtom, remainingSecondsAtom, targetSecondsAtom, timerStatusAtom } from './atoms/index.js';
|
|
7
|
-
export { DateFormat, TimeFormat, addDays, formatDateHeader, formatDateLocalized, formatDateLong, formatDateString, formatDueDateString, formatFullDate, formatMonthYear, formatRelativeDueDate, formatRelativePayDate, formatRelativeTimeExtended, formatTimeHHMM, formatTimeLocalized, formatTimeWithSeconds, formatWeekRange, getEndOfDayISO, getNextWeek, getPreviousWeek, getStartOfDayISO, getTodayMidnight, getTodayString, getTomorrowString, getWeekEnd, getWeekEndString, getWeekStart, getWeekStartString, getYesterdayString, isDueSoon, isOverdue, isToday, normalizeToMidnight, parseLocalDate, subtractDays } from './date/index.js';
|
|
7
|
+
export { DateFormat, TimeFormat, addDays, formatDateDisplay, formatDateHeader, formatDateLocalized, formatDateLong, formatDateString, formatDueDateString, formatFullDate, formatMonthYear, formatRelativeDueDate, formatRelativePayDate, formatRelativeTimeExtended, formatTimeHHMM, formatTimeLocalized, formatTimeShort, formatTimeWithSeconds, formatWeekRange, getEndOfDayISO, getNextWeek, getPreviousWeek, getStartOfDayISO, getTodayMidnight, getTodayString, getTomorrowString, getWeekDates, getWeekDatesAsObjects, getWeekEnd, getWeekEndString, getWeekStart, getWeekStartString, getYesterdayString, isDueSoon, isOverdue, isToday, normalizeToMidnight, parseLocalDate, subtractDays } from './date/index.js';
|
|
8
8
|
import 'jotai';
|