bg-name-days 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,132 @@
1
+ /** @typedef {import('../types.js').NameDayEntry} NameDayEntry */
2
+
3
+ import { january } from './january.js';
4
+ import { february } from './february.js';
5
+ import { march } from './march.js';
6
+ import { april } from './april.js';
7
+ import { may } from './may.js';
8
+ import { june } from './june.js';
9
+ import { july } from './july.js';
10
+ import { august } from './august.js';
11
+ import { september } from './september.js';
12
+ import { october } from './october.js';
13
+ import { november } from './november.js';
14
+ import { december } from './december.js';
15
+ import { getMoveableEntries } from '../moveable.js';
16
+
17
+ /** All fixed-date entries (no year dependency). */
18
+ const fixedEntries = [
19
+ ...january, ...february, ...march, ...april,
20
+ ...may, ...june, ...july, ...august,
21
+ ...september, ...october, ...november, ...december,
22
+ ];
23
+
24
+ /**
25
+ * @typedef {Object} NameDayIndex
26
+ * @property {Map<string, NameDayEntry[]>} byName - lowercase name → entries
27
+ * @property {Map<string, NameDayEntry[]>} byDate - "MM-DD" → entries
28
+ * @property {Map<string, NameDayEntry[]>} byHoliday - lowercase holiday → entries
29
+ * @property {number} year - year this index was built for
30
+ */
31
+
32
+ /** @type {Map<number, NameDayIndex>} */
33
+ const indexCache = new Map();
34
+
35
+ /**
36
+ * Pad a number to 2 digits.
37
+ * @param {number} n
38
+ * @returns {string}
39
+ */
40
+ function pad(n) {
41
+ return String(n).padStart(2, '0');
42
+ }
43
+
44
+ /**
45
+ * Build name/date/holiday indexes for a given year.
46
+ * Moveable entries are resolved for that year.
47
+ * @param {NameDayEntry[]} entries
48
+ * @param {number} year
49
+ * @returns {NameDayIndex}
50
+ */
51
+ function buildIndex(entries, year) {
52
+ /** @type {Map<string, NameDayEntry[]>} */
53
+ const byName = new Map();
54
+ /** @type {Map<string, NameDayEntry[]>} */
55
+ const byDate = new Map();
56
+ /** @type {Map<string, NameDayEntry[]>} */
57
+ const byHoliday = new Map();
58
+
59
+ for (const entry of entries) {
60
+ // Index by primary name (lowercase)
61
+ const primaryKey = entry.name.toLowerCase();
62
+ if (!byName.has(primaryKey)) byName.set(primaryKey, []);
63
+ byName.get(primaryKey).push(entry);
64
+
65
+ // Index by each variant (lowercase)
66
+ for (const variant of entry.variants) {
67
+ const variantKey = variant.toLowerCase();
68
+ if (!byName.has(variantKey)) byName.set(variantKey, []);
69
+ byName.get(variantKey).push(entry);
70
+ }
71
+
72
+ // Index by each latin name (lowercase)
73
+ for (const latin of entry.latin) {
74
+ const latinKey = latin.toLowerCase();
75
+ if (!byName.has(latinKey)) byName.set(latinKey, []);
76
+ byName.get(latinKey).push(entry);
77
+ }
78
+
79
+ // Index by date "MM-DD"
80
+ const dateKey = `${pad(entry.month)}-${pad(entry.day)}`;
81
+ if (!byDate.has(dateKey)) byDate.set(dateKey, []);
82
+ byDate.get(dateKey).push(entry);
83
+
84
+ // Index by holiday (lowercase)
85
+ const holidayKey = entry.holiday.toLowerCase();
86
+ if (!byHoliday.has(holidayKey)) byHoliday.set(holidayKey, []);
87
+ byHoliday.get(holidayKey).push(entry);
88
+ }
89
+
90
+ return { byName, byDate, byHoliday, year };
91
+ }
92
+
93
+ /**
94
+ * Get the index for a given year. Uses cache for performance.
95
+ * @param {number} [year] - defaults to current year
96
+ * @returns {NameDayIndex}
97
+ */
98
+ export function getIndex(year) {
99
+ const y = year ?? new Date().getFullYear();
100
+
101
+ if (indexCache.has(y)) {
102
+ return /** @type {NameDayIndex} */ (indexCache.get(y));
103
+ }
104
+
105
+ const moveableEntries = getMoveableEntries(y);
106
+ const allEntries = [...fixedEntries, ...moveableEntries];
107
+ const index = buildIndex(allEntries, y);
108
+
109
+ indexCache.set(y, index);
110
+ return index;
111
+ }
112
+
113
+ /**
114
+ * Get all fixed-date entries (no moveable).
115
+ * Returns a shallow copy.
116
+ * @returns {NameDayEntry[]}
117
+ */
118
+ export function getAllFixed() {
119
+ return [...fixedEntries];
120
+ }
121
+
122
+ /**
123
+ * Get all entries for a given year (fixed + resolved moveable).
124
+ * Returns a shallow copy.
125
+ * @param {number} [year] - defaults to current year
126
+ * @returns {NameDayEntry[]}
127
+ */
128
+ export function getAllEntries(year) {
129
+ const y = year ?? new Date().getFullYear();
130
+ const moveableEntries = getMoveableEntries(y);
131
+ return [...fixedEntries, ...moveableEntries];
132
+ }
@@ -0,0 +1,225 @@
1
+ /** @typedef {import('../types.js').NameDayEntry} NameDayEntry */
2
+
3
+ /** @type {NameDayEntry[]} */
4
+ export const november = [
5
+ {
6
+ name: "Будин",
7
+ variants: ["Будинка"],
8
+ latin: ["Budin", "Budinka"],
9
+ month: 11, day: 1,
10
+ holiday: "Ден на народните будители",
11
+ holidayLatin: "Den na narodnite buditeli",
12
+ tradition: "orthodox",
13
+ moveable: null,
14
+ },
15
+ {
16
+ name: "Михаил",
17
+ variants: ["Михаела", "Михо", "Мишо", "Миха", "Михалина"],
18
+ latin: ["Mihail", "Mihaela", "Miho", "Misho", "Miha", "Mihalina"],
19
+ month: 11, day: 8,
20
+ holiday: "Архангеловден (Свети Архангел Михаил)",
21
+ holidayLatin: "Arhangelovden (Sveti Arhangel Mihail)",
22
+ tradition: "orthodox",
23
+ moveable: null,
24
+ },
25
+ {
26
+ name: "Ангел",
27
+ variants: ["Ангела", "Ангелина", "Ангелинка", "Архангел"],
28
+ latin: ["Angel", "Angela", "Angelina", "Angelinka", "Arhangel"],
29
+ month: 11, day: 8,
30
+ holiday: "Архангеловден (Свети Архангел Михаил)",
31
+ holidayLatin: "Arhangelovden (Sveti Arhangel Mihail)",
32
+ tradition: "orthodox",
33
+ moveable: null,
34
+ },
35
+ {
36
+ name: "Гавраил",
37
+ variants: ["Гаврил", "Габриел", "Габриела"],
38
+ latin: ["Gavrail", "Gavril", "Gabriel", "Gabriela"],
39
+ month: 11, day: 8,
40
+ holiday: "Архангеловден (Свети Архангел Михаил)",
41
+ holidayLatin: "Arhangelovden (Sveti Arhangel Mihail)",
42
+ tradition: "orthodox",
43
+ moveable: null,
44
+ },
45
+ {
46
+ name: "Рафаел",
47
+ variants: ["Рафаела"],
48
+ latin: ["Rafael", "Rafaela"],
49
+ month: 11, day: 8,
50
+ holiday: "Архангеловден (Свети Архангел Михаил)",
51
+ holidayLatin: "Arhangelovden (Sveti Arhangel Mihail)",
52
+ tradition: "orthodox",
53
+ moveable: null,
54
+ },
55
+ {
56
+ name: "Мина",
57
+ variants: ["Минка", "Минчо"],
58
+ latin: ["Mina", "Minka", "Mincho"],
59
+ month: 11, day: 11,
60
+ holiday: "Свети Мина",
61
+ holidayLatin: "Sveti Mina",
62
+ tradition: "orthodox",
63
+ moveable: null,
64
+ },
65
+ {
66
+ name: "Гурий",
67
+ variants: [],
68
+ latin: ["Guriy"],
69
+ month: 11, day: 15,
70
+ holiday: "Свети Гурий",
71
+ holidayLatin: "Sveti Guriy",
72
+ tradition: "orthodox",
73
+ moveable: null,
74
+ },
75
+ {
76
+ name: "Матей",
77
+ variants: ["Матея"],
78
+ latin: ["Matey", "Mateya"],
79
+ month: 11, day: 16,
80
+ holiday: "Свети Матей",
81
+ holidayLatin: "Sveti Matey",
82
+ tradition: "orthodox",
83
+ moveable: null,
84
+ },
85
+ {
86
+ name: "Мария",
87
+ variants: ["Мариан", "Мариана", "Марийка", "Мариела"],
88
+ latin: ["Mariya", "Marian", "Mariana", "Mariyka", "Mariela"],
89
+ month: 11, day: 21,
90
+ holiday: "Въведение Богородично",
91
+ holidayLatin: "Vavedenie Bogorodichno",
92
+ tradition: "orthodox",
93
+ moveable: null,
94
+ },
95
+ {
96
+ name: "Филип",
97
+ variants: ["Филипа"],
98
+ latin: ["Filip", "Filipa"],
99
+ month: 11, day: 22,
100
+ holiday: "Свети Филимон и Архип",
101
+ holidayLatin: "Sveti Filimon i Arhip",
102
+ tradition: "orthodox",
103
+ moveable: null,
104
+ },
105
+ {
106
+ name: "Александър",
107
+ variants: ["Александра", "Сашо", "Сашка", "Алекс"],
108
+ latin: ["Aleksandar", "Aleksandra", "Sasho", "Sashka", "Aleks"],
109
+ month: 11, day: 23,
110
+ holiday: "Свети Александър Невски",
111
+ holidayLatin: "Sveti Aleksandar Nevski",
112
+ tradition: "orthodox",
113
+ moveable: null,
114
+ },
115
+ {
116
+ name: "Климент",
117
+ variants: ["Климентина"],
118
+ latin: ["Kliment", "Klimentina"],
119
+ month: 11, day: 25,
120
+ holiday: "Свети Климент Охридски",
121
+ holidayLatin: "Sveti Kliment Ohridski",
122
+ tradition: "orthodox",
123
+ moveable: null,
124
+ },
125
+ {
126
+ name: "Андрей",
127
+ variants: ["Андрея", "Андреан", "Андреана", "Андриан", "Андрияна", "Андро", "Първан", "Първанка"],
128
+ latin: ["Andrey", "Andreya", "Andrean", "Andreana", "Andrian", "Andriyana", "Andro", "Parvan", "Parvanka"],
129
+ month: 11, day: 30,
130
+ holiday: "Андреевден",
131
+ holidayLatin: "Andreevden",
132
+ tradition: "orthodox",
133
+ moveable: null,
134
+ },
135
+ {
136
+ name: "Йоаникий",
137
+ variants: [],
138
+ latin: ["Yoanikiy"],
139
+ month: 11, day: 4,
140
+ holiday: "Свети Йоаникий",
141
+ holidayLatin: "Sveti Yoanikiy",
142
+ tradition: "orthodox",
143
+ moveable: null,
144
+ },
145
+ {
146
+ name: "Нектарий",
147
+ variants: [],
148
+ latin: ["Nektariy"],
149
+ month: 11, day: 9,
150
+ holiday: "Свети Нектарий",
151
+ holidayLatin: "Sveti Nektariy",
152
+ tradition: "orthodox",
153
+ moveable: null,
154
+ },
155
+ {
156
+ name: "Златко",
157
+ variants: ["Златка", "Златина", "Злата", "Златан", "Златимир", "Златимира"],
158
+ latin: ["Zlatko", "Zlatka", "Zlatina", "Zlata", "Zlatan", "Zlatimir", "Zlatimira"],
159
+ month: 11, day: 13,
160
+ holiday: "Свети Йоан Златоуст",
161
+ holidayLatin: "Sveti Yoan Zlatoust",
162
+ tradition: "orthodox",
163
+ moveable: null,
164
+ },
165
+ {
166
+ name: "Григор",
167
+ variants: ["Григорий", "Гриша"],
168
+ latin: ["Grigor", "Grigoriy", "Grisha"],
169
+ month: 11, day: 17,
170
+ holiday: "Свети Григорий Неокесарийски",
171
+ holidayLatin: "Sveti Grigoriy Neokesariyski",
172
+ tradition: "orthodox",
173
+ moveable: null,
174
+ },
175
+ {
176
+ name: "Павел",
177
+ variants: ["Павлина", "Паулина", "Поли"],
178
+ latin: ["Pavel", "Pavlina", "Paulina", "Poli"],
179
+ month: 11, day: 6,
180
+ holiday: "Свети Павел",
181
+ holidayLatin: "Sveti Pavel",
182
+ tradition: "orthodox",
183
+ moveable: null,
184
+ },
185
+ {
186
+ name: "Павел",
187
+ variants: ["Павлина"],
188
+ latin: ["Pavel", "Pavlina"],
189
+ month: 11, day: 19,
190
+ holiday: "Свети Павел",
191
+ holidayLatin: "Sveti Pavel",
192
+ tradition: "orthodox",
193
+ moveable: null,
194
+ },
195
+ {
196
+ name: "Филип",
197
+ variants: ["Филипа", "Филипина"],
198
+ latin: ["Filip", "Filipa", "Filipina"],
199
+ month: 11, day: 14,
200
+ holiday: "Свети Филип",
201
+ holidayLatin: "Sveti Filip",
202
+ tradition: "orthodox",
203
+ moveable: null,
204
+ },
205
+ {
206
+ name: "Екатерина",
207
+ variants: ["Катерина", "Катя", "Катюша", "Катрин"],
208
+ latin: ["Ekaterina", "Katerina", "Katya", "Katyusha", "Katrin"],
209
+ month: 11, day: 24,
210
+ holiday: "Света Екатерина",
211
+ holidayLatin: "Sveta Ekaterina",
212
+ tradition: "orthodox",
213
+ moveable: null,
214
+ },
215
+ {
216
+ name: "Стилиян",
217
+ variants: ["Стилияна", "Стилян", "Стиляна"],
218
+ latin: ["Stiliyan", "Stiliyana", "Stilyan", "Stilyana"],
219
+ month: 11, day: 26,
220
+ holiday: "Свети Стилиян",
221
+ holidayLatin: "Sveti Stiliyan",
222
+ tradition: "orthodox",
223
+ moveable: null,
224
+ },
225
+ ];
@@ -0,0 +1,165 @@
1
+ /** @typedef {import('../types.js').NameDayEntry} NameDayEntry */
2
+
3
+ /** @type {NameDayEntry[]} */
4
+ export const october = [
5
+ {
6
+ name: "Закрила",
7
+ variants: ["Закрилка"],
8
+ latin: ["Zakrila", "Zakrilka"],
9
+ month: 10, day: 1,
10
+ holiday: "Покров Богородичен",
11
+ holidayLatin: "Pokrov Bogorodichen",
12
+ tradition: "orthodox",
13
+ moveable: null,
14
+ },
15
+ {
16
+ name: "Петка",
17
+ variants: ["Петкана", "Параскева", "Параскев"],
18
+ latin: ["Petka", "Petkana", "Paraskeva", "Paraskev"],
19
+ month: 10, day: 14,
20
+ holiday: "Петковден (Света Петка)",
21
+ holidayLatin: "Petkovden (Sveta Petka)",
22
+ tradition: "orthodox",
23
+ moveable: null,
24
+ },
25
+ {
26
+ name: "Тома",
27
+ variants: ["Томас"],
28
+ latin: ["Toma", "Tomas"],
29
+ month: 10, day: 19,
30
+ holiday: "Свети апостол Тома",
31
+ holidayLatin: "Sveti apostol Toma",
32
+ tradition: "orthodox",
33
+ moveable: null,
34
+ },
35
+ {
36
+ name: "Артемий",
37
+ variants: [],
38
+ latin: ["Artemiy"],
39
+ month: 10, day: 20,
40
+ holiday: "Свети Артемий",
41
+ holidayLatin: "Sveti Artemiy",
42
+ tradition: "orthodox",
43
+ moveable: null,
44
+ },
45
+ {
46
+ name: "Димитър",
47
+ variants: ["Димитрина", "Димитринка", "Митко", "Митка", "Димо", "Димана", "Димка", "Димчо", "Димитрия", "Деметра", "Деметрия"],
48
+ latin: ["Dimitar", "Dimitrina", "Dimitrinka", "Mitko", "Mitka", "Dimo", "Dimana", "Dimka", "Dimcho", "Dimitriya", "Demetra", "Demetriya"],
49
+ month: 10, day: 26,
50
+ holiday: "Димитровден",
51
+ holidayLatin: "Dimitrovden",
52
+ tradition: "orthodox",
53
+ moveable: null,
54
+ },
55
+ {
56
+ name: "Нестор",
57
+ variants: ["Нестора"],
58
+ latin: ["Nestor", "Nestora"],
59
+ month: 10, day: 27,
60
+ holiday: "Свети Нестор",
61
+ holidayLatin: "Sveti Nestor",
62
+ tradition: "orthodox",
63
+ moveable: null,
64
+ },
65
+ {
66
+ name: "Киприан",
67
+ variants: ["Киприана"],
68
+ latin: ["Kiprian", "Kipriana"],
69
+ month: 10, day: 2,
70
+ holiday: "Свети Киприан",
71
+ holidayLatin: "Sveti Kiprian",
72
+ tradition: "orthodox",
73
+ moveable: null,
74
+ },
75
+ {
76
+ name: "Тома",
77
+ variants: ["Томас"],
78
+ latin: ["Toma", "Tomas"],
79
+ month: 10, day: 6,
80
+ holiday: "Свети апостол Тома",
81
+ holidayLatin: "Sveti apostol Toma",
82
+ tradition: "orthodox",
83
+ moveable: null,
84
+ },
85
+ {
86
+ name: "Пелагия",
87
+ variants: [],
88
+ latin: ["Pelagiya"],
89
+ month: 10, day: 8,
90
+ holiday: "Света Пелагия",
91
+ holidayLatin: "Sveta Pelagiya",
92
+ tradition: "orthodox",
93
+ moveable: null,
94
+ },
95
+ {
96
+ name: "Лука",
97
+ variants: ["Лукан", "Лучезар", "Лучезара"],
98
+ latin: ["Luka", "Lukan", "Luchezar", "Luchezara"],
99
+ month: 10, day: 18,
100
+ holiday: "Свети апостол Лука",
101
+ holidayLatin: "Sveti apostol Luka",
102
+ tradition: "orthodox",
103
+ moveable: null,
104
+ },
105
+ {
106
+ name: "Арета",
107
+ variants: [],
108
+ latin: ["Areta"],
109
+ month: 10, day: 24,
110
+ holiday: "Свети Арета",
111
+ holidayLatin: "Sveti Areta",
112
+ tradition: "orthodox",
113
+ moveable: null,
114
+ },
115
+ {
116
+ name: "Евлампий",
117
+ variants: [],
118
+ latin: ["Evlampiy"],
119
+ month: 10, day: 10,
120
+ holiday: "Свети Евлампий",
121
+ holidayLatin: "Sveti Evlampiy",
122
+ tradition: "orthodox",
123
+ moveable: null,
124
+ },
125
+ {
126
+ name: "Параскева",
127
+ variants: ["Параскев"],
128
+ latin: ["Paraskeva", "Paraskev"],
129
+ month: 10, day: 28,
130
+ holiday: "Свети Параскева",
131
+ holidayLatin: "Sveti Paraskeva",
132
+ tradition: "orthodox",
133
+ moveable: null,
134
+ },
135
+ {
136
+ name: "Дария",
137
+ variants: ["Дарина", "Дарин", "Даринка"],
138
+ latin: ["Dariya", "Darina", "Darin", "Darinka"],
139
+ month: 10, day: 12,
140
+ holiday: "Света Дария",
141
+ holidayLatin: "Sveta Dariya",
142
+ tradition: "orthodox",
143
+ moveable: null,
144
+ },
145
+ {
146
+ name: "Евтим",
147
+ variants: ["Евтимия"],
148
+ latin: ["Evtim", "Evtimiya"],
149
+ month: 10, day: 15,
150
+ holiday: "Свети Евтимий Нови",
151
+ holidayLatin: "Sveti Evtimiy Novi",
152
+ tradition: "orthodox",
153
+ moveable: null,
154
+ },
155
+ {
156
+ name: "Лука",
157
+ variants: [],
158
+ latin: ["Luka"],
159
+ month: 10, day: 31,
160
+ holiday: "Свети апостол Лука",
161
+ holidayLatin: "Sveti apostol Luka",
162
+ tradition: "orthodox",
163
+ moveable: null,
164
+ },
165
+ ];