chrono-40k
Version:
A consistent dating system for 'Warhammer 40,000'
1 lines • 41.8 kB
Source Map (JSON)
{"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"]}