{"version":3,"sources":["../src/chrono/common/common.utils.ts","../src/converter/classic-to-terran.ts","../src/converter/common/common.utils.ts","../src/converter/indomitus-to-classic.ts","../src/converter/terran-to-classic.ts","../src/formatter/formatter.ts","../src/parser/parser.utils.ts","../src/parser/parser.ts","../src/chrono/chrono.model.ts","../src/chrono/classic/classic-calendar.utils.ts","../src/chrono/classic/classic-calendar.model.ts","../src/chrono/classic/classic-calendar.ts","../src/chrono/indomitus-era/indomitus-era-calendar.utils.ts","../src/converter/classic-to-indomitus.ts","../src/converter/indomitus-to-terran.ts","../src/converter/terran-to-indomitus.ts","../src/chrono/indomitus-era/indomitus-era-calendar.model.ts","../src/chrono/indomitus-era/indomitus-era-calendar.ts","../src/chrono/chrono.ts"],"sourcesContent":["import { ClassicDate } from '../classic/classic-calendar.model';\nimport { IndomitusEraDate } from '../indomitus-era/indomitus-era-calendar.model';\nimport { Millenium, TerranDate } from './common.model';\n\nconst MARCO_CONST = 1 / ((365 * 24) / 1000);\nconst MARCO_CONST_LEAPYEAR = 1 / ((366 * 24) / 1000);\nconst ONE_DAY = 1000 * 60 * 60 * 24;\n\nexport function parseMillenium(milleniumValue: string): Millenium {\n  milleniumValue = milleniumValue.substring(1);\n  return parseInt(milleniumValue);\n}\n\nexport function isClassicImperialDate(\n  date: string | TerranDate | IndomitusEraDate | ClassicDate,\n): date is ClassicDate {\n  return typeof date === 'object' && 'check' in date;\n}\n\nexport function isIndomitusEraImperialDate(\n  date: string | TerranDate | IndomitusEraDate | ClassicDate,\n): date is IndomitusEraDate {\n  return typeof date === 'object' && 'designator' in date;\n}\n\nexport function isTerranDate(\n  date: string | TerranDate | IndomitusEraDate | ClassicDate,\n): date is TerranDate {\n  return date instanceof Date;\n}\n\nexport function isString(\n  date: string | TerranDate | IndomitusEraDate | ClassicDate,\n): date is string {\n  return typeof date === 'string';\n}\n\nexport function getFraction(date: TerranDate): number {\n  const day = getDayOfYear(date);\n  const hours = date.getUTCHours();\n  const determinedHour = day * 24 + hours;\n\n  const year = date.getUTCFullYear();\n  let fraction = Math.trunc(determinedHour * getMarcoConstant(year)) + 1;\n  if (fraction === 1000) {\n    fraction = 0;\n  }\n  return fraction;\n}\n\nexport function getYear(date: TerranDate): number {\n  return date.getUTCFullYear() % 1000;\n}\n\nexport function getMillenium(date: TerranDate): number {\n  let millenium = date.getUTCFullYear() / 1000;\n  millenium += 1;\n  return Math.trunc(millenium);\n}\n\nexport function getMarcoConstant(year: number): number {\n  return isLeapYear(year) ? MARCO_CONST_LEAPYEAR : MARCO_CONST;\n}\n\nfunction getDayOfYear(date: TerranDate): number {\n  const startOfYear = Date.UTC(date.getUTCFullYear(), 0, 0);\n  const diff = date.getTime() - startOfYear;\n  return Math.floor(diff / ONE_DAY) - 1;\n}\n\nfunction isLeapYear(year: number): boolean {\n  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n","import { ClassicDate } from '../chrono/classic/classic-calendar.model';\nimport { TerranDate } from '../chrono/common/common.model';\nimport { getMarcoConstant } from '../chrono/common/common.utils';\n\nexport function convertClassicToTerranDate(date: ClassicDate): TerranDate {\n  const { check, fraction, year, millenium } = date;\n\n  if (check !== 0) {\n    throw new Error(\n      'Cannot directly convert from non-terran date to terran date',\n    );\n  }\n\n  const fullYear = (millenium - 1) * 1000 + year;\n\n  const marcoConstant = getMarcoConstant(fullYear);\n  let determinedHour = (fraction - 1) / marcoConstant;\n  if (fraction === 0) {\n    determinedHour = 999 / marcoConstant;\n  }\n\n  const dayOfYear = Math.floor(determinedHour / 24);\n  const hours = Math.floor(determinedHour % 24);\n\n  const startOfYear = new Date(Date.UTC(fullYear, 0, 1));\n  startOfYear.setUTCDate(startOfYear.getUTCDate() + dayOfYear);\n  startOfYear.setUTCHours(hours, 0, 0, 0);\n  return startOfYear;\n}\n","import { ClassicDate } from '../../chrono/classic/classic-calendar.model';\nimport { DateDifference } from '../../chrono/common/common.model';\n\nexport function calculateDateDifference(\n  from: ClassicDate,\n  to: ClassicDate,\n): DateDifference {\n  const minuend = getTotalFractions(from);\n  const subtrahend = getTotalFractions(to);\n  const difference = minuend - subtrahend;\n\n  const years = Math.trunc(difference / 1000);\n  const fractions = difference % 1000;\n  return { years, fractions };\n}\n\nexport function inferDate(totalFractions: number): ClassicDate {\n  const check = 0;\n  const fraction = totalFractions % 1000;\n  const year = Math.trunc((totalFractions % (1000 * 1000)) / 1000);\n  const millenium = Math.trunc(totalFractions / (1000 * 1000)) + 1;\n  return { check, fraction, year, millenium };\n}\n\nexport function getTotalFractions({\n  fraction,\n  year,\n  millenium,\n}: ClassicDate): number {\n  return (\n    (fraction === 0 ? 1000 : fraction) +\n    year * 1000 +\n    (millenium - 1) * 1000 * 1000\n  );\n}\n","import { ClassicImperialCalendar } from '../chrono/classic/classic-calendar';\nimport { ClassicDate } from '../chrono/classic/classic-calendar.model';\nimport { IndomitusEraDate } from '../chrono/indomitus-era/indomitus-era-calendar.model';\nimport { getTotalFractions, inferDate } from './common/common.utils';\n\nexport function convertIndomitusToClassicDate(\n  date: IndomitusEraDate,\n): ClassicDate {\n  if (date.designator !== 'T') {\n    throw new Error(\n      'Cannot infer date check for event that did not happen on holy terra',\n    );\n  }\n  const base = ClassicImperialCalendar.GREAT_RIFT_OPENING;\n\n  let fraction = date.chronosegments;\n  let years = date.annualDesignator;\n  let millenia = -(base.millenium - date.millenium);\n  if (!date.isPostGreatRift) {\n    fraction = -fraction;\n    years = -years;\n  } else {\n    millenia = millenia - 1;\n  }\n  const targetTotalFractions = millenia * 1000 * 1000 + years * 1000 + fraction;\n  const baseTotalFractions = getTotalFractions(base);\n\n  const totalFractions = baseTotalFractions + targetTotalFractions;\n  return inferDate(totalFractions);\n}\n","import { ClassicDate } from '../chrono/classic/classic-calendar.model';\nimport { TerranDate } from '../chrono/common/common.model';\nimport {\n  getFraction,\n  getMillenium,\n  getYear,\n} from '../chrono/common/common.utils';\n\nexport function convertTerranToClassicDate(date: TerranDate): ClassicDate {\n  const check = 0;\n  const fraction = getFraction(date);\n  const year = getYear(date);\n  const millenium = getMillenium(date);\n  return { check, fraction, year, millenium };\n}\n","import { DateSegment, ImperialDate } from '../chrono/chrono.model';\n\nexport class ImperialDateFormatter<T extends ImperialDate> {\n  constructor(\n    private pattern: string,\n    private segments: DateSegment<T>[],\n  ) {}\n\n  format(date: T): string {\n    let formattedDate = this.pattern;\n    for (const { symbol, format } of this.segments) {\n      formattedDate = formattedDate.replace(\n        new RegExp(symbol, 'g'),\n        format(date),\n      );\n    }\n\n    return formattedDate;\n  }\n}\n","import { DateSegment, ImperialDate } from '../chrono/chrono.model';\n\nexport function getFormatExpression<T extends ImperialDate>(\n  segments: DateSegment<T>[],\n): (pattern: string) => RegExp {\n  return (pattern: string) => {\n    let expression = escapeControlSequences(pattern);\n    const placeholders: Record<string, string> = {};\n    for (const [index, segment] of segments.entries()) {\n      const replacement = segment.expression;\n      const placeholder = `_PLACEHOLDER_${index}_`;\n      placeholders[placeholder] = replacement;\n      expression = expression.replace(\n        new RegExp(segment.symbol, 'g'),\n        placeholder,\n      );\n    }\n    for (const [placeholder, replacement] of Object.entries(placeholders)) {\n      expression = expression.replace(\n        new RegExp(placeholder, 'g'),\n        replacement,\n      );\n    }\n    return new RegExp(`^${expression}$`);\n  };\n}\n\nexport function bySymbol<T extends ImperialDate>(symbol: string) {\n  return (segment: DateSegment<T>) => segment.symbol === symbol;\n}\n\nfunction escapeControlSequences(pattern: string): string {\n  return pattern\n    .replace(/\\(/g, '\\\\(')\n    .replace(/\\)/g, '\\\\)')\n    .replace(/\\[/g, '\\\\[')\n    .replace(/\\]/g, '\\\\]')\n    .replace(/\\{/g, '\\\\{')\n    .replace(/\\}/g, '\\\\}');\n}\n","import { DateSegment, ImperialDate } from '../chrono/chrono.model';\nimport { TerranDate } from '../chrono/common/common.model';\nimport { bySymbol, getFormatExpression } from './parser.utils';\n\nexport class ImperialDateParser<T extends ImperialDate> {\n  private formatExpressions: RegExp[];\n\n  constructor(\n    formats: string[],\n    private segments: DateSegment<T>[],\n    private dateFactory: () => T,\n    private dateConverter: (date: TerranDate) => T,\n  ) {\n    this.formatExpressions = formats.map(getFormatExpression(this.segments));\n  }\n\n  parse(date: string): T {\n    for (let regex of this.formatExpressions) {\n      const execArray = regex.exec(date);\n      if (!(execArray && execArray.groups)) {\n        continue;\n      }\n\n      return this.match(execArray.groups);\n    }\n\n    const terranDate: TerranDate = new Date(date);\n\n    if (terranDate instanceof Date && isNaN(terranDate.getTime())) {\n      throw new Error('Date did not match any expected pattern');\n    }\n\n    return this.dateConverter(terranDate);\n  }\n\n  private match(captureGroups: Record<string, string>): T {\n    const imperialDate = this.dateFactory();\n    for (const [symbol, value] of Object.entries(captureGroups)) {\n      const segment = this.segments.find(bySymbol(symbol));\n      if (!segment) {\n        continue;\n      }\n\n      segment.parse(imperialDate, value);\n    }\n\n    return imperialDate;\n  }\n}\n","import { ClassicDate } from './classic/classic-calendar.model';\nimport { IndomitusEraDate } from './indomitus-era/indomitus-era-calendar.model';\n\nexport type ImperialDate = ClassicDate | IndomitusEraDate;\nexport interface DateSegment<T extends ImperialDate> {\n  symbol: string;\n  expression: string;\n  format: (date: T) => string;\n  parse: (date: T, value: string) => void;\n}\n\nexport enum Formats {\n  CLASSIC_DEFAULT_FORMAT = 'c fff yyy.m',\n  CLASSIC_SHORT_FORMAT = 'yyy.m',\n  INDOMITUS_ERA_DEFAULT_FORMAT = 'y.f gg d.m',\n  INDOMITUS_ERA_SHORT_FORMAT = 'y.fg d.m',\n}\n","import {\n  Check,\n  ClassicDate,\n  Year,\n  YearFraction,\n} from './classic-calendar.model';\n\nexport function classicImperialDateFactory(): ClassicDate {\n  return {\n    check: 0,\n    fraction: 1,\n    year: 0,\n    millenium: 0,\n  };\n}\n\nexport function parseCheck(checkValue: string): Check {\n  const check = parseInt(checkValue);\n  if (check < 0 || 9 < check) {\n    throw new Error(`check ${check} is out of bounds`);\n  }\n  return check as Check;\n}\n\nexport function parseYearFraction(fractionValue: string): YearFraction {\n  return parseInt(fractionValue);\n}\n\nexport function parseYear(yearValue: string): Year {\n  return parseInt(yearValue);\n}\n","import { DateSegment } from '../chrono.model';\nimport { Millenium, TerranDate } from '../common/common.model';\nimport { parseMillenium } from '../common/common.utils';\nimport {\n  parseCheck,\n  parseYear,\n  parseYearFraction,\n} from './classic-calendar.utils';\n\nexport type Check = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\nexport type YearFraction = number;\nexport type Year = number;\n\nexport interface ClassicDate {\n  check: Check;\n  fraction: YearFraction;\n  year: Year;\n  millenium: Millenium;\n}\n\nexport interface ClassicImperialDate extends ClassicDate {\n  toString: (format?: string) => string;\n  toDate: () => TerranDate;\n}\n\nexport const classicImperialDateSegments: DateSegment<ClassicDate>[] = [\n  {\n    symbol: 'c',\n    expression: '(?<c>\\\\d)',\n    format: (date) => `${date.check}`,\n    parse: (date, check) => (date.check = parseCheck(check)),\n  },\n  {\n    symbol: 'fff',\n    expression: '(?<fff>\\\\d{3})',\n    format: (date) => `${date.fraction}`.padStart(3, '0'),\n    parse: (date, fraction) => (date.fraction = parseYearFraction(fraction)),\n  },\n  {\n    symbol: 'ff',\n    expression: '(?<ff>\\\\d{2,3})',\n    format: (date) => `${date.fraction}`.padStart(2, '0'),\n    parse: (date, fraction) => (date.fraction = parseYearFraction(fraction)),\n  },\n  {\n    symbol: 'f',\n    expression: '(?<f>\\\\d{1,3})'.padStart(1, '0'),\n    format: (date) => `${date.fraction}`,\n    parse: (date, fraction) => (date.fraction = parseYearFraction(fraction)),\n  },\n  {\n    symbol: 'yyy',\n    expression: '(?<yyy>\\\\d{3})',\n    format: (date) => `${date.year}`.padStart(3, '0'),\n    parse: (date, year) => (date.year = parseYear(year)),\n  },\n  {\n    symbol: 'yy',\n    expression: '(?<yy>\\\\d{2,3})',\n    format: (date) => `${date.year}`.padStart(2, '0'),\n    parse: (date, year) => (date.year = parseYear(year)),\n  },\n  {\n    symbol: 'y',\n    expression: '(?<y>\\\\d{1,3})',\n    format: (date) => `${date.year}`.padStart(1, '0'),\n    parse: (date, year) => (date.year = parseYear(year)),\n  },\n  {\n    symbol: 'm',\n    expression: '(?<m>M\\\\d+)',\n    format: (date) => `M${date.millenium}`.padEnd(2, '0'),\n    parse: (date, millenium) => (date.millenium = parseMillenium(millenium)),\n  },\n];\n","import { convertClassicToTerranDate } from '../../converter/classic-to-terran';\nimport { convertIndomitusToClassicDate } from '../../converter/indomitus-to-classic';\nimport { convertTerranToClassicDate } from '../../converter/terran-to-classic';\nimport { ImperialDateFormatter } from '../../formatter/formatter';\nimport { ImperialDateParser } from '../../parser/parser';\nimport { Formats } from '../chrono.model';\nimport { TerranDate } from '../common/common.model';\nimport {\n  isClassicImperialDate,\n  isIndomitusEraImperialDate,\n  isString,\n  isTerranDate,\n} from '../common/common.utils';\nimport { IndomitusEraDate } from '../indomitus-era/indomitus-era-calendar.model';\nimport {\n  ClassicDate,\n  ClassicImperialDate,\n  classicImperialDateSegments,\n} from './classic-calendar.model';\nimport { classicImperialDateFactory } from './classic-calendar.utils';\n\nexport class ClassicImperialCalendar {\n  static readonly GREAT_RIFT_OPENING = new ClassicImperialCalendar().parse(\n    '0 000 999.M41',\n  );\n\n  parse(date: TerranDate): ClassicImperialDate;\n  parse(date: ClassicDate): ClassicImperialDate;\n  parse(date: IndomitusEraDate): ClassicImperialDate;\n  parse(date: string, format?: string): ClassicImperialDate;\n  parse(\n    date: string | TerranDate | ClassicDate | IndomitusEraDate,\n    format?: string,\n  ): ClassicImperialDate {\n    return this.internalParse(date, format);\n  }\n\n  format(date: string, format?: string): string;\n  format(date: TerranDate, format?: string): string;\n  format(date: ClassicDate, format?: string): string;\n  format(date: string | TerranDate | ClassicDate, format?: string): string {\n    const proxy = this.internalParse(date, format);\n\n    if (typeof format === 'undefined') {\n      format = Formats.CLASSIC_DEFAULT_FORMAT;\n    }\n\n    const formatter = new ImperialDateFormatter(\n      format,\n      classicImperialDateSegments,\n    );\n    return formatter.format(proxy);\n  }\n\n  isValid(date: ClassicDate): boolean {\n    const { check, fraction } = date;\n    if (check < 0 || 9 < check) {\n      return false;\n    }\n    if (fraction < 0 || 999 < fraction) {\n      return false;\n    }\n    return true;\n  }\n\n  getTerranDate(date: ClassicDate): TerranDate;\n  getTerranDate(date: string, format?: string): TerranDate;\n  getTerranDate(date: string | ClassicDate, format?: string): TerranDate {\n    const proxy = this.internalParse(date, format);\n    return convertClassicToTerranDate(proxy);\n  }\n\n  private internalParse(\n    date: string | TerranDate | ClassicDate | IndomitusEraDate,\n    format?: string,\n  ): ClassicImperialDate {\n    let classicDate: ClassicDate | undefined = undefined;\n    if (isString(date)) {\n      classicDate = this.fromString(date, format);\n    }\n\n    if (isClassicImperialDate(date)) {\n      classicDate = this.fromClassicImperialDate(date);\n    }\n\n    if (isIndomitusEraImperialDate(date)) {\n      classicDate = this.fromIndomitusEraDate(date);\n    }\n\n    if (isTerranDate(date)) {\n      classicDate = this.fromTerranDate(date);\n    }\n\n    if (!classicDate) {\n      throw new Error('Type mismatch on input');\n    }\n\n    return {\n      ...classicDate,\n      toString: (format?: string) => this.format(classicDate, format),\n      toDate: () => this.getTerranDate(classicDate),\n    };\n  }\n\n  private fromString(date: string, format?: string): ClassicDate {\n    const formats = [\n      Formats.CLASSIC_DEFAULT_FORMAT.valueOf(),\n      Formats.CLASSIC_SHORT_FORMAT.valueOf(),\n    ];\n    if (format) {\n      formats.push(format);\n    }\n\n    const parser = new ImperialDateParser<ClassicDate>(\n      formats,\n      classicImperialDateSegments,\n      classicImperialDateFactory,\n      convertTerranToClassicDate,\n    );\n    return parser.parse(date);\n  }\n\n  private fromTerranDate(date: TerranDate): ClassicDate {\n    return convertTerranToClassicDate(date);\n  }\n\n  private fromClassicImperialDate(date: ClassicDate): ClassicDate {\n    if (!this.isValid(date)) {\n      throw new Error('Invalid date');\n    }\n\n    return { ...date };\n  }\n\n  private fromIndomitusEraDate(date: IndomitusEraDate): ClassicDate {\n    return convertIndomitusToClassicDate(date);\n  }\n}\n","import {\n  AnnualDesignator,\n  Chronosegments,\n  Designator,\n  IndomitusEraDate,\n} from './indomitus-era-calendar.model';\n\nexport function indomitusEraImperialDateFactory(): IndomitusEraDate {\n  return {\n    designator: 'T',\n    chronosegments: 1,\n    annualDesignator: 0,\n    millenium: 0,\n    isPostGreatRift: true,\n  };\n}\n\nexport function parseChronosegments(\n  chronosegmentsValue: string,\n): Chronosegments {\n  return parseInt(chronosegmentsValue);\n}\n\nexport function parseAnnualDesignator(\n  annualDesignartorValue: string,\n): AnnualDesignator {\n  return parseInt(annualDesignartorValue);\n}\n\nexport function parseDesignator(designatorValue: string): Designator {\n  return designatorValue.slice(0, -2).toLocaleUpperCase();\n}\n","import { ClassicImperialCalendar } from '../chrono/classic/classic-calendar';\nimport { ClassicDate } from '../chrono/classic/classic-calendar.model';\nimport { IndomitusEraDate } from '../chrono/indomitus-era/indomitus-era-calendar.model';\nimport { indomitusEraImperialDateFactory } from '../chrono/indomitus-era/indomitus-era-calendar.utils';\nimport { calculateDateDifference } from './common/common.utils';\n\nexport function convertClassicToIndomitusDate(\n  date: ClassicDate,\n): IndomitusEraDate {\n  if (date.check !== 0) {\n    throw new Error(\n      'Cannot infer designator for other location than holy terra',\n    );\n  }\n  const base = ClassicImperialCalendar.GREAT_RIFT_OPENING;\n  const dateDiff = calculateDateDifference(base, date);\n  const indomitusEraDate = indomitusEraImperialDateFactory();\n  const isPostGreatRift = dateDiff.years < 0 || dateDiff.fractions < 0;\n\n  indomitusEraDate.annualDesignator = Math.abs(dateDiff.years % 1000);\n  indomitusEraDate.chronosegments = Math.abs(dateDiff.fractions);\n  indomitusEraDate.isPostGreatRift = isPostGreatRift;\n  indomitusEraDate.millenium = Math.trunc(\n    base.millenium - (dateDiff.years / 1000 - 1),\n  );\n\n  return indomitusEraDate;\n}\n","import { TerranDate } from '../chrono/common/common.model';\nimport { IndomitusEraDate } from '../chrono/indomitus-era/indomitus-era-calendar.model';\nimport { convertClassicToTerranDate } from './classic-to-terran';\nimport { convertIndomitusToClassicDate } from './indomitus-to-classic';\n\nexport function convertIndomitusToTerranDate(\n  date: IndomitusEraDate,\n): TerranDate {\n  const classicDate = convertIndomitusToClassicDate(date);\n  return convertClassicToTerranDate(classicDate);\n}\n","import { TerranDate } from '../chrono/common/common.model';\nimport { IndomitusEraDate } from '../chrono/indomitus-era/indomitus-era-calendar.model';\nimport { convertClassicToIndomitusDate } from './classic-to-indomitus';\nimport { convertTerranToClassicDate } from './terran-to-classic';\n\nexport function convertTerranToIndomitusDate(\n  date: TerranDate,\n): IndomitusEraDate {\n  const classicDate = convertTerranToClassicDate(date);\n  return convertClassicToIndomitusDate(classicDate);\n}\n","import { DateSegment } from '../chrono.model';\nimport { Millenium, TerranDate } from '../common/common.model';\nimport { parseMillenium } from '../common/common.utils';\nimport {\n  parseAnnualDesignator,\n  parseChronosegments,\n  parseDesignator,\n} from './indomitus-era-calendar.utils';\n\nexport type Chronosegments = number;\nexport type AnnualDesignator = number;\nexport type Designator = string;\n\nexport interface IndomitusEraDate {\n  chronosegments: Chronosegments;\n  annualDesignator: AnnualDesignator;\n  millenium: Millenium;\n  designator: Designator;\n  isPostGreatRift: boolean;\n}\n\nexport interface IndomitusEraImperialDate extends IndomitusEraDate {\n  toString: (format?: string) => string;\n  toDate: () => TerranDate;\n}\n\nexport const indomitusEraImperialDateSegments: DateSegment<IndomitusEraDate>[] =\n  [\n    {\n      symbol: 'd',\n      expression: '(?<d>\\\\w+CM)',\n      format: (date) => `${date.designator}CM`,\n      parse: (date, designator) =>\n        (date.designator = parseDesignator(designator)),\n    },\n    {\n      symbol: 'fff',\n      expression: '(?<fff>\\\\d{3})',\n      format: (date) => `${date.chronosegments}`.padStart(3, '0'),\n      parse: (date, chronosegments) =>\n        (date.chronosegments = parseChronosegments(chronosegments)),\n    },\n    {\n      symbol: 'ff',\n      expression: '(?<ff>\\\\d{2,3})',\n      format: (date) => `${date.chronosegments}`.padStart(2, '0'),\n      parse: (date, chronosegments) =>\n        (date.chronosegments = parseChronosegments(chronosegments)),\n    },\n    {\n      symbol: 'f',\n      expression: '(?<f>\\\\d{1,3})',\n      format: (date) => `${date.chronosegments}`.padStart(1, '0'),\n      parse: (date, chronosegments) =>\n        (date.chronosegments = parseChronosegments(chronosegments)),\n    },\n    {\n      symbol: 'yyy',\n      expression: '(?<yyy>\\\\d{3})',\n      format: (date) => `${date.annualDesignator}`.padStart(3, '0'),\n      parse: (date, annualDesignator) =>\n        (date.annualDesignator = parseAnnualDesignator(annualDesignator)),\n    },\n    {\n      symbol: 'yy',\n      expression: '(?<yy>\\\\d{2,3})',\n      format: (date) => `${date.annualDesignator}`.padStart(2, '0'),\n      parse: (date, annualDesignator) =>\n        (date.annualDesignator = parseAnnualDesignator(annualDesignator)),\n    },\n    {\n      symbol: 'y',\n      expression: '(?<y>\\\\d{1,3})',\n      format: (date) => `${date.annualDesignator}`.padStart(1, '0'),\n      parse: (date, annualDesignator) =>\n        (date.annualDesignator = parseAnnualDesignator(annualDesignator)),\n    },\n    {\n      symbol: 'm',\n      expression: '(?<m>M\\\\d+)',\n      format: (date) => `M${date.millenium}`.padEnd(2, '0'),\n      parse: (date, millenium) => (date.millenium = parseMillenium(millenium)),\n    },\n    {\n      symbol: 'gg',\n      expression: '(?<gg>(post|previo))',\n      format: (date) => (date.isPostGreatRift ? 'post' : 'previo'),\n      parse: (date, timeDesignator) =>\n        (date.isPostGreatRift = timeDesignator === 'post'),\n    },\n    {\n      symbol: 'g',\n      expression: '(?<g>[+-])',\n      format: (date) => (date.isPostGreatRift ? '+' : '-'),\n      parse: (date, timeDesignator) =>\n        (date.isPostGreatRift = timeDesignator === '+'),\n    },\n  ];\n","import { convertClassicToIndomitusDate } from '../../converter/classic-to-indomitus';\nimport { convertIndomitusToTerranDate } from '../../converter/indomitus-to-terran';\nimport { convertTerranToIndomitusDate } from '../../converter/terran-to-indomitus';\nimport { ImperialDateFormatter } from '../../formatter/formatter';\nimport { ImperialDateParser } from '../../parser/parser';\nimport { Formats } from '../chrono.model';\nimport { ClassicDate } from '../classic/classic-calendar.model';\nimport { TerranDate } from '../common/common.model';\nimport {\n  isClassicImperialDate,\n  isIndomitusEraImperialDate,\n  isString,\n  isTerranDate,\n} from '../common/common.utils';\nimport {\n  IndomitusEraDate,\n  IndomitusEraImperialDate,\n  indomitusEraImperialDateSegments,\n} from './indomitus-era-calendar.model';\nimport { indomitusEraImperialDateFactory } from './indomitus-era-calendar.utils';\n\nexport class IndomitusEraImperialCalendar {\n  parse(date: TerranDate): IndomitusEraImperialDate;\n  parse(date: IndomitusEraDate): IndomitusEraImperialDate;\n  parse(date: ClassicDate): IndomitusEraImperialDate;\n  parse(date: string, format?: string): IndomitusEraImperialDate;\n  parse(\n    date: string | TerranDate | IndomitusEraDate | ClassicDate,\n    format?: string,\n  ): IndomitusEraImperialDate {\n    return this.internalParse(date, format);\n  }\n\n  format(date: string, format?: string): string;\n  format(date: TerranDate, format?: string): string;\n  format(date: IndomitusEraDate, format?: string): string;\n  format(date: ClassicDate, format?: string): string;\n  format(\n    date: string | TerranDate | IndomitusEraDate | ClassicDate,\n    format?: string,\n  ): string {\n    const proxy = this.internalParse(date);\n\n    if (typeof format === 'undefined') {\n      format = Formats.INDOMITUS_ERA_DEFAULT_FORMAT;\n    }\n\n    const formatter = new ImperialDateFormatter(\n      format,\n      indomitusEraImperialDateSegments,\n    );\n    return formatter.format(proxy);\n  }\n\n  isValid(date: IndomitusEraDate): boolean {\n    const { designator, chronosegments } = date;\n    if (designator === '') {\n      return false;\n    }\n    if (chronosegments < 0 || 999 < chronosegments) {\n      return false;\n    }\n    return true;\n  }\n\n  getTerranDate(date: IndomitusEraDate): TerranDate;\n  getTerranDate(date: string, format?: string): TerranDate;\n  getTerranDate(date: string | IndomitusEraDate, format?: string): TerranDate {\n    const proxy = this.internalParse(date, format);\n    return convertIndomitusToTerranDate(proxy);\n  }\n\n  private internalParse(\n    date: string | TerranDate | IndomitusEraDate | ClassicDate,\n    format?: string,\n  ): IndomitusEraImperialDate {\n    let indomitusEraDate: IndomitusEraDate | undefined = undefined;\n\n    if (isString(date)) {\n      indomitusEraDate = this.fromString(date, format);\n    }\n\n    if (isIndomitusEraImperialDate(date)) {\n      indomitusEraDate = this.fromIndomitusEraImperialDate(date);\n    }\n\n    if (isTerranDate(date)) {\n      indomitusEraDate = this.fromTerranDate(date);\n    }\n\n    if (isClassicImperialDate(date)) {\n      indomitusEraDate = this.fromClassicImperialDate(date);\n    }\n\n    if (!indomitusEraDate) {\n      throw new Error('Type mismatch on input');\n    }\n\n    return {\n      ...indomitusEraDate,\n      toString: (format?: string) => this.format(indomitusEraDate, format),\n      toDate: () => this.getTerranDate(indomitusEraDate),\n    };\n  }\n\n  private fromString(date: string, format?: string): IndomitusEraDate {\n    const formats = [\n      Formats.INDOMITUS_ERA_DEFAULT_FORMAT.valueOf(),\n      Formats.INDOMITUS_ERA_SHORT_FORMAT.valueOf(),\n    ];\n    if (format) {\n      formats.push(format);\n    }\n\n    const parser = new ImperialDateParser<IndomitusEraDate>(\n      formats,\n      indomitusEraImperialDateSegments,\n      indomitusEraImperialDateFactory,\n      convertTerranToIndomitusDate,\n    );\n    return parser.parse(date);\n  }\n\n  private fromTerranDate(date: TerranDate): IndomitusEraDate {\n    return convertTerranToIndomitusDate(date);\n  }\n\n  private fromIndomitusEraImperialDate(\n    date: IndomitusEraDate,\n  ): IndomitusEraDate {\n    if (!this.isValid(date)) {\n      throw new Error('Invalid date');\n    }\n\n    return { ...date };\n  }\n\n  private fromClassicImperialDate(date: ClassicDate): IndomitusEraDate {\n    return convertClassicToIndomitusDate(date);\n  }\n}\n","import { ClassicImperialCalendar } from './classic/classic-calendar';\nimport { IndomitusEraImperialCalendar } from './indomitus-era/indomitus-era-calendar';\n\nexport class Chrono {\n  /**\n   * Calendar for handling dates in the old style (pre-great rift) of the imperial dating system\n   *\n   * E. g.:\n   * - \"0 000 999.M41\"\n   * - \"005.M30\"\n   */\n  static classic = new ClassicImperialCalendar();\n  /**\n   * Calendar for handling dates in the old style (post-great rift) of the imperial dating system\n   *\n   * E. g.:\n   * - 0.1 previo VCM.M41\n   * - 1.1+ TCM.M41\n   */\n  static indomitus = new IndomitusEraImperialCalendar();\n\n  static parse = Chrono.classic.parse.bind(Chrono.classic);\n  static format = Chrono.classic.format.bind(Chrono.classic);\n  static valid = Chrono.classic.isValid.bind(Chrono.classic);\n  static getTerranDate = Chrono.classic.getTerranDate.bind(Chrono.classic);\n}\n"],"mappings":"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","names":["Formats","format","format"]}