{"version":3,"sources":["../utils/catalogue.ts","../models/Catalogue.ts"],"sourcesContent":["import {parseBesselianElements} from '@package/solarEclipse';\nimport {dateStringToJulianDay, julianDay2time} from '@package/time/utils/dateTime';\nimport type {BesselianElements, Catalogue} from '../types/BesselianElementTypes';\n\nexport interface CatalogueRange {\n    dateFrom: number;\n    dateTo: number;\n    outOfRangeHint?: string;\n}\n\nconst STANDARD_CATALOGUE_RANGE: CatalogueRange = {\n    dateFrom: 1900,\n    dateTo: 2100,\n    outOfRangeHint: ' Use catalogue-full for dates outside this range.',\n};\n\n// Binary format per entry (61 bytes):\n//  [0]  uint32  keyInt        — JD key integer part (key = keyInt + 0.5)\n//  [4]  float32 t0Offset      — t0Jde - key, range [0, 1)\n//  [8]  uint8   t0Hours       — hours 0–23\n//  [9]  float32 x0\n//  [13] uint16  x1            — quantized: (val - 0.43) * 409594\n//  [15] int16   x2            — quantized: val * 3.2767e8\n//  [17] int16   x3            — quantized: val * 2.97882e9\n//  [19] float32 y0\n//  [23] int16   y1            — quantized: val * 109223\n//  [25] int16   y2            — quantized: val * 1.09223e8\n//  [27] int16   y3            — quantized: val * 5.95764e9\n//  [29] float32 d0\n//  [33] int16   d1            — quantized: val * 1.92747e6\n//  [35] int16   d2            — quantized: val * 4.36893e9\n//  [37] float32 mu0\n//  [41] uint16  mu1           — quantized: (val - 14.99) * 3.855e6\n//  [43] uint16  l1_0          — quantized: (val - 0.528) * 1337455\n//  [45] int16   l1_1          — quantized: val * 2.18447e8\n//  [47] int16   l1_2          — quantized: val * 2.3405e9\n//  [49] int16   l2_0          — quantized: val * 1057000\n//  [51] int16   l2_1          — quantized: val * 2.18447e8\n//  [53] int16   l2_2          — quantized: val * 2.3405e9\n//  [55] uint16  tanF1         — quantized: (val - 0.00455) * 2.6214e8\n//  [57] uint16  tanF2         — quantized: (val - 0.00452) * 2.6214e8\n//  [59] uint16  saros         — Saros series number\n//  mu2 omitted — always 0 in all catalogue entries\n\nconst ENTRY_BYTES = 61;\n\n// Decode scales (reciprocals stored to avoid repeated division)\nconst X1_OFF = 0.43,\n    X1_SC = 1 / 409594;\nconst X2_SC = 1 / 327670000;\nconst X3_SC = 1 / 2978820000;\nconst Y1_SC = 1 / 109223;\nconst Y2_SC = 1 / 109223000;\nconst Y3_SC = 1 / 5957640000;\nconst D1_SC = 1 / 1927470;\nconst D2_SC = 1 / 4368930000;\nconst MU1_OFF = 14.99,\n    MU1_SC = 1 / 3855000;\nconst L10_OFF = 0.528,\n    L10_SC = 1 / 1337455;\nconst L11_SC = 1 / 218447000;\nconst L12_SC = 1 / 2340500000;\nconst L20_SC = 1 / 1057000;\nconst L21_SC = 1 / 218447000;\nconst L22_SC = 1 / 2340500000;\nconst TF1_OFF = 0.00455,\n    TF1_SC = 1 / 262140000;\nconst TF2_OFF = 0.00452,\n    TF2_SC = 1 / 262140000;\n\nfunction decodeBase64(base64: string): Uint8Array {\n    if (typeof Buffer !== 'undefined') {\n        return Buffer.from(base64, 'base64');\n    }\n    const binary = atob(base64);\n    const bytes = new Uint8Array(binary.length);\n    for (let i = 0; i < binary.length; i++) {\n        bytes[i] = binary.charCodeAt(i);\n    }\n    return bytes;\n}\n\nexport function decodeCatalogue(base64: string): Catalogue {\n    const bytes = decodeBase64(base64);\n    const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n    const count = bytes.byteLength / ENTRY_BYTES;\n    const catalogue: Catalogue = {};\n\n    for (let i = 0; i < count; i++) {\n        const o = i * ENTRY_BYTES;\n        const keyInt = view.getUint32(o, true);\n        const t0Off = view.getFloat32(o + 4, true);\n        const t0Hours = view.getUint8(o + 8);\n\n        const jd = keyInt + 0.5;\n\n        catalogue[jd] = [\n            jd + t0Off, // 0  t0Jde\n            t0Hours, // 1  t0Hours\n            -4, // 2  tMin  (constant)\n            4, // 3  tMax  (constant)\n            0, // 4  reserved (constant)\n            0, // 5  unused (constant)\n            view.getFloat32(o + 9, true), // 6  x0\n            view.getUint16(o + 13, true) * X1_SC + X1_OFF, // 7  x1\n            view.getInt16(o + 15, true) * X2_SC, // 8  x2\n            view.getInt16(o + 17, true) * X3_SC, // 9  x3\n            view.getFloat32(o + 19, true), // 10 y0\n            view.getInt16(o + 23, true) * Y1_SC, // 11 y1\n            view.getInt16(o + 25, true) * Y2_SC, // 12 y2\n            view.getInt16(o + 27, true) * Y3_SC, // 13 y3\n            view.getFloat32(o + 29, true), // 14 d0\n            view.getInt16(o + 33, true) * D1_SC, // 15 d1\n            view.getInt16(o + 35, true) * D2_SC, // 16 d2\n            view.getFloat32(o + 37, true), // 17 mu0\n            view.getUint16(o + 41, true) * MU1_SC + MU1_OFF, // 18 mu1\n            0, // 19 mu2  (constant)\n            view.getUint16(o + 43, true) * L10_SC + L10_OFF, // 20 l1_0\n            view.getInt16(o + 45, true) * L11_SC, // 21 l1_1\n            view.getInt16(o + 47, true) * L12_SC, // 22 l1_2\n            view.getInt16(o + 49, true) * L20_SC, // 23 l2_0\n            view.getInt16(o + 51, true) * L21_SC, // 24 l2_1\n            view.getInt16(o + 53, true) * L22_SC, // 25 l2_2\n            view.getUint16(o + 55, true) * TF1_SC + TF1_OFF, // 26 tanF1\n            view.getUint16(o + 57, true) * TF2_SC + TF2_OFF, // 27 tanF2\n            view.getUint16(o + 59, true), // 28 saros\n        ];\n    }\n\n    return catalogue;\n}\n\nexport function getAvailableEclipseDates(catalogue: Catalogue, dateFrom?: string, dateTo?: string): Array<string> {\n    const jdFrom = dateFrom !== undefined ? dateStringToJulianDay(dateFrom) : -Infinity;\n    const jdTo = dateTo !== undefined ? dateStringToJulianDay(dateTo) : Infinity;\n\n    return Object.keys(catalogue)\n        .map(Number)\n        .filter((jd) => jd >= jdFrom && jd <= jdTo)\n        .sort((a, b) => a - b)\n        .map((jd) => {\n            const {year, month, day} = julianDay2time(jd);\n            return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n        });\n}\n\nexport function getBesselianElements(\n    catalogue: Catalogue,\n    dateStr: string,\n    range: CatalogueRange = STANDARD_CATALOGUE_RANGE,\n): BesselianElements {\n    const year = getDateStringYear(dateStr);\n    if (year < range.dateFrom || year > range.dateTo) {\n        throw new Error(\n            `Date ${dateStr} is outside the catalogue range (${range.dateFrom}–${range.dateTo}).${range.outOfRangeHint ?? ''}`,\n        );\n    }\n\n    const jd = dateStringToJulianDay(dateStr);\n    const raw = catalogue[jd];\n\n    if (!raw) {\n        throw new Error(`No Besselian elements found for eclipse on ${dateStr}`);\n    }\n\n    return parseBesselianElements(raw);\n}\n\nfunction getDateStringYear(dateStr: string): number {\n    const match = /^([+-]?\\d+)-/.exec(dateStr);\n\n    if (!match) {\n        return Number.NaN;\n    }\n\n    return Number(match[1]);\n}\n","import type {BesselianElements, Catalogue as CatalogueType} from '../types/BesselianElementTypes';\nimport {type CatalogueRange, getAvailableEclipseDates, getBesselianElements} from '../utils/catalogue';\n\nexport default class Catalogue {\n    private constructor(\n        private readonly catalogue: CatalogueType,\n        private readonly range: CatalogueRange,\n    ) {}\n\n    public static create(catalogue: CatalogueType, range: CatalogueRange): Catalogue {\n        return new Catalogue(catalogue, range);\n    }\n\n    public getAvailableEclipseDates(dateFrom?: string, dateTo?: string): Array<string> {\n        return getAvailableEclipseDates(this.catalogue, dateFrom, dateTo);\n    }\n\n    public getBesselianElements(dateStr: string): BesselianElements {\n        return getBesselianElements(this.catalogue, dateStr, this.range);\n    }\n}\n"],"mappings":"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","names":["STANDARD_CATALOGUE_RANGE","ENTRY_BYTES","X1_OFF","X1_SC","X2_SC","X3_SC","Y1_SC","Y2_SC","Y3_SC","D1_SC","D2_SC","MU1_OFF","MU1_SC","L10_OFF","L10_SC","L11_SC","L12_SC","L20_SC","L21_SC","L22_SC","TF1_OFF","TF1_SC","TF2_OFF","TF2_SC","decodeBase64","base64","binary","bytes","i","decodeCatalogue","view","count","catalogue","o","keyInt","t0Off","t0Hours","jd","getAvailableEclipseDates","dateFrom","dateTo","jdFrom","dateStringToJulianDay","jdTo","a","b","year","month","day","julianDay2time","getBesselianElements","dateStr","range","getDateStringYear","raw","parseBesselianElements","match","Catalogue","_Catalogue","catalogue","range","dateFrom","dateTo","getAvailableEclipseDates","dateStr","getBesselianElements"]}