ws-dottie
Version:
Your friendly TypeScript companion for Washington State transportation APIs - WSDOT and WSF data with smart caching and React Query integration
1 lines • 7.77 kB
Source Map (JSON)
{"version":3,"sources":["../src/shared/utils/dateUtils.ts"],"names":["wsdotDateTimeToJSDate","jsDateToYyyyMmDd","convertDotNetDates","isIso8601DateString","datesHelper","init_dateUtils","__esmMin","dateString","timestampStr","timezoneIndex","timestamp","timestampNum","date","data","_","value","dotNetDate","isoDate"],"mappings":"qCAAA,IA8BaA,CAAAA,CA0CAC,EAqBAC,CAAAA,CA8BPC,CAAAA,CAaOC,EAxIbC,CAAAA,CAAAC,CAAAA,CAAA,IAAA,CA8BaN,CAAAA,CAAyBO,CAAAA,EAAoC,CAMxE,GALI,CAACA,CAAAA,EAAc,OAAOA,CAAAA,EAAe,QAAA,EAKrC,CAACA,CAAAA,CAAW,UAAA,CAAW,QAAQ,CAAA,EAAK,CAACA,CAAAA,CAAW,SAAS,IAAI,CAAA,CAC/D,OAAO,IAAA,CAIT,IAAMC,EAAeD,CAAAA,CAAW,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAGrCE,CAAAA,CAAgBD,EAAa,MAAA,CAAO,MAAM,EAC1CE,CAAAA,CACJD,CAAAA,CAAgB,EAAID,CAAAA,CAAa,KAAA,CAAM,CAAA,CAAGC,CAAa,CAAA,CAAID,CAAAA,CAEvDG,EAAe,QAAA,CAASD,CAAAA,CAAW,EAAE,CAAA,CAG3C,GAAI,OAAO,KAAA,CAAMC,CAAY,CAAA,CAC3B,OAAO,IAAA,CAGT,IAAMC,EAAO,IAAI,IAAA,CAAKD,CAAY,CAAA,CAClC,OAAO,OAAO,KAAA,CAAMC,CAAAA,CAAK,OAAA,EAAS,CAAA,CAAI,IAAA,CAAOA,CAC/C,CAAA,CAeaX,CAAAA,CAAoBW,GACxBA,CAAAA,CAAK,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAoB3BV,CAAAA,CAAsBW,GAC1B,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAUA,CAAI,EAAG,CAACC,CAAAA,CAAGC,CAAAA,GAAU,CACpD,GAAI,OAAOA,GAAU,QAAA,CAAU,CAE7B,IAAMC,CAAAA,CAAahB,CAAAA,CAAsBe,CAAK,CAAA,CAC9C,GAAIC,CAAAA,CACF,OAAOA,CAAAA,CAIT,IAAMC,EAAU,IAAI,IAAA,CAAKF,CAAK,CAAA,CAC9B,OAAI,CAAC,MAAA,CAAO,KAAA,CAAME,CAAAA,CAAQ,OAAA,EAAS,CAAA,EAAKd,EAAoBY,CAAK,CAAA,CACxDE,EAGFF,CACT,CACA,OAAOA,CACT,CAAC,CAAA,CAYGZ,CAAAA,CAAuBY,CAAAA,EAEzB,0EAAA,CACc,KAAKA,CAAK,CAAA,CAUfX,EAAc,CAEzB,QAAA,CAAU,IACRH,CAAAA,CAAiB,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,CAAI,KAAmB,CAAC,CAAA,CAE7D,iBAAkB,IAChBA,CAAAA,CAAiB,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,CAAI,MAAuB,CAAC,EAEjE,KAAA,CAAO,IAAcA,EAAiB,IAAI,IAAM,EAEhD,SAAA,CAAW,IACTA,CAAAA,CAAiB,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,CAAI,KAAmB,CAAC,CAAA,CAE7D,YAAA,CAAc,IAAcA,CAAAA,CAAiB,IAAI,IAAA,CAAK,IAAA,CAAM,CAAA,CAAG,CAAC,CAAC,CAAA,CAEjE,UAAA,CAAY,IAAcA,CAAAA,CAAiB,IAAI,KAAK,IAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAClE,EAAA,CAAA","file":"chunk-C3ZUMU65.mjs","sourcesContent":["/**\n * @fileoverview Date Utilities for WS-Dottie\n *\n * This module provides date conversion utilities specifically designed for\n * handling WSDOT/WSF API date formats. It includes conversion from .NET\n * datetime strings to JavaScript Date objects and various date formatting\n * utilities for API requests and responses.\n */\n\n/**\n * Converts a WSDOT .NET timestamp string to a JavaScript Date object\n *\n * This function parses WSDOT's .NET datetime format (\"/Date(timestamp)/\")\n * and converts it to a JavaScript Date object. It handles both positive\n * and negative timestamps, as well as timezone offsets.\n *\n * The parsing logic:\n * - Extracts timestamp from position 6 to 6 characters from the end\n * - Handles timezone separators (+ or - after timestamp)\n * - Validates the resulting timestamp number\n *\n * @param dateString - The WSDOT date string to convert\n * @returns JavaScript Date object or null if parsing fails\n * @example\n * ```typescript\n * wsdotDateTimeToJSDate(\"/Date(1757451301100-0700)/\") // Returns Date object\n * wsdotDateTimeToJSDate(\"/Date(-2208945600000-0800)/\") // Returns Date object\n * wsdotDateTimeToJSDate(\"invalid\") // Returns null\n * ```\n */\nexport const wsdotDateTimeToJSDate = (dateString: string): Date | null => {\n if (!dateString || typeof dateString !== \"string\") {\n return null;\n }\n\n // Simple validation: must start with \"/Date(\" and end with \")/\"\n if (!dateString.startsWith(\"/Date(\") || !dateString.endsWith(\")/\")) {\n return null;\n }\n\n // Extract timestamp: start 6 chars in, end 6 chars from the end\n const timestampStr = dateString.slice(6, -6);\n\n // Find timezone separator (+ or - after timestamp)\n const timezoneIndex = timestampStr.search(/[+-]/);\n const timestamp =\n timezoneIndex > 0 ? timestampStr.slice(0, timezoneIndex) : timestampStr;\n\n const timestampNum = parseInt(timestamp, 10);\n\n // Validate timestamp is a valid number\n if (Number.isNaN(timestampNum)) {\n return null;\n }\n\n const date = new Date(timestampNum);\n return Number.isNaN(date.getTime()) ? null : date;\n};\n\n/**\n * Converts a JavaScript Date to ISO date stamp (YYYY-MM-DD)\n *\n * This function formats a JavaScript Date object as an ISO date string\n * in YYYY-MM-DD format, which is commonly used in API requests.\n *\n * @param date - The JavaScript Date object to convert\n * @returns ISO date string in YYYY-MM-DD format\n * @example\n * ```typescript\n * jsDateToYyyyMmDd(new Date(2024, 0, 15)) // Returns \"2024-01-15\"\n * ```\n */\nexport const jsDateToYyyyMmDd = (date: Date): string => {\n return date.toISOString().split(\"T\")[0];\n};\n\n/**\n * Converts .NET datetime strings to JavaScript Date objects in response data\n *\n * This function recursively traverses an object/array structure and converts\n * any .NET datetime strings (format: \"/Date(1234567890123)/\") to JavaScript\n * Date objects, leaving other values unchanged. It uses JSON.parse with a\n * reviver function to process the data during parsing.\n *\n * @param data - The data structure to process\n * @returns The data with .NET dates converted to JS Date objects\n * @example\n * ```typescript\n * const data = { date: \"/Date(1757451301100-0700)/\", name: \"test\" };\n * const converted = convertDotNetDates(data);\n * // Result: { date: Date object, name: \"test\" }\n * ```\n */\nexport const convertDotNetDates = (data: unknown): unknown => {\n return JSON.parse(JSON.stringify(data), (_, value) => {\n if (typeof value === \"string\") {\n // Try .NET date format first\n const dotNetDate = wsdotDateTimeToJSDate(value);\n if (dotNetDate) {\n return dotNetDate;\n }\n\n // Try ISO-8601 date format\n const isoDate = new Date(value);\n if (!Number.isNaN(isoDate.getTime()) && isIso8601DateString(value)) {\n return isoDate;\n }\n\n return value;\n }\n return value;\n });\n};\n\n/**\n * Type guard for ISO-8601 date format\n *\n * This function checks if a string matches the ISO-8601 date format\n * with optional time and timezone information.\n *\n * @param value - The string to check\n * @returns True if the string matches ISO-8601 date format\n */\nconst isIso8601DateString = (value: string): boolean => {\n const isoRegex =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?(Z|[+-]\\d{2}:\\d{2})?$/;\n return isoRegex.test(value);\n};\n\n/**\n * Date helper functions for runtime evaluation\n *\n * These functions return YYYY-MM-DD date strings when called, ensuring they are\n * evaluated at runtime rather than build time. This is useful for\n * generating dynamic dates in API requests and sample data.\n */\nexport const datesHelper = {\n /** Returns tomorrow's date as YYYY-MM-DD string */\n tomorrow: (): string =>\n jsDateToYyyyMmDd(new Date(Date.now() + 24 * 60 * 60 * 1000)),\n /** Returns the day after tomorrow's date as YYYY-MM-DD string */\n dayAfterTomorrow: (): string =>\n jsDateToYyyyMmDd(new Date(Date.now() + 2 * 24 * 60 * 60 * 1000)),\n /** Returns today's date as YYYY-MM-DD string */\n today: (): string => jsDateToYyyyMmDd(new Date()),\n /** Returns yesterday's date as YYYY-MM-DD string */\n yesterday: (): string =>\n jsDateToYyyyMmDd(new Date(Date.now() - 24 * 60 * 60 * 1000)),\n /** Returns August 1, 2025 (start of month for sample data) as YYYY-MM-DD string */\n startOfMonth: (): string => jsDateToYyyyMmDd(new Date(2025, 7, 1)), // August 1, 2025\n /** Returns August 31, 2025 (end of month for sample data) as YYYY-MM-DD string */\n endOfMonth: (): string => jsDateToYyyyMmDd(new Date(2025, 7, 31)), // August 31, 2025\n} as const;\n"]}