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 • 11.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/shared/utils/dateUtils.ts","../src/apis/shared/zDotnetDateSchema.ts","../src/apis/shared/cacheFlushDate.ts"],"names":["wsdotDateTimeToJSDate","dateString","timestampStr","timezoneIndex","timestamp","timestampNum","date","jsDateToYyyyMmDd","convertDotNetDates","data","_","value","dotNetDate","isoDate","isIso8601DateString","datesHelper","zDotnetDate","z","isDotnetDateString","val","cacheFlushDateInputSchema","cacheFlushDateOutputSchema"],"mappings":"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","file":"chunk-BOH3LKTH.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","/**\n * @fileoverview .NET Date Validation for TanStack Query\n *\n * This module provides Zod schema validation for .NET date formats,\n * including the specialized \"/Date(timestamp)/\" format used by .NET\n * APIs. It handles validation and transformation to JavaScript Date objects.\n */\n\nimport { wsdotDateTimeToJSDate } from \"@/shared/utils/dateUtils\";\nimport { z } from \"@/shared/zod\";\n\n/**\n * .NET date validation and transformation schema\n *\n * This Zod schema handles .NET's \"/Date(timestamp)/\" format only.\n * It validates the input format and transforms it to a JavaScript Date object.\n */\nexport const zDotnetDate = () =>\n z\n .string()\n .refine((value) => isDotnetDateString(value), {\n message: \"Invalid date format. Expected .NET /Date(timestamp)/ format\",\n })\n .transform((val) => {\n const date = wsdotDateTimeToJSDate(val.replace(/\\\\\\//g, \"/\"));\n if (!date) throw new Error(`Failed to parse .NET date: ${val}`);\n return date;\n });\n\n/**\n * Type guard for .NET date format\n *\n * This function checks if a string matches the .NET \"/Date(timestamp)/\"\n * format, including escaped versions that may appear in JSON responses.\n *\n * @param value - The string to check\n * @returns True if the string matches .NET date format\n */\nconst isDotnetDateString = (value: string): boolean =>\n value.length >= 19 &&\n (value.startsWith(\"/Date(\") || value.startsWith(\"\\\\/Date(\")) &&\n (value.endsWith(\")/\") || value.endsWith(\")\\\\/\"));\n","/**\n * @fileoverview Shared schemas for cache flush date endpoints\n *\n * This module provides reusable input and output schemas for cache flush date\n * endpoints across all WSF APIs (wsf-fares, wsf-schedule, wsf-terminals, wsf-vessels).\n */\n\nimport type { z as zod } from \"zod\";\nimport { z } from \"@/shared/zod\";\nimport { zDotnetDate } from \"./zDotnetDateSchema\";\n\n/**\n * Shared input schema for cache flush date endpoints\n *\n * All cache flush date endpoints accept no parameters, so this is an empty object.\n */\nexport const cacheFlushDateInputSchema = z\n .object({})\n .describe(\"Input parameters for cache flush date endpoint.\");\n\nexport type CacheFlushDateInput = zod.infer<typeof cacheFlushDateInputSchema>;\n\n/**\n * Shared output schema for cache flush date endpoints\n *\n * Returns an optional UTC datetime indicating when static endpoint data was\n * last updated. Used for cache invalidation purposes.\n */\nexport const cacheFlushDateOutputSchema = zDotnetDate()\n .optional()\n .describe(\n \"UTC datetime when static endpoint data was last updated, or undefined if no update has occurred.\"\n );\n\nexport type CacheFlushDateOutput = zod.infer<typeof cacheFlushDateOutputSchema>;\n"]}