UNPKG

ethio-calendar-converter-angular

Version:
659 lines (627 loc) 28.3 kB
import * as i0 from '@angular/core'; import { Injectable, EventEmitter, Component, Output, NgModule } from '@angular/core'; import * as i3 from '@angular/forms'; import { FormsModule } from '@angular/forms'; import * as i2 from '@angular/common'; import { CommonModule } from '@angular/common'; class EthiopianCalendarService { // Ethiopian calendar constants ETHIOPIAN_MONTHS = 13; ETHIOPIAN_DAYS_IN_MONTH = 30; ETHIOPIAN_PAGUME_DAYS = 5; // 6 in leap year isEthiopianLeapYear(year) { return (year + 1) % 4 === 0; } isGregorianLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0); } validateEthiopianDate(date) { if (date.month < 1 || date.month > this.ETHIOPIAN_MONTHS) return false; if (date.month === this.ETHIOPIAN_MONTHS) { const maxDays = this.isEthiopianLeapYear(date.year) ? this.ETHIOPIAN_PAGUME_DAYS + 1 : this.ETHIOPIAN_PAGUME_DAYS; return date.day >= 1 && date.day <= maxDays; } return date.day >= 1 && date.day <= this.ETHIOPIAN_DAYS_IN_MONTH; } toGregorian(ethiopianDate) { if (!this.validateEthiopianDate(ethiopianDate)) { throw new Error('Invalid Ethiopian date'); } let { year, month, day } = ethiopianDate; // Calculate the number of days from Ethiopian new year to the given date let daysDiff = (month - 1) * this.ETHIOPIAN_DAYS_IN_MONTH + day; // Basic conversion (Ethiopian new year is typically September 11/12) let gregorianYear = year + 7; let gregorianMonth = 9; // September let gregorianDay = 10; // Start from September 10 // Adjust for Ethiopian leap year if (this.isEthiopianLeapYear(year)) { gregorianDay += 1; } // Add the difference in days gregorianDay += daysDiff; // Adjust the Gregorian date const gregorianMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if (this.isGregorianLeapYear(gregorianYear)) { gregorianMonthDays[1] = 29; } // Adjust month and day while (gregorianDay > gregorianMonthDays[gregorianMonth - 1]) { gregorianDay -= gregorianMonthDays[gregorianMonth - 1]; gregorianMonth++; if (gregorianMonth > 12) { gregorianMonth = 1; gregorianYear++; if (this.isGregorianLeapYear(gregorianYear)) { gregorianMonthDays[1] = 29; } else { gregorianMonthDays[1] = 28; } } } return { year: gregorianYear, month: gregorianMonth, day: gregorianDay }; } toEthiopian(gregorianDate) { let { year, month, day } = gregorianDate; // Find the Ethiopian year let ethiopianYear = year - 8; // Calculate days from Ethiopian new year (September 11/12) const gregorianMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; if (this.isGregorianLeapYear(year)) { gregorianMonthDays[1] = 29; } // Calculate the Ethiopian date let ethiopianMonth = 1; let ethiopianDay = 1; // Adjust based on the Gregorian date if (month > 9 || (month === 9 && day > 11)) { ethiopianYear++; } // Calculate days from Ethiopian new year let daysDiff = 0; if (month > 9) { // Add days from September to current month for (let m = 9; m < month; m++) { daysDiff += gregorianMonthDays[m - 1]; } daysDiff += day - 11; } else if (month < 9) { // Add remaining days from September to December for (let m = 9; m <= 12; m++) { daysDiff += gregorianMonthDays[m - 1]; } // Add days from January to current month for (let m = 1; m < month; m++) { daysDiff += gregorianMonthDays[m - 1]; } daysDiff += day - 11; } else { // September daysDiff = day - 11; } // Convert days difference to Ethiopian date ethiopianMonth = Math.floor(daysDiff / 30) + 1; ethiopianDay = (daysDiff % 30) + 1; return { year: ethiopianYear, month: ethiopianMonth, day: ethiopianDay }; } // Helper method to format dates formatDate(date, isEthiopian = true) { const { year, month, day } = date; return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}${isEthiopian ? ' (Ethiopian)' : ' (Gregorian)'}`; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); class EthiopianCalendarComponent { calendarService; ethiopianDate = { year: 2015, month: 4, day: 25 }; gregorianDate = { year: 2022, month: 3, day: 25 }; lastConversion = ''; showEthiopianPicker = false; ethiopianMonths = [ { value: 1, label: 'Meskerem' }, { value: 2, label: 'Tikimt' }, { value: 3, label: 'Hidar' }, { value: 4, label: 'Tahsas' }, { value: 5, label: 'Tir' }, { value: 6, label: 'Yekatit' }, { value: 7, label: 'Megabit' }, { value: 8, label: 'Miyazia' }, { value: 9, label: 'Ginbot' }, { value: 10, label: 'Sene' }, { value: 11, label: 'Hamle' }, { value: 12, label: 'Nehase' }, { value: 13, label: 'Pagume' } ]; get ethiopianYears() { const currentYear = new Date().getFullYear(); const years = []; for (let i = currentYear - 100; i <= currentYear + 100; i++) { years.push(i - 8); // Convert to approximate Ethiopian year } return years; } ethiopianDateChange = new EventEmitter(); gregorianDateChange = new EventEmitter(); constructor(calendarService) { this.calendarService = calendarService; } toggleEthiopianPicker() { this.showEthiopianPicker = !this.showEthiopianPicker; } getEthiopianDays() { const maxDays = this.ethiopianDate.month === 13 ? (this.calendarService['isEthiopianLeapYear'](this.ethiopianDate.year) ? 6 : 5) : 30; return Array.from({ length: maxDays }, (_, i) => i + 1); } applyEthiopianDate() { this.convertToGregorian(); this.toggleEthiopianPicker(); } formatEthiopianDateForDisplay(date) { const monthName = this.ethiopianMonths.find(m => m.value === date.month)?.label || ''; return `${monthName} ${date.day}, ${date.year}`; } convertToGregorian() { try { this.gregorianDate = this.calendarService.toGregorian(this.ethiopianDate); this.gregorianDateChange.emit(this.gregorianDate); this.lastConversion = `Ethiopian ${this.formatDate(this.ethiopianDate)} → Gregorian ${this.formatDate(this.gregorianDate)}`; } catch (error) { this.lastConversion = 'Invalid Ethiopian date'; } } convertToEthiopian() { try { this.ethiopianDate = this.calendarService.toEthiopian(this.gregorianDate); this.ethiopianDateChange.emit(this.ethiopianDate); this.lastConversion = `Gregorian ${this.formatDate(this.gregorianDate)} → Ethiopian ${this.formatDate(this.ethiopianDate)}`; } catch (error) { this.lastConversion = 'Invalid Gregorian date'; } } onGregorianDateSelected(event) { const date = new Date(event.target.value); this.gregorianDate = { year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate() }; this.convertToEthiopian(); } formatDate(date) { return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`; } formatDateForInput(date) { return `${date.year}-${String(date.month).padStart(2, '0')}-${String(date.day).padStart(2, '0')}`; } formatGregorianDate(date) { return new Date(date.year, date.month - 1, date.day) .toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); } weekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; previousMonth() { if (this.ethiopianDate.month > 1) { this.ethiopianDate.month--; } else { this.ethiopianDate.month = 13; this.ethiopianDate.year--; } this.updateEthiopianDate(); } nextMonth() { if (this.ethiopianDate.month < 13) { this.ethiopianDate.month++; } else { this.ethiopianDate.month = 1; this.ethiopianDate.year++; } this.updateEthiopianDate(); } getDaysArray() { const daysInMonth = this.ethiopianDate.month === 13 ? (this.calendarService['isEthiopianLeapYear'](this.ethiopianDate.year) ? 6 : 5) : 30; // Create array with padding for alignment const days = []; const firstDayOffset = this.getFirstDayOffset(); // Add padding for (let i = 0; i < firstDayOffset; i++) { days.push(0); } // Add days for (let i = 1; i <= daysInMonth; i++) { days.push(i); } return days; } getFirstDayOffset() { // This is a simplified version - you might want to implement proper Ethiopian calendar day-of-week calculation return (this.ethiopianDate.month * 2) % 7; } getDayClasses(day) { const baseClasses = 'h-8 w-8 rounded-full flex items-center justify-center text-sm'; const isSelected = day === this.ethiopianDate.day; if (isSelected) { return `${baseClasses} bg-blue-600 text-white`; } return `${baseClasses} hover:bg-gray-100 text-gray-700`; } selectDay(day) { this.ethiopianDate.day = day; this.updateEthiopianDate(); this.toggleEthiopianPicker(); } selectToday() { const today = this.calendarService.toEthiopian({ year: new Date().getFullYear(), month: new Date().getMonth() + 1, day: new Date().getDate() }); this.ethiopianDate = today; this.updateEthiopianDate(); this.toggleEthiopianPicker(); } updateEthiopianDate() { this.ethiopianDateChange.emit(this.ethiopianDate); this.convertToGregorian(); } formatEthiopianDateForInput(date) { const monthName = this.ethiopianMonths.find(m => m.value === date.month)?.label || ''; return `${monthName} ${date.day}, ${date.year}`; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarComponent, deps: [{ token: EthiopianCalendarService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EthiopianCalendarComponent, isStandalone: true, selector: "ethiopian-calendar", outputs: { ethiopianDateChange: "ethiopianDateChange", gregorianDateChange: "gregorianDateChange" }, ngImport: i0, template: ` <div class="bg-white rounded-lg shadow-lg p-6 max-w-md mx-auto"> <!-- Ethiopian Calendar Input --> <div class="mb-8"> <h3 class="text-lg font-medium text-gray-900 mb-4">Ethiopian Calendar</h3> <div class="relative"> <input type="text" [value]="formatEthiopianDateForInput(ethiopianDate)" (click)="toggleEthiopianPicker()" readonly class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all cursor-pointer" /> <label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label> <!-- Calendar Icon --> <button (click)="toggleEthiopianPicker()" class="absolute right-2 top-2 text-gray-400 hover:text-gray-600 focus:outline-none" > <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" /> </svg> </button> <!-- Ethiopian Calendar Picker --> <div *ngIf="showEthiopianPicker" class="absolute left-0 mt-1 p-4 bg-white rounded-lg shadow-lg border border-gray-200 z-50 w-[320px]"> <!-- Month and Year Navigation --> <div class="flex justify-between items-center mb-4"> <button (click)="previousMonth()" class="p-1 hover:bg-gray-100 rounded-full" > <svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" /> </svg> </button> <div class="flex items-center space-x-2"> <select [(ngModel)]="ethiopianDate.month" (change)="updateEthiopianDate()" class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0" > <option *ngFor="let month of ethiopianMonths" [value]="month.value"> {{month.label}} </option> </select> <select [(ngModel)]="ethiopianDate.year" (change)="updateEthiopianDate()" class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0" > <option *ngFor="let year of ethiopianYears" [value]="year">{{year}}</option> </select> </div> <button (click)="nextMonth()" class="p-1 hover:bg-gray-100 rounded-full" > <svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /> </svg> </button> </div> <!-- Calendar Grid --> <div class="grid grid-cols-7 gap-1"> <!-- Week days --> <div *ngFor="let day of weekDays" class="text-center text-xs font-medium text-gray-500 py-1"> {{day}} </div> <!-- Days --> <ng-container *ngFor="let day of getDaysArray()"> <button *ngIf="day !== 0" (click)="selectDay(day)" [class]="getDayClasses(day)" > {{day}} </button> <div *ngIf="day === 0" class="h-8"></div> </ng-container> </div> <!-- Today Button --> <div class="mt-4 flex justify-between items-center border-t pt-4"> <button (click)="selectToday()" class="text-sm text-blue-600 hover:text-blue-800 font-medium" > Today </button> <button (click)="toggleEthiopianPicker()" class="text-sm text-gray-600 hover:text-gray-800 font-medium" > Close </button> </div> </div> </div> <div *ngIf="ethiopianDate" class="mt-2 text-sm text-gray-600"> Selected: {{formatEthiopianDateForDisplay(ethiopianDate)}} </div> <button (click)="convertToGregorian()" class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors" > Convert to Gregorian </button> </div> <!-- Gregorian Calendar Input --> <div class="mb-8"> <h3 class="text-lg font-medium text-gray-900 mb-4">Gregorian Calendar</h3> <div class="relative"> <input type="date" [value]="formatDateForInput(gregorianDate)" (change)="onGregorianDateSelected($event)" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all" /> <label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label> </div> <div *ngIf="gregorianDate" class="mt-2 text-sm text-gray-600"> Selected: {{formatGregorianDate(gregorianDate)}} </div> <button (click)="convertToEthiopian()" class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors" > Convert to Ethiopian </button> </div> <!-- Conversion Result --> <div *ngIf="lastConversion" class="p-4 bg-gray-50 rounded-lg border border-gray-200"> <p class="text-sm font-medium text-gray-900">Last Conversion:</p> <p class="text-sm text-gray-600 mt-1">{{lastConversion}}</p> </div> </div> `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarComponent, decorators: [{ type: Component, args: [{ selector: 'ethiopian-calendar', standalone: true, imports: [ CommonModule, FormsModule ], template: ` <div class="bg-white rounded-lg shadow-lg p-6 max-w-md mx-auto"> <!-- Ethiopian Calendar Input --> <div class="mb-8"> <h3 class="text-lg font-medium text-gray-900 mb-4">Ethiopian Calendar</h3> <div class="relative"> <input type="text" [value]="formatEthiopianDateForInput(ethiopianDate)" (click)="toggleEthiopianPicker()" readonly class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all cursor-pointer" /> <label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label> <!-- Calendar Icon --> <button (click)="toggleEthiopianPicker()" class="absolute right-2 top-2 text-gray-400 hover:text-gray-600 focus:outline-none" > <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" /> </svg> </button> <!-- Ethiopian Calendar Picker --> <div *ngIf="showEthiopianPicker" class="absolute left-0 mt-1 p-4 bg-white rounded-lg shadow-lg border border-gray-200 z-50 w-[320px]"> <!-- Month and Year Navigation --> <div class="flex justify-between items-center mb-4"> <button (click)="previousMonth()" class="p-1 hover:bg-gray-100 rounded-full" > <svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" /> </svg> </button> <div class="flex items-center space-x-2"> <select [(ngModel)]="ethiopianDate.month" (change)="updateEthiopianDate()" class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0" > <option *ngFor="let month of ethiopianMonths" [value]="month.value"> {{month.label}} </option> </select> <select [(ngModel)]="ethiopianDate.year" (change)="updateEthiopianDate()" class="text-sm border-none bg-transparent font-semibold focus:outline-none focus:ring-0" > <option *ngFor="let year of ethiopianYears" [value]="year">{{year}}</option> </select> </div> <button (click)="nextMonth()" class="p-1 hover:bg-gray-100 rounded-full" > <svg class="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" /> </svg> </button> </div> <!-- Calendar Grid --> <div class="grid grid-cols-7 gap-1"> <!-- Week days --> <div *ngFor="let day of weekDays" class="text-center text-xs font-medium text-gray-500 py-1"> {{day}} </div> <!-- Days --> <ng-container *ngFor="let day of getDaysArray()"> <button *ngIf="day !== 0" (click)="selectDay(day)" [class]="getDayClasses(day)" > {{day}} </button> <div *ngIf="day === 0" class="h-8"></div> </ng-container> </div> <!-- Today Button --> <div class="mt-4 flex justify-between items-center border-t pt-4"> <button (click)="selectToday()" class="text-sm text-blue-600 hover:text-blue-800 font-medium" > Today </button> <button (click)="toggleEthiopianPicker()" class="text-sm text-gray-600 hover:text-gray-800 font-medium" > Close </button> </div> </div> </div> <div *ngIf="ethiopianDate" class="mt-2 text-sm text-gray-600"> Selected: {{formatEthiopianDateForDisplay(ethiopianDate)}} </div> <button (click)="convertToGregorian()" class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors" > Convert to Gregorian </button> </div> <!-- Gregorian Calendar Input --> <div class="mb-8"> <h3 class="text-lg font-medium text-gray-900 mb-4">Gregorian Calendar</h3> <div class="relative"> <input type="date" [value]="formatDateForInput(gregorianDate)" (change)="onGregorianDateSelected($event)" class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all" /> <label class="absolute -top-2 left-2 bg-white px-1 text-xs text-gray-600">Select Date</label> </div> <div *ngIf="gregorianDate" class="mt-2 text-sm text-gray-600"> Selected: {{formatGregorianDate(gregorianDate)}} </div> <button (click)="convertToEthiopian()" class="mt-4 w-full bg-blue-600 text-white px-4 py-2 rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors" > Convert to Ethiopian </button> </div> <!-- Conversion Result --> <div *ngIf="lastConversion" class="p-4 bg-gray-50 rounded-lg border border-gray-200"> <p class="text-sm font-medium text-gray-900">Last Conversion:</p> <p class="text-sm text-gray-600 mt-1">{{lastConversion}}</p> </div> </div> ` }] }], ctorParameters: () => [{ type: EthiopianCalendarService }], propDecorators: { ethiopianDateChange: [{ type: Output }], gregorianDateChange: [{ type: Output }] } }); class EthiopianCalendarModule { static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, imports: [CommonModule, FormsModule, EthiopianCalendarComponent], exports: [EthiopianCalendarComponent] }); static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, providers: [ EthiopianCalendarService ], imports: [CommonModule, FormsModule, EthiopianCalendarComponent] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EthiopianCalendarModule, decorators: [{ type: NgModule, args: [{ declarations: [], imports: [ CommonModule, FormsModule, EthiopianCalendarComponent ], exports: [ EthiopianCalendarComponent ], providers: [ EthiopianCalendarService ] }] }] }); /** * Generated bundle index. Do not edit. */ export { EthiopianCalendarComponent, EthiopianCalendarModule, EthiopianCalendarService }; //# sourceMappingURL=ethio-calendar-converter-angular.mjs.map