[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*.{js,ts}]\ncharset = utf-8\nindent_size = 2\nindent_style = space\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".github/workflows/deploy-docs.yml",
    "content": "name: Deploy Starlight site to GitHub Pages\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'docs/**'\n      - 'astro.config.mjs'\n      - '.github/workflows/deploy-docs.yml'\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: pages\n  cancel-in-progress: false\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: 'lts/*'\n          cache: npm\n\n      - name: Setup Pages\n        uses: actions/configure-pages@v4\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Build with Astro\n        run: npm run docs:build\n\n      - name: Upload artifact\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: pages\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    permissions:\n      pages: write\n      id-token: write\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    steps:\n      - name: Deploy to GitHub Pages\n        id: deployment\n        uses: actions/deploy-pages@v4"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: CI\n\non:\n  push:\n    branches: [ master, develop ]\n  pull_request:\n    branches: [ master, develop ]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n\n    - name: Setup Node.js\n      uses: actions/setup-node@v4\n      with:\n        node-version: 'lts/*'\n        cache: 'npm'\n\n    - name: Install dependencies\n      run: npm ci\n\n    - name: Run linter\n      run: npm run lint\n\n    - name: Run tests\n      run: npm test\n\n  coverage:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push'\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v4\n\n    - name: Setup Node.js\n      uses: actions/setup-node@v4\n      with:\n        node-version: 'lts/*'\n        cache: 'npm'\n\n    - name: Install dependencies\n      run: npm ci\n\n    - name: Run tests with coverage\n      run: npm run test:coverage\n\n    - name: Read coverage summary\n      id: coverage\n      run: |\n        echo \"pct=$(jq '.total.lines.pct' coverage/coverage-summary.json)\" >> $GITHUB_OUTPUT\n\n    - name: Create badges directory\n      run: mkdir -p .github/badges\n\n    - name: Generate coverage badge\n      uses: emibcn/badge-action@v2.0.3\n      with:\n        label: 'coverage'\n        status: ${{ steps.coverage.outputs.pct }}%\n        color: ${{ fromJSON(steps.coverage.outputs.pct) >= 80 && 'green' || fromJSON(steps.coverage.outputs.pct) >= 60 && 'yellow' || 'red' }}\n        path: .github/badges/coverage.svg\n\n    - name: Commit coverage badge\n      run: |\n        git config --local user.email \"action@github.com\"\n        git config --local user.name \"GitHub Action\"\n        git add .github/badges/coverage.svg\n        git diff --staged --quiet || git commit -m \"Update coverage badge\"\n        git push\n\n    - name: Upload coverage reports\n      uses: actions/upload-artifact@v4\n      with:\n        name: coverage-report\n        path: coverage/\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.vscode/\ncache/\ncoverage/\ndist/\npages/\nnode_modules/\n\n# Astro\n.astro/\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 KNOWLEDGECODE\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# date-and-time\n\n<div align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/knowledgecode/date-and-time/refs/heads/master/logo.png\" alt=\"date-and-time\" width=\"256\">\n</div>\n\n<div align=\"center\">\n\n[![CI](https://github.com/knowledgecode/date-and-time/actions/workflows/test.yml/badge.svg)](https://github.com/knowledgecode/date-and-time/actions/workflows/test.yml)\n[![Coverage](https://raw.githubusercontent.com/knowledgecode/date-and-time/refs/heads/master/.github/badges/coverage.svg)](https://github.com/knowledgecode/date-and-time/actions/workflows/test.yml)\n[![npm](https://img.shields.io/npm/v/date-and-time)](https://www.npmjs.com/package/date-and-time)\n\n</div>\n\nThe simplest, most intuitive date and time library.\n\n## Installation\n\n```shell\nnpm install date-and-time\n```\n\n### ES Modules (Recommended)\n\n```typescript\nimport { format } from 'date-and-time';\n\nformat(new Date(), 'ddd, MMM DD YYYY');\n// => Wed, Jul 09 2025\n```\n\n### CommonJS\n\n```typescript\nconst { format } = require('date-and-time');\n\nformat(new Date(), 'ddd, MMM DD YYYY');\n// => Wed, Jul 09 2025\n```\n\n## CDN Usage\n\n### Via jsDelivr\n\n```html\n<script type=\"module\">\n  import { format } from 'https://cdn.jsdelivr.net/npm/date-and-time/dist/index.js';\n\n  console.log(format(new Date(), 'YYYY/MM/DD'));\n</script>\n```\n\n### Via unpkg\n\n```html\n<script type=\"module\">\n  import { format } from 'https://unpkg.com/date-and-time/dist/index.js';\n\n  console.log(format(new Date(), 'YYYY/MM/DD'));\n</script>\n```\n\n## Migration\n\nVersion `4.x` has been completely rewritten in TypeScript and some features from `3.x` are no longer compatible. The main changes are as follows:\n\n- The `timezone` and `timespan` plugins have been integrated into the main library\n- Tree shaking is now supported\n- Supports `ES2021` and no longer supports older browsers\n\nFor details, please refer to [migration.md](https://github.com/knowledgecode/date-and-time/blob/master/docs/migration.md).\n\n## API\n\nFor comprehensive documentation and examples, visit: **[GitHub Pages](https://knowledgecode.github.io/date-and-time/)**\n\n## License\n\nMIT\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n"
  },
  {
    "path": "astro.config.mjs",
    "content": "import { defineConfig } from 'astro/config';\nimport starlight from '@astrojs/starlight';\n\nexport default defineConfig({\n  outDir: './pages',\n  srcDir: './docs',\n  site: 'https://knowledgecode.github.io',\n  base: '/date-and-time',\n  trailingSlash: 'never',\n  devToolbar: {\n    enabled: false,\n  },\n  markdown: {\n    shikiConfig: {\n      themes: {\n        light: 'github-light',\n        dark: 'github-dark',\n      },\n    },\n  },\n  integrations: [\n    starlight({\n      customCss: [\n        './docs/styles/custom.css',\n      ],\n      title: 'date-and-time',\n      description: 'The simplest, most intuitive date and time library',\n      logo: {\n        src: './docs/assets/logo.png',\n        alt: 'date-and-time',\n      },\n      social: [\n        { icon: 'github', label: 'GitHub', href: 'https://github.com/knowledgecode/date-and-time' },\n        { icon: 'npm', label: 'npm', href: 'https://www.npmjs.com/package/date-and-time' },\n      ],\n      sidebar: [\n        {\n          label: 'Getting Started',\n          items: [\n            { label: 'Introduction', link: '/guide' },\n            { label: 'Installation', link: '/guide/installation' },\n            { label: 'Quick Start', link: '/guide/quick-start' },\n          ],\n        },\n        {\n          label: 'API Reference',\n          collapsed: true,\n          items: [\n            { label: 'Overview', link: '/api' },\n            {\n              label: 'Core Functions',\n              items: [\n                { label: 'format()', link: '/api/format' },\n                { label: 'parse()', link: '/api/parse' },\n                { label: 'compile()', link: '/api/compile' },\n                { label: 'preparse()', link: '/api/preparse' },\n                { label: 'isValid()', link: '/api/isvalid' },\n                { label: 'transform()', link: '/api/transform' },\n                { label: 'addYears()', link: '/api/addyears' },\n                { label: 'addMonths()', link: '/api/addmonths' },\n                { label: 'addDays()', link: '/api/adddays' },\n                { label: 'addHours()', link: '/api/addhours' },\n                { label: 'addMinutes()', link: '/api/addminutes' },\n                { label: 'addSeconds()', link: '/api/addseconds' },\n                { label: 'addMilliseconds()', link: '/api/addmilliseconds' },\n                { label: 'subtract()', link: '/api/subtract' },\n              ],\n            },\n            {\n              label: 'Utility Functions',\n              items: [\n                { label: 'isLeapYear()', link: '/api/utils/isleapyear' },\n                { label: 'isSameDay()', link: '/api/utils/issameday' },\n                { label: 'getDaysInMonth()', link: '/api/utils/getdaysinmonth' },\n                { label: 'getISOWeekYear()', link: '/api/utils/getisoweekyear' },\n                { label: 'getISOWeek()', link: '/api/utils/getisoweek' },\n              ],\n            },\n          ],\n        },\n        { label: 'Locales', link: '/locales' },\n        { label: 'Timezones', link: '/timezones' },\n        { label: 'Plugins', link: '/plugins' },\n        { label: 'Migration Guide', link: '/migration' },\n      ],\n    }),\n  ],\n});\n"
  },
  {
    "path": "docs/api/addDays.md",
    "content": "---\ntitle: addDays()\n---\n\nAdds or subtracts days from a Date object. Handles month boundaries, leap years, and daylight saving time transitions properly.\n\n## Syntax\n\n```typescript\naddDays(dateObj, days[, timeZone])\n```\n\n### Parameters\n\n| Parameter  | Type                 | Required | Description                                             |\n|------------|----------------------|----------|---------------------------------------------------------|\n| `dateObj`  | `Date`               | Yes      | The base Date object                                    |\n| `days`     | `number`             | Yes      | Number of days to add (positive) or subtract (negative) |\n| `timeZone` | `TimeZone \\| string` | No       | Timezone for the calculation                            |\n\n### Returns\n\n`Date` - A new Date object with the specified number of days added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Days\n\n```typescript\nimport { addDays } from 'date-and-time';\n\nconst date = new Date(2024, 7, 15); // August 15, 2024\n\n// Add days\nconst future = addDays(date, 10);\nconsole.log(future); // August 25, 2024\n\n// Subtract days\nconst past = addDays(date, -5);\nconsole.log(past); // August 10, 2024\n```\n\n### Daylight Saving Time Aware Calculations\n\n```typescript\nimport { addDays } from 'date-and-time';\n\n// Working with specific timezones\nconst nyDate = new Date('2024-03-10T05:00:00Z'); // March 10, 2024 05:00 UTC (DST transition day)\n\n// Add 30 days in New York timezone\nconst futureNY = addDays(nyDate, 30, 'America/New_York');\nconsole.log(futureNY); // April 9, 2024 04:00 UTC (EDT, DST adjusted)\n\n// UTC calculation for comparison\nconst futureUTC = addDays(nyDate, 30, 'UTC');\nconsole.log(futureUTC); // April 9, 2024 05:00 UTC (same time, no DST adjustment)\n```\n\n## Use Cases\n\n### Work Day Calculations\n\n```typescript\nfunction addBusinessDays(date: Date, businessDays: number): Date {\n  let result = new Date(date);\n  let daysToAdd = businessDays;\n  \n  while (daysToAdd > 0) {\n    result = addDays(result, 1);\n    const dayOfWeek = result.getDay();\n    \n    // Skip weekends (0 = Sunday, 6 = Saturday)\n    if (dayOfWeek !== 0 && dayOfWeek !== 6) {\n      daysToAdd--;\n    }\n  }\n  \n  return result;\n}\n\nconst friday = new Date(2024, 7, 23); // August 23, 2024 (Friday)\nconst nextBusinessDay = addBusinessDays(friday, 1);\nconsole.log(nextBusinessDay); // August 26, 2024 (Monday)\n```\n\n### Date Range Generation\n\n```typescript\nfunction generateDateRange(startDate: Date, endDate: Date): Date[] {\n  const dates: Date[] = [];\n  let currentDate = new Date(startDate);\n  \n  while (currentDate <= endDate) {\n    dates.push(new Date(currentDate));\n    currentDate = addDays(currentDate, 1);\n  }\n  \n  return dates;\n}\n\nconst start = new Date(2024, 7, 28); // August 28, 2024\nconst end = new Date(2024, 8, 3);   // September 3, 2024\nconst dateRange = generateDateRange(start, end);\nconsole.log(dateRange);\n// [Aug 28, Aug 29, Aug 30, Aug 31, Sep 1, Sep 2, Sep 3]\n```\n\n## Immutability\n\n`addDays()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 7, 15);\nconst modifiedDate = addDays(originalDate, 10);\n\nconsole.log(originalDate); // August 15, 2024 (unchanged)\nconsole.log(modifiedDate); // August 25, 2024 (new object)\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addMonths()`](./addMonths) - Add/subtract months  \n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/addHours.md",
    "content": "---\ntitle: addHours()\n---\n\nAdds or subtracts hours from a Date object.\n\n## Syntax\n\n```typescript\naddHours(dateObj, hours)\n```\n\n### Parameters\n\n| Parameter | Type     | Required | Description                                              |\n|-----------|----------|----------|----------------------------------------------------------|\n| `dateObj` | `Date`   | Yes      | The base Date object                                     |\n| `hours`   | `number` | Yes      | Number of hours to add (positive) or subtract (negative) |\n\n### Returns\n\n`Date` - A new Date object with the specified number of hours added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Hours\n\n```typescript\nimport { addHours } from 'date-and-time';\n\nconst date = new Date(2024, 7, 15, 14, 30, 45); // August 15, 2024 14:30:45\n\n// Add hours\nconst future = addHours(date, 6);\nconsole.log(future);  // August 15, 2024 20:30:45\n\n// Subtract hours\nconst past = addHours(date, -3);\nconsole.log(past);  // August 15, 2024 11:30:45\n```\n\n## Use Cases\n\n### Work Hours Calculation\n\n```typescript\nfunction addWorkingHours(startDate: Date, workHours: number): Date {\n  // Assuming 8-hour work days, 5 days a week\n  const hoursPerDay = 8;\n  const result = new Date(startDate);\n  let remainingHours = workHours;\n  \n  while (remainingHours > 0) {\n    const dayOfWeek = result.getDay();\n    \n    // Skip weekends\n    if (dayOfWeek === 0 || dayOfWeek === 6) {\n      result.setDate(result.getDate() + 1);\n      continue;\n    }\n    \n    const hoursToAdd = Math.min(remainingHours, hoursPerDay);\n    const newTime = addHours(result, hoursToAdd);\n    result.setTime(newTime.getTime());\n    remainingHours -= hoursToAdd;\n    \n    if (remainingHours > 0) {\n      // Move to next day, reset to start of work day\n      result.setDate(result.getDate() + 1);\n      result.setHours(9, 0, 0, 0); // 9 AM start\n    }\n  }\n  \n  return result;\n}\n\nconst projectStart = new Date(2024, 7, 15, 9, 0); // August 15, 2024 09:00\nconst completion = addWorkingHours(projectStart, 24); // 24 working hours\nconsole.log(completion);\n```\n\n### Shift Scheduling\n\n```typescript\nfunction generateShiftSchedule(startDate: Date, shiftHours: number, numberOfShifts: number): Date[] {\n  const shifts: Date[] = [];\n  let currentStart = new Date(startDate);  \n\n  for (let i = 0; i < numberOfShifts; i++) {\n    shifts.push(new Date(currentStart));\n    currentStart = addHours(currentStart, shiftHours);\n  }\n  \n  return shifts;\n}\n\nconst firstShift = new Date(2024, 7, 15, 6, 0); // August 15, 2024 06:00\nconst schedule = generateShiftSchedule(firstShift, 8, 5); // 5 shifts of 8 hours each\nconsole.log(schedule);\n// [\n//   August 15, 2024 06:00,  // Shift 1\n//   August 15, 2024 14:00,  // Shift 2  \n//   August 15, 2024 22:00,  // Shift 3\n//   August 16, 2024 06:00,  // Shift 4\n//   August 16, 2024 14:00   // Shift 5\n// ]\n```\n\n## Immutability\n\n`addHours()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 7, 15, 14, 30);\nconst modifiedDate = addHours(originalDate, 5);\n\nconsole.log(originalDate); // August 15, 2024 14:30:00 (unchanged)\nconsole.log(modifiedDate); // August 15, 2024 19:30:00 (new object)\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addMonths()`](./addMonths) - Add/subtract months\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/addMilliseconds.md",
    "content": "---\ntitle: addMilliseconds()\n---\n\nAdds or subtracts milliseconds from a Date object.\n\n## Syntax\n\n```typescript\naddMilliseconds(dateObj, milliseconds)\n```\n\n### Parameters\n\n| Parameter      | Type     | Required | Description                                                     |\n|----------------|----------|----------|-----------------------------------------------------------------|\n| `dateObj`      | `Date`   | Yes      | The base Date object                                            |\n| `milliseconds` | `number` | Yes      | Number of milliseconds to add (positive) or subtract (negative) |\n\n### Returns\n\n`Date` - A new Date object with the specified number of milliseconds added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Milliseconds\n\n```typescript\nimport { addMilliseconds } from 'date-and-time';\n\nconst date = new Date(2024, 7, 15, 14, 30, 45, 123);  // August 15, 2024 14:30:45.123\n\n// Add milliseconds\nconst future = addMilliseconds(date, 500);\nconsole.log(future);  // August 15, 2024 14:30:45.623\n\n// Subtract milliseconds\nconst past = addMilliseconds(date, -200);\nconsole.log(past);  // August 15, 2024 14:30:44.923\n```\n\n## Use Cases\n\n### High-Precision Timing\n\n```typescript\nclass PrecisionTimer {\n  private startTime: Date\n  \n  start(): void {\n    this.startTime = new Date();\n  }\n  \n  elapsedMs(): number {\n    if (!this.startTime) {\n      return 0;\n    }\n    return Date.now() - this.startTime.getTime();\n  }\n  \n  addPreciseDelay(baseTime: Date, delayMs: number): Date {\n    return addMilliseconds(baseTime, delayMs);\n  }\n  \n  scheduleNextExecution(intervalMs: number): Date {\n    return addMilliseconds(new Date(), intervalMs);\n  }\n}\n\nconst timer = new PrecisionTimer();\n\ntimer.start();\n// ... perform operations ...\nconsole.log(`Operation took: ${timer.elapsedMs()}ms`);\n\nconst nextRun = timer.scheduleNextExecution(150); // Schedule 150ms from now\nconsole.log(`Next execution at: ${nextRun.toISOString()}`);\n```\n\n### Animation Frame Scheduling\n\n```typescript\nfunction createAnimationSchedule(startTime: Date, frameRate: number, duration: number) {\n  const frameInterval = 1000 / frameRate; // ms per frame\n  const totalFrames = Math.floor((duration * 1000) / frameInterval);\n  const schedule: { frame: number, time: Date }[] = [];  \n\n  for (let frame = 0; frame < totalFrames; frame++) {\n    const frameTime = addMilliseconds(startTime, frame * frameInterval);\n    schedule.push({ frame, time: frameTime });\n  }\n  \n  return schedule;\n}\n\nconst animationStart = new Date();  // Animation starts now\nconst frames = createAnimationSchedule(animationStart, 60, 2);  // 60 FPS for 2 seconds\n\nconsole.log(`Animation has ${frames.length} frames`);\nconsole.log('First 5 frames:');\nframes.slice(0, 5).forEach(f => {\n  console.log(`Frame ${f.frame}: ${f.time.toISOString()}`);\n});\n```\n\n## Immutability\n\n`addMilliseconds()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 7, 15, 14, 30, 45, 123);\nconst modifiedDate = addMilliseconds(originalDate, 500);\n\nconsole.log(originalDate);  // August 15, 2024 14:30:45.123 (unchanged)\nconsole.log(modifiedDate);  // August 15, 2024 14:30:45.623 (new object)\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addMonths()`](./addMonths) - Add/subtract months\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/addMinutes.md",
    "content": "---\ntitle: addMinutes()\n---\n\nAdds or subtracts minutes from a Date object.\n\n## Syntax\n\n```typescript\naddMinutes(dateObj, minutes)\n```\n\n### Parameters\n\n| Parameter | Type     | Required | Description                                                |\n|-----------|----------|----------|------------------------------------------------------------|\n| `dateObj` | `Date`   | Yes      | The base Date object                                       |\n| `minutes` | `number` | Yes      | Number of minutes to add (positive) or subtract (negative) |\n\n### Returns\n\n`Date` - A new Date object with the specified number of minutes added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Minutes\n\n```typescript\nimport { addMinutes } from 'date-and-time';\n\nconst date = new Date(2024, 7, 15, 14, 30, 45); // August 15, 2024 14:30:45\n\n// Add minutes\nconst future = addMinutes(date, 25);\nconsole.log(future);  // August 15, 2024 14:55:45\n\n// Subtract minutes\nconst past = addMinutes(date, -15);\nconsole.log(past);  // August 15, 2024 14:15:45\n```\n\n## Use Cases\n\n### Appointment Scheduling\n\n```typescript\nfunction scheduleAppointments(startTime: Date, appointmentLength: number, count: number): Date[] {\n  const appointments: Date[] = [];\n  let currentTime = new Date(startTime);  \n\n  for (let i = 0; i < count; i++) {\n    appointments.push(new Date(currentTime));\n    currentTime = addMinutes(currentTime, appointmentLength);\n  }\n  \n  return appointments;\n}\n\nconst firstAppointment = new Date(2024, 7, 15, 9, 0); // August 15, 2024 09:00\nconst schedule = scheduleAppointments(firstAppointment, 30, 6); // 6 appointments, 30 min each\nconsole.log(schedule);\n// [\n//   August 15, 2024 09:00,\n//   August 15, 2024 09:30,\n//   August 15, 2024 10:00,\n//   August 15, 2024 10:30,\n//   August 15, 2024 11:00,\n//   August 15, 2024 11:30\n// ]\n```\n\n### Pomodoro Timer\n\n```typescript\nclass PomodoroTimer {\n  private workMinutes = 25;\n  private shortBreakMinutes = 5;\n  private longBreakMinutes = 15;\n  \n  createSession(startTime: Date, cycles: number = 4) {\n    const schedule: { type: string, start: Date, end: Date }[] = [];\n    let currentTime = new Date(startTime);    \n\n    for (let i = 0; i < cycles; i++) {\n      // Work session\n      const workEnd = addMinutes(currentTime, this.workMinutes);\n\n      schedule.push({\n        type: 'work',\n        start: new Date(currentTime),\n        end: workEnd\n      });\n      currentTime = workEnd;\n      \n      // Break session\n      const breakMinutes = (i === cycles - 1) ? this.longBreakMinutes : this.shortBreakMinutes;\n      const breakEnd = addMinutes(currentTime, breakMinutes);\n\n      schedule.push({\n        type: i === cycles - 1 ? 'long-break' : 'short-break',\n        start: new Date(currentTime),\n        end: breakEnd\n      });\n      currentTime = breakEnd;\n    }\n    \n    return schedule;\n  }\n}\n\nconst pomodoro = new PomodoroTimer();\nconst session = pomodoro.createSession(new Date(2024, 7, 15, 9, 0));\nconsole.log(session);\n```\n\n## Immutability\n\n`addMinutes()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 7, 15, 14, 30);\nconst modifiedDate = addMinutes(originalDate, 45);\n\nconsole.log(originalDate);  // August 15, 2024 14:30:00 (unchanged)\nconsole.log(modifiedDate);  // August 15, 2024 15:15:00 (new object)\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addMonths()`](./addMonths) - Add/subtract months\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/addMonths.md",
    "content": "---\ntitle: addMonths()\n---\n\nAdds or subtracts months from a Date object. Handles month boundaries, leap years, and varying month lengths appropriately.\n\n## Syntax\n\n```typescript\naddMonths(dateObj, months[, timeZone])\n```\n\n### Parameters\n\n| Parameter  | Type                 | Required | Description                                               |\n|------------|----------------------|----------|-----------------------------------------------------------|\n| `dateObj`  | `Date`               | Yes      | The base Date object                                      |\n| `months`   | `number`             | Yes      | Number of months to add (positive) or subtract (negative) |\n| `timeZone` | `TimeZone \\| string` | No       | Timezone for the calculation                              |\n\n### Returns\n\n`Date` - A new Date object with the specified number of months added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Months\n\n```typescript\nimport { addMonths } from 'date-and-time';\n\nconst date = new Date(2024, 0, 15); // January 15, 2024\n\n// Add months\nconst future = addMonths(date, 6);\nconsole.log(future);  // July 15, 2024\n\n// Subtract months\nconst past = addMonths(date, -3);\nconsole.log(past);  // October 15, 2023\n```\n\n### Daylight Saving Time Aware Calculations\n\n```typescript\nimport { addMonths } from 'date-and-time';\n\n// Working with specific timezones\nconst nyDate = new Date('2024-03-10T05:00:00Z'); // March 10, 2024 05:00 UTC (DST transition day)\n\n// Add 6 months in New York timezone\nconst futureNY = addMonths(nyDate, 6, 'America/New_York');\nconsole.log(futureNY); // September 10, 2024 04:00 UTC (EDT, DST adjusted)\n\n// UTC calculation for comparison\nconst futureUTC = addMonths(nyDate, 6, 'UTC');\nconsole.log(futureUTC); // September 10, 2024 05:00 UTC (same time, no DST adjustment)\n```\n\n## Use Cases\n\n### Payment Due Dates\n\n```typescript\nfunction calculatePaymentSchedule(startDate: Date, months: number): Date[] {\n  const schedule: Date[] = [];\n  \n  for (let i = 1; i <= months; i++) {\n    schedule.push(addMonths(startDate, i));\n  }\n  \n  return schedule;\n}\n\nconst loanStart = new Date(2024, 0, 15); // January 15, 2024\nconst payments = calculatePaymentSchedule(loanStart, 12);\nconsole.log(payments);\n// [February 15, March 15, April 15, ..., January 15]\n```\n\n### Quarterly Reports\n\n```typescript\nfunction getQuarterlyDates(year: number): Date[] {\n  const q1 = new Date(year, 0, 1);  // January 1\n  return [\n    q1,               // Q1\n    addMonths(q1, 3), // Q2 - April 1\n    addMonths(q1, 6), // Q3 - July 1\n    addMonths(q1, 9)  // Q4 - October 1\n  ];\n}\n\nconst quarters2024 = getQuarterlyDates(2024);\nconsole.log(quarters2024);\n```\n\n## Edge Cases and Behavior\n\n### End-of-Month Dates\n\n```typescript\nconst endOfMonth = new Date(2024, 0, 31); // January 31, 2024\n\nconsole.log(addMonths(endOfMonth, 1));  // February 29, 2024 (Feb has 29 days)\nconsole.log(addMonths(endOfMonth, 2));  // March 31, 2024 (back to 31st)\nconsole.log(addMonths(endOfMonth, 3));  // April 30, 2024 (April has 30 days)\n```\n\n### February Edge Cases\n\n```typescript\n// February 28 in non-leap year\nconst feb28 = new Date(2025, 1, 28);  // February 28, 2025\nconsole.log(addMonths(feb28, 12));    // February 28, 2026\nconsole.log(addMonths(feb28, -12));   // February 28, 2024 (leap year, but stays at 28)\n\n// February 29 in leap year\nconst feb29 = new Date(2024, 1, 29);  // February 29, 2024\nconsole.log(addMonths(feb29, 1));     // March 29, 2024\nconsole.log(addMonths(feb29, -1));    // January 29, 2024\n```\n\n## Immutability\n\n`addMonths()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 0, 15);\nconst modifiedDate = addMonths(originalDate, 6);\n\nconsole.log(originalDate);  // January 15, 2024 (unchanged)\nconsole.log(modifiedDate);  // July 15, 2024 (new object)\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/addSeconds.md",
    "content": "---\ntitle: addSeconds()\n---\n\nAdds or subtracts seconds from a Date object.\n\n## Syntax\n\n```typescript\naddSeconds(dateObj, seconds)\n```\n\n### Parameters\n\n| Parameter | Type     | Required | Description                                                |\n|-----------|----------|----------|------------------------------------------------------------|\n| `dateObj` | `Date`   | Yes      | The base Date object                                       |\n| `seconds` | `number` | Yes      | Number of seconds to add (positive) or subtract (negative) |\n\n### Returns\n\n`Date` - A new Date object with the specified number of seconds added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Seconds\n\n```typescript\nimport { addSeconds } from 'date-and-time';\n\nconst date = new Date(2024, 7, 15, 14, 30, 45, 123);  // August 15, 2024 14:30:45.123\n\n// Add seconds\nconst future = addSeconds(date, 30);\nconsole.log(future);  // August 15, 2024 14:31:15.123\n\n// Subtract seconds\nconst past = addSeconds(date, -20);\nconsole.log(past);  // August 15, 2024 14:30:25.123\n```\n\n## Use Cases\n\n### Countdown Timers\n\n```typescript\nfunction createCountdown(duration: number): { start: Date, end: Date, remaining: () => number } {\n  const start = new Date();\n  const end = addSeconds(start, duration);\n  \n  return {\n    start,\n    end,\n    remaining: () => Math.max(0, Math.floor((end.getTime() - Date.now()) / 1000))\n  };\n}\n\nconst countdown = createCountdown(300); // 5 minute countdown\nconsole.log(`Countdown ends at: ${countdown.end.toLocaleTimeString()}`);\nconsole.log(`Time remaining: ${countdown.remaining()} seconds`);\n\n// Use in a timer\nconst updateCountdown = () => {\n  const remaining = countdown.remaining();\n  if (remaining > 0) {\n    console.log(`${remaining} seconds left`);\n    setTimeout(updateCountdown, 1000);\n  } else {\n    console.log('Time up!');\n  }\n};\n\nupdateCountdown();\n```\n\n### Precise Time Intervals\n\n```typescript\nfunction generateTimeIntervals(startTime: Date, intervalSeconds: number, count: number): Date[] {\n  const intervals: Date[] = [];\n  let currentTime = new Date(startTime);  \n\n  for (let i = 0; i < count; i++) {\n    intervals.push(new Date(currentTime));\n    currentTime = addSeconds(currentTime, intervalSeconds);\n  }\n  \n  return intervals;\n}\n\nconst start = new Date(2024, 7, 15, 12, 0, 0);  // August 15, 2024 12:00:00\nconst intervals = generateTimeIntervals(start, 15, 8);  // Every 15 seconds, 8 times\n\nconsole.log(intervals);\n// [12:00:00, 12:00:15, 12:00:30, 12:00:45, 12:01:00, 12:01:15, 12:01:30, 12:01:45]\n```\n\n## Immutability\n\n`addSeconds()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 7, 15, 14, 30, 45);\nconst modifiedDate = addSeconds(originalDate, 120);\n\nconsole.log(originalDate);  // August 15, 2024 14:30:45 (unchanged)\nconsole.log(modifiedDate);  // August 15, 2024 14:32:45 (new object);\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addMonths()`](./addMonths) - Add/subtract months\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/addYears.md",
    "content": "---\ntitle: addYears()\n---\n\nAdds or subtracts years from a Date object. Handles leap years and edge cases appropriately.\n\n## Syntax\n\n```typescript\naddYears(dateObj, years[, timeZone])\n```\n\n### Parameters\n\n| Parameter  | Type                 | Required | Description                                              |\n|------------|----------------------|----------|----------------------------------------------------------|\n| `dateObj`  | `Date`               | Yes      | The base Date object                                     |\n| `years`    | `number`             | Yes      | Number of years to add (positive) or subtract (negative) |\n| `timeZone` | `TimeZone \\| string` | No       | Timezone for the calculation                             |\n\n### Returns\n\n`Date` - A new Date object with the specified number of years added or subtracted\n\n## Basic Examples\n\n### Adding and Subtracting Years\n\n```typescript\nimport { addYears } from 'date-and-time';\n\nconst date = new Date(2024, 0, 15); // January 15, 2024\n\n// Add years\nconst future = addYears(date, 3);\nconsole.log(future);  // January 15, 2027\n\n// Subtract years\nconst past = addYears(date, -2);\nconsole.log(past);  // January 15, 2022\n```\n\n### Daylight Saving Time Aware Calculations\n\n```typescript\nimport { addYears } from 'date-and-time';\n\n// Working with specific timezones\nconst nyDate = new Date('2024-03-10T05:00:00Z'); // March 10, 2024 05:00 UTC (DST transition day)\n\n// Add years in New York timezone\nconst futureNY = addYears(nyDate, 1, 'America/New_York');\nconsole.log(futureNY); // March 10, 2025 04:00 UTC (EST, DST adjusted)\n\n// UTC calculation for comparison\nconst futureUTC = addYears(nyDate, 1, 'UTC');\nconsole.log(futureUTC); // March 10, 2025 05:00 UTC (same time, no DST adjustment)\n```\n\n## Use Cases\n\n### Age Calculation\n\n```typescript\nfunction calculateAge(birthDate: Date): number {\n  const now = new Date();\n  const thisYear = addYears(birthDate, now.getFullYear() - birthDate.getFullYear());  \n\n  if (thisYear > now) {\n    return now.getFullYear() - birthDate.getFullYear() - 1;\n  }\n  return now.getFullYear() - birthDate.getFullYear();\n}\n\nconst birthDate = new Date(1990, 6, 15);  // July 15, 1990;\nconsole.log(calculateAge(birthDate)); // Current age\n```\n\n### Financial Year Calculations\n\n```typescript\nfunction getFinancialYearEnd(date: Date): Date {\n  const currentYear = date.getFullYear();\n  const financialYearEnd = new Date(currentYear, 2, 31);  // March 31\n\n  if (date <= financialYearEnd) {\n    return financialYearEnd;\n  } else {\n    return addYears(financialYearEnd, 1); // Next year's March 31\n  }\n}\n\nconst someDate = new Date(2024, 5, 15); // June 15, 2024\nconsole.log(getFinancialYearEnd(someDate)); // March 31, 2025\n```\n\n## Edge Cases and Behavior\n\n### February 29 Handling\n\n```typescript\n// Starting from February 29 (leap year)\nconst feb29 = new Date(2024, 1, 29);  // February 29, 2024\n\n// Adding to non-leap years\nconsole.log(addYears(feb29, 1));  // February 28, 2025\nconsole.log(addYears(feb29, 2));  // February 28, 2026\nconsole.log(addYears(feb29, 3));  // February 28, 2027\nconsole.log(addYears(feb29, 4));  // February 29, 2028 (leap year)\n```\n\n### Negative Years\n\n```typescript\nconst date = new Date(2024, 6, 15); // July 15, 2024\n\n// Go back in time\nconsole.log(addYears(date, -10));   // July 15, 2014\nconsole.log(addYears(date, -100));  // July 15, 1924\n```\n\n## Immutability\n\n`addYears()` does not modify the original Date object:\n\n```typescript\nconst originalDate = new Date(2024, 0, 15);\nconst modifiedDate = addYears(originalDate, 5);\n\nconsole.log(originalDate);  // January 15, 2024 (unchanged)\nconsole.log(modifiedDate);  // January 15, 2029 (new object)\n```\n\n## See Also\n\n- [`addMonths()`](./addMonths) - Add/subtract months\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n- [`subtract()`](./subtract) - Calculate differences with Duration objects\n"
  },
  {
    "path": "docs/api/compile.md",
    "content": "---\ntitle: compile()\n---\n\nPrecompiles a format string into a reusable compiled object for improved performance when the same format pattern is used repeatedly.\n\n## Syntax\n\n```typescript\ncompile(formatString)\n```\n\n### Parameters\n\n| Parameter      | Type     | Required | Description                   |\n|----------------|----------|----------|-------------------------------|\n| `formatString` | `string` | Yes      | The format pattern to compile |\n\n### Returns\n\n`CompiledObject` - A compiled format object that can be reused with `format()` and `parse()`\n\n## Basic Usage\n\n```typescript\nimport { compile, format, parse } from 'date-and-time';\n\n// Compile once\nconst pattern = compile('YYYY-MM-DD HH:mm:ss');\n\n// Use multiple times - much faster than parsing the format string each time\nconst date1 = new Date(2025, 7, 23, 14, 30, 45);\nconst date2 = new Date(2025, 7, 24, 9, 15, 30);\n\nconst formatted1 = format(date1, pattern);  // => 2025-08-23 14:30:45\nconst formatted2 = format(date2, pattern);  // => 2025-08-24 09:15:30\n\n// Also works with parse()\nconst parsed = parse('2025-08-25 16:20:10', pattern);\n```\n\n## Performance Benefits\n\nThe `compile()` function provides significant performance improvements for repeated operations:\n\n### Without Compilation (Slower)\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst dates = Array.from({ length: 1000 }, () => new Date());\n\n// Format string is parsed 1000 times\ndates.forEach(date => {\n  format(date, 'YYYY-MM-DD HH:mm:ss.SSS [GMT]ZZ');\n});\n```\n\n### With Compilation (Faster)\n\n```typescript\nimport { format, compile } from 'date-and-time';\n\nconst dates = Array.from({ length: 1000 }, () => new Date());\nconst pattern = compile('YYYY-MM-DD HH:mm:ss.SSS [GMT]ZZ');\n\n// Format string is compiled once, reused 1000 times\ndates.forEach(date => {\n  format(date, pattern);  // Much faster!\n});\n```\n\n## Real-world Examples\n\n### Logging System\n\n```typescript\nimport { compile, format } from 'date-and-time';\n\nclass Logger {\n  private timestampPattern = compile('\\\\[YYYY-MM-DD HH:mm:ss.SSS\\\\]');\n\n  log(level: string, message: string) {\n    const timestamp = format(new Date(), this.timestampPattern);\n    console.log(`${timestamp} ${level.toUpperCase()}: ${message}`);\n  }\n}\n\nconst logger = new Logger();\nlogger.log('info', 'Application started');\nlogger.log('error', 'Database connection failed');\n// [2025-08-23 14:30:45.123] INFO: Application started\n// [2025-08-23 14:30:45.124] ERROR: Database connection failed\n```\n\n### Template Engine Integration\n\n```typescript\nimport { compile, format } from 'date-and-time';\n\nclass EmailTemplateEngine {\n  private patterns = {\n    timestamp: compile('YYYY-MM-DD HH:mm:ss'),\n    friendly: compile('MMMM D, YYYY [at] h:mm A'),\n    fileDate: compile('YYYY-MM-DD')\n  };\n  \n  generateEmail(user: string, data: any): string {\n    const now = new Date();\n    \n    return `\n      Dear ${user},\n      \n      This report was generated on ${format(now, this.patterns.friendly)}.\n      \n      System timestamp: ${format(now, this.patterns.timestamp)}\n      Report date: ${format(data.reportDate, this.patterns.fileDate)}\n      \n      Best regards,\n      System\n    `.trim();\n  }\n}\n\nconst engine = new EmailTemplateEngine();\nconst email = engine.generateEmail('John', { \n  reportDate: new Date(2025, 7, 23) \n});\n```\n\n### API Response Formatting\n\n```typescript\nimport { compile, format } from 'date-and-time';\n\nclass ApiService {\n  private isoPattern = compile('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');\n  private friendlyPattern = compile('MMMM D, YYYY [at] h:mm A');\n  \n  formatResponse(data: any[]) {\n    return data.map(item => ({\n      ...item,\n      createdAt: format(item.createdAt, this.isoPattern, { timeZone: 'UTC' }),\n      createdAtFriendly: format(item.createdAt, this.friendlyPattern)\n    }));\n  }\n}\n```\n\n### Batch File Operations\n\n```typescript\nimport { compile, format } from 'date-and-time';\nimport { writeFileSync } from 'fs';\n\nconst filenamePattern = compile('YYYY-MM-DD_HH-mm-ss');\n\nfunction generateReports(data: any[]) {\n  const timestamp = format(new Date(), filenamePattern);\n  \n  data.forEach((report, index) => {\n    const filename = `report_${index}_${timestamp}.json`;\n    writeFileSync(filename, JSON.stringify(report));\n  });\n}\n```\n\n## Advanced Usage\n\n### Multiple Compiled Patterns\n\n```typescript\nimport { compile, format } from 'date-and-time';\nimport en from 'date-and-time/locales/en';\nimport ja from 'date-and-time/locales/ja';\n\nclass MultiFormatHandler {\n  private patterns = {\n    iso: compile('YYYY-MM-DD[T]HH:mm:ss[Z]'),\n    friendly: compile('MMMM D, YYYY [at] h:mm A'),\n    japanese: compile('YYYY年M月D日(ddd) HH:mm'),\n    filename: compile('YYYYMMDD_HHmmss')\n  };\n  \n  format(date: Date, type: keyof typeof this.patterns) {\n    const pattern = this.patterns[type];\n    \n    switch (type) {\n      case 'iso':\n        return format(date, pattern, { timeZone: 'UTC' });\n      case 'japanese':\n        return format(date, pattern, { locale: ja });\n      default:\n        return format(date, pattern);\n    }\n  }\n}\n\nconst handler = new MultiFormatHandler();\nconst date = new Date();\n\nconsole.log(handler.format(date, 'iso'));       // => 2025-08-23T14:30:45Z\nconsole.log(handler.format(date, 'friendly'));  // => August 23, 2025 at 2:30 PM\nconsole.log(handler.format(date, 'japanese'));  // => 2025年8月23日(土) 14:30\nconsole.log(handler.format(date, 'filename'));  // => 20250823_143045\n```\n\n### Conditional Compilation\n\n```typescript\nimport { compile, format } from 'date-and-time';\n\nclass SmartFormatter {\n  private cache = new Map<string, any>();\n  \n  private getCompiledPattern(formatString: string) {\n    if (!this.cache.has(formatString)) {\n      this.cache.set(formatString, compile(formatString));\n    }\n    return this.cache.get(formatString);\n  }\n  \n  format(date: Date, formatString: string, options?: any) {\n    const pattern = this.getCompiledPattern(formatString);\n    return format(date, pattern, options);\n  }\n}\n\nconst formatter = new SmartFormatter();\n\n// First call compiles the pattern\nformatter.format(new Date(), 'YYYY-MM-DD');\n\n// Subsequent calls reuse the compiled pattern\nformatter.format(new Date(), 'YYYY-MM-DD');  // Faster!\n```\n\n## Best Practices\n\n### 1. Compile Once, Use Many Times\n\n```typescript\n// ✅ Good - compile once\nconst pattern = compile('YYYY-MM-DD HH:mm:ss');\nfor (const date of dates) {\n  format(date, pattern);\n}\n\n// ❌ Bad - compiles every time\nfor (const date of dates) {\n  format(date, 'YYYY-MM-DD HH:mm:ss');\n}\n```\n\n### 2. Cache Compiled Patterns\n\n```typescript\n// ✅ Good - cached patterns\nclass DateFormatter {\n  private static patterns = {\n    iso: compile('YYYY-MM-DD[T]HH:mm:ss[Z]'),\n    short: compile('MM/DD/YYYY'),\n    long: compile('MMMM D, YYYY')\n  };\n  \n  static format(date: Date, type: keyof typeof DateFormatter.patterns) {\n    return format(date, DateFormatter.patterns[type]);\n  }\n}\n```\n\n### 3. Lazy Compilation\n\n```typescript\n// ✅ Good - lazy compilation for dynamic patterns\nclass DynamicFormatter {\n  private cache = new Map<string, CompiledObject>();\n  \n  format(date: Date, pattern: string) {\n    if (!this.cache.has(pattern)) {\n      this.cache.set(pattern, compile(pattern));\n    }\n    return format(date, this.cache.get(pattern)!);\n  }\n}\n```\n\n## See Also\n\n- [`format()`](./format) - Format Date objects using compiled patterns\n- [`parse()`](./parse) - Parse date strings using compiled patterns\n- [`preparse()`](./preparse) - Parse and return intermediate parsing results\n- [`transform()`](./transform) - Transform date strings between formats\n"
  },
  {
    "path": "docs/api/format.md",
    "content": "---\ntitle: format()\n---\n\nFormats a Date object according to the specified format string.\n\n## Syntax\n\n```typescript\nformat(dateObj, formatString[, options])\n```\n\n### Parameters\n\n| Parameter      | Type                       | Required | Description                          |\n|----------------|----------------------------|----------|--------------------------------------|\n| `dateObj`      | `Date`                     | Yes      | The Date object to format            |\n| `formatString` | `string \\| CompiledObject` | Yes      | The format string or compiled object |\n| `options`      | `FormatterOptions`         | No       | Formatter options for customization  |\n\n### Returns\n\n`string` - The formatted date string\n\n## Basic Examples\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst now = new Date();\n\nformat(now, 'YYYY/MM/DD HH:mm:ss');\n// => 2025/08/23 14:30:45\n\nformat(now, 'ddd, MMM DD YYYY');\n// => Sat, Aug 23 2025\n\nformat(now, 'hh:mm A [GMT]Z');\n// => 02:30 PM GMT-0700\n```\n\n## Format Tokens\n\n### Date Tokens\n\n| Token  | Description                | Output Examples   |\n|--------|----------------------------|-------------------|\n| `YYYY` | 4-digit year               | 0999, 2015        |\n| `YY`   | 2-digit year               | 99, 01, 15        |\n| `Y`    | Year without zero padding  | 2, 44, 888, 2015  |\n| `MMMM` | Full month name            | January, December |\n| `MMM`  | Short month name           | Jan, Dec          |\n| `MM`   | Month (01-12)              | 01, 12            |\n| `M`    | Month without zero padding | 1, 12             |\n| `DD`   | Day (01-31)                | 02, 31            |\n| `D`    | Day without zero padding   | 2, 31             |\n\n### Day of Week Tokens\n\n| Token  | Description         | Output Examples |\n|--------|---------------------|-----------------|\n| `dddd` | Full day name       | Friday, Sunday  |\n| `ddd`  | Short day name      | Fri, Sun        |\n| `dd`   | Very short day name | Fr, Su          |\n\n### Time Tokens\n\n| Token | Description                                 | Output Examples |\n|-------|---------------------------------------------|-----------------|\n| `HH`  | Hour in 24-hour format                      | 23, 08          |\n| `H`   | Hour in 24-hour format without zero padding | 23, 8           |\n| `hh`  | Hour in 12-hour format                      | 11, 08          |\n| `h`   | Hour in 12-hour format without zero padding | 11, 8           |\n| `mm`  | Minutes                                     | 14, 07          |\n| `m`   | Minutes without zero padding                | 14, 7           |\n| `ss`  | Seconds                                     | 05, 10          |\n| `s`   | Seconds without zero padding                | 5, 10           |\n| `SSS` | 3-digit milliseconds                        | 753, 022        |\n| `SS`  | 2-digit milliseconds                        | 75, 02          |\n| `S`   | 1-digit milliseconds                        | 7, 0            |\n\n### AM/PM Tokens\n\n| Token | Description                    | Output Examples |\n|-------|--------------------------------|-----------------|\n| `A`   | Uppercase AM/PM                | AM, PM          |\n| `AA`  | Uppercase AM/PM (with periods) | A.M., P.M.      |\n| `a`   | Lowercase AM/PM                | am, pm          |\n| `aa`  | Lowercase AM/PM (with periods) | a.m., p.m.      |\n\n### Timezone Tokens\n\n| Token | Description                | Output Examples |\n|-------|----------------------------|-----------------|\n| `Z`   | Timezone offset            | +0100, -0800    |\n| `ZZ`  | Timezone offset with colon | +01:00, -08:00  |\n\n### Plugin Tokens\n\nAdditional tokens available with plugins:\n\n| Token  | Description                         | Output Examples       | Plugin Required |\n|--------|-------------------------------------|-----------------------|-----------------|\n| `DDD`  | Ordinal representation              | 1st, 2nd, 3rd         | ordinal         |\n| `Q`    | Quarter of year                     | 1, 2, 3, 4            | quarter         |\n| `t`    | Unix timestamp (seconds)            | 0, 1000000000         | timestamp       |\n| `T`    | Unix timestamp (milliseconds)       | 0, 1000000000000      | timestamp       |\n| `W`    | ISO week number                     | 1, 27, 53             | week            |\n| `WW`   | ISO week number (zero-padded)       | 01, 27, 53            | week            |\n| `G`    | ISO week year                       | 2024, 2025            | week            |\n| `GG`   | ISO week year (2-digit zero-padded) | 24, 25                | week            |\n| `GGGG` | ISO week year (4-digit zero-padded) | 2024, 2025            | week            |\n| `z`    | Short timezone name                 | PST, EST              | zonename        |\n| `zz`   | Long timezone name                  | Pacific Standard Time | zonename        |\n\nFor available plugins, see the [`plugins`](#plugins) option in FormatterOptions.\n\n## FormatterOptions\n\nThe `FormatterOptions` object allows you to customize the formatting behavior:\n\n```typescript\ninterface FormatterOptions {\n  locale?: Locale;\n  timeZone?: TimeZone | string;\n  numeral?: Numeral;\n  calendar?: 'gregory' | 'buddhist';\n  hour12?: 'h11' | 'h12';\n  hour24?: 'h23' | 'h24';\n  plugins?: FormatterPlugin[];\n}\n```\n\n### locale\n\n**Type**: `Locale`  \n**Default**: `en` (English)\n\nSpecifies the locale for localized formatting of month names, day names, and meridiem indicators.\n\n```typescript\nimport { format } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\nimport es from 'date-and-time/locales/es';\n\nconst date = new Date();\n\n// Japanese formatting\nformat(date, 'YYYY年M月D日(ddd)', { locale: ja });\n// => 2025年8月23日(土)\n\n// Spanish formatting  \nformat(date, 'dddd, D [de] MMMM [de] YYYY', { locale: es });\n// => sábado, 23 de agosto de 2025\n```\n\nFor a complete list of all supported locales with import examples, see [Supported Locales](../locales).\n\n### timeZone\n\n**Type**: `TimeZone | string`  \n**Default**: `undefined` (local timezone)\n\nConverts the date to the specified timezone before formatting.\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\nformat(date, 'YYYY-MM-DD HH:mm:ss [JST]', { timeZone: 'Asia/Tokyo' });\n// => 2025-08-23 23:30:45 JST\n\nformat(date, 'YYYY-MM-DD HH:mm:ss [EST]', { timeZone: 'America/New_York' });\n// => 2025-08-23 09:30:45 EST\n\nformat(date, 'YYYY-MM-DD HH:mm:ss [UTC]', { timeZone: 'UTC' });\n// => 2025-08-23 14:30:45 UTC\n```\n\nFor a complete list of all supported timezones, see [Supported Timezones](../timezones).\n\n### numeral\n\n**Type**: `Numeral`  \n**Default**: `latn` (Latin numerals)\n\nSpecifies the numeral system for formatting numbers.\n\n```typescript\nimport { format } from 'date-and-time';\nimport arab from 'date-and-time/numerals/arab';\nimport beng from 'date-and-time/numerals/beng';\n\nconst date = new Date();\n\n// Arabic-Indic numerals\nformat(date, 'DD/MM/YYYY', { numeral: arab });\n// => ٠٨/٠٧/٢٠٢٥\n\n// Bengali numerals\nformat(date, 'DD/MM/YYYY', { numeral: beng });\n// => ০৮/০৭/২০২৫\n```\n\n**Available numeral systems:**\n\n- `latn` - Latin numerals (0-9) - default\n- `arab` - Arabic-Indic numerals (٠-٩)\n- `arabext` - Extended Arabic-Indic numerals (۰-۹)\n- `beng` - Bengali numerals (০-৯)\n- `mymr` - Myanmar numerals (၀-၉)\n\n### calendar\n\n**Type**: `\"gregory\" | \"buddhist\"`  \n**Default**: `\"gregory\"`\n\nSpecifies the calendar system for date calculations.\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\n// Gregorian calendar (default)\nformat(date, 'MMMM D, YYYY');\n// => August 23, 2025\n\n// Buddhist calendar (543 years ahead)\nformat(date, 'MMMM D, YYYY', { calendar: 'buddhist' });\n// => August 23, 2568\n```\n\n### hour12\n\n**Type**: `\"h11\" | \"h12\"`  \n**Default**: `\"h12\"`\n\nControls the 12-hour format interpretation. Use h11 for 11-hour format (0-11) or h12 for 12-hour format (1-12).\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst midnight = new Date(2025, 7, 23, 0, 30, 0); // 12:30 AM\n\n// h12 format (1-12)\nformat(midnight, 'h:mm A', { hour12: 'h12' });\n// => 12:30 AM\n\n// h11 format (0-11) \nformat(midnight, 'h:mm A', { hour12: 'h11' });\n// => 0:30 AM\n```\n\n### hour24\n\n**Type**: `\"h23\" | \"h24\"`  \n**Default**: `\"h23\"`\n\nControls the 24-hour format interpretation. Use h23 for 23-hour format (0-23) or h24 for 24-hour format (1-24).\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst midnight = new Date(2025, 7, 23, 0, 30, 0);\n\n// h23 format (0-23)\nformat(midnight, 'H:mm', { hour24: 'h23' });\n// => 0:30\n\n// h24 format (1-24)\nformat(midnight, 'H:mm', { hour24: 'h24' });\n// => 24:30\n```\n\n### plugins\n\n**Type**: `FormatterPlugin[]`  \n**Default**: `undefined`\n\nEnables additional format tokens provided by plugins. Plugins extend the formatter with special tokens that are not included in the core library.\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as ordinal } from 'date-and-time/plugins/ordinal';\nimport { formatter as zonename } from 'date-and-time/plugins/zonename';\n\nconst date = new Date();\n\n// Use ordinal plugin\nformat(date, 'MMMM DDD, YYYY', { plugins: [ordinal] });\n// => August 23rd, 2025\n\n// Use zonename plugin\nformat(date, 'YYYY-MM-DD HH:mm z', { plugins: [zonename] });\n// => 2025-08-23 14:30 PDT\n\n// Use multiple plugins together\nformat(date, 'MMMM DDD, YYYY h:mm A zz', { plugins: [ordinal, zonename] });\n// => August 23rd, 2025 2:30 PM Pacific Daylight Time\n```\n\nFor a complete list of available plugins, see [Plugins](../plugins).\n\n## Advanced Usage\n\n### Comments in Format Strings\n\nParts of the format string enclosed in square brackets are output literally:\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\nformat(date, '[Today is] dddd, MMMM D, YYYY');\n// => Today is Saturday, August 23, 2025\n\nformat(date, 'YYYY-MM-DD[T]HH:mm:ss[Z]');\n// => 2025-08-23T14:30:45Z\n\nformat(date, '[Report generated on] YYYY/MM/DD [at] HH:mm');\n// => Report generated on 2025/08/23 at 14:30\n\n// Escape square brackets to output them literally\nformat(date, '\\\\[YYYY-MM-DD HH:mm:ss\\\\]');\n// => [2025-08-23 14:30:45]\n```\n\n### Complex Localized Formatting\n\n```typescript\nimport { format } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\n\nconst date = new Date();\n\nformat(date, 'YYYY年MMMM月D日dddd Ah:mm:ss [GMT]Z', {\n  timeZone: 'Asia/Tokyo',\n  locale: ja\n});\n// => 2025年8月23日土曜日 午後11:30:45 GMT+0900\n```\n\n### Business and Technical Formats\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\n// ISO 8601 format\nformat(date, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]', { timeZone: 'UTC' });\n// => 2025-08-23T14:30:45.123Z\n\n// RFC 2822 format\nformat(date, 'ddd, DD MMM YYYY HH:mm:ss ZZ');\n// => Sat, 23 Aug 2025 14:30:45 +09:00\n\n// Log timestamp\nformat(date, '\\\\[YYYY-MM-DD HH:mm:ss.SSS]\\\\');\n// => [2025-08-23 14:30:45.123]\n\n// File naming\nformat(date, 'YYYYMMDD_HHmmss');\n// => 20250823_143045\n```\n\n## Performance Considerations\n\nFor repeated formatting with the same pattern, use [`compile()`](./compile) to precompile the format string:\n\n```typescript\nimport { format, compile } from 'date-and-time';\n\n// Compile once\nconst pattern = compile('YYYY-MM-DD HH:mm:ss');\n\n// Reuse for better performance\nconst dates = [new Date(), new Date(), new Date()];\ndates.forEach(date => {\n  console.log(format(date, pattern));\n});\n```\n\n## See Also\n\n- [`compile()`](./compile) - Precompile format patterns for performance\n- [`transform()`](./transform) - Transform date strings between formats\n"
  },
  {
    "path": "docs/api/index.md",
    "content": "---\ntitle: API Reference\n---\n\nWelcome to the comprehensive API reference for date-and-time v4.x. This section provides detailed documentation for all available functions, types, and options.\n\n## Core Functions\n\n### Formatting and Parsing\n\n| Function                     | Description                                   |\n|------------------------------|-----------------------------------------------|\n| [`format()`](./format)       | Convert Date objects to formatted strings     |\n| [`parse()`](./parse)         | Parse date strings into Date objects          |\n| [`compile()`](./compile)     | Precompile format patterns for performance    |\n| [`preparse()`](./preparse)   | Parse and return intermediate parsing results |\n| [`isValid()`](./isValid)     | Validate date string formats                  |\n| [`transform()`](./transform) | Transform date strings between formats        |\n\n### Date Arithmetic\n\n| Function                                               | Description                                      |\n|--------------------------------------------------------|--------------------------------------------------|\n| [`addYears()`](./add-functions#addyears)               | Add/subtract years from dates                    |\n| [`addMonths()`](./add-functions#addmonths)             | Add/subtract months from dates                   |\n| [`addDays()`](./add-functions#adddays)                 | Add/subtract days from dates                     |\n| [`addHours()`](./add-functions#addhours)               | Add/subtract hours from dates                    |\n| [`addMinutes()`](./add-functions#addminutes)           | Add/subtract minutes from dates                  |\n| [`addSeconds()`](./add-functions#addseconds)           | Add/subtract seconds from dates                  |\n| [`addMilliseconds()`](./add-functions#addmilliseconds) | Add/subtract milliseconds from dates             |\n| [`subtract()`](./subtract)                             | Calculate time differences with Duration objects |\n\n### Utility Functions\n\n| Function                                     | Description                            |\n|----------------------------------------------|----------------------------------------|\n| [`isLeapYear()`](./utils/isLeapYear)         | Check if a year is a leap year         |\n| [`isSameDay()`](./utils/isSameDay)           | Check if two dates are on the same day |\n| [`getDaysInMonth()`](./utils/getDaysInMonth) | Get the number of days in a month      |\n| [`getISOWeekYear()`](./utils/getISOWeekYear) | Get the ISO week year for a date       |\n| [`getISOWeek()`](./utils/getISOWeek)         | Get the ISO week number for a date     |\n\n## Quick Examples\n\n### Basic Usage\n\n```typescript\nimport { format, parse, isValid } from 'date-and-time'\n\n// Formatting\nconst date = new Date()\nformat(date, 'YYYY-MM-DD HH:mm:ss');\n// => 2025-08-23 14:30:45\n\n// Parsing\nconst parsed = parse('2025-08-23 14:30:45', 'YYYY-MM-DD HH:mm:ss');\n// => Date object\n\n// Validation\nisValid('2025-02-29', 'YYYY-MM-DD'); // => false (not a leap year)\n```\n\n### With Options\n\n```typescript\nimport { format } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\n\nformat(new Date(), 'YYYY年M月D日(ddd) HH:mm', {\n  locale: ja,\n  timeZone: 'Asia/Tokyo'\n});\n// => 2025年8月23日(土) 23:30\n```\n\n## Supported Locales\n\ndate-and-time supports 40+ locales. Import only the ones you need:\n\n```typescript\n// Examples\nimport ar from 'date-and-time/locales/ar';          // Arabic\nimport ja from 'date-and-time/locales/ja';          // Japanese\nimport es from 'date-and-time/locales/es';          // Spanish\nimport fr from 'date-and-time/locales/fr';          // French\nimport de from 'date-and-time/locales/de';          // German\nimport ru from 'date-and-time/locales/ru';          // Russian\nimport zhHans from 'date-and-time/locales/zh-Hans'; // Simplified Chinese\n```\n\nFor a complete list of all supported locales with import examples, see [Supported Locales](../locales).\n\n## Supported Timezones\n\nComplete IANA timezone database support. Pass an IANA timezone name string directly to any function:\n\n```typescript\nformat(new Date(), 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\nformat(new Date(), 'YYYY-MM-DD HH:mm:ss', { timeZone: 'America/New_York' });\n```\n\nFor a complete list of all supported timezones, see [Supported Timezones](../timezones).\n\n## Numeral Systems\n\nSupport for different numeral systems:\n\n```typescript\nimport arab from 'date-and-time/numerals/arab';   // Arabic-Indic\nimport beng from 'date-and-time/numerals/beng';   // Bengali\nimport mymr from 'date-and-time/numerals/mymr';   // Myanmar\nimport latn from 'date-and-time/numerals/latn';   // Latin (default)\n\nformat(new Date(), 'DD/MM/YYYY', { numeral: arab });\n// => ٠٨/٠٧/٢٠٢٥\n```\n\n## Error Handling\n\n### Parse Failures\n\n```typescript\nimport { parse, isValid } from 'date-and-time';\n\n// Always check validity first\nif (!isValid('invalid-date', 'YYYY-MM-DD')) {\n  throw new Error('Invalid date format');\n}\n\n// Or check parse results\nconst result = parse('invalid-date', 'YYYY-MM-DD');\nif (isNaN(result.getTime())) {\n  throw new Error('Parse failed');\n}\n```\n\n### Type Safety\n\n```typescript\nimport { format, FormatterOptions } from 'date-and-time';\n\n// TypeScript will catch type errors\nconst options: FormatterOptions = {\n  locale: 'invalid',  // ❌ TypeScript error\n  timeZone: 123       // ❌ TypeScript error\n};\n```\n\n## Performance Tips\n\n1. **Use `compile()`** for repeated operations:\n\n   ```typescript\n   const pattern = compile('YYYY-MM-DD HH:mm:ss');\n   // Reuse pattern for better performance\n   ```\n\n2. **Import only what you need**:\n\n   ```typescript\n   import { format } from 'date-and-time';  // ✅ Tree-shakable\n   import * as date from 'date-and-time';  // ❌ Imports everything\n   ```\n\n## Migration from v3.x\n\nIf you're migrating from version 3.x, see the [Migration Guide](../migration) for detailed upgrade instructions and breaking changes.\n"
  },
  {
    "path": "docs/api/isValid.md",
    "content": "---\ntitle: isValid()\n---\n\nValidates whether a date string conforms to the specified format pattern and represents a valid date.\n\n## Syntax\n\n```typescript\nisValid(dateString, formatString[, options])\n```\n\n### Parameters\n\n| Parameter      | Type                       | Required | Description                                                                        |\n|----------------|----------------------------|----------|------------------------------------------------------------------------------------|\n| `dateString`   | `string`                   | Yes      | The date string to validate                                                        |\n| `formatString` | `string \\| CompiledObject` | Yes      | The format pattern or compiled object                                              |\n| `options`      | `ParserOptions`            | No       | Parser options for validation (see [`parse()`](./parse#parseroptions) for details) |\n\n### Returns\n\n`boolean` - `true` if the date string is valid and matches the format, `false` otherwise\n\n## Basic Examples\n\n```typescript\nimport { isValid } from 'date-and-time';\n\n// Valid dates\nisValid('2025-08-23', 'YYYY-MM-DD');    // => true\nisValid('08/23/2025', 'MM/DD/YYYY');    // => true  \nisValid('14:30:45', 'HH:mm:ss');        // => true\nisValid('2:30 PM', 'h:mm A');           // => true\n\n// Invalid dates\nisValid('2025-02-30', 'YYYY-MM-DD');    // => false (Feb 30th doesn't exist)\nisValid('2025-13-01', 'YYYY-MM-DD');    // => false (month 13 doesn't exist)\nisValid('25:30:00', 'HH:mm:ss');        // => false (hour 25 doesn't exist)\nisValid('invalid-date', 'YYYY-MM-DD');  // => false (doesn't match format)\n\n// Format mismatch\nisValid('2025-08-23', 'MM/DD/YYYY');    // => false (wrong format)\nisValid('08/23/2025', 'YYYY-MM-DD');    // => false (wrong format)\n```\n\n## Validation with Options\n\n### Locale Validation\n\n```typescript\nimport { isValid } from 'date-and-time';\nimport es from 'date-and-time/locales/es';\n\n// Spanish month names\nisValid('23 de agosto de 2025', 'D [de] MMMM [de] YYYY', { locale: es });  // => true\nisValid('23 de invalid de 2025', 'D [de] MMMM [de] YYYY', { locale: es }); // => false\n```\n\n### Case-Insensitive Validation\n\n```typescript\nimport { isValid } from 'date-and-time';\n\n// Case-sensitive (default)\nisValid('AUGUST 23, 2025', 'MMMM D, YYYY');   // => false\nisValid('august 23, 2025', 'MMMM D, YYYY');   // => false\n\n// Case-insensitive\nisValid('AUGUST 23, 2025', 'MMMM D, YYYY', { ignoreCase: true });   // => true\nisValid('august 23, 2025', 'MMMM D, YYYY', { ignoreCase: true });   // => true\nisValid('August 23, 2025', 'MMMM D, YYYY');                         // => true (correct case)\n```\n\n### defaultDate Validation\n\nUse `defaultDate` to provide context for validation of partial date strings. The most practical use case is leap year-aware validation of month-day strings.\n\n```typescript\nimport { isValid } from 'date-and-time';\n\n// Leap day validation — result depends on the year\nisValid('02-29', 'MM-DD', { defaultDate: { Y: 2024 } }); // => true  (2024 is a leap year)\nisValid('02-29', 'MM-DD', { defaultDate: { Y: 2023 } }); // => false (2023 is not a leap year)\nisValid('02-29', 'MM-DD');                               // => false (default year 1970 is not a leap year)\n\n// Day range validation — depends on both year and month\nisValid('29', 'D', { defaultDate: { Y: 2024, M: 2 } }); // => true  (Feb 2024 has 29 days)\nisValid('31', 'D', { defaultDate: { Y: 2024, M: 4 } }); // => false (April has 30 days)\n```\n\n**Note**: Values provided in `defaultDate` are also subject to range validation. For example, an out-of-range `H` value in `defaultDate` will cause `isValid()` to return `false`.\n\n## Advanced Validation Patterns\n\n### Multiple Format Validation\n\n```typescript\nimport { isValid } from 'date-and-time';\n\nfunction isValidDate(dateString: string): boolean {\n  const formats = [\n    'YYYY-MM-DD',\n    'MM/DD/YYYY',\n    'DD.MM.YYYY',\n    'MMMM D, YYYY',\n    'MMM D, YYYY'\n  ];\n  \n  return formats.some(format => isValid(dateString, format));\n}\n\n// Usage\nconsole.log(isValidDate('2025-08-23'));      // => true\nconsole.log(isValidDate('08/23/2025'));      // => true\nconsole.log(isValidDate('23.08.2025'));      // => true\nconsole.log(isValidDate('August 23, 2025')); // => true\nconsole.log(isValidDate('invalid-date'));    // => false\n```\n\n### Business Rule Validation\n\n```typescript\nimport { isValid, parse } from 'date-and-time';\n\nfunction isBusinessDay(dateString: string, format: string): boolean {\n  // First check if it's a valid date\n  if (!isValid(dateString, format)) {\n    return false;\n  }\n  \n  // Parse and check if it's a weekday\n  const date = parse(dateString, format);\n  const dayOfWeek = date.getDay();\n  \n  // 0 = Sunday, 6 = Saturday\n  return dayOfWeek >= 1 && dayOfWeek <= 5;\n}\n\n// Usage\nconsole.log(isBusinessDay('2025-08-23', 'YYYY-MM-DD'));  // => false (Saturday)\nconsole.log(isBusinessDay('2025-08-25', 'YYYY-MM-DD'));  // => true (Monday)\n```\n\n### Range Validation\n\n```typescript\nimport { isValid, parse } from 'date-and-time';\n\nfunction isValidInRange(\n  dateString: string, \n  format: string, \n  minDate: Date, \n  maxDate: Date\n): boolean {\n  if (!isValid(dateString, format)) {\n    return false;\n  }\n  \n  const date = parse(dateString, format);\n  return date >= minDate && date <= maxDate;\n}\n\n// Usage\nconst min = new Date(2025, 0, 1);  // Jan 1, 2025\nconst max = new Date(2025, 11, 31); // Dec 31, 2025\n\nconsole.log(isValidInRange('2025-08-23', 'YYYY-MM-DD', min, max));  // => true\nconsole.log(isValidInRange('2024-08-23', 'YYYY-MM-DD', min, max));  // => false\n```\n\n## Performance with Compiled Patterns\n\nFor repeated validation, use `compile()` for better performance:\n\n```typescript\nimport { isValid, compile } from 'date-and-time';\n\n// Compile once\nconst pattern = compile('YYYY-MM-DD HH:mm:ss');\n\n// Validate multiple times (faster)\nconst dateStrings = [\n  '2025-08-23 14:30:45',\n  '2025-08-24 09:15:30',\n  '2025-02-30 12:00:00',  // Invalid\n  '2025-08-25 16:45:20'\n];\n\nconst validDates = dateStrings.filter(dateString => \n  isValid(dateString, pattern)\n);\n\nconsole.log('Valid dates:', validDates);\n// => ['2025-08-23 14:30:45', '2025-08-24 09:15:30', '2025-08-25 16:45:20']\n```\n\n## Common Use Cases\n\n### Form Input Validation\n\n```typescript\nimport { isValid, parse } from 'date-and-time';\n\nclass DateInputValidator {\n  static validateBirthDate(dateString: string): boolean {\n    if (!isValid(dateString, 'YYYY-MM-DD')) {\n      return false;\n    }\n    \n    const date = parse(dateString, 'YYYY-MM-DD');\n    const now = new Date();\n    \n    // Must be in the past and reasonable range\n    return date < now && date > new Date(1900, 0, 1);\n  }\n  \n  static validateAppointment(dateString: string): boolean {\n    if (!isValid(dateString, 'YYYY-MM-DD HH:mm')) {\n      return false;\n    }\n    \n    const date = parse(dateString, 'YYYY-MM-DD HH:mm');\n    const now = new Date();\n    \n    // Must be in the future\n    return date > now;\n  }\n}\n```\n\n### API Input Validation\n\n```typescript\nimport { isValid, parse } from 'date-and-time';\n\nfunction validateApiDateRange(startDate: string, endDate: string) {\n  const format = 'YYYY-MM-DD';\n  \n  // Check both dates are valid\n  if (!isValid(startDate, format) || !isValid(endDate, format)) {\n    throw new Error('Invalid date format. Expected YYYY-MM-DD');\n  }\n  \n  const start = parse(startDate, format);\n  const end = parse(endDate, format);\n  \n  // Check logical order\n  if (start >= end) {\n    throw new Error('Start date must be before end date');\n  }\n  \n  return { start, end };\n}\n```\n\n## See Also\n\n- [`parse()`](./parse) - Parse validated date strings into Date objects\n- [`compile()`](./compile) - Precompile format patterns for performance\n- [`preparse()`](./preparse) - Parse and return intermediate parsing results\n"
  },
  {
    "path": "docs/api/parse.md",
    "content": "---\ntitle: parse()\n---\n\nParses a formatted date string into a Date object according to the specified format pattern.\n\n## Syntax\n\n```typescript\nparse(dateString, formatString[, options])\n```\n\n### Parameters\n\n| Parameter      | Type                       | Required | Description                           |\n|----------------|----------------------------|----------|---------------------------------------|\n| `dateString`   | `string`                   | Yes      | The date string to parse              |\n| `formatString` | `string \\| CompiledObject` | Yes      | The format pattern or compiled object |\n| `options`      | `ParserOptions`            | No       | Parser options for customization      |\n\n### Returns\n\n`Date` - The parsed Date object, or Invalid Date if parsing fails\n\n## Basic Examples\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Basic date parsing\nparse('2025-08-23', 'YYYY-MM-DD');\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n\nparse('08/23/2025', 'MM/DD/YYYY');\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n\nparse('23.08.2025', 'DD.MM.YYYY');\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n\n// Time parsing\nparse('14:30:45', 'HH:mm:ss');\n// => Thu Jan 01 1970 14:30:45 GMT-0800\n\nparse('2:30:45 PM', 'h:mm:ss A');\n// => Thu Jan 01 1970 14:30:45 GMT-0800\n\n// Combined date and time\nparse('2025-08-23 14:30:45', 'YYYY-MM-DD HH:mm:ss');\n// => Fri Aug 23 2025 14:30:45 GMT-0700\n```\n\n## Format Tokens\n\n### Date Tokens\n\n| Token  | Description                | Input Examples    |\n|--------|----------------------------|-------------------|\n| `YYYY` | 4-digit year               | 0999, 2015        |\n| `Y`    | Year without zero padding  | 2, 44, 888, 2015  |\n| `MMMM` | Full month name            | January, December |\n| `MMM`  | Short month name           | Jan, Dec          |\n| `MM`   | Month (01-12)              | 01, 12            |\n| `M`    | Month without zero padding | 1, 12             |\n| `DD`   | Day (01-31)                | 02, 31            |\n| `D`    | Day without zero padding   | 2, 31             |\n\n### Time Tokens\n\n| Token | Description                                 | Input Examples |\n|-------|---------------------------------------------|----------------|\n| `HH`  | Hour in 24-hour format                      | 23, 08         |\n| `H`   | Hour in 24-hour format without zero padding | 23, 8          |\n| `hh`  | Hour in 12-hour format                      | 11, 08         |\n| `h`   | Hour in 12-hour format without zero padding | 11, 8          |\n| `mm`  | Minutes                                     | 14, 07         |\n| `m`   | Minutes without zero padding                | 14, 7          |\n| `ss`  | Seconds                                     | 05, 10         |\n| `s`   | Seconds without zero padding                | 5, 10          |\n| `SSS` | 3-digit milliseconds                        | 753, 022       |\n| `SS`  | 2-digit milliseconds                        | 75, 02         |\n| `S`   | 1-digit milliseconds                        | 7, 0           |\n\n### AM/PM Tokens\n\n| Token | Description                    | Input Examples |\n|-------|--------------------------------|----------------|\n| `A`   | Uppercase AM/PM                | AM, PM         |\n| `AA`  | Uppercase AM/PM (with periods) | A.M., P.M.     |\n| `a`   | Lowercase AM/PM                | am, pm         |\n| `aa`  | Lowercase AM/PM (with periods) | a.m., p.m.     |\n\n### Timezone Tokens\n\n| Token | Description                | Input Examples |\n|-------|----------------------------|----------------|\n| `Z`   | Timezone offset            | +0100, -0800   |\n| `ZZ`  | Timezone offset with colon | +01:00, -08:00 |\n\n### Plugin Tokens\n\nAdditional tokens available with plugins:\n\n| Token       | Description            | Input Examples       | Plugin Required |\n|-------------|------------------------|----------------------|-----------------|\n| `YY`        | 2-digit year           | 90, 00, 08, 19       | two-digit-year  |\n| `DDD`       | Ordinal representation | 1st, 2nd, 3rd        | ordinal         |\n| `dddd`      | Full day name          | Friday, Sunday       | day-of-week     |\n| `ddd`       | Short day name         | Fri, Sun             | day-of-week     |\n| `dd`        | Very short day name    | Fr, Su               | day-of-week     |\n| `SSSSSS`    | 6-digit milliseconds   | 123456, 000001       | microsecond     |\n| `SSSSS`     | 5-digit milliseconds   | 12345, 00001         | microsecond     |\n| `SSSS`      | 4-digit milliseconds   | 1234, 0001           | microsecond     |\n| `fff`       | 3-digit microseconds   | 753, 022             | microsecond     |\n| `ff`        | 2-digit microseconds   | 75, 02               | microsecond     |\n| `f`         | 1-digit microseconds   | 7, 0                 | microsecond     |\n| `SSSSSSSSS` | 9-digit milliseconds   | 123456789, 000000001 | nanosecond      |\n| `SSSSSSSS`  | 8-digit milliseconds   | 12345678, 00000001   | nanosecond      |\n| `SSSSSSS`   | 7-digit milliseconds   | 1234567, 0000001     | nanosecond      |\n| `FFF`       | 3-digit nanoseconds    | 753, 022             | nanosecond      |\n| `FF`        | 2-digit nanoseconds    | 75, 02               | nanosecond      |\n| `F`         | 1-digit nanoseconds    | 7, 0                 | nanosecond      |\n\nFor available plugins, see the [`plugins`](#plugins) option in ParserOptions.\n\n## ParserOptions\n\nThe `ParserOptions` object allows you to customize the parsing behavior:\n\n```typescript\ninterface ParserOptions {\n  locale?: Locale;\n  timeZone?: TimeZone | string;\n  numeral?: Numeral;\n  calendar?: 'gregory' | 'buddhist';\n  hour12?: 'h11' | 'h12';\n  hour24?: 'h23' | 'h24';\n  ignoreCase?: boolean;\n  defaultDate?: ParsedComponents;\n  plugins?: ParserPlugin[];\n}\n```\n\n### locale\n\n**Type**: `Locale`  \n**Default**: `en` (English)\n\nSpecifies the locale for parsing localized month names, day names, and meridiem indicators.\n\n```typescript\nimport { parse } from 'date-and-time';\nimport es from 'date-and-time/locales/es';\n\n// Spanish parsing\nparse('23 de agosto de 2025', 'D [de] MMMM [de] YYYY', { locale: es });\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n```\n\nFor a complete list of all supported locales with import examples, see [Supported Locales](../locales).\n\n### timeZone\n\n**Type**: `TimeZone | string`  \n**Default**: `undefined` (local timezone)\n\nInterprets the parsed date in the specified timezone.\n\n**Note**: If the input string contains a timezone offset (e.g., `Z` or `ZZ` tokens), that offset takes precedence and the `timeZone` option is ignored.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Parse using an IANA timezone name string\nparse('2025-08-23 14:30:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\n// => Fri Aug 23 2025 14:30:00 GMT+0900\n\n// Parse in UTC\nparse('2025-08-23 14:30:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'UTC' });\n// => Fri Aug 23 2025 14:30:00 GMT+0000\n\n// Timezone offset in input takes precedence over timeZone option\nparse('2025-08-23 14:30:00 +0300', 'YYYY-MM-DD HH:mm:ss Z', { timeZone: 'Asia/Tokyo' });\n// => Fri Aug 23 2025 14:30:00 GMT+0300 (Asia/Tokyo timeZone is ignored)\n\nparse('2025-08-23T14:30:00 +05:00', 'YYYY-MM-DD[T]HH:mm:ss ZZ', { timeZone: 'America/New_York' });\n// => Fri Aug 23 2025 14:30:00 GMT+0500 (America/New_York timeZone is ignored)\n```\n\nFor a complete list of all supported timezones, see [Supported Timezones](../timezones).\n\n### numeral\n\n**Type**: `Numeral`  \n**Default**: `latn` (Latin numerals)\n\nSpecifies the numeral system for parsing numbers.\n\n```typescript\nimport { parse } from 'date-and-time';\nimport arab from 'date-and-time/numerals/arab';\nimport beng from 'date-and-time/numerals/beng';\n\n// Arabic-Indic numerals\nparse('٠٨/٠٧/٢٠٢٥', 'DD/MM/YYYY', { numeral: arab });\n// => Fri Aug 08 2025 00:00:00 GMT-0700\n\n// Bengali numerals\nparse('০৮/০৭/২০২৫', 'DD/MM/YYYY', { numeral: beng });\n// => Fri Aug 08 2025 00:00:00 GMT-0700\n```\n\n**Available numeral systems:**\n\n- `latn` - Latin numerals (0-9) - default\n- `arab` - Arabic-Indic numerals (٠-٩)\n- `arabext` - Extended Arabic-Indic numerals (۰-۹)\n- `beng` - Bengali numerals (০-৯)\n- `mymr` - Myanmar numerals (၀-၉)\n\n### calendar\n\n**Type**: `\"gregory\" | \"buddhist\"`  \n**Default**: `\"gregory\"`\n\nSpecifies the calendar system for date calculations.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Gregorian calendar (default)\nparse('August 23, 2025', 'MMMM D, YYYY');\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n\n// Buddhist calendar (543 years behind)\nparse('August 23, 2568', 'MMMM D, YYYY', { calendar: 'buddhist' });\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n```\n\n### hour12\n\n**Type**: `\"h11\" | \"h12\"`  \n**Default**: `\"h12\"`\n\nControls the 12-hour format interpretation. Use `h11` for 11-hour format (0-11) or `h12` for 12-hour format (1-12).\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// h12 format - midnight is 12 AM\nparse('12:30 AM', 'h:mm A', { hour12: 'h12' });\n// => Thu Jan 01 1970 00:30:00 GMT-0800\n\n// h11 format - midnight is 0 AM\nparse('0:30 AM', 'h:mm A', { hour12: 'h11' });\n// => Thu Jan 01 1970 00:30:00 GMT-0800\n```\n\n### hour24\n\n**Type**: `\"h23\" | \"h24\"`  \n**Default**: `\"h23\"`\n\nControls the 24-hour format interpretation. Use `h23` for 23-hour format (0-23) or `h24` for 24-hour format (1-24).\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// h23 format - midnight is 0\nparse('0:30', 'H:mm', { hour24: 'h23' });\n// => Thu Jan 01 1970 00:30:00 GMT-0800\n\n// h24 format - midnight is 24 (of previous day)\nparse('24:30', 'H:mm', { hour24: 'h24' });\n// => Thu Jan 01 1970 00:30:00 GMT-0800\n```\n\n### ignoreCase\n\n**Type**: `boolean`  \n**Default**: `false`\n\nEnables case-insensitive parsing for text elements.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Case-sensitive (default)\nparse('august 23, 2025', 'MMMM D, YYYY');\n// => Invalid Date\n\n// Case-insensitive\nparse('AUGUST 23, 2025', 'MMMM D, YYYY', { ignoreCase: true });\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n\nparse('fri aug 23 2025', 'ddd MMM DD YYYY', { ignoreCase: true });\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n```\n\n### defaultDate\n\n**Type**: `ParsedComponents`  \n**Default**: `{ Y: 1970, M: 1, D: 1, m: 0, s: 0, S: 0 }`\n\nSpecifies default values for date/time components that are missing from the format string. This is useful when parsing partial strings such as time-only or month-day formats.\n\n```typescript\ninterface ParsedComponents {\n  Y?: number;  // Year\n  M?: number;  // Month (1-12)\n  D?: number;  // Day\n  H?: number;  // Hour (24-hour)\n  A?: number;  // Meridiem (0: AM, 1: PM)\n  h?: number;  // Hour (12-hour)\n  m?: number;  // Minute\n  s?: number;  // Second\n  S?: number;  // Millisecond\n  Z?: number;  // Timezone offset in minutes (e.g., UTC+9 = -540)\n}\n```\n\n**Note**: If `defaultDate.Z` is set, it takes precedence over the `timeZone` option. `Z` is in minutes, using the same sign convention as the `Z` / `ZZ` format tokens (e.g., UTC+9 = `-540`).\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Parse time-only string — fill in date from defaultDate\nparse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15 } });\n// => Fri Mar 15 2024 12:30:00\n\n// Parse month-day only — fill in year from defaultDate\nparse('03-15', 'MM-DD', { defaultDate: { Y: 2024 } });\n// => Fri Mar 15 2024 00:00:00\n\n// Fill in time components for a date-only format\nparse('2024-03-15', 'YYYY-MM-DD', { defaultDate: { H: 10, m: 30, s: 45 } });\n// => Fri Mar 15 2024 10:30:45\n\n// defaultDate.Z takes precedence over timeZone option\nparse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 }, timeZone: 'UTC' });\n// => Fri Mar 15 2024 03:30:00 UTC  (interpreted as UTC+9; timeZone: 'UTC' is ignored)\n```\n\n### plugins\n\n**Type**: `ParserPlugin[]`  \n**Default**: `undefined`\n\nEnables additional parse tokens provided by plugins. Plugins extend the parser with special tokens that are not included in the core library.\n\n```typescript\nimport { parse } from 'date-and-time';\nimport { parser as ordinal } from 'date-and-time/plugins/ordinal';\nimport { parser as two_digit_year } from 'date-and-time/plugins/two-digit-year';\nimport { parser as microsecond } from 'date-and-time/plugins/microsecond';\n\n// Use ordinal plugin\nparse('January 1st, 2025', 'MMMM DDD, YYYY', { plugins: [ordinal] });\n// => Wed Jan 01 2025 00:00:00 GMT-0800\n\n// Use two-digit-year plugin\nparse('12/25/99', 'MM/DD/YY', { plugins: [two_digit_year] });\n// => Sat Dec 25 1999 00:00:00 GMT-0800\n\n// Use microsecond plugin\nparse('14:30:45.123456', 'HH:mm:ss.SSSSSS', { plugins: [microsecond] });\n// => Thu Jan 01 1970 14:30:45 GMT-0800\n\n// Use multiple plugins together\nparse('January 1st, 99 14:30:45.123456', 'MMMM DDD, YY HH:mm:ss.SSSSSS', {\n  plugins: [ordinal, two_digit_year, microsecond]\n});\n// => Fri Jan 01 1999 14:30:45 GMT-0800\n```\n\nFor a complete list of available plugins, see [Plugins](../plugins).\n\n## Parsing Behavior and Limitations\n\n### Default Date and Time Values\n\nWhen parsing partial dates or times, missing components are filled with default values. The default date is `January 1, 1970`, and the default time is `00:00:00.000`.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Only time - defaults to Jan 1, 1970\nparse('14:30:45', 'HH:mm:ss');\n// => Thu Jan 01 1970 14:30:45 GMT-0800\n\n// Only date - defaults to 00:00:00\nparse('2025-08-23', 'YYYY-MM-DD');\n// => Fri Aug 23 2025 00:00:00 GMT-0700\n\n// Year and month - defaults to 1st day\nparse('2025-08', 'YYYY-MM');\n// => Fri Aug 01 2025 00:00:00 GMT-0700\n\n// Just year - defaults to Jan 1st, 00:00:00\nparse('2025', 'YYYY');\n// => Wed Jan 01 2025 00:00:00 GMT-0800\n```\n\nTo customize these defaults, use the [`defaultDate`](#defaultdate) option.\n\n### Date Range Limitations\n\nThe parsable maximum date is `December 31, 9999`, and the minimum date is `January 1, 0001`.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Valid maximum date\nparse('Dec 31 9999', 'MMM D YYYY');\n// => Fri Dec 31 9999 00:00:00 GMT-0800\n\n// Invalid - exceeds maximum\nparse('Dec 31 10000', 'MMM D YYYY');\n// => Invalid Date\n\n// Valid minimum date\nparse('Jan 1 0001', 'MMM D YYYY');\n// => Mon Jan 1 0001 00:00:00 GMT-0800\n\n// Invalid - below minimum\nparse('Jan 1 0000', 'MMM D YYYY');\n// => Invalid Date\n```\n\n### UTC Input Parsing\n\nIf the input string doesn't contain a timezone offset and no `timeZone` option is specified, the function treats the input as the local timezone. To parse input as UTC, set `timeZone: 'UTC'` in the options.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Parsed as the local timezone\nparse('14:30:45', 'HH:mm:ss');\n// => Thu Jan 01 1970 14:30:45 GMT-0800\n\n// Timezone offset in input takes precedence\nparse('14:30:45 +0000', 'HH:mm:ss Z');\n// => Thu Jan 01 1970 14:30:45 GMT+0000\n\n// Force UTC parsing\nparse('14:30:45', 'HH:mm:ss', { timeZone: 'UTC' });\n// => Thu Jan 01 1970 14:30:45 GMT+0000\n```\n\n### 12-hour Format and Meridiem\n\nWhen using 12-hour format tokens (`h` or `hh`), always include the meridiem token (`A` or `a`) for correct parsing.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Without meridiem - ambiguous time\nparse('11:30:45', 'h:mm:ss');\n// => Thu Jan 01 1970 11:30:45 GMT-0800 (assumes AM)\n\n// With meridiem - unambiguous time\nparse('11:30:45 PM', 'h:mm:ss A');\n// => Thu Jan 01 1970 23:30:45 GMT-0800\n```\n\n## Advanced Usage\n\n### Comments in Format Strings\n\nParts of the format string enclosed in square brackets are treated as literal text:\n\n```typescript\nimport { parse } from 'date-and-time';\n\nparse('Today is Saturday, August 23, 2025', '[Today is] dddd, MMMM D, YYYY');\n// => Sat Aug 23 2025 00:00:00 GMT-0700\n\nparse('2025-08-23T14:30:45Z', 'YYYY-MM-DD[T]HH:mm:ss[Z]');\n// => Sat Aug 23 2025 14:30:45 GMT-0700\n\nparse('Report generated on 2025/08/23 at 14:30', '[Report generated on] YYYY/MM/DD [at] HH:mm');\n// => Sat Aug 23 2025 14:30:00 GMT-0700\n\n// Escape square brackets to parse them from input string\nparse('[2025-08-23 14:30:45]', '\\\\[YYYY-MM-DD HH:mm:ss\\\\]');\n// => Sat Aug 23 2025 14:30:45 GMT-0700\n```\n\n### Wildcard Parsing\n\nWhitespace in the format string acts as a wildcard token, allowing you to skip corresponding parts of the input string. The character count must match between the format string and input string.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// This will fail - extra content not accounted for\nparse('2025/08/23 14:30:45', 'YYYY/MM/DD');\n// => Invalid Date\n\n// Use whitespace as wildcard (9 spaces to match ' 14:30:45')\nparse('2025/08/23 14:30:45', 'YYYY/MM/DD           ');\n// => Sat Aug 23 2025 00:00:00 GMT-0700\n```\n\n### Ellipsis Token\n\nThe `...` token ignores all subsequent content in the input string. Use this token only at the end of a format string.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Ignore everything after the date\nparse('2025/08/23 14:30:45', 'YYYY/MM/DD...');\n// => Sat Aug 23 2025 00:00:00 GMT-0700\n\n// More complex example\nparse('Log entry: 2025-08-23 some extra data here', '[Log entry: ]YYYY-MM-DD...');\n// => Sat Aug 23 2025 00:00:00 GMT-0700\n```\n\n### Complex Localized Parsing\n\n```typescript\nimport { parse } from 'date-and-time';\nimport fr from 'date-and-time/locales/fr';\n\n// French with timezone\nparse('samedi, 23 août 2025 à 14:30:45', 'dddd, D MMMM YYYY [à] HH:mm:ss', {\n  locale: fr,\n  timeZone: 'Europe/Paris'\n});\n// => Fri Aug 23 2025 14:30:45 GMT+0200\n```\n\n### Business and Technical Formats\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// ISO 8601 format\nparse('2025-08-23T14:30:45.123Z', 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]', { timeZone: 'UTC' });\n// => Fri Aug 23 2025 14:30:45 GMT+0000\n\n// RFC 2822 format\nparse('Sat, 23 Aug 2025 14:30:45 +0900', 'ddd, DD MMM YYYY HH:mm:ss ZZ');\n// => Sat Aug 23 2025 14:30:45 GMT+0900\n\n// File naming format\nparse('20250823_143045', 'YYYYMMDD_HHmmss');\n// => Sat Aug 23 2025 14:30:45 GMT-0700\n```\n\n## Error Handling\n\n### When Parsing Fails\n\nIf the `parse()` function fails to parse the input, it returns an `Invalid Date` object. Note that `Invalid Date` is still a Date object, not `NaN` or `null`.\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// Example of parsing failure\nconst result = parse('invalid-date', 'YYYY-MM-DD');\n\n// Check if parsing failed\nif (isNaN(result.getTime())) {\n  console.error('Parse failed - invalid date');\n} else {\n  console.log('Successfully parsed:', result);\n}\n\n// Common parsing failures\nparse('Jam 1 2017', 'MMM D YYYY');     // Invalid - 'Jam' is not a valid month\nparse('2025-02-30', 'YYYY-MM-DD');     // Invalid - Feb 30th doesn't exist\nparse('2025-13-01', 'YYYY-MM-DD');     // Invalid - month 13 doesn't exist\nparse('25:30:00', 'HH:mm:ss');         // Invalid - hour 25 doesn't exist\nparse('12 hours 34', 'HH hours mm');   // Invalid - format mismatch\n```\n\n## Performance Considerations\n\nFor repeated parsing with the same pattern, use [`compile()`](./compile):\n\n```typescript\nimport { parse, compile } from 'date-and-time';\n\n// Compile once\nconst pattern = compile('YYYY-MM-DD HH:mm:ss');\n\n// Reuse for better performance\nconst dateStrings = ['2025-08-23 14:30:45', '2025-08-24 09:15:30'];\ndateStrings.forEach(dateString => {\n  const parsed = parse(dateString, pattern);\n  console.log(parsed);\n});\n```\n\n## Common Parsing Patterns\n\n### Log Timestamps\n\n```typescript\nimport { parse } from 'date-and-time';\n\nconst logLine = '[2025-08-23 14:30:45.123] Application started';\nconst timestamp = parse(logLine, ' YYYY-MM-DD HH:mm:ss.SSS ...');\n// => Sat Aug 23 2025 14:30:45 GMT-0700\n\n// For different log formats\nconst syslogLine = 'Aug 23 14:30:45 server: Process started';\nconst syslogTimestamp = parse(syslogLine, 'MMM DD HH:mm:ss...');\n// => Sat Aug 23 1970 14:30:45 GMT-0700\n```\n\n### API Responses\n\n```typescript\nimport { parse } from 'date-and-time';\n\nconst apiTimestamp = '2025-08-23T14:30:45Z';\nconst date = parse(apiTimestamp, 'YYYY-MM-DD[T]HH:mm:ss[Z]', { timeZone: 'UTC' });\n```\n\n### User Input\n\n```typescript\nimport { parse } from 'date-and-time';\n\nfunction parseUserDate(input: string) {\n  const formats = [\n    'YYYY-MM-DD',\n    'MM/DD/YYYY',\n    'DD.MM.YYYY',\n    'MMMM D, YYYY'\n  ];\n  \n  for (const format of formats) {\n    const result = parse(input, format);\n    if (!isNaN(result.getTime())) {\n      return result;\n    }\n  }\n  \n  throw new Error('Unable to parse date');\n}\n```\n\n## See Also\n\n- [`compile()`](./compile) - Precompile format patterns for performance\n- [`preparse()`](./preparse) - Parse and return intermediate parsing results\n- [`isValid()`](./isValid) - Validate date string formats\n"
  },
  {
    "path": "docs/api/preparse.md",
    "content": "---\ntitle: preparse()\n---\n\nPre-parses date strings and returns intermediate parsing results. This function is useful when you need to examine parsing details before creating a final Date object.\n\n## Syntax\n\n```typescript\npreparse(dateString, formatString[, options])\n```\n\n### Parameters\n\n| Parameter      | Type                       | Required | Description                                                              |\n|----------------|----------------------------|----------|--------------------------------------------------------------------------|\n| `dateString`   | `string`                   | Yes      | The date string to parse                                                 |\n| `formatString` | `string \\| CompiledObject` | Yes      | Format pattern string or compiled object                                 |\n| `options`      | `ParserOptions`            | No       | Parsing options for customization (see [`parse()`](./parse#parseroptions) for details) |\n\n### Returns\n\n`ParseResult` - Object containing parsed date components\n\n```typescript\ninterface ParseResult {\n  Y?: number        // Year\n  M?: number        // Month (1-12)\n  D?: number        // Day\n  H?: number        // Hours (24-hour format, 0-23)\n  A?: number        // AM/PM (0 = AM, 1 = PM)\n  h?: number        // Hours (12-hour format, 1-12)\n  m?: number        // Minutes (0-59)\n  s?: number        // Seconds (0-59)\n  S?: number        // Milliseconds (0-999)\n  SS?: number       // 2-digit milliseconds (0-99)\n  SSS?: number      // 3-digit milliseconds (0-999)\n  Z?: number        // Timezone offset in minutes\n  _index?: number   // Current parsing position\n  _length?: number  // Total length of input string\n  _match?: number   // Number of matched tokens\n}\n```\n\n## Basic Examples\n\n### Simple Date Parsing\n\n```typescript\nimport { preparse } from 'date-and-time';\n\nconst result = preparse('2025-08-23 14:30:45', 'YYYY-MM-DD HH:mm:ss');\nconsole.log(result);\n// {\n//   Y: 2025,\n//   M: 8,\n//   D: 23,\n//   H: 14,\n//   m: 30,\n//   s: 45\n// }\n```\n\n### With 12-hour Format\n\n```typescript\nconst result = preparse('2025-08-23 2:30:45 PM', 'YYYY-MM-DD h:mm:ss A');\nconsole.log(result);\n// {\n//   Y: 2025,\n//   M: 8,\n//   D: 23,\n//   A: 1,    // PM\n//   h: 2,\n//   m: 30,\n//   s: 45\n// }\n```\n\n### With Localized Content\n\n```typescript\nimport { preparse } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\n\nconst result = preparse('2025年8月23日', 'YYYY年M月D日', { locale: ja });\nconsole.log(result);\n// {\n//   Y: 2025,\n//   M: 8,\n//   D: 23\n// }\n```\n\n## ParserOptions\n\nThe `options` parameter accepts the same `ParserOptions` as the [`parse()`](./parse#parseroptions) function. This includes locale, timezone, numeral system, calendar, case sensitivity, hour format settings, and `defaultDate`. Refer to the parse documentation for complete details on all available options.\n\n## Use Cases\n\n### Validation Before Parsing\n\n```typescript\nimport { preparse, parse, isValid } from 'date-and-time';\n\nfunction safeParse(dateString: string, format: string) {\n  const result = preparse(dateString, format);\n  \n  // Check if required components are present\n  if (result.Y && result.M && result.D) {\n    return parse(dateString, format);\n  }\n  \n  throw new Error('Missing required date components');\n}\n```\n\n### Custom Date Validation\n\n```typescript\nfunction validateBusinessDay(dateString: string, format: string) {\n  const result = preparse(dateString, format);\n  \n  if (result.Y && result.M && result.D) {\n    const date = new Date(result.Y, result.M - 1, result.D);\n    const dayOfWeek = date.getDay();\n    \n    if (dayOfWeek === 0 || dayOfWeek === 6) {\n      throw new Error('Business days only (Monday-Friday)');\n    }\n    \n    return date;\n  }\n  \n  throw new Error('Invalid date format');\n}\n```\n\n## Error Handling\n\nIf parsing fails, `preparse()` returns an object with parsing metadata but without the main date components (Y, M, D, H, etc.).\n\n```typescript\nconst result = preparse('invalid-date', 'YYYY-MM-DD');\nconsole.log(result);\n// {\n//   _index: 0,\n//   _length: 12,\n//   _match: 0\n// }\n\n// Check for successful parsing by looking for date components\nif (!result.Y && !result.M && !result.D) {\n  console.log('Parsing failed - no date components found');\n}\n\n// Alternative: check the _match property\nif (result._match === 0) {\n  console.log('Parsing failed - no tokens matched');\n}\n```\n\n## See Also\n\n- [`parse()`](./parse) - Parse formatted date strings into Date objects\n- [`compile()`](./compile) - Precompile format patterns for performance\n- [`isValid()`](./isValid) - Validate date string formats\n"
  },
  {
    "path": "docs/api/subtract.md",
    "content": "---\ntitle: subtract()\n---\n\nCalculates the difference between two Date objects and returns a rich Duration object with multiple time units and formatting options.\n\n## Syntax\n\n```typescript\nsubtract(date1, date2)\n```\n\n### Parameters\n\n| Parameter | Type   | Required | Description            |\n|-----------|--------|----------|------------------------|\n| `date1`   | `Date` | Yes      | The earlier/start date |\n| `date2`   | `Date` | Yes      | The later/end date     |\n\n### Returns\n\n`Duration` - Rich duration object containing the time difference with properties for years, months, days, hours, minutes, seconds, and milliseconds\n\n## Basic Examples\n\n### Calculating Time Differences\n\n```typescript\nimport { subtract } from 'date-and-time';\n\nconst start = new Date(2024, 0, 1, 10, 30, 0);  // January 1, 2024 10:30:00\nconst end = new Date(2024, 0, 1, 14, 45, 30);   // January 1, 2024 14:45:30\n\nconst duration = subtract(start, end);\n\nconsole.log(duration.toHours().value);    // 4.258333...\nconsole.log(duration.toMinutes().value);  // 255.5\nconsole.log(duration.toSeconds().value);  // 15330\n\nconst hoursParts = duration.toHours().toParts();\n\nconsole.log(hoursParts.hours);    // 4\nconsole.log(hoursParts.minutes);  // 15\nconsole.log(hoursParts.seconds);  // 30\n```\n\n### Cross-Day Calculation\n\n```typescript\nconst start = new Date(2024, 6, 15, 22, 30); // July 15, 2024 22:30\nconst end = new Date(2024, 6, 18, 8, 15);     // July 18, 2024 08:15\n\nconst duration = subtract(start, end);\nconst daysParts = duration.toDays().toParts();\n\nconsole.log(daysParts.days);     // 2\nconsole.log(daysParts.hours);    // 9\nconsole.log(daysParts.minutes);  // 45\nconsole.log(duration.toHours().value); // 57.75 (total hours as decimal)\n```\n\n### Age Calculation\n\n```typescript\nconst birthDate = new Date(1990, 5, 15); // June 15, 1990\nconst today = new Date(); // Current date\n\nconst age = subtract(birthDate, today);\nconst ageParts = age.toDays().toParts();\n\n// Note: Simple age calculation (not accounting for leap years)\nconsole.log(`Age: ${Math.floor(ageParts.days / 365)} years`);\n\n// Get total days lived\nconsole.log(`Total days lived: ${ageParts.days}`);\n```\n\n## Duration Object Methods\n\nThe returned Duration object provides methods to convert and format durations. The Duration can also be directly instantiated with a millisecond value:\n\n```typescript\nclass Duration {\n  constructor(milliseconds: number)  // Create Duration instance directly\n  \n  // Convert to different time units with value and formatting capabilities\n  toNanoseconds(): DurationDescriptor<NanosecondsParts>\n  toMicroseconds(): DurationDescriptor<MicrosecondsParts>\n  toMilliseconds(): DurationDescriptor<MillisecondsParts>\n  toSeconds(): DurationDescriptor<SecondsParts>\n  toMinutes(): DurationDescriptor<MinutesParts>\n  toHours(): DurationDescriptor<HoursParts>\n  toDays(): DurationDescriptor<DaysParts>\n}\n\ninterface DurationDescriptor<T> {\n  value: number                                        // Total duration in the specified unit\n  format: (formatString: string, numeral?: Numeral) => string  // Format duration with custom pattern\n  toParts: () => T                                     // Get duration broken down into parts\n}\n\n// Example part interfaces\ninterface HoursParts {\n  hours: number\n  minutes: number\n  seconds: number\n  milliseconds: number\n  microseconds: number\n  nanoseconds: number\n}\n```\n\n### Creating Duration Instances Directly\n\n```typescript\nimport { Duration } from 'date-and-time';\n\n// Create a Duration for 2 hours (7200000 milliseconds)\nconst duration = new Duration(7200000);\nconsole.log(duration.toHours().value);     // 2\nconsole.log(duration.toMinutes().value);   // 120\n\n// Format the duration\nconsole.log(duration.toHours().format('H[h] m[m]'));  // \"2h 0m\"\n```\n\n### Advanced Duration Formatting\n\n```typescript\nconst start = new Date(2024, 7, 15, 9, 30, 45);\nconst end = new Date(2024, 7, 18, 16, 15, 20);\nconst duration = subtract(start, end);\n\n// Various formatting options\nconsole.log(duration.toDays().format('D[d] H[h] m[m]'));          // \"3d 6h 44m\"\nconsole.log(duration.toHours().format('H:mm:ss'));                // \"78:44:35\"\nconsole.log(duration.toMinutes().format('[Total minutes:] m'));   // \"Total minutes: 4724\"\nconsole.log(duration.toDays().format('D[day], H:mm:ss.SSS'));     // \"3day, 6:44:35.000\"\n```\n\n## Use Cases\n\n### Work Session Tracking\n\n```typescript\nconst clockIn = new Date(2024, 7, 15, 9, 0);   // August 15, 2024 09:00\nconst clockOut = new Date(2024, 7, 15, 17, 45); // August 15, 2024 17:45\n\nconst duration = subtract(clockIn, clockOut);\nconsole.log(duration.toHours().value);           // 8.75\nconsole.log(duration.toHours().format('H:mm'));  // \"8:45\"\nconsole.log(duration.toHours().format('H[h] m[m]'));  // \"8h 45m\"\n```\n\n### Performance Monitoring\n\n```typescript\nconst start = performance.now();\n// ... some operation ...\nconst end = performance.now();\n\n// Create Duration directly from millisecond difference\nconst duration = new Duration(end - start);\n\nconsole.log(duration.toMilliseconds().format('SSS[ms]'));  // \"234ms\"\n```\n\n## Edge Cases and Behavior\n\n### Negative Durations\n\nWhen the first argument is later than the second argument, `subtract()` returns negative duration values. This behavior allows for flexible date comparison in either direction.\n\n```typescript\n// Comparing dates in reverse chronological order\nconst later = new Date(2024, 7, 15, 14, 30);    // 2:30 PM\nconst earlier = new Date(2024, 7, 15, 10, 15);  // 10:15 AM\n\nconst negativeDuration = subtract(later, earlier);\nconsole.log(negativeDuration.toHours().value);    // -4.25 (negative value)\nconsole.log(negativeDuration.toMinutes().value);  // -255 (all values are negative)\n\n// Format methods handle negative values appropriately\nconsole.log(negativeDuration.toHours().format('H[h] m[m]'));  // \"-4h 15m\"\n```\n\n### Negative Zero\n\nAn edge case of negative durations occurs when the difference is negative but the integer part of certain units is zero. This affects both `toParts()` and `format()` output differently.\n\n```typescript\n// Short negative duration (less than 1 day but more than 1 hour)\nconst date1 = new Date(2024, 7, 15, 14, 30);  // 2:30 PM\nconst date2 = new Date(2024, 7, 15, 12, 15);  // 12:15 PM\n\nconst duration = subtract(date1, date2);\nconsole.log(duration.toDays().value);   // -0.09375 (negative but less than 1 day)\n\n// toParts() shows negative signs on all non-zero unit values\nconst parts = duration.toDays().toParts();\nconsole.log(parts);  // { days: 0, hours: -2, minutes: -15, seconds: 0, ... }\n\n// format() places a single negative sign at the beginning, potentially creating \"-0\"\nconsole.log(duration.toDays().format('D[day], H:mm:ss'));  // \"-0day, 2:15:00\"\n```\n\n## Immutability\n\nBoth input Date objects remain unchanged:\n\n```typescript\nconst date1 = new Date(2024, 7, 15, 14, 30);\nconst date2 = new Date(2024, 7, 15, 12, 15);\nconst duration = subtract(date2, date1);\n\nconsole.log(date1); // Unchanged\nconsole.log(date2); // Unchanged\nconsole.log(duration.toHours().value);  // 2.25 (new Duration object)\n```\n\n## See Also\n\n- [`addYears()`](./addYears) - Add/subtract years\n- [`addMonths()`](./addMonths) - Add/subtract months\n- [`addDays()`](./addDays) - Add/subtract days\n- [`addHours()`](./addHours) - Add/subtract hours\n- [`addMinutes()`](./addMinutes) - Add/subtract minutes\n- [`addSeconds()`](./addSeconds) - Add/subtract seconds\n- [`addMilliseconds()`](./addMilliseconds) - Add/subtract milliseconds\n"
  },
  {
    "path": "docs/api/transform.md",
    "content": "---\ntitle: transform()\n---\n\nTransforms date strings from one format to another. This is a convenience function that combines parse() and format() operations.\n\n## Syntax\n\n```typescript\ntransform(dateString, sourceFormat, targetFormat[, parserOptions, formatterOptions])\n```\n\n### Parameters\n\n| Parameter          | Type                       | Required | Description                               |\n|--------------------|----------------------------|----------|-------------------------------------------|\n| `dateString`       | `string`                   | Yes      | The input date string to transform        |\n| `sourceFormat`     | `string \\| CompiledObject` | Yes      | Source format pattern or compiled pattern |\n| `targetFormat`     | `string \\| CompiledObject` | Yes      | Target format pattern or compiled pattern |\n| `parserOptions`    | `ParserOptions`            | No       | Options for parsing the source string     |\n| `formatterOptions` | `FormatterOptions`         | No       | Options for formatting the target string  |\n\n### Returns\n\n`string` - The transformed date string in the target format\n\n## Basic Examples\n\n### Format Transformation\n\n```typescript\nimport { transform } from 'date-and-time';\n\n// ISO to US format\nconst result = transform('2025-08-23', 'YYYY-MM-DD', 'MM/DD/YYYY');\nconsole.log(result); // '08/23/2025'\n\n// Add time components\nconst withTime = transform('2025-08-23', 'YYYY-MM-DD', 'DD/MM/YYYY HH:mm:ss');\nconsole.log(withTime); // '23/08/2025 00:00:00'\n```\n\n### Time Format Conversion\n\n```typescript\n// 24-hour to 12-hour format\nconst time12 = transform('14:30:45', 'HH:mm:ss', 'h:mm:ss A');\nconsole.log(time12); // '2:30:45 PM'\n\n// 12-hour to 24-hour format\nconst time24 = transform('2:30:45 PM', 'h:mm:ss A', 'H:mm:ss');\nconsole.log(time24); // '14:30:45'\n```\n\n### With Localized Formats\n\n```typescript\nimport es from 'date-and-time/locales/es';\n\n// Transform Spanish to English UTC\nconst localized = transform(\n  'viernes, 23 ago 2025 14:30:45 GMT+0200',\n  'dddd, DD MMM YYYY HH:mm:ss [GMT]Z',\n  'ddd, DD MMM YYYY HH:mm:ss [GMT]',\n  { locale: es }\n);\nconsole.log(localized); // 'Fri, 23 Aug 2025 12:30:45 GMT'\n```\n\n### Using Compiled Patterns\n\n```typescript\nimport { compile, transform } from 'date-and-time';\n\n// Precompile for better performance\nconst sourcePattern = compile('YYYY-MM-DD HH:mm:ss');\nconst targetPattern = compile('DD/MM/YYYY h:mm:ss A');\n\nconst result = transform(\n  '2025-08-23 14:30:45',\n  sourcePattern,\n  targetPattern\n);\nconsole.log(result); // '23/08/2025 2:30:45 PM'\n```\n\n## Use Cases\n\n### API Response Transformation\n\n```typescript\nfunction normalizeApiDates(apiResponse: any) {\n  // Transform API dates to display format\n  if (apiResponse.created_at) {\n    apiResponse.created_at = transform(\n      apiResponse.created_at,\n      'YYYY-MM-DD[T]HH:mm:ss[Z]',\n      'MMM DD, YYYY [at] h:mm A'\n    );\n  }\n  return apiResponse;\n}\n\nconst data = { created_at: '2025-08-23T14:30:45Z' };\nconsole.log(normalizeApiDates(data));\n// { created_at: 'Aug 23, 2025 at 2:30 PM' }\n```\n\n### Batch Format Conversion\n\n```typescript\nfunction convertDateFormats(dates: string[], sourceFormat: string, targetFormat: string) {\n  return dates.map(date => transform(date, sourceFormat, targetFormat));\n}\n\nconst dates = ['2025-08-23', '2025-08-24', '2025-08-25'];\nconst converted = convertDateFormats(dates, 'YYYY-MM-DD', 'DD/MM/YYYY');\nconsole.log(converted);\n// ['23/08/2025', '24/08/2025', '25/08/2025']\n```\n\n### Form Input Standardization\n\n```typescript\nfunction standardizeUserInput(userDate: string, userFormat: string) {\n  // Always convert user input to ISO format for storage\n  return transform(userDate, userFormat, 'YYYY-MM-DD');\n}\n\nconst userInput = '23/08/2025';\nconst standardized = standardizeUserInput(userInput, 'DD/MM/YYYY');\nconsole.log(standardized); // '2025-08-23'\n```\n\n## Implementation Details\n\nThe `transform()` function is a convenience wrapper that internally:\n\n1. Parses the input string using the source format\n2. Formats the resulting Date object using the target format\n\n```typescript\n// transform() is equivalent to:\nconst date = parse(dateString, sourceFormat);\nconst result = format(date, targetFormat);\n\n// But provides a cleaner API:\nconst result = transform(dateString, sourceFormat, targetFormat);\n```\n\n## See Also\n\n- [`format()`](./format) - Format Date objects using compiled patterns\n- [`compile()`](./compile) - Precompile format patterns for performance\n"
  },
  {
    "path": "docs/api/utils/getDaysInMonth.md",
    "content": "---\ntitle: getDaysInMonth()\n---\n\nReturns the number of days in a given month of a specific year. Correctly handles leap years when calculating February.\n\n## Syntax\n\n```typescript\ngetDaysInMonth(date)\ngetDaysInMonth(year, month)\n```\n\n### Parameters\n\n| Parameter | Type     | Required         | Description                            |\n|-----------|----------|------------------|----------------------------------------|\n| `date`    | `Date`   | Yes (overload 1) | The date object whose month to examine |\n| `year`    | `number` | Yes (overload 2) | The Gregorian year (1–9999)            |\n| `month`   | `number` | Yes (overload 2) | The month (1–12)                       |\n\n### Returns\n\n`number` - The number of days in the specified month\n\n## Basic Examples\n\n### Using a Date Object\n\n```typescript\nimport { getDaysInMonth } from 'date-and-time';\n\ngetDaysInMonth(new Date(2024, 1, 1)); // => 29 (Feb 2024, leap year)\ngetDaysInMonth(new Date(2023, 1, 1)); // => 28 (Feb 2023, not a leap year)\ngetDaysInMonth(new Date(2025, 0, 1)); // => 31 (January 2025)\n```\n\n### Using Year and Month Numbers\n\n```typescript\nimport { getDaysInMonth } from 'date-and-time';\n\ngetDaysInMonth(2024, 2); // => 29 (Feb 2024, leap year)\ngetDaysInMonth(2023, 2); // => 28 (Feb 2023, not a leap year)\ngetDaysInMonth(2025, 4); // => 30 (April 2025)\ngetDaysInMonth(2025, 12); // => 31 (December 2025)\n```\n\n## See Also\n\n- [`isLeapYear()`](./isLeapYear) - Check if a year is a leap year\n- [`addMonths()`](../addMonths) - Add months to a date\n"
  },
  {
    "path": "docs/api/utils/getISOWeek.md",
    "content": "---\ntitle: getISOWeek()\n---\n\nReturns the ISO 8601 week number (1–53) for a given date. ISO weeks start on Monday, and week 1 is the week containing the first Thursday of the year.\n\n## Syntax\n\n```typescript\ngetISOWeek(date)\ngetISOWeek(year, month, day)\n```\n\n### Parameters\n\n| Parameter | Type     | Required         | Description                 |\n|-----------|----------|------------------|-----------------------------|\n| `date`    | `Date`   | Yes (overload 1) | The date object to examine  |\n| `year`    | `number` | Yes (overload 2) | The Gregorian year (1–9999) |\n| `month`   | `number` | Yes (overload 2) | The month (1–12)            |\n| `day`     | `number` | Yes (overload 2) | The day (1–31)              |\n\n### Returns\n\n`number` - The ISO week number (1–53) for the given date\n\n## Basic Examples\n\n### Using a Date Object\n\n```typescript\nimport { getISOWeek } from 'date-and-time';\n\ngetISOWeek(new Date(2025, 0, 1));  // => 1  (Jan 1, 2025 is in week 1)\ngetISOWeek(new Date(2025, 5, 15)); // => 24 (Jun 15, 2025 is in week 24)\n```\n\n### Using Year, Month, and Day\n\n```typescript\nimport { getISOWeek } from 'date-and-time';\n\ngetISOWeek(2025, 1, 1);  // => 1\ngetISOWeek(2025, 6, 15); // => 24\n```\n\n### Years with Week 53\n\nSome years have 53 ISO weeks (when January 1 is a Thursday, or a Wednesday in a leap year):\n\n```typescript\nimport { getISOWeek } from 'date-and-time';\n\ngetISOWeek(new Date(2020, 11, 31)); // => 53 (Dec 31, 2020)\ngetISOWeek(2020, 12, 31);          // => 53\n```\n\n## See Also\n\n- [`getISOWeekYear()`](./getISOWeekYear) - Get the ISO week year for a date\n- [week plugin](../../plugins#week) - Format ISO week dates with `format()`\n"
  },
  {
    "path": "docs/api/utils/getISOWeekYear.md",
    "content": "---\ntitle: getISOWeekYear()\n---\n\nReturns the ISO 8601 week year for a given date. The ISO week year may differ from the calendar year near the start and end of the year, because ISO weeks always start on Monday and the first week of the year is the one containing the first Thursday of the year.\n\n## Syntax\n\n```typescript\ngetISOWeekYear(date)\ngetISOWeekYear(year, month, day)\n```\n\n### Parameters\n\n| Parameter | Type     | Required         | Description                 |\n|-----------|----------|------------------|-----------------------------|\n| `date`    | `Date`   | Yes (overload 1) | The date object to examine  |\n| `year`    | `number` | Yes (overload 2) | The Gregorian year (1–9999) |\n| `month`   | `number` | Yes (overload 2) | The month (1–12)            |\n| `day`     | `number` | Yes (overload 2) | The day (1–31)              |\n\n### Returns\n\n`number` - The ISO week year corresponding to the given date\n\n## Basic Examples\n\n### Using a Date Object\n\n```typescript\nimport { getISOWeekYear } from 'date-and-time';\n\ngetISOWeekYear(new Date(2025, 5, 15)); // => 2025 (mid-year, same as calendar year)\n```\n\n### Year Boundary Cases\n\nNear year boundaries, the ISO week year can differ from the calendar year:\n\n```typescript\nimport { getISOWeekYear } from 'date-and-time';\n\n// Dec 30, 2024 is in ISO week 1 of 2025\ngetISOWeekYear(new Date(2024, 11, 30)); // => 2025\ngetISOWeekYear(2024, 12, 30);          // => 2025\n\n// Jan 1, 2016 is in ISO week 53 of 2015\ngetISOWeekYear(new Date(2016, 0, 1));  // => 2015\ngetISOWeekYear(2016, 1, 1);           // => 2015\n```\n\n## See Also\n\n- [`getISOWeek()`](./getISOWeek) - Get the ISO week number for a date\n- [week plugin](../../plugins#week) - Format ISO week dates with `format()`\n"
  },
  {
    "path": "docs/api/utils/isLeapYear.md",
    "content": "---\ntitle: isLeapYear()\n---\n\nDetermines if a given year is a leap year according to the Gregorian calendar rules.\n\n## Syntax\n\n```typescript\nisLeapYear(year)\n```\n\n### Parameters\n\n| Parameter | Type     | Required | Description       |\n|-----------|----------|----------|-------------------|\n| `year`    | `number` | Yes      | The year to check |\n\n### Returns\n\n`boolean` - Returns `true` if the year is a leap year, `false` otherwise\n\n## Basic Examples\n\n### Checking Leap Years\n\n```typescript\nimport { isLeapYear } from 'date-and-time';\n\nconsole.log(isLeapYear(2024)); // true (divisible by 4)\nconsole.log(isLeapYear(2023)); // false (not divisible by 4)\nconsole.log(isLeapYear(2000)); // true (divisible by 400)\nconsole.log(isLeapYear(1900)); // false (divisible by 100 but not by 400)\n```\n\n### Working with Date Objects\n\n```typescript\nfunction checkDateLeapYear(date: Date): boolean {\n  return isLeapYear(date.getFullYear());\n}\n\nconst dates = [\n  new Date(2024, 1, 29), // February 29, 2024\n  new Date(2023, 1, 28), // February 28, 2023\n  new Date(2000, 1, 29)  // February 29, 2000\n];\n\ndates.forEach(date => {\n  const year = date.getFullYear();\n  console.log(`${year}: ${isLeapYear(year) ? 'Leap year' : 'Not a leap year'}`);\n});\n```\n\n## Edge Cases\n\n### Historical Context\n\n```typescript\n// Note: Gregorian calendar was adopted in 1582\n// Before that, different leap year rules applied\nfunction isHistoricalAccurate(year: number): boolean {\n  if (year < 1582) {\n    console.warn('Year is before Gregorian calendar adoption (1582)');\n    // Julian calendar had simpler rule: every 4 years\n    return year % 4 === 0;\n  }\n  return isLeapYear(year);\n}\n\nconsole.log(isHistoricalAccurate(1500));  // true (Julian calendar rule)\nconsole.log(isHistoricalAccurate(1700));  // false (Gregorian calendar rule)\n```\n"
  },
  {
    "path": "docs/api/utils/isSameDay.md",
    "content": "---\ntitle: isSameDay()\n---\n\nChecks if two Date objects represent the same calendar day, regardless of time.\n\n## Syntax\n\n```typescript\nisSameDay(date1, date2)\n```\n\n### Parameters\n\n| Parameter | Type   | Required | Description                       |\n|-----------|--------|----------|-----------------------------------|\n| `date1`   | `Date` | Yes      | The first Date object to compare  |\n| `date2`   | `Date` | Yes      | The second Date object to compare |\n\n### Returns\n\n`boolean` - Returns `true` if both dates are on the same calendar day, `false` otherwise\n\n## Basic Examples\n\n### Comparing Calendar Days\n\n```typescript\nimport { isSameDay } from 'date-and-time';\n\nconst morning = new Date(2024, 7, 15, 9, 30, 0);   // August 15, 2024 09:30:00\nconst evening = new Date(2024, 7, 15, 18, 45, 30);  // August 15, 2024 18:45:30\nconst nextDay = new Date(2024, 7, 16, 9, 30, 0);    // August 16, 2024 09:30:00\n\nconsole.log(isSameDay(morning, evening)); // true (same day, different times)\nconsole.log(isSameDay(morning, nextDay)); // false (different days)\n```\n\n### Ignoring Time Components\n\n```typescript\nconst startOfDay = new Date(2024, 7, 15, 0, 0, 0, 0);     // August 15, 2024 00:00:00.000\nconst endOfDay = new Date(2024, 7, 15, 23, 59, 59, 999);  // August 15, 2024 23:59:59.999\n\nconsole.log(isSameDay(startOfDay, endOfDay)); // true\n\n// Even milliseconds don't matter for day comparison\nconst precise1 = new Date(2024, 7, 15, 12, 30, 45, 123);\nconst precise2 = new Date(2024, 7, 15, 12, 30, 45, 456);\n\nconsole.log(isSameDay(precise1, precise2)); // true\n```\n"
  },
  {
    "path": "docs/content.config.ts",
    "content": "import { defineCollection } from 'astro:content';\nimport { glob } from 'astro/loaders';\nimport { docsSchema } from '@astrojs/starlight/schema';\n\nexport const collections = {\n  docs: defineCollection({\n    loader: glob({\n      pattern: '**/*.{md,mdx}',\n      base: './docs',\n    }),\n    schema: docsSchema(),\n  }),\n};\n"
  },
  {
    "path": "docs/env.d.ts",
    "content": "/// <reference types=\"astro/client\" />\n"
  },
  {
    "path": "docs/guide/index.md",
    "content": "---\ntitle: Introduction\n---\n\n**date-and-time** is the simplest, most intuitive date and time library for JavaScript and TypeScript. Built from the ground up with modern development practices, it provides a comprehensive set of tools for date manipulation, formatting, parsing, and timezone handling.\n\n## Why date-and-time?\n\n### 🚀 Modern & Performant\n\n- Written entirely in **TypeScript** with ES2021 target\n- **Tree-shakable** modules for optimal bundle size\n- **Zero dependencies** for core functionality\n- Full **ES Modules** and **CommonJS** support\n\n### 🌍 Internationalization Ready\n\n- Support for **40+ locales** with native month/day names\n- Multiple **calendar systems** (Gregorian, Buddhist)\n- **Numeral systems** (Latin, Arabic, Bengali, Myanmar)\n- **Timezone-aware** formatting and parsing\n\n### 🎯 Developer Experience\n\n- **Full TypeScript** support with comprehensive type definitions\n- **IntelliSense** support in modern editors\n- **Consistent API** design across all functions\n- **Extensive documentation** and examples\n\n### 📦 Production Ready\n\n- **Node.js 18+** support\n- **Modern browser** compatibility (Chrome 85+, Firefox 78+, Safari 14+)\n- **Comprehensive test suite** with high coverage\n- **Battle-tested** in production environments\n\n## Key Features\n\n### Formatting and Parsing\n\n- **`format()`** - Convert Date objects to formatted strings\n- **`parse()`** - Parse date strings into Date objects\n- **`compile()`** - Precompile format strings for performance\n- **`preparse()`** - Parse date strings and return intermediate results\n- **`isValid()`** - Validate date string formats\n- **`transform()`** - Transform date strings between different formats\n\n### Date Arithmetic\n\n- **`addYears()`, `addMonths()`, `addDays()`** - Date addition\n- **`addHours()`, `addMinutes()`, `addSeconds()`, `addMilliseconds()`** - Time addition\n- **`subtract()`** - Calculate time differences with Duration objects\n\n### Utility Functions\n\n- **`isLeapYear()`** - Check if a year is a leap year\n- **`isSameDay()`** - Check if two dates are on the same day\n- **`getDaysInMonth()`** - Get the number of days in a month\n- **`getISOWeekYear()`** - Get the ISO week year for a date (follows ISO 8601)\n- **`getISOWeek()`** - Get the ISO week number for a date (1–53, follows ISO 8601)\n\n### Advanced Features\n\n- **Timezone Support** - Comprehensive timezone data from timezonedb\n- **Locale Support** - 40+ languages with native formatting\n- **Plugin System** - Extend formatters and parsers\n- **Duration Objects** - Rich time difference calculations\n\n## Version 4.x Highlights\n\nVersion 4.x represents a complete rewrite with significant improvements:\n\n### 🔄 Breaking Changes\n\n- **TypeScript-first** development approach\n- **Integrated plugins** - timezone and timespan functionality built-in\n- **New API signatures** - options objects replace boolean parameters\n- **Modern JavaScript** - ES2021 features throughout\n\n### 📈 Performance Improvements\n\n- **Reduced bundle size** with tree-shaking\n\n### 🛠 Developer Improvements\n\n- **Expanded language support** - Now supporting 40+ locales\n- **Improved TypeScript** inference and completion\n- **Comprehensive documentation** with live examples\n\n## Architecture\n\n```typescript\nimport { format, parse } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\n\n// Core functionality\nconst date = new Date();\nconst formatted = format(date, 'YYYY/MM/DD');\n\n// Localized formatting\nconst localized = format(date, 'YYYY年M月D日', { locale: ja });\n\n// Timezone-aware operations\nconst tokyoTime = format(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\n```\n\n## Browser and Environment Support\n\n### Node.js\n\n- **Node.js 18.0.0+** (LTS recommended)\n- Full ES Modules support\n- CommonJS compatibility\n\n### Browsers\n\n| Browser | Minimum Version |\n|---------|-----------------|\n| Chrome  | 85+             |\n| Firefox | 78+             |\n| Safari  | 14+             |\n| Edge    | 85+             |\n\n### Module Systems\n\n- **ES Modules** (`.mjs`, `type: \"module\"`)\n- **CommonJS** (`.cjs`, traditional Node.js)\n- **TypeScript** (4.5+)\n- **Bundlers** (Webpack, Rollup, Vite, etc.)\n\n## Getting Started\n\nReady to start using date-and-time? Continue to the [Installation Guide](./installation) to set up the library in your project.\n"
  },
  {
    "path": "docs/guide/installation.mdx",
    "content": "---\ntitle: Installation\n---\n\nimport { Aside, Tabs, TabItem } from '@astrojs/starlight/components';\n\nGet started with date-and-time in your project using your preferred package manager.\n\n## Package Manager Installation\n\n<Tabs>\n<TabItem label=\"npm\">\n```bash\nnpm install date-and-time\n```\n</TabItem>\n<TabItem label=\"yarn\">\n```bash\nyarn add date-and-time\n```\n</TabItem>\n<TabItem label=\"pnpm\">\n```bash\npnpm add date-and-time\n```\n</TabItem>\n</Tabs>\n\n## Requirements\n\n### Runtime Requirements\n\n- **Node.js**: Version 18.0.0 or higher\n- **Browsers**: ES2021 support required\n\n### Development Requirements (optional)\n\n- **TypeScript**: Version 4.5 or higher for full type support\n- **Modern bundler**: For optimal tree-shaking (Webpack 5+, Rollup, Vite, etc.)\n\n## Import Methods\n\ndate-and-time supports both ES Modules and CommonJS, allowing you to use the import style that best fits your project.\n\n### ES Modules (Recommended)\n\n```typescript\nimport { format, parse } from 'date-and-time';\n\nformat(new Date(), 'YYYY/MM/DD');\n// => 2025/08/23\n```\n\n### CommonJS\n\n```typescript\nconst { format, parse } = require('date-and-time');\n\nformat(new Date(), 'YYYY/MM/DD');\n// => 2025/08/23\n```\n\n## Importing Locales and Timezones\n\nLocales and timezones are distributed as separate modules to support tree shaking:\n\n### Locale Imports\n\n```typescript\n// Import specific locales\nimport ja from 'date-and-time/locales/ja';\nimport es from 'date-and-time/locales/es';\nimport fr from 'date-and-time/locales/fr';\n\n// Use in formatting\nformat(new Date(), 'YYYY年M月D日', { locale: ja });\nformat(new Date(), 'D [de] MMMM [de] YYYY', { locale: es });\nformat(new Date(), 'D MMMM YYYY', { locale: fr });\n```\n\nFor a complete list of all supported locales with import examples, see [Supported Locales](../locales).\n\n### Timezone Usage\n\nPass an IANA timezone name string directly to any function that accepts a timezone option:\n\n```typescript\nformat(new Date(), 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\nformat(new Date(), 'YYYY-MM-DD HH:mm:ss', { timeZone: 'America/New_York' });\n```\n\nFor a complete list of all supported timezones, see [Supported Timezones](../timezones).\n\n### Numeral Systems\n\n```typescript\n// Import numeral systems\nimport arab from 'date-and-time/numerals/arab';\nimport beng from 'date-and-time/numerals/beng';\n\nformat(new Date(), 'DD/MM/YYYY', { numeral: arab });\n// => ٠٨/٠٧/٢٠٢٥\n```\n\n## Plugin Imports\n\nSome advanced features are available as plugins:\n\n```typescript\nimport { format } from 'date-and-time';\n// Import specific plugins\nimport microsecond from 'date-and-time/plugins/microsecond';\nimport ordinal from 'date-and-time/plugins/ordinal';\nimport zonename from 'date-and-time/plugins/zonename';\n\n// Use plugin-specific tokens with plugins specified in options\nformat(new Date(), 'MMMM DDD, YYYY', { plugins: [ordinal] }); // with ordinal plugin\nformat(new Date(), 'HH:mm:ss.SSSSSS', { plugins: [microsecond] }); // with microsecond plugin\n```\n\n## CDN Usage\n\nFor browser-only projects, you can use date-and-time directly from a CDN:\n\n### Via jsDelivr\n\n```html\n<script type=\"module\">\n  import { format } from 'https://cdn.jsdelivr.net/npm/date-and-time/dist/index.js';\n\n  console.log(format(new Date(), 'YYYY/MM/DD'));\n</script>\n```\n\n### Via unpkg\n\n```html\n<script type=\"module\">\n  import { format } from 'https://unpkg.com/date-and-time/dist/index.js';\n\n  console.log(format(new Date(), 'YYYY/MM/DD'));\n</script>\n```\n\n## Bundle Size\n\n<Aside type=\"tip\" title=\"Tree Shaking Benefits\">\n  date-and-time is built with tree-shaking in mind. You only bundle the functions and locales you actually use, resulting in optimal bundle sizes. Modern bundlers like Webpack 5, Rollup, and Vite automatically eliminate unused code, ensuring your application stays lightweight.\n</Aside>\n\n## Verification\n\nAfter installation, verify that the library works correctly:\n\n```typescript\nimport { format } from 'date-and-time';\n\nconsole.log(format(new Date(), 'YYYY/MM/DD HH:mm:ss'));\n// Should output current date in YYYY/MM/DD HH:mm:ss format\n```\n\n## Next Steps\n\nNow that you have date-and-time installed, you can:\n\n1. **[Quick Start](./quick-start)** - Learn the basics with simple examples\n2. **[API Reference](/api/)** - Dive deep into all available functions\n\n## Troubleshooting\n\n### TypeScript Issues\n\nIf you encounter TypeScript errors, ensure you're using TypeScript 4.5+ and have the latest version of date-and-time:\n\n```bash\nnpm install typescript@latest date-and-time@latest\n```\n\n### Module Resolution Issues\n\nFor Node.js projects using ES Modules, ensure your `package.json` includes:\n\n```json\n{\n  \"type\": \"module\"\n}\n```\n\nFor CommonJS projects, this field should be omitted or set to `\"commonjs\"`.\n"
  },
  {
    "path": "docs/guide/quick-start.md",
    "content": "---\ntitle: Quick Start\n---\n\nThis guide will get you up and running with date-and-time in just a few minutes.\n\n## Basic Example\n\n```typescript\nimport { format, parse } from 'date-and-time';\n\nconst now = new Date();\n\n// Format a date\nconst formatted = format(now, 'YYYY/MM/DD HH:mm:ss');\nconsole.log(formatted);\n// => 2025/08/23 14:30:45\n\n// Parse a date string\nconst parsed = parse('2025/08/23 14:30:45', 'YYYY/MM/DD HH:mm:ss');\nconsole.log(parsed);\n// => Fri Aug 23 2025 14:30:45 GMT+0900\n```\n\n## Common Format Patterns\n\n### Date Formats\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\nformat(date, 'YYYY-MM-DD');         // => 2025-08-23\nformat(date, 'MM/DD/YYYY');         // => 08/23/2025  \nformat(date, 'DD.MM.YYYY');         // => 23.08.2025\nformat(date, 'MMMM D, YYYY');       // => August 23, 2025\nformat(date, 'ddd, MMM DD YYYY');   // => Sat, Aug 23 2025\n```\n\n### Time Formats\n\n```typescript\nformat(date, 'HH:mm:ss');          // => 14:30:45 (24-hour)\nformat(date, 'hh:mm:ss A');        // => 02:30:45 PM (12-hour)\nformat(date, 'h:mm A');            // => 2:30 PM (12-hour, no leading zero)\n```\n\n### Combined DateTime Formats\n\n```typescript\nformat(date, 'YYYY-MM-DD HH:mm:ss');  // => 2025-08-23 14:30:45\nformat(date, 'ddd, MMM D, YYYY [at] h:mm A');\n// => Sat, Aug 23, 2025 at 2:30 PM\n\nformat(date, '[Today is] dddd');      // => Today is Saturday\n```\n\n## Working with Locales\n\n```typescript\nimport { format } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\nimport es from 'date-and-time/locales/es';\nimport fr from 'date-and-time/locales/fr';\n\nconst date = new Date();\n\n// Japanese\nformat(date, 'YYYY年M月D日(ddd)', { locale: ja });\n// => 2025年8月23日(土)\n\n// Spanish\nformat(date, 'dddd, D [de] MMMM [de] YYYY', { locale: es });\n// => sábado, 23 de agosto de 2025\n\n// French\nformat(date, 'dddd D MMMM YYYY', { locale: fr });\n// => samedi 23 août 2025\n```\n\nFor a complete list of all supported locales with import examples, see [Supported Locales](../locales).\n\n## Timezone Operations\n\n```typescript\nimport { format, parse } from 'date-and-time';\n\nconst date = new Date();\n\n// Format in a specific timezone\nformat(date, 'YYYY-MM-DD HH:mm:ss [EST]', { timeZone: 'America/New_York' });\n// => 2025-08-23 09:30:45 EST\n\n// UTC formatting\nformat(date, 'YYYY-MM-DD HH:mm:ss [UTC]', { timeZone: 'UTC' });\n// => 2025-08-23 14:30:45 UTC\n\n// Parsing in timezone\nparse('2025-08-23 23:30:45', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\n// => Fri Aug 23 2025 23:30:45 GMT+0900\n```\n\nFor a complete list of all supported timezones, see [Supported Timezones](../timezones).\n\n## Date Arithmetic\n\n```typescript\nimport { addDays, addHours, addMonths, subtract } from 'date-and-time';\n\nconst date = new Date(2025, 7, 23);     // Aug 23, 2025\n\n// Add time\nconst nextWeek = addDays(date, 7);      // Aug 30, 2025\nconst nextMonth = addMonths(date, 1);   // Sep 23, 2025\nconst inFiveHours = addHours(date, 5);  // Aug 23, 2025 05:00:00\n\n// Subtract time (use negative values)\nconst lastWeek = addDays(date, -7);     // Aug 16, 2025\n\n// Calculate differences\nconst start = new Date(2025, 7, 23, 10, 0, 0);\nconst end = new Date(2025, 7, 23, 14, 30, 0);\nconst duration = subtract(start, end);\n\nconsole.log(duration.toHours().value);    // => 4.5\nconsole.log(duration.toMinutes().value);  // => 270\n```\n\n## Validation\n\n```typescript\nimport { isValid, parse } from 'date-and-time';\n\n// Check if a date string is valid\nisValid('2025/08/23', 'YYYY/MM/DD');      // => true\nisValid('2025/02/30', 'YYYY/MM/DD');      // => false (no Feb 30th)\nisValid('invalid-date', 'YYYY/MM/DD');    // => false\n\n// Safe parsing with validation\nif (isValid('2025/08/23', 'YYYY/MM/DD')) {\n  const date = parse('2025/08/23', 'YYYY/MM/DD');\n  console.log('Parsed successfully:', date);\n} else {\n  console.log('Invalid date format');\n}\n```\n\n## Performance Optimization\n\nFor repeated operations with the same format pattern, use `compile()`:\n\n```typescript\nimport { compile, format, parse } from 'date-and-time';\n\n// Compile the pattern once\nconst pattern = compile('YYYY/MM/DD HH:mm:ss');\n\n// Reuse for multiple operations (faster)\nconst dates = [new Date(), new Date(), new Date()];\ndates.forEach(date => {\n  console.log(format(date, pattern));\n});\n```\n\n## Error Handling\n\n```typescript\nimport { parse } from 'date-and-time';\n\n// parse() returns Invalid Date on failure\nconst result = parse('invalid-date', 'YYYY/MM/DD');\n\n// Check for parsing errors\nif (isNaN(result.getTime())) {\n  console.error('Failed to parse date');\n} else {\n  console.log('Successfully parsed:', result);\n}\n```\n\n## Next Steps\n\nNow that you're familiar with the basics:\n\n1. **[API Reference](/api/)** - Explore all available functions\n2. **[Plugins](../plugins)** - Extend functionality with microsecond precision, ordinals, and more\n3. **[Migration Guide](../migration)** - If upgrading from v3.x\n"
  },
  {
    "path": "docs/index.mdx",
    "content": "---\ntitle: date-and-time\ndescription: The simplest, most intuitive date and time library\ntemplate: splash\nhero:\n  title: The simplest, most intuitive date and time library\n  tagline: Modern TypeScript library for date manipulation with full ES Modules support.\n  image:\n    alt: date-and-time\n    file: ./assets/logo.png\n  actions:\n    - text: Get Started\n      link: /date-and-time/guide\n      icon: right-arrow\n      variant: primary\n    - text: API Reference\n      link: /date-and-time/api\n      variant: minimal\n    - text: View on GitHub\n      link: https://github.com/knowledgecode/date-and-time\n      icon: external\n      variant: minimal\n---\n\nimport { Card, CardGrid, Tabs, TabItem } from '@astrojs/starlight/components';\n\n## Features\n\n<CardGrid>\n  <Card title=\"Modern & Fast\" icon=\"rocket\">\n    Written in TypeScript with ES2021 target. Tree-shakable modules for optimal bundle size.\n  </Card>\n  <Card title=\"Internationalization\" icon=\"translate\">\n    Support for 40+ locales and multiple calendar systems. Arabic, Bengali, Myanmar numerals.\n  </Card>\n  <Card title=\"Timezone Support\" icon=\"moon\">\n    Complete timezone handling with IANA timezone database built-in.\n  </Card>\n  <Card title=\"Type Safe\" icon=\"approve-check\">\n    Full TypeScript support with comprehensive type definitions and IntelliSense.\n  </Card>\n  <Card title=\"Tree Shakable\" icon=\"puzzle\">\n    Import only what you need. Optimized for modern bundlers with sideEffects false.\n  </Card>\n  <Card title=\"Plugin System\" icon=\"add-document\">\n    Extensible plugin system allows you to extend formatters and parsers.\n  </Card>\n</CardGrid>\n\n## Quick Example\n\n```typescript\nimport { format, parse, addDays } from 'date-and-time';\nimport ja from 'date-and-time/locales/ja';\n\nconst now = new Date();\n\n// Basic formatting\nformat(now, 'YYYY/MM/DD HH:mm:ss');\n// => 2025/08/23 14:30:45\n\n// Localized formatting\nformat(now, 'YYYY年M月D日(ddd)', { locale: ja });\n// => 2025年8月23日(金)\n\n// Timezone-aware formatting\nformat(now, 'YYYY-MM-DD HH:mm:ss [EST]', { timeZone: 'America/New_York' });\n// => 2025-08-23 09:30:45 EST\n\n// Parsing\nconst date = parse('2025/08/23 14:30:45', 'YYYY/MM/DD HH:mm:ss');\nconsole.log(date)\n\n// Date arithmetic\nconst futureDate = addDays(now, 7);\nconsole.log(format(futureDate, 'YYYY/MM/DD'));\n```\n\n## Key Features in v4.x\n\n- **Complete TypeScript rewrite** with enhanced type safety\n- **Tree-shaking support** for better bundle optimization\n- **Integrated timezone and timespan plugins** into the core library\n- **Modern JavaScript** targeting ES2021 (Node.js ≥18 required)\n- **Enhanced API** with options objects instead of boolean flags\n- **Improved locale handling** with per-function locale specification\n\n## Browser & Environment Support\n\n- **Node.js**: 18+\n- **Browsers**: Chrome 85+, Firefox 78+, Safari 14+, Edge 85+\n- **Module Systems**: ES Modules, CommonJS\n- **TypeScript**: 4.5+\n\n## Installation\n\n<Tabs>\n<TabItem label=\"npm\">\n```bash\nnpm install date-and-time\n```\n</TabItem>\n<TabItem label=\"yarn\">\n```bash\nyarn add date-and-time\n```\n</TabItem>\n<TabItem label=\"pnpm\">\n```bash\npnpm add date-and-time\n```\n</TabItem>\n</Tabs>\n\n## Community\n\n- [GitHub Repository](https://github.com/knowledgecode/date-and-time)\n- [npm Package](https://www.npmjs.com/package/date-and-time)\n- [Issue Tracker](https://github.com/knowledgecode/date-and-time/issues)\n"
  },
  {
    "path": "docs/locales.md",
    "content": "---\ntitle: Locales\n---\n\nLocales customize the language-specific strings used in date formatting and parsing — month names, day-of-week names, and AM/PM indicators. By default, the library uses English (`en`). To use another language, import the corresponding locale module and pass it as the `locale` option.\n\n```typescript\nimport { format, parse } from 'date-and-time';\nimport es from 'date-and-time/locales/es';\n\nconst date = new Date('2025-08-23T12:00:00');\n\nformat(date, 'MMMM D, YYYY', { locale: es });\n// => agosto 23, 2025\n\nformat(date, 'ddd, D MMM', { locale: es });\n// => sáb, 23 ago\n```\n\n## Supported Locales\n\nThe following 41 locales are available:\n\n### ar (Arabic)\n\n```typescript\nimport ar from 'date-and-time/locales/ar';\n```\n\n### az (Azerbaijani)\n\n```typescript\nimport az from 'date-and-time/locales/az';\n```\n\n### bn (Bengali)\n\n```typescript\nimport bn from 'date-and-time/locales/bn';\n```\n\n### cs (Czech)\n\n```typescript\nimport cs from 'date-and-time/locales/cs';\n```\n\n### da (Danish)\n\n```typescript\nimport da from 'date-and-time/locales/da';\n```\n\n### de (German)\n\n```typescript\nimport de from 'date-and-time/locales/de';\n```\n\n### el (Greek)\n\n```typescript\nimport el from 'date-and-time/locales/el';\n```\n\n### en (English)\n\n```typescript\nimport en from 'date-and-time/locales/en';\n```\n\n### es (Spanish)\n\n```typescript\nimport es from 'date-and-time/locales/es';\n```\n\n### fa (Persian)\n\n```typescript\nimport fa from 'date-and-time/locales/fa';\n```\n\n### fi (Finnish)\n\n```typescript\nimport fi from 'date-and-time/locales/fi';\n```\n\n### fr (French)\n\n```typescript\nimport fr from 'date-and-time/locales/fr';\n```\n\n### he (Hebrew)\n\n```typescript\nimport he from 'date-and-time/locales/he';\n```\n\n### hi (Hindi)\n\n```typescript\nimport hi from 'date-and-time/locales/hi';\n```\n\n### hu (Hungarian)\n\n```typescript\nimport hu from 'date-and-time/locales/hu';\n```\n\n### id (Indonesian)\n\n```typescript\nimport id from 'date-and-time/locales/id';\n```\n\n### it (Italian)\n\n```typescript\nimport it from 'date-and-time/locales/it';\n```\n\n### ja (Japanese)\n\n```typescript\nimport ja from 'date-and-time/locales/ja';\n```\n\n### ko (Korean)\n\n```typescript\nimport ko from 'date-and-time/locales/ko';\n```\n\n### ms (Malay)\n\n```typescript\nimport ms from 'date-and-time/locales/ms';\n```\n\n### my (Burmese)\n\n```typescript\nimport my from 'date-and-time/locales/my';\n```\n\n### nl (Dutch)\n\n```typescript\nimport nl from 'date-and-time/locales/nl';\n```\n\n### no (Norwegian)\n\n```typescript\nimport no from 'date-and-time/locales/no';\n```\n\n### pl (Polish)\n\n```typescript\nimport pl from 'date-and-time/locales/pl';\n```\n\n### pt-BR (Brazilian Portuguese)\n\n```typescript\nimport ptBR from 'date-and-time/locales/pt-BR';\n```\n\n### pt-PT (European Portuguese)\n\n```typescript\nimport ptPT from 'date-and-time/locales/pt-PT';\n```\n\n### ro (Romanian)\n\n```typescript\nimport ro from 'date-and-time/locales/ro';\n```\n\n### ru (Russian)\n\n```typescript\nimport ru from 'date-and-time/locales/ru';\n```\n\n### rw (Kinyarwanda)\n\n```typescript\nimport rw from 'date-and-time/locales/rw';\n```\n\n### sr-Cyrl (Serbian Cyrillic)\n\n```typescript\nimport srCyrl from 'date-and-time/locales/sr-Cyrl';\n```\n\n### sr-Latn (Serbian Latin)\n\n```typescript\nimport srLatn from 'date-and-time/locales/sr-Latn';\n```\n\n### sv (Swedish)\n\n```typescript\nimport sv from 'date-and-time/locales/sv';\n```\n\n### ta (Tamil)\n\n```typescript\nimport ta from 'date-and-time/locales/ta';\n```\n\n### th (Thai)\n\n```typescript\nimport th from 'date-and-time/locales/th';\n```\n\n### tr (Turkish)\n\n```typescript\nimport tr from 'date-and-time/locales/tr';\n```\n\n### uk (Ukrainian)\n\n```typescript\nimport uk from 'date-and-time/locales/uk';\n```\n\n### uz-Cyrl (Uzbek Cyrillic)\n\n```typescript\nimport uzCyrl from 'date-and-time/locales/uz-Cyrl';\n```\n\n### uz-Latn (Uzbek Latin)\n\n```typescript\nimport uzLatn from 'date-and-time/locales/uz-Latn';\n```\n\n### vi (Vietnamese)\n\n```typescript\nimport vi from 'date-and-time/locales/vi';\n```\n\n### zh-Hans (Simplified Chinese)\n\n```typescript\nimport zhHans from 'date-and-time/locales/zh-Hans';\n```\n\n### zh-Hant (Traditional Chinese)\n\n```typescript\nimport zhHant from 'date-and-time/locales/zh-Hant';\n```\n"
  },
  {
    "path": "docs/migration.md",
    "content": "---\ntitle: Migration Guide\n---\n\nVersion `4.x` has been completely rewritten in TypeScript and some features from `3.x` are no longer compatible. This section explains the changes to each feature and the migration methods.\n\n## Installation\n\nVersion `4.x` adopts a modern development style and no longer supports older browsers. Module imports are only supported in ES Modules or CommonJS style. Additionally, since functions can now be imported directly, it is more likely to reduce the final module size through bundler tree shaking.\n\n### ES Modules (Recommended)\n\n```typescript\nimport { format } from 'date-and-time';\n\nformat(new Date(), 'ddd, MMM DD YYYY');\n// => Wed, Jul 09 2025\n```\n\n### CommonJS\n\n```typescript\nconst { format } = require('date-and-time');\n\nformat(new Date(), 'ddd, MMM DD YYYY');\n// => Wed, Jul 09 2025\n```\n\n## CDN Usage\n\nFor browser-only projects, you can use date-and-time directly from a CDN:\n\n### Via jsDelivr\n\n```html\n<script type=\"module\">\n  import { format } from 'https://cdn.jsdelivr.net/npm/date-and-time/dist/index.js';\n\n  console.log(format(new Date(), 'YYYY/MM/DD'));\n</script>\n```\n\n### Via unpkg\n\n```html\n<script type=\"module\">\n  import { format } from 'https://unpkg.com/date-and-time/dist/index.js';\n\n  console.log(format(new Date(), 'YYYY/MM/DD'));\n</script>\n```\n\n## API\n\n### format\n\nThe third argument has been changed from `boolean` to `FormatterOptions`. With `FormatterOptions`, you can now specify timezone and locale settings. If you previously set the third argument to `true` to output in UTC timezone, you can achieve the same output as follows:\n\n```typescript\nimport { format } from 'date-and-time';\n\nformat(new Date(), 'ddd, MMM DD YYYY hh:mm A [GMT]Z', { timeZone: 'UTC' });\n// => Fri, Jan 02 2015 07:14 AM GMT+0000\n```\n\nAdditionally, since the `timezone` plugin has been integrated into the main library, the `formatTZ` function is now obsolete. Pass an IANA timezone name string directly to the `timeZone` option:\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst now = new Date();\n\nformat(now, 'YYYY-MM-DD HH:mm:ss [EST]', { timeZone: 'America/New_York' });\n// => 2025-08-23 09:30:45 EST\n```\n\n### parse\n\nThe third argument has been changed from `boolean` to `ParserOptions`. With `ParserOptions`, you can now specify timezone and locale settings. If you previously set the third argument to `true` to parse input in UTC timezone, you can achieve the same output as follows:\n\n```typescript\nimport { parse } from 'date-and-time';\n\nparse('11:14:05 PM', 'h:mm:ss A', { timeZone: 'UTC' });\n// => Jan 02 1970 23:14:05 GMT+0000\n```\n\nAdditionally, since the `timezone` plugin has been integrated into the main library, the `parseTZ` function is now obsolete. Pass an IANA timezone name string directly to the `timeZone` option:\n\n```typescript\nimport { parse } from 'date-and-time';\nimport fr from 'date-and-time/locales/fr';\n\nparse(\n  '02 janv. 2015, 11:14:05 PM', 'DD MMM YYYY, h:mm:ss A',\n  { timeZone: 'Europe/Paris', locale: fr }\n);\n// => Jan 02 2015 23:14:05 GMT+0100\n```\n\n### preparse\n\nThe third argument has been changed from `boolean` to `ParserOptions`. With `ParserOptions`, you can now specify timezone and locale settings. If you previously set the third argument to `true` to parse input in UTC timezone, you can achieve the same output as follows:\n\n```typescript\nimport { preparse } from 'date-and-time';\n\npreparse('11:14:05 PM', 'h:mm:ss A', { timeZone: 'UTC' });\n\n{\n  A: 1,\n  h: 11,\n  m: 14,\n  s: 5,\n  _index: 11,\n  _length: 11,\n  _match: 4\n}\n```\n\nAdditionally, the `PreparseResult` object returned by the `preparse` function has the following changes:\n\n- Properties for tokens that were not read are not included. For example, in the code example above, since the string does not contain a date part, properties representing dates such as `Y`, `M`, and `D` are not included.\n- Read values are returned as-is. For example, previously, time read in 12-hour format was converted to 24-hour format, but this is no longer done.\n\n### isValid\n\nThe following usage that takes `PreparseResult` as an argument is now obsolete.\n\n```typescript\nimport { isValid, preparse } from 'date-and-time';\n\nconst pr = preparse('11:14:05 PM', 'h:mm:ss A');\n\n// This usage is no longer supported\nisValid(pr);\n```\n\nOther changes are the same as for the `parse` function.\n\n### transform\n\nThe fourth argument has been changed from `boolean` to `FormatterOptions`. With `FormatterOptions`, you can now specify timezone and locale settings. Additionally, `ParserOptions` has been added as a parameter before `FormatterOptions`. Since the `timezone` plugin has been integrated into the main library, the `transformTZ` function is now obsolete.\n\n```typescript\nimport { transform } from 'date-and-time';\n\n// Convert 24-hour format to 12-hour format\ntransform('13:05', 'HH:mm', 'hh:mm A', { timeZone: 'UTC' }, { timeZone: 'UTC' });\n// => 01:05 PM\n\n// Convert East Coast time to West Coast time\ntransform(\n  '3/8/2020 1:05 PM', 'D/M/YYYY h:mm A', 'D/M/YYYY h:mm A',\n  { timeZone: 'America/New_York' }, { timeZone: 'America/Los_Angeles' }\n);\n// => 3/8/2020 10:05 AM\n```\n\n### addYears\n\nThe third argument has been changed from `boolean` to `TimeZone | UTC`. If you previously set the third argument to `true` to calculate in UTC timezone, you can achieve the same output as follows:\n\n```typescript\nimport { addYears } from 'date-and-time';\n\nconst now = new Date(Date.UTC(2024, 2, 11, 1));\n// => Mar 11 2024 01:00:00 GMT+0000\n\naddYears(now, 1, 'UTC');\n// => Mar 11 2025 01:00:00 GMT+0000\n```\n\nAdditionally, since the `timezone` plugin has been integrated into the main library, the `addYearsTZ` function is now obsolete. Pass an IANA timezone name string directly:\n\n```typescript\nimport { addYears } from 'date-and-time';\n\nconst now = new Date(2024, 2, 11, 1);\n// => Mar 11 2024 01:00:00 GMT-07:00\n\naddYears(now, 1, 'America/Los_Angeles');\n// => Mar 11 2025 01:00:00 GMT-07:00\n```\n\n### addMonths\n\nThe changes are the same as for the `addYears` function.\n\n### addDays\n\nThe changes are the same as for the `addYears` function.\n\n### subtract\n\nThe calculation order has been reversed. Previously, the second argument was subtracted from the first argument, but now the first argument is subtracted from the second argument.\nAdditionally, the return value object has been changed to `Duration`. You can achieve the same output as before as follows:\n\n```typescript\nimport { subtract } from 'date-and-time';\n\nconst yesterday = new Date(2015, 0, 1);\nconst today = new Date(2015, 0, 2);\n\nsubtract(yesterday, today).toDays().value;         // => 1\nsubtract(yesterday, today).toHours().value;        // => 24\nsubtract(yesterday, today).toMinutes().value;      // => 1440\nsubtract(yesterday, today).toSeconds().value;      // => 86400\nsubtract(yesterday, today).toMilliseconds().value; // => 86400000\n```\n\n### timeSpan\n\nThe `timeSpan` plugin is now obsolete as it has been integrated into the main library's `subtract` function. Please note that the argument order of the `subtract` function has changed. You can achieve the same output as before as follows:\n\n```typescript\nimport { subtract } from 'date-and-time';\n\nconst new_years_day = new Date(2020, 0, 1);\nconst now = new Date(2020, 2, 5, 1, 2, 3, 4);\n\nsubtract(new_years_day, now).toDays().format('D HH:mm:ss.SSS');\n// => 64 01:02:03.004\n\nsubtract(new_years_day, now).toHours().format('H [hours] m [minutes] s [seconds]');\n// => 1537 hours 2 minutes 3 seconds\n\nsubtract(new_years_day, now).toMinutes().format('mmmmmmmmmm [minutes]');\n// => 0000092222 minutes\n```\n\n## Locale\n\nThe method for switching locales has changed. Previously, the locale used throughout the library was switched, but now it is specified as a function argument. Below is a code example for the `format` function.\n\n```typescript\nimport { format } from 'date-and-time';\nimport es from 'date-and-time/locales/es';\n\nformat(new Date(), 'dddd, D [de] MMMM [de] YYYY, h:mm aa [GMT]ZZ', { locale: es });\n// => miércoles, 23 de julio de 2025, 12:38 a.m. GMT-07:00\n```\n\n## Plugins\n\nThe following plugins are now obsolete as they have been integrated into the main library:\n\n- `meridiem`\n- `timespan`\n- `timezone`\n\nThe custom plugin feature that existed up to 3.x is not yet supported at this time.\n"
  },
  {
    "path": "docs/plugins.md",
    "content": "---\ntitle: Plugins\n---\n\n`date-and-time` adopts a plugin system. Special tokens used relatively infrequently are provided as plugins outside the main library. By adding plugins as needed, you can use those tokens in `Formatter` and `Parser`. Here, `Formatter` refers to the output engine used by the `format` function, and `Parser` refers to the parsing engine used by the `parse`, `preparse`, and `isValid` functions. These engines are extended by adding plugins as arguments to these functions.\n\n## Installation\n\n### ESModules (Recommended)\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as foobar } from 'date-and-time/plugins/foobar';\n\nformat(new Date(), 'ddd, MMM DD YYYY', { plugins: [foobar] });\n```\n\n### CommonJS\n\n```typescript\nconst { format } = require('date-and-time');\nconst foobar = require('date-and-time/plugins/foobar');\n\nformat(new Date(), 'ddd, MMM DD YYYY', { plugins: [foobar.formatter] });\n```\n\n## day-of-week\n\nThis plugin adds tokens to the `Parser` for reading the day of the week. Since the day of the week does not provide information that identifies a specific date, it is a meaningless token, but it can be used to skip that portion when the string you want to read contains a day of the week.\n\n### Parser\n\n| Token | Meaning             | Input Examples |\n|-------|---------------------|----------------|\n| dddd  | Full day name       | Friday, Sunday |\n| ddd   | Short day name      | Fri, Sun       |\n| dd    | Very short day name | Fr, Su         |\n\n```typescript\nimport { parse } from 'date-and-time';\nimport { parser as day_of_week } from 'date-and-time/plugins/day-of-week';\n\nparse(\n  'Thursday, March 05, 2020', 'dddd, MMMM, D YYYY',\n  { plugins: [day_of_week] }\n);\n```\n\n## microsecond\n\nThis plugin adds tokens to the `Parser` for reading microseconds. Since the precision of JavaScript's Date type is milliseconds, these tokens are meaningless, but they can be used to skip that portion when the string you want to read contains microseconds.\n\n### Parser\n\n| Token  | Meaning              | Input Examples |\n|--------|----------------------|----------------|\n| SSSSSS | 6-digit milliseconds | 123456, 000001 |\n| SSSSS  | 5-digit milliseconds | 12345, 00001   |\n| SSSS   | 4-digit milliseconds | 1234, 0001     |\n| fff    | 3-digit microseconds | 753, 022       |\n| ff     | 2-digit microseconds | 75, 02         |\n| f      | 1-digit microseconds | 7, 0           |\n\n```typescript\nimport { parse } from 'date-and-time';\nimport { parser as microsecond } from 'date-and-time/plugins/microsecond';\n\nparse('12:34:56.123456', 'HH:mm:ss.SSSSSS', { plugins: [microsecond] });\nparse('12:34:56 123.456', 'HH:mm:ss SSS.fff', { plugins: [microsecond] });\n```\n\n## nanosecond\n\nThis plugin adds tokens to the `Parser` for reading nanoseconds. Since the precision of JavaScript's Date type is milliseconds, these tokens are meaningless, but they can be used to skip that portion when the string you want to read contains nanoseconds.\n\n### Parser\n\n| Token     | Meaning              | Input Examples       |\n|-----------|----------------------|----------------------|\n| SSSSSSSSS | 9-digit milliseconds | 123456789, 000000001 |\n| SSSSSSSS  | 8-digit milliseconds | 12345678, 00000001   |\n| SSSSSSS   | 7-digit milliseconds | 1234567, 0000001     |\n| FFF       | 3-digit nanoseconds  | 753, 022             |\n| FF        | 2-digit nanoseconds  | 75, 02               |\n| F         | 1-digit nanoseconds  | 7, 0                 |\n\n```typescript\nimport { parse } from 'date-and-time';\nimport { parser as microsecond } from 'date-and-time/plugins/microsecond';\nimport { parser as nanosecond } from 'date-and-time/plugins/nanosecond';\n\nparse(\n  '12:34:56.123456789',\n  'HH:mm:ss.SSSSSSSSS',\n  { plugins: [microsecond, nanosecond] }\n);\n\nparse(\n  '12:34:56 123456.789',\n  'HH:mm:ss SSSSSS.FFF',\n  { plugins: [microsecond, nanosecond] }\n);\n```\n\n## ordinal\n\nThis plugin adds tokens to the `Formatter` and `Parser` for outputting or reading ordinal representations of days. This ordinal representation is limited to English and is not supported for locales other than English.\n\n### Formatter\n\n| Token | Meaning                       | Output Examples |\n|-------|-------------------------------|-----------------|\n| DDD   | Ordinal representation of day | 1st, 2nd, 3rd   |\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as ordinal } from 'date-and-time/plugins/ordinal';\n\nformat(new Date(), 'MMM DDD YYYY', { plugins: [ordinal] });\n// => Jan 1st 2019\n```\n\n### Parser\n\n| Token | Meaning                       | Input Examples |\n|-------|-------------------------------|----------------|\n| DDD   | Ordinal representation of day | 1st, 2nd, 3rd  |\n\n```typescript\nimport { parse } from 'date-and-time';\nimport { parser as ordinal } from 'date-and-time/plugins/ordinal';\n\nparse('Jan 1st 2019', 'MMM DDD YYYY', { plugins: [ordinal] });\n```\n\n## quarter\n\nThis plugin adds a token to the `Formatter` for outputting the quarter of the year.\n\n### Formatter\n\n| Token | Meaning         | Output Examples |\n|-------|-----------------|-----------------|\n| Q     | Quarter of year | 1, 2, 3, 4      |\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as quarter } from 'date-and-time/plugins/quarter';\n\nformat(new Date(2025, 0, 1), 'YYYY [Q]Q', { plugins: [quarter] });\n// => 2025 Q1\nformat(new Date(2025, 9, 1), 'YYYY [Q]Q', { plugins: [quarter] });\n// => 2025 Q4\n```\n\n## timestamp\n\nThis plugin adds tokens to the `Formatter` for outputting Unix timestamps.\n\n### Formatter\n\n| Token | Meaning                       | Output Examples  |\n|-------|-------------------------------|------------------|\n| t     | Unix timestamp (seconds)      | 0, 1000000000    |\n| T     | Unix timestamp (milliseconds) | 0, 1000000000000 |\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as timestamp } from 'date-and-time/plugins/timestamp';\n\nformat(new Date(1000000000000), 't', { plugins: [timestamp] });\n// => 1000000000\nformat(new Date(1000000000000), 'T', { plugins: [timestamp] });\n// => 1000000000000\n```\n\n## two-digit-year\n\nThis plugin adds tokens to the `Parser` for reading 2-digit years. This token identifies years based on the following rules:\n\n- Values of 70 or above are interpreted as 1900s\n- Values of 69 or below are interpreted as 2000s\n\n### Parser\n\n| Token | Meaning      | Input Examples |\n|-------|--------------|----------------|\n| YY    | 2-digit year | 90, 00, 08, 19 |\n\n```typescript\nimport { parse } from 'date-and-time';\nimport { parser as two_digit_year } from 'date-and-time/plugins/two-digit-year';\n\nparse('Dec 25 69', 'MMM DD YY', { plugins: [two_digit_year] });\n// => Dec 25 2069\nparse('Dec 25 70', 'MMM DD YY', { plugins: [two_digit_year] });\n// => Dec 25 1970\n```\n\n## week\n\nThis plugin adds tokens to the `Formatter` for outputting ISO week dates. These tokens follow\nthe ISO 8601 week date system, where weeks start on Monday and the first week of\nthe year is the one that contains the first Thursday.\n\n### Formatter\n\n| Token | Meaning                             | Output Examples |\n|-------|-------------------------------------|-----------------|\n| W     | ISO week number                     | 1, 27, 53       |\n| WW    | ISO week number (zero-padded)       | 01, 27, 53      |\n| G     | ISO week year                       | 2024, 2025      |\n| GG    | ISO week year (2-digit zero-padded) | 24, 25          |\n| GGGG  | ISO week year (4-digit zero-padded) | 2024, 2025      |\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as week } from 'date-and-time/plugins/week';\n\nformat(new Date(2024, 0, 1), 'GGGG-[W]WW', { plugins: [week] });\n// => 2024-W01\n\n// Note: Dec 30, 2024 belongs to ISO week year 2025\nformat(new Date(2024, 11, 30), 'YYYY vs GGGG [W]W', { plugins: [week] });\n// => 2024 vs 2025 W1\n```\n\n## zonename\n\nThis plugin adds tokens to the `Formatter` for outputting timezone names. These timezone names are limited to English and are not supported for locales other than English.\n\n### Formatter\n\n| Token | Meaning             | Output Examples       |\n|-------|---------------------|-----------------------|\n| z     | Short timezone name | PST, EST              |\n| zz    | Long timezone name  | Pacific Standard Time |\n\n```typescript\nimport { format } from 'date-and-time';\nimport { formatter as zonename } from 'date-and-time/plugins/zonename';\n\nformat(\n  new Date(),\n  'MMMM DD YYYY H:mm zz',\n  { plugins: [zonename] }\n);\n// March 14 2021 1:59 Pacific Standard Time\n\nformat(\n  new Date(),\n  'MMMM DD YYYY H:mm z',\n  { plugins: [zonename], timeZone: 'Asia/Tokyo' }\n);\n// March 14 2021 18:59 JST\n```\n"
  },
  {
    "path": "docs/styles/custom.css",
    "content": "/* ─── Font sizes (match VitePress heading scale) ─── */\n:root {\n  --sl-text-h1: 1.75rem;\n  --sl-text-h2: 1.5rem;\n  --sl-text-h3: 1.25rem;\n  --sl-text-h4: 1.125rem;\n}\n@media (min-width: 50em) {\n  :root {\n    --sl-text-h1: 1.75rem;\n    --sl-text-h2: 1.5rem;\n    --sl-text-h3: 1.25rem;\n    --sl-text-h4: 1.125rem;\n  }\n}\n\n/* ─── Colors (neutral, matching VitePress) ─── */\n:root {\n  --sl-color-text: rgba(235, 235, 245, 0.86);\n  /* Accent: #5672cd — dark mode */\n  --sl-color-accent-low: hsl(226, 40%, 18%);\n  --sl-color-accent: hsl(226, 54%, 57%);\n  --sl-color-accent-high: hsl(226, 80%, 85%);\n}\n:root[data-theme='light'] {\n  --sl-color-text: rgba(60, 60, 67);\n  --sl-color-hairline: rgba(60, 60, 67, 0.12);\n  --sl-color-hairline-light: rgba(60, 60, 67, 0.08);\n  /* Accent: #5672cd — light mode */\n  --sl-color-accent-low: hsl(226, 60%, 94%);\n  --sl-color-accent: hsl(226, 54%, 47%);\n  --sl-color-accent-high: hsl(226, 54%, 28%);\n}\n\n/* ─── h2 border-top (VitePress section divider style) ─── */\n.sl-markdown-content h2:not(:where(.not-content *)) {\n  border-top: 1px solid var(--sl-color-hairline);\n  padding-top: 24px;\n  margin-top: 2em;\n}\n\n/* ─── Left sidebar menu line-height ─── */\n.sidebar-content a,\n.sidebar-content summary {\n  line-height: 1.6;\n}\n\n/* ─── \"On this page\" TOC line-height ─── */\nstarlight-toc a {\n  line-height: 1.6;\n}\n\n/* ─── Tables ─── */\n.sl-markdown-content table:not(:where(.not-content *)) {\n  border-collapse: collapse;\n  margin: 20px 0;\n  font-size: 14px;\n  width: 100%;\n}\n.sl-markdown-content tr:not(:where(.not-content *)) {\n  border-top: 1px solid var(--sl-color-hairline);\n  border-bottom: 1px solid var(--sl-color-hairline);\n  transition: background-color 0.25s;\n}\n/* Zebra stripe (dark mode default) */\n.sl-markdown-content tr:nth-child(2n):not(:where(.not-content *)) {\n  background-color: var(--sl-color-gray-6);\n}\n:root[data-theme='light'] .sl-markdown-content tr:nth-child(2n):not(:where(.not-content *)) {\n  background-color: var(--sl-color-gray-7);\n}\n/* th (dark mode default) */\n.sl-markdown-content th:not(:where(.not-content *)) {\n  border: var(--ec-brdWd) solid var(--ec-brdCol);\n  padding: 8px 16px;\n  background-color: var(--sl-color-gray-6);\n  color: var(--sl-color-gray-3);\n}\n:root[data-theme='light'] .sl-markdown-content th:not(:where(.not-content *)) {\n  background-color: var(--sl-color-gray-7);\n}\n.sl-markdown-content td:not(:where(.not-content *)) {\n  border: var(--ec-brdWd) solid var(--ec-brdCol);\n  padding: 8px 16px;\n}\n\n/* ─── Pagination ─── */\n.pagination-links {\n  margin-top: 40px;\n  padding-top: 24px;\n  border-top: 1px solid var(--sl-color-hairline);\n}\n.pagination-links a {\n  align-items: center;\n  gap: 0.75rem;\n  border-color: var(--sl-color-hairline);\n  border-radius: 8px;\n  padding: 16px;\n  box-shadow: none;\n  transition: border-color 0.25s;\n}\n.pagination-links a:hover {\n  border-color: var(--sl-color-accent);\n}\n.pagination-links a > span {\n  font-size: 0.75rem;\n  color: var(--sl-color-gray-3);\n  letter-spacing: 0.4px;\n}\n.pagination-links .link-title {\n  font-size: var(--sl-text-base);\n  line-height: 1.4;\n  color: var(--sl-color-white);\n  margin-top: 4px;\n}\n:root[data-theme='light'] .pagination-links .link-title {\n  color: var(--sl-color-gray-1);\n}\n.pagination-links svg {\n  color: var(--sl-color-accent);\n  flex-shrink: 0;\n}\n\n/* ─── Hero image ─── */\n.hero img {\n  width: 320px;\n  height: 320px;\n}\n\n/* ─── Cards ─── */\n/* Dark mode default */\narticle.card {\n  background-color: var(--sl-color-gray-6);\n  border: 1px solid var(--sl-color-gray-6);\n  border-radius: 12px;\n  transition: border-color 0.25s;\n}\n/* Light mode override */\n:root[data-theme='light'] article.card {\n  background-color: var(--sl-color-gray-7);\n  border-color: var(--sl-color-gray-7);\n}\narticle.card:hover {\n  border-color: var(--sl-color-accent);\n}\narticle.card .title {\n  color: inherit;\n}\n"
  },
  {
    "path": "docs/timezones.md",
    "content": "---\ntitle: Timezones\n---\n\nTimezone support lets you format and parse dates in any timezone, regardless of the local system timezone. Pass an IANA timezone name string as the `timeZone` option to any function that accepts it — no additional imports are needed for the recommended approach.\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\n// => 2025-08-23 23:30:45\n```\n\n## Import Methods\n\nThere are three ways to import and use timezones with the date-and-time library:\n\n### Method 1: IANA Timezone Name String (Recommended)\n\nPass an IANA timezone name string directly to any function that accepts a timezone option. No imports are required — just use the timezone name as a string.\n\n```typescript\nimport { format } from 'date-and-time';\n\nconst date = new Date();\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' });\n// => 2025-08-23 23:30:45\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: 'America/New_York' });\n// => 2025-08-23 09:30:45\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Europe/London' });\n// => 2025-08-23 14:30:45\n```\n\nThe string `\"UTC\"` is treated specially by this library and is processed faster than other timezone strings. While other strings that represent UTC (e.g., `\"Etc/UTC\"`) are also recognized, using `\"UTC\"` is always recommended.\n\n### Method 2: Consolidated Import (Deprecated)\n\n**This approach is deprecated and will be removed in the next major version. Use IANA timezone name strings instead.**\n\nImport multiple timezones from a single module using named imports.\n\n```typescript\nimport { format } from 'date-and-time';\nimport { Tokyo, New_York, London, Sydney } from 'date-and-time/timezone';\n\nconst date = new Date();\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: Tokyo });    // JST\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: New_York }); // EST/EDT\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: London });   // GMT/BST\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: Sydney });   // AEDT/AEST\n```\n\n### Method 3: Individual Import (Deprecated)\n\n**This approach is deprecated and will be removed in the next major version. Use IANA timezone name strings instead.**\n\nImport each timezone you need directly from its module path.\n\n```typescript\nimport { format } from 'date-and-time';\nimport Tokyo from 'date-and-time/timezones/Asia/Tokyo';\nimport New_York from 'date-and-time/timezones/America/New_York';\n\nconst date = new Date();\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: Tokyo });\n// => 2025-08-23 23:30:45\n\nformat(date, 'YYYY-MM-DD HH:mm:ss', { timeZone: New_York });\n// => 2025-08-23 09:30:45\n```\n\n## Regions\n\nThe timezones listed below are confirmed to work — since this library internally relies on the `Intl` API, other timezones supported by your runtime may also work.\n\n1. [Africa](#africa)\n2. [America](#america)\n3. [Antarctica](#antarctica)\n4. [Arctic](#arctic)\n5. [Asia](#asia)\n6. [Atlantic](#atlantic)\n7. [Australia](#australia)\n8. [Europe](#europe)\n9. [Indian](#indian)\n10. [Pacific](#pacific)\n\n## Africa\n\n- Africa/Abidjan\n- Africa/Accra\n- Africa/Addis_Ababa\n- Africa/Algiers\n- Africa/Asmara\n- Africa/Bamako\n- Africa/Bangui\n- Africa/Banjul\n- Africa/Bissau\n- Africa/Blantyre\n- Africa/Brazzaville\n- Africa/Bujumbura\n- Africa/Cairo\n- Africa/Casablanca\n- Africa/Ceuta\n- Africa/Conakry\n- Africa/Dakar\n- Africa/Dar_es_Salaam\n- Africa/Djibouti\n- Africa/Douala\n- Africa/El_Aaiun\n- Africa/Freetown\n- Africa/Gaborone\n- Africa/Harare\n- Africa/Johannesburg\n- Africa/Juba\n- Africa/Kampala\n- Africa/Khartoum\n- Africa/Kigali\n- Africa/Kinshasa\n- Africa/Lagos\n- Africa/Libreville\n- Africa/Lome\n- Africa/Luanda\n- Africa/Lubumbashi\n- Africa/Lusaka\n- Africa/Malabo\n- Africa/Maputo\n- Africa/Maseru\n- Africa/Mbabane\n- Africa/Mogadishu\n- Africa/Monrovia\n- Africa/Nairobi\n- Africa/Ndjamena\n- Africa/Niamey\n- Africa/Nouakchott\n- Africa/Ouagadougou\n- Africa/Porto-Novo\n- Africa/Sao_Tome\n- Africa/Tripoli\n- Africa/Tunis\n- Africa/Windhoek\n\n## America\n\n- America/Adak\n- America/Anchorage\n- America/Anguilla\n- America/Antigua\n- America/Araguaina\n- America/Argentina/Buenos_Aires\n- America/Argentina/Catamarca\n- America/Argentina/Cordoba\n- America/Argentina/Jujuy\n- America/Argentina/La_Rioja\n- America/Argentina/Mendoza\n- America/Argentina/Rio_Gallegos\n- America/Argentina/Salta\n- America/Argentina/San_Juan\n- America/Argentina/San_Luis\n- America/Argentina/Tucuman\n- America/Argentina/Ushuaia\n- America/Aruba\n- America/Asuncion\n- America/Atikokan\n- America/Bahia_Banderas\n- America/Bahia\n- America/Barbados\n- America/Belem\n- America/Belize\n- America/Blanc-Sablon\n- America/Boa_Vista\n- America/Bogota\n- America/Boise\n- America/Cambridge_Bay\n- America/Campo_Grande\n- America/Cancun\n- America/Caracas\n- America/Cayenne\n- America/Cayman\n- America/Chicago\n- America/Chihuahua\n- America/Ciudad_Juarez\n- America/Costa_Rica\n- America/Coyhaique\n- America/Creston\n- America/Cuiaba\n- America/Curacao\n- America/Danmarkshavn\n- America/Dawson_Creek\n- America/Dawson\n- America/Denver\n- America/Detroit\n- America/Dominica\n- America/Edmonton\n- America/Eirunepe\n- America/El_Salvador\n- America/Fort_Nelson\n- America/Fortaleza\n- America/Glace_Bay\n- America/Goose_Bay\n- America/Grand_Turk\n- America/Grenada\n- America/Guadeloupe\n- America/Guatemala\n- America/Guayaquil\n- America/Guyana\n- America/Halifax\n- America/Havana\n- America/Hermosillo\n- America/Indiana/Indianapolis\n- America/Indiana/Knox\n- America/Indiana/Marengo\n- America/Indiana/Petersburg\n- America/Indiana/Tell_City\n- America/Indiana/Vevay\n- America/Indiana/Vincennes\n- America/Indiana/Winamac\n- America/Inuvik\n- America/Iqaluit\n- America/Jamaica\n- America/Juneau\n- America/Kentucky/Louisville\n- America/Kentucky/Monticello\n- America/Kralendijk\n- America/La_Paz\n- America/Lima\n- America/Los_Angeles\n- America/Lower_Princes\n- America/Maceio\n- America/Managua\n- America/Manaus\n- America/Marigot\n- America/Martinique\n- America/Matamoros\n- America/Mazatlan\n- America/Menominee\n- America/Merida\n- America/Metlakatla\n- America/Mexico_City\n- America/Miquelon\n- America/Moncton\n- America/Monterrey\n- America/Montevideo\n- America/Montserrat\n- America/Nassau\n- America/New_York\n- America/Nome\n- America/Noronha\n- America/North_Dakota/Beulah\n- America/North_Dakota/Center\n- America/North_Dakota/New_Salem\n- America/Nuuk\n- America/Ojinaga\n- America/Panama\n- America/Paramaribo\n- America/Phoenix\n- America/Port_of_Spain\n- America/Port-au-Prince\n- America/Porto_Velho\n- America/Puerto_Rico\n- America/Punta_Arenas\n- America/Rankin_Inlet\n- America/Recife\n- America/Regina\n- America/Resolute\n- America/Rio_Branco\n- America/Santarem\n- America/Santiago\n- America/Santo_Domingo\n- America/Sao_Paulo\n- America/Scoresbysund\n- America/Sitka\n- America/St_Barthelemy\n- America/St_Johns\n- America/St_Kitts\n- America/St_Lucia\n- America/St_Thomas\n- America/St_Vincent\n- America/Swift_Current\n- America/Tegucigalpa\n- America/Thule\n- America/Tijuana\n- America/Toronto\n- America/Tortola\n- America/Vancouver\n- America/Whitehorse\n- America/Winnipeg\n- America/Yakutat\n\n## Antarctica\n\n- Antarctica/Casey\n- Antarctica/Davis\n- Antarctica/DumontDUrville\n- Antarctica/Macquarie\n- Antarctica/Mawson\n- Antarctica/McMurdo\n- Antarctica/Palmer\n- Antarctica/Rothera\n- Antarctica/Syowa\n- Antarctica/Troll\n- Antarctica/Vostok\n\n## Arctic\n\n- Arctic/Longyearbyen\n\n## Asia\n\n- Asia/Aden\n- Asia/Almaty\n- Asia/Amman\n- Asia/Anadyr\n- Asia/Aqtau\n- Asia/Aqtobe\n- Asia/Ashgabat\n- Asia/Atyrau\n- Asia/Baghdad\n- Asia/Bahrain\n- Asia/Baku\n- Asia/Bangkok\n- Asia/Barnaul\n- Asia/Beirut\n- Asia/Bishkek\n- Asia/Brunei\n- Asia/Chita\n- Asia/Colombo\n- Asia/Damascus\n- Asia/Dhaka\n- Asia/Dili\n- Asia/Dubai\n- Asia/Dushanbe\n- Asia/Famagusta\n- Asia/Gaza\n- Asia/Hebron\n- Asia/Ho_Chi_Minh\n- Asia/Hong_Kong\n- Asia/Hovd\n- Asia/Irkutsk\n- Asia/Jakarta\n- Asia/Jayapura\n- Asia/Jerusalem\n- Asia/Kabul\n- Asia/Kamchatka\n- Asia/Karachi\n- Asia/Kathmandu\n- Asia/Khandyga\n- Asia/Kolkata\n- Asia/Krasnoyarsk\n- Asia/Kuala_Lumpur\n- Asia/Kuching\n- Asia/Kuwait\n- Asia/Macau\n- Asia/Magadan\n- Asia/Makassar\n- Asia/Manila\n- Asia/Muscat\n- Asia/Nicosia\n- Asia/Novokuznetsk\n- Asia/Novosibirsk\n- Asia/Omsk\n- Asia/Oral\n- Asia/Phnom_Penh\n- Asia/Pontianak\n- Asia/Pyongyang\n- Asia/Qatar\n- Asia/Qostanay\n- Asia/Qyzylorda\n- Asia/Riyadh\n- Asia/Sakhalin\n- Asia/Samarkand\n- Asia/Seoul\n- Asia/Shanghai\n- Asia/Singapore\n- Asia/Srednekolymsk\n- Asia/Taipei\n- Asia/Tashkent\n- Asia/Tbilisi\n- Asia/Tehran\n- Asia/Thimphu\n- Asia/Tokyo\n- Asia/Tomsk\n- Asia/Ulaanbaatar\n- Asia/Urumqi\n- Asia/Ust-Nera\n- Asia/Vientiane\n- Asia/Vladivostok\n- Asia/Yakutsk\n- Asia/Yangon\n- Asia/Yekaterinburg\n- Asia/Yerevan\n\n## Atlantic\n\n- Atlantic/Azores\n- Atlantic/Bermuda\n- Atlantic/Canary\n- Atlantic/Cape_Verde\n- Atlantic/Faroe\n- Atlantic/Madeira\n- Atlantic/Reykjavik\n- Atlantic/South_Georgia\n- Atlantic/St_Helena\n- Atlantic/Stanley\n\n## Australia\n\n- Australia/Adelaide\n- Australia/Brisbane\n- Australia/Broken_Hill\n- Australia/Darwin\n- Australia/Eucla\n- Australia/Hobart\n- Australia/Lindeman\n- Australia/Lord_Howe\n- Australia/Melbourne\n- Australia/Perth\n- Australia/Sydney\n\n## Europe\n\n- Europe/Amsterdam\n- Europe/Andorra\n- Europe/Astrakhan\n- Europe/Athens\n- Europe/Belgrade\n- Europe/Berlin\n- Europe/Bratislava\n- Europe/Brussels\n- Europe/Bucharest\n- Europe/Budapest\n- Europe/Busingen\n- Europe/Chisinau\n- Europe/Copenhagen\n- Europe/Dublin\n- Europe/Gibraltar\n- Europe/Guernsey\n- Europe/Helsinki\n- Europe/Isle_of_Man\n- Europe/Istanbul\n- Europe/Jersey\n- Europe/Kaliningrad\n- Europe/Kirov\n- Europe/Kyiv\n- Europe/Lisbon\n- Europe/Ljubljana\n- Europe/London\n- Europe/Luxembourg\n- Europe/Madrid\n- Europe/Malta\n- Europe/Mariehamn\n- Europe/Minsk\n- Europe/Monaco\n- Europe/Moscow\n- Europe/Oslo\n- Europe/Paris\n- Europe/Podgorica\n- Europe/Prague\n- Europe/Riga\n- Europe/Rome\n- Europe/Samara\n- Europe/San_Marino\n- Europe/Sarajevo\n- Europe/Saratov\n- Europe/Simferopol\n- Europe/Skopje\n- Europe/Sofia\n- Europe/Stockholm\n- Europe/Tallinn\n- Europe/Tirane\n- Europe/Ulyanovsk\n- Europe/Vaduz\n- Europe/Vatican\n- Europe/Vienna\n- Europe/Vilnius\n- Europe/Volgograd\n- Europe/Warsaw\n- Europe/Zagreb\n- Europe/Zurich\n\n## Indian\n\n- Indian/Antananarivo\n- Indian/Chagos\n- Indian/Christmas\n- Indian/Cocos\n- Indian/Comoro\n- Indian/Kerguelen\n- Indian/Mahe\n- Indian/Maldives\n- Indian/Mauritius\n- Indian/Mayotte\n- Indian/Reunion\n\n## Pacific\n\n- Pacific/Apia\n- Pacific/Auckland\n- Pacific/Bougainville\n- Pacific/Chatham\n- Pacific/Chuuk\n- Pacific/Easter\n- Pacific/Efate\n- Pacific/Fakaofo\n- Pacific/Fiji\n- Pacific/Funafuti\n- Pacific/Galapagos\n- Pacific/Gambier\n- Pacific/Guadalcanal\n- Pacific/Guam\n- Pacific/Honolulu\n- Pacific/Kanton\n- Pacific/Kiritimati\n- Pacific/Kosrae\n- Pacific/Kwajalein\n- Pacific/Majuro\n- Pacific/Marquesas\n- Pacific/Midway\n- Pacific/Nauru\n- Pacific/Niue\n- Pacific/Norfolk\n- Pacific/Noumea\n- Pacific/Pago_Pago\n- Pacific/Palau\n- Pacific/Pitcairn\n- Pacific/Pohnpei\n- Pacific/Port_Moresby\n- Pacific/Rarotonga\n- Pacific/Saipan\n- Pacific/Tahiti\n- Pacific/Tarawa\n- Pacific/Tongatapu\n- Pacific/Wake\n- Pacific/Wallis\n"
  },
  {
    "path": "docs/tsconfig.json",
    "content": "{\n  \"extends\": \"astro/tsconfigs/base\",\n  \"include\": [\"../.astro/types.d.ts\", \"./**/*\"],\n  \"exclude\": [\"../node_modules\"]\n}\n"
  },
  {
    "path": "eslint.config.js",
    "content": "import { defineConfig } from 'eslint/config';\nimport eslint from '@eslint/js';\nimport tseslint from 'typescript-eslint';\nimport stylistic from '@stylistic/eslint-plugin';\n\nexport default defineConfig(\n  eslint.configs.recommended,\n  tseslint.configs.strictTypeChecked,\n  tseslint.configs.stylisticTypeChecked,\n  {\n    ignores: [\"**/*.js\", \"**/*.mjs\", \"coverage\", \"dist\", \"docs\", \".astro\"]\n  },\n  {\n    files: ['**/*.ts'],\n    plugins: {\n      '@stylistic': stylistic\n    },\n    languageOptions: {\n      ecmaVersion: 2021,\n      sourceType: 'module',\n      globals: {\n        process: true\n      },\n      parserOptions: {\n        projectService: true\n      }\n    },\n    rules: {\n      '@typescript-eslint/no-extraneous-class': 'off',\n\n      'accessor-pairs': 'error',\n      'array-callback-return': 'error',\n      'block-scoped-var': 'error',\n      'consistent-return': 'error',\n      'curly': 'error',\n      'default-case-last': 'error',\n      'eqeqeq': ['error', 'smart'],\n      'func-name-matching': 'error',\n      'func-style': ['error', 'expression', { overrides: { namedExports: 'ignore' } }],\n      'grouped-accessor-pairs': 'error',\n      'max-depth': 'error',\n      'max-nested-callbacks': 'error',\n      'new-cap': 'error',\n      'no-caller': 'error',\n      'no-constructor-return': 'error',\n      'no-div-regex': 'error',\n      'no-else-return': 'error',\n      'no-empty-static-block': 'error',\n      'no-eval': 'error',\n      'no-extend-native': 'error',\n      'no-extra-bind': 'error',\n      'no-extra-label': 'error',\n      'no-implicit-globals': 'error',\n      'no-implied-eval': 'error',\n      'no-iterator': 'error',\n      'no-label-var': 'error',\n      'no-labels': 'error',\n      'no-lone-blocks': 'error',\n      'no-lonely-if': 'error',\n      'no-multi-assign': ['error', { ignoreNonDeclaration: true }],\n      'no-multi-str': 'error',\n      'no-negated-condition': 'error',\n      'no-new': 'error',\n      'no-new-func': 'error',\n      'no-new-wrappers': 'error',\n      'no-object-constructor': 'error',\n      'no-octal-escape': 'error',\n      'no-proto': 'error',\n      'no-return-assign': 'error',\n      'no-script-url': 'error',\n      'no-self-compare': 'error',\n      'no-sequences': 'error',\n      'no-shadow-restricted-names': 'error',\n      'no-template-curly-in-string': 'error',\n      'no-undef-init': 'error',\n      'no-unmodified-loop-condition': 'error',\n      'no-unneeded-ternary': 'error',\n      'no-unreachable-loop': 'error',\n      'no-useless-call': 'error',\n      'no-useless-computed-key': 'error',\n      'no-useless-concat': 'error',\n      'no-useless-rename': 'error',\n      'no-useless-return': 'error',\n      'no-void': 'error',\n      'no-warning-comments': 'error',\n      'operator-assignment': 'error',\n      'prefer-exponentiation-operator': 'error',\n      'prefer-numeric-literals': 'error',\n      'prefer-object-has-own': 'error',\n      'prefer-object-spread': 'error',\n      'prefer-promise-reject-errors': ['error', { allowEmptyReject: true }],\n      'prefer-regex-literals': 'error',\n      'prefer-rest-params': 'error',\n      'prefer-spread': 'error',\n      'radix': 'error',\n      'require-atomic-updates': 'error',\n      'symbol-description': 'error',\n      'unicode-bom': 'error',\n      'yoda': 'error',\n\n      '@stylistic/array-bracket-spacing': ['warn', 'never'],\n      '@stylistic/arrow-spacing': 'warn',\n      '@stylistic/block-spacing': 'warn',\n      '@stylistic/comma-dangle': 'warn',\n      '@stylistic/comma-spacing': 'warn',\n      '@stylistic/comma-style': 'warn',\n      '@stylistic/computed-property-spacing': 'warn',\n      '@stylistic/dot-location': ['warn', 'property'],\n      '@stylistic/eol-last': 'warn',\n      '@stylistic/function-call-spacing': 'warn',\n      '@stylistic/generator-star-spacing': 'warn',\n      '@stylistic/implicit-arrow-linebreak': 'warn',\n      '@stylistic/indent': ['warn', 2, { SwitchCase: 0, ignoreComments: true }],\n      '@stylistic/jsx-quotes': 'warn',\n      '@stylistic/key-spacing': 'warn',\n      '@stylistic/keyword-spacing': 'warn',\n      '@stylistic/linebreak-style': 'warn',\n      '@stylistic/lines-between-class-members': 'warn',\n      '@stylistic/member-delimiter-style': ['warn', { multiline: { delimiter: 'semi', requireLast: true }, singleline: { delimiter: 'semi', requireLast: false } }],\n      '@stylistic/new-parens': 'warn',\n      '@stylistic/no-extra-parens': ['warn', 'functions'],\n      '@stylistic/no-extra-semi': 'warn',\n      '@stylistic/no-floating-decimal': 'warn',\n      '@stylistic/no-mixed-spaces-and-tabs': 'warn',\n      '@stylistic/no-multi-spaces': ['warn', { ignoreEOLComments: true }],\n      '@stylistic/no-tabs': 'warn',\n      '@stylistic/no-trailing-spaces': 'warn',\n      '@stylistic/no-whitespace-before-property': 'warn',\n      '@stylistic/nonblock-statement-body-position': 'warn',\n      '@stylistic/object-curly-newline': 'warn',\n      '@stylistic/object-curly-spacing': ['warn', 'always'],\n      '@stylistic/padding-line-between-statements': 'warn',\n      '@stylistic/quotes': ['warn', 'single'],\n      '@stylistic/rest-spread-spacing': 'warn',\n      '@stylistic/semi': 'warn',\n      '@stylistic/semi-spacing': 'warn',\n      '@stylistic/semi-style': 'warn',\n      '@stylistic/space-before-blocks': 'warn',\n      '@stylistic/space-in-parens': 'warn',\n      '@stylistic/space-infix-ops': 'warn',\n      '@stylistic/space-unary-ops': 'warn',\n      '@stylistic/switch-colon-spacing': 'warn',\n      '@stylistic/template-curly-spacing': 'warn',\n      '@stylistic/template-tag-spacing': 'warn',\n      '@stylistic/wrap-iife': ['warn', 'any'],\n      '@stylistic/yield-star-spacing': 'warn'\n    }\n  }\n);\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"date-and-time\",\n  \"version\": \"4.5.0\",\n  \"description\": \"The simplest, most intuitive date and time library\",\n  \"keywords\": [\n    \"date\",\n    \"datetime\",\n    \"duration\",\n    \"format\",\n    \"parse\",\n    \"time\",\n    \"timezone\"\n  ],\n  \"main\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\"\n    },\n    \"./plugin\": {\n      \"types\": \"./dist/plugin.d.ts\",\n      \"import\": \"./dist/plugin.js\",\n      \"require\": \"./dist/plugin.cjs\"\n    },\n    \"./timezone\": {\n      \"types\": \"./dist/timezone.d.ts\",\n      \"import\": \"./dist/timezone.js\",\n      \"require\": \"./dist/timezone.cjs\"\n    },\n    \"./locales/*\": {\n      \"types\": \"./dist/locales/*.d.ts\",\n      \"import\": \"./dist/locales/*.js\",\n      \"require\": \"./dist/locales/*.cjs\"\n    },\n    \"./numerals/*\": {\n      \"types\": \"./dist/numerals/*.d.ts\",\n      \"import\": \"./dist/numerals/*.js\",\n      \"require\": \"./dist/numerals/*.cjs\"\n    },\n    \"./plugins/*\": {\n      \"types\": \"./dist/plugins/*.d.ts\",\n      \"import\": \"./dist/plugins/*.js\",\n      \"require\": \"./dist/plugins/*.cjs\"\n    },\n    \"./timezones/*\": {\n      \"types\": \"./dist/timezones/*.d.ts\",\n      \"import\": \"./dist/timezones/*.js\",\n      \"require\": \"./dist/timezones/*.cjs\"\n    }\n  },\n  \"files\": [\n    \"LICENSE\",\n    \"README.md\",\n    \"dist/\"\n  ],\n  \"scripts\": {\n    \"build\": \"rm -rf dist && rollup -c\",\n    \"build-watch\": \"rollup -c --watch\",\n    \"build:ts\": \"rollup -c --config-ts\",\n    \"build:types\": \"rollup -c --config-types\",\n    \"docs:build\": \"astro build\",\n    \"docs:dev\": \"astro dev\",\n    \"docs:preview\": \"astro preview\",\n    \"lint\": \"eslint\",\n    \"prepublishOnly\": \"npm run build\",\n    \"test\": \"vitest run\",\n    \"test:coverage\": \"vitest run --coverage\",\n    \"timezone\": \"tsx tools/timezone.ts\",\n    \"ts\": \"tsc --noEmit\",\n    \"zonename\": \"tsx tools/zonename.ts\"\n  },\n  \"author\": \"KNOWLEDGECODE\",\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">=18\"\n  },\n  \"homepage\": \"https://knowledgecode.github.io/date-and-time/\",\n  \"bugs\": {\n    \"url\": \"https://github.com/knowledgecode/date-and-time/issues\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/knowledgecode/date-and-time.git\"\n  },\n  \"type\": \"module\",\n  \"sideEffects\": false,\n  \"devDependencies\": {\n    \"@astrojs/starlight\": \"^0.38.5\",\n    \"@eslint/js\": \"^10.0.1\",\n    \"@rollup/plugin-alias\": \"^6.0.0\",\n    \"@rollup/plugin-terser\": \"^1.0.0\",\n    \"@stylistic/eslint-plugin\": \"^5.10.0\",\n    \"@types/node\": \"^25.6.0\",\n    \"@vitest/coverage-v8\": \"^4.1.5\",\n    \"astro\": \"^6.2.2\",\n    \"eslint\": \"^10.3.0\",\n    \"glob\": \"^13.0.6\",\n    \"prettier\": \"^3.8.3\",\n    \"rollup\": \"^4.60.3\",\n    \"rollup-plugin-dts\": \"^6.4.1\",\n    \"rollup-plugin-esbuild\": \"^6.2.1\",\n    \"tsx\": \"^4.21.0\",\n    \"typescript-eslint\": \"^8.59.2\",\n    \"vitest\": \"^4.1.5\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.ts",
    "content": "import alias from '@rollup/plugin-alias';\nimport esbuild from 'rollup-plugin-esbuild';\nimport terser from '@rollup/plugin-terser';\nimport { dts } from 'rollup-plugin-dts';\nimport { globSync } from 'glob';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst outputDir = (input: string) => input.replace(/^src/g, 'dist').replace(/\\/[^/]*$/g, '');\nconst replacePath = (input: string) => input.replace(/(^src\\/|\\.ts$)/g, '');\n\nconst ts = () => {\n  const plugins = [\n    alias({ entries: [{ find: '@', replacement: resolve(dirname(fileURLToPath(import.meta.url)), 'src') }] }),\n    esbuild({ minify: false, target: 'es2021' }),\n    terser()\n  ];\n  const config = (input: string | Record<string, string>, outputDir: string) => ({\n    input,\n    output: [\n      { dir: outputDir, format: 'es' },\n      { dir: outputDir, format: 'cjs', entryFileNames: '[name].cjs' }\n    ],\n    plugins\n  });\n\n  return [\n    config('src/index.ts', 'dist'),\n    config('src/plugin.ts', 'dist'),\n    config('src/timezone.ts', 'dist'),\n    config(Object.fromEntries(globSync('src/numerals/**/*.ts').map(input => [replacePath(input), input])), 'dist'),\n    globSync('src/locales/**/*.ts').map(input => config(input, outputDir(input))),\n    globSync('src/plugins/**/*.ts').map(input => config(input, outputDir(input))),\n    config(Object.fromEntries(globSync('src/timezones/**/*.ts').map(input => [replacePath(input), input])), 'dist')\n  ].flat();\n};\n\nconst types = () => {\n  const plugins = [\n    alias({ entries: [{ find: '@', replacement: resolve(dirname(fileURLToPath(import.meta.url)), 'src') }] }),\n    dts()\n  ];\n  const config = (input: string | Record<string, string>, outputDir: string) => ({\n    input,\n    output: { dir: outputDir },\n    plugins\n  });\n\n  return [\n    config('src/index.ts', 'dist'),\n    config('src/plugin.ts', 'dist'),\n    config('src/timezone.ts', 'dist'),\n    config(Object.fromEntries(globSync('src/numerals/**/*.ts').map(input => [replacePath(input), input])), 'dist'),\n    globSync('src/locales/**/*.ts').map(input => config(input, outputDir(input))),\n    globSync('src/plugins/**/*.ts').map(input => config(input, outputDir(input))),\n    config(Object.fromEntries(globSync('src/timezones/**/*.ts').map(input => [replacePath(input), input])), 'dist')\n  ].flat();\n};\n\nexport default (args: Record<string, string>) => {\n  if (args['config-ts']) {\n    return ts();\n  }\n  if (args['config-types']) {\n    return types();\n  }\n  return [...ts(), ...types()];\n};\n"
  },
  {
    "path": "src/addDays.ts",
    "content": "import { toParts, fromParts, isUTC } from './datetime.ts';\nimport { isTimeZone, createTimezoneDate } from './zone.ts';\nimport type { TimeZone } from './zone.ts';\n\n/**\n * Adds the specified number of days to a Date object.\n * @param dateObj - The Date object to modify\n * @param days - The number of days to add\n * @param [timeZone] - Optional time zone object, an IANA timezone name or 'UTC' to use Coordinated Universal Time.\n * @returns A new Date object with the specified number of days added\n */\nexport function addDays(dateObj: Date, days: number, timeZone?: TimeZone | string) {\n  const zoneName = isTimeZone(timeZone) ? timeZone.zone_name : timeZone ?? undefined;\n\n  if (!zoneName || isUTC(zoneName)) {\n    const d = new Date(dateObj.getTime());\n\n    // Handle UTC calculation\n    if (isUTC(timeZone)) {\n      d.setUTCDate(d.getUTCDate() + days);\n      return d;\n    }\n    // Handle local time calculation\n    d.setDate(d.getDate() + days);\n    return d;\n  }\n  // Handle timezone-specific calculation\n  const parts = toParts(dateObj, zoneName);\n\n  parts.day += days;\n  parts.timezoneOffset = 0;\n\n  return createTimezoneDate(fromParts(parts), zoneName);\n}\n"
  },
  {
    "path": "src/addHours.ts",
    "content": "/**\n * Adds the specified number of hours to a Date object.\n * @param dateObj - The Date object to modify\n * @param hours - The number of hours to add\n * @returns A new Date object with the specified number of hours added\n */\nexport function addHours(dateObj: Date, hours: number) {\n  return new Date(dateObj.getTime() + hours * 3600000);\n}\n"
  },
  {
    "path": "src/addMilliseconds.ts",
    "content": "/**\n * Adds the specified number of milliseconds to a Date object.\n * @param dateObj - The Date object to modify\n * @param milliseconds - The number of milliseconds to add\n * @returns A new Date object with the specified number of milliseconds added\n */\nexport function addMilliseconds(dateObj: Date, milliseconds: number) {\n  return new Date(dateObj.getTime() + milliseconds);\n}\n"
  },
  {
    "path": "src/addMinutes.ts",
    "content": "/**\n * Adds the specified number of minutes to a Date object.\n * @param dateObj - The Date object to modify\n * @param minutes - The number of minutes to add\n * @returns A new Date object with the specified number of minutes added\n */\nexport function addMinutes(dateObj: Date, minutes: number) {\n  return new Date(dateObj.getTime() + minutes * 60000);\n}\n"
  },
  {
    "path": "src/addMonths.ts",
    "content": "import { toParts, fromParts, isUTC } from './datetime.ts';\nimport { isTimeZone, createTimezoneDate } from './zone.ts';\nimport type { TimeZone } from './zone.ts';\n\n/**\n * Adds the specified number of months to a Date object.\n * @param dateObj - The Date object to modify\n * @param months - The number of months to add\n * @param [timeZone] - Optional time zone object, an IANA timezone name or 'UTC' to use Coordinated Universal Time.\n * @returns A new Date object with the specified number of months added\n */\nexport function addMonths(dateObj: Date, months: number, timeZone?: TimeZone | string) {\n  const zoneName = isTimeZone(timeZone) ? timeZone.zone_name : timeZone ?? undefined;\n\n  if (!zoneName || isUTC(zoneName)) {\n    const d = new Date(dateObj.getTime());\n\n    // Handle UTC calculation\n    if (isUTC(timeZone)) {\n      d.setUTCMonth(d.getUTCMonth() + months);\n      // Adjust to last day of month if new month has fewer days\n      if (d.getUTCDate() < dateObj.getUTCDate()) {\n        d.setUTCDate(0);\n        return d;\n      }\n      return d;\n    }\n    // Handle local time calculation\n    d.setMonth(d.getMonth() + months);\n    // Adjust to last day of month if new month has fewer days\n    if (d.getDate() < dateObj.getDate()) {\n      d.setDate(0);\n      return d;\n    }\n    return d;\n  }\n  // Handle timezone-specific calculation\n  const parts = toParts(dateObj, zoneName);\n\n  parts.month += months;\n  parts.timezoneOffset = 0;\n\n  const d = new Date(fromParts(parts));\n\n  if (d.getUTCDate() < parts.day) {\n    d.setUTCDate(0);\n  }\n\n  return createTimezoneDate(\n    fromParts({\n      ...parts,\n      year: d.getUTCFullYear(),\n      month: d.getUTCMonth() + 1,\n      day: d.getUTCDate()\n    }),\n    zoneName\n  );\n}\n"
  },
  {
    "path": "src/addSeconds.ts",
    "content": "/**\n * Adds the specified number of seconds to a Date object.\n * @param dateObj - The Date object to modify\n * @param seconds - The number of seconds to add\n * @returns A new Date object with the specified number of seconds added\n */\nexport function addSeconds(dateObj: Date, seconds: number) {\n  return new Date(dateObj.getTime() + seconds * 1000);\n}\n"
  },
  {
    "path": "src/addYears.ts",
    "content": "import { addMonths } from './addMonths.ts';\nimport type { TimeZone } from './zone.ts';\n\n/**\n * Adds the specified number of years to a Date object.\n * @param dateObj - The Date object to modify\n * @param years - The number of years to add\n * @param [timeZone] - Optional time zone object, an IANA timezone name or 'UTC' to use Coordinated Universal Time.\n * @returns A new Date object with the specified number of years added\n */\nexport function addYears(dateObj: Date, years: number, timeZone?: TimeZone | string) {\n  return addMonths(dateObj, years * 12, timeZone);\n}\n"
  },
  {
    "path": "src/compile.ts",
    "content": "/** @preserve Copyright (c) KNOWLEDGECODE - MIT License */\n\nexport type CompiledObject = string[];\n\n// Escape sequences for literal brackets\nconst LBRACKET = /\\\\\\[/g;\nconst RBRACKET = /\\\\\\]/g;\n\n// Private Use Area characters to temporarily replace literal brackets\nconst PUA_LBRACKET = /\\uE000/g;\nconst PUA_RBRACKET = /\\uE001/g;\n\n// Regular expression to match format tokens, literal text, and escaped characters\nconst REGEXP = /\\[(?:[^[\\]]|\\[[^[\\]]*])*]|([A-Za-z])\\1*|\\.{3}|./g;\n\n/**\n * Compiles a format string into a tokenized array for efficient parsing and formatting.\n * @param formatString - The format string to compile\n * @returns A compiled array where the first element is the original format string,\n *          followed by tokenized format components\n */\nexport const compile = (formatString: string): CompiledObject => {\n  const array = formatString.replace(LBRACKET, '\\uE000').replace(RBRACKET, '\\uE001').match(REGEXP) ?? [];\n  return [formatString, ...array.map(token => token.replace(PUA_LBRACKET, '[').replace(PUA_RBRACKET, ']'))];\n};\n"
  },
  {
    "path": "src/datetime.ts",
    "content": "import { getDateTimeFormat } from './dtf.ts';\n\nexport interface DateTimeParts {\n  weekday: number;\n  year: number;\n  month: number;\n  day: number;\n  hour: number;\n  minute: number;\n  second: number;\n  fractionalSecond: number;\n  timezoneOffset: number;\n}\n\nexport const fromParts = (parts: DateTimeParts) => {\n  return Date.UTC(\n    parts.year,\n    parts.month - (parts.year < 100 ? 1900 * 12 + 1 : 1),\n    parts.day,\n    parts.hour,\n    parts.minute,\n    parts.second,\n    parts.fractionalSecond + parts.timezoneOffset * 60000\n  );\n};\n\nexport const dtfToParts = (dtf: Intl.DateTimeFormat, time: number): DateTimeParts => {\n  return dtf.formatToParts(time)\n    .reduce((parts, { type, value }) => {\n      switch (type) {\n      case 'weekday':\n        parts[type] = 'SunMonTueWedThuFriSat'.indexOf(value) / 3;\n        break;\n      case 'hour':\n        parts[type] = +value % 24;\n        break;\n      case 'year':\n      case 'month':\n      case 'day':\n      case 'minute':\n      case 'second':\n      case 'fractionalSecond':\n        parts[type] = +value;\n      }\n      return parts;\n    }, {\n      weekday: 4, year: 1970, month: 1, day: 1,\n      hour: 0, minute: 0, second: 0, fractionalSecond: 0,\n      timezoneOffset: 0\n    });\n};\n\nexport const isUTC = (timeZone: unknown): timeZone is 'UTC' => {\n  return typeof timeZone === 'string' && timeZone.toUpperCase() === 'UTC';\n};\n\nexport const toParts = (dateObj: Date, zoneName: string): DateTimeParts => {\n  if (isUTC(zoneName)) {\n    return {\n      weekday: dateObj.getUTCDay(),\n      year: dateObj.getUTCFullYear(),\n      month: dateObj.getUTCMonth() + 1,\n      day: dateObj.getUTCDate(),\n      hour: dateObj.getUTCHours(),\n      minute: dateObj.getUTCMinutes(),\n      second: dateObj.getUTCSeconds(),\n      fractionalSecond: dateObj.getUTCMilliseconds(),\n      timezoneOffset: 0\n    };\n  }\n\n  const time = dateObj.getTime();\n  const parts = dtfToParts(getDateTimeFormat(zoneName), time);\n\n  parts.timezoneOffset = (time - fromParts(parts)) / 60000;\n  return parts;\n};\n\nexport interface DateLike {\n  /**\n   * Returns the year of the date.\n   */\n  getFullYear(): number;\n  /**\n   * Returns the month of the date (0-11).\n   */\n  getMonth(): number;\n  /**\n   * Returns the day of the month (1-31).\n   */\n  getDate(): number;\n  /**\n   * Returns the hours of the date (0-23).\n   */\n  getHours(): number;\n  /**\n   * Returns the minutes of the date (0-59).\n   */\n  getMinutes(): number;\n  /**\n   * Returns the seconds of the date (0-59).\n   */\n  getSeconds(): number;\n  /**\n   * Returns the milliseconds of the date (0-999).\n   */\n  getMilliseconds(): number;\n  /**\n   * Returns the day of the week (0-6, where 0 is Sunday).\n   */\n  getDay(): number;\n  /**\n   * Returns the time value in milliseconds since the Unix epoch (January 1, 1970).\n   */\n  getTime(): number;\n  /**\n   * Returns the timezone offset in minutes from UTC.\n   */\n  getTimezoneOffset(): number;\n}\n\nexport class DateTime implements DateLike {\n  private readonly parts: DateTimeParts;\n\n  private readonly time: number;\n\n  constructor (dateObj: Date, zoneName: string) {\n    this.parts = toParts(dateObj, zoneName);\n    this.time = dateObj.getTime();\n  }\n\n  getFullYear () {\n    return this.parts.year;\n  }\n\n  getMonth () {\n    return this.parts.month - 1;\n  }\n\n  getDate () {\n    return this.parts.day;\n  }\n\n  getHours () {\n    return this.parts.hour;\n  }\n\n  getMinutes () {\n    return this.parts.minute;\n  }\n\n  getSeconds () {\n    return this.parts.second;\n  }\n\n  getMilliseconds () {\n    return this.parts.fractionalSecond;\n  }\n\n  getDay () {\n    return this.parts.weekday;\n  }\n\n  getTime () {\n    return this.time;\n  }\n\n  getTimezoneOffset () {\n    return this.parts.timezoneOffset;\n  }\n}\n"
  },
  {
    "path": "src/dtf.ts",
    "content": "const cache = new Map<string, Intl.DateTimeFormat>();\n\nexport const getDateTimeFormat = (zoneName: string): Intl.DateTimeFormat => {\n  return cache.get(zoneName) ?? (() => {\n    const dtf = new Intl.DateTimeFormat('en-US', {\n      hour12: false, weekday: 'short', year: 'numeric', month: 'numeric', day: 'numeric',\n      hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3,\n      timeZone: zoneName\n    });\n\n    if (zoneName) {\n      cache.set(zoneName, dtf);\n    }\n    return dtf;\n  })();\n};\n"
  },
  {
    "path": "src/duration.ts",
    "content": "import { compile } from './compile.ts';\nimport latn from './numerals/latn.ts';\nimport type { Numeral } from './numeral.ts';\n\nconst comment = /^\\[(.*)\\]$/;\n\ninterface DurationFormatter {\n  D?: number;\n  H?: number;\n  m?: number;\n  s?: number;\n  S?: number;\n  f?: number;\n  F?: number;\n}\n\nconst nanosecondsPart = (parts: DurationFormatter, time: DOMHighResTimeStamp) => {\n  parts.F = Math.trunc(time * 1000000);\n  return parts;\n};\n\nconst microsecondsPart = (parts: DurationFormatter, time: DOMHighResTimeStamp) => {\n  parts.f = Math.trunc(time * 1000);\n  return nanosecondsPart(parts, Math.abs(time) * 1000 % 1 / 1000);\n};\n\nconst millisecondsPart = (parts: DurationFormatter, time: DOMHighResTimeStamp) => {\n  parts.S = Math.trunc(time);\n  return microsecondsPart(parts, Math.abs(time) % 1);\n};\n\nconst secondsPart = (parts: DurationFormatter, time: number) => {\n  parts.s = Math.trunc(time / 1000);\n  return millisecondsPart(parts, Math.abs(time) % 1000);\n};\n\nconst minutesPart = (parts: DurationFormatter, time: number) => {\n  parts.m = Math.trunc(time / 60000);\n  return secondsPart(parts, Math.abs(time) % 60000);\n};\n\nconst hoursPart = (parts: DurationFormatter, time: number) => {\n  parts.H = Math.trunc(time / 3600000);\n  return minutesPart(parts, Math.abs(time) % 3600000);\n};\n\nconst daysPart = (parts: DurationFormatter, time: number) => {\n  parts.D = Math.trunc(time / 86400000);\n  return hoursPart(parts, Math.abs(time) % 86400000);\n};\n\nconst sign = (time: number) => {\n  return time < 0 || time === 0 && (1 / time) === -Infinity ? '-' : '';\n};\n\nconst format = (times: DurationFormatter, formatString: string, numeral: Numeral = latn) => {\n  const pattern = compile(formatString).slice(1);\n  const resolveToken = (token: string) => {\n    if (token[0] in times) {\n      const time = times[token[0] as keyof DurationFormatter] ?? 0;\n      return numeral.encode(`${sign(time)}${String(Math.abs(time)).padStart(token.length, '0')}`);\n    }\n    return comment.test(token) ? token.replace(comment, '$1') : token;\n  };\n\n  return pattern.reduce((result, token) => result + resolveToken(token), '');\n};\n\nexport interface NanosecondsParts {\n  nanoseconds: number;\n}\n\nexport interface MicrosecondsParts extends NanosecondsParts {\n  microseconds: number;\n}\n\nexport interface MillisecondsParts extends MicrosecondsParts {\n  milliseconds: number;\n}\n\nexport interface SecondsParts extends MillisecondsParts {\n  seconds: number;\n}\n\nexport interface MinutesParts extends SecondsParts {\n  minutes: number;\n}\n\nexport interface HoursParts extends MinutesParts {\n  hours: number;\n}\n\nexport interface DaysParts extends HoursParts {\n  days: number;\n}\n\nexport interface DurationDescriptor<T> {\n  /**\n   * The value of the duration in the respective unit.\n   */\n  value: number;\n\n  /**\n   * Formats the duration according to the provided format string.\n   * @param formatString - The format string to use for formatting\n   * @param numeral - Optional numeral object for number formatting\n   * @returns Formatted string representation of the duration\n   */\n  format: (formatString: string, numeral?: Numeral) => string;\n\n  /**\n   * Converts the duration to an object containing the parts of the duration in the respective unit.\n   * @returns An object containing the parts of the duration in the respective unit.\n   */\n  toParts: () => T;\n}\n\nexport class Duration {\n  private readonly time: DOMHighResTimeStamp;\n\n  constructor (time: DOMHighResTimeStamp) {\n    this.time = time;\n  }\n\n  /**\n   * Converts the duration to nanoseconds.\n   * @returns DurationDescriptor with the value in nanoseconds and methods to format and get\n   * the parts of the duration in nanoseconds.\n   */\n  toNanoseconds (): DurationDescriptor<NanosecondsParts> {\n    return {\n      value: this.time * 1000000,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(nanosecondsPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          nanoseconds: Math.trunc(this.time * 1000000) + 0\n        };\n      }\n    };\n  }\n\n  /**\n   * Converts the duration to microseconds.\n   * @returns DurationDescriptor with the value in microseconds and methods to format and get\n   * the parts of the duration in microseconds and nanoseconds.\n   */\n  toMicroseconds (): DurationDescriptor<MicrosecondsParts> {\n    return {\n      value: this.time * 1000,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(microsecondsPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          microseconds: Math.trunc(this.time * 1000) + 0,\n          nanoseconds: Math.trunc(this.time * 1000000 % 1000) + 0\n        };\n      }\n    };\n  }\n\n  /**\n   * Converts the duration to milliseconds.\n   * @returns DurationDescriptor with the value in milliseconds and methods to format and get\n   * the parts of the duration in milliseconds, microseconds, and nanoseconds.\n   */\n  toMilliseconds (): DurationDescriptor<MillisecondsParts> {\n    return {\n      value: this.time,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(millisecondsPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          milliseconds: Math.trunc(this.time) + 0,\n          microseconds: Math.trunc(this.time * 1000 % 1000) + 0,\n          nanoseconds: Math.trunc(this.time * 1000000 % 1000) + 0\n        };\n      }\n    };\n  }\n\n  /**\n   * Converts the duration to seconds.\n   * @returns DurationDescriptor with the value in seconds and methods to format and get\n   * the parts of the duration in seconds, milliseconds, microseconds, and nanoseconds.\n   */\n  toSeconds (): DurationDescriptor<SecondsParts> {\n    return {\n      value: this.time / 1000,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(secondsPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          seconds: Math.trunc(this.time / 1000) + 0,\n          milliseconds: Math.trunc(this.time % 1000) + 0,\n          microseconds: Math.trunc(this.time * 1000 % 1000) + 0,\n          nanoseconds: Math.trunc(this.time * 1000000 % 1000) + 0\n        };\n      }\n    };\n  }\n\n  /**\n   * Converts the duration to minutes.\n   * @returns DurationDescriptor with the value in minutes and methods to format and get\n   * the parts of the duration in minutes, seconds, milliseconds, microseconds, and nanoseconds.\n   */\n  toMinutes (): DurationDescriptor<MinutesParts> {\n    return {\n      value: this.time / 60000,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(minutesPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          minutes: Math.trunc(this.time / 60000) + 0,\n          seconds: Math.trunc(this.time % 86400000 % 3600000 % 60000 / 1000) + 0,\n          milliseconds: Math.trunc(this.time % 1000) + 0,\n          microseconds: Math.trunc(this.time * 1000 % 1000) + 0,\n          nanoseconds: Math.trunc(this.time * 1000000 % 1000) + 0\n        };\n      }\n    };\n  }\n\n  /**\n   * Converts the duration to hours.\n   * @returns DurationDescriptor with the value in hours and methods to format and get\n   * the parts of the duration in hours, minutes, seconds, milliseconds, microseconds, and nanoseconds.\n   */\n  toHours (): DurationDescriptor<HoursParts> {\n    return {\n      value: this.time / 3600000,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(hoursPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          hours: Math.trunc(this.time / 3600000) + 0,\n          minutes: Math.trunc(this.time % 86400000 % 3600000 / 60000) + 0,\n          seconds: Math.trunc(this.time % 86400000 % 3600000 % 60000 / 1000) + 0,\n          milliseconds: Math.trunc(this.time % 1000) + 0,\n          microseconds: Math.trunc(this.time * 1000 % 1000) + 0,\n          nanoseconds: Math.trunc(this.time * 1000000 % 1000) + 0\n        };\n      }\n    };\n  }\n\n  /**\n   * Converts the duration to days.\n   * @returns DurationDescriptor with the value in days and methods to format and get\n   * the parts of the duration in days, hours, minutes, seconds, milliseconds, microseconds, and nanoseconds.\n   */\n  toDays (): DurationDescriptor<DaysParts> {\n    return {\n      value: this.time / 86400000,\n      format: (formatString: string, numeral?: Numeral) => {\n        return format(daysPart({}, this.time), formatString, numeral);\n      },\n      toParts: () => {\n        return {\n          days: Math.trunc(this.time / 86400000) + 0,\n          hours: Math.trunc(this.time % 86400000 / 3600000) + 0,\n          minutes: Math.trunc(this.time % 86400000 % 3600000 / 60000) + 0,\n          seconds: Math.trunc(this.time % 86400000 % 3600000 % 60000 / 1000) + 0,\n          milliseconds: Math.trunc(this.time % 1000) + 0,\n          microseconds: Math.trunc(this.time * 1000 % 1000) + 0,\n          nanoseconds: Math.trunc(this.time * 1000000 % 1000) + 0\n        };\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "src/format.ts",
    "content": "import { compile } from './compile.ts';\nimport { DateTime } from './datetime.ts';\nimport { formatter as defaultFormatter } from './formatter.ts';\nimport en from './locales/en.ts';\nimport latn from './numerals/latn.ts';\nimport { isTimeZone } from './zone.ts';\nimport type { CompiledObject } from './compile.ts';\nimport type { FormatterOptions } from './formatter.ts';\n\nconst comment = /^\\[(.*)\\]$/;\n\n/**\n * Formats a Date object according to the specified format string.\n * @param dateObj - The Date object to format\n * @param arg - The format string or compiled object to match against the Date object\n * @param [options] - Optional formatter options for customization\n * @returns The formatted date string representation\n */\nexport function format(dateObj: Date, arg: string | CompiledObject, options?: FormatterOptions) {\n  const pattern = (typeof arg === 'string' ? compile(arg) : arg).slice(1);\n  const zoneName = isTimeZone(options?.timeZone) ? options.timeZone.zone_name : options?.timeZone;\n  const dateTime = zoneName ? new DateTime(dateObj, zoneName) : dateObj;\n  const formatterOptions = {\n    hour12: options?.hour12 ?? 'h12',\n    hour24: options?.hour24 ?? 'h23',\n    numeral: options?.numeral ?? latn,\n    calendar: options?.calendar ?? 'gregory',\n    timeZone: options?.timeZone,\n    locale: options?.locale ?? en\n  };\n  const formatters = [...options?.plugins ?? [], defaultFormatter];\n  const encode = formatterOptions.numeral.encode;\n  const resolveToken = (token: string, compiledObj: CompiledObject) => {\n    for (const formatter of formatters) {\n      if (formatter[token]) {\n        return encode(formatter[token](dateTime, formatterOptions, compiledObj));\n      }\n    }\n    return comment.test(token) ? token.replace(comment, '$1') : token;\n  };\n\n  return pattern.reduce((result, token) => result + resolveToken(token, pattern), '');\n}\n"
  },
  {
    "path": "src/formatter.ts",
    "content": "import type { CompiledObject } from './compile.ts';\nimport type { DateLike } from './datetime.ts';\nimport type { Locale } from './locale.ts';\nimport type { Numeral } from './numeral.ts';\nimport type { TimeZone } from './zone.ts';\n\nexport interface FormatterPluginOptions {\n  /**\n   * The hour format to use for formatting.\n   * This is used when the hour is in 12-hour format.\n   * It can be 'h11' for 11-hour format or 'h12' for 12-hour format.\n   */\n  hour12: 'h11' | 'h12';\n\n  /**\n   * The hour format to use for formatting.\n   * This is used when the hour is in 24-hour format.\n   * It can be 'h23' for 23-hour format or 'h24' for 24-hour format.\n   */\n  hour24: 'h23' | 'h24';\n\n  /**\n   * The numeral system to use for formatting numbers.\n   * This is an object that provides methods to encode and decode numbers in the specified numeral system.\n   */\n  numeral: Numeral;\n\n  /**\n   * The calendar system to use for formatting dates.\n   * This can be 'buddhist' for Buddhist calendar or 'gregory' for Gregorian calendar.\n   */\n  calendar: 'buddhist' | 'gregory';\n\n/**\n  * The time zone to use for formatting dates and times.\n  * This can be a specific time zone object, an IANA time zone name, or 'UTC' to use Coordinated Universal Time.\n  * If not specified, it defaults to undefined, which means the local time zone will be used.\n  */\n  timeZone: TimeZone | string | undefined;\n\n  /**\n   * The locale to use for formatting dates and times.\n   * This is an object that provides methods to get localized month names, day names, and meridiems.\n   */\n  locale: Locale;\n}\n\nexport abstract class FormatterPlugin {\n  [key: string]: ((d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) => string) | undefined;\n}\n\nexport interface FormatterOptions extends Partial<FormatterPluginOptions> {\n  plugins?: FormatterPlugin[];\n}\n\nconst getFullYear = (d: DateLike, calendar: 'buddhist' | 'gregory') => {\n  return d.getFullYear() + (calendar === 'buddhist' ? 543 : 0);\n};\n\nclass DefaultFormatter extends FormatterPlugin {\n  YYYY (d: DateLike, options: FormatterPluginOptions) {\n    return `000${String(getFullYear(d, options.calendar))}`.slice(-4);\n  }\n\n  YY (d: DateLike, options: FormatterPluginOptions) {\n    return `0${String(getFullYear(d, options.calendar))}`.slice(-2);\n  }\n\n  Y (d: DateLike, options: FormatterPluginOptions) {\n    return String(getFullYear(d, options.calendar));\n  }\n\n  MMMM (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getMonthList({ style: 'long', compiledObj });\n    return list[d.getMonth()] ?? '';\n  }\n\n  MMM (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getMonthList({ style: 'short', compiledObj });\n    return list[d.getMonth()] ?? '';\n  }\n\n  MM (d: DateLike) {\n    return `0${String(d.getMonth() + 1)}`.slice(-2);\n  }\n\n  M (d: DateLike) {\n    return String(d.getMonth() + 1);\n  }\n\n  DD (d: DateLike) {\n    return `0${String(d.getDate())}`.slice(-2);\n  }\n\n  D (d: DateLike) {\n    return String(d.getDate());\n  }\n\n  HH (d: DateLike, options: FormatterPluginOptions) {\n    return `0${String(d.getHours() || (options.hour24 === 'h24' ? 24 : 0))}`.slice(-2);\n  }\n\n  H (d: DateLike, options: FormatterPluginOptions) {\n    return String(d.getHours() || (options.hour24 === 'h24' ? 24 : 0));\n  }\n\n  AA (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getMeridiemList({ style: 'long', compiledObj, case: 'uppercase' });\n    return list[+(d.getHours() > 11)] ?? '';\n  }\n\n  A (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getMeridiemList({ style: 'short', compiledObj, case: 'uppercase' });\n    return list[+(d.getHours() > 11)] ?? '';\n  }\n\n  aa (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getMeridiemList({ style: 'long', compiledObj, case: 'lowercase' });\n    return list[+(d.getHours() > 11)] ?? '';\n  }\n\n  a (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getMeridiemList({ style: 'short', compiledObj, case: 'lowercase' });\n    return list[+(d.getHours() > 11)] ?? '';\n  }\n\n  hh (d: DateLike, options: FormatterPluginOptions) {\n    return `0${String(d.getHours() % 12 || (options.hour12 === 'h12' ? 12 : 0))}`.slice(-2);\n  }\n\n  h (d: DateLike, options: FormatterPluginOptions) {\n    return String(d.getHours() % 12 || (options.hour12 === 'h12' ? 12 : 0));\n  }\n\n  mm (d: DateLike) {\n    return `0${String(d.getMinutes())}`.slice(-2);\n  }\n\n  m (d: DateLike) {\n    return String(d.getMinutes());\n  }\n\n  ss (d: DateLike) {\n    return `0${String(d.getSeconds())}`.slice(-2);\n  }\n\n  s (d: DateLike) {\n    return String(d.getSeconds());\n  }\n\n  SSS (d: DateLike) {\n    return `00${String(d.getMilliseconds())}`.slice(-3);\n  }\n\n  SS (d: DateLike) {\n    return `00${String(d.getMilliseconds())}`.slice(-3, -1);\n  }\n\n  S (d: DateLike) {\n    return `00${String(d.getMilliseconds())}`.slice(-3, -2);\n  }\n\n  dddd (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getDayOfWeekList({ style: 'long', compiledObj });\n    return list[d.getDay()] ?? '';\n  }\n\n  ddd (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getDayOfWeekList({ style: 'short', compiledObj });\n    return list[d.getDay()] ?? '';\n  }\n\n  dd (d: DateLike, options: FormatterPluginOptions, compiledObj: CompiledObject) {\n    const list = options.locale.getDayOfWeekList({ style: 'narrow', compiledObj });\n    return list[d.getDay()] ?? '';\n  }\n\n  Z (d: DateLike) {\n    const offset = d.getTimezoneOffset();\n    const absOffset = Math.abs(offset);\n    return `${offset > 0 ? '-' : '+'}${`0${String(absOffset / 60 | 0)}`.slice(-2)}${`0${String(absOffset % 60)}`.slice(-2)}`;\n  }\n\n  ZZ (d: DateLike) {\n    const offset = d.getTimezoneOffset();\n    const absOffset = Math.abs(offset);\n    return `${offset > 0 ? '-' : '+'}${`0${String(absOffset / 60 | 0)}`.slice(-2)}:${`0${String(absOffset % 60)}`.slice(-2)}`;\n  }\n}\n\nexport const formatter = new DefaultFormatter();\n"
  },
  {
    "path": "src/index.ts",
    "content": "export { compile } from './compile.ts';\nexport { format } from './format.ts';\nexport { preparse } from './preparse.ts';\nexport { isValid } from './isValid.ts';\nexport { parse } from './parse.ts';\nexport { transform } from './transform.ts';\nexport { addYears } from './addYears.ts';\nexport { addMonths } from './addMonths.ts';\nexport { addDays } from './addDays.ts';\nexport { addHours } from './addHours.ts';\nexport { addMinutes } from './addMinutes.ts';\nexport { addSeconds } from './addSeconds.ts';\nexport { addMilliseconds } from './addMilliseconds.ts';\nexport { Duration } from './duration.ts';\nexport { subtract } from './subtract.ts';\nexport {\n  isLeapYear,\n  isSameDay,\n  getDaysInMonth,\n  getISOWeekYear,\n  getISOWeek\n} from './utils.ts';\n"
  },
  {
    "path": "src/isValid.ts",
    "content": "import { preparse } from './preparse.ts';\nimport { getDaysInMonth } from './utils.ts';\nimport type { CompiledObject } from './compile.ts';\nimport type { ParsedComponents, ParserOptions } from './parser.ts';\nimport type { PreparseResult } from './preparse.ts';\n\n/**\n * Converts a year to the Gregorian calendar year based on the specified calendar system in the parser options.\n * @param year - The year to convert, which may be in a non-Gregorian calendar system (e.g., Buddhist calendar)\n * @param [options] - Optional parser options that may specify the calendar system to use for conversion\n * @returns The corresponding Gregorian calendar year, or undefined if the input year is undefined\n */\nexport const toGregorianYear = (year: number | undefined, options?: ParserOptions) => {\n  return year === undefined ? year : year - (options?.calendar === 'buddhist' ? 543 : 0);\n};\n\n/**\n * Gets the default date components to use when certain components are missing from the input string.\n * @param [defaultDate] - An object containing default date components (year, month, day, hour, minute, second, millisecond, timezone offset)\n * @returns An object with all date components filled in, using the provided default values or fallback defaults (e.g., year defaults to 1970)\n */\nexport const getDefaultDate = (defaultDate: ParsedComponents = {}) => {\n  return {\n    Y: defaultDate.Y ?? 1970,\n    M: defaultDate.M ?? 1,\n    D: defaultDate.D ?? 1,\n    H: defaultDate.H,\n    A: defaultDate.A,\n    h: defaultDate.h,\n    m: defaultDate.m ?? 0,\n    s: defaultDate.s ?? 0,\n    S: defaultDate.S ?? 0,\n    Z: defaultDate.Z\n  };\n};\n\n/**\n * Validates whether a preparse result object is valid.\n * @param pr - The preparse result object to validate\n * @param [options] - Optional parser options\n * @returns True if the preparse result is valid, false otherwise\n */\nexport function validatePreparseResult(pr: PreparseResult, options?: ParserOptions) {\n  const [min12, max12] = options?.hour12 === 'h11' ? [0, 11] : [1, 12];\n  const [min24, max24] = options?.hour24 === 'h24' ? [1, 24] : [0, 23];\n  const range = (value: number | undefined, min: number, max: number) => value === undefined || value >= min && value <= max;\n  const base = getDefaultDate(options?.defaultDate);\n  const year = toGregorianYear(pr.Y, options) ?? base.Y;\n  const month = pr.M ?? base.M;\n\n  return pr._index > 0\n    && pr._length > 0\n    && pr._index === pr._length\n    && pr._match > 0\n    && range(year, 1, 9999)\n    && range(month, 1, 12)\n    && range(pr.D ?? base.D, 1, getDaysInMonth(year, month))\n    && range(pr.H ?? base.H, min24, max24)\n    && range(pr.A ?? base.A, 0, 1)\n    && range(pr.h ?? base.h, min12, max12)\n    && range(pr.m ?? base.m, 0, 59)\n    && range(pr.s ?? base.s, 0, 59)\n    && range(pr.S ?? base.S, 0, 999)\n    && range(pr.Z ?? base.Z, -913, 956);\n}\n\n/**\n * Validates whether a date string is valid according to the specified format.\n * @param dateString - The date string to validate\n * @param arg - The format string or compiled object\n * @param [options] - Optional parser options\n * @returns True if the date string is valid, false otherwise\n */\nexport function isValid(dateString: string, arg: string | CompiledObject, options?: ParserOptions) {\n  return validatePreparseResult(preparse(dateString, arg, options), options);\n}\n"
  },
  {
    "path": "src/locale.ts",
    "content": "import type { CompiledObject } from './compile.ts';\n\nexport interface LocaleOptions {\n  compiledObj: CompiledObject;\n  style: 'long' | 'short' | 'narrow';\n  case?: 'uppercase' | 'lowercase';\n}\n\nexport interface Locale {\n  getLocale: () => string;\n  getMonthList: (options: LocaleOptions) => string[];\n  getDayOfWeekList: (options: LocaleOptions) => string[];\n  getMeridiemList: (options: LocaleOptions) => string[];\n}\n"
  },
  {
    "path": "src/locales/ar.ts",
    "content": "/**\n * @file Arabic (ar)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  MMM: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  dddd: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  ddd: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  dd: ['أح', 'اث', 'ثل', 'أر', 'خم', 'جم', 'سب'],\n  A: ['ص', 'م'],\n  AA: ['ص', 'م'],\n  a: ['ص', 'م'],\n  aa: ['ص', 'م']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ar';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/az.ts",
    "content": "/**\n * @file Azerbaijani (az)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'],\n  MMM: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'],\n  dddd: ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'],\n  ddd: ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'],\n  dd: ['7', '1', '2', '3', '4', '5', '6'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'az';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/bn.ts",
    "content": "/**\n * @file Bangla (bn)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  MMM: ['জানু', 'ফেব', 'মার্চ', 'এপ্রি', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ', 'অক্টো', 'নভে', 'ডিসে'],\n  dddd: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],\n  ddd: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],\n  dd: ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'bn';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/cs.ts",
    "content": "/**\n * @file Czech (cs)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: [\n    ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'],\n    ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince']\n  ],\n  MMM: [\n    ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'],\n    ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro']\n  ],\n  dddd: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],\n  ddd: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],\n  dd: ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],\n  A: ['dop.', 'odp.'],\n  AA: ['dop.', 'odp.'],\n  a: ['dop.', 'odp.'],\n  aa: ['dop.', 'odp.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'cs';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return (options.style === 'long'\n      ? list.MMMM\n      : list.MMM)[options.compiledObj.findIndex(token => /^D+$/.test(token)) < 0 ? 0 : 1];\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/da.ts",
    "content": "/**\n * @file Danish (da)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],\n  MMM: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  dddd: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  ddd: ['søn.', 'man.', 'tirs.', 'ons.', 'tors.', 'fre.', 'lør.'],\n  dd: ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'da';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/de.ts",
    "content": "/**\n * @file German (de)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  MMM: ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'],\n  dddd: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  ddd: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],\n  dd: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'de';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/el.ts",
    "content": "/**\n * @file Greek (el)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: [\n    ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'],\n    ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου']\n  ],\n  MMM: ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαΐ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'],\n  dddd: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],\n  ddd: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],\n  dd: ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πε', 'Πα', 'Σα'],\n  A: ['ΠΜ', 'ΜΜ'],\n  AA: ['Π.Μ.', 'Μ.Μ.'],\n  a: ['πμ', 'μμ'],\n  aa: ['π.μ.', 'μ.μ.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'el';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM[options.compiledObj.findIndex(token => /^D+$/.test(token)) < 0 ? 0 : 1]\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/en.ts",
    "content": "/**\n * @file English (en)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  MMM: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  dddd: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  ddd: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  dd: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'en';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/es.ts",
    "content": "/**\n * @file Spanish (es)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  MMM: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sept', 'oct', 'nov', 'dic'],\n  dddd: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  ddd: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],\n  dd: ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'es';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/fa.ts",
    "content": "/**\n * @file Persian (fa)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['دی', 'بهمن', 'اسفند', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر'],\n  MMM: ['دی', 'بهمن', 'اسفند', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر'],\n  dddd: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  ddd: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  dd: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  A: ['قبل‌ازظهر', 'بعدازظهر'],\n  AA: ['قبل‌ازظهر', 'بعدازظهر'],\n  a: ['قبل‌ازظهر', 'بعدازظهر'],\n  aa: ['قبل‌ازظهر', 'بعدازظهر']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'fa';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/fi.ts",
    "content": "/**\n * @file Finnish (fi)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: [\n    ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'],\n    ['tammikuuta', 'helmikuuta', 'maaliskuuta', 'huhtikuuta', 'toukokuuta', 'kesäkuuta', 'heinäkuuta', 'elokuuta', 'syyskuuta', 'lokakuuta', 'marraskuuta', 'joulukuuta']\n  ],\n  MMM: [\n    ['tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'],\n    ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']\n  ],\n  dddd: ['sunnuntai', 'maanantaina', 'tiistaina', 'keskiviikkona', 'torstaina', 'perjantaina', 'lauantaina'],\n  ddd: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],\n  dd: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],\n  A: ['ap.', 'ip.'],\n  AA: ['ap.', 'ip.'],\n  a: ['ap.', 'ip.'],\n  aa: ['ap.', 'ip.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'fi';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return (options.style === 'long'\n      ? list.MMMM\n      : list.MMM)[options.compiledObj.findIndex(token => /^D+$/.test(token)) < 0 ? 0 : 1];\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/fr.ts",
    "content": "/**\n * @file French (fr)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  MMM: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  dddd: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  ddd: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  dd: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'fr';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/he.ts",
    "content": "/**\n * @file Hebrew (he)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],\n  MMM: ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],\n  dddd: ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],\n  ddd: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],\n  dd: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'he';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/hi.ts",
    "content": "/**\n * @file Hindi (hi)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'],\n  MMM: ['जन॰', 'फ़र॰', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुल॰', 'अग॰', 'सित॰', 'अक्तू॰', 'नव॰', 'दिस॰'],\n  dddd: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],\n  ddd: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],\n  dd: ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'hi';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/hu.ts",
    "content": "/**\n * @file Hungarian (hu)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'],\n  MMM: ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'],\n  dddd: ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'],\n  ddd: ['vas', 'hét', 'kedd', 'sze', 'csüt', 'pén', 'szo'],\n  dd: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],\n  A: ['DE', 'DU'],\n  AA: ['DE.', 'DU.'],\n  a: ['de', 'du'],\n  aa: ['de.', 'du.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'hu';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/id.ts",
    "content": "/**\n * @file Indonesian (id)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  MMM: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],\n  dddd: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  ddd: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  dd: ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'id';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/it.ts",
    "content": "/**\n * @file Italian (it)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],\n  MMM: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],\n  dddd: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],\n  ddd: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],\n  dd: ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'it';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/ja.ts",
    "content": "/**\n * @file Japanese (ja)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  dddd: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],\n  ddd: ['日', '月', '火', '水', '木', '金', '土'],\n  dd: ['日', '月', '火', '水', '木', '金', '土'],\n  A: ['午前', '午後'],\n  AA: ['午前', '午後'],\n  a: ['午前', '午後'],\n  aa: ['午前', '午後']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ja';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/ko.ts",
    "content": "/**\n * @file Korean (ko)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  MMM: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  dddd: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],\n  ddd: ['일', '월', '화', '수', '목', '금', '토'],\n  dd: ['일', '월', '화', '수', '목', '금', '토'],\n  A: ['오전', '오후'],\n  AA: ['오전', '오후'],\n  a: ['오전', '오후'],\n  aa: ['오전', '오후']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ko';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/ms.ts",
    "content": "/**\n * @file Malay (ms)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  MMM: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  dddd: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  ddd: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  dd: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  A: ['PG', 'PTG'],\n  AA: ['PG', 'PTG'],\n  a: ['PG', 'PTG'],\n  aa: ['PG', 'PTG']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ms';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/my.ts",
    "content": "/**\n * @file Burmese (my)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'ဩဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'],\n  MMM: ['ဇန်', 'ဖေ', 'မတ်', 'ဧ', 'မေ', 'ဇွန်', 'ဇူ', 'ဩ', 'စက်', 'အောက်', 'နို', 'ဒီ'],\n  dddd: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  ddd: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  dd: ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],\n  A: ['နံနက်', 'ညနေ'],\n  AA: ['နံနက်', 'ညနေ'],\n  a: ['နံနက်', 'ညနေ'],\n  aa: ['နံနက်', 'ညနေ']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'my';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/nl.ts",
    "content": "/**\n * @file Dutch (nl)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  MMM: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  dddd: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  ddd: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  dd: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'nl';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/no.ts",
    "content": "/**\n * @file Norwegian (no)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  MMM: ['jan.', 'feb.', 'mars', 'apr.', 'mai', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],\n  dddd: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  ddd: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  dd: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'no';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/pl.ts",
    "content": "/**\n * @file Polish (pl)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: [\n    ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'],\n    ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia']\n  ],\n  MMM: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],\n  dddd: ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'],\n  ddd: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],\n  dd: ['ndz.', 'pn.', 'wt.', 'śr.', 'cz.', 'pt.', 'so.'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'pl';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM[options.compiledObj.findIndex(token => /^D+$/.test(token)) < 0 ? 0 : 1]\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/pt-BR.ts",
    "content": "/**\n * @file Brazilian Portuguese (pt-BR)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  MMM: ['jan.', 'fev.', 'mar.', 'abr.', 'mai.', 'jun.', 'jul.', 'ago.', 'set.', 'out.', 'nov.', 'dez.'],\n  dddd: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  ddd: ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.'],\n  dd: ['1ª', '2ª', '3ª', '4ª', '5ª', '6ª', '7ª'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'pt-BR';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/pt-PT.ts",
    "content": "/**\n * @file European Portuguese (pt-PT)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  MMM: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n  dddd: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  ddd: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  dd: ['Do', '2ª', '3ª', '4ª', '5ª', '6ª', 'Sa'],\n  A: ['da manhã', 'da tarde'],\n  AA: ['da manhã', 'da tarde'],\n  a: ['da manhã', 'da tarde'],\n  aa: ['da manhã', 'da tarde']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'pt-PT';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/ro.ts",
    "content": "/**\n * @file Romanian (ro)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  MMM: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  dddd: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  ddd: ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],\n  dd: ['du', 'lu', 'ma', 'mi', 'jo', 'vi', 'sâ'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ro';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/ru.ts",
    "content": "/**\n * @file Russian (ru)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: [\n    ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n    ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря']\n  ],\n  MMM: [\n    ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n    ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.']\n  ],\n  dddd: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  ddd: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  dd: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ru';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return (options.style === 'long'\n      ? list.MMMM\n      : list.MMM)[options.compiledObj.findIndex(token => /^D+$/.test(token)) < 0 ? 0 : 1];\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/rw.ts",
    "content": "/**\n * @file Kinyarwanda (rw)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicurasi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeri', 'Ukwakira', 'Ugushyingo', 'Ukuboza'],\n  MMM: ['mut.', 'gas.', 'wer.', 'mat.', 'gic.', 'kam.', 'nya.', 'kan.', 'nze.', 'ukw.', 'ugu.', 'uku.'],\n  dddd: ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'],\n  ddd: ['cyu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  dd: ['cyu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'rw';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/sr-Cyrl.ts",
    "content": "/**\n * @file Serbian (sr-Cyrl)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  MMM: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'нов', 'дец'],\n  dddd: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],\n  ddd: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  dd: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'sr-Cyrl';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/sr-Latn.ts",
    "content": "/**\n * @file Serbian (sr-Latn)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  MMM: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  dddd: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  ddd: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  dd: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'sr-Latn';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/sv.ts",
    "content": "/**\n * @file Swedish (sv)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],\n  MMM: ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  dddd: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],\n  ddd: ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],\n  dd: ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'],\n  A: ['fm', 'em'],\n  AA: ['fm', 'em'],\n  a: ['fm', 'em'],\n  aa: ['fm', 'em']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'sv';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/ta.ts",
    "content": "/**\n * @file Tamil (ta)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  MMM: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  dddd: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  ddd: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  dd: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'ta';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/th.ts",
    "content": "/**\n * @file Thai (th)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'],\n  MMM: ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'],\n  dddd: ['วันอาทิตย์', 'วันจันทร์', 'วันอังคาร', 'วันพุธ', 'วันพฤหัสบดี', 'วันศุกร์', 'วันเสาร์'],\n  ddd: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],\n  dd: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],\n  A: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  AA: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  a: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  aa: ['ก่อนเที่ยง', 'หลังเที่ยง']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'th';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/tr.ts",
    "content": "/**\n * @file Turkish (tr)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],\n  MMM: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],\n  dddd: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],\n  ddd: ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],\n  dd: ['Pz', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'],\n  A: ['ÖÖ', 'ÖS'],\n  AA: ['ÖÖ', 'ÖS'],\n  a: ['ÖÖ', 'ÖS'],\n  aa: ['ÖÖ', 'ÖS']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'tr';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/uk.ts",
    "content": "/**\n * @file Ukrainian (uk)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: [\n    ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'],\n    ['січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня']\n  ],\n  MMM: ['січ.', 'лют.', 'бер.', 'квіт.', 'трав.', 'черв.', 'лип.', 'серп.', 'вер.', 'жовт.', 'лист.', 'груд.'],\n  dddd: ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'пʼятниця', 'субота'],\n  ddd: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  dd: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  A: ['дп', 'пп'],\n  AA: ['дп', 'пп'],\n  a: ['дп', 'пп'],\n  aa: ['дп', 'пп']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'uk';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM[options.compiledObj.findIndex(token => /^D+$/.test(token)) < 0 ? 0 : 1]\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/uz-Cyrl.ts",
    "content": "/**\n * @file Uzbek (uz-Cyrl)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'],\n  MMM: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  dddd: ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'],\n  ddd: ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'],\n  dd: ['Як', 'Ду', 'Се', 'Чо', 'Па', 'Жу', 'Ша'],\n  A: ['ТО', 'ТК'],\n  AA: ['ТО', 'ТК'],\n  a: ['ТО', 'ТК'],\n  aa: ['ТО', 'ТК']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'uz-Cyrl';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/uz-Latn.ts",
    "content": "/**\n * @file Uzbek (uz-Latn)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avgust', 'sentabr', 'oktabr', 'noyabr', 'dekabr'],\n  MMM: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avg', 'sen', 'okt', 'noy', 'dek'],\n  dddd: ['yakshanba', 'dushanba', 'seshanba', 'chorshanba', 'payshanba', 'juma', 'shanba'],\n  ddd: ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'],\n  dd: ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'],\n  A: ['TO', 'TK'],\n  AA: ['TO', 'TK'],\n  a: ['TO', 'TK'],\n  aa: ['TO', 'TK']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'uz-Latn';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/vi.ts",
    "content": "/**\n * @file Vietnamese (vi)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8', 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'],\n  MMM: ['thg 1', 'thg 2', 'thg 3', 'thg 4', 'thg 5', 'thg 6', 'thg 7', 'thg 8', 'thg 9', 'thg 10', 'thg 11', 'thg 12'],\n  dddd: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n  ddd: ['CN', 'Th 2', 'Th 3', 'Th 4', 'Th 5', 'Th 6', 'Th 7'],\n  dd: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n  A: ['SA', 'CH'],\n  AA: ['SA', 'CH'],\n  a: ['SA', 'CH'],\n  aa: ['SA', 'CH']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'vi';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/zh-Hans.ts",
    "content": "/**\n * @file Chinese (zh-Hans)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  dddd: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  ddd: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  dd: ['日', '一', '二', '三', '四', '五', '六'],\n  A: ['上午', '下午'],\n  AA: ['上午', '下午'],\n  a: ['上午', '下午'],\n  aa: ['上午', '下午']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'zh-Hans';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/locales/zh-Hant.ts",
    "content": "/**\n * @file Chinese (zh-Hant)\n */\n\nimport type { Locale, LocaleOptions } from '@/locale.ts';\n\nconst list = {\n  MMMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  dddd: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  ddd: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  dd: ['日', '一', '二', '三', '四', '五', '六'],\n  A: ['上午', '下午'],\n  AA: ['上午', '下午'],\n  a: ['上午', '下午'],\n  aa: ['上午', '下午']\n};\n\nexport default new class implements Locale {\n  getLocale () {\n    return 'zh-Hant';\n  }\n\n  getMonthList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.MMMM\n      : list.MMM;\n  }\n\n  getDayOfWeekList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? list.dddd\n      : options.style === 'short'\n        ? list.ddd\n        : list.dd;\n  }\n\n  getMeridiemList (options: LocaleOptions) {\n    return options.style === 'long'\n      ? options.case === 'lowercase'\n        ? list.aa\n        : list.AA\n      : options.case === 'lowercase'\n        ? list.a\n        : list.A;\n  }\n}();\n"
  },
  {
    "path": "src/numeral.ts",
    "content": "export interface Numeral {\n  encode: (str: string) => string;\n  decode: (str: string) => string;\n}\n"
  },
  {
    "path": "src/numerals/arab.ts",
    "content": "const numeral = '٠١٢٣٤٥٦٧٨٩';\nconst array = numeral.split('');\nconst map = Object.fromEntries(array.map((char, index) => [char, String(index)]));\n\nexport default {\n  encode: (str: string) => str.replace(/\\d/g, char => array[+char]),\n  decode: (str: string) => str.replace(new RegExp(`[${numeral}]`, 'g'), char => map[char])\n};\n"
  },
  {
    "path": "src/numerals/arabext.ts",
    "content": "const numeral = '۰۱۲۳۴۵۶۷۸۹';\nconst array = numeral.split('');\nconst map = Object.fromEntries(array.map((char, index) => [char, String(index)]));\n\nexport default {\n  encode: (str: string) => str.replace(/\\d/g, char => array[+char]),\n  decode: (str: string) => str.replace(new RegExp(`[${numeral}]`, 'g'), char => map[char])\n};\n"
  },
  {
    "path": "src/numerals/beng.ts",
    "content": "const numeral = '০১২৩৪৫৬৭৮৯';\nconst array = numeral.split('');\nconst map = Object.fromEntries(array.map((char, index) => [char, String(index)]));\n\nexport default {\n  encode: (str: string) => str.replace(/\\d/g, char => array[+char]),\n  decode: (str: string) => str.replace(new RegExp(`[${numeral}]`, 'g'), char => map[char])\n};\n"
  },
  {
    "path": "src/numerals/latn.ts",
    "content": "export default {\n  encode: (str: string) => str,\n  decode: (str: string) => str\n};\n"
  },
  {
    "path": "src/numerals/mymr.ts",
    "content": "const numeral = '၀၁၂၃၄၅၆၇၈၉';\nconst array = numeral.split('');\nconst map = Object.fromEntries(array.map((char, index) => [char, String(index)]));\n\nexport default {\n  encode: (str: string) => str.replace(/\\d/g, char => array[+char]),\n  decode: (str: string) => str.replace(new RegExp(`[${numeral}]`, 'g'), char => map[char])\n};\n"
  },
  {
    "path": "src/parse.ts",
    "content": "import { createTimezoneDate, TimeZone } from './zone.ts';\nimport { isUTC } from './datetime.ts';\nimport { preparse } from './preparse.ts';\nimport { toGregorianYear, getDefaultDate, validatePreparseResult } from './isValid.ts';\nimport type { CompiledObject } from './compile.ts';\nimport type { ParserOptions } from './parser.ts';\n\nconst convert = (Y: number, M: number, D: number, H: number, m: number, s: number, S: number, timeZone?: string | TimeZone) => {\n  // If a specific time zone is provided in the options, use it to create the date.\n  if (timeZone) {\n    const naiveUTC = Date.UTC(Y, M - 1, D, H, m, s, S);\n    // If the specified time zone is UTC, create the date directly in UTC. Otherwise, create the date using the specified time zone.\n    return isUTC(timeZone) ? new Date(naiveUTC) : createTimezoneDate(naiveUTC, timeZone);\n  }\n  // If no time zone is provided, create the date in the local time zone.\n  return new Date(Y, M - 1, D, H, m, s, S);\n};\n\n/**\n * Parses a date string according to the specified format.\n * @param dateString - The date string to parse\n * @param arg - The format string or compiled object to match against the date string\n * @param [options] - Optional parser options for customization\n * @returns The parsed Date object, or an invalid date if parsing fails\n */\nexport function parse(dateString: string, arg: string | CompiledObject, options?: ParserOptions) {\n  const pr = preparse(dateString, arg, options);\n\n  if (!validatePreparseResult(pr, options)) {\n    return new Date(NaN);\n  }\n\n  const base = getDefaultDate(options?.defaultDate);\n  const year = toGregorianYear(pr.Y, options) ?? base.Y;\n  // When a Z offset exists (from the parsed string or defaultDate.Z), it takes precedence over options.timeZone.\n  const offset = pr.Z ?? base.Z;\n\n  return convert(\n    year,\n    (pr.M ?? base.M) - (year < 100 ? 1900 * 12 : 0),\n    pr.D ?? base.D,\n    ((pr.H ?? base.H ?? 0) % 24) || ((pr.A ?? base.A ?? 0) * 12 + (pr.h ?? base.h ?? 0) % 12),\n    (pr.m ?? base.m) + (offset ?? 0),\n    pr.s ?? base.s,\n    pr.S ?? base.S,\n    typeof offset === 'number' ? 'UTC' : options?.timeZone\n  );\n}\n"
  },
  {
    "path": "src/parser.ts",
    "content": "import type { CompiledObject } from './compile.ts';\nimport type { Locale } from './locale.ts';\nimport type { Numeral } from './numeral.ts';\nimport type { TimeZone } from './zone.ts';\n\ntype ParserToken = 'Y' | 'M' | 'D' | 'H' | 'A' | 'h' | 'm' | 's' | 'S' | 'Z';\n\nexport interface ParsedComponents {\n  /**\n   * Year component\n   */\n  Y?: number;\n\n  /**\n   * Month component (1-12)\n   */\n  M?: number;\n\n  /**\n   * Day component\n   */\n  D?: number;\n\n  /**\n   * Hour in 24-hour format\n   */\n  H?: number;\n\n  /**\n   * Meridiem indicator (0:AM / 1:PM)\n   */\n  A?: number;\n\n  /**\n   * Hour in 12-hour format\n   */\n  h?: number;\n\n  /**\n   * Minute component\n   */\n  m?: number;\n\n  /**\n   * Second component\n   */\n  s?: number;\n\n  /**\n   * Millisecond component\n   */\n  S?: number;\n\n  /**\n   * Timezone offset in minutes\n   */\n  Z?: number;\n}\n\nexport interface ParserPluginOptions {\n  /**\n   * The hour format to use for parsing.\n   * This is used when the hour is in 12-hour format.\n   * It can be 'h11' for 11-hour format or 'h12' for 12-hour format.\n   */\n  hour12: 'h11' | 'h12';\n\n  /**\n   * The hour format to use for parsing.\n   * This is used when the hour is in 24-hour format.\n   * It can be 'h23' for 23-hour format or 'h24' for 24-hour format.\n   */\n  hour24: 'h23' | 'h24';\n\n  /**\n   * The numeral system to use for parsing numbers.\n   * This is an object that provides methods to encode and decode numbers in the specified numeral system.\n   */\n  numeral: Numeral;\n\n  /**\n   * The calendar system to use for parsing dates.\n   * This can be 'buddhist' for Buddhist calendar or 'gregory' for Gregorian calendar.\n   */\n  calendar: 'buddhist' | 'gregory';\n\n  /**\n   * Whether to ignore case when matching strings.\n   * This is useful for matching month names, day names, and meridiems in a case-insensitive manner.\n   * If true, the parser will convert both the input string and the strings in the locale to lowercase before matching.\n   */\n  ignoreCase: boolean;\n\n  /**\n   * The time zone to use for parsing dates and times.\n   * This can be a specific time zone object, an IANA time zone name, or 'UTC' to use Coordinated Universal Time.\n   * If not specified, it defaults to undefined, which means the local time zone will be used.\n   */\n  timeZone: TimeZone | string | undefined;\n\n  /**\n   * The locale to use for parsing dates and times.\n   * This is an object that provides methods to get localized month names, day names, and meridiems.\n   */\n  locale: Locale;\n\n  /**\n   * Default date components to use when certain components are missing from the input string.\n   * This allows the parser to fill in missing components with default values, which can be useful for parsing partial date strings.\n   * For example, if the input string only contains a month and day, the parser can use the default year from this object.\n   */\n  defaultDate: ParsedComponents;\n}\n\nexport interface ParseResult {\n  value: number;\n  length: number;\n  token?: ParserToken;\n}\n\nexport abstract class ParserPlugin {\n  [key: string]: ((str: string, options: ParserPluginOptions, compiledObj: CompiledObject) => ParseResult) | undefined;\n}\n\nexport interface ParserOptions extends Partial<ParserPluginOptions> {\n  plugins?: ParserPlugin[];\n}\n\n/**\n * Executes a regular expression against a string and returns parsed result.\n * @param re - The regular expression to execute\n * @param str - The string to execute the regex against\n * @param [token] - Optional parser token to associate with the result\n * @returns ParseResult containing the numeric value, length, and token\n */\nexport const exec = (re: RegExp, str: string, token?: ParserToken) => {\n  const result = re.exec(str)?.[0] ?? '';\n  return { value: +result, length: result.length, token };\n};\n\n/**\n * Finds the best matching string from an array based on length and string position.\n * @param array - Array of strings to search through\n * @param str - The string to match against\n * @param options - Parser plugin options\n * @param [token] - Optional parser token to associate with the result\n * @returns ParseResult with the index of the longest matching string at the start position\n */\nexport const find = (array: string[], str: string, options: ParserPluginOptions, token?: ParserToken): ParseResult => {\n  const [array2, str2] = options.ignoreCase ? (() => {\n    const locale = options.locale.getLocale();\n    return [array.map(s => s.toLocaleLowerCase(locale)), str.toLocaleLowerCase(locale)];\n  })() : [array, str];\n\n  return array2.reduce((result, item, value) => item.length > result.length && !str2.indexOf(item)\n    ? { value, length: item.length, token }\n    : result,\n  { value: -1, length: 0, token });\n};\n\nconst VALID_TOKENS = new Set<ParserToken>(['Y', 'M', 'D', 'H', 'A', 'h', 'm', 's', 'S', 'Z']);\n\n/**\n * Validates if a token is a recognized parser token.\n * @param token - The token string to validate\n * @returns True if the token is valid, false otherwise\n */\nexport const validateToken = (token: ParserToken) => VALID_TOKENS.has(token);\n\nclass DefaultParser extends ParserPlugin {\n  YYYY (str: string) {\n    return exec(/^\\d{4}/, str, 'Y');\n  }\n\n  Y (str: string) {\n    return exec(/^\\d{1,4}/, str, 'Y');\n  }\n\n  MMMM (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getMonthList({ style: 'long', compiledObj });\n    const result = find(array, str, options, 'M');\n\n    result.value++;\n    return result;\n  }\n\n  MMM (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getMonthList({ style: 'short', compiledObj });\n    const result = find(array, str, options, 'M');\n\n    result.value++;\n    return result;\n  }\n\n  MM (str: string) {\n    return exec(/^\\d\\d/, str, 'M');\n  }\n\n  M (str: string) {\n    return exec(/^\\d\\d?/, str, 'M');\n  }\n\n  DD (str: string) {\n    return exec(/^\\d\\d/, str, 'D');\n  }\n\n  D (str: string) {\n    return exec(/^\\d\\d?/, str, 'D');\n  }\n\n  HH (str: string) {\n    return exec(/^\\d\\d/, str, 'H');\n  }\n\n  H (str: string) {\n    return exec(/^\\d\\d?/, str, 'H');\n  }\n\n  AA (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getMeridiemList({ style: 'long', compiledObj, case: 'uppercase' });\n    return find(array, str, options, 'A');\n  }\n\n  A (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getMeridiemList({ style: 'short', compiledObj, case: 'uppercase' });\n    return find(array, str, options, 'A');\n  }\n\n  aa (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getMeridiemList({ style: 'long', compiledObj, case: 'lowercase' });\n    return find(array, str, options, 'A');\n  }\n\n  a (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getMeridiemList({ style: 'short', compiledObj, case: 'lowercase' });\n    return find(array, str, options, 'A');\n  }\n\n  hh (str: string) {\n    return exec(/^\\d\\d/, str, 'h');\n  }\n\n  h (str: string) {\n    return exec(/^\\d\\d?/, str, 'h');\n  }\n\n  mm (str: string) {\n    return exec(/^\\d\\d/, str, 'm');\n  }\n\n  m (str: string) {\n    return exec(/^\\d\\d?/, str, 'm');\n  }\n\n  ss (str: string) {\n    return exec(/^\\d\\d/, str, 's');\n  }\n\n  s (str: string) {\n    return exec(/^\\d\\d?/, str, 's');\n  }\n\n  SSS (str: string) {\n    return exec(/^\\d{1,3}/, str, 'S');\n  }\n\n  SS (str: string) {\n    const result = exec(/^\\d\\d?/, str, 'S');\n    result.value *= 10;\n    return result;\n  }\n\n  S (str: string) {\n    const result = exec(/^\\d/, str, 'S');\n    result.value *= 100;\n    return result;\n  }\n\n  Z (str: string) {\n    const result = exec(/^[+-][01]\\d[0-5]\\d/, str, 'Z');\n    result.value = (result.value / 100 | 0) * -60 - result.value % 100;\n    return result;\n  }\n\n  ZZ (str: string) {\n    const results = /^([+-][01]\\d):([0-5]\\d)/.exec(str) ?? ['', '', ''];\n    const value = +(results[1] + results[2]);\n    return { value: (value / 100 | 0) * -60 - value % 100, length: results[0].length, token: 'Z' } satisfies ParseResult;\n  }\n}\n\nexport const parser = new DefaultParser();\n"
  },
  {
    "path": "src/plugin.ts",
    "content": "export { FormatterPlugin } from './formatter.ts';\nexport { ParserPlugin, exec, find } from './parser.ts';\nexport type { FormatterPluginOptions } from './formatter.ts';\nexport type { ParserPluginOptions, ParseResult } from './parser.ts';\nexport type { CompiledObject } from './compile.ts';\nexport type { DateLike } from './datetime.ts';\nexport type { Locale } from './locale.ts';\nexport type { Numeral } from './numeral.ts';\nexport type { TimeZone } from './zone.ts';\n"
  },
  {
    "path": "src/plugins/day-of-week.ts",
    "content": "import { ParserPlugin, ParserPluginOptions, CompiledObject, find } from '@/plugin.ts';\n\nclass Parser extends ParserPlugin {\n  dddd (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getDayOfWeekList({ style: 'long', compiledObj });\n    return find(array, str, options);\n  }\n\n  ddd (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getDayOfWeekList({ style: 'short', compiledObj });\n    return find(array, str, options);\n  }\n\n  dd (str: string, options: ParserPluginOptions, compiledObj: CompiledObject) {\n    const array = options.locale.getDayOfWeekList({ style: 'narrow', compiledObj });\n    return find(array, str, options);\n  }\n}\n\nexport const parser = new Parser();\n"
  },
  {
    "path": "src/plugins/microsecond.ts",
    "content": "import { ParserPlugin, exec } from '@/plugin.ts';\n\nclass Parser extends ParserPlugin {\n  SSSS (str: string) {\n    const result = exec(/^\\d{1,4}/, str, 'S');\n\n    result.value = Math.trunc(result.value / 10);\n    return result;\n  }\n\n  SSSSS (str: string) {\n    const result = exec(/^\\d{1,5}/, str, 'S');\n\n    result.value = Math.trunc(result.value / 100);\n    return result;\n  }\n\n  SSSSSS (str: string) {\n    const result = exec(/^\\d{1,6}/, str, 'S');\n\n    result.value = Math.trunc(result.value / 1000);\n    return result;\n  }\n\n  f (str: string) {\n    return exec(/^\\d/, str);\n  }\n\n  ff (str: string) {\n    return exec(/^\\d\\d?/, str);\n  }\n\n  fff (str: string) {\n    return exec(/^\\d{1,3}/, str);\n  }\n}\n\nexport const parser = new Parser();\n"
  },
  {
    "path": "src/plugins/nanosecond.ts",
    "content": "import { ParserPlugin, exec } from '@/plugin.ts';\n\nclass Parser extends ParserPlugin {\n  SSSSSSS (str: string) {\n    const result = exec(/^\\d{1,7}/, str, 'S');\n\n    result.value = Math.trunc(result.value / 10000);\n    return result;\n  }\n\n  SSSSSSSS (str: string) {\n    const result = exec(/^\\d{1,8}/, str, 'S');\n\n    result.value = Math.trunc(result.value / 100000);\n    return result;\n  }\n\n  SSSSSSSSS (str: string) {\n    const result = exec(/^\\d{1,9}/, str, 'S');\n\n    result.value = Math.trunc(result.value / 1000000);\n    return result;\n  }\n\n  F (str: string) {\n    return exec(/^\\d/, str);\n  }\n\n  FF (str: string) {\n    return exec(/^\\d\\d?/, str);\n  }\n\n  FFF (str: string) {\n    return exec(/^\\d{1,3}/, str);\n  }\n}\n\nexport const parser = new Parser();\n"
  },
  {
    "path": "src/plugins/ordinal.ts",
    "content": "import { FormatterPlugin, ParserPlugin, ParserPluginOptions, exec } from '@/plugin.ts';\nimport type { DateLike } from '@/plugin.ts';\n\nclass Formatter extends FormatterPlugin {\n  DDD (d: DateLike) {\n    const day = String(d.getDate());\n\n    switch (day) {\n    case '1':\n    case '21':\n    case '31':\n      return `${day}st`;\n    case '2':\n    case '22':\n      return `${day}nd`;\n    case '3':\n    case '23':\n      return `${day}rd`;\n    default:\n      return `${day}th`;\n    }\n  }\n}\n\nclass Parser extends ParserPlugin {\n  DDD (str: string, options: ParserPluginOptions) {\n    const result = exec(/^\\d\\d?(?=st|nd|rd|th)/, options.ignoreCase ? str.toLowerCase() : str, 'D');\n\n    if (result.length > 0) {\n      result.length += 2;\n    }\n    return result;\n  }\n}\n\nexport const formatter = new Formatter();\n\nexport const parser = new Parser();\n"
  },
  {
    "path": "src/plugins/quarter.ts",
    "content": "import { FormatterPlugin } from '@/plugin.ts';\nimport type { DateLike } from '@/plugin.ts';\n\nclass Formatter extends FormatterPlugin {\n  Q (d: DateLike) {\n    return String((d.getMonth() / 3 | 0) + 1);\n  }\n}\n\nexport const formatter = new Formatter();\n"
  },
  {
    "path": "src/plugins/timestamp.ts",
    "content": "import { FormatterPlugin } from '@/plugin.ts';\nimport type { DateLike } from '@/plugin.ts';\n\nclass Formatter extends FormatterPlugin {\n  t (d: DateLike) {\n    return String(Math.floor(d.getTime() / 1000));\n  }\n\n  T (d: DateLike) {\n    return String(d.getTime());\n  }\n}\n\nexport const formatter = new Formatter();\n"
  },
  {
    "path": "src/plugins/two-digit-year.ts",
    "content": "import { ParserPlugin, exec } from '@/plugin.ts';\nimport type { ParserPluginOptions } from '@/plugin.ts';\n\nclass Parser extends ParserPlugin {\n  YY (str: string, options: ParserPluginOptions) {\n    const result = exec(/^\\d\\d/, str, 'Y');\n\n    switch (options.calendar) {\n    case 'buddhist':\n      result.value += result.value < 13 ? 2600 : 2500;\n      break;\n    default:\n      result.value += result.value < 70 ? 2000 : 1900;\n    }\n    return result;\n  }\n}\n\nexport const parser = new Parser();\n"
  },
  {
    "path": "src/plugins/week.ts",
    "content": "import { FormatterPlugin } from '@/plugin.ts';\nimport { getISOWeekYear, getISOWeek } from '@/utils.ts';\nimport type { DateLike } from '@/plugin.ts';\n\nconst _getISOWeekYear = (d: DateLike) => getISOWeekYear(d.getFullYear(), d.getMonth() + 1, d.getDate());\n\nconst _getISOWeek = (d: DateLike) => getISOWeek(d.getFullYear(), d.getMonth() + 1, d.getDate());\n\nclass Formatter extends FormatterPlugin {\n  W (d: DateLike) {\n    return String(_getISOWeek(d));\n  }\n\n  WW (d: DateLike) {\n    return `0${String(_getISOWeek(d))}`.slice(-2);\n  }\n\n  GGGG (d: DateLike) {\n    return `000${String(_getISOWeekYear(d))}`.slice(-4);\n  }\n\n  GG (d: DateLike) {\n    return `0${String(_getISOWeekYear(d))}`.slice(-2);\n  }\n\n  G (d: DateLike) {\n    return String(_getISOWeekYear(d));\n  }\n}\n\nexport const formatter = new Formatter();\n"
  },
  {
    "path": "src/plugins/zonename.ts",
    "content": "import timeZoneNames from '@/zonenames.ts';\nimport { FormatterPlugin } from '@/plugin.ts';\nimport { isTimeZone } from '@/zone.ts';\nimport type { FormatterPluginOptions, DateLike } from '@/plugin.ts';\n\nconst getLongTimezoneName = (time: number, zoneName?: string) => {\n  const parts = new Intl.DateTimeFormat('en-US', {\n    timeZone: zoneName ?? undefined, timeZoneName: 'long'\n  }).formatToParts(time);\n\n  return parts.find(part => part.type === 'timeZoneName')?.value.replace(/^GMT[+-].+$/, '') ?? '';\n};\n\nconst getShortTimezoneName = (time: number, zoneName?: string) => {\n  return timeZoneNames[getLongTimezoneName(time, zoneName) as keyof typeof timeZoneNames] || '';\n};\n\nclass Formatter extends FormatterPlugin {\n  z (d: DateLike, options: FormatterPluginOptions) {\n    const zoneName = isTimeZone(options.timeZone) ? options.timeZone.zone_name : options.timeZone;\n    return getShortTimezoneName(d.getTime(), zoneName);\n  }\n\n  zz (d: DateLike, options: FormatterPluginOptions) {\n    const zoneName = isTimeZone(options.timeZone) ? options.timeZone.zone_name : options.timeZone;\n    return getLongTimezoneName(d.getTime(), zoneName);\n  }\n}\n\nexport const formatter = new Formatter();\n"
  },
  {
    "path": "src/preparse.ts",
    "content": "import { compile } from './compile.ts';\nimport { isTimeZone } from './zone.ts';\nimport { parser as defaultParser, validateToken } from './parser.ts';\nimport en from './locales/en.ts';\nimport latn from './numerals/latn.ts';\nimport type { CompiledObject } from './compile.ts';\nimport type { ParsedComponents, ParserOptions } from './parser.ts';\n\nexport interface PreparseResult extends ParsedComponents {\n  /**\n   * Current parsing position\n   */\n  _index: number;\n\n  /**\n   * Total length of date string\n   */\n  _length: number;\n\n  /**\n   * Number of matched tokens\n   */\n  _match: number;\n}\n\nconst wildcard = ' ';\nconst comment = /^\\[(.*)\\]$/;\nconst ellipsis = '...';\n\n/**\n * Preparses a date string according to the specified pattern.\n * @param dateString - The date string to preparse\n * @param arg - The pattern string or compiled object to match against the date string\n * @param [options] - Optional parser options\n * @returns PreparseResult containing parsed date components and metadata\n */\nexport function preparse(dateString: string, arg: string | CompiledObject, options?: ParserOptions) {\n  const pattern = (typeof arg === 'string' ? compile(arg) : arg).slice(1);\n  const parserOptions = {\n    hour12: options?.hour12 ?? 'h12',\n    hour24: options?.hour24 ?? 'h23',\n    numeral: options?.numeral ?? latn,\n    calendar: options?.calendar ?? 'gregory',\n    ignoreCase: options?.ignoreCase ?? false,\n    timeZone: isTimeZone(options?.timeZone) || typeof options?.timeZone === 'string'\n      ? options.timeZone || undefined\n      : undefined,\n    locale: options?.locale ?? en,\n    defaultDate: options?.defaultDate ?? {}\n  };\n  const pr: PreparseResult = {\n    _index: 0,\n    _length: 0,\n    _match: 0\n  };\n  const parsers = [...options?.plugins ?? [], defaultParser];\n  const resolveToken = (token: string, str: string) => {\n    for (const parser of parsers) {\n      if (parser[token]) {\n        return parser[token](str, parserOptions, pattern);\n      }\n    }\n    return undefined;\n  };\n\n  dateString = parserOptions.numeral.decode(dateString);\n\n  for (const token of pattern) {\n    const str = dateString.substring(pr._index);\n    const result = resolveToken(token, str);\n\n    if (result) {\n      if (!result.length) {\n        break;\n      }\n      if (result.token && validateToken(result.token)) {\n        pr[result.token] = result.value + 0;\n      }\n      pr._index += result.length;\n      pr._match++;\n    } else if (token === str[0] || token === wildcard) {\n      pr._index++;\n    } else if (comment.test(token) && !str.indexOf(token.replace(comment, '$1'))) {\n      pr._index += token.length - 2;\n    } else if (token === ellipsis) {\n      pr._index = dateString.length;\n      break;\n    } else {\n      break;\n    }\n  }\n  pr._length = dateString.length;\n  // Breaking change: 12-hour to 24-hour conversion is no longer performed here; values are preserved as read.\n  return pr;\n}\n"
  },
  {
    "path": "src/subtract.ts",
    "content": "import { Duration } from './duration.ts';\n\n/**\n * Calculates the difference between two dates.\n * @param from - The first Date object\n * @param to - The second Date object\n * @returns A Duration instance with methods to get the difference in various units\n */\nexport const subtract = (from: Date, to: Date) => {\n  return new Duration(to.getTime() - from.getTime());\n};\n"
  },
  {
    "path": "src/timezone.ts",
    "content": "import { TimeZone } from '@/zone.ts';\n\nexport const Abidjan: TimeZone = {\n  zone_name: 'Africa/Abidjan',\n  gmt_offset: [0, -968]\n};\n\nexport const Accra: TimeZone = {\n  zone_name: 'Africa/Accra',\n  gmt_offset: [1800, 1200, 0, -52]\n};\n\nexport const Adak: TimeZone = {\n  zone_name: 'America/Adak',\n  gmt_offset: [44002, -32400, -36000, -39600, -42398]\n};\n\nexport const Addis_Ababa: TimeZone = {\n  zone_name: 'Africa/Addis_Ababa',\n  gmt_offset: [10800, 9320, 9288]\n};\n\nexport const Adelaide: TimeZone = {\n  zone_name: 'Australia/Adelaide',\n  gmt_offset: [37800, 34200, 33260, 32400]\n};\n\nexport const Aden: TimeZone = {\n  zone_name: 'Asia/Aden',\n  gmt_offset: [10800, 10794]\n};\n\nexport const Algiers: TimeZone = {\n  zone_name: 'Africa/Algiers',\n  gmt_offset: [7200, 3600, 732, 561, 0]\n};\n\nexport const Almaty: TimeZone = {\n  zone_name: 'Asia/Almaty',\n  gmt_offset: [25200, 21600, 18468, 18000]\n};\n\nexport const Amman: TimeZone = {\n  zone_name: 'Asia/Amman',\n  gmt_offset: [10800, 8624, 7200]\n};\n\nexport const Amsterdam: TimeZone = {\n  zone_name: 'Europe/Amsterdam',\n  gmt_offset: [7200, 4800, 4772, 3600, 1200, 1172]\n};\n\nexport const Anadyr: TimeZone = {\n  zone_name: 'Asia/Anadyr',\n  gmt_offset: [50400, 46800, 43200, 42596, 39600]\n};\n\nexport const Anchorage: TimeZone = {\n  zone_name: 'America/Anchorage',\n  gmt_offset: [50424, -28800, -32400, -35976, -36000]\n};\n\nexport const Andorra: TimeZone = {\n  zone_name: 'Europe/Andorra',\n  gmt_offset: [7200, 3600, 364, 0]\n};\n\nexport const Anguilla: TimeZone = {\n  zone_name: 'America/Anguilla',\n  gmt_offset: [-14400, -15136]\n};\n\nexport const Antananarivo: TimeZone = {\n  zone_name: 'Indian/Antananarivo',\n  gmt_offset: [14400, 11404, 10800]\n};\n\nexport const Antigua: TimeZone = {\n  zone_name: 'America/Antigua',\n  gmt_offset: [-14400, -14832, -18000]\n};\n\nexport const Apia: TimeZone = {\n  zone_name: 'Pacific/Apia',\n  gmt_offset: [50400, 46800, 45184, -36000, -39600, -41216, -41400]\n};\n\nexport const Aqtau: TimeZone = {\n  zone_name: 'Asia/Aqtau',\n  gmt_offset: [21600, 18000, 14400, 12064]\n};\n\nexport const Aqtobe: TimeZone = {\n  zone_name: 'Asia/Aqtobe',\n  gmt_offset: [21600, 18000, 14400, 13720]\n};\n\nexport const Araguaina: TimeZone = {\n  zone_name: 'America/Araguaina',\n  gmt_offset: [-7200, -10800, -11568]\n};\n\nexport const Aruba: TimeZone = {\n  zone_name: 'America/Aruba',\n  gmt_offset: [-14400, -16200, -16824]\n};\n\nexport const Ashgabat: TimeZone = {\n  zone_name: 'Asia/Ashgabat',\n  gmt_offset: [21600, 18000, 14400, 14012]\n};\n\nexport const Asmara: TimeZone = {\n  zone_name: 'Africa/Asmara',\n  gmt_offset: [10800, 9332, 9320]\n};\n\nexport const Astrakhan: TimeZone = {\n  zone_name: 'Europe/Astrakhan',\n  gmt_offset: [18000, 14400, 11532, 10800]\n};\n\nexport const Asuncion: TimeZone = {\n  zone_name: 'America/Asuncion',\n  gmt_offset: [-10800, -13840, -14400]\n};\n\nexport const Athens: TimeZone = {\n  zone_name: 'Europe/Athens',\n  gmt_offset: [10800, 7200, 5692, 3600]\n};\n\nexport const Atikokan: TimeZone = {\n  zone_name: 'America/Atikokan',\n  gmt_offset: [-18000, -21600, -21988]\n};\n\nexport const Atyrau: TimeZone = {\n  zone_name: 'Asia/Atyrau',\n  gmt_offset: [21600, 18000, 14400, 12464, 10800]\n};\n\nexport const Auckland: TimeZone = {\n  zone_name: 'Pacific/Auckland',\n  gmt_offset: [46800, 45000, 43200, 41944, 41400]\n};\n\nexport const Azores: TimeZone = {\n  zone_name: 'Atlantic/Azores',\n  gmt_offset: [3600, 0, -3600, -6160, -6872, -7200]\n};\n\nexport const Baghdad: TimeZone = {\n  zone_name: 'Asia/Baghdad',\n  gmt_offset: [14400, 10800, 10660, 10656]\n};\n\nexport const Bahia: TimeZone = {\n  zone_name: 'America/Bahia',\n  gmt_offset: [-7200, -9244, -10800]\n};\n\nexport const Bahia_Banderas: TimeZone = {\n  zone_name: 'America/Bahia_Banderas',\n  gmt_offset: [-18000, -21600, -25200, -25260]\n};\n\nexport const Bahrain: TimeZone = {\n  zone_name: 'Asia/Bahrain',\n  gmt_offset: [14400, 12600, 12140, 10800]\n};\n\nexport const Baku: TimeZone = {\n  zone_name: 'Asia/Baku',\n  gmt_offset: [18000, 14400, 11964, 10800]\n};\n\nexport const Bamako: TimeZone = {\n  zone_name: 'Africa/Bamako',\n  gmt_offset: [0, -1920, -3600]\n};\n\nexport const Bangkok: TimeZone = {\n  zone_name: 'Asia/Bangkok',\n  gmt_offset: [25200, 24124]\n};\n\nexport const Bangui: TimeZone = {\n  zone_name: 'Africa/Bangui',\n  gmt_offset: [4460, 3600]\n};\n\nexport const Banjul: TimeZone = {\n  zone_name: 'Africa/Banjul',\n  gmt_offset: [0, -3600, -3996]\n};\n\nexport const Barbados: TimeZone = {\n  zone_name: 'America/Barbados',\n  gmt_offset: [-10800, -12600, -14309, -14400]\n};\n\nexport const Barnaul: TimeZone = {\n  zone_name: 'Asia/Barnaul',\n  gmt_offset: [28800, 25200, 21600, 20100]\n};\n\nexport const Beirut: TimeZone = {\n  zone_name: 'Asia/Beirut',\n  gmt_offset: [10800, 8520, 7200]\n};\n\nexport const Belem: TimeZone = {\n  zone_name: 'America/Belem',\n  gmt_offset: [-7200, -10800, -11636]\n};\n\nexport const Belgrade: TimeZone = {\n  zone_name: 'Europe/Belgrade',\n  gmt_offset: [7200, 4920, 3600]\n};\n\nexport const Belize: TimeZone = {\n  zone_name: 'America/Belize',\n  gmt_offset: [-18000, -19800, -21168, -21600]\n};\n\nexport const Berlin: TimeZone = {\n  zone_name: 'Europe/Berlin',\n  gmt_offset: [10800, 7200, 3600, 3208]\n};\n\nexport const Bermuda: TimeZone = {\n  zone_name: 'Atlantic/Bermuda',\n  gmt_offset: [-10800, -11958, -14400, -15558]\n};\n\nexport const Beulah: TimeZone = {\n  zone_name: 'America/North_Dakota/Beulah',\n  gmt_offset: [-18000, -21600, -24427, -25200]\n};\n\nexport const Bishkek: TimeZone = {\n  zone_name: 'Asia/Bishkek',\n  gmt_offset: [25200, 21600, 18000, 17904]\n};\n\nexport const Bissau: TimeZone = {\n  zone_name: 'Africa/Bissau',\n  gmt_offset: [0, -3600, -3740]\n};\n\nexport const Blanc_Sablon: TimeZone = {\n  zone_name: 'America/Blanc-Sablon',\n  gmt_offset: [-10800, -13708, -14400]\n};\n\nexport const Blantyre: TimeZone = {\n  zone_name: 'Africa/Blantyre',\n  gmt_offset: [8470, 8460, 8400, 7200]\n};\n\nexport const Boa_Vista: TimeZone = {\n  zone_name: 'America/Boa_Vista',\n  gmt_offset: [-10800, -14400, -14560]\n};\n\nexport const Bogota: TimeZone = {\n  zone_name: 'America/Bogota',\n  gmt_offset: [-14400, -17776, -18000]\n};\n\nexport const Boise: TimeZone = {\n  zone_name: 'America/Boise',\n  gmt_offset: [-21600, -25200, -27889, -28800]\n};\n\nexport const Bougainville: TimeZone = {\n  zone_name: 'Pacific/Bougainville',\n  gmt_offset: [39600, 37336, 36000, 35312, 32400]\n};\n\nexport const Bratislava: TimeZone = {\n  zone_name: 'Europe/Bratislava',\n  gmt_offset: [7200, 3600, 3464, 0]\n};\n\nexport const Brazzaville: TimeZone = {\n  zone_name: 'Africa/Brazzaville',\n  gmt_offset: [3668, 3600]\n};\n\nexport const Brisbane: TimeZone = {\n  zone_name: 'Australia/Brisbane',\n  gmt_offset: [39600, 36728, 36000]\n};\n\nexport const Broken_Hill: TimeZone = {\n  zone_name: 'Australia/Broken_Hill',\n  gmt_offset: [37800, 36000, 34200, 33948, 32400]\n};\n\nexport const Brunei: TimeZone = {\n  zone_name: 'Asia/Brunei',\n  gmt_offset: [28800, 27580, 27000]\n};\n\nexport const Brussels: TimeZone = {\n  zone_name: 'Europe/Brussels',\n  gmt_offset: [7200, 3600, 1050, 0]\n};\n\nexport const Bucharest: TimeZone = {\n  zone_name: 'Europe/Bucharest',\n  gmt_offset: [10800, 7200, 6264]\n};\n\nexport const Budapest: TimeZone = {\n  zone_name: 'Europe/Budapest',\n  gmt_offset: [7200, 4580, 3600]\n};\n\nexport const Buenos_Aires: TimeZone = {\n  zone_name: 'America/Argentina/Buenos_Aires',\n  gmt_offset: [-7200, -10800, -14028, -14400, -15408]\n};\n\nexport const Bujumbura: TimeZone = {\n  zone_name: 'Africa/Bujumbura',\n  gmt_offset: [7200, 7048]\n};\n\nexport const Busingen: TimeZone = {\n  zone_name: 'Europe/Busingen',\n  gmt_offset: [7200, 3600, 2048, 1786]\n};\n\nexport const Cairo: TimeZone = {\n  zone_name: 'Africa/Cairo',\n  gmt_offset: [10800, 7509, 7200]\n};\n\nexport const Cambridge_Bay: TimeZone = {\n  zone_name: 'America/Cambridge_Bay',\n  gmt_offset: [0, -18000, -21600, -25200]\n};\n\nexport const Campo_Grande: TimeZone = {\n  zone_name: 'America/Campo_Grande',\n  gmt_offset: [-10800, -13108, -14400]\n};\n\nexport const Canary: TimeZone = {\n  zone_name: 'Atlantic/Canary',\n  gmt_offset: [3600, 0, -3600, -3696]\n};\n\nexport const Cancun: TimeZone = {\n  zone_name: 'America/Cancun',\n  gmt_offset: [-14400, -18000, -20824, -21600]\n};\n\nexport const Cape_Verde: TimeZone = {\n  zone_name: 'Atlantic/Cape_Verde',\n  gmt_offset: [-3600, -5644, -7200]\n};\n\nexport const Caracas: TimeZone = {\n  zone_name: 'America/Caracas',\n  gmt_offset: [-14400, -16060, -16064, -16200]\n};\n\nexport const Casablanca: TimeZone = {\n  zone_name: 'Africa/Casablanca',\n  gmt_offset: [3600, 0, -1820]\n};\n\nexport const Casey: TimeZone = {\n  zone_name: 'Antarctica/Casey',\n  gmt_offset: [39600, 28800, 0]\n};\n\nexport const Catamarca: TimeZone = {\n  zone_name: 'America/Argentina/Catamarca',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15788]\n};\n\nexport const Cayenne: TimeZone = {\n  zone_name: 'America/Cayenne',\n  gmt_offset: [-10800, -12560, -14400]\n};\n\nexport const Cayman: TimeZone = {\n  zone_name: 'America/Cayman',\n  gmt_offset: [-18000, -18430, -19532]\n};\n\nexport const Center: TimeZone = {\n  zone_name: 'America/North_Dakota/Center',\n  gmt_offset: [-18000, -21600, -24312, -25200]\n};\n\nexport const Ceuta: TimeZone = {\n  zone_name: 'Africa/Ceuta',\n  gmt_offset: [7200, 3600, 0, -1276]\n};\n\nexport const Chagos: TimeZone = {\n  zone_name: 'Indian/Chagos',\n  gmt_offset: [21600, 18000, 17380]\n};\n\nexport const Chatham: TimeZone = {\n  zone_name: 'Pacific/Chatham',\n  gmt_offset: [49500, 45900, 44100, 44028]\n};\n\nexport const Chicago: TimeZone = {\n  zone_name: 'America/Chicago',\n  gmt_offset: [-18000, -21036, -21600]\n};\n\nexport const Chihuahua: TimeZone = {\n  zone_name: 'America/Chihuahua',\n  gmt_offset: [-18000, -21600, -25200, -25460]\n};\n\nexport const Chisinau: TimeZone = {\n  zone_name: 'Europe/Chisinau',\n  gmt_offset: [14400, 10800, 7200, 6920, 6900, 6264, 3600]\n};\n\nexport const Chita: TimeZone = {\n  zone_name: 'Asia/Chita',\n  gmt_offset: [36000, 32400, 28800, 27232]\n};\n\nexport const Christmas: TimeZone = {\n  zone_name: 'Indian/Christmas',\n  gmt_offset: [25372, 25200]\n};\n\nexport const Chuuk: TimeZone = {\n  zone_name: 'Pacific/Chuuk',\n  gmt_offset: [36428, 36000, 32400, -49972]\n};\n\nexport const Ciudad_Juarez: TimeZone = {\n  zone_name: 'America/Ciudad_Juarez',\n  gmt_offset: [-18000, -21600, -25200, -25556]\n};\n\nexport const Cocos: TimeZone = {\n  zone_name: 'Indian/Cocos',\n  gmt_offset: [23400, 23260]\n};\n\nexport const Colombo: TimeZone = {\n  zone_name: 'Asia/Colombo',\n  gmt_offset: [23400, 21600, 19800, 19172, 19164]\n};\n\nexport const Comoro: TimeZone = {\n  zone_name: 'Indian/Comoro',\n  gmt_offset: [10800, 10384]\n};\n\nexport const Conakry: TimeZone = {\n  zone_name: 'Africa/Conakry',\n  gmt_offset: [0, -3292, -3600]\n};\n\nexport const Copenhagen: TimeZone = {\n  zone_name: 'Europe/Copenhagen',\n  gmt_offset: [7200, 3600, 3020]\n};\n\nexport const Cordoba: TimeZone = {\n  zone_name: 'America/Argentina/Cordoba',\n  gmt_offset: [-7200, -10800, -14400, -15408]\n};\n\nexport const Costa_Rica: TimeZone = {\n  zone_name: 'America/Costa_Rica',\n  gmt_offset: [-18000, -20173, -21600]\n};\n\nexport const Coyhaique: TimeZone = {\n  zone_name: 'America/Coyhaique',\n  gmt_offset: [-10800, -14400, -16965, -17296, -18000]\n};\n\nexport const Creston: TimeZone = {\n  zone_name: 'America/Creston',\n  gmt_offset: [-25200, -27964, -28800]\n};\n\nexport const Cuiaba: TimeZone = {\n  zone_name: 'America/Cuiaba',\n  gmt_offset: [-10800, -13460, -14400]\n};\n\nexport const Curacao: TimeZone = {\n  zone_name: 'America/Curacao',\n  gmt_offset: [-14400, -16200, -16547]\n};\n\nexport const Dakar: TimeZone = {\n  zone_name: 'Africa/Dakar',\n  gmt_offset: [0, -3600, -4184]\n};\n\nexport const Damascus: TimeZone = {\n  zone_name: 'Asia/Damascus',\n  gmt_offset: [10800, 8712, 7200]\n};\n\nexport const Danmarkshavn: TimeZone = {\n  zone_name: 'America/Danmarkshavn',\n  gmt_offset: [0, -4480, -7200, -10800]\n};\n\nexport const Dar_es_Salaam: TimeZone = {\n  zone_name: 'Africa/Dar_es_Salaam',\n  gmt_offset: [10800, 9900, 9428]\n};\n\nexport const Darwin: TimeZone = {\n  zone_name: 'Australia/Darwin',\n  gmt_offset: [37800, 34200, 32400, 31400]\n};\n\nexport const Davis: TimeZone = {\n  zone_name: 'Antarctica/Davis',\n  gmt_offset: [25200, 18000, 0]\n};\n\nexport const Dawson: TimeZone = {\n  zone_name: 'America/Dawson',\n  gmt_offset: [-25200, -28800, -32400, -33460]\n};\n\nexport const Dawson_Creek: TimeZone = {\n  zone_name: 'America/Dawson_Creek',\n  gmt_offset: [-25200, -28800, -28856]\n};\n\nexport const Denver: TimeZone = {\n  zone_name: 'America/Denver',\n  gmt_offset: [-21600, -25196, -25200]\n};\n\nexport const Detroit: TimeZone = {\n  zone_name: 'America/Detroit',\n  gmt_offset: [-14400, -18000, -19931, -21600]\n};\n\nexport const Dhaka: TimeZone = {\n  zone_name: 'Asia/Dhaka',\n  gmt_offset: [25200, 23400, 21700, 21600, 21200, 19800]\n};\n\nexport const Dili: TimeZone = {\n  zone_name: 'Asia/Dili',\n  gmt_offset: [32400, 30140, 28800]\n};\n\nexport const Djibouti: TimeZone = {\n  zone_name: 'Africa/Djibouti',\n  gmt_offset: [10800, 10356]\n};\n\nexport const Dominica: TimeZone = {\n  zone_name: 'America/Dominica',\n  gmt_offset: [-14400, -14736]\n};\n\nexport const Douala: TimeZone = {\n  zone_name: 'Africa/Douala',\n  gmt_offset: [3600, 2328]\n};\n\nexport const Dubai: TimeZone = {\n  zone_name: 'Asia/Dubai',\n  gmt_offset: [14400, 13272]\n};\n\nexport const Dublin: TimeZone = {\n  zone_name: 'Europe/Dublin',\n  gmt_offset: [3600, 2079, 0, -1521]\n};\n\nexport const DumontDUrville: TimeZone = {\n  zone_name: 'Antarctica/DumontDUrville',\n  gmt_offset: [36000, 0]\n};\n\nexport const Dushanbe: TimeZone = {\n  zone_name: 'Asia/Dushanbe',\n  gmt_offset: [25200, 21600, 18000, 16512]\n};\n\nexport const Easter: TimeZone = {\n  zone_name: 'Pacific/Easter',\n  gmt_offset: [-18000, -21600, -25200, -26248]\n};\n\nexport const Edmonton: TimeZone = {\n  zone_name: 'America/Edmonton',\n  gmt_offset: [-21600, -25200, -27232]\n};\n\nexport const Efate: TimeZone = {\n  zone_name: 'Pacific/Efate',\n  gmt_offset: [43200, 40396, 39600]\n};\n\nexport const Eirunepe: TimeZone = {\n  zone_name: 'America/Eirunepe',\n  gmt_offset: [-14400, -16768, -18000]\n};\n\nexport const El_Aaiun: TimeZone = {\n  zone_name: 'Africa/El_Aaiun',\n  gmt_offset: [3600, 0, -3168, -3600]\n};\n\nexport const El_Salvador: TimeZone = {\n  zone_name: 'America/El_Salvador',\n  gmt_offset: [-18000, -21408, -21600]\n};\n\nexport const Eucla: TimeZone = {\n  zone_name: 'Australia/Eucla',\n  gmt_offset: [35100, 31500, 30928]\n};\n\nexport const Fakaofo: TimeZone = {\n  zone_name: 'Pacific/Fakaofo',\n  gmt_offset: [46800, -39600, -41096]\n};\n\nexport const Famagusta: TimeZone = {\n  zone_name: 'Asia/Famagusta',\n  gmt_offset: [10800, 8148, 7200]\n};\n\nexport const Faroe: TimeZone = {\n  zone_name: 'Atlantic/Faroe',\n  gmt_offset: [3600, 0, -1624]\n};\n\nexport const Fiji: TimeZone = {\n  zone_name: 'Pacific/Fiji',\n  gmt_offset: [46800, 43200, 42944]\n};\n\nexport const Fort_Nelson: TimeZone = {\n  zone_name: 'America/Fort_Nelson',\n  gmt_offset: [-25200, -28800, -29447]\n};\n\nexport const Fortaleza: TimeZone = {\n  zone_name: 'America/Fortaleza',\n  gmt_offset: [-7200, -9240, -10800]\n};\n\nexport const Freetown: TimeZone = {\n  zone_name: 'Africa/Freetown',\n  gmt_offset: [0, -2400, -3180, -3600]\n};\n\nexport const Funafuti: TimeZone = {\n  zone_name: 'Pacific/Funafuti',\n  gmt_offset: [43200, 43012]\n};\n\nexport const Gaborone: TimeZone = {\n  zone_name: 'Africa/Gaborone',\n  gmt_offset: [10800, 7200, 6220, 5400]\n};\n\nexport const Galapagos: TimeZone = {\n  zone_name: 'Pacific/Galapagos',\n  gmt_offset: [-18000, -21504, -21600]\n};\n\nexport const Gambier: TimeZone = {\n  zone_name: 'Pacific/Gambier',\n  gmt_offset: [-32388, -32400]\n};\n\nexport const Gaza: TimeZone = {\n  zone_name: 'Asia/Gaza',\n  gmt_offset: [10800, 8272, 7200]\n};\n\nexport const Gibraltar: TimeZone = {\n  zone_name: 'Europe/Gibraltar',\n  gmt_offset: [7200, 3600, 0, -1284]\n};\n\nexport const Glace_Bay: TimeZone = {\n  zone_name: 'America/Glace_Bay',\n  gmt_offset: [-10800, -14388, -14400]\n};\n\nexport const Goose_Bay: TimeZone = {\n  zone_name: 'America/Goose_Bay',\n  gmt_offset: [-7200, -9000, -9052, -10800, -12600, -12652, -14400, -14500]\n};\n\nexport const Grand_Turk: TimeZone = {\n  zone_name: 'America/Grand_Turk',\n  gmt_offset: [-14400, -17072, -18000, -18430]\n};\n\nexport const Grenada: TimeZone = {\n  zone_name: 'America/Grenada',\n  gmt_offset: [-14400, -14820]\n};\n\nexport const Guadalcanal: TimeZone = {\n  zone_name: 'Pacific/Guadalcanal',\n  gmt_offset: [39600, 38388]\n};\n\nexport const Guadeloupe: TimeZone = {\n  zone_name: 'America/Guadeloupe',\n  gmt_offset: [-14400, -14768]\n};\n\nexport const Guam: TimeZone = {\n  zone_name: 'Pacific/Guam',\n  gmt_offset: [39600, 36000, 34740, 32400, -51660]\n};\n\nexport const Guatemala: TimeZone = {\n  zone_name: 'America/Guatemala',\n  gmt_offset: [-18000, -21600, -21724]\n};\n\nexport const Guayaquil: TimeZone = {\n  zone_name: 'America/Guayaquil',\n  gmt_offset: [-14400, -18000, -18840, -19160]\n};\n\nexport const Guernsey: TimeZone = {\n  zone_name: 'Europe/Guernsey',\n  gmt_offset: [7200, 3600, 0, -609]\n};\n\nexport const Guyana: TimeZone = {\n  zone_name: 'America/Guyana',\n  gmt_offset: [-10800, -13500, -13959, -14400]\n};\n\nexport const Halifax: TimeZone = {\n  zone_name: 'America/Halifax',\n  gmt_offset: [-10800, -14400, -15264]\n};\n\nexport const Harare: TimeZone = {\n  zone_name: 'Africa/Harare',\n  gmt_offset: [7452, 7200]\n};\n\nexport const Havana: TimeZone = {\n  zone_name: 'America/Havana',\n  gmt_offset: [-14400, -18000, -19768, -19776]\n};\n\nexport const Hebron: TimeZone = {\n  zone_name: 'Asia/Hebron',\n  gmt_offset: [10800, 8423, 7200]\n};\n\nexport const Helsinki: TimeZone = {\n  zone_name: 'Europe/Helsinki',\n  gmt_offset: [10800, 7200, 5989]\n};\n\nexport const Hermosillo: TimeZone = {\n  zone_name: 'America/Hermosillo',\n  gmt_offset: [-21600, -25200, -26632]\n};\n\nexport const Ho_Chi_Minh: TimeZone = {\n  zone_name: 'Asia/Ho_Chi_Minh',\n  gmt_offset: [32400, 28800, 25590, 25200]\n};\n\nexport const Hobart: TimeZone = {\n  zone_name: 'Australia/Hobart',\n  gmt_offset: [39600, 36000, 35356]\n};\n\nexport const Hong_Kong: TimeZone = {\n  zone_name: 'Asia/Hong_Kong',\n  gmt_offset: [32400, 30600, 28800, 27402]\n};\n\nexport const Honolulu: TimeZone = {\n  zone_name: 'Pacific/Honolulu',\n  gmt_offset: [-34200, -36000, -37800, -37886]\n};\n\nexport const Hovd: TimeZone = {\n  zone_name: 'Asia/Hovd',\n  gmt_offset: [28800, 25200, 21996, 21600]\n};\n\nexport const Indianapolis: TimeZone = {\n  zone_name: 'America/Indiana/Indianapolis',\n  gmt_offset: [-14400, -18000, -20678, -21600]\n};\n\nexport const Inuvik: TimeZone = {\n  zone_name: 'America/Inuvik',\n  gmt_offset: [0, -21600, -25200, -28800]\n};\n\nexport const Iqaluit: TimeZone = {\n  zone_name: 'America/Iqaluit',\n  gmt_offset: [0, -14400, -18000, -21600]\n};\n\nexport const Irkutsk: TimeZone = {\n  zone_name: 'Asia/Irkutsk',\n  gmt_offset: [32400, 28800, 25200, 25025]\n};\n\nexport const Isle_of_Man: TimeZone = {\n  zone_name: 'Europe/Isle_of_Man',\n  gmt_offset: [7200, 3600, 0, -1075]\n};\n\nexport const Istanbul: TimeZone = {\n  zone_name: 'Europe/Istanbul',\n  gmt_offset: [14400, 10800, 7200, 7016, 6952]\n};\n\nexport const Jakarta: TimeZone = {\n  zone_name: 'Asia/Jakarta',\n  gmt_offset: [32400, 28800, 27000, 26400, 25632, 25200]\n};\n\nexport const Jamaica: TimeZone = {\n  zone_name: 'America/Jamaica',\n  gmt_offset: [-14400, -18000, -18430]\n};\n\nexport const Jayapura: TimeZone = {\n  zone_name: 'Asia/Jayapura',\n  gmt_offset: [34200, 33768, 32400]\n};\n\nexport const Jersey: TimeZone = {\n  zone_name: 'Europe/Jersey',\n  gmt_offset: [7200, 3600, 0, -506]\n};\n\nexport const Jerusalem: TimeZone = {\n  zone_name: 'Asia/Jerusalem',\n  gmt_offset: [14400, 10800, 8454, 8440, 7200]\n};\n\nexport const Johannesburg: TimeZone = {\n  zone_name: 'Africa/Johannesburg',\n  gmt_offset: [10800, 7200, 6720, 5400]\n};\n\nexport const Juba: TimeZone = {\n  zone_name: 'Africa/Juba',\n  gmt_offset: [10800, 7588, 7200]\n};\n\nexport const Jujuy: TimeZone = {\n  zone_name: 'America/Argentina/Jujuy',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15672]\n};\n\nexport const Juneau: TimeZone = {\n  zone_name: 'America/Juneau',\n  gmt_offset: [54139, -25200, -28800, -32261, -32400]\n};\n\nexport const Kabul: TimeZone = {\n  zone_name: 'Asia/Kabul',\n  gmt_offset: [16608, 16200, 14400]\n};\n\nexport const Kaliningrad: TimeZone = {\n  zone_name: 'Europe/Kaliningrad',\n  gmt_offset: [14400, 10800, 7200, 4920, 3600]\n};\n\nexport const Kamchatka: TimeZone = {\n  zone_name: 'Asia/Kamchatka',\n  gmt_offset: [46800, 43200, 39600, 38076]\n};\n\nexport const Kampala: TimeZone = {\n  zone_name: 'Africa/Kampala',\n  gmt_offset: [10800, 9900, 9000, 7780]\n};\n\nexport const Kanton: TimeZone = {\n  zone_name: 'Pacific/Kanton',\n  gmt_offset: [46800, 0, -39600, -43200]\n};\n\nexport const Karachi: TimeZone = {\n  zone_name: 'Asia/Karachi',\n  gmt_offset: [23400, 21600, 19800, 18000, 16092]\n};\n\nexport const Kathmandu: TimeZone = {\n  zone_name: 'Asia/Kathmandu',\n  gmt_offset: [20700, 20476, 19800]\n};\n\nexport const Kerguelen: TimeZone = {\n  zone_name: 'Indian/Kerguelen',\n  gmt_offset: [18000, 0]\n};\n\nexport const Khandyga: TimeZone = {\n  zone_name: 'Asia/Khandyga',\n  gmt_offset: [39600, 36000, 32533, 32400, 28800]\n};\n\nexport const Khartoum: TimeZone = {\n  zone_name: 'Africa/Khartoum',\n  gmt_offset: [10800, 7808, 7200]\n};\n\nexport const Kigali: TimeZone = {\n  zone_name: 'Africa/Kigali',\n  gmt_offset: [7216, 7200]\n};\n\nexport const Kinshasa: TimeZone = {\n  zone_name: 'Africa/Kinshasa',\n  gmt_offset: [3672, 3600]\n};\n\nexport const Kiritimati: TimeZone = {\n  zone_name: 'Pacific/Kiritimati',\n  gmt_offset: [50400, -36000, -37760, -38400]\n};\n\nexport const Kirov: TimeZone = {\n  zone_name: 'Europe/Kirov',\n  gmt_offset: [18000, 14400, 11928, 10800]\n};\n\nexport const Knox: TimeZone = {\n  zone_name: 'America/Indiana/Knox',\n  gmt_offset: [-18000, -20790, -21600]\n};\n\nexport const Kolkata: TimeZone = {\n  zone_name: 'Asia/Kolkata',\n  gmt_offset: [23400, 21208, 21200, 19800, 19270]\n};\n\nexport const Kosrae: TimeZone = {\n  zone_name: 'Pacific/Kosrae',\n  gmt_offset: [43200, 39600, 39116, 36000, 32400, -47284]\n};\n\nexport const Kralendijk: TimeZone = {\n  zone_name: 'America/Kralendijk',\n  gmt_offset: [-10800, -14400, -15865]\n};\n\nexport const Krasnoyarsk: TimeZone = {\n  zone_name: 'Asia/Krasnoyarsk',\n  gmt_offset: [28800, 25200, 22286, 21600]\n};\n\nexport const Kuala_Lumpur: TimeZone = {\n  zone_name: 'Asia/Kuala_Lumpur',\n  gmt_offset: [32400, 28800, 27000, 26400, 25200, 24925, 24406]\n};\n\nexport const Kuching: TimeZone = {\n  zone_name: 'Asia/Kuching',\n  gmt_offset: [32400, 30000, 28800, 27000, 26480]\n};\n\nexport const Kuwait: TimeZone = {\n  zone_name: 'Asia/Kuwait',\n  gmt_offset: [11516, 10800]\n};\n\nexport const Kwajalein: TimeZone = {\n  zone_name: 'Pacific/Kwajalein',\n  gmt_offset: [43200, 40160, 39600, 36000, 32400, -43200]\n};\n\nexport const Kyiv: TimeZone = {\n  zone_name: 'Europe/Kyiv',\n  gmt_offset: [14400, 10800, 7324, 7200, 3600]\n};\n\nexport const La_Paz: TimeZone = {\n  zone_name: 'America/La_Paz',\n  gmt_offset: [-12756, -14400, -16356]\n};\n\nexport const La_Rioja: TimeZone = {\n  zone_name: 'America/Argentina/La_Rioja',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16044]\n};\n\nexport const Lagos: TimeZone = {\n  zone_name: 'Africa/Lagos',\n  gmt_offset: [3600, 1800, 815, 0]\n};\n\nexport const Libreville: TimeZone = {\n  zone_name: 'Africa/Libreville',\n  gmt_offset: [3600, 2268]\n};\n\nexport const Lima: TimeZone = {\n  zone_name: 'America/Lima',\n  gmt_offset: [-14400, -18000, -18492, -18516]\n};\n\nexport const Lindeman: TimeZone = {\n  zone_name: 'Australia/Lindeman',\n  gmt_offset: [39600, 36000, 35756]\n};\n\nexport const Lisbon: TimeZone = {\n  zone_name: 'Europe/Lisbon',\n  gmt_offset: [7200, 3600, 0, -2205]\n};\n\nexport const Ljubljana: TimeZone = {\n  zone_name: 'Europe/Ljubljana',\n  gmt_offset: [7200, 3600, 3484]\n};\n\nexport const Lome: TimeZone = {\n  zone_name: 'Africa/Lome',\n  gmt_offset: [292, 0]\n};\n\nexport const London: TimeZone = {\n  zone_name: 'Europe/London',\n  gmt_offset: [7200, 3600, 0, -75]\n};\n\nexport const Longyearbyen: TimeZone = {\n  zone_name: 'Arctic/Longyearbyen',\n  gmt_offset: [10800, 7200, 3600, 3208]\n};\n\nexport const Lord_Howe: TimeZone = {\n  zone_name: 'Australia/Lord_Howe',\n  gmt_offset: [41400, 39600, 38180, 37800, 36000]\n};\n\nexport const Los_Angeles: TimeZone = {\n  zone_name: 'America/Los_Angeles',\n  gmt_offset: [-25200, -28378, -28800]\n};\n\nexport const Louisville: TimeZone = {\n  zone_name: 'America/Kentucky/Louisville',\n  gmt_offset: [-14400, -18000, -20582, -21600]\n};\n\nexport const Lower_Princes: TimeZone = {\n  zone_name: 'America/Lower_Princes',\n  gmt_offset: [-10800, -14400, -15865]\n};\n\nexport const Luanda: TimeZone = {\n  zone_name: 'Africa/Luanda',\n  gmt_offset: [3600, 3176, 3124]\n};\n\nexport const Lubumbashi: TimeZone = {\n  zone_name: 'Africa/Lubumbashi',\n  gmt_offset: [7200, 6592, 3600]\n};\n\nexport const Lusaka: TimeZone = {\n  zone_name: 'Africa/Lusaka',\n  gmt_offset: [7200, 6788]\n};\n\nexport const Luxembourg: TimeZone = {\n  zone_name: 'Europe/Luxembourg',\n  gmt_offset: [7200, 3600, 1476, 0]\n};\n\nexport const Macau: TimeZone = {\n  zone_name: 'Asia/Macau',\n  gmt_offset: [36000, 32400, 28800, 27250]\n};\n\nexport const Maceio: TimeZone = {\n  zone_name: 'America/Maceio',\n  gmt_offset: [-7200, -8572, -10800]\n};\n\nexport const Macquarie: TimeZone = {\n  zone_name: 'Antarctica/Macquarie',\n  gmt_offset: [39600, 36000, 0]\n};\n\nexport const Madeira: TimeZone = {\n  zone_name: 'Atlantic/Madeira',\n  gmt_offset: [3600, 0, -3600, -4056]\n};\n\nexport const Madrid: TimeZone = {\n  zone_name: 'Europe/Madrid',\n  gmt_offset: [7200, 3600, 0, -884]\n};\n\nexport const Magadan: TimeZone = {\n  zone_name: 'Asia/Magadan',\n  gmt_offset: [43200, 39600, 36192, 36000]\n};\n\nexport const Mahe: TimeZone = {\n  zone_name: 'Indian/Mahe',\n  gmt_offset: [14400, 13308]\n};\n\nexport const Majuro: TimeZone = {\n  zone_name: 'Pacific/Majuro',\n  gmt_offset: [43200, 41088, 39600, 36000, 32400]\n};\n\nexport const Makassar: TimeZone = {\n  zone_name: 'Asia/Makassar',\n  gmt_offset: [32400, 28800, 28656]\n};\n\nexport const Malabo: TimeZone = {\n  zone_name: 'Africa/Malabo',\n  gmt_offset: [3600, 2108, 0]\n};\n\nexport const Maldives: TimeZone = {\n  zone_name: 'Indian/Maldives',\n  gmt_offset: [18000, 17640]\n};\n\nexport const Malta: TimeZone = {\n  zone_name: 'Europe/Malta',\n  gmt_offset: [7200, 3600, 3484]\n};\n\nexport const Managua: TimeZone = {\n  zone_name: 'America/Managua',\n  gmt_offset: [-18000, -20708, -20712, -21600]\n};\n\nexport const Manaus: TimeZone = {\n  zone_name: 'America/Manaus',\n  gmt_offset: [-10800, -14400, -14404]\n};\n\nexport const Manila: TimeZone = {\n  zone_name: 'Asia/Manila',\n  gmt_offset: [32400, 29032, 28800, -57368]\n};\n\nexport const Maputo: TimeZone = {\n  zone_name: 'Africa/Maputo',\n  gmt_offset: [7818, 7200]\n};\n\nexport const Marengo: TimeZone = {\n  zone_name: 'America/Indiana/Marengo',\n  gmt_offset: [-14400, -18000, -20723, -21600]\n};\n\nexport const Mariehamn: TimeZone = {\n  zone_name: 'Europe/Mariehamn',\n  gmt_offset: [10800, 7200, 5989]\n};\n\nexport const Marigot: TimeZone = {\n  zone_name: 'America/Marigot',\n  gmt_offset: [-10800, -14400, -15865]\n};\n\nexport const Marquesas: TimeZone = {\n  zone_name: 'Pacific/Marquesas',\n  gmt_offset: [-33480, -34200]\n};\n\nexport const Martinique: TimeZone = {\n  zone_name: 'America/Martinique',\n  gmt_offset: [-10800, -14400, -14660]\n};\n\nexport const Maseru: TimeZone = {\n  zone_name: 'Africa/Maseru',\n  gmt_offset: [10800, 7200, 6600]\n};\n\nexport const Matamoros: TimeZone = {\n  zone_name: 'America/Matamoros',\n  gmt_offset: [-18000, -21600, -23400]\n};\n\nexport const Mauritius: TimeZone = {\n  zone_name: 'Indian/Mauritius',\n  gmt_offset: [18000, 14400, 13800]\n};\n\nexport const Mawson: TimeZone = {\n  zone_name: 'Antarctica/Mawson',\n  gmt_offset: [21600, 18000, 0]\n};\n\nexport const Mayotte: TimeZone = {\n  zone_name: 'Indian/Mayotte',\n  gmt_offset: [10856, 10800]\n};\n\nexport const Mazatlan: TimeZone = {\n  zone_name: 'America/Mazatlan',\n  gmt_offset: [-21600, -25200, -25540]\n};\n\nexport const Mbabane: TimeZone = {\n  zone_name: 'Africa/Mbabane',\n  gmt_offset: [7464, 7200]\n};\n\nexport const McMurdo: TimeZone = {\n  zone_name: 'Antarctica/McMurdo',\n  gmt_offset: [46800, 43200]\n};\n\nexport const Melbourne: TimeZone = {\n  zone_name: 'Australia/Melbourne',\n  gmt_offset: [39600, 36000, 34792]\n};\n\nexport const Mendoza: TimeZone = {\n  zone_name: 'America/Argentina/Mendoza',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16516]\n};\n\nexport const Menominee: TimeZone = {\n  zone_name: 'America/Menominee',\n  gmt_offset: [-18000, -21027, -21600]\n};\n\nexport const Merida: TimeZone = {\n  zone_name: 'America/Merida',\n  gmt_offset: [-18000, -21508, -21600]\n};\n\nexport const Metlakatla: TimeZone = {\n  zone_name: 'America/Metlakatla',\n  gmt_offset: [54822, -25200, -28800, -31578, -32400]\n};\n\nexport const Mexico_City: TimeZone = {\n  zone_name: 'America/Mexico_City',\n  gmt_offset: [-18000, -21600, -23796, -25200]\n};\n\nexport const Midway: TimeZone = {\n  zone_name: 'Pacific/Midway',\n  gmt_offset: [-36000, -39600, -42568]\n};\n\nexport const Minsk: TimeZone = {\n  zone_name: 'Europe/Minsk',\n  gmt_offset: [14400, 10800, 7200, 6616, 6600, 3600]\n};\n\nexport const Miquelon: TimeZone = {\n  zone_name: 'America/Miquelon',\n  gmt_offset: [-7200, -10800, -13480, -14400]\n};\n\nexport const Mogadishu: TimeZone = {\n  zone_name: 'Africa/Mogadishu',\n  gmt_offset: [10888, 10800, 9000]\n};\n\nexport const Monaco: TimeZone = {\n  zone_name: 'Europe/Monaco',\n  gmt_offset: [7200, 3600, 1772, 561, 0]\n};\n\nexport const Moncton: TimeZone = {\n  zone_name: 'America/Moncton',\n  gmt_offset: [-10800, -14400, -15548, -18000]\n};\n\nexport const Monrovia: TimeZone = {\n  zone_name: 'Africa/Monrovia',\n  gmt_offset: [0, -2588, -2670]\n};\n\nexport const Monterrey: TimeZone = {\n  zone_name: 'America/Monterrey',\n  gmt_offset: [-18000, -21600, -24076, -25200]\n};\n\nexport const Montevideo: TimeZone = {\n  zone_name: 'America/Montevideo',\n  gmt_offset: [-5400, -7200, -9000, -10800, -12600, -13491, -14400]\n};\n\nexport const Monticello: TimeZone = {\n  zone_name: 'America/Kentucky/Monticello',\n  gmt_offset: [-14400, -18000, -20364, -21600]\n};\n\nexport const Montserrat: TimeZone = {\n  zone_name: 'America/Montserrat',\n  gmt_offset: [-14400, -14932]\n};\n\nexport const Moscow: TimeZone = {\n  zone_name: 'Europe/Moscow',\n  gmt_offset: [18000, 16279, 14400, 12679, 10800, 9079, 9017, 7200]\n};\n\nexport const Muscat: TimeZone = {\n  zone_name: 'Asia/Muscat',\n  gmt_offset: [14400, 14064]\n};\n\nexport const Nairobi: TimeZone = {\n  zone_name: 'Africa/Nairobi',\n  gmt_offset: [10800, 9900, 9000, 8836]\n};\n\nexport const Nassau: TimeZone = {\n  zone_name: 'America/Nassau',\n  gmt_offset: [-14400, -18000, -18570]\n};\n\nexport const Nauru: TimeZone = {\n  zone_name: 'Pacific/Nauru',\n  gmt_offset: [43200, 41400, 40060, 32400]\n};\n\nexport const Ndjamena: TimeZone = {\n  zone_name: 'Africa/Ndjamena',\n  gmt_offset: [7200, 3612, 3600]\n};\n\nexport const New_Salem: TimeZone = {\n  zone_name: 'America/North_Dakota/New_Salem',\n  gmt_offset: [-18000, -21600, -24339, -25200]\n};\n\nexport const New_York: TimeZone = {\n  zone_name: 'America/New_York',\n  gmt_offset: [-14400, -17762, -18000]\n};\n\nexport const Niamey: TimeZone = {\n  zone_name: 'Africa/Niamey',\n  gmt_offset: [3600, 508, 0, -3600]\n};\n\nexport const Nicosia: TimeZone = {\n  zone_name: 'Asia/Nicosia',\n  gmt_offset: [10800, 8008, 7200]\n};\n\nexport const Niue: TimeZone = {\n  zone_name: 'Pacific/Niue',\n  gmt_offset: [-39600, -40780, -40800]\n};\n\nexport const Nome: TimeZone = {\n  zone_name: 'America/Nome',\n  gmt_offset: [46702, -28800, -32400, -36000, -39600, -39698]\n};\n\nexport const Norfolk: TimeZone = {\n  zone_name: 'Pacific/Norfolk',\n  gmt_offset: [45000, 43200, 41400, 40320, 40312, 39600]\n};\n\nexport const Noronha: TimeZone = {\n  zone_name: 'America/Noronha',\n  gmt_offset: [-3600, -7200, -7780]\n};\n\nexport const Nouakchott: TimeZone = {\n  zone_name: 'Africa/Nouakchott',\n  gmt_offset: [0, -3600, -3828]\n};\n\nexport const Noumea: TimeZone = {\n  zone_name: 'Pacific/Noumea',\n  gmt_offset: [43200, 39948, 39600]\n};\n\nexport const Novokuznetsk: TimeZone = {\n  zone_name: 'Asia/Novokuznetsk',\n  gmt_offset: [28800, 25200, 21600, 20928]\n};\n\nexport const Novosibirsk: TimeZone = {\n  zone_name: 'Asia/Novosibirsk',\n  gmt_offset: [28800, 25200, 21600, 19900]\n};\n\nexport const Nuuk: TimeZone = {\n  zone_name: 'America/Nuuk',\n  gmt_offset: [-3600, -7200, -10800, -12416]\n};\n\nexport const Ojinaga: TimeZone = {\n  zone_name: 'America/Ojinaga',\n  gmt_offset: [-18000, -21600, -25060, -25200]\n};\n\nexport const Omsk: TimeZone = {\n  zone_name: 'Asia/Omsk',\n  gmt_offset: [25200, 21600, 18000, 17610]\n};\n\nexport const Oral: TimeZone = {\n  zone_name: 'Asia/Oral',\n  gmt_offset: [21600, 18000, 14400, 12324, 10800]\n};\n\nexport const Oslo: TimeZone = {\n  zone_name: 'Europe/Oslo',\n  gmt_offset: [7200, 3600, 2580]\n};\n\nexport const Ouagadougou: TimeZone = {\n  zone_name: 'Africa/Ouagadougou',\n  gmt_offset: [0, -364]\n};\n\nexport const Pago_Pago: TimeZone = {\n  zone_name: 'Pacific/Pago_Pago',\n  gmt_offset: [45432, -39600, -40968]\n};\n\nexport const Palau: TimeZone = {\n  zone_name: 'Pacific/Palau',\n  gmt_offset: [32400, 32276, -54124]\n};\n\nexport const Palmer: TimeZone = {\n  zone_name: 'Antarctica/Palmer',\n  gmt_offset: [0, -7200, -10800, -14400]\n};\n\nexport const Panama: TimeZone = {\n  zone_name: 'America/Panama',\n  gmt_offset: [-18000, -19088, -19176]\n};\n\nexport const Paramaribo: TimeZone = {\n  zone_name: 'America/Paramaribo',\n  gmt_offset: [-10800, -12600, -13236, -13240, -13252]\n};\n\nexport const Paris: TimeZone = {\n  zone_name: 'Europe/Paris',\n  gmt_offset: [7200, 3600, 561, 0]\n};\n\nexport const Perth: TimeZone = {\n  zone_name: 'Australia/Perth',\n  gmt_offset: [32400, 28800, 27804]\n};\n\nexport const Petersburg: TimeZone = {\n  zone_name: 'America/Indiana/Petersburg',\n  gmt_offset: [-14400, -18000, -20947, -21600]\n};\n\nexport const Phnom_Penh: TimeZone = {\n  zone_name: 'Asia/Phnom_Penh',\n  gmt_offset: [32400, 28800, 25590, 25200, 25180]\n};\n\nexport const Phoenix: TimeZone = {\n  zone_name: 'America/Phoenix',\n  gmt_offset: [-21600, -25200, -26898]\n};\n\nexport const Pitcairn: TimeZone = {\n  zone_name: 'Pacific/Pitcairn',\n  gmt_offset: [-28800, -30600, -31220]\n};\n\nexport const Podgorica: TimeZone = {\n  zone_name: 'Europe/Podgorica',\n  gmt_offset: [7200, 4920, 3600]\n};\n\nexport const Pohnpei: TimeZone = {\n  zone_name: 'Pacific/Pohnpei',\n  gmt_offset: [39600, 37972, 36000, 32400, -48428]\n};\n\nexport const Pontianak: TimeZone = {\n  zone_name: 'Asia/Pontianak',\n  gmt_offset: [32400, 28800, 27000, 26240, 25200]\n};\n\nexport const Port_Moresby: TimeZone = {\n  zone_name: 'Pacific/Port_Moresby',\n  gmt_offset: [36000, 35320, 35312]\n};\n\nexport const Port_of_Spain: TimeZone = {\n  zone_name: 'America/Port_of_Spain',\n  gmt_offset: [-14400, -14764]\n};\n\nexport const Port_au_Prince: TimeZone = {\n  zone_name: 'America/Port-au-Prince',\n  gmt_offset: [-14400, -17340, -17360, -18000]\n};\n\nexport const Porto_Velho: TimeZone = {\n  zone_name: 'America/Porto_Velho',\n  gmt_offset: [-10800, -14400, -15336]\n};\n\nexport const Porto_Novo: TimeZone = {\n  zone_name: 'Africa/Porto-Novo',\n  gmt_offset: [3600, 628, 0]\n};\n\nexport const Prague: TimeZone = {\n  zone_name: 'Europe/Prague',\n  gmt_offset: [7200, 3600, 3464, 0]\n};\n\nexport const Puerto_Rico: TimeZone = {\n  zone_name: 'America/Puerto_Rico',\n  gmt_offset: [-10800, -14400, -15865]\n};\n\nexport const Punta_Arenas: TimeZone = {\n  zone_name: 'America/Punta_Arenas',\n  gmt_offset: [-10800, -14400, -16965, -17020, -18000]\n};\n\nexport const Pyongyang: TimeZone = {\n  zone_name: 'Asia/Pyongyang',\n  gmt_offset: [32400, 30600, 30180]\n};\n\nexport const Qatar: TimeZone = {\n  zone_name: 'Asia/Qatar',\n  gmt_offset: [14400, 12368, 10800]\n};\n\nexport const Qostanay: TimeZone = {\n  zone_name: 'Asia/Qostanay',\n  gmt_offset: [21600, 18000, 15268, 14400]\n};\n\nexport const Qyzylorda: TimeZone = {\n  zone_name: 'Asia/Qyzylorda',\n  gmt_offset: [21600, 18000, 15712, 14400]\n};\n\nexport const Rankin_Inlet: TimeZone = {\n  zone_name: 'America/Rankin_Inlet',\n  gmt_offset: [0, -18000, -21600]\n};\n\nexport const Rarotonga: TimeZone = {\n  zone_name: 'Pacific/Rarotonga',\n  gmt_offset: [48056, -34200, -36000, -37800, -38344]\n};\n\nexport const Recife: TimeZone = {\n  zone_name: 'America/Recife',\n  gmt_offset: [-7200, -8376, -10800]\n};\n\nexport const Regina: TimeZone = {\n  zone_name: 'America/Regina',\n  gmt_offset: [-21600, -25116, -25200]\n};\n\nexport const Resolute: TimeZone = {\n  zone_name: 'America/Resolute',\n  gmt_offset: [0, -18000, -21600]\n};\n\nexport const Reunion: TimeZone = {\n  zone_name: 'Indian/Reunion',\n  gmt_offset: [14400, 13312]\n};\n\nexport const Reykjavik: TimeZone = {\n  zone_name: 'Atlantic/Reykjavik',\n  gmt_offset: [0, -3600, -5280]\n};\n\nexport const Riga: TimeZone = {\n  zone_name: 'Europe/Riga',\n  gmt_offset: [14400, 10800, 9394, 7200, 5794, 3600]\n};\n\nexport const Rio_Branco: TimeZone = {\n  zone_name: 'America/Rio_Branco',\n  gmt_offset: [-14400, -16272, -18000]\n};\n\nexport const Rio_Gallegos: TimeZone = {\n  zone_name: 'America/Argentina/Rio_Gallegos',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16612]\n};\n\nexport const Riyadh: TimeZone = {\n  zone_name: 'Asia/Riyadh',\n  gmt_offset: [11212, 10800]\n};\n\nexport const Rome: TimeZone = {\n  zone_name: 'Europe/Rome',\n  gmt_offset: [7200, 3600, 2996]\n};\n\nexport const Rothera: TimeZone = {\n  zone_name: 'Antarctica/Rothera',\n  gmt_offset: [0, -10800]\n};\n\nexport const Saipan: TimeZone = {\n  zone_name: 'Pacific/Saipan',\n  gmt_offset: [39600, 36000, 34980, 32400, -51420]\n};\n\nexport const Sakhalin: TimeZone = {\n  zone_name: 'Asia/Sakhalin',\n  gmt_offset: [43200, 39600, 36000, 34248, 32400]\n};\n\nexport const Salta: TimeZone = {\n  zone_name: 'America/Argentina/Salta',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15700]\n};\n\nexport const Samara: TimeZone = {\n  zone_name: 'Europe/Samara',\n  gmt_offset: [18000, 14400, 12020, 10800]\n};\n\nexport const Samarkand: TimeZone = {\n  zone_name: 'Asia/Samarkand',\n  gmt_offset: [21600, 18000, 16073, 14400]\n};\n\nexport const San_Juan: TimeZone = {\n  zone_name: 'America/Argentina/San_Juan',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16444]\n};\n\nexport const San_Luis: TimeZone = {\n  zone_name: 'America/Argentina/San_Luis',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15924]\n};\n\nexport const San_Marino: TimeZone = {\n  zone_name: 'Europe/San_Marino',\n  gmt_offset: [7200, 3600, 2996]\n};\n\nexport const Santarem: TimeZone = {\n  zone_name: 'America/Santarem',\n  gmt_offset: [-10800, -13128, -14400]\n};\n\nexport const Santiago: TimeZone = {\n  zone_name: 'America/Santiago',\n  gmt_offset: [-10800, -14400, -16965, -18000]\n};\n\nexport const Santo_Domingo: TimeZone = {\n  zone_name: 'America/Santo_Domingo',\n  gmt_offset: [-14400, -16200, -16776, -16800, -18000]\n};\n\nexport const Sao_Paulo: TimeZone = {\n  zone_name: 'America/Sao_Paulo',\n  gmt_offset: [-7200, -10800, -11188]\n};\n\nexport const Sao_Tome: TimeZone = {\n  zone_name: 'Africa/Sao_Tome',\n  gmt_offset: [3600, 1616, 0, -2205]\n};\n\nexport const Sarajevo: TimeZone = {\n  zone_name: 'Europe/Sarajevo',\n  gmt_offset: [7200, 4420, 3600]\n};\n\nexport const Saratov: TimeZone = {\n  zone_name: 'Europe/Saratov',\n  gmt_offset: [18000, 14400, 11058, 10800]\n};\n\nexport const Scoresbysund: TimeZone = {\n  zone_name: 'America/Scoresbysund',\n  gmt_offset: [0, -3600, -5272, -7200]\n};\n\nexport const Seoul: TimeZone = {\n  zone_name: 'Asia/Seoul',\n  gmt_offset: [36000, 34200, 32400, 30600, 30472]\n};\n\nexport const Shanghai: TimeZone = {\n  zone_name: 'Asia/Shanghai',\n  gmt_offset: [32400, 29143, 28800]\n};\n\nexport const Simferopol: TimeZone = {\n  zone_name: 'Europe/Simferopol',\n  gmt_offset: [14400, 10800, 8184, 8160, 7200, 3600]\n};\n\nexport const Singapore: TimeZone = {\n  zone_name: 'Asia/Singapore',\n  gmt_offset: [32400, 28800, 27000, 26400, 25200, 24925]\n};\n\nexport const Sitka: TimeZone = {\n  zone_name: 'America/Sitka',\n  gmt_offset: [53927, -25200, -28800, -32400, -32473]\n};\n\nexport const Skopje: TimeZone = {\n  zone_name: 'Europe/Skopje',\n  gmt_offset: [7200, 5144, 3600]\n};\n\nexport const Sofia: TimeZone = {\n  zone_name: 'Europe/Sofia',\n  gmt_offset: [10800, 7200, 7016, 5596, 3600]\n};\n\nexport const South_Georgia: TimeZone = {\n  zone_name: 'Atlantic/South_Georgia',\n  gmt_offset: [-7200, -8768]\n};\n\nexport const Srednekolymsk: TimeZone = {\n  zone_name: 'Asia/Srednekolymsk',\n  gmt_offset: [43200, 39600, 36892, 36000]\n};\n\nexport const St_Barthelemy: TimeZone = {\n  zone_name: 'America/St_Barthelemy',\n  gmt_offset: [-10800, -14400, -15865]\n};\n\nexport const St_Helena: TimeZone = {\n  zone_name: 'Atlantic/St_Helena',\n  gmt_offset: [0, -1368]\n};\n\nexport const St_Johns: TimeZone = {\n  zone_name: 'America/St_Johns',\n  gmt_offset: [-5400, -9000, -9052, -12600, -12652]\n};\n\nexport const St_Kitts: TimeZone = {\n  zone_name: 'America/St_Kitts',\n  gmt_offset: [-14400, -15052]\n};\n\nexport const St_Lucia: TimeZone = {\n  zone_name: 'America/St_Lucia',\n  gmt_offset: [-14400, -14640]\n};\n\nexport const St_Thomas: TimeZone = {\n  zone_name: 'America/St_Thomas',\n  gmt_offset: [-14400, -15584]\n};\n\nexport const St_Vincent: TimeZone = {\n  zone_name: 'America/St_Vincent',\n  gmt_offset: [-14400, -14696]\n};\n\nexport const Stanley: TimeZone = {\n  zone_name: 'Atlantic/Stanley',\n  gmt_offset: [-7200, -10800, -13884, -14400]\n};\n\nexport const Stockholm: TimeZone = {\n  zone_name: 'Europe/Stockholm',\n  gmt_offset: [7200, 4332, 3614, 3600]\n};\n\nexport const Swift_Current: TimeZone = {\n  zone_name: 'America/Swift_Current',\n  gmt_offset: [-21600, -25200, -25880]\n};\n\nexport const Sydney: TimeZone = {\n  zone_name: 'Australia/Sydney',\n  gmt_offset: [39600, 36292, 36000]\n};\n\nexport const Syowa: TimeZone = {\n  zone_name: 'Antarctica/Syowa',\n  gmt_offset: [10800, 0]\n};\n\nexport const Tahiti: TimeZone = {\n  zone_name: 'Pacific/Tahiti',\n  gmt_offset: [-35896, -36000]\n};\n\nexport const Taipei: TimeZone = {\n  zone_name: 'Asia/Taipei',\n  gmt_offset: [32400, 29160, 28800]\n};\n\nexport const Tallinn: TimeZone = {\n  zone_name: 'Europe/Tallinn',\n  gmt_offset: [14400, 10800, 7200, 5940, 3600]\n};\n\nexport const Tarawa: TimeZone = {\n  zone_name: 'Pacific/Tarawa',\n  gmt_offset: [43200, 41524]\n};\n\nexport const Tashkent: TimeZone = {\n  zone_name: 'Asia/Tashkent',\n  gmt_offset: [25200, 21600, 18000, 16631]\n};\n\nexport const Tbilisi: TimeZone = {\n  zone_name: 'Asia/Tbilisi',\n  gmt_offset: [18000, 14400, 10800, 10751]\n};\n\nexport const Tegucigalpa: TimeZone = {\n  zone_name: 'America/Tegucigalpa',\n  gmt_offset: [-18000, -20932, -21600]\n};\n\nexport const Tehran: TimeZone = {\n  zone_name: 'Asia/Tehran',\n  gmt_offset: [18000, 16200, 14400, 12600, 12344]\n};\n\nexport const Tell_City: TimeZone = {\n  zone_name: 'America/Indiana/Tell_City',\n  gmt_offset: [-14400, -18000, -20823, -21600]\n};\n\nexport const Thimphu: TimeZone = {\n  zone_name: 'Asia/Thimphu',\n  gmt_offset: [21600, 21516, 19800]\n};\n\nexport const Thule: TimeZone = {\n  zone_name: 'America/Thule',\n  gmt_offset: [-10800, -14400, -16508]\n};\n\nexport const Tijuana: TimeZone = {\n  zone_name: 'America/Tijuana',\n  gmt_offset: [-25200, -28084, -28800]\n};\n\nexport const Tirane: TimeZone = {\n  zone_name: 'Europe/Tirane',\n  gmt_offset: [7200, 4760, 3600]\n};\n\nexport const Tokyo: TimeZone = {\n  zone_name: 'Asia/Tokyo',\n  gmt_offset: [36000, 33539, 32400]\n};\n\nexport const Tomsk: TimeZone = {\n  zone_name: 'Asia/Tomsk',\n  gmt_offset: [28800, 25200, 21600, 20391]\n};\n\nexport const Tongatapu: TimeZone = {\n  zone_name: 'Pacific/Tongatapu',\n  gmt_offset: [50400, 46800, 44400, 44352]\n};\n\nexport const Toronto: TimeZone = {\n  zone_name: 'America/Toronto',\n  gmt_offset: [-14400, -18000, -19052]\n};\n\nexport const Tortola: TimeZone = {\n  zone_name: 'America/Tortola',\n  gmt_offset: [-14400, -15508]\n};\n\nexport const Tripoli: TimeZone = {\n  zone_name: 'Africa/Tripoli',\n  gmt_offset: [7200, 3600, 3164]\n};\n\nexport const Troll: TimeZone = {\n  zone_name: 'Antarctica/Troll',\n  gmt_offset: [7200, 0]\n};\n\nexport const Tucuman: TimeZone = {\n  zone_name: 'America/Argentina/Tucuman',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15652]\n};\n\nexport const Tunis: TimeZone = {\n  zone_name: 'Africa/Tunis',\n  gmt_offset: [7200, 3600, 2444, 561]\n};\n\nexport const Ulaanbaatar: TimeZone = {\n  zone_name: 'Asia/Ulaanbaatar',\n  gmt_offset: [32400, 28800, 25652, 25200]\n};\n\nexport const Ulyanovsk: TimeZone = {\n  zone_name: 'Europe/Ulyanovsk',\n  gmt_offset: [18000, 14400, 11616, 10800, 7200]\n};\n\nexport const Urumqi: TimeZone = {\n  zone_name: 'Asia/Urumqi',\n  gmt_offset: [21600, 21020]\n};\n\nexport const Ushuaia: TimeZone = {\n  zone_name: 'America/Argentina/Ushuaia',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16392]\n};\n\nexport const Ust_Nera: TimeZone = {\n  zone_name: 'Asia/Ust-Nera',\n  gmt_offset: [43200, 39600, 36000, 34374, 32400, 28800]\n};\n\nexport const Vaduz: TimeZone = {\n  zone_name: 'Europe/Vaduz',\n  gmt_offset: [7200, 3600, 2284]\n};\n\nexport const Vancouver: TimeZone = {\n  zone_name: 'America/Vancouver',\n  gmt_offset: [-25200, -28800, -29548]\n};\n\nexport const Vatican: TimeZone = {\n  zone_name: 'Europe/Vatican',\n  gmt_offset: [7200, 3600, 2996]\n};\n\nexport const Vevay: TimeZone = {\n  zone_name: 'America/Indiana/Vevay',\n  gmt_offset: [-14400, -18000, -20416, -21600]\n};\n\nexport const Vienna: TimeZone = {\n  zone_name: 'Europe/Vienna',\n  gmt_offset: [7200, 3921, 3600]\n};\n\nexport const Vientiane: TimeZone = {\n  zone_name: 'Asia/Vientiane',\n  gmt_offset: [32400, 28800, 25590, 25200, 24624]\n};\n\nexport const Vilnius: TimeZone = {\n  zone_name: 'Europe/Vilnius',\n  gmt_offset: [14400, 10800, 7200, 6076, 5736, 5040, 3600]\n};\n\nexport const Vincennes: TimeZone = {\n  zone_name: 'America/Indiana/Vincennes',\n  gmt_offset: [-14400, -18000, -21007, -21600]\n};\n\nexport const Vladivostok: TimeZone = {\n  zone_name: 'Asia/Vladivostok',\n  gmt_offset: [39600, 36000, 32400, 31651]\n};\n\nexport const Volgograd: TimeZone = {\n  zone_name: 'Europe/Volgograd',\n  gmt_offset: [18000, 14400, 10800, 10660]\n};\n\nexport const Vostok: TimeZone = {\n  zone_name: 'Antarctica/Vostok',\n  gmt_offset: [25200, 18000, 0]\n};\n\nexport const Wake: TimeZone = {\n  zone_name: 'Pacific/Wake',\n  gmt_offset: [43200, 39988]\n};\n\nexport const Wallis: TimeZone = {\n  zone_name: 'Pacific/Wallis',\n  gmt_offset: [44120, 43200]\n};\n\nexport const Warsaw: TimeZone = {\n  zone_name: 'Europe/Warsaw',\n  gmt_offset: [10800, 7200, 5040, 3600]\n};\n\nexport const Whitehorse: TimeZone = {\n  zone_name: 'America/Whitehorse',\n  gmt_offset: [-25200, -28800, -32400, -32412]\n};\n\nexport const Winamac: TimeZone = {\n  zone_name: 'America/Indiana/Winamac',\n  gmt_offset: [-14400, -18000, -20785, -21600]\n};\n\nexport const Windhoek: TimeZone = {\n  zone_name: 'Africa/Windhoek',\n  gmt_offset: [10800, 7200, 5400, 4104, 3600]\n};\n\nexport const Winnipeg: TimeZone = {\n  zone_name: 'America/Winnipeg',\n  gmt_offset: [-18000, -21600, -23316]\n};\n\nexport const Yakutat: TimeZone = {\n  zone_name: 'America/Yakutat',\n  gmt_offset: [52865, -28800, -32400, -33535]\n};\n\nexport const Yakutsk: TimeZone = {\n  zone_name: 'Asia/Yakutsk',\n  gmt_offset: [36000, 32400, 31138, 28800]\n};\n\nexport const Yangon: TimeZone = {\n  zone_name: 'Asia/Yangon',\n  gmt_offset: [32400, 23400, 23087]\n};\n\nexport const Yekaterinburg: TimeZone = {\n  zone_name: 'Asia/Yekaterinburg',\n  gmt_offset: [21600, 18000, 14553, 14400, 13505]\n};\n\nexport const Yerevan: TimeZone = {\n  zone_name: 'Asia/Yerevan',\n  gmt_offset: [18000, 14400, 10800, 10680]\n};\n\nexport const Zagreb: TimeZone = {\n  zone_name: 'Europe/Zagreb',\n  gmt_offset: [7200, 3832, 3600]\n};\n\nexport const Zurich: TimeZone = {\n  zone_name: 'Europe/Zurich',\n  gmt_offset: [7200, 3600, 2048, 1786]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Abidjan.ts",
    "content": "export default {\n  zone_name: 'Africa/Abidjan',\n  gmt_offset: [0, -968]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Accra.ts",
    "content": "export default {\n  zone_name: 'Africa/Accra',\n  gmt_offset: [1800, 1200, 0, -52]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Addis_Ababa.ts",
    "content": "export default {\n  zone_name: 'Africa/Addis_Ababa',\n  gmt_offset: [10800, 9320, 9288]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Algiers.ts",
    "content": "export default {\n  zone_name: 'Africa/Algiers',\n  gmt_offset: [7200, 3600, 732, 561, 0]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Asmara.ts",
    "content": "export default {\n  zone_name: 'Africa/Asmara',\n  gmt_offset: [10800, 9332, 9320]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Bamako.ts",
    "content": "export default {\n  zone_name: 'Africa/Bamako',\n  gmt_offset: [0, -1920, -3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Bangui.ts",
    "content": "export default {\n  zone_name: 'Africa/Bangui',\n  gmt_offset: [4460, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Banjul.ts",
    "content": "export default {\n  zone_name: 'Africa/Banjul',\n  gmt_offset: [0, -3600, -3996]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Bissau.ts",
    "content": "export default {\n  zone_name: 'Africa/Bissau',\n  gmt_offset: [0, -3600, -3740]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Blantyre.ts",
    "content": "export default {\n  zone_name: 'Africa/Blantyre',\n  gmt_offset: [8470, 8460, 8400, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Brazzaville.ts",
    "content": "export default {\n  zone_name: 'Africa/Brazzaville',\n  gmt_offset: [3668, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Bujumbura.ts",
    "content": "export default {\n  zone_name: 'Africa/Bujumbura',\n  gmt_offset: [7200, 7048]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Cairo.ts",
    "content": "export default {\n  zone_name: 'Africa/Cairo',\n  gmt_offset: [10800, 7509, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Casablanca.ts",
    "content": "export default {\n  zone_name: 'Africa/Casablanca',\n  gmt_offset: [3600, 0, -1820]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Ceuta.ts",
    "content": "export default {\n  zone_name: 'Africa/Ceuta',\n  gmt_offset: [7200, 3600, 0, -1276]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Conakry.ts",
    "content": "export default {\n  zone_name: 'Africa/Conakry',\n  gmt_offset: [0, -3292, -3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Dakar.ts",
    "content": "export default {\n  zone_name: 'Africa/Dakar',\n  gmt_offset: [0, -3600, -4184]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Dar_es_Salaam.ts",
    "content": "export default {\n  zone_name: 'Africa/Dar_es_Salaam',\n  gmt_offset: [10800, 9900, 9428]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Djibouti.ts",
    "content": "export default {\n  zone_name: 'Africa/Djibouti',\n  gmt_offset: [10800, 10356]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Douala.ts",
    "content": "export default {\n  zone_name: 'Africa/Douala',\n  gmt_offset: [3600, 2328]\n};\n"
  },
  {
    "path": "src/timezones/Africa/El_Aaiun.ts",
    "content": "export default {\n  zone_name: 'Africa/El_Aaiun',\n  gmt_offset: [3600, 0, -3168, -3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Freetown.ts",
    "content": "export default {\n  zone_name: 'Africa/Freetown',\n  gmt_offset: [0, -2400, -3180, -3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Gaborone.ts",
    "content": "export default {\n  zone_name: 'Africa/Gaborone',\n  gmt_offset: [10800, 7200, 6220, 5400]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Harare.ts",
    "content": "export default {\n  zone_name: 'Africa/Harare',\n  gmt_offset: [7452, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Johannesburg.ts",
    "content": "export default {\n  zone_name: 'Africa/Johannesburg',\n  gmt_offset: [10800, 7200, 6720, 5400]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Juba.ts",
    "content": "export default {\n  zone_name: 'Africa/Juba',\n  gmt_offset: [10800, 7588, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Kampala.ts",
    "content": "export default {\n  zone_name: 'Africa/Kampala',\n  gmt_offset: [10800, 9900, 9000, 7780]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Khartoum.ts",
    "content": "export default {\n  zone_name: 'Africa/Khartoum',\n  gmt_offset: [10800, 7808, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Kigali.ts",
    "content": "export default {\n  zone_name: 'Africa/Kigali',\n  gmt_offset: [7216, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Kinshasa.ts",
    "content": "export default {\n  zone_name: 'Africa/Kinshasa',\n  gmt_offset: [3672, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Lagos.ts",
    "content": "export default {\n  zone_name: 'Africa/Lagos',\n  gmt_offset: [3600, 1800, 815, 0]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Libreville.ts",
    "content": "export default {\n  zone_name: 'Africa/Libreville',\n  gmt_offset: [3600, 2268]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Lome.ts",
    "content": "export default {\n  zone_name: 'Africa/Lome',\n  gmt_offset: [292, 0]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Luanda.ts",
    "content": "export default {\n  zone_name: 'Africa/Luanda',\n  gmt_offset: [3600, 3176, 3124]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Lubumbashi.ts",
    "content": "export default {\n  zone_name: 'Africa/Lubumbashi',\n  gmt_offset: [7200, 6592, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Lusaka.ts",
    "content": "export default {\n  zone_name: 'Africa/Lusaka',\n  gmt_offset: [7200, 6788]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Malabo.ts",
    "content": "export default {\n  zone_name: 'Africa/Malabo',\n  gmt_offset: [3600, 2108, 0]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Maputo.ts",
    "content": "export default {\n  zone_name: 'Africa/Maputo',\n  gmt_offset: [7818, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Maseru.ts",
    "content": "export default {\n  zone_name: 'Africa/Maseru',\n  gmt_offset: [10800, 7200, 6600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Mbabane.ts",
    "content": "export default {\n  zone_name: 'Africa/Mbabane',\n  gmt_offset: [7464, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Mogadishu.ts",
    "content": "export default {\n  zone_name: 'Africa/Mogadishu',\n  gmt_offset: [10888, 10800, 9000]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Monrovia.ts",
    "content": "export default {\n  zone_name: 'Africa/Monrovia',\n  gmt_offset: [0, -2588, -2670]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Nairobi.ts",
    "content": "export default {\n  zone_name: 'Africa/Nairobi',\n  gmt_offset: [10800, 9900, 9000, 8836]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Ndjamena.ts",
    "content": "export default {\n  zone_name: 'Africa/Ndjamena',\n  gmt_offset: [7200, 3612, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Niamey.ts",
    "content": "export default {\n  zone_name: 'Africa/Niamey',\n  gmt_offset: [3600, 508, 0, -3600]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Nouakchott.ts",
    "content": "export default {\n  zone_name: 'Africa/Nouakchott',\n  gmt_offset: [0, -3600, -3828]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Ouagadougou.ts",
    "content": "export default {\n  zone_name: 'Africa/Ouagadougou',\n  gmt_offset: [0, -364]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Porto-Novo.ts",
    "content": "export default {\n  zone_name: 'Africa/Porto-Novo',\n  gmt_offset: [3600, 628, 0]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Sao_Tome.ts",
    "content": "export default {\n  zone_name: 'Africa/Sao_Tome',\n  gmt_offset: [3600, 1616, 0, -2205]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Tripoli.ts",
    "content": "export default {\n  zone_name: 'Africa/Tripoli',\n  gmt_offset: [7200, 3600, 3164]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Tunis.ts",
    "content": "export default {\n  zone_name: 'Africa/Tunis',\n  gmt_offset: [7200, 3600, 2444, 561]\n};\n"
  },
  {
    "path": "src/timezones/Africa/Windhoek.ts",
    "content": "export default {\n  zone_name: 'Africa/Windhoek',\n  gmt_offset: [10800, 7200, 5400, 4104, 3600]\n};\n"
  },
  {
    "path": "src/timezones/America/Adak.ts",
    "content": "export default {\n  zone_name: 'America/Adak',\n  gmt_offset: [44002, -32400, -36000, -39600, -42398]\n};\n"
  },
  {
    "path": "src/timezones/America/Anchorage.ts",
    "content": "export default {\n  zone_name: 'America/Anchorage',\n  gmt_offset: [50424, -28800, -32400, -35976, -36000]\n};\n"
  },
  {
    "path": "src/timezones/America/Anguilla.ts",
    "content": "export default {\n  zone_name: 'America/Anguilla',\n  gmt_offset: [-14400, -15136]\n};\n"
  },
  {
    "path": "src/timezones/America/Antigua.ts",
    "content": "export default {\n  zone_name: 'America/Antigua',\n  gmt_offset: [-14400, -14832, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Araguaina.ts",
    "content": "export default {\n  zone_name: 'America/Araguaina',\n  gmt_offset: [-7200, -10800, -11568]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Buenos_Aires.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Buenos_Aires',\n  gmt_offset: [-7200, -10800, -14028, -14400, -15408]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Catamarca.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Catamarca',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15788]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Cordoba.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Cordoba',\n  gmt_offset: [-7200, -10800, -14400, -15408]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Jujuy.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Jujuy',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15672]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/La_Rioja.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/La_Rioja',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16044]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Mendoza.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Mendoza',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16516]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Rio_Gallegos.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Rio_Gallegos',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16612]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Salta.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Salta',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15700]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/San_Juan.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/San_Juan',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16444]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/San_Luis.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/San_Luis',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15924]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Tucuman.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Tucuman',\n  gmt_offset: [-7200, -10800, -14400, -15408, -15652]\n};\n"
  },
  {
    "path": "src/timezones/America/Argentina/Ushuaia.ts",
    "content": "export default {\n  zone_name: 'America/Argentina/Ushuaia',\n  gmt_offset: [-7200, -10800, -14400, -15408, -16392]\n};\n"
  },
  {
    "path": "src/timezones/America/Aruba.ts",
    "content": "export default {\n  zone_name: 'America/Aruba',\n  gmt_offset: [-14400, -16200, -16824]\n};\n"
  },
  {
    "path": "src/timezones/America/Asuncion.ts",
    "content": "export default {\n  zone_name: 'America/Asuncion',\n  gmt_offset: [-10800, -13840, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Atikokan.ts",
    "content": "export default {\n  zone_name: 'America/Atikokan',\n  gmt_offset: [-18000, -21600, -21988]\n};\n"
  },
  {
    "path": "src/timezones/America/Bahia.ts",
    "content": "export default {\n  zone_name: 'America/Bahia',\n  gmt_offset: [-7200, -9244, -10800]\n};\n"
  },
  {
    "path": "src/timezones/America/Bahia_Banderas.ts",
    "content": "export default {\n  zone_name: 'America/Bahia_Banderas',\n  gmt_offset: [-18000, -21600, -25200, -25260]\n};\n"
  },
  {
    "path": "src/timezones/America/Barbados.ts",
    "content": "export default {\n  zone_name: 'America/Barbados',\n  gmt_offset: [-10800, -12600, -14309, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Belem.ts",
    "content": "export default {\n  zone_name: 'America/Belem',\n  gmt_offset: [-7200, -10800, -11636]\n};\n"
  },
  {
    "path": "src/timezones/America/Belize.ts",
    "content": "export default {\n  zone_name: 'America/Belize',\n  gmt_offset: [-18000, -19800, -21168, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Blanc-Sablon.ts",
    "content": "export default {\n  zone_name: 'America/Blanc-Sablon',\n  gmt_offset: [-10800, -13708, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Boa_Vista.ts",
    "content": "export default {\n  zone_name: 'America/Boa_Vista',\n  gmt_offset: [-10800, -14400, -14560]\n};\n"
  },
  {
    "path": "src/timezones/America/Bogota.ts",
    "content": "export default {\n  zone_name: 'America/Bogota',\n  gmt_offset: [-14400, -17776, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Boise.ts",
    "content": "export default {\n  zone_name: 'America/Boise',\n  gmt_offset: [-21600, -25200, -27889, -28800]\n};\n"
  },
  {
    "path": "src/timezones/America/Cambridge_Bay.ts",
    "content": "export default {\n  zone_name: 'America/Cambridge_Bay',\n  gmt_offset: [0, -18000, -21600, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Campo_Grande.ts",
    "content": "export default {\n  zone_name: 'America/Campo_Grande',\n  gmt_offset: [-10800, -13108, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Cancun.ts",
    "content": "export default {\n  zone_name: 'America/Cancun',\n  gmt_offset: [-14400, -18000, -20824, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Caracas.ts",
    "content": "export default {\n  zone_name: 'America/Caracas',\n  gmt_offset: [-14400, -16060, -16064, -16200]\n};\n"
  },
  {
    "path": "src/timezones/America/Cayenne.ts",
    "content": "export default {\n  zone_name: 'America/Cayenne',\n  gmt_offset: [-10800, -12560, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Cayman.ts",
    "content": "export default {\n  zone_name: 'America/Cayman',\n  gmt_offset: [-18000, -18430, -19532]\n};\n"
  },
  {
    "path": "src/timezones/America/Chicago.ts",
    "content": "export default {\n  zone_name: 'America/Chicago',\n  gmt_offset: [-18000, -21036, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Chihuahua.ts",
    "content": "export default {\n  zone_name: 'America/Chihuahua',\n  gmt_offset: [-18000, -21600, -25200, -25460]\n};\n"
  },
  {
    "path": "src/timezones/America/Ciudad_Juarez.ts",
    "content": "export default {\n  zone_name: 'America/Ciudad_Juarez',\n  gmt_offset: [-18000, -21600, -25200, -25556]\n};\n"
  },
  {
    "path": "src/timezones/America/Costa_Rica.ts",
    "content": "export default {\n  zone_name: 'America/Costa_Rica',\n  gmt_offset: [-18000, -20173, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Coyhaique.ts",
    "content": "export default {\n  zone_name: 'America/Coyhaique',\n  gmt_offset: [-10800, -14400, -16965, -17296, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Creston.ts",
    "content": "export default {\n  zone_name: 'America/Creston',\n  gmt_offset: [-25200, -27964, -28800]\n};\n"
  },
  {
    "path": "src/timezones/America/Cuiaba.ts",
    "content": "export default {\n  zone_name: 'America/Cuiaba',\n  gmt_offset: [-10800, -13460, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Curacao.ts",
    "content": "export default {\n  zone_name: 'America/Curacao',\n  gmt_offset: [-14400, -16200, -16547]\n};\n"
  },
  {
    "path": "src/timezones/America/Danmarkshavn.ts",
    "content": "export default {\n  zone_name: 'America/Danmarkshavn',\n  gmt_offset: [0, -4480, -7200, -10800]\n};\n"
  },
  {
    "path": "src/timezones/America/Dawson.ts",
    "content": "export default {\n  zone_name: 'America/Dawson',\n  gmt_offset: [-25200, -28800, -32400, -33460]\n};\n"
  },
  {
    "path": "src/timezones/America/Dawson_Creek.ts",
    "content": "export default {\n  zone_name: 'America/Dawson_Creek',\n  gmt_offset: [-25200, -28800, -28856]\n};\n"
  },
  {
    "path": "src/timezones/America/Denver.ts",
    "content": "export default {\n  zone_name: 'America/Denver',\n  gmt_offset: [-21600, -25196, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Detroit.ts",
    "content": "export default {\n  zone_name: 'America/Detroit',\n  gmt_offset: [-14400, -18000, -19931, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Dominica.ts",
    "content": "export default {\n  zone_name: 'America/Dominica',\n  gmt_offset: [-14400, -14736]\n};\n"
  },
  {
    "path": "src/timezones/America/Edmonton.ts",
    "content": "export default {\n  zone_name: 'America/Edmonton',\n  gmt_offset: [-21600, -25200, -27232]\n};\n"
  },
  {
    "path": "src/timezones/America/Eirunepe.ts",
    "content": "export default {\n  zone_name: 'America/Eirunepe',\n  gmt_offset: [-14400, -16768, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/El_Salvador.ts",
    "content": "export default {\n  zone_name: 'America/El_Salvador',\n  gmt_offset: [-18000, -21408, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Fort_Nelson.ts",
    "content": "export default {\n  zone_name: 'America/Fort_Nelson',\n  gmt_offset: [-25200, -28800, -29447]\n};\n"
  },
  {
    "path": "src/timezones/America/Fortaleza.ts",
    "content": "export default {\n  zone_name: 'America/Fortaleza',\n  gmt_offset: [-7200, -9240, -10800]\n};\n"
  },
  {
    "path": "src/timezones/America/Glace_Bay.ts",
    "content": "export default {\n  zone_name: 'America/Glace_Bay',\n  gmt_offset: [-10800, -14388, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Goose_Bay.ts",
    "content": "export default {\n  zone_name: 'America/Goose_Bay',\n  gmt_offset: [-7200, -9000, -9052, -10800, -12600, -12652, -14400, -14500]\n};\n"
  },
  {
    "path": "src/timezones/America/Grand_Turk.ts",
    "content": "export default {\n  zone_name: 'America/Grand_Turk',\n  gmt_offset: [-14400, -17072, -18000, -18430]\n};\n"
  },
  {
    "path": "src/timezones/America/Grenada.ts",
    "content": "export default {\n  zone_name: 'America/Grenada',\n  gmt_offset: [-14400, -14820]\n};\n"
  },
  {
    "path": "src/timezones/America/Guadeloupe.ts",
    "content": "export default {\n  zone_name: 'America/Guadeloupe',\n  gmt_offset: [-14400, -14768]\n};\n"
  },
  {
    "path": "src/timezones/America/Guatemala.ts",
    "content": "export default {\n  zone_name: 'America/Guatemala',\n  gmt_offset: [-18000, -21600, -21724]\n};\n"
  },
  {
    "path": "src/timezones/America/Guayaquil.ts",
    "content": "export default {\n  zone_name: 'America/Guayaquil',\n  gmt_offset: [-14400, -18000, -18840, -19160]\n};\n"
  },
  {
    "path": "src/timezones/America/Guyana.ts",
    "content": "export default {\n  zone_name: 'America/Guyana',\n  gmt_offset: [-10800, -13500, -13959, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Halifax.ts",
    "content": "export default {\n  zone_name: 'America/Halifax',\n  gmt_offset: [-10800, -14400, -15264]\n};\n"
  },
  {
    "path": "src/timezones/America/Havana.ts",
    "content": "export default {\n  zone_name: 'America/Havana',\n  gmt_offset: [-14400, -18000, -19768, -19776]\n};\n"
  },
  {
    "path": "src/timezones/America/Hermosillo.ts",
    "content": "export default {\n  zone_name: 'America/Hermosillo',\n  gmt_offset: [-21600, -25200, -26632]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Indianapolis.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Indianapolis',\n  gmt_offset: [-14400, -18000, -20678, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Knox.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Knox',\n  gmt_offset: [-18000, -20790, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Marengo.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Marengo',\n  gmt_offset: [-14400, -18000, -20723, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Petersburg.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Petersburg',\n  gmt_offset: [-14400, -18000, -20947, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Tell_City.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Tell_City',\n  gmt_offset: [-14400, -18000, -20823, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Vevay.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Vevay',\n  gmt_offset: [-14400, -18000, -20416, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Vincennes.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Vincennes',\n  gmt_offset: [-14400, -18000, -21007, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Indiana/Winamac.ts",
    "content": "export default {\n  zone_name: 'America/Indiana/Winamac',\n  gmt_offset: [-14400, -18000, -20785, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Inuvik.ts",
    "content": "export default {\n  zone_name: 'America/Inuvik',\n  gmt_offset: [0, -21600, -25200, -28800]\n};\n"
  },
  {
    "path": "src/timezones/America/Iqaluit.ts",
    "content": "export default {\n  zone_name: 'America/Iqaluit',\n  gmt_offset: [0, -14400, -18000, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Jamaica.ts",
    "content": "export default {\n  zone_name: 'America/Jamaica',\n  gmt_offset: [-14400, -18000, -18430]\n};\n"
  },
  {
    "path": "src/timezones/America/Juneau.ts",
    "content": "export default {\n  zone_name: 'America/Juneau',\n  gmt_offset: [54139, -25200, -28800, -32261, -32400]\n};\n"
  },
  {
    "path": "src/timezones/America/Kentucky/Louisville.ts",
    "content": "export default {\n  zone_name: 'America/Kentucky/Louisville',\n  gmt_offset: [-14400, -18000, -20582, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Kentucky/Monticello.ts",
    "content": "export default {\n  zone_name: 'America/Kentucky/Monticello',\n  gmt_offset: [-14400, -18000, -20364, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Kralendijk.ts",
    "content": "export default {\n  zone_name: 'America/Kralendijk',\n  gmt_offset: [-10800, -14400, -15865]\n};\n"
  },
  {
    "path": "src/timezones/America/La_Paz.ts",
    "content": "export default {\n  zone_name: 'America/La_Paz',\n  gmt_offset: [-12756, -14400, -16356]\n};\n"
  },
  {
    "path": "src/timezones/America/Lima.ts",
    "content": "export default {\n  zone_name: 'America/Lima',\n  gmt_offset: [-14400, -18000, -18492, -18516]\n};\n"
  },
  {
    "path": "src/timezones/America/Los_Angeles.ts",
    "content": "export default {\n  zone_name: 'America/Los_Angeles',\n  gmt_offset: [-25200, -28378, -28800]\n};\n"
  },
  {
    "path": "src/timezones/America/Lower_Princes.ts",
    "content": "export default {\n  zone_name: 'America/Lower_Princes',\n  gmt_offset: [-10800, -14400, -15865]\n};\n"
  },
  {
    "path": "src/timezones/America/Maceio.ts",
    "content": "export default {\n  zone_name: 'America/Maceio',\n  gmt_offset: [-7200, -8572, -10800]\n};\n"
  },
  {
    "path": "src/timezones/America/Managua.ts",
    "content": "export default {\n  zone_name: 'America/Managua',\n  gmt_offset: [-18000, -20708, -20712, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Manaus.ts",
    "content": "export default {\n  zone_name: 'America/Manaus',\n  gmt_offset: [-10800, -14400, -14404]\n};\n"
  },
  {
    "path": "src/timezones/America/Marigot.ts",
    "content": "export default {\n  zone_name: 'America/Marigot',\n  gmt_offset: [-10800, -14400, -15865]\n};\n"
  },
  {
    "path": "src/timezones/America/Martinique.ts",
    "content": "export default {\n  zone_name: 'America/Martinique',\n  gmt_offset: [-10800, -14400, -14660]\n};\n"
  },
  {
    "path": "src/timezones/America/Matamoros.ts",
    "content": "export default {\n  zone_name: 'America/Matamoros',\n  gmt_offset: [-18000, -21600, -23400]\n};\n"
  },
  {
    "path": "src/timezones/America/Mazatlan.ts",
    "content": "export default {\n  zone_name: 'America/Mazatlan',\n  gmt_offset: [-21600, -25200, -25540]\n};\n"
  },
  {
    "path": "src/timezones/America/Menominee.ts",
    "content": "export default {\n  zone_name: 'America/Menominee',\n  gmt_offset: [-18000, -21027, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Merida.ts",
    "content": "export default {\n  zone_name: 'America/Merida',\n  gmt_offset: [-18000, -21508, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Metlakatla.ts",
    "content": "export default {\n  zone_name: 'America/Metlakatla',\n  gmt_offset: [54822, -25200, -28800, -31578, -32400]\n};\n"
  },
  {
    "path": "src/timezones/America/Mexico_City.ts",
    "content": "export default {\n  zone_name: 'America/Mexico_City',\n  gmt_offset: [-18000, -21600, -23796, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Miquelon.ts",
    "content": "export default {\n  zone_name: 'America/Miquelon',\n  gmt_offset: [-7200, -10800, -13480, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Moncton.ts",
    "content": "export default {\n  zone_name: 'America/Moncton',\n  gmt_offset: [-10800, -14400, -15548, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Monterrey.ts",
    "content": "export default {\n  zone_name: 'America/Monterrey',\n  gmt_offset: [-18000, -21600, -24076, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Montevideo.ts",
    "content": "export default {\n  zone_name: 'America/Montevideo',\n  gmt_offset: [-5400, -7200, -9000, -10800, -12600, -13491, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Montserrat.ts",
    "content": "export default {\n  zone_name: 'America/Montserrat',\n  gmt_offset: [-14400, -14932]\n};\n"
  },
  {
    "path": "src/timezones/America/Nassau.ts",
    "content": "export default {\n  zone_name: 'America/Nassau',\n  gmt_offset: [-14400, -18000, -18570]\n};\n"
  },
  {
    "path": "src/timezones/America/New_York.ts",
    "content": "export default {\n  zone_name: 'America/New_York',\n  gmt_offset: [-14400, -17762, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Nome.ts",
    "content": "export default {\n  zone_name: 'America/Nome',\n  gmt_offset: [46702, -28800, -32400, -36000, -39600, -39698]\n};\n"
  },
  {
    "path": "src/timezones/America/Noronha.ts",
    "content": "export default {\n  zone_name: 'America/Noronha',\n  gmt_offset: [-3600, -7200, -7780]\n};\n"
  },
  {
    "path": "src/timezones/America/North_Dakota/Beulah.ts",
    "content": "export default {\n  zone_name: 'America/North_Dakota/Beulah',\n  gmt_offset: [-18000, -21600, -24427, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/North_Dakota/Center.ts",
    "content": "export default {\n  zone_name: 'America/North_Dakota/Center',\n  gmt_offset: [-18000, -21600, -24312, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/North_Dakota/New_Salem.ts",
    "content": "export default {\n  zone_name: 'America/North_Dakota/New_Salem',\n  gmt_offset: [-18000, -21600, -24339, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Nuuk.ts",
    "content": "export default {\n  zone_name: 'America/Nuuk',\n  gmt_offset: [-3600, -7200, -10800, -12416]\n};\n"
  },
  {
    "path": "src/timezones/America/Ojinaga.ts",
    "content": "export default {\n  zone_name: 'America/Ojinaga',\n  gmt_offset: [-18000, -21600, -25060, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Panama.ts",
    "content": "export default {\n  zone_name: 'America/Panama',\n  gmt_offset: [-18000, -19088, -19176]\n};\n"
  },
  {
    "path": "src/timezones/America/Paramaribo.ts",
    "content": "export default {\n  zone_name: 'America/Paramaribo',\n  gmt_offset: [-10800, -12600, -13236, -13240, -13252]\n};\n"
  },
  {
    "path": "src/timezones/America/Phoenix.ts",
    "content": "export default {\n  zone_name: 'America/Phoenix',\n  gmt_offset: [-21600, -25200, -26898]\n};\n"
  },
  {
    "path": "src/timezones/America/Port-au-Prince.ts",
    "content": "export default {\n  zone_name: 'America/Port-au-Prince',\n  gmt_offset: [-14400, -17340, -17360, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Port_of_Spain.ts",
    "content": "export default {\n  zone_name: 'America/Port_of_Spain',\n  gmt_offset: [-14400, -14764]\n};\n"
  },
  {
    "path": "src/timezones/America/Porto_Velho.ts",
    "content": "export default {\n  zone_name: 'America/Porto_Velho',\n  gmt_offset: [-10800, -14400, -15336]\n};\n"
  },
  {
    "path": "src/timezones/America/Puerto_Rico.ts",
    "content": "export default {\n  zone_name: 'America/Puerto_Rico',\n  gmt_offset: [-10800, -14400, -15865]\n};\n"
  },
  {
    "path": "src/timezones/America/Punta_Arenas.ts",
    "content": "export default {\n  zone_name: 'America/Punta_Arenas',\n  gmt_offset: [-10800, -14400, -16965, -17020, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Rankin_Inlet.ts",
    "content": "export default {\n  zone_name: 'America/Rankin_Inlet',\n  gmt_offset: [0, -18000, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Recife.ts",
    "content": "export default {\n  zone_name: 'America/Recife',\n  gmt_offset: [-7200, -8376, -10800]\n};\n"
  },
  {
    "path": "src/timezones/America/Regina.ts",
    "content": "export default {\n  zone_name: 'America/Regina',\n  gmt_offset: [-21600, -25116, -25200]\n};\n"
  },
  {
    "path": "src/timezones/America/Resolute.ts",
    "content": "export default {\n  zone_name: 'America/Resolute',\n  gmt_offset: [0, -18000, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Rio_Branco.ts",
    "content": "export default {\n  zone_name: 'America/Rio_Branco',\n  gmt_offset: [-14400, -16272, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Santarem.ts",
    "content": "export default {\n  zone_name: 'America/Santarem',\n  gmt_offset: [-10800, -13128, -14400]\n};\n"
  },
  {
    "path": "src/timezones/America/Santiago.ts",
    "content": "export default {\n  zone_name: 'America/Santiago',\n  gmt_offset: [-10800, -14400, -16965, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Santo_Domingo.ts",
    "content": "export default {\n  zone_name: 'America/Santo_Domingo',\n  gmt_offset: [-14400, -16200, -16776, -16800, -18000]\n};\n"
  },
  {
    "path": "src/timezones/America/Sao_Paulo.ts",
    "content": "export default {\n  zone_name: 'America/Sao_Paulo',\n  gmt_offset: [-7200, -10800, -11188]\n};\n"
  },
  {
    "path": "src/timezones/America/Scoresbysund.ts",
    "content": "export default {\n  zone_name: 'America/Scoresbysund',\n  gmt_offset: [0, -3600, -5272, -7200]\n};\n"
  },
  {
    "path": "src/timezones/America/Sitka.ts",
    "content": "export default {\n  zone_name: 'America/Sitka',\n  gmt_offset: [53927, -25200, -28800, -32400, -32473]\n};\n"
  },
  {
    "path": "src/timezones/America/St_Barthelemy.ts",
    "content": "export default {\n  zone_name: 'America/St_Barthelemy',\n  gmt_offset: [-10800, -14400, -15865]\n};\n"
  },
  {
    "path": "src/timezones/America/St_Johns.ts",
    "content": "export default {\n  zone_name: 'America/St_Johns',\n  gmt_offset: [-5400, -9000, -9052, -12600, -12652]\n};\n"
  },
  {
    "path": "src/timezones/America/St_Kitts.ts",
    "content": "export default {\n  zone_name: 'America/St_Kitts',\n  gmt_offset: [-14400, -15052]\n};\n"
  },
  {
    "path": "src/timezones/America/St_Lucia.ts",
    "content": "export default {\n  zone_name: 'America/St_Lucia',\n  gmt_offset: [-14400, -14640]\n};\n"
  },
  {
    "path": "src/timezones/America/St_Thomas.ts",
    "content": "export default {\n  zone_name: 'America/St_Thomas',\n  gmt_offset: [-14400, -15584]\n};\n"
  },
  {
    "path": "src/timezones/America/St_Vincent.ts",
    "content": "export default {\n  zone_name: 'America/St_Vincent',\n  gmt_offset: [-14400, -14696]\n};\n"
  },
  {
    "path": "src/timezones/America/Swift_Current.ts",
    "content": "export default {\n  zone_name: 'America/Swift_Current',\n  gmt_offset: [-21600, -25200, -25880]\n};\n"
  },
  {
    "path": "src/timezones/America/Tegucigalpa.ts",
    "content": "export default {\n  zone_name: 'America/Tegucigalpa',\n  gmt_offset: [-18000, -20932, -21600]\n};\n"
  },
  {
    "path": "src/timezones/America/Thule.ts",
    "content": "export default {\n  zone_name: 'America/Thule',\n  gmt_offset: [-10800, -14400, -16508]\n};\n"
  },
  {
    "path": "src/timezones/America/Tijuana.ts",
    "content": "export default {\n  zone_name: 'America/Tijuana',\n  gmt_offset: [-25200, -28084, -28800]\n};\n"
  },
  {
    "path": "src/timezones/America/Toronto.ts",
    "content": "export default {\n  zone_name: 'America/Toronto',\n  gmt_offset: [-14400, -18000, -19052]\n};\n"
  },
  {
    "path": "src/timezones/America/Tortola.ts",
    "content": "export default {\n  zone_name: 'America/Tortola',\n  gmt_offset: [-14400, -15508]\n};\n"
  },
  {
    "path": "src/timezones/America/Vancouver.ts",
    "content": "export default {\n  zone_name: 'America/Vancouver',\n  gmt_offset: [-25200, -28800, -29548]\n};\n"
  },
  {
    "path": "src/timezones/America/Whitehorse.ts",
    "content": "export default {\n  zone_name: 'America/Whitehorse',\n  gmt_offset: [-25200, -28800, -32400, -32412]\n};\n"
  },
  {
    "path": "src/timezones/America/Winnipeg.ts",
    "content": "export default {\n  zone_name: 'America/Winnipeg',\n  gmt_offset: [-18000, -21600, -23316]\n};\n"
  },
  {
    "path": "src/timezones/America/Yakutat.ts",
    "content": "export default {\n  zone_name: 'America/Yakutat',\n  gmt_offset: [52865, -28800, -32400, -33535]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Casey.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Casey',\n  gmt_offset: [39600, 28800, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Davis.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Davis',\n  gmt_offset: [25200, 18000, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/DumontDUrville.ts",
    "content": "export default {\n  zone_name: 'Antarctica/DumontDUrville',\n  gmt_offset: [36000, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Macquarie.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Macquarie',\n  gmt_offset: [39600, 36000, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Mawson.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Mawson',\n  gmt_offset: [21600, 18000, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/McMurdo.ts",
    "content": "export default {\n  zone_name: 'Antarctica/McMurdo',\n  gmt_offset: [46800, 43200]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Palmer.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Palmer',\n  gmt_offset: [0, -7200, -10800, -14400]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Rothera.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Rothera',\n  gmt_offset: [0, -10800]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Syowa.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Syowa',\n  gmt_offset: [10800, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Troll.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Troll',\n  gmt_offset: [7200, 0]\n};\n"
  },
  {
    "path": "src/timezones/Antarctica/Vostok.ts",
    "content": "export default {\n  zone_name: 'Antarctica/Vostok',\n  gmt_offset: [25200, 18000, 0]\n};\n"
  },
  {
    "path": "src/timezones/Arctic/Longyearbyen.ts",
    "content": "export default {\n  zone_name: 'Arctic/Longyearbyen',\n  gmt_offset: [10800, 7200, 3600, 3208]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Aden.ts",
    "content": "export default {\n  zone_name: 'Asia/Aden',\n  gmt_offset: [10800, 10794]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Almaty.ts",
    "content": "export default {\n  zone_name: 'Asia/Almaty',\n  gmt_offset: [25200, 21600, 18468, 18000]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Amman.ts",
    "content": "export default {\n  zone_name: 'Asia/Amman',\n  gmt_offset: [10800, 8624, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Anadyr.ts",
    "content": "export default {\n  zone_name: 'Asia/Anadyr',\n  gmt_offset: [50400, 46800, 43200, 42596, 39600]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Aqtau.ts",
    "content": "export default {\n  zone_name: 'Asia/Aqtau',\n  gmt_offset: [21600, 18000, 14400, 12064]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Aqtobe.ts",
    "content": "export default {\n  zone_name: 'Asia/Aqtobe',\n  gmt_offset: [21600, 18000, 14400, 13720]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Ashgabat.ts",
    "content": "export default {\n  zone_name: 'Asia/Ashgabat',\n  gmt_offset: [21600, 18000, 14400, 14012]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Atyrau.ts",
    "content": "export default {\n  zone_name: 'Asia/Atyrau',\n  gmt_offset: [21600, 18000, 14400, 12464, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Baghdad.ts",
    "content": "export default {\n  zone_name: 'Asia/Baghdad',\n  gmt_offset: [14400, 10800, 10660, 10656]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Bahrain.ts",
    "content": "export default {\n  zone_name: 'Asia/Bahrain',\n  gmt_offset: [14400, 12600, 12140, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Baku.ts",
    "content": "export default {\n  zone_name: 'Asia/Baku',\n  gmt_offset: [18000, 14400, 11964, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Bangkok.ts",
    "content": "export default {\n  zone_name: 'Asia/Bangkok',\n  gmt_offset: [25200, 24124]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Barnaul.ts",
    "content": "export default {\n  zone_name: 'Asia/Barnaul',\n  gmt_offset: [28800, 25200, 21600, 20100]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Beirut.ts",
    "content": "export default {\n  zone_name: 'Asia/Beirut',\n  gmt_offset: [10800, 8520, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Bishkek.ts",
    "content": "export default {\n  zone_name: 'Asia/Bishkek',\n  gmt_offset: [25200, 21600, 18000, 17904]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Brunei.ts",
    "content": "export default {\n  zone_name: 'Asia/Brunei',\n  gmt_offset: [28800, 27580, 27000]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Chita.ts",
    "content": "export default {\n  zone_name: 'Asia/Chita',\n  gmt_offset: [36000, 32400, 28800, 27232]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Colombo.ts",
    "content": "export default {\n  zone_name: 'Asia/Colombo',\n  gmt_offset: [23400, 21600, 19800, 19172, 19164]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Damascus.ts",
    "content": "export default {\n  zone_name: 'Asia/Damascus',\n  gmt_offset: [10800, 8712, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Dhaka.ts",
    "content": "export default {\n  zone_name: 'Asia/Dhaka',\n  gmt_offset: [25200, 23400, 21700, 21600, 21200, 19800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Dili.ts",
    "content": "export default {\n  zone_name: 'Asia/Dili',\n  gmt_offset: [32400, 30140, 28800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Dubai.ts",
    "content": "export default {\n  zone_name: 'Asia/Dubai',\n  gmt_offset: [14400, 13272]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Dushanbe.ts",
    "content": "export default {\n  zone_name: 'Asia/Dushanbe',\n  gmt_offset: [25200, 21600, 18000, 16512]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Famagusta.ts",
    "content": "export default {\n  zone_name: 'Asia/Famagusta',\n  gmt_offset: [10800, 8148, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Gaza.ts",
    "content": "export default {\n  zone_name: 'Asia/Gaza',\n  gmt_offset: [10800, 8272, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Hebron.ts",
    "content": "export default {\n  zone_name: 'Asia/Hebron',\n  gmt_offset: [10800, 8423, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Ho_Chi_Minh.ts",
    "content": "export default {\n  zone_name: 'Asia/Ho_Chi_Minh',\n  gmt_offset: [32400, 28800, 25590, 25200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Hong_Kong.ts",
    "content": "export default {\n  zone_name: 'Asia/Hong_Kong',\n  gmt_offset: [32400, 30600, 28800, 27402]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Hovd.ts",
    "content": "export default {\n  zone_name: 'Asia/Hovd',\n  gmt_offset: [28800, 25200, 21996, 21600]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Irkutsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Irkutsk',\n  gmt_offset: [32400, 28800, 25200, 25025]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Jakarta.ts",
    "content": "export default {\n  zone_name: 'Asia/Jakarta',\n  gmt_offset: [32400, 28800, 27000, 26400, 25632, 25200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Jayapura.ts",
    "content": "export default {\n  zone_name: 'Asia/Jayapura',\n  gmt_offset: [34200, 33768, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Jerusalem.ts",
    "content": "export default {\n  zone_name: 'Asia/Jerusalem',\n  gmt_offset: [14400, 10800, 8454, 8440, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kabul.ts",
    "content": "export default {\n  zone_name: 'Asia/Kabul',\n  gmt_offset: [16608, 16200, 14400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kamchatka.ts",
    "content": "export default {\n  zone_name: 'Asia/Kamchatka',\n  gmt_offset: [46800, 43200, 39600, 38076]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Karachi.ts",
    "content": "export default {\n  zone_name: 'Asia/Karachi',\n  gmt_offset: [23400, 21600, 19800, 18000, 16092]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kathmandu.ts",
    "content": "export default {\n  zone_name: 'Asia/Kathmandu',\n  gmt_offset: [20700, 20476, 19800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Khandyga.ts",
    "content": "export default {\n  zone_name: 'Asia/Khandyga',\n  gmt_offset: [39600, 36000, 32533, 32400, 28800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kolkata.ts",
    "content": "export default {\n  zone_name: 'Asia/Kolkata',\n  gmt_offset: [23400, 21208, 21200, 19800, 19270]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Krasnoyarsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Krasnoyarsk',\n  gmt_offset: [28800, 25200, 22286, 21600]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kuala_Lumpur.ts",
    "content": "export default {\n  zone_name: 'Asia/Kuala_Lumpur',\n  gmt_offset: [32400, 28800, 27000, 26400, 25200, 24925, 24406]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kuching.ts",
    "content": "export default {\n  zone_name: 'Asia/Kuching',\n  gmt_offset: [32400, 30000, 28800, 27000, 26480]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Kuwait.ts",
    "content": "export default {\n  zone_name: 'Asia/Kuwait',\n  gmt_offset: [11516, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Macau.ts",
    "content": "export default {\n  zone_name: 'Asia/Macau',\n  gmt_offset: [36000, 32400, 28800, 27250]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Magadan.ts",
    "content": "export default {\n  zone_name: 'Asia/Magadan',\n  gmt_offset: [43200, 39600, 36192, 36000]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Makassar.ts",
    "content": "export default {\n  zone_name: 'Asia/Makassar',\n  gmt_offset: [32400, 28800, 28656]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Manila.ts",
    "content": "export default {\n  zone_name: 'Asia/Manila',\n  gmt_offset: [32400, 29032, 28800, -57368]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Muscat.ts",
    "content": "export default {\n  zone_name: 'Asia/Muscat',\n  gmt_offset: [14400, 14064]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Nicosia.ts",
    "content": "export default {\n  zone_name: 'Asia/Nicosia',\n  gmt_offset: [10800, 8008, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Novokuznetsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Novokuznetsk',\n  gmt_offset: [28800, 25200, 21600, 20928]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Novosibirsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Novosibirsk',\n  gmt_offset: [28800, 25200, 21600, 19900]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Omsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Omsk',\n  gmt_offset: [25200, 21600, 18000, 17610]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Oral.ts",
    "content": "export default {\n  zone_name: 'Asia/Oral',\n  gmt_offset: [21600, 18000, 14400, 12324, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Phnom_Penh.ts",
    "content": "export default {\n  zone_name: 'Asia/Phnom_Penh',\n  gmt_offset: [32400, 28800, 25590, 25200, 25180]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Pontianak.ts",
    "content": "export default {\n  zone_name: 'Asia/Pontianak',\n  gmt_offset: [32400, 28800, 27000, 26240, 25200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Pyongyang.ts",
    "content": "export default {\n  zone_name: 'Asia/Pyongyang',\n  gmt_offset: [32400, 30600, 30180]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Qatar.ts",
    "content": "export default {\n  zone_name: 'Asia/Qatar',\n  gmt_offset: [14400, 12368, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Qostanay.ts",
    "content": "export default {\n  zone_name: 'Asia/Qostanay',\n  gmt_offset: [21600, 18000, 15268, 14400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Qyzylorda.ts",
    "content": "export default {\n  zone_name: 'Asia/Qyzylorda',\n  gmt_offset: [21600, 18000, 15712, 14400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Riyadh.ts",
    "content": "export default {\n  zone_name: 'Asia/Riyadh',\n  gmt_offset: [11212, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Sakhalin.ts",
    "content": "export default {\n  zone_name: 'Asia/Sakhalin',\n  gmt_offset: [43200, 39600, 36000, 34248, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Samarkand.ts",
    "content": "export default {\n  zone_name: 'Asia/Samarkand',\n  gmt_offset: [21600, 18000, 16073, 14400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Seoul.ts",
    "content": "export default {\n  zone_name: 'Asia/Seoul',\n  gmt_offset: [36000, 34200, 32400, 30600, 30472]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Shanghai.ts",
    "content": "export default {\n  zone_name: 'Asia/Shanghai',\n  gmt_offset: [32400, 29143, 28800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Singapore.ts",
    "content": "export default {\n  zone_name: 'Asia/Singapore',\n  gmt_offset: [32400, 28800, 27000, 26400, 25200, 24925]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Srednekolymsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Srednekolymsk',\n  gmt_offset: [43200, 39600, 36892, 36000]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Taipei.ts",
    "content": "export default {\n  zone_name: 'Asia/Taipei',\n  gmt_offset: [32400, 29160, 28800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Tashkent.ts",
    "content": "export default {\n  zone_name: 'Asia/Tashkent',\n  gmt_offset: [25200, 21600, 18000, 16631]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Tbilisi.ts",
    "content": "export default {\n  zone_name: 'Asia/Tbilisi',\n  gmt_offset: [18000, 14400, 10800, 10751]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Tehran.ts",
    "content": "export default {\n  zone_name: 'Asia/Tehran',\n  gmt_offset: [18000, 16200, 14400, 12600, 12344]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Thimphu.ts",
    "content": "export default {\n  zone_name: 'Asia/Thimphu',\n  gmt_offset: [21600, 21516, 19800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Tokyo.ts",
    "content": "export default {\n  zone_name: 'Asia/Tokyo',\n  gmt_offset: [36000, 33539, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Tomsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Tomsk',\n  gmt_offset: [28800, 25200, 21600, 20391]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Ulaanbaatar.ts",
    "content": "export default {\n  zone_name: 'Asia/Ulaanbaatar',\n  gmt_offset: [32400, 28800, 25652, 25200]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Urumqi.ts",
    "content": "export default {\n  zone_name: 'Asia/Urumqi',\n  gmt_offset: [21600, 21020]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Ust-Nera.ts",
    "content": "export default {\n  zone_name: 'Asia/Ust-Nera',\n  gmt_offset: [43200, 39600, 36000, 34374, 32400, 28800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Vientiane.ts",
    "content": "export default {\n  zone_name: 'Asia/Vientiane',\n  gmt_offset: [32400, 28800, 25590, 25200, 24624]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Vladivostok.ts",
    "content": "export default {\n  zone_name: 'Asia/Vladivostok',\n  gmt_offset: [39600, 36000, 32400, 31651]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Yakutsk.ts",
    "content": "export default {\n  zone_name: 'Asia/Yakutsk',\n  gmt_offset: [36000, 32400, 31138, 28800]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Yangon.ts",
    "content": "export default {\n  zone_name: 'Asia/Yangon',\n  gmt_offset: [32400, 23400, 23087]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Yekaterinburg.ts",
    "content": "export default {\n  zone_name: 'Asia/Yekaterinburg',\n  gmt_offset: [21600, 18000, 14553, 14400, 13505]\n};\n"
  },
  {
    "path": "src/timezones/Asia/Yerevan.ts",
    "content": "export default {\n  zone_name: 'Asia/Yerevan',\n  gmt_offset: [18000, 14400, 10800, 10680]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Azores.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Azores',\n  gmt_offset: [3600, 0, -3600, -6160, -6872, -7200]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Bermuda.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Bermuda',\n  gmt_offset: [-10800, -11958, -14400, -15558]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Canary.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Canary',\n  gmt_offset: [3600, 0, -3600, -3696]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Cape_Verde.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Cape_Verde',\n  gmt_offset: [-3600, -5644, -7200]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Faroe.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Faroe',\n  gmt_offset: [3600, 0, -1624]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Madeira.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Madeira',\n  gmt_offset: [3600, 0, -3600, -4056]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Reykjavik.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Reykjavik',\n  gmt_offset: [0, -3600, -5280]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/South_Georgia.ts",
    "content": "export default {\n  zone_name: 'Atlantic/South_Georgia',\n  gmt_offset: [-7200, -8768]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/St_Helena.ts",
    "content": "export default {\n  zone_name: 'Atlantic/St_Helena',\n  gmt_offset: [0, -1368]\n};\n"
  },
  {
    "path": "src/timezones/Atlantic/Stanley.ts",
    "content": "export default {\n  zone_name: 'Atlantic/Stanley',\n  gmt_offset: [-7200, -10800, -13884, -14400]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Adelaide.ts",
    "content": "export default {\n  zone_name: 'Australia/Adelaide',\n  gmt_offset: [37800, 34200, 33260, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Brisbane.ts",
    "content": "export default {\n  zone_name: 'Australia/Brisbane',\n  gmt_offset: [39600, 36728, 36000]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Broken_Hill.ts",
    "content": "export default {\n  zone_name: 'Australia/Broken_Hill',\n  gmt_offset: [37800, 36000, 34200, 33948, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Darwin.ts",
    "content": "export default {\n  zone_name: 'Australia/Darwin',\n  gmt_offset: [37800, 34200, 32400, 31400]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Eucla.ts",
    "content": "export default {\n  zone_name: 'Australia/Eucla',\n  gmt_offset: [35100, 31500, 30928]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Hobart.ts",
    "content": "export default {\n  zone_name: 'Australia/Hobart',\n  gmt_offset: [39600, 36000, 35356]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Lindeman.ts",
    "content": "export default {\n  zone_name: 'Australia/Lindeman',\n  gmt_offset: [39600, 36000, 35756]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Lord_Howe.ts",
    "content": "export default {\n  zone_name: 'Australia/Lord_Howe',\n  gmt_offset: [41400, 39600, 38180, 37800, 36000]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Melbourne.ts",
    "content": "export default {\n  zone_name: 'Australia/Melbourne',\n  gmt_offset: [39600, 36000, 34792]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Perth.ts",
    "content": "export default {\n  zone_name: 'Australia/Perth',\n  gmt_offset: [32400, 28800, 27804]\n};\n"
  },
  {
    "path": "src/timezones/Australia/Sydney.ts",
    "content": "export default {\n  zone_name: 'Australia/Sydney',\n  gmt_offset: [39600, 36292, 36000]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Amsterdam.ts",
    "content": "export default {\n  zone_name: 'Europe/Amsterdam',\n  gmt_offset: [7200, 4800, 4772, 3600, 1200, 1172]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Andorra.ts",
    "content": "export default {\n  zone_name: 'Europe/Andorra',\n  gmt_offset: [7200, 3600, 364, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Astrakhan.ts",
    "content": "export default {\n  zone_name: 'Europe/Astrakhan',\n  gmt_offset: [18000, 14400, 11532, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Athens.ts",
    "content": "export default {\n  zone_name: 'Europe/Athens',\n  gmt_offset: [10800, 7200, 5692, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Belgrade.ts",
    "content": "export default {\n  zone_name: 'Europe/Belgrade',\n  gmt_offset: [7200, 4920, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Berlin.ts",
    "content": "export default {\n  zone_name: 'Europe/Berlin',\n  gmt_offset: [10800, 7200, 3600, 3208]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Bratislava.ts",
    "content": "export default {\n  zone_name: 'Europe/Bratislava',\n  gmt_offset: [7200, 3600, 3464, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Brussels.ts",
    "content": "export default {\n  zone_name: 'Europe/Brussels',\n  gmt_offset: [7200, 3600, 1050, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Bucharest.ts",
    "content": "export default {\n  zone_name: 'Europe/Bucharest',\n  gmt_offset: [10800, 7200, 6264]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Budapest.ts",
    "content": "export default {\n  zone_name: 'Europe/Budapest',\n  gmt_offset: [7200, 4580, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Busingen.ts",
    "content": "export default {\n  zone_name: 'Europe/Busingen',\n  gmt_offset: [7200, 3600, 2048, 1786]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Chisinau.ts",
    "content": "export default {\n  zone_name: 'Europe/Chisinau',\n  gmt_offset: [14400, 10800, 7200, 6920, 6900, 6264, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Copenhagen.ts",
    "content": "export default {\n  zone_name: 'Europe/Copenhagen',\n  gmt_offset: [7200, 3600, 3020]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Dublin.ts",
    "content": "export default {\n  zone_name: 'Europe/Dublin',\n  gmt_offset: [3600, 2079, 0, -1521]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Gibraltar.ts",
    "content": "export default {\n  zone_name: 'Europe/Gibraltar',\n  gmt_offset: [7200, 3600, 0, -1284]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Guernsey.ts",
    "content": "export default {\n  zone_name: 'Europe/Guernsey',\n  gmt_offset: [7200, 3600, 0, -609]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Helsinki.ts",
    "content": "export default {\n  zone_name: 'Europe/Helsinki',\n  gmt_offset: [10800, 7200, 5989]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Isle_of_Man.ts",
    "content": "export default {\n  zone_name: 'Europe/Isle_of_Man',\n  gmt_offset: [7200, 3600, 0, -1075]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Istanbul.ts",
    "content": "export default {\n  zone_name: 'Europe/Istanbul',\n  gmt_offset: [14400, 10800, 7200, 7016, 6952]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Jersey.ts",
    "content": "export default {\n  zone_name: 'Europe/Jersey',\n  gmt_offset: [7200, 3600, 0, -506]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Kaliningrad.ts",
    "content": "export default {\n  zone_name: 'Europe/Kaliningrad',\n  gmt_offset: [14400, 10800, 7200, 4920, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Kirov.ts",
    "content": "export default {\n  zone_name: 'Europe/Kirov',\n  gmt_offset: [18000, 14400, 11928, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Kyiv.ts",
    "content": "export default {\n  zone_name: 'Europe/Kyiv',\n  gmt_offset: [14400, 10800, 7324, 7200, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Lisbon.ts",
    "content": "export default {\n  zone_name: 'Europe/Lisbon',\n  gmt_offset: [7200, 3600, 0, -2205]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Ljubljana.ts",
    "content": "export default {\n  zone_name: 'Europe/Ljubljana',\n  gmt_offset: [7200, 3600, 3484]\n};\n"
  },
  {
    "path": "src/timezones/Europe/London.ts",
    "content": "export default {\n  zone_name: 'Europe/London',\n  gmt_offset: [7200, 3600, 0, -75]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Luxembourg.ts",
    "content": "export default {\n  zone_name: 'Europe/Luxembourg',\n  gmt_offset: [7200, 3600, 1476, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Madrid.ts",
    "content": "export default {\n  zone_name: 'Europe/Madrid',\n  gmt_offset: [7200, 3600, 0, -884]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Malta.ts",
    "content": "export default {\n  zone_name: 'Europe/Malta',\n  gmt_offset: [7200, 3600, 3484]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Mariehamn.ts",
    "content": "export default {\n  zone_name: 'Europe/Mariehamn',\n  gmt_offset: [10800, 7200, 5989]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Minsk.ts",
    "content": "export default {\n  zone_name: 'Europe/Minsk',\n  gmt_offset: [14400, 10800, 7200, 6616, 6600, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Monaco.ts",
    "content": "export default {\n  zone_name: 'Europe/Monaco',\n  gmt_offset: [7200, 3600, 1772, 561, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Moscow.ts",
    "content": "export default {\n  zone_name: 'Europe/Moscow',\n  gmt_offset: [18000, 16279, 14400, 12679, 10800, 9079, 9017, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Oslo.ts",
    "content": "export default {\n  zone_name: 'Europe/Oslo',\n  gmt_offset: [7200, 3600, 2580]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Paris.ts",
    "content": "export default {\n  zone_name: 'Europe/Paris',\n  gmt_offset: [7200, 3600, 561, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Podgorica.ts",
    "content": "export default {\n  zone_name: 'Europe/Podgorica',\n  gmt_offset: [7200, 4920, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Prague.ts",
    "content": "export default {\n  zone_name: 'Europe/Prague',\n  gmt_offset: [7200, 3600, 3464, 0]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Riga.ts",
    "content": "export default {\n  zone_name: 'Europe/Riga',\n  gmt_offset: [14400, 10800, 9394, 7200, 5794, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Rome.ts",
    "content": "export default {\n  zone_name: 'Europe/Rome',\n  gmt_offset: [7200, 3600, 2996]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Samara.ts",
    "content": "export default {\n  zone_name: 'Europe/Samara',\n  gmt_offset: [18000, 14400, 12020, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Europe/San_Marino.ts",
    "content": "export default {\n  zone_name: 'Europe/San_Marino',\n  gmt_offset: [7200, 3600, 2996]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Sarajevo.ts",
    "content": "export default {\n  zone_name: 'Europe/Sarajevo',\n  gmt_offset: [7200, 4420, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Saratov.ts",
    "content": "export default {\n  zone_name: 'Europe/Saratov',\n  gmt_offset: [18000, 14400, 11058, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Simferopol.ts",
    "content": "export default {\n  zone_name: 'Europe/Simferopol',\n  gmt_offset: [14400, 10800, 8184, 8160, 7200, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Skopje.ts",
    "content": "export default {\n  zone_name: 'Europe/Skopje',\n  gmt_offset: [7200, 5144, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Sofia.ts",
    "content": "export default {\n  zone_name: 'Europe/Sofia',\n  gmt_offset: [10800, 7200, 7016, 5596, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Stockholm.ts",
    "content": "export default {\n  zone_name: 'Europe/Stockholm',\n  gmt_offset: [7200, 4332, 3614, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Tallinn.ts",
    "content": "export default {\n  zone_name: 'Europe/Tallinn',\n  gmt_offset: [14400, 10800, 7200, 5940, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Tirane.ts",
    "content": "export default {\n  zone_name: 'Europe/Tirane',\n  gmt_offset: [7200, 4760, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Ulyanovsk.ts",
    "content": "export default {\n  zone_name: 'Europe/Ulyanovsk',\n  gmt_offset: [18000, 14400, 11616, 10800, 7200]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Vaduz.ts",
    "content": "export default {\n  zone_name: 'Europe/Vaduz',\n  gmt_offset: [7200, 3600, 2284]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Vatican.ts",
    "content": "export default {\n  zone_name: 'Europe/Vatican',\n  gmt_offset: [7200, 3600, 2996]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Vienna.ts",
    "content": "export default {\n  zone_name: 'Europe/Vienna',\n  gmt_offset: [7200, 3921, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Vilnius.ts",
    "content": "export default {\n  zone_name: 'Europe/Vilnius',\n  gmt_offset: [14400, 10800, 7200, 6076, 5736, 5040, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Volgograd.ts",
    "content": "export default {\n  zone_name: 'Europe/Volgograd',\n  gmt_offset: [18000, 14400, 10800, 10660]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Warsaw.ts",
    "content": "export default {\n  zone_name: 'Europe/Warsaw',\n  gmt_offset: [10800, 7200, 5040, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Zagreb.ts",
    "content": "export default {\n  zone_name: 'Europe/Zagreb',\n  gmt_offset: [7200, 3832, 3600]\n};\n"
  },
  {
    "path": "src/timezones/Europe/Zurich.ts",
    "content": "export default {\n  zone_name: 'Europe/Zurich',\n  gmt_offset: [7200, 3600, 2048, 1786]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Antananarivo.ts",
    "content": "export default {\n  zone_name: 'Indian/Antananarivo',\n  gmt_offset: [14400, 11404, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Chagos.ts",
    "content": "export default {\n  zone_name: 'Indian/Chagos',\n  gmt_offset: [21600, 18000, 17380]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Christmas.ts",
    "content": "export default {\n  zone_name: 'Indian/Christmas',\n  gmt_offset: [25372, 25200]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Cocos.ts",
    "content": "export default {\n  zone_name: 'Indian/Cocos',\n  gmt_offset: [23400, 23260]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Comoro.ts",
    "content": "export default {\n  zone_name: 'Indian/Comoro',\n  gmt_offset: [10800, 10384]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Kerguelen.ts",
    "content": "export default {\n  zone_name: 'Indian/Kerguelen',\n  gmt_offset: [18000, 0]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Mahe.ts",
    "content": "export default {\n  zone_name: 'Indian/Mahe',\n  gmt_offset: [14400, 13308]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Maldives.ts",
    "content": "export default {\n  zone_name: 'Indian/Maldives',\n  gmt_offset: [18000, 17640]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Mauritius.ts",
    "content": "export default {\n  zone_name: 'Indian/Mauritius',\n  gmt_offset: [18000, 14400, 13800]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Mayotte.ts",
    "content": "export default {\n  zone_name: 'Indian/Mayotte',\n  gmt_offset: [10856, 10800]\n};\n"
  },
  {
    "path": "src/timezones/Indian/Reunion.ts",
    "content": "export default {\n  zone_name: 'Indian/Reunion',\n  gmt_offset: [14400, 13312]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Apia.ts",
    "content": "export default {\n  zone_name: 'Pacific/Apia',\n  gmt_offset: [50400, 46800, 45184, -36000, -39600, -41216, -41400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Auckland.ts",
    "content": "export default {\n  zone_name: 'Pacific/Auckland',\n  gmt_offset: [46800, 45000, 43200, 41944, 41400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Bougainville.ts",
    "content": "export default {\n  zone_name: 'Pacific/Bougainville',\n  gmt_offset: [39600, 37336, 36000, 35312, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Chatham.ts",
    "content": "export default {\n  zone_name: 'Pacific/Chatham',\n  gmt_offset: [49500, 45900, 44100, 44028]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Chuuk.ts",
    "content": "export default {\n  zone_name: 'Pacific/Chuuk',\n  gmt_offset: [36428, 36000, 32400, -49972]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Easter.ts",
    "content": "export default {\n  zone_name: 'Pacific/Easter',\n  gmt_offset: [-18000, -21600, -25200, -26248]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Efate.ts",
    "content": "export default {\n  zone_name: 'Pacific/Efate',\n  gmt_offset: [43200, 40396, 39600]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Fakaofo.ts",
    "content": "export default {\n  zone_name: 'Pacific/Fakaofo',\n  gmt_offset: [46800, -39600, -41096]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Fiji.ts",
    "content": "export default {\n  zone_name: 'Pacific/Fiji',\n  gmt_offset: [46800, 43200, 42944]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Funafuti.ts",
    "content": "export default {\n  zone_name: 'Pacific/Funafuti',\n  gmt_offset: [43200, 43012]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Galapagos.ts",
    "content": "export default {\n  zone_name: 'Pacific/Galapagos',\n  gmt_offset: [-18000, -21504, -21600]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Gambier.ts",
    "content": "export default {\n  zone_name: 'Pacific/Gambier',\n  gmt_offset: [-32388, -32400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Guadalcanal.ts",
    "content": "export default {\n  zone_name: 'Pacific/Guadalcanal',\n  gmt_offset: [39600, 38388]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Guam.ts",
    "content": "export default {\n  zone_name: 'Pacific/Guam',\n  gmt_offset: [39600, 36000, 34740, 32400, -51660]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Honolulu.ts",
    "content": "export default {\n  zone_name: 'Pacific/Honolulu',\n  gmt_offset: [-34200, -36000, -37800, -37886]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Kanton.ts",
    "content": "export default {\n  zone_name: 'Pacific/Kanton',\n  gmt_offset: [46800, 0, -39600, -43200]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Kiritimati.ts",
    "content": "export default {\n  zone_name: 'Pacific/Kiritimati',\n  gmt_offset: [50400, -36000, -37760, -38400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Kosrae.ts",
    "content": "export default {\n  zone_name: 'Pacific/Kosrae',\n  gmt_offset: [43200, 39600, 39116, 36000, 32400, -47284]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Kwajalein.ts",
    "content": "export default {\n  zone_name: 'Pacific/Kwajalein',\n  gmt_offset: [43200, 40160, 39600, 36000, 32400, -43200]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Majuro.ts",
    "content": "export default {\n  zone_name: 'Pacific/Majuro',\n  gmt_offset: [43200, 41088, 39600, 36000, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Marquesas.ts",
    "content": "export default {\n  zone_name: 'Pacific/Marquesas',\n  gmt_offset: [-33480, -34200]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Midway.ts",
    "content": "export default {\n  zone_name: 'Pacific/Midway',\n  gmt_offset: [-36000, -39600, -42568]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Nauru.ts",
    "content": "export default {\n  zone_name: 'Pacific/Nauru',\n  gmt_offset: [43200, 41400, 40060, 32400]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Niue.ts",
    "content": "export default {\n  zone_name: 'Pacific/Niue',\n  gmt_offset: [-39600, -40780, -40800]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Norfolk.ts",
    "content": "export default {\n  zone_name: 'Pacific/Norfolk',\n  gmt_offset: [45000, 43200, 41400, 40320, 40312, 39600]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Noumea.ts",
    "content": "export default {\n  zone_name: 'Pacific/Noumea',\n  gmt_offset: [43200, 39948, 39600]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Pago_Pago.ts",
    "content": "export default {\n  zone_name: 'Pacific/Pago_Pago',\n  gmt_offset: [45432, -39600, -40968]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Palau.ts",
    "content": "export default {\n  zone_name: 'Pacific/Palau',\n  gmt_offset: [32400, 32276, -54124]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Pitcairn.ts",
    "content": "export default {\n  zone_name: 'Pacific/Pitcairn',\n  gmt_offset: [-28800, -30600, -31220]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Pohnpei.ts",
    "content": "export default {\n  zone_name: 'Pacific/Pohnpei',\n  gmt_offset: [39600, 37972, 36000, 32400, -48428]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Port_Moresby.ts",
    "content": "export default {\n  zone_name: 'Pacific/Port_Moresby',\n  gmt_offset: [36000, 35320, 35312]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Rarotonga.ts",
    "content": "export default {\n  zone_name: 'Pacific/Rarotonga',\n  gmt_offset: [48056, -34200, -36000, -37800, -38344]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Saipan.ts",
    "content": "export default {\n  zone_name: 'Pacific/Saipan',\n  gmt_offset: [39600, 36000, 34980, 32400, -51420]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Tahiti.ts",
    "content": "export default {\n  zone_name: 'Pacific/Tahiti',\n  gmt_offset: [-35896, -36000]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Tarawa.ts",
    "content": "export default {\n  zone_name: 'Pacific/Tarawa',\n  gmt_offset: [43200, 41524]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Tongatapu.ts",
    "content": "export default {\n  zone_name: 'Pacific/Tongatapu',\n  gmt_offset: [50400, 46800, 44400, 44352]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Wake.ts",
    "content": "export default {\n  zone_name: 'Pacific/Wake',\n  gmt_offset: [43200, 39988]\n};\n"
  },
  {
    "path": "src/timezones/Pacific/Wallis.ts",
    "content": "export default {\n  zone_name: 'Pacific/Wallis',\n  gmt_offset: [44120, 43200]\n};\n"
  },
  {
    "path": "src/transform.ts",
    "content": "import { parse } from './parse.ts';\nimport { format } from './format.ts';\nimport { CompiledObject } from './compile.ts';\nimport type { ParserOptions } from './parser.ts';\nimport type { FormatterOptions } from './formatter.ts';\n\n/**\n * Transforms a date string from one format to another.\n * @param dateString - The date string to transform\n * @param arg1 - The format string or compiled object for parsing\n * @param arg2 - The format string or compiled object for formatting\n * @param [options1] - Optional parser options\n * @param [options2] - Optional formatter options\n * @returns The transformed date string\n */\nexport function transform(dateString: string, arg1: string | CompiledObject, arg2: string | CompiledObject, options1?: ParserOptions, options2?: FormatterOptions) {\n  return format(parse(dateString, arg1, options1), arg2, options2);\n}\n"
  },
  {
    "path": "src/utils.ts",
    "content": "/**\n * Determines if the specified year is a leap year.\n * @param year - The gregorian year to check for leap year status (1-9999)\n * @returns True if the year is a leap year, false otherwise\n */\nexport const isLeapYear = (year: number) => {\n  return (!(year % 4) && !!(year % 100)) || !(year % 400);\n};\n\n/**\n * Determines if two dates represent the same calendar day.\n * @param date1 - The first date to compare\n * @param date2 - The second date to compare\n * @returns True if both dates are on the same day, false otherwise\n */\nexport const isSameDay = (date1: Date, date2: Date) => {\n  return date1.toDateString() === date2.toDateString();\n};\n\n// The toUTC function converts a given year, month, and day into a UTC timestamp.\n// The `m` parameter is 0-indexed (0 = January, 11 = December), matching the convention of Date.UTC.\nconst toUTC = (y: number, m: number, d: number) => Date.UTC(y, m - (y < 100 ? 1900 * 12 : 0), d);\n\n/**\n * Returns the number of days in a given month of a specific year.\n * @param date - The date to get the number of days for\n * @returns The number of days in the month of the provided date\n */\nexport function getDaysInMonth (date: Date): number;\n\n/**\n * Returns the number of days in a given month of a specific year.\n * @param year - The gregorian year (1-9999) to get the number of days for\n * @param month - The month (1-12) to get the number of days for\n * @returns The number of days in the month of the provided date\n */\nexport function getDaysInMonth (year: number, month: number): number;\n\nexport function getDaysInMonth (...args: [date: Date] | [year: number, month: number]) {\n  const [year, month] = (\n    () => args.length === 1\n      ? [args[0].getFullYear(), args[0].getMonth() + 1]\n      : args\n  )();\n  // month is 1-indexed here; day 0 of next month = last day of current month\n  return new Date(toUTC(year, month, 0)).getUTCDate();\n}\n\n// The getThursdayOfWeek function calculates the Thursday of the week for a given time.\n// This is used as an anchor point to determine the ISO week number and ISO week year,\n// since the ISO week starts on Monday and ends on Sunday,\n// and Thursday is always in the same ISO week as the given date.\nconst getThursdayOfWeek = (time: number) => {\n  const target = new Date(time);\n  // getUTCDay() returns 0 for Sunday, so we use (day || 7) to treat Sunday as the 7th day of the week\n  target.setUTCDate(target.getUTCDate() + (4 - (target.getUTCDay() || 7)));\n  return target;\n};\n\n/**\n * Calculates the ISO week year for a given date.\n * @param date - The date to calculate the ISO week year for\n * @returns The ISO week year corresponding to the provided date\n */\nexport function getISOWeekYear (date: Date): number;\n\n/**\n * Calculates the ISO week year for a given year, month, and day.\n * @param year - The gregorian year (1-9999) to calculate the ISO week year for\n * @param month - The month (1-12) to calculate the ISO week year for\n * @param day - The day (1-31) to calculate the ISO week year for\n * @returns The ISO week year corresponding to the provided date\n */\nexport function getISOWeekYear (year: number, month: number, day: number): number;\n\nexport function getISOWeekYear (...args: [date: Date] | [year: number, month: number, day: number]) {\n  const [year, month, day] = (\n    () => args.length === 1\n      ? [args[0].getFullYear(), args[0].getMonth() + 1, args[0].getDate()]\n      : args\n  )();\n  // The ISO week year is the year that contains the Thursday of the week\n  return getThursdayOfWeek(toUTC(year, month - 1, day)).getUTCFullYear();\n}\n\n/**\n * Calculates the ISO week number for a given date.\n * @param date - The date to calculate the ISO week number for\n * @returns The ISO week number corresponding to the provided date\n */\nexport function getISOWeek (date: Date): number;\n\n/**\n * Calculates the ISO week number for a given year, month, and day.\n * @param year - The gregorian year (1-9999) to calculate the ISO week number for\n * @param month - The month (1-12) to calculate the ISO week number for\n * @param day - The day (1-31) to calculate the ISO week number for\n * @returns The ISO week number corresponding to the provided date\n */\nexport function getISOWeek (year: number, month: number, day: number): number;\n\nexport function getISOWeek (...args: [date: Date] | [year: number, month: number, day: number]) {\n  const [year, month, day] = (\n    () => args.length === 1\n      ? [args[0].getFullYear(), args[0].getMonth() + 1, args[0].getDate()]\n      : args\n  )();\n  const target = getThursdayOfWeek(toUTC(year, month - 1, day));\n  // Calculate the ISO week number by finding the difference in weeks between the target date\n  // and the Thursday of the first week of the year (January 4th)\n  return Math.round((target.getTime() - getThursdayOfWeek(toUTC(target.getUTCFullYear(), 0, 4)).getTime()) / 86400000 / 7) + 1;\n}\n"
  },
  {
    "path": "src/zone.ts",
    "content": "import { dtfToParts, fromParts } from './datetime.ts';\nimport { getDateTimeFormat } from './dtf.ts';\n\nexport interface TimeZone {\n  zone_name: string;\n  gmt_offset: number[];\n}\n\nexport const isTimeZone = (timeZone: unknown): timeZone is TimeZone => {\n  return !!timeZone && typeof timeZone === 'object' && 'zone_name' in timeZone && 'gmt_offset' in timeZone;\n};\n\nconst getTimezoneOffset = (naiveUTC: number, zoneName: string): number => {\n  const dtf = (() => {\n    try {\n      return getDateTimeFormat(zoneName);\n    } catch {\n      return undefined;\n    }\n  })();\n  const set = new Set<number>();\n\n  if (dtf) {\n    // Try to find the correct offset by checking the current and previous days.\n    for (let d = 0; d < 2; d++) {\n      const time = naiveUTC - d * 86400 * 1000;\n      // Starting from a positive offset (≥ the maximum westward IANA offset, Metlakatla: UTC-15:13:42)\n      // ensures DST is preferred over standard time for ambiguous fall-back timestamps.\n      let offset = 54822 * 1000;\n\n      do {\n        const diff = fromParts(dtfToParts(dtf, time - offset)) - time;\n\n        if (diff === 0) {\n          return offset;\n        }\n        set.add(offset);\n        offset += diff;\n      } while (!set.has(offset));\n\n      set.clear();\n    }\n  }\n  return NaN;\n};\n\nexport const createTimezoneDate = (naiveUTC: number, timeZone: TimeZone | string) => {\n  const zoneName = isTimeZone(timeZone) ? timeZone.zone_name : timeZone;\n  return new Date(naiveUTC - getTimezoneOffset(naiveUTC, zoneName));\n};\n"
  },
  {
    "path": "src/zonenames.ts",
    "content": "/**\n * @description\n * This file was generated from the execution result of the `npm run zonename` command.\n */\n\nexport default {\n  'Acre Standard Time': 'ACT',\n  'Acre Summer Time': 'ACST',\n  'Afghanistan Time': 'AFT',\n  'Alaska Daylight Time': 'AKDT',\n  'Alaska Standard Time': 'AKST',\n  'Almaty Standard Time': 'ALMT',\n  'Almaty Summer Time': 'ALMST',\n  'Amazon Standard Time': 'AMT',\n  'Amazon Summer Time': 'AMST',\n  'American Samoa Standard Time': 'SST',\n  'Anadyr Standard Time': 'ANAT',\n  'Anadyr Summer Time': 'ANAST',\n  'Apia Daylight Time': 'WSDT',\n  'Apia Standard Time': 'WSST',\n  'Aqtau Standard Time': 'AQTT',\n  'Aqtau Summer Time': 'AQTST',\n  'Aqtobe Standard Time': 'AQTT',\n  'Aqtobe Summer Time': 'AQTST',\n  'Arabian Daylight Time': 'ADT',\n  'Arabian Standard Time': 'AST',\n  'Argentina Standard Time': 'ART',\n  'Argentina Summer Time': 'ARST',\n  'Armenia Standard Time': 'AMT',\n  'Armenia Summer Time': 'AMST',\n  'Atlantic Daylight Time': 'ADT',\n  'Atlantic Standard Time': 'AST',\n  'Australian Central Daylight Time': 'ACDT',\n  'Australian Central Standard Time': 'ACST',\n  'Australian Central Western Daylight Time': 'ACWDT',\n  'Australian Central Western Standard Time': 'ACWST',\n  'Australian Eastern Daylight Time': 'AEDT',\n  'Australian Eastern Standard Time': 'AEST',\n  'Australian Western Daylight Time': 'AWDT',\n  'Australian Western Standard Time': 'AWST',\n  'Azerbaijan Standard Time': 'AZT',\n  'Azerbaijan Summer Time': 'AZST',\n  'Azores Standard Time': 'AZOT',\n  'Azores Summer Time': 'AZOST',\n  'Bangladesh Standard Time': 'BST',\n  'Bangladesh Summer Time': 'BDST',\n  'Bhutan Time': 'BTT',\n  'Bolivia Time': 'BOT',\n  'Brasilia Standard Time': 'BRT',\n  'Brasilia Summer Time': 'BRST',\n  'British Summer Time': 'BST',\n  'Brunei Darussalam Time': 'BNT',\n  'Brunei Time': 'BNT',\n  'Cape Verde Standard Time': 'CVT',\n  'Casey Time': 'CAST',\n  'Central Africa Time': 'CAT',\n  'Central Daylight Time': 'CDT',\n  'Central European Standard Time': 'CET',\n  'Central European Summer Time': 'CEST',\n  'Central Indonesia Time': 'WITA',\n  'Central Standard Time': 'CST',\n  'Chamorro Standard Time': 'ChST',\n  'Chatham Daylight Time': 'CHADT',\n  'Chatham Standard Time': 'CHAST',\n  'Chile Standard Time': 'CLT',\n  'Chile Summer Time': 'CLST',\n  'China Daylight Time': 'CDT',\n  'China Standard Time': 'CST',\n  'Choibalsan Standard Time': 'CHOT',\n  'Choibalsan Summer Time': 'CHOST',\n  'Christmas Island Time': 'CXT',\n  'Chuuk Time': 'CHUT',\n  'Cocos Islands Time': 'CCT',\n  'Colombia Standard Time': 'COT',\n  'Colombia Summer Time': 'COST',\n  'Cook Islands Half Summer Time': 'CKHST',\n  'Cook Islands Standard Time': 'CKT',\n  'Cook Islands Summer Time': 'CKST',\n  'Coordinated Universal Time': 'UTC',\n  'Cuba Daylight Time': 'CDT',\n  'Cuba Standard Time': 'CST',\n  'Davis Time': 'DAVT',\n  'Dumont d’Urville Time': 'DDUT',\n  'Dumont-d’Urville Time': 'DDUT',\n  'East Africa Time': 'EAT',\n  'East Greenland Standard Time': 'EGT',\n  'East Greenland Summer Time': 'EGST',\n  'East Kazakhstan Time': 'ALMT',\n  'East Timor Time': 'TLT',\n  'Easter Island Standard Time': 'EAST',\n  'Easter Island Summer Time': 'EASST',\n  'Eastern Daylight Time': 'EDT',\n  'Eastern European Standard Time': 'EET',\n  'Eastern European Summer Time': 'EEST',\n  'Eastern Indonesia Time': 'WIT',\n  'Eastern Standard Time': 'EST',\n  'Ecuador Time': 'ECT',\n  'Falkland Islands Standard Time': 'FKT',\n  'Falkland Islands Summer Time': 'FKST',\n  'Fernando de Noronha Standard Time': 'FNT',\n  'Fernando de Noronha Summer Time': 'FNST',\n  'Fiji Standard Time': 'FJT',\n  'Fiji Summer Time': 'FJST',\n  'French Guiana Time': 'GFT',\n  'French Southern & Antarctic Time': 'TFT',\n  'Further-eastern European Time': 'FET',\n  'Galapagos Time': 'GALT',\n  'Gambier Time': 'GAMT',\n  'Georgia Standard Time': 'GET',\n  'Georgia Summer Time': 'GEST',\n  'Gilbert Islands Time': 'GILT',\n  'Greenland Standard Time': 'WGT',\n  'Greenland Summer Time': 'WGST',\n  'Greenwich Mean Time': 'GMT',\n  'Guam Standard Time': 'ChST',\n  'Gulf Standard Time': 'GST',\n  'Guyana Time': 'GYT',\n  'Hawaii-Aleutian Daylight Time': 'HDT',\n  'Hawaii-Aleutian Standard Time': 'HST',\n  'Hong Kong Standard Time': 'HKT',\n  'Hong Kong Summer Time': 'HKST',\n  'Hovd Standard Time': 'HOVT',\n  'Hovd Summer Time': 'HOVST',\n  'India Standard Time': 'IST',\n  'Indian Ocean Time': 'IOT',\n  'Indochina Time': 'ICT',\n  'Iran Daylight Time': 'IRDT',\n  'Iran Standard Time': 'IRST',\n  'Irish Standard Time': 'IST',\n  'Irkutsk Standard Time': 'IRKT',\n  'Irkutsk Summer Time': 'IRKST',\n  'Israel Daylight Time': 'IDT',\n  'Israel Standard Time': 'IST',\n  'Japan Standard Time': 'JST',\n  'Kamchatka Standard Time': 'PETT',\n  'Kamchatka Summer Time': 'PETST',\n  'Kazakhstan Time': 'KZT',\n  'Khovd Standard Time': 'HOVT',\n  'Khovd Summer Time': 'HOVST',\n  'Korean Daylight Time': 'KDT',\n  'Korean Standard Time': 'KST',\n  'Kosrae Time': 'KOST',\n  'Krasnoyarsk Standard Time': 'KRAT',\n  'Krasnoyarsk Summer Time': 'KRAST',\n  'Kyrgyzstan Time': 'KGT',\n  'Kyzylorda Standard Time': 'QYZT',\n  'Kyzylorda Summer Time': 'QYZST',\n  'Lanka Time': 'LKT',\n  'Line Islands Time': 'LINT',\n  'Lord Howe Daylight Time': 'LHDT',\n  'Lord Howe Standard Time': 'LHST',\n  'Macao Standard Time': 'CST',\n  'Macao Summer Time': 'CDT',\n  'Magadan Standard Time': 'MAGT',\n  'Magadan Summer Time': 'MAGST',\n  'Malaysia Time': 'MYT',\n  'Maldives Time': 'MVT',\n  'Marquesas Time': 'MART',\n  'Marshall Islands Time': 'MHT',\n  'Mauritius Standard Time': 'MUT',\n  'Mauritius Summer Time': 'MUST',\n  'Mawson Time': 'MAWT',\n  'Mexican Pacific Daylight Time': 'PDT',\n  'Mexican Pacific Standard Time': 'PST',\n  'Moscow Standard Time': 'MSK',\n  'Moscow Summer Time': 'MSD',\n  'Mountain Daylight Time': 'MDT',\n  'Mountain Standard Time': 'MST',\n  'Myanmar Time': 'MMT',\n  'Nauru Time': 'NRT',\n  'Nepal Time': 'NPT',\n  'New Caledonia Standard Time': 'NCT',\n  'New Caledonia Summer Time': 'NCST',\n  'New Zealand Daylight Time': 'NZDT',\n  'New Zealand Standard Time': 'NZST',\n  'Newfoundland Daylight Time': 'NDT',\n  'Newfoundland Standard Time': 'NST',\n  'Niue Time': 'NUT',\n  'Norfolk Island Daylight Time': 'NFDT',\n  'Norfolk Island Standard Time': 'NFT',\n  'North Korea Time': 'KST',\n  'North Mariana Islands Time': 'ChST',\n  'Northern Mariana Islands Time': 'ChST',\n  'Novosibirsk Standard Time': 'NOVT',\n  'Novosibirsk Summer Time': 'NOVST',\n  'Omsk Standard Time': 'OMST',\n  'Omsk Summer Time': 'OMSST',\n  'Pacific Daylight Time': 'PDT',\n  'Pacific Standard Time': 'PST',\n  'Pakistan Standard Time': 'PKT',\n  'Pakistan Summer Time': 'PKST',\n  'Palau Time': 'PWT',\n  'Papua New Guinea Time': 'PGT',\n  'Paraguay Standard Time': 'PYT',\n  'Paraguay Summer Time': 'PYST',\n  'Peru Standard Time': 'PET',\n  'Peru Summer Time': 'PEST',\n  'Petropavlovsk-Kamchatski Standard Time': 'PETT',\n  'Petropavlovsk-Kamchatski Summer Time': 'PETST',\n  'Philippine Standard Time': 'PHT',\n  'Philippine Summer Time': 'PHST',\n  'Phoenix Islands Time': 'PHOT',\n  'Pitcairn Time': 'PST',\n  'Pohnpei Time': 'PONT',\n  'Ponape Time': 'PONT',\n  'Pyongyang Time': 'KST',\n  'Qyzylorda Standard Time': 'QYZT',\n  'Qyzylorda Summer Time': 'QYZST',\n  'Réunion Time': 'RET',\n  'Rothera Time': 'ROTT',\n  'Sakhalin Standard Time': 'SAKT',\n  'Sakhalin Summer Time': 'SAKST',\n  'Samara Standard Time': 'SAMT',\n  'Samara Summer Time': 'SAMST',\n  'Samoa Daylight Time': 'SDT',\n  'Samoa Standard Time': 'SST',\n  'Seychelles Time': 'SCT',\n  'Singapore Standard Time': 'SGT',\n  'Solomon Islands Time': 'SBT',\n  'South Africa Standard Time': 'SAST',\n  'South Georgia Time': 'GST',\n  'St. Pierre & Miquelon Daylight Time': 'PMDT',\n  'St. Pierre & Miquelon Standard Time': 'PMST',\n  'Suriname Time': 'SRT',\n  'Syowa Time': 'SYOT',\n  'Tahiti Time': 'TAHT',\n  'Taipei Daylight Time': 'CDT',\n  'Taipei Standard Time': 'CST',\n  'Taiwan Daylight Time': 'CDT',\n  'Taiwan Standard Time': 'CST',\n  'Tajikistan Time': 'TJT',\n  'Timor-Leste Time': 'TLT',\n  'Tokelau Time': 'TKT',\n  'Tonga Standard Time': 'TOT',\n  'Tonga Summer Time': 'TOST',\n  'Türkiye Standard Time': 'TRT',\n  'Türkiye Summer Time': 'TRST',\n  'Turkmenistan Standard Time': 'TMT',\n  'Tuvalu Time': 'TVT',\n  'Ulaanbaatar Standard Time': 'ULAT',\n  'Ulaanbaatar Summer Time': 'ULAST',\n  'Uruguay Standard Time': 'UYT',\n  'Uruguay Summer Time': 'UYST',\n  'Uzbekistan Standard Time': 'UZT',\n  'Uzbekistan Summer Time': 'UZST',\n  'Vanuatu Standard Time': 'VUT',\n  'Vanuatu Summer Time': 'VUST',\n  'Venezuela Time': 'VET',\n  'Vladivostok Standard Time': 'VLAT',\n  'Vladivostok Summer Time': 'VLAST',\n  'Volgograd Standard Time': 'VOLT',\n  'Volgograd Summer Time': 'VOLST',\n  'Vostok Time': 'VOST',\n  'Wake Island Time': 'WAKT',\n  'Wallis & Futuna Time': 'WFT',\n  'West Africa Standard Time': 'WAT',\n  'West Africa Summer Time': 'WAST',\n  'West Africa Time': 'WAT',\n  'West Greenland Standard Time': 'WGT',\n  'West Greenland Summer Time': 'WGST',\n  'West Kazakhstan Time': 'AQTT',\n  'Western Argentina Standard Time': 'WART',\n  'Western Argentina Summer Time': 'WARST',\n  'Western European Standard Time': 'WET',\n  'Western European Summer Time': 'WEST',\n  'Western Indonesia Time': 'WIB',\n  'Yakutsk Standard Time': 'YAKT',\n  'Yakutsk Summer Time': 'YAKST',\n  'Yekaterinburg Standard Time': 'YEKT',\n  'Yekaterinburg Summer Time': 'YEKST',\n  'Yukon Time': 'YT'\n};\n"
  },
  {
    "path": "tests/addDays.spec.ts",
    "content": "import { expect, test, describe, beforeAll } from 'vitest';\nimport { addDays } from '@/index.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\n\ndescribe('Local Time', () => {\n  beforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\n  test('One day after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 1, 10));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('Two days after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 2, 10));\n\n    expect(addDays(date1, 2)).toEqual(date2);\n  });\n\n  test('Three days after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 3, 10));\n\n    expect(addDays(date1, 3)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 9));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 10));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 11));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 8));\n\n    expect(addDays(date1, -1)).toEqual(date2);\n  });\n\n  test('One day before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 9));\n\n    expect(addDays(date1, -1)).toEqual(date2);\n  });\n\n  test('One day before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 10));\n\n    expect(addDays(date1, -1)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 9));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 9));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 10));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 8));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 9));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n\n  test('One day after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 10));\n\n    expect(addDays(date1, 1)).toEqual(date2);\n  });\n});\n\ndescribe('UTC Time', () => {\n  beforeAll(() => (process.env.TZ = 'Asia/Tokyo'));\n\n  test('One day after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 1, 10));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('Two days after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 2, 10));\n\n    expect(addDays(date1, 2, 'UTC')).toEqual(date2);\n  });\n\n  test('Three days after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 3, 10));\n\n    expect(addDays(date1, 3, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 9));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 10));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 11));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 8));\n\n    expect(addDays(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 9));\n\n    expect(addDays(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 10));\n\n    expect(addDays(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 8));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 9));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 10));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 8));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 9));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One day after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 10));\n\n    expect(addDays(date1, 1, 'UTC')).toEqual(date2);\n  });\n});\n\ndescribe('America/Los_Angeles', () => {\n  beforeAll(() => (process.env.TZ = 'Australia/Sydney'));\n\n  test('One day after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 1, 10));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('Two days after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 2, 10));\n\n    expect(addDays(date1, 2, Los_Angeles)).toEqual(date2);\n  });\n\n  test('Three days after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 3, 10));\n\n    expect(addDays(date1, 3, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 9));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 10));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2024, 1, 11, 11));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 8));\n\n    expect(addDays(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 9));\n\n    expect(addDays(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 11, 2, 10));\n\n    expect(addDays(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 9));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 9));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 4, 10));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 8));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 9));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One day after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 9, 4, 10));\n\n    expect(addDays(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n});\n"
  },
  {
    "path": "tests/addHours.spec.ts",
    "content": "import { expect, test, beforeAll } from 'vitest';\nimport { addHours } from '@/index.ts';\n\nbeforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\ntest('One hour after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 11));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('Two hours after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 12));\n\n  expect(addHours(date1, 2)).toEqual(date2);\n});\n\ntest('Three hours after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 13));\n\n  expect(addHours(date1, 3)).toEqual(date2);\n});\n\ntest('One hour after 1:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 2:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 11));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 3:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 12));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour before 1:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 7));\n\n  expect(addHours(date1, -1)).toEqual(date2);\n});\n\ntest('One hour before 2:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 8));\n\n  expect(addHours(date1, -1)).toEqual(date2);\n});\n\ntest('One hour before 3:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 9));\n\n  expect(addHours(date1, -1)).toEqual(date2);\n});\n\ntest('One hour after 1:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 9));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 1:00 AM PST on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 2:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 11));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 1:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 9));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 2:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 10));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n\ntest('One hour after 3:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 11));\n\n  expect(addHours(date1, 1)).toEqual(date2);\n});\n"
  },
  {
    "path": "tests/addMilliseconds.spec.ts",
    "content": "import { expect, test, beforeAll } from 'vitest';\nimport { addMilliseconds } from '@/index.ts';\n\nbeforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\ntest('One millisecond after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('Two milliseconds after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0, 2));\n\n  expect(addMilliseconds(date1, 2)).toEqual(date2);\n});\n\ntest('Three milliseconds after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0, 3));\n\n  expect(addMilliseconds(date1, 3)).toEqual(date2);\n});\n\ntest('One millisecond after 1:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 9, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 9, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 2:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 3:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond before 1:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 8, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 7, 59, 59, 999));\n\n  expect(addMilliseconds(date1, -1)).toEqual(date2);\n});\n\ntest('One millisecond before 2:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 9, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 8, 59, 59, 999));\n\n  expect(addMilliseconds(date1, -1)).toEqual(date2);\n});\n\ntest('One millisecond before 3:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 9, 59, 59, 999));\n\n  expect(addMilliseconds(date1, -1)).toEqual(date2);\n});\n\ntest('One millisecond after 1:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 8, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 8, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 1:00 AM PST on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 9, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 9, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 2:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 10, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 1:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 8, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 8, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 2:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 9, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 9, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n\ntest('One millisecond after 3:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 10, 0, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 10, 0, 0, 1));\n\n  expect(addMilliseconds(date1, 1)).toEqual(date2);\n});\n"
  },
  {
    "path": "tests/addMinutes.spec.ts",
    "content": "import { expect, test, beforeAll } from 'vitest';\nimport { addMinutes } from '@/index.ts';\n\nbeforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\ntest('One minute after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('Two minutes after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 2));\n\n  expect(addMinutes(date1, 2)).toEqual(date2);\n});\n\ntest('Three minutes after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 3));\n\n  expect(addMinutes(date1, 3)).toEqual(date2);\n});\n\ntest('One minute after 1:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 9, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 9, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 2:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 3:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute before 1:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 8, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 7, 59));\n\n  expect(addMinutes(date1, -1)).toEqual(date2);\n});\n\ntest('One minute before 2:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 9, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 8, 59));\n\n  expect(addMinutes(date1, -1)).toEqual(date2);\n});\n\ntest('One minute before 3:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 9, 59));\n\n  expect(addMinutes(date1, -1)).toEqual(date2);\n});\n\ntest('One minute after 1:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 8, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 8, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 1:00 AM PST on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 9, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 9, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 2:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 10, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 1:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 8, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 8, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 2:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 9, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 9, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n\ntest('One minute after 3:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 10, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 10, 1));\n\n  expect(addMinutes(date1, 1)).toEqual(date2);\n});\n"
  },
  {
    "path": "tests/addMonths.spec.ts",
    "content": "import { expect, test, describe, beforeAll } from 'vitest';\nimport { addMonths } from '@/index.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\n\ndescribe('Local Time', () => {\n  beforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\n  test('One month after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 29, 10));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('Two months after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 2, 31, 9));\n\n    expect(addMonths(date1, 2)).toEqual(date2);\n  });\n\n  test('Three months after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 3, 30, 9));\n\n    expect(addMonths(date1, 3)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 9));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 10));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 10));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 7));\n\n    expect(addMonths(date1, -1)).toEqual(date2);\n  });\n\n  test('One month before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 8));\n\n    expect(addMonths(date1, -1)).toEqual(date2);\n  });\n\n  test('One month before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n    expect(addMonths(date1, -1)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 9));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 9));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 10));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 8));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n\n  test('One month after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 11));\n\n    expect(addMonths(date1, 1)).toEqual(date2);\n  });\n});\n\ndescribe('UTC Time', () => {\n  beforeAll(() => (process.env.TZ = 'Asia/Tokyo'));\n\n  test('One month after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 29, 10));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('Two months after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 2, 31, 10));\n\n    expect(addMonths(date1, 2, 'UTC')).toEqual(date2);\n  });\n\n  test('Three months after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 3, 30, 10));\n\n    expect(addMonths(date1, 3, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 9));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 10));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 11));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 8));\n\n    expect(addMonths(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 9));\n\n    expect(addMonths(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n    expect(addMonths(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 8));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 9));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 10));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 8));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 9));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One month after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n    expect(addMonths(date1, 1, 'UTC')).toEqual(date2);\n  });\n});\n\ndescribe('America/Los_Angeles', () => {\n  beforeAll(() => (process.env.TZ = 'Australia/Sydney'));\n\n  test('One month after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 1, 29, 10));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('Two months after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 2, 31, 9));\n\n    expect(addMonths(date1, 2, Los_Angeles)).toEqual(date2);\n  });\n\n  test('Three months after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2024, 3, 30, 9));\n\n    expect(addMonths(date1, 3, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 9));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 10));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2024, 2, 10, 10));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 7));\n\n    expect(addMonths(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 8));\n\n    expect(addMonths(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n    expect(addMonths(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 9));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 9));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 11, 3, 10));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 8));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 10));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One month after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2024, 10, 3, 11));\n\n    expect(addMonths(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n});\n"
  },
  {
    "path": "tests/addSeconds.spec.ts",
    "content": "import { expect, test, beforeAll } from 'vitest';\nimport { addSeconds } from '@/index.ts';\n\nbeforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\ntest('One second after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('Two seconds after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 0, 2));\n\n  expect(addSeconds(date1, 2)).toEqual(date2);\n});\n\ntest('Three seconds after 2:00 AM on January 31, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 0, 31, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 0, 31, 10, 0, 3));\n\n  expect(addSeconds(date1, 3)).toEqual(date2);\n});\n\ntest('One second after 1:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 9, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 9, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 2:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 3:00 AM on February 10, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 1, 10, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 1, 10, 10, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second before 1:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 8, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 7, 59, 59));\n\n  expect(addSeconds(date1, -1)).toEqual(date2);\n});\n\ntest('One second before 2:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 9, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 8, 59, 59));\n\n  expect(addSeconds(date1, -1)).toEqual(date2);\n});\n\ntest('One second before 3:00 AM on December 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 11, 3, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 11, 3, 9, 59, 59));\n\n  expect(addSeconds(date1, -1)).toEqual(date2);\n});\n\ntest('One second after 1:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 8, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 8, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 1:00 AM PST on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 9, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 9, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 2:00 AM on November 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 10, 3, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 10, 3, 10, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 1:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 8, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 8, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 2:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 9, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 9, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n\ntest('One second after 3:00 AM on October 3, 2024', () => {\n  const date1 = new Date(Date.UTC(2024, 9, 3, 10, 0, 0));\n  const date2 = new Date(Date.UTC(2024, 9, 3, 10, 0, 1));\n\n  expect(addSeconds(date1, 1)).toEqual(date2);\n});\n"
  },
  {
    "path": "tests/addYears.spec.ts",
    "content": "import { expect, test, describe, beforeAll } from 'vitest';\nimport { addYears } from '@/index.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\n\ndescribe('Local Time', () => {\n  beforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\n  test('One year after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2025, 0, 31, 10));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('Two years after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2026, 0, 31, 10));\n\n    expect(addYears(date1, 2)).toEqual(date2);\n  });\n\n  test('Three years after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2027, 0, 31, 10));\n\n    expect(addYears(date1, 3)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 9));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 10));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 11));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 8));\n\n    expect(addYears(date1, -1)).toEqual(date2);\n  });\n\n  test('One year before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 9));\n\n    expect(addYears(date1, -1)).toEqual(date2);\n  });\n\n  test('One year before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 10));\n\n    expect(addYears(date1, -1)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 9));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 9));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 10));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 8));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 9));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n\n  test('One year after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 10));\n\n    expect(addYears(date1, 1)).toEqual(date2);\n  });\n});\n\ndescribe('UTC Time', () => {\n  beforeAll(() => (process.env.TZ = 'Asia/Tokyo'));\n\n  test('One year after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2025, 0, 31, 10));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('Two years after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2026, 0, 31, 10));\n\n    expect(addYears(date1, 2, 'UTC')).toEqual(date2);\n  });\n\n  test('Three years after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2027, 0, 31, 10));\n\n    expect(addYears(date1, 3, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 9));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 10));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 11));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 8));\n\n    expect(addYears(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 9));\n\n    expect(addYears(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 10));\n\n    expect(addYears(date1, -1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 8));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 9));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 10));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 8));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 9));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n\n  test('One year after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 10));\n\n    expect(addYears(date1, 1, 'UTC')).toEqual(date2);\n  });\n});\n\ndescribe('America/Los_Angeles', () => {\n  beforeAll(() => (process.env.TZ = 'Australia/Sydney'));\n\n  test('One year after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2025, 0, 31, 10));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('Two years after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2026, 0, 31, 10));\n\n    expect(addYears(date1, 2, Los_Angeles)).toEqual(date2);\n  });\n\n  test('Three years after 2:00 AM on January 31, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 0, 31, 10));\n    const date2 = new Date(Date.UTC(2027, 0, 31, 10));\n\n    expect(addYears(date1, 3, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 9));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 9));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 10));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 10));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 3:00 AM on February 10, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 1, 10, 11));\n    const date2 = new Date(Date.UTC(2025, 1, 10, 11));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year before 1:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 8));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 8));\n\n    expect(addYears(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year before 2:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 9));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 9));\n\n    expect(addYears(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year before 3:00 AM on December 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 11, 3, 10));\n    const date2 = new Date(Date.UTC(2023, 11, 3, 10));\n\n    expect(addYears(date1, -1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 8));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 9));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM PST on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 9));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 9));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on November 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 10, 3, 10));\n    const date2 = new Date(Date.UTC(2025, 10, 3, 10));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 1:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 8));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 8));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 2:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 9));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 9));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n\n  test('One year after 3:00 AM on October 3, 2024', () => {\n    const date1 = new Date(Date.UTC(2024, 9, 3, 10));\n    const date2 = new Date(Date.UTC(2025, 9, 3, 10));\n\n    expect(addYears(date1, 1, Los_Angeles)).toEqual(date2);\n  });\n});\n"
  },
  {
    "path": "tests/compile.spec.ts",
    "content": "import { expect, test } from 'vitest';\nimport { compile } from '@/index.ts';\n\ntest('YYYY', () => {\n  const obj = ['YYYY', 'YYYY'];\n  expect(compile('YYYY')).toEqual(obj);\n});\n\ntest('Y', () => {\n  const obj = ['Y', 'Y'];\n  expect(compile('Y')).toEqual(obj);\n});\n\ntest('YYYY MMMM', () => {\n  const obj = ['YYYY MMMM', 'YYYY', ' ', 'MMMM'];\n  expect(compile('YYYY MMMM')).toEqual(obj);\n});\n\ntest('YYYY MMM', () => {\n  const obj = ['YYYY MMM', 'YYYY', ' ', 'MMM'];\n  expect(compile('YYYY MMM')).toEqual(obj);\n});\n\ntest('YYYY-MM', () => {\n  const obj = ['YYYY-MM', 'YYYY', '-', 'MM'];\n  expect(compile('YYYY-MM')).toEqual(obj);\n});\n\ntest('YYYY-M', () => {\n  const obj = ['YYYY-M', 'YYYY', '-', 'M'];\n  expect(compile('YYYY-M')).toEqual(obj);\n});\n\ntest('YYYY-MM-DD', () => {\n  const obj = ['YYYY-MM-DD', 'YYYY', '-', 'MM', '-', 'DD'];\n  expect(compile('YYYY-MM-DD')).toEqual(obj);\n});\n\ntest('YYYY-M-D', () => {\n  const obj = ['YYYY-M-D', 'YYYY', '-', 'M', '-', 'D'];\n  expect(compile('YYYY-M-D')).toEqual(obj);\n});\n\ntest('YYYY-MM-DD HH', () => {\n  const obj = ['YYYY-MM-DD HH', 'YYYY', '-', 'MM', '-', 'DD', ' ', 'HH'];\n  expect(compile('YYYY-MM-DD HH')).toEqual(obj);\n});\n\ntest('YYYY-M-D H', () => {\n  const obj = ['YYYY-M-D H', 'YYYY', '-', 'M', '-', 'D', ' ', 'H'];\n  expect(compile('YYYY-M-D H')).toEqual(obj);\n});\n\ntest('YYYY-M-D hh A', () => {\n  const obj = ['YYYY-M-D hh A', 'YYYY', '-', 'M', '-', 'D', ' ', 'hh', ' ', 'A'];\n  expect(compile('YYYY-M-D hh A')).toEqual(obj);\n});\n\ntest('YYYY-M-D h A', () => {\n  const obj = ['YYYY-M-D h A', 'YYYY', '-', 'M', '-', 'D', ' ', 'h', ' ', 'A'];\n  expect(compile('YYYY-M-D h A')).toEqual(obj);\n});\n\ntest('YYYY-MM-DD HH:mm', () => {\n  const obj = ['YYYY-MM-DD HH:mm', 'YYYY', '-', 'MM', '-', 'DD', ' ', 'HH', ':', 'mm'];\n  expect(compile('YYYY-MM-DD HH:mm')).toEqual(obj);\n});\n\ntest('YYYY-M-D H:m', () => {\n  const obj = ['YYYY-M-D H:m', 'YYYY', '-', 'M', '-', 'D', ' ', 'H', ':', 'm'];\n  expect(compile('YYYY-M-D H:m')).toEqual(obj);\n});\n\ntest('YYYY-MM-DD HH:mm:ss', () => {\n  const obj = ['YYYY-MM-DD HH:mm:ss', 'YYYY', '-', 'MM', '-', 'DD', ' ', 'HH', ':', 'mm', ':', 'ss'];\n  expect(compile('YYYY-MM-DD HH:mm:ss')).toEqual(obj);\n});\n\ntest('YYYY-M-D H:m:s', () => {\n  const obj = ['YYYY-M-D H:m:s', 'YYYY', '-', 'M', '-', 'D', ' ', 'H', ':', 'm', ':', 's'];\n  expect(compile('YYYY-M-D H:m:s')).toEqual(obj);\n});\n\ntest('YYYY-M-D H:m:s.SSS', () => {\n  const obj = ['YYYY-M-D H:m:s.SSS', 'YYYY', '-', 'M', '-', 'D', ' ', 'H', ':', 'm', ':', 's', '.', 'SSS'];\n  expect(compile('YYYY-M-D H:m:s.SSS')).toEqual(obj);\n});\n\ntest('YYYY-M-D H:m:s.SS', () => {\n  const obj = ['YYYY-M-D H:m:s.SS', 'YYYY', '-', 'M', '-', 'D', ' ', 'H', ':', 'm', ':', 's', '.', 'SS'];\n  expect(compile('YYYY-M-D H:m:s.SS')).toEqual(obj);\n});\n\ntest('YYYY-M-D H:m:s.S', () => {\n  const obj = ['YYYY-M-D H:m:s.S', 'YYYY', '-', 'M', '-', 'D', ' ', 'H', ':', 'm', ':', 's', '.', 'S'];\n  expect(compile('YYYY-M-D H:m:s.S')).toEqual(obj);\n});\n\ntest('MMDDHHmmssSSS', () => {\n  const obj = ['MMDDHHmmssSSS', 'MM', 'DD', 'HH', 'mm', 'ss', 'SSS'];\n  expect(compile('MMDDHHmmssSSS')).toEqual(obj);\n});\n\ntest('DDHHmmssSSS', () => {\n  const obj = ['DDHHmmssSSS', 'DD', 'HH', 'mm', 'ss', 'SSS'];\n  expect(compile('DDHHmmssSSS')).toEqual(obj);\n});\n\ntest('HHmmssSSS', () => {\n  const obj = ['HHmmssSSS', 'HH', 'mm', 'ss', 'SSS'];\n  expect(compile('HHmmssSSS')).toEqual(obj);\n});\n\ntest('mmssSSS', () => {\n  const obj = ['mmssSSS', 'mm', 'ss', 'SSS'];\n  expect(compile('mmssSSS')).toEqual(obj);\n});\n\ntest('ssSSS', () => {\n  const obj = ['ssSSS', 'ss', 'SSS'];\n  expect(compile('ssSSS')).toEqual(obj);\n});\n\ntest('SSS', () => {\n  const obj = ['SSS', 'SSS'];\n  expect(compile('SSS')).toEqual(obj);\n});\n\ntest('foo', () => {\n  const obj = ['foo', 'f', 'oo'];\n  expect(compile('foo')).toEqual(obj);\n});\n\ntest('bar', () => {\n  const obj = ['bar', 'b', 'a', 'r'];\n  expect(compile('bar')).toEqual(obj);\n});\n\ntest('YYYYMMDD', () => {\n  const obj = ['YYYYMMDD', 'YYYY', 'MM', 'DD'];\n  expect(compile('YYYYMMDD')).toEqual(obj);\n});\n\ntest('20150101235959', () => {\n  const obj = ['20150101235959', '2', '0', '1', '5', '0', '1', '0', '1', '2', '3', '5', '9', '5', '9'];\n  expect(compile('20150101235959')).toEqual(obj);\n});\n\ntest('YYYY?M?D H?m?s?S', () => {\n  const obj = ['YYYY?M?D H?m?s?S', 'YYYY', '?', 'M', '?', 'D', ' ', 'H', '?', 'm', '?', 's', '?', 'S'];\n  expect(compile('YYYY?M?D H?m?s?S')).toEqual(obj);\n});\n\ntest('[Y]YYYY[M]M[D]D[H]H[m]m[s]s[S]S', () => {\n  const obj = ['[Y]YYYY[M]M[D]D[H]H[m]m[s]s[S]S', '[Y]', 'YYYY', '[M]', 'M', '[D]', 'D', '[H]', 'H', '[m]', 'm', '[s]', 's', '[S]', 'S'];\n  expect(compile('[Y]YYYY[M]M[D]D[H]H[m]m[s]s[S]S')).toEqual(obj);\n});\n\ntest('[[Y]YYYY[M]MM[D]DD[H]HH[m]mm[s]ss[S]S]', () => {\n  const obj = ['[[Y]YYYY[M]MM[D]DD[H]HH[m]mm[s]ss[S]S]', '[[Y]YYYY[M]MM[D]DD[H]HH[m]mm[s]ss[S]S]'];\n  expect(compile('[[Y]YYYY[M]MM[D]DD[H]HH[m]mm[s]ss[S]S]')).toEqual(obj);\n});\n\ntest('                 ', () => {\n  const obj = ['                 ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '];\n  expect(compile('                 ')).toEqual(obj);\n});\n\ntest('[empty]', () => {\n  const obj = [''] as string[];\n  expect(compile('')).toEqual(obj);\n});\n\ntest('\\\\[YYYY-MM-DD\\\\]', () => {\n  const obj = ['\\\\[YYYY-MM-DD\\\\]', '[', 'YYYY', '-', 'MM', '-', 'DD', ']'];\n  expect(compile('\\\\[YYYY-MM-DD\\\\]')).toEqual(obj);\n});\n"
  },
  {
    "path": "tests/duration.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { Duration } from '@/index.ts';\n\ndescribe('Duration', () => {\n  test('toDays', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toDays().value).toBe(365 + 0.123456 / 24 / 60 / 60 / 1000);\n    expect(new Duration(duration).toDays().toParts()).toEqual({ nanoseconds: 456, microseconds: 123, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: 365 });\n  });\n\n  test('toHours', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toHours().value).toBe(365 * 24 + 0.123456 / 60 / 60 / 1000);\n    expect(new Duration(duration).toHours().toParts()).toEqual({ nanoseconds: 456, microseconds: 123, milliseconds: 0, seconds: 0, minutes: 0, hours: 365 * 24 });\n  });\n\n  test('toMinutes', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toMinutes().value).toBe(365 * 24 * 60 + 0.123456 / 60 / 1000);\n    expect(new Duration(duration).toMinutes().toParts()).toEqual({ nanoseconds: 456, microseconds: 123, milliseconds: 0, seconds: 0, minutes: 365 * 24 * 60 });\n  });\n\n  test('toSeconds', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toSeconds().value).toBe(365 * 24 * 60 * 60 + 0.123456 / 1000);\n    expect(new Duration(duration).toSeconds().toParts()).toEqual({ nanoseconds: 456, microseconds: 123, milliseconds: 0, seconds: 365 * 24 * 60 * 60 });\n  });\n\n  test('toMilliseconds', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toMilliseconds().value).toBe(365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toMilliseconds().toParts()).toEqual({ nanoseconds: 456, microseconds: 123, milliseconds: 365 * 24 * 60 * 60 * 1000 });\n  });\n\n  test('toMicroseconds', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toMicroseconds().value).toBe((365 * 24 * 60 * 60 * 1000 + 0.123456) * 1000);\n    expect(new Duration(duration).toMicroseconds().toParts()).toEqual({ nanoseconds: 456, microseconds: 365 * 24 * 60 * 60 * 1000 * 1000 + 123 });\n  });\n\n  test('toNanoseconds', () => {\n    const duration = 365 * 24 * 60 * 60 * 1000 + 0.123456;\n    expect(new Duration(duration).toNanoseconds().value).toBe((365 * 24 * 60 * 60 * 1000 + 0.123456) * 1000000);\n    expect(new Duration(duration).toNanoseconds().toParts()).toEqual({ nanoseconds: 365 * 24 * 60 * 60 * 1000 * 1000 * 1000 + 123 * 1000 + 456 });\n  });\n});\n\ndescribe('Duration (minus)', () => {\n  test('toDays', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toDays().value).toBe(-1 * (365 + 0.123456 / 24 / 60 / 60 / 1000));\n    expect(new Duration(duration).toDays().toParts()).toEqual({ nanoseconds: -456, microseconds: -123, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: -365 });\n  });\n\n  test('toHours', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toHours().value).toBe(-1 * (365 * 24 + 0.123456 / 60 / 60 / 1000));\n    expect(new Duration(duration).toHours().toParts()).toEqual({ nanoseconds: -456, microseconds: -123, milliseconds: 0, seconds: 0, minutes: 0, hours: -365 * 24 });\n  });\n\n  test('toMinutes', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toMinutes().value).toBe(-1 * (365 * 24 * 60 + 0.123456 / 60 / 1000));\n    expect(new Duration(duration).toMinutes().toParts()).toEqual({ nanoseconds: -456, microseconds: -123, milliseconds: 0, seconds: 0, minutes: -365 * 24 * 60 });\n  });\n\n  test('toSeconds', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toSeconds().value).toBe(-1 * (365 * 24 * 60 * 60 + 0.123456 / 1000));\n    expect(new Duration(duration).toSeconds().toParts()).toEqual({ nanoseconds: -456, microseconds: -123, milliseconds: 0, seconds: -365 * 24 * 60 * 60 });\n  });\n\n  test('toMilliseconds', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toMilliseconds().value).toBe(-1 * (365 * 24 * 60 * 60 * 1000 + 0.123456));\n    expect(new Duration(duration).toMilliseconds().toParts()).toEqual({ nanoseconds: -456, microseconds: -123, milliseconds: -365 * 24 * 60 * 60 * 1000 });\n  });\n\n  test('toMicroseconds', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toMicroseconds().value).toBe((-1 * (365 * 24 * 60 * 60 * 1000 + 0.123456) * 1000));\n    expect(new Duration(duration).toMicroseconds().toParts()).toEqual({ nanoseconds: -456, microseconds: -365 * 24 * 60 * 60 * 1000 * 1000 - 123 });\n  });\n\n  test('toNanoseconds', () => {\n    const duration = -1 * (365 * 24 * 60 * 60 * 1000 + 0.123456);\n    expect(new Duration(duration).toNanoseconds().value).toBe((-1 * (365 * 24 * 60 * 60 * 1000 + 0.123456) * 1000000));\n    expect(new Duration(duration).toNanoseconds().toParts()).toEqual({ nanoseconds: -365 * 24 * 60 * 60 * 1000 * 1000 * 1000 - 123 * 1000 - 456 });\n  });\n});\n\ndescribe('Duration (Negative Zero)', () => {\n  test('toDays', () => {\n    const duration = -0;\n    expect(new Duration(duration).toDays().format('DDD HH mm ss SSS fff FFF')).toBe('-000 00 00 00 000 000 000');\n    expect(new Duration(duration).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: 0 });\n  });\n\n  test('toHours', () => {\n    const duration = -0;\n    expect(new Duration(duration).toHours().format('DDD HH mm ss SSS fff FFF')).toBe('DDD -00 00 00 000 000 000');\n    expect(new Duration(duration).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0 });\n  });\n\n  test('toMinutes', () => {\n    const duration = -0;\n    expect(new Duration(duration).toMinutes().format('DDD HH mm ss SSS fff FFF')).toBe('DDD HH -00 00 000 000 000');\n    expect(new Duration(duration).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0 });\n  });\n\n  test('toSeconds', () => {\n    const duration = -0;\n    expect(new Duration(duration).toSeconds().format('DDD HH mm ss SSS fff FFF')).toBe('DDD HH mm -00 000 000 000');\n    expect(new Duration(duration).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0 });\n  });\n\n  test('toMilliseconds', () => {\n    const duration = -0;\n    expect(new Duration(duration).toMilliseconds().format('DDD HH mm ss SSS fff FFF')).toBe('DDD HH mm ss -000 000 000');\n    expect(new Duration(duration).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0 });\n  });\n\n  test('toMicroseconds', () => {\n    const duration = -0;\n    expect(new Duration(duration).toMicroseconds().format('DDD HH mm ss SSS fff FFF')).toBe('DDD HH mm ss SSS -000 000');\n    expect(new Duration(duration).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0 });\n  });\n\n  test('toNanoseconds', () => {\n    const duration = -0;\n    expect(new Duration(duration).toNanoseconds().format('DDD HH mm ss SSS fff FFF')).toBe('DDD HH mm ss SSS fff -000');\n    expect(new Duration(duration).toNanoseconds().toParts()).toEqual({ nanoseconds: 0 });\n  });\n});\n"
  },
  {
    "path": "tests/format.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { format, compile } from '@/index.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\nimport Tokyo from '@/timezones/Asia/Tokyo.ts';\nimport { Los_Angeles as los_angeles, Tokyo as tokyo } from '@/timezone.ts';\n\ndescribe('YYYY', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('0001', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'YYYY')).toBe('0001');\n  });\n\n  test('9999', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'YYYY')).toBe('9999');\n  });\n});\n\ndescribe('YY', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('01', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'YY')).toBe('01');\n  });\n\n  test('99', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'YY')).toBe('99');\n  });\n});\n\ndescribe('Y', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('1', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'Y')).toBe('1');\n  });\n\n  test('9999', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'Y')).toBe('9999');\n  });\n});\n\ndescribe('MMMM', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('January', () => {\n    const now = new Date(0, 1 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('January');\n  });\n\n  test('February', () => {\n    const now = new Date(0, 2 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('February');\n  });\n\n  test('March', () => {\n    const now = new Date(0, 3 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('March');\n  });\n\n  test('April', () => {\n    const now = new Date(0, 4 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('April');\n  });\n\n  test('May', () => {\n    const now = new Date(0, 5 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('May');\n  });\n\n  test('June', () => {\n    const now = new Date(0, 6 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('June');\n  });\n\n  test('July', () => {\n    const now = new Date(0, 7 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('July');\n  });\n\n  test('August', () => {\n    const now = new Date(0, 8 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('August');\n  });\n\n  test('September', () => {\n    const now = new Date(0, 9 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('September');\n  });\n\n  test('October', () => {\n    const now = new Date(0, 10 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('October');\n  });\n\n  test('November', () => {\n    const now = new Date(0, 11 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('November');\n  });\n\n  test('December', () => {\n    const now = new Date(0, 12 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMMM')).toBe('December');\n  });\n});\n\ndescribe('MMM', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('Jan', () => {\n    const now = new Date(0, 1 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Jan');\n  });\n\n  test('Feb', () => {\n    const now = new Date(0, 2 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Feb');\n  });\n\n  test('Mar', () => {\n    const now = new Date(0, 3 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Mar');\n  });\n\n  test('Apr', () => {\n    const now = new Date(0, 4 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Apr');\n  });\n\n  test('May', () => {\n    const now = new Date(0, 5 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('May');\n  });\n\n  test('Jun', () => {\n    const now = new Date(0, 6 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Jun');\n  });\n\n  test('Jul', () => {\n    const now = new Date(0, 7 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Jul');\n  });\n\n  test('Aug', () => {\n    const now = new Date(0, 8 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Aug');\n  });\n\n  test('Sep', () => {\n    const now = new Date(0, 9 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Sep');\n  });\n\n  test('Oct', () => {\n    const now = new Date(0, 10 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Oct');\n  });\n\n  test('Nov', () => {\n    const now = new Date(0, 11 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Nov');\n  });\n\n  test('Dec', () => {\n    const now = new Date(0, 12 - 1, 1, 0, 0, 0, 0);\n    expect(format(now, 'MMM')).toBe('Dec');\n  });\n});\n\ndescribe('MM', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('01', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'MM')).toBe('01');\n  });\n\n  test('12', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'MM')).toBe('12');\n  });\n});\n\ndescribe('M', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('1', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'M')).toBe('1');\n  });\n\n  test('12', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'M')).toBe('12');\n  });\n});\n\ndescribe('DD', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('01', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'DD')).toBe('01');\n  });\n\n  test('31', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'DD')).toBe('31');\n  });\n});\n\ndescribe('D', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('1', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'D')).toBe('1');\n  });\n\n  test('31', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'D')).toBe('31');\n  });\n});\n\ndescribe('dddd', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('Sunday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 0, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Sunday');\n  });\n\n  test('Monday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Monday');\n  });\n\n  test('Tuesday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 2, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Tuesday');\n  });\n\n  test('Wednesday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 3, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Wednesday');\n  });\n\n  test('Thursday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 4, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Thursday');\n  });\n\n  test('Friday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 5, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Friday');\n  });\n\n  test('Saturday', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 6, 0, 0, 0, 0);\n    expect(format(now, 'dddd')).toBe('Saturday');\n  });\n});\n\ndescribe('ddd', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('Sun', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 0, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Sun');\n  });\n\n  test('Mon', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Mon');\n  });\n\n  test('Tue', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 2, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Tue');\n  });\n\n  test('Wed', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 3, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Wed');\n  });\n\n  test('Thu', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 4, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Thu');\n  });\n\n  test('Fri', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 5, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Fri');\n  });\n\n  test('Sat', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 6, 0, 0, 0, 0);\n    expect(format(now, 'ddd')).toBe('Sat');\n  });\n});\n\ndescribe('dd', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('Su', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 0, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('Su');\n  });\n\n  test('Mo', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('Mo');\n  });\n\n  test('Tu', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 2, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('Tu');\n  });\n\n  test('We', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 3, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('We');\n  });\n\n  test('Th', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 4, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('Th');\n  });\n\n  test('Fr', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 5, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('Fr');\n  });\n\n  test('Sa', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 6, 0, 0, 0, 0);\n    expect(format(now, 'dd')).toBe('Sa');\n  });\n});\n\ndescribe('HH', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('00', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'HH', { hour24: 'h23' })).toBe('00');\n  });\n\n  test('23', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 23, 0, 0, 0);\n    expect(format(now, 'HH', { hour24: 'h23' })).toBe('23');\n  });\n\n  test('24', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'HH', { hour24: 'h24' })).toBe('24');\n  });\n});\n\ndescribe('H', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('0', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'H', { hour24: 'h23' })).toBe('0');\n  });\n\n  test('23', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 23, 0, 0, 0);\n    expect(format(now, 'H', { hour24: 'h23' })).toBe('23');\n  });\n\n  test('24', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'H', { hour24: 'h24' })).toBe('24');\n  });\n});\n\ndescribe('hh', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('00', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'hh', { hour12: 'h11' })).toBe('00');\n  });\n\n  test('11', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'hh', { hour12: 'h12' })).toBe('11');\n  });\n\n  test('12', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'hh', { hour12: 'h12' })).toBe('12');\n  });\n});\n\ndescribe('h', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('0', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'h', { hour12: 'h11' })).toBe('0');\n  });\n\n  test('11', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'h', { hour12: 'h12' })).toBe('11');\n  });\n\n  test('12', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'h', { hour12: 'h12' })).toBe('12');\n  });\n});\n\ndescribe('AA', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('A.M.', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'AA')).toBe('A.M.');\n  });\n\n  test('P.M.', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'AA')).toBe('P.M.');\n  });\n});\n\ndescribe('A', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('AM', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'A')).toBe('AM');\n  });\n\n  test('PM', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'A')).toBe('PM');\n  });\n});\n\ndescribe('aa', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('a.m.', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'aa')).toBe('a.m.');\n  });\n\n  test('p.m.', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'aa')).toBe('p.m.');\n  });\n});\n\ndescribe('a', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('am', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'a')).toBe('am');\n  });\n\n  test('pm', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'a')).toBe('pm');\n  });\n});\n\ndescribe('mm', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('00', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'mm')).toBe('00');\n  });\n\n  test('59', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'mm')).toBe('59');\n  });\n});\n\ndescribe('m', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('0', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'm')).toBe('0');\n  });\n\n  test('59', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'm')).toBe('59');\n  });\n});\n\ndescribe('ss', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('00', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'ss')).toBe('00');\n  });\n\n  test('59', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'ss')).toBe('59');\n  });\n});\n\ndescribe('s', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('0', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 's')).toBe('0');\n  });\n\n  test('59', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 's')).toBe('59');\n  });\n});\n\ndescribe('SSS', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('000', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'SSS')).toBe('000');\n  });\n\n  test('456', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 456);\n    expect(format(now, 'SSS')).toBe('456');\n  });\n\n  test('999', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'SSS')).toBe('999');\n  });\n});\n\ndescribe('SS', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('00', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'SS')).toBe('00');\n  });\n\n  test('45', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 456);\n    expect(format(now, 'SS')).toBe('45');\n  });\n\n  test('99', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'SS')).toBe('99');\n  });\n});\n\ndescribe('S', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('0', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 0);\n    expect(format(now, 'S')).toBe('0');\n  });\n\n  test('4', () => {\n    const now = new Date(0, 0 - (1900 - 1) * 12, 1, 0, 0, 0, 456);\n    expect(format(now, 'S')).toBe('4');\n  });\n\n  test('9', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'S')).toBe('9');\n  });\n});\n\ndescribe('ZZ', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('-08:00', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'ZZ', { timeZone: Los_Angeles })).toBe('-08:00');\n  });\n\n  test('+00:00', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'ZZ', { timeZone: 'UTC' })).toBe('+00:00');\n  });\n\n  test('+09:00', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'ZZ', { timeZone: Tokyo })).toBe('+09:00');\n  });\n});\n\ndescribe('Z', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('-0800', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'Z', { timeZone: Los_Angeles })).toBe('-0800');\n  });\n\n  test('+0000', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'Z', { timeZone: 'UTC' })).toBe('+0000');\n  });\n\n  test('+0900', () => {\n    const now = new Date(9999, 12 - 1, 31, 23, 59, 59, 999);\n    expect(format(now, 'Z', { timeZone: Tokyo })).toBe('+0900');\n  });\n});\n\ndescribe('comments', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('dddd, MMMM D, YYYY h A', () => {\n    const now = new Date(2000, 1 - 1, 1, 0, 0, 0);\n    expect(format(now, '[dddd, MMMM D, YYYY h A]')).toBe('dddd, MMMM D, YYYY h A');\n  });\n\n  test('dddd, January D, 2000 h AM', () => {\n    const now = new Date(2000, 1 - 1, 1, 0, 0, 0);\n    expect(format(now, '[dddd], MMMM [D], YYYY [h] A')).toBe('dddd, January D, 2000 h AM');\n  });\n\n  test('[dddd], MMMM [D], YYYY [h] A', () => {\n    const now = new Date(2000, 1 - 1, 1, 0, 0, 0);\n    expect(format(now, '[[dddd], MMMM [D], YYYY [h] A]')).toBe('[dddd], MMMM [D], YYYY [h] A');\n  });\n\n  test('dddd, January [D], YYYY 12 A', () => {\n    const now = new Date(2000, 1 - 1, 1, 0, 0, 0);\n    expect(format(now, '[dddd], MMMM [[D], YYYY] h [A]')).toBe('dddd, January [D], YYYY 12 A');\n  });\n});\n\ndescribe('compiledObj', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('\"ddd MMM DD YYYY HH:mm:ss\" equals to \"Thu Jan 01 2015 12:34:56\"', () => {\n    const now = new Date(2015, 0, 1, 12, 34, 56, 789);\n    expect(format(now, compile('ddd MMM DD YYYY HH:mm:ss'))).toBe('Thu Jan 01 2015 12:34:56');\n  });\n\n  test('\"YYYY/MM/DD HH:mm:ss.SSS\" equals to \"1900/01/01 00:00:00.000\"', () => {\n    const now = new Date(0, 0, 1);\n    expect(format(now, compile('YYYY/MM/DD HH:mm:ss.SSS'))).toBe('1900/01/01 00:00:00.000');\n  });\n\n  test('\"YY/MM/DD HH:mm:ss.SSS\" equals to \"00/01/01 00:00:00.000\"', () => {\n    const now = new Date(0, 0, 1);\n    expect(format(now, compile('YY/MM/DD HH:mm:ss.SSS'))).toBe('00/01/01 00:00:00.000');\n  });\n\n  test('\"Y/M/D H:m:s.SSS\" equals to \"999/1/1 0:0:0.000\"', () => {\n    const now = new Date(999, 0, 1);\n    expect(format(now, compile('Y/M/D H:m:s.SSS'))).toBe('999/1/1 0:0:0.000');\n  });\n\n  test('\"dddd, MMMM D, YYYY h A\" equals to \"Saturday, January 1, 2000 10 AM\"', () => {\n    const now = new Date(2000, 0, 1, 10, 0, 0);\n    expect(format(now, compile('dddd, MMMM D, YYYY h A'))).toBe('Saturday, January 1, 2000 10 AM');\n  });\n\n  test('\"[dddd, MMMM D, YYYY h A]\" equals to \"dddd, MMMM D, YYYY h A\"', () => {\n    const now = new Date(2000, 0, 1, 10, 0, 0);\n    expect(format(now, compile('[dddd, MMMM D, YYYY h A]'))).toBe('dddd, MMMM D, YYYY h A');\n  });\n\n  test('\"[dddd], MMMM [D], YYYY [h] A\" equals to \"dddd, January D, 2000 h AM\"', () => {\n    const now = new Date(2000, 0, 1, 10, 0, 0);\n    expect(format(now, compile('[dddd], MMMM [D], YYYY [h] A'))).toBe('dddd, January D, 2000 h AM');\n  });\n\n  test('\"[[dddd], MMMM [D], YYYY [h] A]\" equals to \"[dddd], MMMM [D], YYYY [h] A\"', () => {\n    const now = new Date(2000, 0, 1, 10, 0, 0);\n    expect(format(now, compile('[[dddd], MMMM [D], YYYY [h] A]'))).toBe('[dddd], MMMM [D], YYYY [h] A');\n  });\n\n  test('\"[dddd], MMMM [[D], YYYY] [h] A\" equals to \"dddd, January [D], YYYY h AM\"', () => {\n    const now = new Date(2000, 0, 1, 10, 0, 0);\n    expect(format(now, compile('[dddd], MMMM [[D], YYYY] [h] A'))).toBe('dddd, January [D], YYYY h AM');\n  });\n});\n\ndescribe('options', () => {\n  beforeAll(() => (process.env.TZ = 'UTC'));\n\n  test('hour12: h11', () => {\n    expect(format(new Date(2000, 1 - 1, 1, 0, 0, 0), 'h A', { hour12: 'h11' })).toBe('0 AM');\n    expect(format(new Date(2000, 1 - 1, 1, 11, 0, 0), 'h A', { hour12: 'h11' })).toBe('11 AM');\n    expect(format(new Date(2000, 1 - 1, 1, 12, 0, 0), 'h A', { hour12: 'h11' })).toBe('0 PM');\n    expect(format(new Date(2000, 1 - 1, 1, 23, 0, 0), 'h A', { hour12: 'h11' })).toBe('11 PM');\n  });\n\n  test('hour12: h12', () => {\n    expect(format(new Date(2000, 1 - 1, 1, 0, 0, 0), 'h A', { hour12: 'h12' })).toBe('12 AM');\n    expect(format(new Date(2000, 1 - 1, 1, 11, 0, 0), 'h A', { hour12: 'h12' })).toBe('11 AM');\n    expect(format(new Date(2000, 1 - 1, 1, 12, 0, 0), 'h A', { hour12: 'h12' })).toBe('12 PM');\n    expect(format(new Date(2000, 1 - 1, 1, 23, 0, 0), 'h A', { hour12: 'h12' })).toBe('11 PM');\n  });\n\n  test('hour24: h23', () => {\n    expect(format(new Date(2000, 1 - 1, 1, 0, 0, 0), 'H', { hour24: 'h23' })).toBe('0');\n    expect(format(new Date(2000, 1 - 1, 1, 11, 0, 0), 'H', { hour24: 'h23' })).toBe('11');\n    expect(format(new Date(2000, 1 - 1, 1, 12, 0, 0), 'H', { hour24: 'h23' })).toBe('12');\n    expect(format(new Date(2000, 1 - 1, 1, 23, 0, 0), 'H', { hour24: 'h23' })).toBe('23');\n  });\n\n  test('hour24: h24', () => {\n    expect(format(new Date(2000, 1 - 1, 1, 0, 0, 0), 'H', { hour24: 'h24' })).toBe('24');\n    expect(format(new Date(2000, 1 - 1, 1, 11, 0, 0), 'H', { hour24: 'h24' })).toBe('11');\n    expect(format(new Date(2000, 1 - 1, 1, 12, 0, 0), 'H', { hour24: 'h24' })).toBe('12');\n    expect(format(new Date(2000, 1 - 1, 1, 23, 0, 0), 'H', { hour24: 'h24' })).toBe('23');\n  });\n\n  test('calendar: buddhist', () => {\n    expect(format(new Date(1, 0 - (1900 + 543) * 12, 1, 0, 0, 0), 'YYYY-MM-DD HH', { calendar: 'buddhist' })).toBe('0001-01-01 00');\n    expect(format(new Date(1, 0 - 1900 * 12, 1, 0, 0, 0), 'YYYY-MM-DD HH', { calendar: 'buddhist' })).toBe('0544-01-01 00');\n    expect(format(new Date(9456, 1 - 1, 1, 0, 0, 0), 'YYYY-MM-DD HH', { calendar: 'buddhist' })).toBe('9999-01-01 00');\n\n    expect(format(new Date(1, 0 - (1900 + 543) * 12, 1, 0, 0, 0), 'YY-MM-DD HH', { calendar: 'buddhist' })).toBe('01-01-01 00');\n    expect(format(new Date(1, 0 - 1900 * 12, 1, 0, 0, 0), 'YY-MM-DD HH', { calendar: 'buddhist' })).toBe('44-01-01 00');\n    expect(format(new Date(9456, 1 - 1, 1, 0, 0, 0), 'YY-MM-DD HH', { calendar: 'buddhist' })).toBe('99-01-01 00');\n\n    expect(format(new Date(1, 0 - (1900 + 543) * 12, 1, 0, 0, 0), 'Y-MM-DD HH', { calendar: 'buddhist' })).toBe('1-01-01 00');\n    expect(format(new Date(1, 0 - 1900 * 12, 1, 0, 0, 0), 'Y-MM-DD HH', { calendar: 'buddhist' })).toBe('544-01-01 00');\n    expect(format(new Date(9456, 1 - 1, 1, 0, 0, 0), 'Y-MM-DD HH', { calendar: 'buddhist' })).toBe('9999-01-01 00');\n  });\n\n  test('timeZone', () => {\n    const now = new Date(2025, 1 - 1, 1, 0);\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: Los_Angeles })).toBe('2024-12-31 16:00:00.000 -0800 Tu');\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: los_angeles })).toBe('2024-12-31 16:00:00.000 -0800 Tu');\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: 'America/Los_Angeles' })).toBe('2024-12-31 16:00:00.000 -0800 Tu');\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: Tokyo })).toBe('2025-01-01 09:00:00.000 +0900 We');\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: tokyo })).toBe('2025-01-01 09:00:00.000 +0900 We');\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: 'Asia/Tokyo' })).toBe('2025-01-01 09:00:00.000 +0900 We');\n    expect(format(now, 'YYYY-MM-DD HH:mm:ss.SSS Z dd', { timeZone: 'UTC' })).toBe('2025-01-01 00:00:00.000 +0000 We');\n  });\n});\n\ndescribe('timeZone DST', () => {\n  beforeAll(() => (process.env.TZ = 'America/Los_Angeles'));\n\n  test('before DST', () => {\n    const dateObj = new Date(2021, 2, 14, 1, 59, 59, 999);\n    const dateString = '2021-03-14 01:59:59.999 UTC-0800';\n    expect(format(dateObj, 'YYYY-MM-DD HH:mm:ss.SSS [UTC]Z')).toBe(dateString);\n  });\n\n  test('start of DST', () => {\n    const dateObj = new Date(2021, 2, 14, 2, 0, 0, 0);\n    const dateString = '2021-03-14 03:00:00.000 UTC-0700';\n    expect(format(dateObj, 'YYYY-MM-DD HH:mm:ss.SSS [UTC]Z')).toBe(dateString);\n  });\n\n  test('before of PST', () => {\n    const dateObj = new Date(2021, 10, 7, 1, 59, 59, 999);\n    const dateString = '2021-11-07 01:59:59.999 UTC-0700';\n    expect(format(dateObj, 'YYYY-MM-DD HH:mm:ss.SSS [UTC]Z')).toBe(dateString);\n  });\n\n  test('end of DST', () => {\n    const dateObj = new Date(2021, 10, 7, 2, 0, 0, 0);\n    const dateString = '2021-11-07 02:00:00.000 UTC-0800';\n    expect(format(dateObj, 'YYYY-MM-DD HH:mm:ss.SSS [UTC]Z')).toBe(dateString);\n  });\n\n  test('after of DST', () => {\n    const dateObj = new Date(2021, 10, 7, 3, 0, 0, 0);\n    const dateString = '2021-11-07 03:00:00.000 UTC-0800';\n    expect(format(dateObj, 'YYYY-MM-DD HH:mm:ss.SSS [UTC]Z')).toBe(dateString);\n  });\n});\n"
  },
  {
    "path": "tests/isValid.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { isValid, compile, format } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ntest('2014-12-31 12:34:56.789 is valid', () => {\n  expect(isValid('20141231123456789', 'YYYYMMDDHHmmssSSS')).toBe(true);\n  expect(isValid('20141231123456789', compile('YYYYMMDDHHmmssSSS'))).toBe(true);\n});\n\ntest('2012-2-29 is valid', () => {\n  expect(isValid('2012-2-29', 'YYYY-M-D')).toBe(true);\n  expect(isValid('2012-2-29', compile('YYYY-M-D'))).toBe(true);\n});\n\ntest('2100-2-29 is invalid', () => {\n  expect(isValid('2100-2-29', 'YYYY-M-D')).toBe(false);\n  expect(isValid('2100-2-29', compile('YYYY-M-D'))).toBe(false);\n});\n\ntest('2000-2-29 is valid', () => {\n  expect(isValid('2000-2-29', 'YYYY-M-D')).toBe(true);\n  expect(isValid('2000-2-29', compile('YYYY-M-D'))).toBe(true);\n});\n\ntest('2014-2-29 is invalid', () => {\n  expect(isValid('2014-2-29', 'YYYY-M-D')).toBe(false);\n  expect(isValid('2014-2-29', compile('YYYY-M-D'))).toBe(false);\n});\n\ntest('2014-2-28 is valid', () => {\n  expect(isValid('2014-2-28', 'YYYY-M-D')).toBe(true);\n  expect(isValid('2014-2-28', compile('YYYY-M-D'))).toBe(true);\n});\n\ntest('2014-4-31 is invalid', () => {\n  expect(isValid('2014-4-31', 'YYYY-M-D')).toBe(false);\n  expect(isValid('2014-4-31', compile('YYYY-M-D'))).toBe(false);\n});\n\ntest('24:00 is invalid', () => {\n  expect(isValid('2014-4-30 24:00', 'YYYY-M-D H:m')).toBe(false);\n  expect(isValid('2014-4-30 24:00', compile('YYYY-M-D H:m'))).toBe(false);\n});\n\ntest('13:00 PM is invalid', () => {\n  expect(isValid('2014-4-30 13:00 PM', 'YYYY-M-D h:m A')).toBe(false);\n  expect(isValid('2014-4-30 13:00 PM', compile('YYYY-M-D h:m A'))).toBe(false);\n});\n\ntest('23:60 is invalid', () => {\n  expect(isValid('2014-4-30 23:60', 'YYYY-M-D H:m')).toBe(false);\n  expect(isValid('2014-4-30 23:60', compile('YYYY-M-D H:m'))).toBe(false);\n});\n\ntest('23:59:60 is invalid', () => {\n  expect(isValid('2014-4-30 23:59:60', 'YYYY-M-D H:m:s')).toBe(false);\n  expect(isValid('2014-4-30 23:59:60', compile('YYYY-M-D H:m:s'))).toBe(false);\n});\n\ntest('All zero is invalid', () => {\n  expect(isValid('00000000000000000', 'YYYYMMDDHHmmssSSS')).toBe(false);\n  expect(isValid('00000000000000000', compile('YYYYMMDDHHmmssSSS'))).toBe(false);\n});\n\ntest('All nine is invalid', () => {\n  expect(isValid('99999999999999999', 'YYYYMMDDHHmmssSSS')).toBe(false);\n  expect(isValid('99999999999999999', compile('YYYYMMDDHHmmssSSS'))).toBe(false);\n});\n\ntest('foo is invalid', () => {\n  expect(isValid('20150101235959', 'foo')).toBe(false);\n  expect(isValid('20150101235959', compile('foo'))).toBe(false);\n});\n\ntest('bar is invalid', () => {\n  expect(isValid('20150101235959', 'bar')).toBe(false);\n  expect(isValid('20150101235959', compile('bar'))).toBe(false);\n});\n\ntest('YYYYMMDD is invalid', () => {\n  expect(isValid('20150101235959', 'YYYYMMDD')).toBe(false);\n  expect(isValid('20150101235959', compile('YYYYMMDD'))).toBe(false);\n});\n\ntest('20150101235959 is invalid', () => {\n  expect(isValid('20150101235959', '20150101235959')).toBe(false);\n  expect(isValid('20150101235959', compile('20150101235959'))).toBe(false);\n});\n\ndescribe('options', () => {\n  test('hour12: h11', () => {\n    expect(isValid('2000-01-01 00:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toBe(true);\n    expect(isValid('2000-01-01 11:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toBe(true);\n    expect(isValid('2000-01-01 00:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toBe(true);\n    expect(isValid('2000-01-01 11:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toBe(true);\n\n    expect(isValid('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toBe(false);\n    expect(isValid('2000-01-01 12:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toBe(false);\n  });\n\n  test('hour12: h12', () => {\n    expect(isValid('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toBe(true);\n    expect(isValid('2000-01-01 11:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toBe(true);\n    expect(isValid('2000-01-01 12:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toBe(true);\n    expect(isValid('2000-01-01 11:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toBe(true);\n\n    expect(isValid('2000-01-01 00:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toBe(false);\n    expect(isValid('2000-01-01 00:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toBe(false);\n  });\n\n  test('hour24: h23', () => {\n    expect(isValid('2000-01-01 00:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toBe(true);\n    expect(isValid('2000-01-01 01:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toBe(true);\n    expect(isValid('2000-01-01 23:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toBe(true);\n\n    expect(isValid('2000-01-01 24:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toBe(false);\n  });\n\n  test('hour24: h24', () => {\n    expect(isValid('2000-01-01 00:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toBe(false);\n\n    expect(isValid('2000-01-01 01:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toBe(true);\n    expect(isValid('2000-01-01 23:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toBe(true);\n    expect(isValid('2000-01-01 24:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toBe(true);\n  });\n\n  test('ignoreCase: true', () => {\n    expect(isValid('2025 May 4 Sunday 11 AM', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toBe(true);\n    expect(isValid('2025 may 4 sunday 11 am', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toBe(true);\n    expect(isValid('2025 MAY 4 SUNDAY 11 AM', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toBe(true);\n  });\n\n  test('calendar: buddhist', () => {\n    expect(isValid('9999-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toBe(true);\n    expect(isValid('0544-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toBe(true);\n    expect(isValid('0543-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toBe(false);\n  });\n\n  test('timeZone: min', () => {\n    process.env.TZ = 'America/Metlakatla';\n    const dateString = format(new Date(-3225223728000), 'YYYY-MM-DD[T]HH:mm:ss ZZ');\n    expect(isValid(dateString, 'YYYY-MM-DD[T]HH:mm:ss ZZ')).toBe(true);\n  });\n\n  test('timeZone: max', () => {\n    process.env.TZ = 'Asia/Manila';\n    const dateString = format(new Date(-3944621033000), 'YYYY-MM-DD[T]HH:mm:ss ZZ');\n    expect(isValid(dateString, 'YYYY-MM-DD[T]HH:mm:ss ZZ')).toBe(true);\n  });\n\n  test('defaultDate: year for leap day validation', () => {\n    expect(isValid('02-29', 'MM-DD', { defaultDate: { Y: 2024 } })).toBe(true);\n    expect(isValid('02-29', 'MM-DD', { defaultDate: { Y: 2023 } })).toBe(false);\n    expect(isValid('02-29', 'MM-DD')).toBe(false); // defaults to 1970 (non-leap year)\n  });\n\n  test('defaultDate: month for day range validation', () => {\n    expect(isValid('29', 'D', { defaultDate: { Y: 2024, M: 2 } })).toBe(true);\n    expect(isValid('29', 'D', { defaultDate: { Y: 2023, M: 2 } })).toBe(false);\n    expect(isValid('31', 'D', { defaultDate: { Y: 2024, M: 4 } })).toBe(false); // April has 30 days\n  });\n\n  test('defaultDate: timezone offset (Z) validation', () => {\n    expect(isValid('12:00', 'HH:mm', { defaultDate: { Y: 2024, M: 1, D: 1, Z: 0 } })).toBe(true);\n    expect(isValid('12:00', 'HH:mm', { defaultDate: { Y: 2024, M: 1, D: 1, Z: -999 } })).toBe(false);\n  });\n\n  test('defaultDate: H out of range', () => {\n    expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1, H: 25 } })).toBe(false);\n    expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1, H: 0 } })).toBe(true);\n  });\n\n  test('defaultDate: H not in format with hour24: h24 (regression)', () => {\n    expect(isValid('30', 'mm', { defaultDate: { Y: 2024, M: 1, D: 1 }, hour24: 'h24' })).toBe(true);\n  });\n});\n"
  },
  {
    "path": "tests/locales/ar.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ar.ts';\n\nconst locale = {\n  MMMM: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  MMM: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  dddd: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  ddd: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  dd: ['أح', 'اث', 'ثل', 'أر', 'خم', 'جم', 'سب'],\n  A: ['ص', 'م'],\n  AA: ['ص', 'م'],\n  a: ['ص', 'م'],\n  aa: ['ص', 'م']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/az.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/az.ts';\n\nconst locale = {\n  MMMM: ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'],\n  MMM: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'],\n  dddd: ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'],\n  ddd: ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'],\n  dd: ['7', '1', '2', '3', '4', '5', '6'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/bn.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/bn.ts';\n\nconst locale = {\n  MMMM: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  MMM: ['জানু', 'ফেব', 'মার্চ', 'এপ্রি', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ', 'অক্টো', 'নভে', 'ডিসে'],\n  dddd: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],\n  ddd: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],\n  dd: ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/cs.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/cs.ts';\n\nconst locale = {\n  MMMM: [\n    ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'],\n    ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince']\n  ],\n  MMM: [\n    ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'],\n    ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro']\n  ],\n  dddd: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],\n  ddd: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],\n  dd: ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],\n  A: ['dop.', 'odp.'],\n  AA: ['dop.', 'odp.'],\n  a: ['dop.', 'odp.'],\n  aa: ['dop.', 'odp.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM D', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM D ignoreCase', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM D', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM D ignoreCase', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/da.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/da.ts';\n\nconst locale = {\n  MMMM: ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],\n  MMM: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  dddd: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  ddd: ['søn.', 'man.', 'tirs.', 'ons.', 'tors.', 'fre.', 'lør.'],\n  dd: ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/de.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/de.ts';\n\nconst locale = {\n  MMMM: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  MMM: ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'],\n  dddd: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  ddd: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],\n  dd: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/el.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/el.ts';\n\nconst locale = {\n  MMMM: [\n    ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'],\n    ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου']\n  ],\n  MMM: ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαΐ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'],\n  dddd: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],\n  ddd: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],\n  dd: ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πε', 'Πα', 'Σα'],\n  A: ['ΠΜ', 'ΜΜ'],\n  AA: ['Π.Μ.', 'Μ.Μ.'],\n  a: ['πμ', 'μμ'],\n  aa: ['π.μ.', 'μ.μ.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM D ignoreCase', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/en.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/en.ts';\n\nconst locale = {\n  MMMM: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  MMM: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  dddd: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  ddd: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  dd: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/es.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/es.ts';\n\nconst locale = {\n  MMMM: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  MMM: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sept', 'oct', 'nov', 'dic'],\n  dddd: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  ddd: ['dom', 'lun', 'mar', 'mié', 'jue', 'vie', 'sáb'],\n  dd: ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/fa.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/fa.ts';\n\nconst locale = {\n  MMMM: ['دی', 'بهمن', 'اسفند', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر'],\n  MMM: ['دی', 'بهمن', 'اسفند', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر'],\n  dddd: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  ddd: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  dd: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  A: ['قبل‌ازظهر', 'بعدازظهر'],\n  AA: ['قبل‌ازظهر', 'بعدازظهر'],\n  a: ['قبل‌ازظهر', 'بعدازظهر'],\n  aa: ['قبل‌ازظهر', 'بعدازظهر']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/fi.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/fi.ts';\n\nconst locale = {\n  MMMM: [\n    ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'],\n    ['tammikuuta', 'helmikuuta', 'maaliskuuta', 'huhtikuuta', 'toukokuuta', 'kesäkuuta', 'heinäkuuta', 'elokuuta', 'syyskuuta', 'lokakuuta', 'marraskuuta', 'joulukuuta']\n  ],\n  MMM: [\n    ['tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'],\n    ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']\n  ],\n  dddd: ['sunnuntai', 'maanantaina', 'tiistaina', 'keskiviikkona', 'torstaina', 'perjantaina', 'lauantaina'],\n  ddd: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],\n  dd: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],\n  A: ['ap.', 'ip.'],\n  AA: ['ap.', 'ip.'],\n  a: ['ap.', 'ip.'],\n  aa: ['ap.', 'ip.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM D', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM D ignoreCase', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM D', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM D ignoreCase', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/fr.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/fr.ts';\n\nconst locale = {\n  MMMM: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  MMM: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  dddd: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  ddd: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  dd: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/he.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/he.ts';\n\nconst locale = {\n  MMMM: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],\n  MMM: ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],\n  dddd: ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],\n  ddd: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],\n  dd: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/hi.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/hi.ts';\n\nconst locale = {\n  MMMM: ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'],\n  MMM: ['जन॰', 'फ़र॰', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुल॰', 'अग॰', 'सित॰', 'अक्तू॰', 'नव॰', 'दिस॰'],\n  dddd: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],\n  ddd: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],\n  dd: ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/hu.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/hu.ts';\n\nconst locale = {\n  MMMM: ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'],\n  MMM: ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'],\n  dddd: ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'],\n  ddd: ['vas', 'hét', 'kedd', 'sze', 'csüt', 'pén', 'szo'],\n  dd: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],\n  A: ['DE', 'DU'],\n  AA: ['DE.', 'DU.'],\n  a: ['de', 'du'],\n  aa: ['de.', 'du.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/id.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/id.ts';\n\nconst locale = {\n  MMMM: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  MMM: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],\n  dddd: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  ddd: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  dd: ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/it.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/it.ts';\n\nconst locale = {\n  MMMM: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],\n  MMM: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],\n  dddd: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],\n  ddd: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],\n  dd: ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/ja.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ja.ts';\n\nconst locale = {\n  MMMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  dddd: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],\n  ddd: ['日', '月', '火', '水', '木', '金', '土'],\n  dd: ['日', '月', '火', '水', '木', '金', '土'],\n  A: ['午前', '午後'],\n  AA: ['午前', '午後'],\n  a: ['午前', '午後'],\n  aa: ['午前', '午後']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/ko.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ko.ts';\n\nconst locale = {\n  MMMM: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  MMM: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  dddd: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],\n  ddd: ['일', '월', '화', '수', '목', '금', '토'],\n  dd: ['일', '월', '화', '수', '목', '금', '토'],\n  A: ['오전', '오후'],\n  AA: ['오전', '오후'],\n  a: ['오전', '오후'],\n  aa: ['오전', '오후']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/ms.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ms.ts';\n\nconst locale = {\n  MMMM: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  MMM: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  dddd: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  ddd: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  dd: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  A: ['PG', 'PTG'],\n  AA: ['PG', 'PTG'],\n  a: ['PG', 'PTG'],\n  aa: ['PG', 'PTG']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/my.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/my.ts';\n\nconst locale = {\n  MMMM: ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'ဩဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'],\n  MMM: ['ဇန်', 'ဖေ', 'မတ်', 'ဧ', 'မေ', 'ဇွန်', 'ဇူ', 'ဩ', 'စက်', 'အောက်', 'နို', 'ဒီ'],\n  dddd: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  ddd: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  dd: ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],\n  A: ['နံနက်', 'ညနေ'],\n  AA: ['နံနက်', 'ညနေ'],\n  a: ['နံနက်', 'ညနေ'],\n  aa: ['နံနက်', 'ညနေ']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/nl.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/nl.ts';\n\nconst locale = {\n  MMMM: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  MMM: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  dddd: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  ddd: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  dd: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/no.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/no.ts';\n\nconst locale = {\n  MMMM: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  MMM: ['jan.', 'feb.', 'mars', 'apr.', 'mai', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],\n  dddd: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  ddd: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  dd: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/pl.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/pl.ts';\n\nconst locale = {\n  MMMM: [\n    ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'],\n    ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia']\n  ],\n  MMM: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],\n  dddd: ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'],\n  ddd: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],\n  dd: ['ndz.', 'pn.', 'wt.', 'śr.', 'cz.', 'pt.', 'so.'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM D ignoreCase', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/pt-BR.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/pt-BR.ts';\n\nconst locale = {\n  MMMM: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  MMM: ['jan.', 'fev.', 'mar.', 'abr.', 'mai.', 'jun.', 'jul.', 'ago.', 'set.', 'out.', 'nov.', 'dez.'],\n  dddd: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  ddd: ['dom.', 'seg.', 'ter.', 'qua.', 'qui.', 'sex.', 'sáb.'],\n  dd: ['1ª', '2ª', '3ª', '4ª', '5ª', '6ª', '7ª'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/pt-PT.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/pt-PT.ts';\n\nconst locale = {\n  MMMM: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  MMM: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n  dddd: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  ddd: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  dd: ['Do', '2ª', '3ª', '4ª', '5ª', '6ª', 'Sa'],\n  A: ['da manhã', 'da tarde'],\n  AA: ['da manhã', 'da tarde'],\n  a: ['da manhã', 'da tarde'],\n  aa: ['da manhã', 'da tarde']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/ro.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ro.ts';\n\nconst locale = {\n  MMMM: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  MMM: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  dddd: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  ddd: ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],\n  dd: ['du', 'lu', 'ma', 'mi', 'jo', 'vi', 'sâ'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/ru.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ru.ts';\n\nconst locale = {\n  MMMM: [\n    ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n    ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря']\n  ],\n  MMM: [\n    ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n    ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.']\n  ],\n  dddd: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  ddd: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  dd: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM D', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM D ignoreCase', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM D', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM D ignoreCase', () => {\n    locale.MMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/rw.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/rw.ts';\n\nconst locale = {\n  MMMM: ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicurasi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeri', 'Ukwakira', 'Ugushyingo', 'Ukuboza'],\n  MMM: ['mut.', 'gas.', 'wer.', 'mat.', 'gic.', 'kam.', 'nya.', 'kan.', 'nze.', 'ukw.', 'ugu.', 'uku.'],\n  dddd: ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'],\n  ddd: ['cyu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  dd: ['cyu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/sr-Cyrl.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/sr-Cyrl.ts';\n\nconst locale = {\n  MMMM: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  MMM: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'нов', 'дец'],\n  dddd: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],\n  ddd: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  dd: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/sr-Latn.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/sr-Latn.ts';\n\nconst locale = {\n  MMMM: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  MMM: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  dddd: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  ddd: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  dd: ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/sv.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/sv.ts';\n\nconst locale = {\n  MMMM: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],\n  MMM: ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  dddd: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],\n  ddd: ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],\n  dd: ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'],\n  A: ['fm', 'em'],\n  AA: ['fm', 'em'],\n  a: ['fm', 'em'],\n  aa: ['fm', 'em']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/ta.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/ta.ts';\n\nconst locale = {\n  MMMM: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  MMM: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  dddd: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  ddd: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  dd: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  A: ['AM', 'PM'],\n  AA: ['A.M.', 'P.M.'],\n  a: ['am', 'pm'],\n  aa: ['a.m.', 'p.m.']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/th.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/th.ts';\n\nconst locale = {\n  MMMM: ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'],\n  MMM: ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'],\n  dddd: ['วันอาทิตย์', 'วันจันทร์', 'วันอังคาร', 'วันพุธ', 'วันพฤหัสบดี', 'วันศุกร์', 'วันเสาร์'],\n  ddd: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],\n  dd: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],\n  A: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  AA: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  a: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  aa: ['ก่อนเที่ยง', 'หลังเที่ยง']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/tr.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/tr.ts';\n\nconst locale = {\n  MMMM: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],\n  MMM: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],\n  dddd: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],\n  ddd: ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],\n  dd: ['Pz', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'],\n  A: ['ÖÖ', 'ÖS'],\n  AA: ['ÖÖ', 'ÖS'],\n  a: ['ÖÖ', 'ÖS'],\n  aa: ['ÖÖ', 'ÖS']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/uk.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/uk.ts';\n\nconst locale = {\n  MMMM: [\n    ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'],\n    ['січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня']\n  ],\n  MMM: ['січ.', 'лют.', 'бер.', 'квіт.', 'трав.', 'черв.', 'лип.', 'серп.', 'вер.', 'жовт.', 'лист.', 'груд.'],\n  dddd: ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'пʼятниця', 'субота'],\n  ddd: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  dd: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  A: ['дп', 'пп'],\n  AA: ['дп', 'пп'],\n  a: ['дп', 'пп'],\n  aa: ['дп', 'пп']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM D', { locale: lo })).toBe(`${v} 1`);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM[0].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMMM D', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM D ignoreCase', () => {\n    locale.MMMM[1].forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(`${v} 1`, 'MMMM D', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/uz-Cyrl.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/uz-Cyrl.ts';\n\nconst locale = {\n  MMMM: ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'],\n  MMM: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  dddd: ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'],\n  ddd: ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'],\n  dd: ['Як', 'Ду', 'Се', 'Чо', 'Па', 'Жу', 'Ша'],\n  A: ['ТО', 'ТК'],\n  AA: ['ТО', 'ТК'],\n  a: ['ТО', 'ТК'],\n  aa: ['ТО', 'ТК']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/uz-Latn.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/uz-Latn.ts';\n\nconst locale = {\n  MMMM: ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avgust', 'sentabr', 'oktabr', 'noyabr', 'dekabr'],\n  MMM: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avg', 'sen', 'okt', 'noy', 'dek'],\n  dddd: ['yakshanba', 'dushanba', 'seshanba', 'chorshanba', 'payshanba', 'juma', 'shanba'],\n  ddd: ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'],\n  dd: ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'],\n  A: ['TO', 'TK'],\n  AA: ['TO', 'TK'],\n  a: ['TO', 'TK'],\n  aa: ['TO', 'TK']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/vi.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/vi.ts';\n\nconst locale = {\n  MMMM: ['tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8', 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'],\n  MMM: ['thg 1', 'thg 2', 'thg 3', 'thg 4', 'thg 5', 'thg 6', 'thg 7', 'thg 8', 'thg 9', 'thg 10', 'thg 11', 'thg 12'],\n  dddd: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n  ddd: ['CN', 'Th 2', 'Th 3', 'Th 4', 'Th 5', 'Th 6', 'Th 7'],\n  dd: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n  A: ['SA', 'CH'],\n  AA: ['SA', 'CH'],\n  a: ['SA', 'CH'],\n  aa: ['SA', 'CH']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/zh-Hans.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/zh-Hans.ts';\n\nconst locale = {\n  MMMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  dddd: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  ddd: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  dd: ['日', '一', '二', '三', '四', '五', '六'],\n  A: ['上午', '下午'],\n  AA: ['上午', '下午'],\n  a: ['上午', '下午'],\n  aa: ['上午', '下午']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/locales/zh-Hant.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nimport lo from '@/locales/zh-Hant.ts';\n\nconst locale = {\n  MMMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MMM: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  dddd: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  ddd: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  dd: ['日', '一', '二', '三', '四', '五', '六'],\n  A: ['上午', '下午'],\n  AA: ['上午', '下午'],\n  a: ['上午', '下午'],\n  aa: ['上午', '下午']\n};\n\ndescribe('formatter', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(format(d, 'MMM', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'ddd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach((v, i) => {\n      const d = new Date(1970, 0, i + 4);\n      expect(format(d, 'dd', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'A', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'AA', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'a', { locale: lo })).toBe(v);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(format(d, 'aa', { locale: lo })).toBe(v);\n    });\n  });\n});\n\ndescribe('parser', () => {\n  test('MMMM', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMMM ignoreCase', () => {\n    locale.MMMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('MMM', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('MMM ignoreCase', () => {\n    locale.MMM.forEach((v, i) => {\n      const d = new Date(1970, i, 1);\n      expect(parse(v, 'MMM', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dddd', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dddd ignoreCase', () => {\n    locale.dddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('ddd', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('ddd ignoreCase', () => {\n    locale.ddd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'ddd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('dd', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser] })).toEqual(d);\n    });\n  });\n\n  test('dd ignoreCase', () => {\n    locale.dd.forEach(v => {\n      const d = new Date(1970, 0, 1);\n      expect(parse(v, 'dd', { locale: lo, plugins: [parser], ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('A', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('A ignoreCase', () => {\n    locale.A.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'A', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('AA', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('AA ignoreCase', () => {\n    locale.AA.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'AA', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('a', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('a ignoreCase', () => {\n    locale.a.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'a', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n\n  test('aa', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo })).toEqual(d);\n    });\n  });\n\n  test('aa ignoreCase', () => {\n    locale.aa.forEach((v, i) => {\n      const d = new Date(1970, 0, 1, i * 12);\n      expect(parse(v, 'aa', { locale: lo, ignoreCase: true })).toEqual(d);\n    });\n  });\n});\n"
  },
  {
    "path": "tests/numerals/arab.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport numeral from '@/numerals/arab.ts';\n\ndescribe('arab', () => {\n  test('encode', () => {\n    expect(numeral.encode('0 1 2 3 4 5 6 7 8 9')).toBe('٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩');\n  });\n\n  test('decode', () => {\n    expect(numeral.decode('٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩')).toBe('0 1 2 3 4 5 6 7 8 9');\n  });\n});\n"
  },
  {
    "path": "tests/numerals/arabext.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport numeral from '@/numerals/arabext.ts';\n\ndescribe('arabext', () => {\n  test('encode', () => {\n    expect(numeral.encode('0 1 2 3 4 5 6 7 8 9')).toBe('۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹');\n  });\n\n  test('decode', () => {\n    expect(numeral.decode('۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹')).toBe('0 1 2 3 4 5 6 7 8 9');\n  });\n});\n"
  },
  {
    "path": "tests/numerals/beng.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport numeral from '@/numerals/beng.ts';\n\ndescribe('beng', () => {\n  test('encode', () => {\n    expect(numeral.encode('0 1 2 3 4 5 6 7 8 9')).toBe('০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯');\n  });\n\n  test('decode', () => {\n    expect(numeral.decode('০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯')).toBe('0 1 2 3 4 5 6 7 8 9');\n  });\n});\n"
  },
  {
    "path": "tests/numerals/latn.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport numeral from '@/numerals/latn.ts';\n\ndescribe('latn', () => {\n  test('encode', () => {\n    expect(numeral.encode('0 1 2 3 4 5 6 7 8 9')).toBe('0 1 2 3 4 5 6 7 8 9');\n  });\n\n  test('decode', () => {\n    expect(numeral.decode('0 1 2 3 4 5 6 7 8 9')).toBe('0 1 2 3 4 5 6 7 8 9');\n  });\n});\n"
  },
  {
    "path": "tests/numerals/mymr.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport numeral from '@/numerals/mymr.ts';\n\ndescribe('mymr', () => {\n  test('encode', () => {\n    expect(numeral.encode('0 1 2 3 4 5 6 7 8 9')).toBe('၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉');\n  });\n\n  test('decode', () => {\n    expect(numeral.decode('၀ ၁ ၂ ၃ ၄ ၅ ၆ ၇ ၈ ၉')).toBe('0 1 2 3 4 5 6 7 8 9');\n  });\n});\n"
  },
  {
    "path": "tests/parse.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { parse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\nimport Tokyo from '@/timezones/Asia/Tokyo.ts';\nimport Adelaide from '@/timezones/Australia/Adelaide.ts';\nimport Apia from '@/timezones/Pacific/Apia.ts';\nimport Metlakatla from '@/timezones/America/Metlakatla';\nimport Manila from '@/timezones/Asia/Manila';\nimport {\n  Los_Angeles as los_angeles,\n  Tokyo as tokyo,\n  Adelaide as adelaide,\n  Apia as apia,\n  Metlakatla as metlakatla,\n  Manila as manila\n} from '@/timezone.ts';\n\ntest('YYYY', () => {\n  expect(Number.isNaN(parse('0000', 'YYYY').getTime())).toBe(true);\n});\n\ntest('YYYY', () => {\n  const now = new Date(0, -1899 * 12, 1);\n  expect(parse('0001', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(0, -1801 * 12, 1);\n  expect(parse('0099', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(100, 0, 1);\n  expect(parse('0100', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(1899, 0, 1);\n  expect(parse('1899', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(1900, 0, 1);\n  expect(parse('1900', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(1969, 0, 1);\n  expect(parse('1969', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(1970, 0, 1);\n  expect(parse('1970', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(1999, 0, 1);\n  expect(parse('1999', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(2000, 0, 1);\n  expect(parse('2000', 'YYYY')).toEqual(now);\n});\n\ntest('YYYY', () => {\n  const now = new Date(9999, 0, 1);\n  expect(parse('9999', 'YYYY')).toEqual(now);\n});\n\ntest('Y', () => {\n  expect(Number.isNaN(parse('0', 'Y').getTime())).toBe(true);\n});\n\ntest('Y', () => {\n  const now = new Date(0, -1899 * 12, 1);\n  expect(parse('1', 'Y')).toEqual(now);\n});\n\ntest('Y', () => {\n  const now = new Date(0, -1801 * 12, 1);\n  expect(parse('99', 'Y')).toEqual(now);\n});\n\ntest('Y', () => {\n  const now = new Date(100, 0, 1);\n  expect(parse('100', 'Y')).toEqual(now);\n});\n\ntest('YYYY MMMM', () => {\n  const now = new Date(2015, 0, 1);\n  expect(parse('2015 January', 'YYYY MMMM')).toEqual(now);\n});\n\ntest('YYYY MMMM', () => {\n  const now = new Date(2015, 11, 1);\n  expect(parse('2015 December', 'YYYY MMMM')).toEqual(now);\n});\n\ntest('YYYY MMMM', () => {\n  expect(Number.isNaN(parse('2015 Zero', 'YYYY MMMM').getTime())).toBe(true);\n});\n\ntest('YYYY MMM', () => {\n  const now = new Date(2015, 0, 1);\n  expect(parse('2015 Jan', 'YYYY MMM')).toEqual(now);\n});\n\ntest('YYYY MMM', () => {\n  const now = new Date(2015, 11, 1);\n  expect(parse('2015 Dec', 'YYYY MMM')).toEqual(now);\n});\n\ntest('YYYY MMM', () => {\n  expect(Number.isNaN(parse('2015 Zero', 'YYYY MMM').getTime())).toBe(true);\n});\n\ntest('YYYY-MM', () => {\n  const now = new Date(2015, 0, 1);\n  expect(parse('2015-01', 'YYYY-MM')).toEqual(now);\n});\n\ntest('YYYY-MM', () => {\n  const now = new Date(2015, 11, 1);\n  expect(parse('2015-12', 'YYYY-MM')).toEqual(now);\n});\n\ntest('YYYY-MM', () => {\n  expect(Number.isNaN(parse('2015-00', 'YYYY-MM').getTime())).toBe(true);\n});\n\ntest('YYYY-M', () => {\n  const now = new Date(2015, 0, 1);\n  expect(parse('2015-1', 'YYYY-M')).toEqual(now);\n});\n\ntest('YYYY-M', () => {\n  const now = new Date(2015, 11, 1);\n  expect(parse('2015-12', 'YYYY-M')).toEqual(now);\n});\n\ntest('YYYY-M', () => {\n  expect(Number.isNaN(parse('2015-0', 'YYYY-M').getTime())).toBe(true);\n});\n\ntest('YYYY-MM-DD', () => {\n  const now = new Date(2015, 0, 1);\n  expect(parse('2015-01-01', 'YYYY-MM-DD')).toEqual(now);\n});\n\ntest('YYYY-MM-DD', () => {\n  const now = new Date(2015, 11, 31);\n  expect(parse('2015-12-31', 'YYYY-MM-DD')).toEqual(now);\n});\n\ntest('YYYY-MM-DD', () => {\n  expect(Number.isNaN(parse('2015-00-00', 'YYYY-MM-DD').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D', () => {\n  const now = new Date(2015, 0, 1);\n  expect(parse('2015-1-1', 'YYYY-M-D')).toEqual(now);\n});\n\ntest('YYYY-M-D', () => {\n  const now = new Date(2015, 11, 31);\n  expect(parse('2015-12-31', 'YYYY-M-D')).toEqual(now);\n});\n\ntest('YYYY-M-D', () => {\n  expect(Number.isNaN(parse('2015-0-0', 'YYYY-M-D').getTime())).toBe(true);\n});\n\ntest('YYYY-MM-DD HH', () => {\n  const now = new Date(2015, 0, 1, 0);\n  expect(parse('2015-01-01 00', 'YYYY-MM-DD HH')).toEqual(now);\n});\n\ntest('YYYY-MM-DD HH', () => {\n  const now = new Date(2015, 11, 31, 23);\n  expect(parse('2015-12-31 23', 'YYYY-MM-DD HH')).toEqual(now);\n});\n\ntest('YYYY-MM-DD HH', () => {\n  expect(Number.isNaN(parse('2015-00-00 24', 'YYYY-MM-DD HH').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H', () => {\n  const now = new Date(2015, 0, 1, 0);\n  expect(parse('2015-1-1 0', 'YYYY-M-D H')).toEqual(now);\n});\n\ntest('YYYY-M-D H', () => {\n  const now = new Date(2015, 11, 31, 23);\n  expect(parse('2015-12-31 23', 'YYYY-M-D H')).toEqual(now);\n});\n\ntest('YYYY-M-D H', () => {\n  expect(Number.isNaN(parse('2015-0-0 24', 'YYYY-M-D H').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D hh A', () => {\n  const now = new Date(2015, 0, 1, 0);\n  expect(parse('2015-1-1 12 AM', 'YYYY-M-D hh A')).toEqual(now);\n});\n\ntest('YYYY-M-D hh A', () => {\n  const now = new Date(2015, 11, 31, 23);\n  expect(parse('2015-12-31 11 PM', 'YYYY-M-D hh A')).toEqual(now);\n});\n\ntest('YYYY-M-D hh A', () => {\n  expect(Number.isNaN(parse('2015-0-0 12 AM', 'YYYY-M-D hh A').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D h A', () => {\n  const now = new Date(2015, 0, 1, 0);\n  expect(parse('2015-1-1 12 AM', 'YYYY-M-D h A')).toEqual(now);\n});\n\ntest('YYYY-M-D h A', () => {\n  const now = new Date(2015, 11, 31, 23);\n  expect(parse('2015-12-31 11 PM', 'YYYY-M-D h A')).toEqual(now);\n});\n\ntest('YYYY-M-D h A', () => {\n  expect(Number.isNaN(parse('2015-0-0 12 AM', 'YYYY-M-D h A').getTime())).toBe(true);\n});\n\ntest('YYYY-MM-DD HH:mm', () => {\n  const now = new Date(2015, 0, 1, 0, 0);\n  expect(parse('2015-01-01 00:00', 'YYYY-MM-DD HH:mm')).toEqual(now);\n});\n\ntest('YYYY-MM-DD HH:mm', () => {\n  const now = new Date(2015, 11, 31, 23, 59);\n  expect(parse('2015-12-31 23:59', 'YYYY-MM-DD HH:mm')).toEqual(now);\n});\n\ntest('YYYY-MM-DD HH:mm', () => {\n  expect(Number.isNaN(parse('2015-00-00 24:60', 'YYYY-MM-DD HH:mm').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m', () => {\n  const now = new Date(2015, 0, 1, 0, 0);\n  expect(parse('2015-1-1 0:0', 'YYYY-M-D H:m')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m', () => {\n  const now = new Date(2015, 11, 31, 23, 59);\n  expect(parse('2015-12-31 23:59', 'YYYY-M-D H:m')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m', () => {\n  expect(Number.isNaN(parse('2015-0-0 24:60', 'YYYY-M-D H:m').getTime())).toBe(true);\n});\n\ntest('YYYY-MM-DD HH:mm:ss', () => {\n  const now = new Date(2015, 0, 1, 0, 0, 0);\n  expect(parse('2015-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss')).toEqual(now);\n});\n\ntest('YYYY-MM-DD HH:mm:ss', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59);\n  expect(parse('2015-12-31 23:59:59', 'YYYY-MM-DD HH:mm:ss')).toEqual(now);\n});\n\ntest('YYYY-MM-DD HH:mm:ss', () => {\n  expect(Number.isNaN(parse('2015-00-00 24:60:60', 'YYYY-MM-DD HH:mm:ss').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s', () => {\n  const now = new Date(2015, 0, 1, 0, 0);\n  expect(parse('2015-1-1 0:0:0', 'YYYY-M-D H:m:s')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59);\n  expect(parse('2015-12-31 23:59:59', 'YYYY-M-D H:m:s')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s', () => {\n  expect(Number.isNaN(parse('2015-0-0 24:60:60', 'YYYY-M-D H:m:s').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.SSS', () => {\n  const now = new Date(2015, 0, 1, 0, 0, 0);\n  expect(parse('2015-1-1 0:0:0.0', 'YYYY-M-D H:m:s.SSS')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59, 999);\n  expect(parse('2015-12-31 23:59:59.999', 'YYYY-M-D H:m:s.SSS')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS', () => {\n  expect(Number.isNaN(parse('2015-0-0 24:60:61.000', 'YYYY-M-D H:m:s.SSS').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.SS', () => {\n  const now = new Date(2015, 0, 1, 0, 0, 0);\n  expect(parse('2015-1-1 0:0:0.0', 'YYYY-M-D H:m:s.SS')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SS', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59, 990);\n  expect(parse('2015-12-31 23:59:59.99', 'YYYY-M-D H:m:s.SS')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SS', () => {\n  expect(Number.isNaN(parse('2015-0-0 24:60:61.00', 'YYYY-M-D H:m:s.SS').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.S', () => {\n  const now = new Date(2015, 0, 1, 0, 0, 0);\n  expect(parse('2015-1-1 0:0:0.0', 'YYYY-M-D H:m:s.S')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.S', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59, 900);\n  expect(parse('2015-12-31 23:59:59.9', 'YYYY-M-D H:m:s.S')).toEqual(now);\n});\n\ntest('YYYY M D H m s S', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59, 900);\n  expect(parse('2015-12-31 23:59:59.9', 'YYYY M D H m s S')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.S', () => {\n  expect(Number.isNaN(parse('2015-0-0 24:60:61.0', 'YYYY-M-D H:m:s.S').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.SSS Z', () => {\n  const now = new Date(Date.UTC(2015, 0, 1, 0, 0, 0));\n  expect(parse('2015-1-1 0:0:0.0 +0000', 'YYYY-M-D H:m:s.SSS Z')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS Z', () => {\n  const now = new Date(Date.UTC(2015, 11, 31, 23, 59, 59, 999));\n  expect(parse('2015-12-31 23:00:59.999 -0059', 'YYYY-M-D H:m:s.SSS Z')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS Z', () => {\n  const now = new Date(Date.UTC(2015, 11, 31, 21, 59, 59, 999));\n  expect(parse('2015-12-31 09:59:59.999 -1200', 'YYYY-M-D H:m:s.SSS Z')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS Z', () => {\n  expect(Number.isNaN(parse('2015-12-31 09:58:59.999 -1601', 'YYYY-M-D H:m:s.SSS Z').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.SSS Z', () => {\n  const now = new Date(Date.UTC(2015, 11, 30, 22, 0, 59, 999));\n  expect(parse('2015-12-31 12:00:59.999 +1400', 'YYYY-M-D H:m:s.SSS Z')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS Z', () => {\n  expect(Number.isNaN(parse('2015-12-31 12:01:59.999 +1601', 'YYYY-M-D H:m:s.SSS Z').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.SSS ZZ', () => {\n  const now = new Date(Date.UTC(2015, 0, 1, 0, 0, 0));\n  expect(parse('2015-1-1 0:0:0.0 +00:00', 'YYYY-M-D H:m:s.SSS ZZ')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS ZZ', () => {\n  const now = new Date(Date.UTC(2015, 11, 31, 23, 59, 59, 999));\n  expect(parse('2015-12-31 23:00:59.999 -00:59', 'YYYY-M-D H:m:s.SSS ZZ')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS ZZ', () => {\n  const now = new Date(Date.UTC(2015, 11, 31, 21, 59, 59, 999));\n  expect(parse('2015-12-31 09:59:59.999 -12:00', 'YYYY-M-D H:m:s.SSS ZZ')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS ZZ', () => {\n  expect(Number.isNaN(parse('2015-12-31 09:58:59.999 -16:01', 'YYYY-M-D H:m:s.SSS ZZ').getTime())).toBe(true);\n});\n\ntest('YYYY-M-D H:m:s.SSS ZZ', () => {\n  const now = new Date(Date.UTC(2015, 11, 30, 22, 0, 59, 999));\n  expect(parse('2015-12-31 12:00:59.999 +14:00', 'YYYY-M-D H:m:s.SSS ZZ')).toEqual(now);\n});\n\ntest('YYYY-M-D H:m:s.SSS ZZ', () => {\n  expect(Number.isNaN(parse('2015-12-31 12:01:59.999 +16:01', 'YYYY-M-D H:m:s.SSS ZZ').getTime())).toBe(true);\n});\n\ntest('MMDDHHmmssSSS', () => {\n  const now = new Date(1970, 11, 31, 23, 59, 59, 999);\n  expect(parse('1231235959999', 'MMDDHHmmssSSS')).toEqual(now);\n});\n\ntest('DDHHmmssSSS', () => {\n  const now = new Date(1970, 0, 31, 23, 59, 59, 999);\n  expect(parse('31235959999', 'DDHHmmssSSS')).toEqual(now);\n});\n\ntest('HHmmssSSS', () => {\n  const now = new Date(1970, 0, 1, 23, 59, 59, 999);\n  expect(parse('235959999', 'HHmmssSSS')).toEqual(now);\n});\n\ntest('mmssSSS', () => {\n  const now = new Date(1970, 0, 1, 0, 59, 59, 999);\n  expect(parse('5959999', 'mmssSSS')).toEqual(now);\n});\n\ntest('ssSSS', () => {\n  const now = new Date(1970, 0, 1, 0, 0, 59, 999);\n  expect(parse('59999', 'ssSSS')).toEqual(now);\n});\n\ntest('SSS', () => {\n  const now = new Date(1970, 0, 1, 0, 0, 0, 999);\n  expect(parse('999', 'SSS')).toEqual(now);\n});\n\ntest('Z', () => {\n  expect(Number.isNaN(parse('+000', 'Z').getTime())).toBe(true);\n});\n\ntest('Z', () => {\n  expect(Number.isNaN(parse('+00', 'Z').getTime())).toBe(true);\n});\n\ntest('Z', () => {\n  expect(Number.isNaN(parse('+0', 'Z').getTime())).toBe(true);\n});\n\ntest('Z', () => {\n  expect(Number.isNaN(parse('0', 'Z').getTime())).toBe(true);\n});\n\ntest('Z', () => {\n  expect(Number.isNaN(parse('0000', 'Z').getTime())).toBe(true);\n});\n\ntest('Z', () => {\n  expect(Number.isNaN(parse('00000', 'Z').getTime())).toBe(true);\n});\n\ntest('ZZ', () => {\n  expect(Number.isNaN(parse('+00:0', 'ZZ').getTime())).toBe(true);\n});\n\ntest('ZZ', () => {\n  expect(Number.isNaN(parse('+00:', 'ZZ').getTime())).toBe(true);\n});\n\ntest('ZZ', () => {\n  expect(Number.isNaN(parse('+0:', 'ZZ').getTime())).toBe(true);\n});\n\ntest('ZZ', () => {\n  expect(Number.isNaN(parse('0:', 'ZZ').getTime())).toBe(true);\n});\n\ntest('ZZ', () => {\n  expect(Number.isNaN(parse('00:00', 'ZZ').getTime())).toBe(true);\n});\n\ntest('ZZ', () => {\n  expect(Number.isNaN(parse('00:000', 'ZZ').getTime())).toBe(true);\n});\n\ntest('foo', () => {\n  expect(Number.isNaN(parse('20150101235959', 'foo').getTime())).toBe(true);\n});\n\ntest('bar', () => {\n  expect(Number.isNaN(parse('20150101235959', 'bar').getTime())).toBe(true);\n});\n\ntest('YYYYMMDD', () => {\n  expect(Number.isNaN(parse('20150101235959', 'YYYYMMDD').getTime())).toBe(true);\n});\n\ntest('20150101235959', () => {\n  expect(Number.isNaN(parse('20150101235959', '20150101235959').getTime())).toBe(true);\n});\n\ntest('YYYY?M?D H?m?s?S', () => {\n  expect(Number.isNaN(parse('2015-12-31 23:59:59.9', 'YYYY?M?D H?m?s?S').getTime())).toBe(true);\n});\n\ntest('[Y]YYYY[M]M[D]D[H]H[m]m[s]s[S]S', () => {\n  const now = new Date(2015, 11, 31, 23, 59, 59, 900);\n  expect(parse('Y2015M12D31H23m59s59S9', '[Y]YYYY[M]M[D]D[H]H[m]m[s]s[S]S')).toEqual(now);\n});\n\ntest('[[Y]YYYY[M]MM[D]DD[H]HH[m]mm[s]ss[S]S]', () => {\n  expect(Number.isNaN(parse('[Y]2015[M]12[D]31[H]23[m]59[s]59[S]9', '[[Y]YYYY[M]MM[D]DD[H]HH[m]mm[s]ss[S]S]').getTime())).toBe(true);\n});\n\ntest('                 ', () => {\n  expect(Number.isNaN(parse('20151231235959900', '                 ').getTime())).toBe(true);\n});\n\ntest('\\\\[YYYY-MM-DD HH:mm:ss\\\\]', () => {\n  const now = new Date(2025, 7, 23, 14, 30, 45);\n  expect(parse('[2025-08-23 14:30:45]', '\\\\[YYYY-MM-DD HH:mm:ss\\\\]')).toEqual(now);\n});\n\ndescribe('options', () => {\n  test('hour12: h11', () => {\n    expect(parse('2000-01-01 00:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(new Date(2000, 0, 1, 0, 0));\n    expect(parse('2000-01-01 11:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(new Date(2000, 0, 1, 11, 0));\n    expect(parse('2000-01-01 00:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(new Date(2000, 0, 1, 12, 0));\n    expect(parse('2000-01-01 11:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(new Date(2000, 0, 1, 23, 0));\n\n    expect(Number.isNaN(parse('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' }).getTime())).toBe(true);\n    expect(Number.isNaN(parse('2000-01-01 12:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' }).getTime())).toBe(true);\n  });\n\n  test('hour12: h12', () => {\n    expect(parse('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(new Date(2000, 0, 1, 0, 0));\n    expect(parse('2000-01-01 11:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(new Date(2000, 0, 1, 11, 0));\n    expect(parse('2000-01-01 12:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(new Date(2000, 0, 1, 12, 0));\n    expect(parse('2000-01-01 11:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(new Date(2000, 0, 1, 23, 0));\n\n    expect(Number.isNaN(parse('2000-01-01 00:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' }).getTime())).toBe(true);\n    expect(Number.isNaN(parse('2000-01-01 00:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' }).getTime())).toBe(true);\n  });\n\n  test('ignoreCase: true', () => {\n    expect(parse('2025 May 4 Sunday 11 AM', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toEqual(new Date(2025, 4, 4, 11, 0));\n    expect(parse('2025 may 4 sunday 11 am', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toEqual(new Date(2025, 4, 4, 11, 0));\n    expect(parse('2025 MAY 4 SUNDAY 11 AM', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toEqual(new Date(2025, 4, 4, 11, 0));\n  });\n\n  test('calendar: buddhist', () => {\n    expect(parse('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(new Date(2000 - 543, 0, 1, 0, 0));\n    expect(parse('9999-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(new Date(9999 - 543, 0, 1, 0, 0));\n    expect(parse('0544-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(new Date(544 - 543, -1900 * 12, 1, 0, 0));\n\n    expect(Number.isNaN(parse('0543-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' }).getTime())).toBe(true);\n  });\n\n  test('timeZone', () => {\n    const now = new Date(Date.UTC(2025, 1 - 1, 1, 0));\n    expect(parse('2024-12-31 16:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2024-12-31 16:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2024-12-31 16:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n    expect(parse('2025-01-01 09:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: Tokyo })).toEqual(now);\n    expect(parse('2025-01-01 09:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: tokyo })).toEqual(now);\n    expect(parse('2025-01-01 09:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'Asia/Tokyo' })).toEqual(now);\n    expect(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'UTC' })).toEqual(now);\n    expect(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'utc' })).toEqual(now);\n\n    const dummyTimeZone = {\n      zone_name: 'dummyTimeZone',\n      gmt_offset: [0]\n    };\n\n    expect(Number.isNaN(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: dummyTimeZone }).getTime())).toBe(true);\n    expect(Number.isNaN(parse('2025-01-01 00:00:00', 'YYYY-MM-DD HH:mm:ss', { timeZone: 'dummyTimeZone' }).getTime())).toBe(true);\n  });\n\n  test('defaultDate: date components', () => {\n    expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15 } }))\n      .toEqual(new Date(2024, 2, 15, 12, 30));\n    expect(parse('03-15', 'MM-DD', { defaultDate: { Y: 2024 } }))\n      .toEqual(new Date(2024, 2, 15));\n  });\n\n  test('defaultDate: time components', () => {\n    expect(parse('2024-03-15', 'YYYY-MM-DD', { defaultDate: { H: 10, m: 30, s: 45 } }))\n      .toEqual(new Date(2024, 2, 15, 10, 30, 45));\n  });\n\n  test('defaultDate: timezone offset (Z)', () => {\n    // Z: -540 means UTC+9 (JST): minutes become 30+(-540)=-510, so Date.UTC(2024,2,15,12,-510) = 03:30 UTC\n    expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 } }))\n      .toEqual(new Date(Date.UTC(2024, 2, 15, 3, 30)));\n  });\n\n  test('defaultDate: Z takes precedence over timeZone option', () => {\n    // Z: -540 (UTC+9) overrides timeZone: 'UTC'; 12:30 local → 03:30 UTC\n    expect(parse('12:30', 'HH:mm', { defaultDate: { Y: 2024, M: 3, D: 15, Z: -540 }, timeZone: 'UTC' }))\n      .toEqual(new Date(Date.UTC(2024, 2, 15, 3, 30)));\n  });\n\n  test('defaultDate: 12-hour components (h and A)', () => {\n    // base.A=1 (PM), base.h=2 → hour = 1*12 + 2 = 14 (2 PM)\n    expect(parse('30', 'mm', { defaultDate: { Y: 2024, M: 3, D: 15, h: 2, A: 1 } }))\n      .toEqual(new Date(2024, 2, 15, 14, 30));\n  });\n\n  test('defaultDate: calendar: buddhist interaction', () => {\n    expect(parse('2567-03-15', 'YYYY-MM-DD', { calendar: 'buddhist' }))\n      .toEqual(new Date(2024, 2, 15));\n  });\n});\n\ndescribe('timeZone Los_Angeles', () => {\n  test('before DST', () => {\n    const now = new Date('2021-03-14T09:59:59.999Z');\n    expect(parse('2021-03-14 01:59:59.999', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2021-03-14 01:59:59.999', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2021-03-14 01:59:59.999', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n  });\n\n  test('start DST 1', () => {\n    const now = new Date('2021-03-14T10:00:00.000Z');\n    expect(parse('2021-03-14 02:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2021-03-14 02:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2021-03-14 02:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n  });\n\n  test('start DST 2', () => {\n    const now = new Date('2021-03-14T10:00:00.000Z');\n    expect(parse('2021-03-14 03:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2021-03-14 03:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2021-03-14 03:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n  });\n\n  test('before of PST', () => {\n    const now = new Date('2021-11-07T08:59:59.999Z');\n    expect(parse('2021-11-07 01:59:59.999', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2021-11-07 01:59:59.999', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2021-11-07 01:59:59.999', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n  });\n\n  test('end of DST', () => {\n    const now = new Date('2021-11-07T10:00:00.000Z');\n    expect(parse('2021-11-07 02:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2021-11-07 02:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2021-11-07 02:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n  });\n\n  test('after of DST', () => {\n    const now = new Date('2021-11-07T11:00:00.000Z');\n    expect(parse('2021-11-07 03:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: Los_Angeles })).toEqual(now);\n    expect(parse('2021-11-07 03:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: los_angeles })).toEqual(now);\n    expect(parse('2021-11-07 03:00:00.000', 'YYYY-MM-DD HH:mm:ss.SSS', { timeZone: 'America/Los_Angeles' })).toEqual(now);\n  });\n});\n\ndescribe('timeZone Adelaide', () => {\n  test('before of DST', () => {\n    // Oct 3 2021 1:59:59.999 => 2021-10-02T16:29:59.999Z\n    const dateString = 'Oct 3 2021 1:59:59.999';\n    const formatString = 'MMM D YYYY H:mm:ss.SSS';\n    const dateObj = new Date(Date.UTC(2021, 9, 2, 16, 29, 59, 999));\n\n    expect(parse(dateString, formatString, { timeZone: Adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Australia/Adelaide' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('start of DST 1', () => {\n    // Oct 3 2021 2:00:00.000 => 2021-10-02T16:30:00.000Z\n    const dateString = 'Oct 3 2021 2:00:00.000';\n    const formatString = 'MMM D YYYY H:mm:ss.SSS';\n    const dateObj = new Date(Date.UTC(2021, 9, 2, 16, 30, 0, 0));\n\n    expect(parse(dateString, formatString, { timeZone: Adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Australia/Adelaide' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('start of DST 2', () => {\n    // Oct 3 2021 2:59:59.999 => 2021-10-02T17:29:59.999Z\n    const dateString = 'Oct 3 2021 2:59:59.999';\n    const formatString = 'MMM D YYYY H:mm:ss.SSS';\n    const dateObj = new Date(Date.UTC(2021, 9, 2, 17, 29, 59, 999));\n\n    expect(parse(dateString, formatString, { timeZone: Adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Australia/Adelaide' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('start of DST 3', () => {\n    // Oct 3 2021 3:00:00.000 => 2021-10-02T16:30:00.000Z\n    const dateString = 'Oct 3 2021 3:00:00.000';\n    const formatString = 'MMM D YYYY H:mm:ss.SSS';\n    const dateObj = new Date(Date.UTC(2021, 9, 2, 16, 30, 0, 0));\n\n    expect(parse(dateString, formatString, { timeZone: Adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Australia/Adelaide' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('end of DST', () => {\n    // Apr 4 2021 2:59:59.999 => 2021-04-03T16:29:59.999Z\n    const dateString = 'Apr 4 2021 2:59:59.999';\n    const formatString = 'MMM D YYYY H:mm:ss.SSS';\n    const dateObj = new Date(Date.UTC(2021, 3, 3, 16, 29, 59, 999));\n\n    expect(parse(dateString, formatString, { timeZone: Adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Australia/Adelaide' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('after DST', () => {\n    // Apr 4 2021 3:00:00.000 => 2021-04-03T17:30:00.000Z\n    const dateString = 'Apr 4 2021 3:00:00.000';\n    const formatString = 'MMM D YYYY H:mm:ss.SSS';\n    const dateObj = new Date(Date.UTC(2021, 3, 3, 17, 30, 0, 0));\n\n    expect(parse(dateString, formatString, { timeZone: Adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: adelaide }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Australia/Adelaide' }).getTime()).toBe(dateObj.getTime());\n  });\n});\n\ndescribe('timeZone Apia', () => {\n  beforeAll(() => (process.env.TZ = 'Pacific/Apia'));\n\n  test('1.1', () => {\n    const dateString = '04 July, 1892 11:59:59 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1892, 7 - 1, 4, 23, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('1.2', () => {\n    const dateString = '04 July, 1892 12:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1892, 7 - 1, 4, 0, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('2.1', () => {\n    const dateString = '31 December, 1910 11:59:59 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1910, 12 - 1, 31, 23, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('2.2', () => {\n    const dateString = '31 December, 1910 11:56:56 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1910, 12 - 1, 31, 23, 56, 56);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('3.1', () => {\n    const dateString = '31 December, 1949 11:59:59 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1949, 12 - 1, 31, 23, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('3.2', () => {\n    const dateString = '01 January, 1950 12:30:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1950, 1 - 1, 1, 0, 30, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('4.1', () => {\n    const dateString = '25 September, 2010 11:59:59 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2010, 9 - 1, 25, 23, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('4.2', () => {\n    const dateString = '26 September, 2010 01:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2010, 9 - 1, 26, 1, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('5.1', () => {\n    const dateString = '02 April, 2011 03:59:59 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2011, 4 - 1, 2, 3, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('5.2', () => {\n    const dateString = '02 April, 2011 03:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2011, 4 - 1, 2, 3, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('6.1', () => {\n    const dateString = '24 September, 2011 02:59:59 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2011, 9 - 1, 24, 2, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('6.2', () => {\n    const dateString = '24 September, 2011 04:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2011, 9 - 1, 24, 4, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('7.1', () => {\n    const dateString = '29 December, 2011 11:59:59 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2011, 12 - 1, 29, 23, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('7.2', () => {\n    const dateString = '31 December, 2011 12:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2011, 12 - 1, 31, 0, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('8.1', () => {\n    const dateString = '01 April, 2012 03:59:59 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2012, 4 - 1, 1, 3, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('8.2', () => {\n    const dateString = '01 April, 2012 03:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2012, 4 - 1, 1, 3, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: apia }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Pacific/Apia' }).getTime()).toBe(dateObj.getTime());\n  });\n});\n\ndescribe('timeZone Metlakatla', () => {\n  beforeAll(() => (process.env.TZ = 'America/Metlakatla'));\n\n  test('1.1', () => {\n    const dateString = '19 October, 1867 03:44:54 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(-3225223728000);\n\n    expect(parse(dateString, formatString, { timeZone: Metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'America/Metlakatla' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('1.2', () => {\n    const dateString = '19 October, 1867 03:44:55 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1867, 10 - 1, 19, 15, 44, 55);\n\n    expect(parse(dateString, formatString, { timeZone: Metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'America/Metlakatla' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('2.1', () => {\n    const dateString = '02 November, 2025 01:59:59 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2025, 11 - 1, 2, 1, 59, 59);\n\n    expect(parse(dateString, formatString, { timeZone: Metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'America/Metlakatla' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('2.2', () => {\n    const dateString = '02 November, 2025 01:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(2025, 11 - 1, 2, 1, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: metlakatla }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'America/Metlakatla' }).getTime()).toBe(dateObj.getTime());\n  });\n});\n\ndescribe('timeZone Manila', () => {\n  beforeAll(() => (process.env.TZ = 'Asia/Manila'));\n\n  test('1.1', () => {\n    const dateString = '30 December, 1844 11:59:59 PM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(-3944621033000);\n\n    expect(parse(dateString, formatString, { timeZone: Manila }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: manila }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Asia/Manila' }).getTime()).toBe(dateObj.getTime());\n  });\n\n  test('1.2', () => {\n    const dateString = '01 January, 1845 12:00:00 AM';\n    const formatString = 'DD MMMM, YYYY hh:mm:ss A';\n    const dateObj = new Date(1845, 1 - 1, 1, 0, 0, 0);\n\n    expect(parse(dateString, formatString, { timeZone: Manila }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: manila }).getTime()).toBe(dateObj.getTime());\n    expect(parse(dateString, formatString, { timeZone: 'Asia/Manila' }).getTime()).toBe(dateObj.getTime());\n  });\n});\n"
  },
  {
    "path": "tests/plugins/microsecond.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { parse } from '@/index.ts';\nimport { parser as microsecond } from '@/plugins/microsecond.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('plugins', () => {\n  test('SSSS', () => {\n    expect(parse('12:34:56 0000', 'HH:mm:ss SSSS', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 9999', 'HH:mm:ss SSSS', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('SSSSS', () => {\n    expect(parse('12:34:56 00000', 'HH:mm:ss SSSSS', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 99999', 'HH:mm:ss SSSSS', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('SSSSSS', () => {\n    expect(parse('12:34:56 000000', 'HH:mm:ss SSSSSS', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999999', 'HH:mm:ss SSSSSS', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('f', () => {\n    expect(parse('12:34:56 000.0', 'HH:mm:ss SSS.f', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999.9', 'HH:mm:ss SSS.f', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('ff', () => {\n    expect(parse('12:34:56 000.00', 'HH:mm:ss SSS.ff', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999.99', 'HH:mm:ss SSS.ff', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('fff', () => {\n    expect(parse('12:34:56 000.000', 'HH:mm:ss SSS.fff', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999.999', 'HH:mm:ss SSS.fff', { plugins: [microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n});\n"
  },
  {
    "path": "tests/plugins/nanosecond.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { parse } from '@/index.ts';\nimport { parser as nanosecond } from '@/plugins/nanosecond.ts';\nimport { parser as microsecond } from '@/plugins/microsecond.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('plugins', () => {\n  test('SSSSSSS', () => {\n    expect(parse('12:34:56 0000000', 'HH:mm:ss SSSSSSS', { plugins: [nanosecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 9999999', 'HH:mm:ss SSSSSSS', { plugins: [nanosecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('SSSSSSSS', () => {\n    expect(parse('12:34:56 00000000', 'HH:mm:ss SSSSSSSS', { plugins: [nanosecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 99999999', 'HH:mm:ss SSSSSSSS', { plugins: [nanosecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('SSSSSSSSS', () => {\n    expect(parse('12:34:56 000000000', 'HH:mm:ss SSSSSSSSS', { plugins: [nanosecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999999999', 'HH:mm:ss SSSSSSSSS', { plugins: [nanosecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('F', () => {\n    expect(parse('12:34:56 000000.0', 'HH:mm:ss SSSSSS.F', { plugins: [nanosecond, microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999999.9', 'HH:mm:ss SSSSSS.F', { plugins: [nanosecond, microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('FF', () => {\n    expect(parse('12:34:56 000000.00', 'HH:mm:ss SSSSSS.FF', { plugins: [nanosecond, microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999999.99', 'HH:mm:ss SSSSSS.FF', { plugins: [nanosecond, microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n\n  test('FFF', () => {\n    expect(parse('12:34:56 000000.000', 'HH:mm:ss SSSSSS.FFF', { plugins: [nanosecond, microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 0));\n    expect(parse('12:34:56 999999.999', 'HH:mm:ss SSSSSS.FFF', { plugins: [nanosecond, microsecond] })).toEqual(new Date(1970, 1 - 1, 1, 12, 34, 56, 999));\n  });\n});\n"
  },
  {
    "path": "tests/plugins/ordinal.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { format, parse } from '@/index.ts';\nimport { formatter, parser } from '@/plugins/ordinal.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('plugins', () => {\n  describe('formatter', () => {\n    test('DDD', () => {\n      expect(format(new Date(2025, 1 - 1, 1, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 1st, 2025');\n      expect(format(new Date(2025, 1 - 1, 2, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 2nd, 2025');\n      expect(format(new Date(2025, 1 - 1, 3, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 3rd, 2025');\n\n      expect(format(new Date(2025, 1 - 1, 11, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 11th, 2025');\n      expect(format(new Date(2025, 1 - 1, 12, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 12th, 2025');\n      expect(format(new Date(2025, 1 - 1, 13, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 13th, 2025');\n\n      expect(format(new Date(2025, 1 - 1, 21, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 21st, 2025');\n      expect(format(new Date(2025, 1 - 1, 22, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 22nd, 2025');\n      expect(format(new Date(2025, 1 - 1, 23, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 23rd, 2025');\n\n      expect(format(new Date(2025, 1 - 1, 31, 0), 'MMMM DDD, YYYY', { plugins: [formatter] })).toBe('January 31st, 2025');\n    });\n  });\n\n  describe('parser', () => {\n    test('DDD', () => {\n      expect(parse('January 1st, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 1));\n      expect(parse('January 2nd, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 2));\n      expect(parse('January 3rd, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 3));\n\n      expect(parse('January 11th, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 11));\n      expect(parse('January 12th, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 12));\n      expect(parse('January 13th, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 13));\n\n      expect(parse('January 21st, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 21));\n      expect(parse('January 22nd, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 22));\n      expect(parse('January 23rd, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 23));\n\n      expect(parse('January 31st, 2025', 'MMMM DDD, YYYY', { plugins: [parser] })).toEqual(new Date(2025, 0, 31));\n    });\n\n    test('DDD ignoreCase', () => {\n      expect(parse('JANUARY 1ST, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 1));\n      expect(parse('JANUARY 2ND, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 2));\n      expect(parse('JANUARY 3RD, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 3));\n\n      expect(parse('JANUARY 11TH, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 11));\n      expect(parse('JANUARY 12TH, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 12));\n      expect(parse('JANUARY 13TH, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 13));\n\n      expect(parse('JANUARY 21ST, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 21));\n      expect(parse('JANUARY 22ND, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 22));\n      expect(parse('JANUARY 23RD, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 23));\n\n      expect(parse('JANUARY 31ST, 2025', 'MMMM DDD, YYYY', { plugins: [parser], ignoreCase: true })).toEqual(new Date(2025, 0, 31));\n    });\n  });\n});\n"
  },
  {
    "path": "tests/plugins/quarter.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format } from '@/index.ts';\nimport { formatter } from '@/plugins/quarter.ts';\n\ndescribe('plugins', () => {\n  describe('formatter', () => {\n    test('Q — first month of each quarter', () => {\n      expect(format(new Date(2025, 0, 1), 'Q', { plugins: [formatter] })).toBe('1'); // Jan → Q1\n      expect(format(new Date(2025, 3, 1), 'Q', { plugins: [formatter] })).toBe('2'); // Apr → Q2\n      expect(format(new Date(2025, 6, 1), 'Q', { plugins: [formatter] })).toBe('3'); // Jul → Q3\n      expect(format(new Date(2025, 9, 1), 'Q', { plugins: [formatter] })).toBe('4'); // Oct → Q4\n    });\n\n    test('Q — last month of each quarter', () => {\n      expect(format(new Date(2025, 2, 31), 'Q', { plugins: [formatter] })).toBe('1'); // Mar → Q1\n      expect(format(new Date(2025, 5, 30), 'Q', { plugins: [formatter] })).toBe('2'); // Jun → Q2\n      expect(format(new Date(2025, 8, 30), 'Q', { plugins: [formatter] })).toBe('3'); // Sep → Q3\n      expect(format(new Date(2025, 11, 31), 'Q', { plugins: [formatter] })).toBe('4'); // Dec → Q4\n    });\n\n    test('Q — middle month of each quarter', () => {\n      expect(format(new Date(2025, 1, 14), 'Q', { plugins: [formatter] })).toBe('1'); // Feb → Q1\n      expect(format(new Date(2025, 4, 15), 'Q', { plugins: [formatter] })).toBe('2'); // May → Q2\n      expect(format(new Date(2025, 7, 16), 'Q', { plugins: [formatter] })).toBe('3'); // Aug → Q3\n      expect(format(new Date(2025, 10, 11), 'Q', { plugins: [formatter] })).toBe('4'); // Nov → Q4\n    });\n  });\n});\n"
  },
  {
    "path": "tests/plugins/timestamp.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { format } from '@/index.ts';\nimport { formatter } from '@/plugins/timestamp.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('plugins', () => {\n  describe('formatter', () => {\n    test('t — Unix timestamp in seconds (floor)', () => {\n      expect(format(new Date(0), 't', { plugins: [formatter] })).toBe('0');          // epoch\n      expect(format(new Date(1000), 't', { plugins: [formatter] })).toBe('1');       // exactly 1 second\n      expect(format(new Date(999), 't', { plugins: [formatter] })).toBe('0');        // just under 1 second → floor\n      expect(format(new Date(1999), 't', { plugins: [formatter] })).toBe('1');       // 1.999 s → floor to 1\n      expect(format(new Date(1000000000000), 't', { plugins: [formatter] })).toBe('1000000000'); // Sep 9, 2001\n      expect(format(new Date(-1), 't', { plugins: [formatter] })).toBe('-1');          // -1ms → floor to -1s\n      expect(format(new Date(-1500), 't', { plugins: [formatter] })).toBe('-2');       // -1.5s → floor to -2s\n      expect(format(new Date(-1000), 't', { plugins: [formatter] })).toBe('-1');       // exactly -1s\n      expect(format(new Date(2147483648000), 't', { plugins: [formatter] })).toBe('2147483648'); // year 2038+\n    });\n\n    test('T — Unix timestamp in milliseconds', () => {\n      expect(format(new Date(0), 'T', { plugins: [formatter] })).toBe('0');          // epoch\n      expect(format(new Date(1000), 'T', { plugins: [formatter] })).toBe('1000');    // 1 second\n      expect(format(new Date(999), 'T', { plugins: [formatter] })).toBe('999');      // 999 ms\n      expect(format(new Date(1000000000000), 'T', { plugins: [formatter] })).toBe('1000000000000');\n    });\n  });\n});\n"
  },
  {
    "path": "tests/plugins/two-digit-year.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { parse } from '@/index.ts';\nimport { parser as year } from '@/plugins/two-digit-year.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('plugins', () => {\n  test('YY gregory', () => {\n    expect(parse('00-05-05', 'YY-MM-DD', { plugins: [year] })).toEqual(new Date(2000, 5 - 1, 5));\n    expect(parse('69-05-05', 'YY-MM-DD', { plugins: [year] })).toEqual(new Date(2069, 5 - 1, 5));\n    expect(parse('70-05-05', 'YY-MM-DD', { plugins: [year] })).toEqual(new Date(1970, 5 - 1, 5));\n    expect(parse('99-05-05', 'YY-MM-DD', { plugins: [year] })).toEqual(new Date(1999, 5 - 1, 5));\n  });\n\n  test('YY buddhist', () => {\n    expect(parse('00-05-05', 'YY-MM-DD', { plugins: [year], calendar: 'buddhist' })).toEqual(new Date(2600 - 543, 5 - 1, 5));\n    expect(parse('12-05-05', 'YY-MM-DD', { plugins: [year], calendar: 'buddhist' })).toEqual(new Date(2612 - 543, 5 - 1, 5));\n    expect(parse('13-05-05', 'YY-MM-DD', { plugins: [year], calendar: 'buddhist' })).toEqual(new Date(2513 - 543, 5 - 1, 5));\n    expect(parse('99-05-05', 'YY-MM-DD', { plugins: [year], calendar: 'buddhist' })).toEqual(new Date(2599 - 543, 5 - 1, 5));\n  });\n});\n"
  },
  {
    "path": "tests/plugins/week.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { format } from '@/index.ts';\nimport { formatter } from '@/plugins/week.ts';\n\ndescribe('plugins', () => {\n  describe('formatter', () => {\n    test('W', () => {\n      // 2024-01-01 is Monday - ISO week year equals calendar year, no offset bug\n      expect(format(new Date(2024, 0, 1), 'W', { plugins: [formatter] })).toBe('1');\n      // last day of ISO week 1 (Sunday)\n      expect(format(new Date(2024, 0, 7), 'W', { plugins: [formatter] })).toBe('1');\n      // first day of ISO week 2 (Monday)\n      expect(format(new Date(2024, 0, 8), 'W', { plugins: [formatter] })).toBe('2');\n      // mid-year (Thursday is the anchor day of its own ISO week)\n      expect(format(new Date(2024, 6, 4), 'W', { plugins: [formatter] })).toBe('27');\n      // late December still in ISO week year 2024\n      expect(format(new Date(2024, 11, 23), 'W', { plugins: [formatter] })).toBe('52');\n      // Dec 30, 2024 (Monday) belongs to ISO week 1 of 2025\n      expect(format(new Date(2024, 11, 30), 'W', { plugins: [formatter] })).toBe('1');\n      // Jan 1, 2021 (Friday) belongs to ISO week 53 of 2020\n      expect(format(new Date(2021, 0, 1), 'W', { plugins: [formatter] })).toBe('53');\n      // Dec 31, 2015 (Thursday) belongs to ISO week 53 of 2015\n      expect(format(new Date(2015, 11, 31), 'W', { plugins: [formatter] })).toBe('53');\n      // Jan 6, 2025 (Monday) is ISO week 2 of 2025\n      expect(format(new Date(2025, 0, 6), 'W', { plugins: [formatter] })).toBe('2');\n    });\n\n    test('WW', () => {\n      expect(format(new Date(2024, 0, 1), 'WW', { plugins: [formatter] })).toBe('01');\n      expect(format(new Date(2024, 0, 8), 'WW', { plugins: [formatter] })).toBe('02');\n      expect(format(new Date(2024, 6, 4), 'WW', { plugins: [formatter] })).toBe('27');\n      expect(format(new Date(2024, 11, 23), 'WW', { plugins: [formatter] })).toBe('52');\n      expect(format(new Date(2021, 0, 1), 'WW', { plugins: [formatter] })).toBe('53');\n    });\n\n    test('GGGG', () => {\n      // ISO week year equals calendar year\n      expect(format(new Date(2024, 0, 1), 'GGGG', { plugins: [formatter] })).toBe('2024');\n      // Dec 30, 2024 crosses into ISO week year 2025\n      expect(format(new Date(2024, 11, 30), 'GGGG', { plugins: [formatter] })).toBe('2025');\n      // Jan 1, 2021 crosses back into ISO week year 2020\n      expect(format(new Date(2021, 0, 1), 'GGGG', { plugins: [formatter] })).toBe('2020');\n    });\n\n    test('GG', () => {\n      expect(format(new Date(2024, 0, 1), 'GG', { plugins: [formatter] })).toBe('24');\n      expect(format(new Date(2024, 11, 30), 'GG', { plugins: [formatter] })).toBe('25');\n      expect(format(new Date(2021, 0, 1), 'GG', { plugins: [formatter] })).toBe('20');\n    });\n\n    test('GGGG and YYYY differ at year boundaries', () => {\n      // Dec 30, 2024: calendar year = 2024, ISO week year = 2025\n      expect(format(new Date(2024, 11, 30), 'YYYY GGGG', { plugins: [formatter] })).toBe('2024 2025');\n    });\n\n    test('edge cases - min date', () => {\n      const minDate = new Date(1, 0 - 1900 * 12, 1);\n\n      // Jan 1, year 1 (Monday): Thursday of that week is Jan 4, year 1\n      // → ISO week year = 1, first week of year 1\n      expect(format(minDate, 'GGGG', { plugins: [formatter] })).toBe('0001');\n      expect(format(minDate, 'GG', { plugins: [formatter] })).toBe('01');\n      expect(format(minDate, 'G', { plugins: [formatter] })).toBe('1');\n      expect(format(minDate, 'W', { plugins: [formatter] })).toBe('1');\n      expect(format(minDate, 'WW', { plugins: [formatter] })).toBe('01');\n    });\n\n    test('edge cases - year 9999', () => {\n      const maxDate = new Date(9999, 11, 31);\n\n      // Dec 31, 9999 (Friday): Thursday of that week is Dec 30, 9999\n      // → ISO week year = 9999 (does NOT cross into 10000)\n      expect(format(maxDate, 'GGGG', { plugins: [formatter] })).toBe('9999');\n      expect(format(maxDate, 'GG', { plugins: [formatter] })).toBe('99');\n      expect(format(maxDate, 'G', { plugins: [formatter] })).toBe('9999');\n      expect(format(maxDate, 'W', { plugins: [formatter] })).toBe('52');\n      expect(format(maxDate, 'WW', { plugins: [formatter] })).toBe('52');\n    });\n  });\n});\n"
  },
  {
    "path": "tests/plugins/zonename.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { format } from '@/index.ts';\nimport { formatter as zonename } from '@/plugins/zonename.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\nimport Tokyo from '@/timezones/Asia/Tokyo.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('plugins', () => {\n  test('z', () => {\n    const now = new Date(2025, 1 - 1, 1, 0);\n\n    expect(format(now, 'z', { plugins: [zonename] })).toBe('UTC');\n    expect(format(now, 'z', { plugins: [zonename], timeZone: 'UTC' })).toBe('UTC');\n    expect(format(now, 'z', { plugins: [zonename], timeZone: Los_Angeles })).toBe('PST');\n    expect(format(now, 'z', { plugins: [zonename], timeZone: Tokyo })).toBe('JST');\n  });\n\n  test('zz', () => {\n    const now = new Date(2025, 1 - 1, 1, 0);\n\n    expect(format(now, 'zz', { plugins: [zonename] })).toBe('Coordinated Universal Time');\n    expect(format(now, 'zz', { plugins: [zonename], timeZone: 'UTC' })).toBe('Coordinated Universal Time');\n    expect(format(now, 'zz', { plugins: [zonename], timeZone: Los_Angeles })).toBe('Pacific Standard Time');\n    expect(format(now, 'zz', { plugins: [zonename], timeZone: Tokyo })).toBe('Japan Standard Time');\n  });\n});\n"
  },
  {
    "path": "tests/preparse.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { preparse } from '@/index.ts';\nimport { parser } from '@/plugins/day-of-week.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('YYYY', () => {\n  test('0000', () => {\n    const dt = { Y: 0, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('0000', 'YYYY')).toEqual(dt);\n  });\n\n  test('0001', () => {\n    const dt = { Y: 1, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('0001', 'YYYY')).toEqual(dt);\n  });\n\n  test('0099', () => {\n    const dt = { Y: 99, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('0099', 'YYYY')).toEqual(dt);\n  });\n\n  test('0100', () => {\n    const dt = { Y: 100, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('0100', 'YYYY')).toEqual(dt);\n  });\n\n  test('1899', () => {\n    const dt = { Y: 1899, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1899', 'YYYY')).toEqual(dt);\n  });\n\n  test('1900', () => {\n    const dt = { Y: 1900, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1900', 'YYYY')).toEqual(dt);\n  });\n\n  test('1969', () => {\n    const dt = { Y: 1969, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1969', 'YYYY')).toEqual(dt);\n  });\n\n  test('1970', () => {\n    const dt = { Y: 1970, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1970', 'YYYY')).toEqual(dt);\n  });\n\n  test('1999', () => {\n    const dt = { Y: 1999, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1999', 'YYYY')).toEqual(dt);\n  });\n\n  test('2000', () => {\n    const dt = { Y: 2000, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('2000', 'YYYY')).toEqual(dt);\n  });\n\n  test('9999', () => {\n    const dt = { Y: 9999, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('9999', 'YYYY')).toEqual(dt);\n  });\n});\n\ndescribe('Y', () => {\n  test('0', () => {\n    const dt = { Y: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 'Y')).toEqual(dt);\n  });\n\n  test('1', () => {\n    const dt = { Y: 1, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('1', 'Y')).toEqual(dt);\n  });\n\n  test('99', () => {\n    const dt = { Y: 99, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('99', 'Y')).toEqual(dt);\n  });\n\n  test('100', () => {\n    const dt = { Y: 100, _index: 3, _length: 3, _match: 1 };\n    expect(preparse('100', 'Y')).toEqual(dt);\n  });\n\n  test('1899', () => {\n    const dt = { Y: 1899, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1899', 'Y')).toEqual(dt);\n  });\n\n  test('1900', () => {\n    const dt = { Y: 1900, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1900', 'Y')).toEqual(dt);\n  });\n\n  test('1969', () => {\n    const dt = { Y: 1969, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1969', 'Y')).toEqual(dt);\n  });\n\n  test('1970', () => {\n    const dt = { Y: 1970, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1970', 'Y')).toEqual(dt);\n  });\n\n  test('1999', () => {\n    const dt = { Y: 1999, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('1999', 'Y')).toEqual(dt);\n  });\n\n  test('2000', () => {\n    const dt = { Y: 2000, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('2000', 'Y')).toEqual(dt);\n  });\n\n  test('9999', () => {\n    const dt = { Y: 9999, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('9999', 'Y')).toEqual(dt);\n  });\n});\n\ndescribe('MMMM', () => {\n  test('January', () => {\n    const dt = { M: 1, _index: 7, _length: 7, _match: 1 };\n    expect(preparse('January', 'MMMM')).toEqual(dt);\n  });\n\n  test('December', () => {\n    const dt = { M: 12, _index: 8, _length: 8, _match: 1 };\n    expect(preparse('December', 'MMMM')).toEqual(dt);\n  });\n\n  test('Zero', () => {\n    const dt = { _index: 0, _length: 4, _match: 0 };\n    expect(preparse('Zero', 'MMMM')).toEqual(dt);\n  });\n});\n\ndescribe('MMM', () => {\n  test('January', () => {\n    const dt = { M: 1, _index: 3, _length: 3, _match: 1 };\n    expect(preparse('Jan', 'MMM')).toEqual(dt);\n  });\n\n  test('December', () => {\n    const dt = { M: 12, _index: 3, _length: 3, _match: 1 };\n    expect(preparse('Dec', 'MMM')).toEqual(dt);\n  });\n\n  test('Zero', () => {\n    const dt = { _index: 0, _length: 4, _match: 0 };\n    expect(preparse('Zero', 'MMM')).toEqual(dt);\n  });\n});\n\ndescribe('MM', () => {\n  test('01', () => {\n    const dt = { M: 1, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('01', 'MM')).toEqual(dt);\n  });\n\n  test('12', () => {\n    const dt = { M: 12, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('12', 'MM')).toEqual(dt);\n  });\n\n  test('00', () => {\n    const dt = { M: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('00', 'MM')).toEqual(dt);\n  });\n});\n\ndescribe('M', () => {\n  test('1', () => {\n    const dt = { M: 1, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('1', 'M')).toEqual(dt);\n  });\n\n  test('12', () => {\n    const dt = { M: 12, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('12', 'M')).toEqual(dt);\n  });\n\n  test('0', () => {\n    const dt = { M: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 'M')).toEqual(dt);\n  });\n});\n\ndescribe('DD', () => {\n  test('01', () => {\n    const dt = { D: 1, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('01', 'DD')).toEqual(dt);\n  });\n\n  test('31', () => {\n    const dt = { D: 31, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('31', 'DD')).toEqual(dt);\n  });\n\n  test('00', () => {\n    const dt = { D: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('00', 'DD')).toEqual(dt);\n  });\n});\n\ndescribe('D', () => {\n  test('1', () => {\n    const dt = { D: 1, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('1', 'D')).toEqual(dt);\n  });\n\n  test('31', () => {\n    const dt = { D: 31, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('31', 'D')).toEqual(dt);\n  });\n\n  test('0', () => {\n    const dt = { D: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 'D')).toEqual(dt);\n  });\n});\n\ndescribe('HH', () => {\n  test('00', () => {\n    const dt = { H: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('00', 'HH')).toEqual(dt);\n  });\n\n  test('23', () => {\n    const dt = { H: 23, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('23', 'HH')).toEqual(dt);\n  });\n\n  test('24', () => {\n    const dt = { H: 24, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('24', 'HH')).toEqual(dt);\n  });\n});\n\ndescribe('H', () => {\n  test('0', () => {\n    const dt = { H: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 'H')).toEqual(dt);\n  });\n\n  test('23', () => {\n    const dt = { H: 23, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('23', 'H')).toEqual(dt);\n  });\n\n  test('24', () => {\n    const dt = { H: 24, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('24', 'H')).toEqual(dt);\n  });\n});\n\ndescribe('hh', () => {\n  test('00', () => {\n    const dt = { h: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('00', 'hh')).toEqual(dt);\n  });\n\n  test('11', () => {\n    const dt = { h: 11, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('11', 'hh')).toEqual(dt);\n  });\n\n  test('12', () => {\n    const dt = { h: 12, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('12', 'hh')).toEqual(dt);\n  });\n});\n\ndescribe('h', () => {\n  test('0', () => {\n    const dt = { h: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 'h')).toEqual(dt);\n  });\n\n  test('11', () => {\n    const dt = { h: 11, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('11', 'h')).toEqual(dt);\n  });\n\n  test('12', () => {\n    const dt = { h: 12, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('12', 'h')).toEqual(dt);\n  });\n});\n\ndescribe('AA', () => {\n  test('A.M.', () => {\n    const dt = { A: 0, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('A.M.', 'AA')).toEqual(dt);\n  });\n\n  test('P.M.', () => {\n    const dt = { A: 1, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('P.M.', 'AA')).toEqual(dt);\n  });\n\n  test('M.M.', () => {\n    const dt = { _index: 0, _length: 4, _match: 0 };\n    expect(preparse('M.M.', 'AA')).toEqual(dt);\n  });\n});\n\ndescribe('A', () => {\n  test('AM', () => {\n    const dt = { A: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('AM', 'A')).toEqual(dt);\n  });\n\n  test('PM', () => {\n    const dt = { A: 1, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('PM', 'A')).toEqual(dt);\n  });\n\n  test('MM', () => {\n    const dt = { _index: 0, _length: 2, _match: 0 };\n    expect(preparse('MM', 'A')).toEqual(dt);\n  });\n});\n\ndescribe('aa', () => {\n  test('a.m.', () => {\n    const dt = { A: 0, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('a.m.', 'aa')).toEqual(dt);\n  });\n\n  test('p.m.', () => {\n    const dt = { A: 1, _index: 4, _length: 4, _match: 1 };\n    expect(preparse('p.m.', 'aa')).toEqual(dt);\n  });\n\n  test('m.m.', () => {\n    const dt = { _index: 0, _length: 4, _match: 0 };\n    expect(preparse('m.m.', 'aa')).toEqual(dt);\n  });\n});\n\ndescribe('a', () => {\n  test('am', () => {\n    const dt = { A: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('am', 'a')).toEqual(dt);\n  });\n\n  test('pm', () => {\n    const dt = { A: 1, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('pm', 'a')).toEqual(dt);\n  });\n\n  test('mm', () => {\n    const dt = { _index: 0, _length: 2, _match: 0 };\n    expect(preparse('mm', 'a')).toEqual(dt);\n  });\n});\n\ndescribe('mm', () => {\n  test('00', () => {\n    const dt = { m: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('00', 'mm')).toEqual(dt);\n  });\n\n  test('59', () => {\n    const dt = { m: 59, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('59', 'mm')).toEqual(dt);\n  });\n\n  test('60', () => {\n    const dt = { m: 60, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('60', 'mm')).toEqual(dt);\n  });\n});\n\ndescribe('m', () => {\n  test('0', () => {\n    const dt = { m: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 'm')).toEqual(dt);\n  });\n\n  test('59', () => {\n    const dt = { m: 59, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('59', 'm')).toEqual(dt);\n  });\n\n  test('60', () => {\n    const dt = { m: 60, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('60', 'm')).toEqual(dt);\n  });\n});\n\ndescribe('ss', () => {\n  test('00', () => {\n    const dt = { s: 0, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('00', 'ss')).toEqual(dt);\n  });\n\n  test('59', () => {\n    const dt = { s: 59, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('59', 'ss')).toEqual(dt);\n  });\n\n  test('60', () => {\n    const dt = { s: 60, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('60', 'ss')).toEqual(dt);\n  });\n});\n\ndescribe('s', () => {\n  test('0', () => {\n    const dt = { s: 0, _index: 1, _length: 1, _match: 1 };\n    expect(preparse('0', 's')).toEqual(dt);\n  });\n\n  test('59', () => {\n    const dt = { s: 59, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('59', 's')).toEqual(dt);\n  });\n\n  test('60', () => {\n    const dt = { s: 60, _index: 2, _length: 2, _match: 1 };\n    expect(preparse('60', 's')).toEqual(dt);\n  });\n});\n\ndescribe('SSS', () => {\n  test('000', () => {\n    const dt = { S: 0, _index: 3, _length: 3, _match: 1 };\n    expect(preparse('000', 'SSS')).toEqual(dt);\n  });\n\n  test('456', () => {\n    const dt = { S: 456, _index: 3, _length: 3, _match: 1 };\n    expect(preparse('456', 'SSS')).toEqual(dt);\n  });\n\n  test('999', () => {\n    const dt = { S: 999, _index: 3, _length: 3, _match: 1 };\n    expect(preparse('999', 'SSS')).toEqual(dt);\n  });\n});\n\ndescribe('SS', () => {\n  test('000', () => {\n    const dt = { S: 0, _index: 2, _length: 3, _match: 1 };\n    expect(preparse('000', 'SS')).toEqual(dt);\n  });\n\n  test('456', () => {\n    const dt = { S: 450, _index: 2, _length: 3, _match: 1 };\n    expect(preparse('456', 'SS')).toEqual(dt);\n  });\n\n  test('999', () => {\n    const dt = { S: 990, _index: 2, _length: 3, _match: 1 };\n    expect(preparse('999', 'SS')).toEqual(dt);\n  });\n});\n\ndescribe('S', () => {\n  test('000', () => {\n    const dt = { S: 0, _index: 1, _length: 3, _match: 1 };\n    expect(preparse('000', 'S')).toEqual(dt);\n  });\n\n  test('456', () => {\n    const dt = { S: 400, _index: 1, _length: 3, _match: 1 };\n    expect(preparse('456', 'S')).toEqual(dt);\n  });\n\n  test('999', () => {\n    const dt = { S: 900, _index: 1, _length: 3, _match: 1 };\n    expect(preparse('999', 'S')).toEqual(dt);\n  });\n});\n\ndescribe('ZZ', () => {\n  test('-08:00', () => {\n    const dt = { Z: 480, _index: 6, _length: 6, _match: 1 };\n    expect(preparse('-08:00', 'ZZ')).toEqual(dt);\n  });\n\n  test('+00:00', () => {\n    const dt = { Z: 0, _index: 6, _length: 6, _match: 1 };\n    expect(preparse('+00:00', 'ZZ')).toEqual(dt);\n  });\n\n  test('+09:00', () => {\n    const dt = { Z: -540, _index: 6, _length: 6, _match: 1 };\n    expect(preparse('+09:00', 'ZZ')).toEqual(dt);\n  });\n});\n\ndescribe('Z', () => {\n  test('-0800', () => {\n    const dt = { Z: 480, _index: 5, _length: 5, _match: 1 };\n    expect(preparse('-0800', 'Z')).toEqual(dt);\n  });\n\n  test('+0000', () => {\n    const dt = { Z: 0, _index: 5, _length: 5, _match: 1 };\n    expect(preparse('+0000', 'Z')).toEqual(dt);\n  });\n\n  test('+0900', () => {\n    const dt = { Z: -540, _index: 5, _length: 5, _match: 1 };\n    expect(preparse('+0900', 'Z')).toEqual(dt);\n  });\n});\n\ndescribe('special tokens', () => {\n  test('ellipsis', () => {\n    const dt1 = { Y: 2000, M: 1, D: 1, h: 0, m: 0, _index: 19, _length: 19, _match: 5 };\n    expect(preparse('2000-01-01 00:00 xx', 'YYYY-MM-DD hh:mm...')).toEqual(dt1);\n  });\n});\n\ndescribe('options', () => {\n  test('hour12: h11', () => {\n    const dt1 = { Y: 2000, M: 1, D: 1, A: 0, h: 0, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 00:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(dt1);\n\n    const dt2 = { Y: 2000, M: 1, D: 1, A: 0, h: 11, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 11:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(dt2);\n\n    const dt3 = { Y: 2000, M: 1, D: 1, A: 1, h: 12, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 12:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(dt3);\n\n    const dt4 = { Y: 2000, M: 1, D: 1, A: 1, h: 11, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 11:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h11' })).toEqual(dt4);\n  });\n\n  test('hour12: h12', () => {\n    const dt1 = { Y: 2000, M: 1, D: 1, A: 0, h: 12, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(dt1);\n\n    const dt2 = { Y: 2000, M: 1, D: 1, A: 0, h: 11, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 11:00 AM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(dt2);\n\n    const dt3 = { Y: 2000, M: 1, D: 1, A: 1, h: 12, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 12:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(dt3);\n\n    const dt4 = { Y: 2000, M: 1, D: 1, A: 1, h: 11, m: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 11:00 PM', 'YYYY-MM-DD hh:mm A', { hour12: 'h12' })).toEqual(dt4);\n  });\n\n  test('hour24: h23', () => {\n    const dt1 = { Y: 2000, M: 1, D: 1, H: 0, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 00:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toEqual(dt1);\n\n    const dt2 = { Y: 2000, M: 1, D: 1, H: 1, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 01:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toEqual(dt2);\n\n    const dt3 = { Y: 2000, M: 1, D: 1, H: 23, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 23:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toEqual(dt3);\n\n    const dt4 = { Y: 2000, M: 1, D: 1, H: 24, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 24:00', 'YYYY-MM-DD HH:mm', { hour24: 'h23' })).toEqual(dt4);\n  });\n\n  test('hour24: h24', () => {\n    const dt1 = { Y: 2000, M: 1, D: 1, H: 0, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 00:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toEqual(dt1);\n\n    const dt2 = { Y: 2000, M: 1, D: 1, H: 1, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 01:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toEqual(dt2);\n\n    const dt3 = { Y: 2000, M: 1, D: 1, H: 23, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 23:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toEqual(dt3);\n\n    const dt4 = { Y: 2000, M: 1, D: 1, H: 24, m: 0, _index: 16, _length: 16, _match: 5 };\n    expect(preparse('2000-01-01 24:00', 'YYYY-MM-DD HH:mm', { hour24: 'h24' })).toEqual(dt4);\n  });\n\n  test('ignoreCase: true', () => {\n    const dt = { Y: 2025, M: 5, D: 4, h: 11, A: 0, _index: 23, _length: 23, _match: 6 };\n\n    expect(preparse('2025 May 4 Sunday 11 AM', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toEqual(dt);\n    expect(preparse('2025 may 4 sunday 11 am', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toEqual(dt);\n    expect(preparse('2025 MAY 4 SUNDAY 11 AM', 'YYYY MMMM D dddd h A', { ignoreCase: true, plugins: [parser] })).toEqual(dt);\n  });\n\n  test('calendar: buddhist', () => {\n    const dt1 = { Y: 2000, M: 1, D: 1, h: 12, m: 0, A: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('2000-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(dt1);\n\n    const dt2 = { Y: 9999, M: 1, D: 1, h: 12, m: 0, A: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('9999-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(dt2);\n\n    const dt3 = { Y: 544, M: 1, D: 1, h: 12, m: 0, A: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('0544-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(dt3);\n\n    const dt4 = { Y: 543, M: 1, D: 1, h: 12, m: 0, A: 0, _index: 19, _length: 19, _match: 6 };\n    expect(preparse('0543-01-01 12:00 AM', 'YYYY-MM-DD hh:mm A', { calendar: 'buddhist' })).toEqual(dt4);\n  });\n});\n"
  },
  {
    "path": "tests/subtract.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { subtract } from '@/index.ts';\n\ndescribe('subtraction', () => {\n  test('One year is 365 days', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2015, 11, 31, 23, 59, 59, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(365);\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: 365 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(365 * 24);\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 365 * 24 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(365 * 24 * 60);\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 365 * 24 * 60 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(365 * 24 * 60 * 60);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 365 * 24 * 60 * 60 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(365 * 24 * 60 * 60 * 1000);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 365 * 24 * 60 * 60 * 1000 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(365 * 24 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 365 * 24 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(365 * 24 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 365 * 24 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One year is 365 days (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2015, 11, 31, 23, 59, 59, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-365);\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: -365 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-365 * 24);\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: -365 * 24 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-365 * 24 * 60);\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -365 * 24 * 60 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-365 * 24 * 60 * 60);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -365 * 24 * 60 * 60 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-365 * 24 * 60 * 60 * 1000);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -365 * 24 * 60 * 60 * 1000 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-365 * 24 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -365 * 24 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-365 * 24 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -365 * 24 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One month is 31 days', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 12, 31, 23, 59, 59, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(31);\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: 31 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(31 * 24);\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 31 * 24 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(31 * 24 * 60);\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 31 * 24 * 60 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(31 * 24 * 60 * 60);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 31 * 24 * 60 * 60 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(31 * 24 * 60 * 60 * 1000);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 31 * 24 * 60 * 60 * 1000 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(31 * 24 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 31 * 24 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(31 * 24 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 31 * 24 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One month is 31 days (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 12, 31, 23, 59, 59, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-31);\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: -31 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-31 * 24);\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: -31 * 24 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-31 * 24 * 60);\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -31 * 24 * 60 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-31 * 24 * 60 * 60);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -31 * 24 * 60 * 60 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-31 * 24 * 60 * 60 * 1000);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -31 * 24 * 60 * 60 * 1000 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-31 * 24 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -31 * 24 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-31 * 24 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -31 * 24 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One day', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 32, 23, 59, 59, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(1);\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: 1 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(24);\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 24 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(24 * 60);\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 24 * 60 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(24 * 60 * 60);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 24 * 60 * 60 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(24 * 60 * 60 * 1000);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 24 * 60 * 60 * 1000 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(24 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 24 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(24 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 24 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One day (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 32, 23, 59, 59, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-1);\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 0, days: -1 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-1 * 24);\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: -1 * 24 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-1 * 24 * 60);\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -1 * 24 * 60 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-1 * 24 * 60 * 60);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1 * 24 * 60 * 60 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-1 * 24 * 60 * 60 * 1000);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1 * 24 * 60 * 60 * 1000 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-1 * 24 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -1 * 24 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-1 * 24 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -1 * 24 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One hour', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 31, 24, 59, 59, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(1 / 24);\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 1, days: 0 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(1);\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: 1 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(60);\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 60 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(60 * 60);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 60 * 60 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(60 * 60 * 1000);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 60 * 60 * 1000 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(60 * 60 * 1000 * 1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One hour (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 31, 24, 59, 59, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-1 / 24);\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: -1, days: 0 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-1);\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 0, hours: -1 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-1 * 60);\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -1 * 60 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-1 * 60 * 60);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1 * 60 * 60 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-1 * 60 * 60 * 1000);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1 * 60 * 60 * 1000 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-1 * 60 * 60 * 1000 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -1 * 60 * 60 * 1000 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-1 * 60 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -1 * 60 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One minute', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 31, 23, 60, 59, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(1 / (24 * 60));\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 1, hours: 0, days: 0 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(1 / 60);\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 1, hours: 0 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(1);\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: 1 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(60);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 60 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(60 * 1000);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 60 * 1000 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(60 * 1000 * 1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 60 * 1000 * 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(60 * 1000 * 1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One minute (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 31, 23, 60, 59, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-1 / (24 * 60));\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -1, hours: 0, days: 0 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-1 / 60);\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -1, hours: 0 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-1);\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 0, minutes: -1 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-1 * 60);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1 * 60 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-1 * 60 * 1000);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1 * 60 * 1000 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-1 * 60 * 1000 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -1 * 60 * 1000 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-1 * 60 * 1000 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -1 * 60 * 1000 * 1000 * 1000 });\n  });\n\n  test('One second', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 31, 23, 59, 60, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(1 / (24 * 60 * 60));\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 1, minutes: 0, hours: 0, days: 0 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(1 / (60 * 60));\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 1, minutes: 0, hours: 0 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(1 / 60);\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 1, minutes: 0 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(1);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: 1 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(1000);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 1000 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(1000 * 1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 1000 * 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(1000 * 1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 1000 * 1000 * 1000 });\n  });\n\n  test('One second (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 999);\n    const date2 = new Date(2014, 11, 31, 23, 59, 60, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-1 / (24 * 60 * 60));\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1, minutes: 0, hours: 0, days: 0 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-1 / (60 * 60));\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1, minutes: 0, hours: 0 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-1 / 60);\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1, minutes: 0 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-1);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 0, seconds: -1 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-1 * 1000);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1 * 1000 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-1 * 1000 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -1 * 1000 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-1 * 1000 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -1 * 1000 * 1000 * 1000 });\n  });\n\n  test('One millisecond', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 998);\n    const date2 = new Date(2014, 11, 31, 23, 59, 59, 999);\n\n    expect(subtract(date1, date2).toDays().value).toBe(1 / (24 * 60 * 60 * 1000));\n    expect(subtract(date1, date2).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 1, seconds: 0, minutes: 0, hours: 0, days: 0 });\n\n    expect(subtract(date1, date2).toHours().value).toBe(1 / (60 * 60 * 1000));\n    expect(subtract(date1, date2).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 1, seconds: 0, minutes: 0, hours: 0 });\n\n    expect(subtract(date1, date2).toMinutes().value).toBe(1 / (60 * 1000));\n    expect(subtract(date1, date2).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 1, seconds: 0, minutes: 0 });\n\n    expect(subtract(date1, date2).toSeconds().value).toBe(1 / 1000);\n    expect(subtract(date1, date2).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 1, seconds: 0 });\n\n    expect(subtract(date1, date2).toMilliseconds().value).toBe(1);\n    expect(subtract(date1, date2).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: 1 });\n\n    expect(subtract(date1, date2).toMicroseconds().value).toBe(1000);\n    expect(subtract(date1, date2).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 1000 });\n\n    expect(subtract(date1, date2).toNanoseconds().value).toBe(1000 * 1000);\n    expect(subtract(date1, date2).toNanoseconds().toParts()).toEqual({ nanoseconds: 1000 * 1000 });\n  });\n\n  test('One millisecond (reverse)', () => {\n    const date1 = new Date(2014, 11, 31, 23, 59, 59, 998);\n    const date2 = new Date(2014, 11, 31, 23, 59, 59, 999);\n\n    expect(subtract(date2, date1).toDays().value).toBe(-1 / (24 * 60 * 60 * 1000));\n    expect(subtract(date2, date1).toDays().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1, seconds: 0, minutes: 0, hours: 0, days: 0 });\n\n    expect(subtract(date2, date1).toHours().value).toBe(-1 / (60 * 60 * 1000));\n    expect(subtract(date2, date1).toHours().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1, seconds: 0, minutes: 0, hours: 0 });\n\n    expect(subtract(date2, date1).toMinutes().value).toBe(-1 / (60 * 1000));\n    expect(subtract(date2, date1).toMinutes().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1, seconds: 0, minutes: 0 });\n\n    expect(subtract(date2, date1).toSeconds().value).toBe(-1 / 1000);\n    expect(subtract(date2, date1).toSeconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1, seconds: 0 });\n\n    expect(subtract(date2, date1).toMilliseconds().value).toBe(-1);\n    expect(subtract(date2, date1).toMilliseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: 0, milliseconds: -1 });\n\n    expect(subtract(date2, date1).toMicroseconds().value).toBe(-1 * 1000);\n    expect(subtract(date2, date1).toMicroseconds().toParts()).toEqual({ nanoseconds: 0, microseconds: -1 * 1000 });\n\n    expect(subtract(date2, date1).toNanoseconds().value).toBe(-1 * 1000 * 1000);\n    expect(subtract(date2, date1).toNanoseconds().toParts()).toEqual({ nanoseconds: -1 * 1000 * 1000 });\n  });\n\n  test('format', () => {\n    const date1 = new Date(2025, 6, 13, 8, 42, 53, 998);\n    const date2 = new Date(2025, 6, 14, 9, 43, 54, 999);\n\n    expect(subtract(date1, date2).toDays().format('D[days] H[hours] m[minites] s[seconds] S.fffFFF')).toBe('1days 1hours 1minites 1seconds 1.000000');\n    expect(subtract(date1, date2).toHours().format('H[hours] m[minites] s[seconds] S.fffFFF')).toBe('25hours 1minites 1seconds 1.000000');\n    expect(subtract(date1, date2).toMinutes().format('m[minites] s[seconds] S.fffFFF')).toBe('1501minites 1seconds 1.000000');\n    expect(subtract(date1, date2).toSeconds().format('s[seconds] S.fffFFF')).toBe('90061seconds 1.000000');\n    expect(subtract(date1, date2).toMilliseconds().format('S.fffFFF')).toBe('90061001.000000');\n    expect(subtract(date1, date2).toMicroseconds().format('f.FFF')).toBe('90061001000.000');\n    expect(subtract(date1, date2).toNanoseconds().format('F')).toBe('90061001000000');\n  });\n\n  test('format (reverse)', () => {\n    const date1 = new Date(2025, 6, 13, 8, 42, 53, 998);\n    const date2 = new Date(2025, 6, 14, 9, 43, 54, 999);\n\n    expect(subtract(date2, date1).toDays().format('D[days] H[hours] m[minites] s[seconds] S.fffFFF')).toBe('-1days 1hours 1minites 1seconds 1.000000');\n    expect(subtract(date2, date1).toHours().format('H[hours] m[minites] s[seconds] S.fffFFF')).toBe('-25hours 1minites 1seconds 1.000000');\n    expect(subtract(date2, date1).toMinutes().format('m[minites] s[seconds] S.fffFFF')).toBe('-1501minites 1seconds 1.000000');\n    expect(subtract(date2, date1).toSeconds().format('s[seconds] S.fffFFF')).toBe('-90061seconds 1.000000');\n    expect(subtract(date2, date1).toMilliseconds().format('S.fffFFF')).toBe('-90061001.000000');\n    expect(subtract(date2, date1).toMicroseconds().format('f.FFF')).toBe('-90061001000.000');\n    expect(subtract(date2, date1).toNanoseconds().format('F')).toBe('-90061001000000');\n  });\n});\n"
  },
  {
    "path": "tests/timezones/timezones.spec.ts",
    "content": "import { expect, test, describe } from 'vitest';\nimport { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { TimeZone } from '@/zone.ts';\n\nconst importModules = async (path: string) => {\n  const items = await readdir(path, { recursive: true, withFileTypes: true });\n  const modules: TimeZone[] = [];\n\n  for (const item of items) {\n    if (item.isFile()) {\n      modules.push((await import(join('../../', item.parentPath, item.name)) as { default: TimeZone }).default);\n    }\n  }\n  return modules;\n};\n\ndescribe('Timezones', async () => {\n  const modules = await importModules('src/timezones/');\n\n  for (const module of modules) {\n    test.concurrent('timezone', () => {\n      expect(typeof module === 'object').toBe(true);\n\n      expect('zone_name' in module).toBe(true);\n      expect(typeof module.zone_name === 'string').toBe(true);\n\n      expect('gmt_offset' in module).toBe(true);\n      expect(Array.isArray(module.gmt_offset)).toBe(true);\n    });\n  }\n});\n"
  },
  {
    "path": "tests/transform.spec.ts",
    "content": "import { describe, expect, test, beforeAll } from 'vitest';\nimport { compile, format, transform } from '@/index.ts';\nimport Los_Angeles from '@/timezones/America/Los_Angeles.ts';\nimport New_York from '@/timezones/America/New_York.ts';\nimport Tokyo from '@/timezones/Asia/Tokyo.ts';\n\nbeforeAll(() => (process.env.TZ = 'UTC'));\n\ndescribe('transform', () => {\n  test('D/M/YYYY => M/D/YYYY', () => {\n    expect(transform('3/8/2020', 'D/M/YYYY', 'M/D/YYYY')).toBe('8/3/2020');\n  });\n\n  test('HH:mm => hh:mm A', () => {\n    expect(transform('13:05', 'HH:mm', 'hh:mm A')).toBe('01:05 PM');\n  });\n\n  test('HH:mm => hh:mm A, output as UTC', () => {\n    const utc = format(new Date(2020, 3, 1, 13, 5), 'hh:mm A');\n    expect(transform('13:05', 'HH:mm', 'hh:mm A')).toBe(utc);\n  });\n\n  test('D/M/YYYY => M/D/YYYY, with compile', () => {\n    const arg1 = compile('D/M/YYYY');\n    const arg2 = compile('M/D/YYYY');\n    expect(transform('3/8/2020', arg1, arg2)).toBe('8/3/2020');\n  });\n\n  test('transform EST to PST', () => {\n    const string1 = '2021-11-07T04:00:00.000';  // UTC-5\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'November 7 2021 1:00:00.000';  // UTC-8\n\n    // 2021-11-07T04:00:00.000 => November 7 2021 1:00:00.000\n    expect(transform(string1, formatString1, formatString2, { timeZone: New_York }, { timeZone: Los_Angeles })).toBe(string2);\n  });\n\n  test('transform EST to PDT (End of DST)', () => {\n    const string1 = '2021-11-07T03:59:59.999';  // UTC-5\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'November 7 2021 1:59:59.999';  // UTC-7\n\n    // 2021-11-07T03:59:59.999 => November 7 2021 1:59:59.999\n    expect(transform(string1, formatString1, formatString2, { timeZone: New_York }, { timeZone: Los_Angeles })).toBe(string2);\n  });\n\n  test('transform EDT to PST', () => {\n    const string1 = '2021-03-14T05:59:59.999';  // UTC-4\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'March 14 2021 1:59:59.999';  // UTC-8\n\n    // 2021-03-14T05:59:59.999 => March 14 2021 1:59:59.999\n    expect(transform(string1, formatString1, formatString2, { timeZone: New_York }, { timeZone: Los_Angeles })).toBe(string2);\n  });\n\n  test('transform EDT to PDT (Start of DST)', () => {\n    const string1 = '2021-03-14T06:00:00.000';  // UTC-4\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'March 14 2021 3:00:00.000';  // UTC-7\n\n    // 2021-03-14T06:00:00.000 => March 14 2021 3:00:00.000\n    expect(transform(string1, formatString1, formatString2, { timeZone: New_York }, { timeZone: Los_Angeles })).toBe(string2);\n  });\n\n  test('transform PST to JST', () => {\n    const string1 = '2021-03-14T01:59:59.999';  // UTC-8\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'March 14 2021 18:59:59.999'; // UTC+9\n\n    // 2021-03-14T01:59:59.999 => March 14 2021 18:59:59.999\n    expect(transform(string1, formatString1, formatString2, { timeZone: Los_Angeles }, { timeZone: Tokyo })).toBe(string2);\n  });\n\n  test('transform PDT to JST', () => {\n    const string1 = '2021-03-14T03:00:00.000';  // UTC-7\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'March 14 2021 19:00:00.000'; // UTC+9\n\n    // 2021-03-14T03:00:00.000 => March 14 2021 19:00:00.000\n    expect(transform(string1, formatString1, formatString2, { timeZone: Los_Angeles }, { timeZone: Tokyo })).toBe(string2);\n  });\n\n  test('transform UTC to JST', () => {\n    const string1 = '2021-03-14T03:00:00.000';  // UTC+0\n    const formatString1 = 'YYYY-MM-DD[T]HH:mm:ss.SSS';\n    const formatString2 = 'MMMM D YYYY H:mm:ss.SSS';\n    const string2 = 'March 14 2021 12:00:00.000'; // UTC+9\n\n    // 2021-03-14T03:00:00.000 => March 14 2021 12:00:00.000\n    expect(transform(string1, formatString1, formatString2, { timeZone: 'UTC' }, { timeZone: Tokyo })).toBe(string2);\n  });\n});\n"
  },
  {
    "path": "tests/utils.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\nimport { isLeapYear, isSameDay, getDaysInMonth, getISOWeekYear, getISOWeek } from '@/index.ts';\n\ntest('isLeapYear', () => {\n  expect(isLeapYear(4)).toBe(true);\n  expect(isLeapYear(100)).toBe(false);\n  expect(isLeapYear(400)).toBe(true);\n  expect(isLeapYear(2024)).toBe(true);\n  expect(isLeapYear(2025)).toBe(false);\n});\n\ntest('isSameDay', () => {\n  const date1 = new Date(2025, 6, 18, 0, 0, 0, 0);\n  const date2 = new Date(2025, 6, 18, 23, 59, 59, 999);\n\n  expect(isSameDay(date1, date2)).toBe(true);\n\n  const date3 = new Date(2025, 6, 18, 23, 59, 59, 999);\n  const date4 = new Date(2025, 6, 19, 0, 0, 0, 0);\n\n  expect(isSameDay(date3, date4)).toBe(false);\n});\n\ndescribe('getDaysInMonth', () => {\n  test('Date overload', () => {\n    expect(getDaysInMonth(new Date(2024, 0, 15))).toBe(31);   // Jan\n    expect(getDaysInMonth(new Date(2024, 1, 15))).toBe(29);   // Feb (leap year)\n    expect(getDaysInMonth(new Date(2025, 1, 15))).toBe(28);   // Feb (non-leap year)\n    expect(getDaysInMonth(new Date(2024, 3, 15))).toBe(30);   // Apr\n    expect(getDaysInMonth(new Date(2024, 11, 15))).toBe(31);  // Dec\n  });\n\n  test('(year, month) overload', () => {\n    expect(getDaysInMonth(2024, 1)).toBe(31);   // Jan\n    expect(getDaysInMonth(2024, 2)).toBe(29);   // Feb (leap year)\n    expect(getDaysInMonth(2025, 2)).toBe(28);   // Feb (non-leap year)\n    expect(getDaysInMonth(2024, 4)).toBe(30);   // Apr\n    expect(getDaysInMonth(2024, 12)).toBe(31);  // Dec\n  });\n\n  test('leap year rules', () => {\n    expect(getDaysInMonth(2000, 2)).toBe(29); // divisible by 400 → leap\n    expect(getDaysInMonth(2100, 2)).toBe(28); // divisible by 100, not 400 → non-leap\n    expect(getDaysInMonth(2400, 2)).toBe(29); // divisible by 400 → leap\n    expect(getDaysInMonth(2024, 2)).toBe(29); // divisible by 4, not 100 → leap\n    expect(getDaysInMonth(2023, 2)).toBe(28); // not divisible by 4 → non-leap\n  });\n\n  test('Date overload for year < 100', () => {\n    // year 4 is a leap year\n    const date = new Date(4, 1 - 1900 * 12, 15);\n\n    expect(getDaysInMonth(date)).toBe(29);\n  });\n});\n\ndescribe('getISOWeekYear', () => {\n  test('Date overload', () => {\n    expect(getISOWeekYear(new Date(2024, 0, 1))).toBe(2024);    // Mon Jan 1 → week 1 of 2024\n    expect(getISOWeekYear(new Date(2024, 11, 29))).toBe(2024);  // Sun Dec 29 → week 52 of 2024\n    expect(getISOWeekYear(new Date(2024, 11, 30))).toBe(2025);  // Mon Dec 30 → week 1 of 2025\n    expect(getISOWeekYear(new Date(2021, 0, 1))).toBe(2020);    // Fri Jan 1 → week 53 of 2020\n  });\n\n  test('(year, month, day) overload', () => {\n    expect(getISOWeekYear(2024, 1, 1)).toBe(2024);    // Jan 1\n    expect(getISOWeekYear(2024, 12, 30)).toBe(2025);  // Dec 30\n    expect(getISOWeekYear(2021, 1, 1)).toBe(2020);    // Jan 1\n  });\n\n  test('Date overload for year < 100', () => {\n    // year 3: Dec 29 is a Monday → its Thursday is Jan 1 of year 4 → iso year = 4\n    const date1 = new Date(3, 11 - 1900 * 12, 29);\n\n    expect(getISOWeekYear(date1)).toBe(4);\n\n    // year 4: Jan 5 is a Monday → belongs to week 2 of year 4\n    const date2 = new Date(4, 0 - 1900 * 12, 5);\n\n    expect(getISOWeekYear(date2)).toBe(4);\n  });\n\n  test('(year, month, day) overload for year < 100', () => {\n    // year 3: Dec 29 is a Monday → its Thursday is Jan 1 of year 4 → iso year = 4\n    expect(getISOWeekYear(3, 12, 29)).toBe(4);\n\n    // year 4: Jan 5 is a Monday → belongs to week 2 of year 4\n    expect(getISOWeekYear(4, 1, 5)).toBe(4);\n  });\n});\n\ndescribe('getISOWeek', () => {\n  test('Date overload', () => {\n    expect(getISOWeek(new Date(2024, 0, 1))).toBe(1);     // Mon Jan 1 → week 1\n    expect(getISOWeek(new Date(2024, 0, 7))).toBe(1);     // Sun Jan 7 → still week 1\n    expect(getISOWeek(new Date(2024, 0, 8))).toBe(2);     // Mon Jan 8 → week 2\n    expect(getISOWeek(new Date(2024, 6, 4))).toBe(27);    // Thu Jul 4 → week 27\n    expect(getISOWeek(new Date(2024, 11, 23))).toBe(52);  // Mon Dec 23 → week 52\n    expect(getISOWeek(new Date(2024, 11, 30))).toBe(1);   // Mon Dec 30 → week 1 of 2025\n    expect(getISOWeek(new Date(2021, 0, 1))).toBe(53);    // Fri Jan 1 → week 53 of 2020\n    expect(getISOWeek(new Date(2015, 11, 31))).toBe(53);  // Thu Dec 31 → week 53 of 2015\n  });\n\n  test('(year, month, day) overload', () => {\n    expect(getISOWeek(2024, 1, 1)).toBe(1);   // Jan 1\n    expect(getISOWeek(2024, 1, 8)).toBe(2);   // Jan 8\n    expect(getISOWeek(2024, 7, 4)).toBe(27);  // Jul 4\n    expect(getISOWeek(2021, 1, 1)).toBe(53);  // Jan 1\n  });\n\n  test('Date overload for year < 100', () => {\n    // year 4: Jan 5 is a Monday → belongs to week 2 of year 4\n    const date1 = new Date(4, 0 - 1900 * 12, 5);\n\n    expect(getISOWeek(date1)).toBe(2);\n\n    // year 4: Dec 31 is a Friday → its Thursday is Dec 30 → week 53 of year 4\n    const date2 = new Date(4, 11 - 1900 * 12, 31);\n\n    expect(getISOWeek(date2)).toBe(53);\n  });\n\n  test('(year, month, day) overload for year < 100', () => {\n    // year 4: Jan 5 is a Monday → belongs to week 2 of year 4\n    expect(getISOWeek(4, 1, 5)).toBe(2);\n\n    // year 4: Dec 31 is a Friday → its Thursday is Dec 30 → week 53 of year 4\n    expect(getISOWeek(4, 12, 31)).toBe(53);\n  });\n});\n"
  },
  {
    "path": "tools/locale.ts",
    "content": "const compare = (array1: string[], array2: string[]) => {\n  if (array1.length !== array2.length) {\n    return false;\n  }\n  for (let i = 0, len = array1.length; i < len; i++) {\n    if (array1[i] !== array2[i]) {\n      return false;\n    }\n  }\n  return true;\n};\n\nconst getMonths = (locale: string, style: 'long' | 'short' | 'narrow') => {\n  const options1: Intl.DateTimeFormatOptions = { hour12: true, weekday: 'long', year: 'numeric', month: style, hour: 'numeric' };\n  const options2: Intl.DateTimeFormatOptions = { ...options1, day: 'numeric' };\n  const dtf1 = new Intl.DateTimeFormat(locale, options1);\n  const dtf2 = new Intl.DateTimeFormat(locale, options2);\n  const months1 = [];\n  const months2 = [];\n\n  for (let i = 0; i < 12; i++) {\n    months1.push(dtf1.formatToParts(new Date(2024, i, 1, 0)).find(p => p.type === 'month')?.value ?? '');\n  }\n  for (let i = 0; i < 12; i++) {\n    months2.push(dtf2.formatToParts(new Date(2024, i, 1, 0)).find(p => p.type === 'month')?.value ?? '');\n  }\n  return compare(months1, months2) ? months1 : [months1, months2];\n};\n\nconst getWeekdays = (locale: string, style: 'long' | 'short' | 'narrow') => {\n  const options1: Intl.DateTimeFormatOptions = { hour12: true, weekday: style, year: 'numeric', month: 'long', hour: 'numeric' };\n  const options2: Intl.DateTimeFormatOptions = { ...options1, day: 'numeric' };\n  const dtf1 = new Intl.DateTimeFormat(locale, options1);\n  const dtf2 = new Intl.DateTimeFormat(locale, options2);\n  const weekdays1 = [];\n  const weekdays2 = [];\n\n  for (let i = 1; i <= 7; i++) {\n    weekdays1.push(dtf1.formatToParts(new Date(2024, 11, i, 0)).find(p => p.type === 'weekday')?.value ?? '');\n  }\n  for (let i = 1; i <= 7; i++) {\n    weekdays2.push(dtf2.formatToParts(new Date(2024, 11, i, 0)).find(p => p.type === 'weekday')?.value ?? '');\n  }\n  return compare(weekdays1, weekdays2) ? weekdays1 : [weekdays1, weekdays2];\n};\n\nconst getDayPeriod = (locale: string) => {\n  const options1: Intl.DateTimeFormatOptions = { hour12: true, hour: 'numeric' };\n  const options2: Intl.DateTimeFormatOptions = { ...options1, weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };\n  const dtf1 = new Intl.DateTimeFormat(locale, options1);\n  const dtf2 = new Intl.DateTimeFormat(locale, options2);\n  const dayperiod1: string[] = [];\n  const dayperiod2: string[] = [];\n\n  for (let i = 0; i < 24; i++) {\n    const value = dtf1.formatToParts(new Date(2024, 11, 1, i)).find(p => p.type === 'dayPeriod')?.value ?? '';\n    if (!dayperiod1.includes(value)) {\n      dayperiod1.push(value);\n    }\n  }\n  for (let i = 0; i < 24; i++) {\n    const value = dtf2.formatToParts(new Date(2024, 11, 1, i)).find(p => p.type === 'dayPeriod')?.value ?? '';\n    if (!dayperiod2.includes(value)) {\n      dayperiod2.push(value);\n    }\n  }\n  return compare(dayperiod1, dayperiod2) ? dayperiod1 : [dayperiod1, dayperiod2];\n};\n\nconst getParts = (locale: string) => {\n  const options: Intl.DateTimeFormatOptions = {\n    hour12: false, weekday: 'long',\n    year: 'numeric', month: 'long', day: 'numeric',\n    hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3,\n    timeZone: 'UTC', timeZoneName: 'longOffset'\n  };\n  const parts = new Intl.DateTimeFormat(locale, options).formatToParts(new Date());\n\n  return parts.filter(part => part.type !== 'literal');\n};\n\nconst getDate = (locale: string) => {\n  const options: Intl.DateTimeFormatOptions = {\n    hour12: true, weekday: 'short',\n    year: 'numeric', month: 'short', day: 'numeric',\n    hour: 'numeric', minute: 'numeric', second: 'numeric', fractionalSecondDigits: 3,\n    timeZone: 'Europe/Paris', timeZoneName: 'longOffset'\n  };\n  return new Intl.DateTimeFormat(locale, options).format(new Date());\n};\n\nconst locale = process.argv[2];\n\nif (!locale) {\n  process.exit();\n}\n\nconst list = {\n  MMMM: getMonths(locale, 'long'),\n  MMM: getMonths(locale, 'short'),\n  dddd: getWeekdays(locale, 'long'),\n  ddd: getWeekdays(locale, 'short'),\n  dd: getWeekdays(locale, 'narrow'),\n  A: getDayPeriod(locale)\n};\n\nconsole.log(JSON.stringify(list, undefined, 2));\nconsole.log(JSON.stringify(getParts(locale), undefined, 2));\nconsole.log(getDate(locale));\n"
  },
  {
    "path": "tools/timezone.ts",
    "content": "/**\n * @description\n * This script generates timezone data files from a CSV file obtained from timezonedb.com,\n * creates individual timezone files, and an integrated timezone file for easier imports.\n */\n\nimport { readFile, mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport prettier from 'prettier';\nimport type { TimeZone } from '@/zone.ts';\n\nconst createTimeZones = (csv: string) => {\n  const map = new Map<string, TimeZone>();\n\n  csv.split('\\n').forEach(line => {\n    const [zone_name, , , , gmt_offset] = line.split(',');\n\n    if (zone_name && !zone_name.endsWith('UTC')) {\n      const data = map.get(zone_name);\n\n      if (data) {\n        if (!data.gmt_offset.includes(+gmt_offset)) {\n          data.gmt_offset.push(+gmt_offset);\n        }\n      } else {\n        map.set(zone_name, { zone_name, gmt_offset: [+gmt_offset] });\n      }\n    }\n  });\n  return map;\n};\n\nconst getPath = (timezone: TimeZone) => {\n  const re = /[^/]+$/;\n  return {\n    dir: join('src', 'timezones', timezone.zone_name.replace(re, '')),\n    name: re.exec(timezone.zone_name)?.[0] ?? ''\n  };\n};\n\nconst format = (timezone: TimeZone) => {\n  const code = `export default {\n    zone_name: '${timezone.zone_name}',\n    gmt_offset: ${JSON.stringify(timezone.gmt_offset.sort((a, b) => b - a))}\n  };`;\n  return prettier.format(code, { parser: 'typescript', singleQuote: true, trailingComma: 'none' });\n};\n\nconst sortMap = (map: Map<string, TimeZone>) => {\n  return Array.from(map.values()).sort((a, b) => getPath(a).name.localeCompare(getPath(b).name));\n};\n\nconst formatAll = (map: Map<string, TimeZone>) => {\n  const code = [];\n\n  code.push('import { TimeZone } from \\'@/zone.ts\\';');\n\n  for (const timezone of sortMap(map)) {\n    const name = getPath(timezone).name.replace(/-/g, '_');\n\n    code.push(`export const ${name}: TimeZone = {\n      zone_name: '${timezone.zone_name}',\n      gmt_offset: ${JSON.stringify(timezone.gmt_offset.sort((a, b) => b - a))}\n    };`);\n  }\n  return prettier.format(code.join('\\n\\n'), { parser: 'typescript', singleQuote: true, trailingComma: 'none' });\n};\n\nconst path = process.argv[2];\n\nif (!path) {\n  console.error('Please provide a CSV file path');\n  process.exit();\n}\n\nconst csv = await readFile(path, 'utf8');\nconst map = createTimeZones(csv);\n\n// Generate individual timezone files\nfor (const timezone of map.values()) {\n  const { dir, name } = getPath(timezone);\n\n  await mkdir(dir, { recursive: true });\n  await writeFile(join(dir, `${name}.ts`), await format(timezone));\n}\n\n// Generate integrated timezone file\nawait writeFile(join('src', 'timezone.ts'), await formatAll(map));\n"
  },
  {
    "path": "tools/zonename.ts",
    "content": "/**\n * @description\n * This script reads timezone data from a CSV file obtained from timezonedb.com,\n * extracts unique timezone names, and generates a mapping of timezone long names\n * to their abbreviations by analyzing timezone name variations across historical time periods.\n */\n\nimport { readFile } from 'node:fs/promises';\nimport prettier from 'prettier';\nimport zonenames from '@/zonenames.ts';\n\nconst getTimezone = async (path: string) => {\n  try {\n    const csv = await readFile(path, 'utf8');\n    const timezones = new Set<string>();\n\n    csv.split('\\n').forEach(line => {\n      const [zone_name] = line.split(',');\n\n      if (zone_name) {\n        timezones.add(zone_name);\n      }\n    });\n    return Array.from(timezones);\n  } catch (e) {\n    console.error(`Error reading CSV file: ${path}`);\n    console.error(e);\n    return [];\n  }\n};\n\n// Extract the timezone name from the formatted date parts\nconst getTimezoneName = (dtf: Intl.DateTimeFormat, time: number) => {\n  return dtf.formatToParts(time).find(part => part.type === 'timeZoneName')?.value.replace(/^GMT([+-].+)?$/, '') ?? '';\n};\n\n// Extract timezone names and their abbreviations by analyzing historical time periods\nconst getTimezoneNames = (timeZone: string, names: Record<string, string>) => {\n  const dtf = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'long' });\n  const map = new Map<string, string>();\n  const errors = new Set<string>();\n\n  const start = Date.UTC(0, -12 * 16, 1);                   // year 1884\n  const end = Date.UTC(new Date().getUTCFullYear(), 0, 1);  // current year\n  const step = 30 * 24 * 60 * 60 * 1000;                    // 30days\n\n  for (let i = start, len = end; i < len; i += step) {\n    const timeZoneName = getTimezoneName(dtf, i);\n\n    if (timeZoneName && !map.has(timeZoneName)) {\n      const abbreviation = names[timeZoneName];\n\n      if (abbreviation) {\n        map.set(timeZoneName, abbreviation);\n      } else {\n        errors.add(timeZoneName);\n      }\n    }\n  }\n  return { names: map, errors };\n};\n\nconst sort = (timeZoneNames: Map<string, string>) => {\n  return new Map(Array.from(timeZoneNames).sort((a, b) => a[0].localeCompare(b[0])));\n};\n\nconst format = (code: Map<string, string>) => {\n  return prettier.format(`export default {\n    ${Array.from(code).map(([key, value]) => `'${key}': '${value}',`).join('\\n')}\n  };`, { parser: 'typescript', singleQuote: true, trailingComma: 'none' });\n};\n\nconst path = process.argv[2];\n\nif (!path) {\n  console.error('Please provide a CSV file path');\n  process.exit();\n}\n\nconst timezones = await getTimezone(path);\nconst timeZoneNames = new Map<string, string>();\nconst errorNames = new Set<string>();\n\n// Extract timezone names and their abbreviations by analyzing historical time periods\ntimezones.forEach(timeZone => {\n  const { names, errors } = getTimezoneNames(timeZone, zonenames);\n\n  for (const [key, value] of names.entries()) {\n    timeZoneNames.set(key, value);\n  }\n  errors.forEach(err => errorNames.add(err));\n});\n\n// Add missing timezone names from the existing mapping\nfor (const [key, value] of Object.entries(zonenames)) {\n  if (!timeZoneNames.has(key)) {\n    timeZoneNames.set(key, value);\n  }\n}\n\nif (errorNames.size) {\n  // Log any timezone names that were not found in the existing mapping\n  console.error('Not Found');\n  console.error(Array.from(errorNames));\n} else {\n  // Output the final mapping of timezone long names to their abbreviations\n  process.stdout.write(await format(sort(timeZoneNames)));\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    /* Visit https://aka.ms/tsconfig to read more about this file */\n\n    /* Projects */\n    // \"incremental\": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */\n    // \"composite\": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */\n    // \"tsBuildInfoFile\": \"./.tsbuildinfo\",              /* Specify the path to .tsbuildinfo incremental compilation file. */\n    // \"disableSourceOfProjectReferenceRedirect\": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */\n    // \"disableSolutionSearching\": true,                 /* Opt a project out of multi-project reference checking when editing. */\n    // \"disableReferencedProjectLoad\": true,             /* Reduce the number of projects loaded automatically by TypeScript. */\n\n    /* Language and Environment */\n    \"target\": \"ES2021\",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */\n    \"lib\": [\"ES2021\", \"DOM\"],                            /* Specify a set of bundled library declaration files that describe the target runtime environment. */\n    // \"jsx\": \"preserve\",                                /* Specify what JSX code is generated. */\n    // \"experimentalDecorators\": true,                   /* Enable experimental support for legacy experimental decorators. */\n    // \"emitDecoratorMetadata\": true,                    /* Emit design-type metadata for decorated declarations in source files. */\n    // \"jsxFactory\": \"\",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */\n    // \"jsxFragmentFactory\": \"\",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */\n    // \"jsxImportSource\": \"\",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */\n    // \"reactNamespace\": \"\",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */\n    // \"noLib\": true,                                    /* Disable including any library files, including the default lib.d.ts. */\n    // \"useDefineForClassFields\": true,                  /* Emit ECMAScript-standard-compliant class fields. */\n    // \"moduleDetection\": \"auto\",                        /* Control what method is used to detect module-format JS files. */\n\n    /* Modules */\n    \"module\": \"ESNext\",                                  /* Specify what module code is generated. */\n    // \"rootDir\": \"./\",                                  /* Specify the root folder within your source files. */\n    \"moduleResolution\": \"bundler\",                       /* Specify how TypeScript looks up a file from a given module specifier. */\n    // \"baseUrl\": \"./\",                                  /* Specify the base directory to resolve non-relative module names. */\n    \"paths\": { \"@/*\": [\"./src/*\"] },                     /* Specify a set of entries that re-map imports to additional lookup locations. */\n    // \"rootDirs\": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */\n    // \"typeRoots\": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */\n    // \"types\": [],                                      /* Specify type package names to be included without being referenced in a source file. */\n    // \"allowUmdGlobalAccess\": true,                     /* Allow accessing UMD globals from modules. */\n    // \"moduleSuffixes\": [],                             /* List of file name suffixes to search when resolving a module. */\n    \"allowImportingTsExtensions\": true,                  /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */\n    // \"resolvePackageJsonExports\": true,                /* Use the package.json 'exports' field when resolving package imports. */\n    // \"resolvePackageJsonImports\": true,                /* Use the package.json 'imports' field when resolving imports. */\n    // \"customConditions\": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */\n    // \"resolveJsonModule\": true,                        /* Enable importing .json files. */\n    // \"allowArbitraryExtensions\": true,                 /* Enable importing files with any extension, provided a declaration file is present. */\n    // \"noResolve\": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */\n\n    /* JavaScript Support */\n    // \"allowJs\": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */\n    // \"checkJs\": true,                                  /* Enable error reporting in type-checked JavaScript files. */\n    // \"maxNodeModuleJsDepth\": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */\n\n    /* Emit */\n    \"declaration\": true,                                 /* Generate .d.ts files from TypeScript and JavaScript files in your project. */\n    // \"declarationMap\": true,                           /* Create sourcemaps for d.ts files. */\n    \"emitDeclarationOnly\": true,                         /* Only output d.ts files and not JavaScript files. */\n    // \"sourceMap\": true,                                /* Create source map files for emitted JavaScript files. */\n    // \"inlineSourceMap\": true,                          /* Include sourcemap files inside the emitted JavaScript. */\n    // \"outFile\": \"./\",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */\n    // \"outDir\": \"./\",                                   /* Specify an output folder for all emitted files. */\n    // \"removeComments\": true,                           /* Disable emitting comments. */\n    // \"noEmit\": true,                                   /* Disable emitting files from a compilation. */\n    // \"importHelpers\": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */\n    // \"downlevelIteration\": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */\n    // \"sourceRoot\": \"\",                                 /* Specify the root path for debuggers to find the reference source code. */\n    // \"mapRoot\": \"\",                                    /* Specify the location where debugger should locate map files instead of generated locations. */\n    // \"inlineSources\": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */\n    // \"emitBOM\": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */\n    // \"newLine\": \"crlf\",                                /* Set the newline character for emitting files. */\n    // \"stripInternal\": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */\n    // \"noEmitHelpers\": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */\n    // \"noEmitOnError\": true,                            /* Disable emitting files if any type checking errors are reported. */\n    // \"preserveConstEnums\": true,                       /* Disable erasing 'const enum' declarations in generated code. */\n    // \"declarationDir\": \"./\",                           /* Specify the output directory for generated declaration files. */\n\n    /* Interop Constraints */\n    // \"isolatedModules\": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */\n    // \"verbatimModuleSyntax\": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */\n    // \"isolatedDeclarations\": true,                     /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */\n    // \"allowSyntheticDefaultImports\": true,             /* Allow 'import x from y' when a module doesn't have a default export. */\n    // \"esModuleInterop\": true,                          /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */\n    // \"preserveSymlinks\": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */\n    // \"forceConsistentCasingInFileNames\": true,         /* Ensure that casing is correct in imports. */\n\n    /* Type Checking */\n    \"strict\": true,                                      /* Enable all strict type-checking options. */\n    // \"noImplicitAny\": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */\n    // \"strictNullChecks\": true,                         /* When type checking, take into account 'null' and 'undefined'. */\n    // \"strictFunctionTypes\": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */\n    // \"strictBindCallApply\": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */\n    // \"strictPropertyInitialization\": true,             /* Check for class properties that are declared but not set in the constructor. */\n    // \"noImplicitThis\": true,                           /* Enable error reporting when 'this' is given the type 'any'. */\n    // \"useUnknownInCatchVariables\": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */\n    // \"alwaysStrict\": true,                             /* Ensure 'use strict' is always emitted. */\n    // \"noUnusedLocals\": true,                           /* Enable error reporting when local variables aren't read. */\n    // \"noUnusedParameters\": true,                       /* Raise an error when a function parameter isn't read. */\n    // \"exactOptionalPropertyTypes\": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */\n    // \"noImplicitReturns\": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */\n    // \"noFallthroughCasesInSwitch\": true,               /* Enable error reporting for fallthrough cases in switch statements. */\n    // \"noUncheckedIndexedAccess\": true,                 /* Add 'undefined' to a type when accessed using an index. */\n    // \"noImplicitOverride\": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */\n    // \"noPropertyAccessFromIndexSignature\": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */\n    // \"allowUnusedLabels\": true,                        /* Disable error reporting for unused labels. */\n    // \"allowUnreachableCode\": true,                     /* Disable error reporting for unreachable code. */\n\n    /* Completeness */\n    // \"skipDefaultLibCheck\": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */\n    \"skipLibCheck\": true                                 /* Skip type checking all .d.ts files. */\n  },\n  \"exclude\": [\"docs\", \"dist\", \"node_modules\"]\n}"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport { resolve } from 'path';\n\nexport default defineConfig({\n  resolve: {\n    alias: {\n      '@': resolve(__dirname, './src')\n    }\n  },\n  test: {\n    coverage: {\n      exclude: ['src/**/*.d.ts'],\n      include: ['src/**/*.ts'],\n      provider: 'v8',\n      reporter: ['json-summary', 'html']\n    },\n    include: ['tests/**/*.spec.ts']\n  }\n});\n"
  }
]