{"version":3,"file":"ngwr-date-adapter-luxon.mjs","sources":["../../../projects/lib/date-adapter-luxon/wr-luxon-adapter.ts","../../../projects/lib/date-adapter-luxon/provide-wr-luxon-adapter.ts","../../../projects/lib/date-adapter-luxon/ngwr-date-adapter-luxon.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Service, inject } from '@angular/core';\n\nimport { DateTime, Info } from 'luxon';\nimport { WrDateAdapter, WR_DATE_LOCALE, type WrDateFormat, isNamedFormat } from 'ngwr/date-adapter';\n\nconst NAMED_PATTERNS: Readonly<Record<WrDateFormat, string>> = {\n  shortDate: 'D',\n  mediumDate: 'DD',\n  longDate: 'DDD',\n  time: 't',\n  shortDateTime: 'f',\n  mediumDateTime: 'ff',\n};\n\n/**\n * Token translation table — our token grammar (matches the native adapter)\n * mapped to luxon's. Notably `MMMM`/`MMM` (month names) become luxon's\n * standalone-month tokens `LLLL`/`LLL`.\n */\nconst TOKEN_MAP: Readonly<Record<string, string>> = {\n  yyyy: 'yyyy',\n  yy: 'yy',\n  MMMM: 'LLLL',\n  MMM: 'LLL',\n  MM: 'MM',\n  M: 'M',\n  dd: 'dd',\n  d: 'd',\n  HH: 'HH',\n  H: 'H',\n  hh: 'hh',\n  h: 'h',\n  mm: 'mm',\n  ss: 'ss',\n  a: 'a',\n};\n\nconst TOKEN_RE = /yyyy|yy|MMMM|MMM|MM|M|dd|d|HH|H|hh|h|mm|ss|a/g;\n\nfunction translatePattern(pattern: string): string {\n  return pattern.replace(TOKEN_RE, t => TOKEN_MAP[t] ?? t);\n}\n\n/**\n * {@link WrDateAdapter} backed by Luxon `DateTime`. Use this when you need\n * proper timezone-aware math or IANA zone handling (the native + date-fns\n * adapters both work on plain `Date` and inherit JS quirks).\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideWrLuxonAdapter()],\n * });\n * ```\n *\n * Peer dep: `luxon@^3`.\n */\n@Service()\nexport class WrLuxonAdapter extends WrDateAdapter<DateTime> {\n  private readonly locale = inject(WR_DATE_LOCALE);\n\n  // Construction & identity\n\n  today(): DateTime {\n    return DateTime.now().setLocale(this.locale);\n  }\n\n  clone(date: DateTime): DateTime {\n    return DateTime.fromMillis(date.toMillis(), { zone: date.zone, locale: this.locale });\n  }\n\n  createDate(year: number, month: number, day: number): DateTime {\n    // `month` is 0-based on our API; luxon's months are 1-based.\n    return DateTime.fromObject({ year, month: month + 1, day }, { locale: this.locale });\n  }\n\n  isValid(date: DateTime): boolean {\n    return date.isValid;\n  }\n\n  // Accessors\n\n  getYear(date: DateTime): number {\n    return date.year;\n  }\n  getMonth(date: DateTime): number {\n    return date.month - 1;\n  }\n  getDate(date: DateTime): number {\n    return date.day;\n  }\n  getDayOfWeek(date: DateTime): number {\n    // Luxon weekday: 1 (Mon) – 7 (Sun). Our API: 0 (Sun) – 6 (Sat).\n    return date.weekday % 7;\n  }\n  getDaysInMonth(date: DateTime): number {\n    return date.daysInMonth ?? 30;\n  }\n  getHours(date: DateTime): number {\n    return date.hour;\n  }\n  getMinutes(date: DateTime): number {\n    return date.minute;\n  }\n  getSeconds(date: DateTime): number {\n    return date.second;\n  }\n\n  // Immutable math\n\n  addYears(date: DateTime, amount: number): DateTime {\n    return date.plus({ years: amount });\n  }\n  addMonths(date: DateTime, amount: number): DateTime {\n    return date.plus({ months: amount });\n  }\n  addDays(date: DateTime, amount: number): DateTime {\n    return date.plus({ days: amount });\n  }\n  setTime(date: DateTime, hours: number, minutes: number, seconds: number): DateTime {\n    return date.set({ hour: hours, minute: minutes, second: seconds, millisecond: 0 });\n  }\n\n  // Comparison\n\n  isSameDay(a: DateTime, b: DateTime): boolean {\n    return a.hasSame(b, 'day');\n  }\n  isSameMonth(a: DateTime, b: DateTime): boolean {\n    return a.hasSame(b, 'month');\n  }\n  compareDate(a: DateTime, b: DateTime): number {\n    return a.startOf('day').toMillis() - b.startOf('day').toMillis();\n  }\n\n  // Formatting / parsing\n\n  format(date: DateTime, formatKeyOrString: WrDateFormat | (string & {})): string {\n    if (isNamedFormat(formatKeyOrString)) {\n      return date.setLocale(this.locale).toFormat(NAMED_PATTERNS[formatKeyOrString]);\n    }\n    return date.setLocale(this.locale).toFormat(translatePattern(formatKeyOrString));\n  }\n\n  parse(value: string, formatKeyOrString: WrDateFormat | (string & {})): DateTime | null {\n    const raw = value?.trim();\n    if (!raw) return null;\n    const pattern = isNamedFormat(formatKeyOrString)\n      ? NAMED_PATTERNS[formatKeyOrString]\n      : translatePattern(formatKeyOrString);\n    const parsed = DateTime.fromFormat(raw, pattern, { locale: this.locale });\n    return parsed.isValid ? parsed : null;\n  }\n\n  // Locale info\n\n  getFirstDayOfWeek(): number {\n    try {\n      const locale = new Intl.Locale(this.locale) as unknown as { getWeekInfo?: () => { firstDay: number } };\n      const info = locale.getWeekInfo?.();\n      if (info && typeof info.firstDay === 'number') return info.firstDay % 7;\n    } catch {\n      // Intl.Locale unsupported — fall through.\n    }\n    return this.locale.toLowerCase().startsWith('en-us') ? 0 : 1;\n  }\n\n  getDayOfWeekNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n    // Luxon returns Mon-first; reorder according to our locale's first day.\n    const names = Info.weekdays(style, { locale: this.locale });\n    const first = this.getFirstDayOfWeek();\n    // Convert Mon-first (index 0 = Mon) to our Sun-first then rotate.\n    // Easier: pad to Sun-first using known offset (luxon Mon=0, Sun=6).\n    const sunFirst = [names[6], ...names.slice(0, 6)];\n    return [...sunFirst.slice(first), ...sunFirst.slice(0, first)];\n  }\n\n  getMonthNames(style: 'narrow' | 'short' | 'long'): readonly string[] {\n    return Info.months(style, { locale: this.locale });\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { EnvironmentProviders } from '@angular/core';\n\nimport { provideWrDateAdapter } from 'ngwr/date-adapter';\n\nimport { WrLuxonAdapter } from './wr-luxon-adapter';\n\n/**\n * Register the {@link WrLuxonAdapter} so date-pickers / calendars in this\n * app use Luxon `DateTime` for all math and formatting. Pass `locale` to\n * override the BCP 47 tag.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideWrLuxonAdapter()],\n * });\n * ```\n */\nexport function provideWrLuxonAdapter(options: { readonly locale?: string } = {}): EnvironmentProviders {\n  return provideWrDateAdapter({ adapter: WrLuxonAdapter, locale: options.locale });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}