{"_id":"@curtisdigital/excel-datetime-parser","name":"@curtisdigital/excel-datetime-parser","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@curtisdigital/excel-datetime-parser","version":"1.0.0","description":"Robust date/time parser for messy Excel data. Zero dependencies, edge-runtime compatible.","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"sideEffects":false,"scripts":{"build":"tsup src/index.ts --format esm,cjs --dts --clean","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","lint":"ultracite fix","lint:check":"ultracite check","format":"ultracite fix","typecheck":"tsc --noEmit","prepublishOnly":"npm run build && npm run lint:check && npm test"},"devDependencies":{"@biomejs/biome":"^2.3.7","@vitest/coverage-v8":"^1.6.0","tsup":"^8.0.0","typescript":"^5.4.0","ultracite":"^6.3.6","vitest":"^1.6.0"},"engines":{"node":">=18"},"keywords":["excel","date","time","parser","spreadsheet","xlsx","cloudflare-workers","vercel","edge"],"author":{"name":"Curtis Digital"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/curtisdigital/excel-datetime-parser.git"},"gitHead":"9af5c484474c9e38fa0c2803a961afb433005497","_id":"@curtisdigital/excel-datetime-parser@1.0.0","bugs":{"url":"https://github.com/curtisdigital/excel-datetime-parser/issues"},"homepage":"https://github.com/curtisdigital/excel-datetime-parser#readme","_nodeVersion":"25.1.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-Qa0CxoCMPg5UQXrsJnYM8HZeiOejuA96tYqcoMK1iZxQJ+CKcVhWlBHW9QieBZH8WwyNOBMAtyzobeSUemJwMQ==","shasum":"26d12fb17a8b566d01ef39d02ae558a25f5c999e","tarball":"https://registry.npmjs.org/@curtisdigital/excel-datetime-parser/-/excel-datetime-parser-1.0.0.tgz","fileCount":6,"unpackedSize":27487,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAZaNt02usIgQcutEa4kZCxY+1I2gwSoPtEwnVT1Bq63AiEA7jp2/bj7/x4y6AdyKDNBPhO0/36QYOSYV5IE7qN4iEw="}]},"_npmUser":{"name":"curtisdigital","email":"john@curtisdigital.com"},"directories":{},"maintainers":[{"name":"curtisdigital","email":"john@curtisdigital.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/excel-datetime-parser_1.0.0_1764176085436_0.6410113872823529"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-26T16:54:45.378Z","1.0.0":"2025-11-26T16:54:45.628Z","modified":"2025-11-26T16:54:45.839Z"},"maintainers":[{"name":"curtisdigital","email":"john@curtisdigital.com"}],"description":"Robust date/time parser for messy Excel data. Zero dependencies, edge-runtime compatible.","homepage":"https://github.com/curtisdigital/excel-datetime-parser#readme","keywords":["excel","date","time","parser","spreadsheet","xlsx","cloudflare-workers","vercel","edge"],"repository":{"type":"git","url":"git+https://github.com/curtisdigital/excel-datetime-parser.git"},"author":{"name":"Curtis Digital"},"bugs":{"url":"https://github.com/curtisdigital/excel-datetime-parser/issues"},"license":"MIT","readme":"# @curtisdigital/excel-datetime-parser\n\nRobust date/time parser for messy Excel data. Zero runtime dependencies, edge-runtime compatible.\n\n## Why?\n\nExcel spreadsheets are chaos. Dates come as serial numbers, times as decimals, strings in random formats, or just \"TBD\". This library normalizes all of that into clean, consistent output.\n\n**Key features:**\n- 🎯 **Predictable**: Returns `string | null`, never throws\n- 🪶 **Tiny**: Zero runtime dependencies, < 2KB minified\n- ⚡ **Edge-ready**: Works in Cloudflare Workers, Vercel Functions\n- 📝 **TypeScript**: Full type safety\n\n## Installation\n\n```bash\nnpm install @curtisdigital/excel-datetime-parser\n```\n\nOr try it out instantly with npx:\n\n```bash\nnpx @curtisdigital/excel-datetime-parser\n```\n\n## Usage\n\n```typescript\nimport { parseDate, parseTime } from '@curtisdigital/excel-datetime-parser';\n\n// === DATE PARSING ===\n\nparseDate(45993)                    // \"2025-12-02\" (Excel serial number)\nparseDate(\"12/2/2025\")              // \"2025-12-02\" (US format)\nparseDate(\"2025-12-02\")             // \"2025-12-02\" (ISO - pass through)\nparseDate(new Date('2025-12-02'))   // \"2025-12-02\" (JS Date object)\nparseDate(\"TBD\")                    // null\nparseDate(\"12/23/2025 - 12/26/2025\") // null (date ranges rejected)\nparseDate(\"\")                       // null\nparseDate(null)                     // null\n\n// === TIME PARSING ===\n\nparseTime(0.375)                    // \"09:00:00\" (Excel decimal)\nparseTime(\"14:00\")                  // \"14:00:00\" (24-hour)\nparseTime(\"14:00:00\")               // \"14:00:00\" (24-hour with seconds)\nparseTime(\"3:30PM\")                 // \"15:30:00\" (12-hour, no space)\nparseTime(new Date('2025-01-01T14:30:00Z')) // \"14:30:00\"\nparseTime(\"MEMORIAL DAY HOLIDAY\")   // null\nparseTime(\"\")                       // null\nparseTime(null)                     // null\n```\n\n## API\n\n### `parseDate(value: unknown): string | null`\n\nParses any value that might represent a date into ISO format (`YYYY-MM-DD`).\n\n**Supported inputs:**\n| Input Type | Example | Output |\n|------------|---------|--------|\n| `null` / `undefined` | `null` | `null` |\n| Empty string | `\"\"`, `\"   \"` | `null` |\n| JavaScript `Date` | `new Date('2025-12-02')` | `\"2025-12-02\"` |\n| Excel serial | `45993` | `\"2025-12-02\"` |\n| ISO string | `\"2025-12-02\"` | `\"2025-12-02\"` |\n| US format | `\"12/2/2025\"` | `\"2025-12-02\"` |\n| Date range | `\"12/23/2025 - 12/26/2025\"` | `null` |\n| Other strings | `\"TBD\"`, `\"Q4 2025\"` | `null` |\n\n### `parseTime(value: unknown): string | null`\n\nParses any value that might represent a time into 24-hour format (`HH:MM:SS`).\n\n**Supported inputs:**\n| Input Type | Example | Output |\n|------------|---------|--------|\n| `null` / `undefined` | `null` | `null` |\n| Empty string | `\"\"`, `\"   \"` | `null` |\n| JavaScript `Date` | `new Date()` | `\"14:30:45\"` |\n| Excel decimal | `0.375` | `\"09:00:00\"` |\n| 24-hour (no sec) | `\"14:00\"` | `\"14:00:00\"` |\n| 24-hour (with sec) | `\"14:00:00\"` | `\"14:00:00\"` |\n| 12-hour (no space) | `\"3:30PM\"` | `\"15:30:00\"` |\n| Holiday text | `\"MEMORIAL DAY\"` | `null` |\n| Other strings | `\"Morning\"` | `null` |\n\n## Edge Cases\n\n### Whitespace\nAll string inputs are trimmed, including Unicode non-breaking spaces (NBSP):\n```typescript\nparseDate(\"  2025-12-02  \")  // \"2025-12-02\"\nparseDate(\"\\u00A02025-12-02\") // \"2025-12-02\" (NBSP)\n```\n\n### Excel Serial Numbers\nHandles the infamous Excel 1900 leap year bug (Excel incorrectly thinks Feb 29, 1900 existed):\n```typescript\nparseDate(1)   // \"1900-01-01\"\nparseDate(60)  // Handles the fake Feb 29, 1900\nparseDate(61)  // \"1900-03-01\"\n```\n\n### 12-Hour Time Format\nPer requirements, **no space** before AM/PM:\n```typescript\nparseTime(\"3:30PM\")   // \"15:30:00\" ✓\nparseTime(\"3:30 PM\")  // null ✗\n```\n\n### Date Ranges\nDate ranges are explicitly rejected (return `null`):\n```typescript\nparseDate(\"12/23/2025 - 12/26/2025\")  // null\n```\n\n## Advanced Usage\n\nUtility functions are also exported for custom use cases:\n\n```typescript\nimport { \n  isExcelSerialDate, \n  isExcelTimeDecimal,\n  excelSerialToDate,\n  excelDecimalToTime,\n  normalizeInput \n} from '@curtisdigital/excel-datetime-parser';\n\n// Check if a number looks like an Excel serial date\nisExcelSerialDate(45993)  // true\nisExcelSerialDate(0.5)    // false (that's a time)\n\n// Check if a number looks like an Excel time\nisExcelTimeDecimal(0.375) // true\nisExcelTimeDecimal(45993) // false (that's a date)\n\n// Convert Excel serial to JS Date\nconst date = excelSerialToDate(45993);\n\n// Convert Excel decimal to time string\nexcelDecimalToTime(0.375)  // \"09:00:00\"\n\n// Normalize input (trim, handle NBSP)\nnormalizeInput(\"  hello  \")  // \"hello\"\nnormalizeInput(\"\\u00A0\")     // null (empty after trim)\n```\n\n## Compatibility\n\n- ✅ Node.js 18+\n- ✅ Cloudflare Workers\n- ✅ Vercel Edge Functions\n- ✅ Deno\n- ✅ Bun\n- ✅ Browsers (ESM)\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-91d61e30c4944fad03c3de31dfbbafbe"}