mihrab-methods 0.0.0-stage → 1.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.
Files changed (217) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +319 -2
  3. package/certification.json +120 -0
  4. package/data/corrections/algeria.json +784 -0
  5. package/data/corrections/diyanet.json +18444 -0
  6. package/data/corrections/indonesia.json +210 -0
  7. package/data/corrections/morocco.json +993 -0
  8. package/data/corrections/sweden.json +516 -0
  9. package/dist/cjs/algeria.d.ts +4 -0
  10. package/dist/cjs/algeria.js +22 -0
  11. package/dist/cjs/authorities/algeria.d.ts +3 -0
  12. package/dist/cjs/authorities/algeria.js +57 -0
  13. package/dist/cjs/authorities/diyanet.d.ts +9 -0
  14. package/dist/cjs/authorities/diyanet.js +90 -0
  15. package/dist/cjs/authorities/indonesia.d.ts +4 -0
  16. package/dist/cjs/authorities/indonesia.js +82 -0
  17. package/dist/cjs/authorities/morocco.d.ts +5 -0
  18. package/dist/cjs/authorities/morocco.js +65 -0
  19. package/dist/cjs/authorities/slug.d.ts +2 -0
  20. package/dist/cjs/authorities/slug.js +17 -0
  21. package/dist/cjs/authorities/sweden.d.ts +3 -0
  22. package/dist/cjs/authorities/sweden.js +58 -0
  23. package/dist/cjs/core/api.d.ts +61 -0
  24. package/dist/cjs/core/api.js +176 -0
  25. package/dist/cjs/core/civilDate.d.ts +17 -0
  26. package/dist/cjs/core/civilDate.js +41 -0
  27. package/dist/cjs/core/clock.d.ts +15 -0
  28. package/dist/cjs/core/clock.js +46 -0
  29. package/dist/cjs/core/compute.d.ts +10 -0
  30. package/dist/cjs/core/compute.js +59 -0
  31. package/dist/cjs/core/correctionList.d.ts +25 -0
  32. package/dist/cjs/core/correctionList.js +62 -0
  33. package/dist/cjs/core/fetchLatest.d.ts +57 -0
  34. package/dist/cjs/core/fetchLatest.js +137 -0
  35. package/dist/cjs/core/index.d.ts +14 -0
  36. package/dist/cjs/core/index.js +45 -0
  37. package/dist/cjs/core/registry.d.ts +28 -0
  38. package/dist/cjs/core/registry.js +29 -0
  39. package/dist/cjs/core/types.d.ts +193 -0
  40. package/dist/cjs/core/types.js +22 -0
  41. package/dist/cjs/core.d.ts +2 -0
  42. package/dist/cjs/core.js +18 -0
  43. package/dist/cjs/data/generated/algeriaCertification.d.ts +3 -0
  44. package/dist/cjs/data/generated/algeriaCertification.js +4 -0
  45. package/dist/cjs/data/generated/algeriaCities.d.ts +8 -0
  46. package/dist/cjs/data/generated/algeriaCities.js +5 -0
  47. package/dist/cjs/data/generated/algeriaCorrections.d.ts +3 -0
  48. package/dist/cjs/data/generated/algeriaCorrections.js +4 -0
  49. package/dist/cjs/data/generated/algeriaMethodPoints.d.ts +2 -0
  50. package/dist/cjs/data/generated/algeriaMethodPoints.js +5 -0
  51. package/dist/cjs/data/generated/countryOutlines.d.ts +5 -0
  52. package/dist/cjs/data/generated/countryOutlines.js +5 -0
  53. package/dist/cjs/data/generated/diyanetCertification.d.ts +3 -0
  54. package/dist/cjs/data/generated/diyanetCertification.js +4 -0
  55. package/dist/cjs/data/generated/diyanetCorrections.d.ts +3 -0
  56. package/dist/cjs/data/generated/diyanetCorrections.js +4 -0
  57. package/dist/cjs/data/generated/diyanetCountries.d.ts +5 -0
  58. package/dist/cjs/data/generated/diyanetCountries.js +5 -0
  59. package/dist/cjs/data/generated/diyanetTurkeyPoints.d.ts +7 -0
  60. package/dist/cjs/data/generated/diyanetTurkeyPoints.js +5 -0
  61. package/dist/cjs/data/generated/diyanetWorldPoints.d.ts +10 -0
  62. package/dist/cjs/data/generated/diyanetWorldPoints.js +5 -0
  63. package/dist/cjs/data/generated/indonesiaCertification.d.ts +3 -0
  64. package/dist/cjs/data/generated/indonesiaCertification.js +4 -0
  65. package/dist/cjs/data/generated/indonesiaCorrections.d.ts +3 -0
  66. package/dist/cjs/data/generated/indonesiaCorrections.js +4 -0
  67. package/dist/cjs/data/generated/kemenagMethodPoints.d.ts +2 -0
  68. package/dist/cjs/data/generated/kemenagMethodPoints.js +5 -0
  69. package/dist/cjs/data/generated/kemenagPlaces.d.ts +8 -0
  70. package/dist/cjs/data/generated/kemenagPlaces.js +5 -0
  71. package/dist/cjs/data/generated/moroccoCertification.d.ts +3 -0
  72. package/dist/cjs/data/generated/moroccoCertification.js +4 -0
  73. package/dist/cjs/data/generated/moroccoCities.d.ts +8 -0
  74. package/dist/cjs/data/generated/moroccoCities.js +5 -0
  75. package/dist/cjs/data/generated/moroccoCorrections.d.ts +3 -0
  76. package/dist/cjs/data/generated/moroccoCorrections.js +4 -0
  77. package/dist/cjs/data/generated/moroccoMethodPoints.d.ts +2 -0
  78. package/dist/cjs/data/generated/moroccoMethodPoints.js +5 -0
  79. package/dist/cjs/data/generated/swedenCertification.d.ts +3 -0
  80. package/dist/cjs/data/generated/swedenCertification.js +4 -0
  81. package/dist/cjs/data/generated/swedenCorrections.d.ts +3 -0
  82. package/dist/cjs/data/generated/swedenCorrections.js +4 -0
  83. package/dist/cjs/data/generated/swedenPlaces.d.ts +5 -0
  84. package/dist/cjs/data/generated/swedenPlaces.js +5 -0
  85. package/dist/cjs/diyanet.d.ts +4 -0
  86. package/dist/cjs/diyanet.js +22 -0
  87. package/dist/cjs/index.d.ts +19 -0
  88. package/dist/cjs/index.js +37 -0
  89. package/dist/cjs/indonesia.d.ts +4 -0
  90. package/dist/cjs/indonesia.js +22 -0
  91. package/dist/cjs/locate.d.ts +21 -0
  92. package/dist/cjs/locate.js +204 -0
  93. package/dist/cjs/methods/algeria.d.ts +56 -0
  94. package/dist/cjs/methods/algeria.js +119 -0
  95. package/dist/cjs/methods/indonesia.d.ts +31 -0
  96. package/dist/cjs/methods/indonesia.js +94 -0
  97. package/dist/cjs/methods/morocco.d.ts +61 -0
  98. package/dist/cjs/methods/morocco.js +113 -0
  99. package/dist/cjs/methods/revisions.d.ts +15 -0
  100. package/dist/cjs/methods/revisions.js +18 -0
  101. package/dist/cjs/methods/scratch-congress.d.ts +87 -0
  102. package/dist/cjs/methods/scratch-congress.js +539 -0
  103. package/dist/cjs/methods/sweden.d.ts +88 -0
  104. package/dist/cjs/methods/sweden.js +568 -0
  105. package/dist/cjs/morocco.d.ts +4 -0
  106. package/dist/cjs/morocco.js +22 -0
  107. package/dist/cjs/sun/preciseSun.d.ts +19 -0
  108. package/dist/cjs/sun/preciseSun.js +185 -0
  109. package/dist/cjs/sweden.d.ts +4 -0
  110. package/dist/cjs/sweden.js +22 -0
  111. package/dist/esm/algeria.d.ts +4 -0
  112. package/dist/esm/algeria.js +4 -0
  113. package/dist/esm/authorities/algeria.d.ts +3 -0
  114. package/dist/esm/authorities/algeria.js +51 -0
  115. package/dist/esm/authorities/diyanet.d.ts +9 -0
  116. package/dist/esm/authorities/diyanet.js +83 -0
  117. package/dist/esm/authorities/indonesia.d.ts +4 -0
  118. package/dist/esm/authorities/indonesia.js +75 -0
  119. package/dist/esm/authorities/morocco.d.ts +5 -0
  120. package/dist/esm/authorities/morocco.js +59 -0
  121. package/dist/esm/authorities/slug.d.ts +2 -0
  122. package/dist/esm/authorities/slug.js +14 -0
  123. package/dist/esm/authorities/sweden.d.ts +3 -0
  124. package/dist/esm/authorities/sweden.js +52 -0
  125. package/dist/esm/core/api.d.ts +61 -0
  126. package/dist/esm/core/api.js +162 -0
  127. package/dist/esm/core/civilDate.d.ts +17 -0
  128. package/dist/esm/core/civilDate.js +36 -0
  129. package/dist/esm/core/clock.d.ts +15 -0
  130. package/dist/esm/core/clock.js +39 -0
  131. package/dist/esm/core/compute.d.ts +10 -0
  132. package/dist/esm/core/compute.js +56 -0
  133. package/dist/esm/core/correctionList.d.ts +25 -0
  134. package/dist/esm/core/correctionList.js +56 -0
  135. package/dist/esm/core/fetchLatest.d.ts +57 -0
  136. package/dist/esm/core/fetchLatest.js +98 -0
  137. package/dist/esm/core/index.d.ts +14 -0
  138. package/dist/esm/core/index.js +14 -0
  139. package/dist/esm/core/registry.d.ts +28 -0
  140. package/dist/esm/core/registry.js +23 -0
  141. package/dist/esm/core/types.d.ts +193 -0
  142. package/dist/esm/core/types.js +18 -0
  143. package/dist/esm/core.d.ts +2 -0
  144. package/dist/esm/core.js +2 -0
  145. package/dist/esm/data/generated/algeriaCertification.d.ts +3 -0
  146. package/dist/esm/data/generated/algeriaCertification.js +2 -0
  147. package/dist/esm/data/generated/algeriaCities.d.ts +8 -0
  148. package/dist/esm/data/generated/algeriaCities.js +3 -0
  149. package/dist/esm/data/generated/algeriaCorrections.d.ts +3 -0
  150. package/dist/esm/data/generated/algeriaCorrections.js +2 -0
  151. package/dist/esm/data/generated/algeriaMethodPoints.d.ts +2 -0
  152. package/dist/esm/data/generated/algeriaMethodPoints.js +3 -0
  153. package/dist/esm/data/generated/countryOutlines.d.ts +5 -0
  154. package/dist/esm/data/generated/countryOutlines.js +3 -0
  155. package/dist/esm/data/generated/diyanetCertification.d.ts +3 -0
  156. package/dist/esm/data/generated/diyanetCertification.js +2 -0
  157. package/dist/esm/data/generated/diyanetCorrections.d.ts +3 -0
  158. package/dist/esm/data/generated/diyanetCorrections.js +2 -0
  159. package/dist/esm/data/generated/diyanetCountries.d.ts +5 -0
  160. package/dist/esm/data/generated/diyanetCountries.js +3 -0
  161. package/dist/esm/data/generated/diyanetTurkeyPoints.d.ts +7 -0
  162. package/dist/esm/data/generated/diyanetTurkeyPoints.js +3 -0
  163. package/dist/esm/data/generated/diyanetWorldPoints.d.ts +10 -0
  164. package/dist/esm/data/generated/diyanetWorldPoints.js +3 -0
  165. package/dist/esm/data/generated/indonesiaCertification.d.ts +3 -0
  166. package/dist/esm/data/generated/indonesiaCertification.js +2 -0
  167. package/dist/esm/data/generated/indonesiaCorrections.d.ts +3 -0
  168. package/dist/esm/data/generated/indonesiaCorrections.js +2 -0
  169. package/dist/esm/data/generated/kemenagMethodPoints.d.ts +2 -0
  170. package/dist/esm/data/generated/kemenagMethodPoints.js +3 -0
  171. package/dist/esm/data/generated/kemenagPlaces.d.ts +8 -0
  172. package/dist/esm/data/generated/kemenagPlaces.js +3 -0
  173. package/dist/esm/data/generated/moroccoCertification.d.ts +3 -0
  174. package/dist/esm/data/generated/moroccoCertification.js +2 -0
  175. package/dist/esm/data/generated/moroccoCities.d.ts +8 -0
  176. package/dist/esm/data/generated/moroccoCities.js +3 -0
  177. package/dist/esm/data/generated/moroccoCorrections.d.ts +3 -0
  178. package/dist/esm/data/generated/moroccoCorrections.js +2 -0
  179. package/dist/esm/data/generated/moroccoMethodPoints.d.ts +2 -0
  180. package/dist/esm/data/generated/moroccoMethodPoints.js +3 -0
  181. package/dist/esm/data/generated/swedenCertification.d.ts +3 -0
  182. package/dist/esm/data/generated/swedenCertification.js +2 -0
  183. package/dist/esm/data/generated/swedenCorrections.d.ts +3 -0
  184. package/dist/esm/data/generated/swedenCorrections.js +2 -0
  185. package/dist/esm/data/generated/swedenPlaces.d.ts +5 -0
  186. package/dist/esm/data/generated/swedenPlaces.js +3 -0
  187. package/dist/esm/diyanet.d.ts +4 -0
  188. package/dist/esm/diyanet.js +4 -0
  189. package/dist/esm/index.d.ts +19 -0
  190. package/dist/esm/index.js +19 -0
  191. package/dist/esm/indonesia.d.ts +4 -0
  192. package/dist/esm/indonesia.js +4 -0
  193. package/dist/esm/locate.d.ts +21 -0
  194. package/dist/esm/locate.js +196 -0
  195. package/dist/esm/methods/algeria.d.ts +56 -0
  196. package/dist/esm/methods/algeria.js +114 -0
  197. package/dist/esm/methods/indonesia.d.ts +31 -0
  198. package/dist/esm/methods/indonesia.js +90 -0
  199. package/dist/esm/methods/morocco.d.ts +61 -0
  200. package/dist/esm/methods/morocco.js +107 -0
  201. package/dist/esm/methods/revisions.d.ts +15 -0
  202. package/dist/esm/methods/revisions.js +15 -0
  203. package/dist/esm/methods/scratch-congress.d.ts +87 -0
  204. package/dist/esm/methods/scratch-congress.js +534 -0
  205. package/dist/esm/methods/sweden.d.ts +88 -0
  206. package/dist/esm/methods/sweden.js +563 -0
  207. package/dist/esm/morocco.d.ts +4 -0
  208. package/dist/esm/morocco.js +4 -0
  209. package/dist/esm/package.json +1 -0
  210. package/dist/esm/sun/preciseSun.d.ts +19 -0
  211. package/dist/esm/sun/preciseSun.js +181 -0
  212. package/dist/esm/sweden.d.ts +4 -0
  213. package/dist/esm/sweden.js +4 -0
  214. package/docs/methods.md +190 -0
  215. package/package.json +178 -4
  216. package/schemas/certification.schema.json +59 -0
  217. package/schemas/corrections.schema.json +29 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The library without any authority's data: the calls, the types, the sun.
3
+ * Load an authority (`mihrab-methods/<authority>`, or `mihrab-methods` for
4
+ * all) before calling anything that needs its places or its list.
5
+ */
6
+ export { candidateTimes, certificationOf, certifiedSpan, distanceKm, isCertified, loadedAuthorityIds, methodInfo, nearestPlace, placeById, placesOf, timesFor, timesForRange, } from './api.js';
7
+ export { candidateInstants } from './compute.js';
8
+ export { parseCivilDate, isoOf } from './civilDate.js';
9
+ export { placeClockAt, clockOffsetAt, tableClockAt, printedAt } from './clock.js';
10
+ export { fetchLatestCorrections, applyCorrections } from './fetchLatest.js';
11
+ export { isCorrectionsFile, pointKey } from './correctionList.js';
12
+ export { METHOD_REVISION } from '../methods/revisions.js';
13
+ export { preciseApparentSun } from '../sun/preciseSun.js';
14
+ export { AUTHORITIES, PRAYER_KEYS, UncertifiedMethodError, } from './types.js';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * What each authority's entry point brings: its places, its correction
3
+ * list, its certification and its description. `mihrab-methods/indonesia`
4
+ * registers Indonesia and nothing else, so an app ships only the data it
5
+ * uses; `mihrab-methods` registers all five.
6
+ */
7
+ import type { Authority, Certification, CorrectionsFile, MethodInfo, Place } from './types.js';
8
+ import { CorrectionList } from './correctionList.js';
9
+ export type MethodDescription = Pick<MethodInfo, 'name' | 'method' | 'countries' | 'parameters' | 'sources' | 'spec'>;
10
+ export type AuthorityData = {
11
+ authority: Authority;
12
+ revision: number;
13
+ places: Place[];
14
+ corrections: CorrectionList;
15
+ certification: Certification | null;
16
+ description: MethodDescription;
17
+ };
18
+ export declare function registerAuthority(entry: {
19
+ authority: Authority;
20
+ revision: number;
21
+ places: Place[];
22
+ corrections: CorrectionsFile;
23
+ certification: Certification | null;
24
+ description: MethodDescription;
25
+ }): AuthorityData;
26
+ export declare function authorityData(authority: Authority): AuthorityData;
27
+ export declare function loadedAuthorities(): Authority[];
28
+ export declare function isLoaded(authority: Authority): boolean;
@@ -0,0 +1,23 @@
1
+ import { CorrectionList } from './correctionList.js';
2
+ const registry = new Map();
3
+ export function registerAuthority(entry) {
4
+ const have = registry.get(entry.authority);
5
+ if (have)
6
+ return have;
7
+ const data = { ...entry, corrections: new CorrectionList(entry.corrections) };
8
+ registry.set(entry.authority, data);
9
+ return data;
10
+ }
11
+ export function authorityData(authority) {
12
+ const data = registry.get(authority);
13
+ if (!data) {
14
+ throw new Error(`The ${authority} method is not loaded: import 'mihrab-methods/${authority}' (or 'mihrab-methods' for all of them) first.`);
15
+ }
16
+ return data;
17
+ }
18
+ export function loadedAuthorities() {
19
+ return [...registry.keys()];
20
+ }
21
+ export function isLoaded(authority) {
22
+ return registry.has(authority);
23
+ }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * The shapes the library speaks in. Nothing here computes anything.
3
+ */
4
+ export type Authority = 'sweden' | 'diyanet' | 'morocco' | 'algeria' | 'indonesia';
5
+ export declare const AUTHORITIES: readonly Authority[];
6
+ export type PrayerKey = 'fajr' | 'sunrise' | 'dhuhr' | 'asr' | 'maghrib' | 'isha';
7
+ export declare const PRAYER_KEYS: readonly PrayerKey[];
8
+ /** A place an authority publishes a table for, at the point its method is computed at. */
9
+ export type Place = {
10
+ authority: Authority;
11
+ /**
12
+ * A stable identifier: `<authority>:<key>`, where the key is the
13
+ * authority's own number for the place (Diyanet's, the ministries') or,
14
+ * for Sweden, Islamiska Förbundet's slug of its name. It does not change
15
+ * between versions.
16
+ */
17
+ id: string;
18
+ /** The authority's own key for the place (the part of `id` after the colon). */
19
+ key: string;
20
+ name: string;
21
+ /** ISO 3166-1 alpha-2 of the country the table is for. */
22
+ country: string;
23
+ lat: number;
24
+ lon: number;
25
+ /** The IANA zone the authority prints the place's table in. */
26
+ tz: string;
27
+ /** Morocco: the horizon's dip, degrees (fitted, or 0.02°·√height) — eastward, at sunrise. */
28
+ dipDeg?: number;
29
+ /** Morocco: the horizon's dip westward, at Maghrib (fitted per city). */
30
+ dipMaghribDeg?: number;
31
+ /** Indonesia: Kemenag's highland class (sunrise and Maghrib at −2°). */
32
+ highland?: boolean;
33
+ /** Indonesia: the highland degree on Fajr and Isha too (six regencies of Papua). */
34
+ twilightDip?: boolean;
35
+ /** Indonesia: where the ministry computes the regency's Asr, Maghrib and Isha, when not at its point. */
36
+ afternoon?: readonly [number, number];
37
+ /** Diyanet: Isha's depression, 16° or 17° by country. */
38
+ ishaDeg?: number;
39
+ /**
40
+ * Diyanet in Türkiye and Northern Cyprus: each prayer is computed at a point
41
+ * of its own, and the points move by a few thousandths of a degree from one
42
+ * year's tables to the next — year → [fajr, sunrise, dhuhr, asr, maghrib, isha]
43
+ * as [lat, lon]. `lat`/`lon` are the district's own point (its sunrise).
44
+ */
45
+ prayerPoints?: Record<string, [number, number][]>;
46
+ /**
47
+ * A table printed on a clock no zone keeps (Diyanet's for Alberta, with
48
+ * summer time into December; Morocco's on GMT+1 until September 2026):
49
+ * the clock read off the table itself, [from date, minutes east of UTC], in
50
+ * place of `tz`. The instants are the method's; only the labels differ.
51
+ */
52
+ clock?: [string, number][];
53
+ };
54
+ /** The six instants of a day, each on the minute the authority prints. */
55
+ export type Instants = {
56
+ fajr: Date;
57
+ sunrise: Date;
58
+ dhuhr: Date;
59
+ asr: Date;
60
+ maghrib: Date;
61
+ isha: Date;
62
+ };
63
+ /**
64
+ * A method's correction list: the few times its authority's program puts on
65
+ * the other side of a minute's rounding point. "lat,lon" (three decimals) →
66
+ * "YYYY-MM-DD prayer ±1". See schemas/corrections.schema.json.
67
+ */
68
+ export type CorrectionsFile = {
69
+ from: string;
70
+ to: string;
71
+ points: Record<string, string[]>;
72
+ };
73
+ export type CheckRecord = {
74
+ /** The tables checked: Islamiska Förbundet's or Diyanet's own for Sweden, the authority's for the rest. */
75
+ tables: string;
76
+ places: number;
77
+ times: number;
78
+ /** Times not on the printed minute. Certified only at 0. */
79
+ off: number;
80
+ from: string;
81
+ to: string;
82
+ /** What the check set aside as the source's fault, not the method's: listed so it can be judged. */
83
+ setAside?: {
84
+ misplaced: string[];
85
+ sourceFaults: number;
86
+ copiedRows: number;
87
+ };
88
+ };
89
+ /** One authority's entry in certification.json. See schemas/certification.schema.json. */
90
+ export type Certification = {
91
+ certified: boolean;
92
+ checkedAt: string;
93
+ checks: CheckRecord[];
94
+ /**
95
+ * The correction list this certification is for: the dates it covers, how
96
+ * many times it moves, and the SHA-256 of the file as published. An app
97
+ * holding a list with another `to` or count holds another list.
98
+ */
99
+ corrections?: {
100
+ from: string;
101
+ to: string;
102
+ entries: number;
103
+ sha256?: string;
104
+ };
105
+ /** The method's revision (`src/methods/revisions.ts`) the list is for. */
106
+ revision?: number;
107
+ };
108
+ /** A civil date: 'YYYY-MM-DD', or { year, month, day } with January = 1. */
109
+ export type CivilDate = string | {
110
+ year: number;
111
+ month: number;
112
+ day: number;
113
+ };
114
+ /** One prayer's time: the exact moment, and the wall-clock minute the authority prints. */
115
+ export type PrayerTime = {
116
+ instant: Date;
117
+ /** 'HH:MM' on the table's clock (`DayTimes.clock`). */
118
+ printed: string;
119
+ };
120
+ /** The clock a day's times are printed in. */
121
+ export type TableClock = {
122
+ /** The IANA zone, or null where the table keeps a clock no zone does. */
123
+ zone: string | null;
124
+ /** Minutes east of UTC on this date. */
125
+ offsetMinutes: number;
126
+ /** The zone's name, or 'UTC+01:00' where there is none. */
127
+ label: string;
128
+ };
129
+ export type DayStatus =
130
+ /** The date lies within the span the method was certified over: the authority's printed minute. */
131
+ 'certified'
132
+ /** Outside that span: the method alone, on the printed minute all but rarely, never a minute further. */
133
+ | 'method-only'
134
+ /** The method does not yet reproduce every time of its authority's tables (`candidateTimes` only). */
135
+ | 'uncertified';
136
+ export type DayTimes = {
137
+ authority: Authority;
138
+ placeId: string;
139
+ /** 'YYYY-MM-DD' */
140
+ date: string;
141
+ status: DayStatus;
142
+ /** The span the method is certified over, or null for an uncertified method. */
143
+ certifiedFrom: string | null;
144
+ certifiedUntil: string | null;
145
+ /** The method's revision that computed this. */
146
+ revision: number;
147
+ clock: TableClock;
148
+ /** Null on a day the method gives no times for the place. */
149
+ times: Record<PrayerKey, PrayerTime> | null;
150
+ };
151
+ export type TimesOptions = {
152
+ /** 2 for the Hanafi Asr; the tables print the standard one (1). */
153
+ asrShadow?: 1 | 2;
154
+ /** Throw `UncertifiedMethodError` for a date outside the certified span, instead of returning `status: 'method-only'`. */
155
+ strict?: boolean;
156
+ };
157
+ /** What `methodInfo` says about a method. */
158
+ export type MethodInfo = {
159
+ authority: Authority;
160
+ /** The authority, in words. */
161
+ name: string;
162
+ /** The method, in a sentence. */
163
+ method: string;
164
+ /** ISO 3166-1 alpha-2 of the countries the authority's tables cover (Diyanet: many). */
165
+ countries: string[];
166
+ revision: number;
167
+ certified: boolean;
168
+ /** The certification record, as in certification.json. */
169
+ certification: Certification | null;
170
+ /** The correction list this build carries. */
171
+ corrections: {
172
+ from: string;
173
+ to: string;
174
+ entries: number;
175
+ };
176
+ /** How many places this build knows for the authority. */
177
+ places: number;
178
+ /** The method's parameters, in words and numbers. */
179
+ parameters: Record<string, string | number | boolean>;
180
+ /** Where the authority publishes the tables the method was fitted to. */
181
+ sources: {
182
+ title: string;
183
+ url: string;
184
+ }[];
185
+ /** The method's own documentation. */
186
+ spec: string;
187
+ };
188
+ /** The method has not reproduced its authority's tables to the minute (or not for this date). */
189
+ export declare class UncertifiedMethodError extends Error {
190
+ readonly authority: string;
191
+ readonly date?: string | undefined;
192
+ constructor(authority: string, date?: string | undefined);
193
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The shapes the library speaks in. Nothing here computes anything.
3
+ */
4
+ export const AUTHORITIES = ['sweden', 'diyanet', 'morocco', 'algeria', 'indonesia'];
5
+ export const PRAYER_KEYS = ['fajr', 'sunrise', 'dhuhr', 'asr', 'maghrib', 'isha'];
6
+ /** The method has not reproduced its authority's tables to the minute (or not for this date). */
7
+ export class UncertifiedMethodError extends Error {
8
+ authority;
9
+ date;
10
+ constructor(authority, date) {
11
+ super(date
12
+ ? `The ${authority} method is certified only for the dates it was checked over, and ${date} is outside them (see certification.json).`
13
+ : `The ${authority} method is not certified: it does not yet reproduce every time of the authority's tables on the printed minute (see certification.json).`);
14
+ this.authority = authority;
15
+ this.date = date;
16
+ this.name = 'UncertifiedMethodError';
17
+ }
18
+ }
@@ -0,0 +1,2 @@
1
+ /** mihrab-methods/core — the calls and types without any authority's data; load authorities separately. */
2
+ export * from './core/index.js';
@@ -0,0 +1,2 @@
1
+ /** mihrab-methods/core — the calls and types without any authority's data; load authorities separately. */
2
+ export * from './core/index.js';
@@ -0,0 +1,3 @@
1
+ import type { Certification } from '../../core/types.js';
2
+ declare const data: Certification | null;
3
+ export default data;
@@ -0,0 +1,2 @@
1
+ const data = { "certified": true, "checkedAt": "2026-10-16", "checks": [{ "tables": "Algeria — Ministry of Religious Affairs", "places": 68, "times": 101184, "off": 0, "from": "2026-10-01", "to": "2027-06-05" }], "corrections": { "from": "2026-10-01", "to": "2027-06-05", "entries": 642, "sha256": "f8d227cdd88aabe5bcd1775ec0324abfdae07a8a3986fdd19816337c2d4ab3ca" }, "revision": 1 };
2
+ export default data;
@@ -0,0 +1,8 @@
1
+ declare const data: {
2
+ id: number;
3
+ name: string;
4
+ nameEn?: string;
5
+ lat: number;
6
+ lon: number;
7
+ }[];
8
+ export default data;
@@ -0,0 +1,3 @@
1
+ // Generated by scripts/embed.mjs — do not edit; edit the JSON under data/ instead.
2
+ const data = [{ "id": 1, "name": "الجلفة", "nameEn": "Djelfa", "lat": 34.6728, "lon": 3.263 }, { "id": 2, "name": "تبسة", "nameEn": "Tebessa", "lat": 35.4042, "lon": 8.1242 }, { "id": 3, "name": "بئر العاتر", "nameEn": "Bir El Ater", "lat": 34.7458, "lon": 8.06 }, { "id": 4, "name": "خنشلة", "nameEn": "Khenchela", "lat": 35.4358, "lon": 7.1433 }, { "id": 5, "name": "الوادي", "nameEn": "El Oued", "lat": 33.3683, "lon": 6.8674 }, { "id": 6, "name": "باتنة", "nameEn": "Batna", "lat": 35.5559, "lon": 6.1741 }, { "id": 7, "name": "تقرت", "nameEn": "Touggourt", "lat": 33.1054, "lon": 6.063 }, { "id": 8, "name": "بسكرة", "nameEn": "Biskra", "lat": 34.85, "lon": 5.7333 }, { "id": 10, "name": "بوسعادة", "nameEn": "Bou Saada", "lat": 35.2058, "lon": 4.1757 }, { "id": 11, "name": "عين الملح", "nameEn": "Ain El Melh", "lat": 34.84, "lon": 4.16 }, { "id": 12, "name": "حاسي الرمل", "nameEn": "Hassi R'mel", "lat": 32.9333, "lon": 3.2667 }, { "id": 13, "name": "الأغواط", "nameEn": "Laghouat", "lat": 33.8, "lon": 2.865 }, { "id": 14, "name": "عين وسارة", "nameEn": "Ain Oussara", "lat": 35.45, "lon": 2.9 }, { "id": 15, "name": "تيسمسيلت", "nameEn": "Tissemsilt", "lat": 35.6072, "lon": 1.8097 }, { "id": 16, "name": "تيارت", "nameEn": "Tiaret", "lat": 35.371, "lon": 1.317 }, { "id": 17, "name": "البيض", "nameEn": "El Bayadh", "lat": 33.6831, "lon": 1.0192 }, { "id": 18, "name": "سعيدة", "nameEn": "Saida", "lat": 34.8303, "lon": 0.1517 }, { "id": 19, "name": "معسكر", "nameEn": "Mascara", "lat": 35.3967, "lon": 0.1403 }, { "id": 20, "name": "النعامة", "nameEn": "Naama", "lat": 33.2667, "lon": -0.3167 }, { "id": 21, "name": "سيدي بلعباس", "nameEn": "Sidi Bel Abbes", "lat": 35.1899, "lon": -0.6308 }, { "id": 22, "name": "ابن باديس", "nameEn": "Ben Badis", "lat": 34.99, "lon": -0.9 }, { "id": 23, "name": "تلمسان", "nameEn": "Tlemcen", "lat": 34.878, "lon": -1.315 }, { "id": 24, "name": "عين تموشنت", "nameEn": "Ain Temouchent", "lat": 35.2972, "lon": -1.1403 }, { "id": 25, "name": "سبدو", "nameEn": "Sebdou", "lat": 34.6381, "lon": -1.3253 }, { "id": 26, "name": "مغنية", "nameEn": "Maghnia", "lat": 34.85, "lon": -1.7333 }, { "id": 27, "name": "الجزائر", "nameEn": "Algiers", "lat": 36.7538, "lon": 3.0588 }, { "id": 28, "name": "وهران", "nameEn": "Oran", "lat": 35.6911, "lon": -0.6417 }, { "id": 29, "name": "مستغانم", "nameEn": "Mostaganem", "lat": 35.9315, "lon": 0.0892 }, { "id": 30, "name": "غليزان", "nameEn": "Relizane", "lat": 35.7373, "lon": 0.5558 }, { "id": 31, "name": "الشلف", "nameEn": "Chlef", "lat": 36.1652, "lon": 1.3345 }, { "id": 32, "name": "عين الدفلى", "nameEn": "Ain Defla", "lat": 36.2641, "lon": 1.9679 }, { "id": 33, "name": "تيبازة", "nameEn": "Tipaza", "lat": 36.5897, "lon": 2.4475 }, { "id": 34, "name": "المدية", "nameEn": "Medea", "lat": 36.2675, "lon": 2.7503 }, { "id": 35, "name": "البليدة", "nameEn": "Blida", "lat": 36.47, "lon": 2.8277 }, { "id": 36, "name": "بومرداس", "nameEn": "Boumerdes", "lat": 36.7664, "lon": 3.4772 }, { "id": 37, "name": "البويرة", "nameEn": "Bouira", "lat": 36.3749, "lon": 3.902 }, { "id": 38, "name": "دلس", "nameEn": "Dellys", "lat": 36.9186, "lon": 3.9156 }, { "id": 39, "name": "تيزي وزو", "nameEn": "Tizi Ouzou", "lat": 36.7118, "lon": 4.0459 }, { "id": 40, "name": "المسيلة", "nameEn": "M'Sila", "lat": 35.7058, "lon": 4.5419 }, { "id": 41, "name": "برج بوعريريج", "nameEn": "Bordj Bou Arreridj", "lat": 36.0731, "lon": 4.7611 }, { "id": 42, "name": "بجاية", "nameEn": "Bejaia", "lat": 36.7509, "lon": 5.0567 }, { "id": 43, "name": "سطيف", "nameEn": "Setif", "lat": 36.1898, "lon": 5.4108 }, { "id": 44, "name": "جيجل", "nameEn": "Jijel", "lat": 36.82, "lon": 5.7667 }, { "id": 45, "name": "ميلة", "nameEn": "Mila", "lat": 36.4503, "lon": 6.2644 }, { "id": 46, "name": "قسنطينة", "nameEn": "Constantine", "lat": 36.365, "lon": 6.6147 }, { "id": 47, "name": "سكيكدة", "nameEn": "Skikda", "lat": 36.8762, "lon": 6.9067 }, { "id": 48, "name": "أم البواقي", "nameEn": "Oum El Bouaghi", "lat": 35.8754, "lon": 7.1135 }, { "id": 49, "name": "قالمة", "nameEn": "Guelma", "lat": 36.4621, "lon": 7.4261 }, { "id": 50, "name": "عنابة", "nameEn": "Annaba", "lat": 36.9, "lon": 7.7667 }, { "id": 51, "name": "سوق أهراس", "nameEn": "Souk Ahras", "lat": 36.2864, "lon": 7.9511 }, { "id": 52, "name": "الطارف", "nameEn": "El Tarf", "lat": 36.7672, "lon": 8.3137 }, { "id": 53, "name": "أدرار", "nameEn": "Adrar", "lat": 27.8743, "lon": -0.2939 }, { "id": 54, "name": "تندوف", "nameEn": "Tindouf", "lat": 27.6711, "lon": -8.1474 }, { "id": 55, "name": "بشار", "nameEn": "Bechar", "lat": 31.6167, "lon": -2.2167 }, { "id": 56, "name": "تميمون", "nameEn": "Timimoun", "lat": 29.2639, "lon": 0.2308 }, { "id": 57, "name": "رقان", "nameEn": "Reggane", "lat": 26.7167, "lon": 0.1667 }, { "id": 58, "name": "برج باجي مختار", "nameEn": "Bordj Badji Mokhtar", "lat": 21.3269, "lon": 0.9531 }, { "id": 59, "name": "بني عباس", "nameEn": "Beni Abbes", "lat": 30.1333, "lon": -2.1667 }, { "id": 60, "name": "عين صالح", "nameEn": "In Salah", "lat": 27.1951, "lon": 2.4783 }, { "id": 61, "name": "المنيعة", "nameEn": "El Menia", "lat": 30.5833, "lon": 2.8833 }, { "id": 62, "name": "غرداية", "nameEn": "Ghardaia", "lat": 32.49, "lon": 3.67 }, { "id": 63, "name": "ورقلة", "nameEn": "Ouargla", "lat": 31.95, "lon": 5.3333 }, { "id": 64, "name": "تمنراست", "nameEn": "Tamanrasset", "lat": 22.785, "lon": 5.5228 }, { "id": 65, "name": "عين قزام", "nameEn": "In Guezzam", "lat": 19.5667, "lon": 5.7667 }, { "id": 66, "name": "إليزي", "nameEn": "Illizi", "lat": 26.5058, "lon": 8.4825 }, { "id": 67, "name": "جانت", "nameEn": "Djanet", "lat": 24.5542, "lon": 9.4842 }, { "id": 68, "name": "عين أمناس", "nameEn": "In Amenas", "lat": 28.05, "lon": 9.5667 }, { "id": 69, "name": "بني ونيف", "nameEn": "Beni Ounif", "lat": 32.05, "lon": -1.24 }];
3
+ export default data;
@@ -0,0 +1,3 @@
1
+ import type { CorrectionsFile } from '../../core/types.js';
2
+ declare const data: CorrectionsFile;
3
+ export default data;
@@ -0,0 +1,2 @@
1
+ const data = { "from": "2026-10-01", "to": "2027-06-05", "points": { "19.562,5.773": ["2026-11-19 maghrib -1", "2026-11-25 sunrise -1", "2026-12-17 dhuhr -1", "2027-01-07 fajr +1"], "21.317,0.951": ["2026-12-18 asr -1", "2026-12-30 fajr +1", "2027-02-13 fajr +1", "2027-02-15 fajr +1", "2027-03-01 fajr -1", "2027-04-06 fajr -1", "2027-04-24 asr +1"], "22.777,5.529": ["2026-10-06 dhuhr -1", "2026-10-19 fajr -1", "2027-01-18 maghrib -1", "2027-02-14 fajr +1", "2027-02-25 isha +1", "2027-04-24 maghrib +1", "2027-04-25 fajr -1"], "24.555,9.490": ["2027-01-27 sunrise -1", "2027-03-03 dhuhr +1", "2027-05-13 fajr -1", "2027-05-18 asr -1", "2027-05-28 sunrise -1"], "26.507,8.477": ["2026-10-18 isha -1", "2026-11-17 dhuhr -1", "2027-01-15 asr -1", "2027-02-22 maghrib -1", "2027-02-24 isha -1", "2027-03-14 fajr -1", "2027-03-22 dhuhr -1", "2027-04-19 sunrise -1", "2027-04-28 sunrise -1"], "26.718,0.170": ["2026-10-01 dhuhr +1", "2027-01-01 sunrise -1", "2027-01-08 isha +1", "2027-01-15 maghrib +1", "2027-04-01 isha -1"], "27.194,2.479": ["2026-10-06 maghrib -1", "2026-10-25 isha -1", "2026-11-17 dhuhr -1", "2026-11-18 asr -1", "2026-12-06 maghrib +1", "2027-03-13 sunrise -1", "2027-03-23 sunrise -1", "2027-05-24 sunrise +1", "2027-05-31 sunrise +1"], "27.670,-8.146": ["2026-10-05 dhuhr +1", "2026-11-08 maghrib +1", "2026-12-01 isha +1", "2026-12-24 asr +1", "2027-01-28 maghrib +1", "2027-03-06 maghrib +1", "2027-03-18 isha -1", "2027-05-17 dhuhr +1"], "27.866,-0.276": ["2026-12-03 asr -1", "2026-12-29 asr -1", "2027-01-28 dhuhr +1", "2027-02-04 dhuhr +1", "2027-03-02 maghrib +1", "2027-03-31 fajr -1", "2027-04-08 dhuhr -1", "2027-04-17 isha +1", "2027-05-13 asr -1"], "28.047,9.563": ["2026-10-09 maghrib +1", "2027-01-04 sunrise +1", "2027-02-06 asr -1", "2027-02-13 maghrib +1", "2027-02-16 fajr +1", "2027-02-17 sunrise +1", "2027-02-23 maghrib +1", "2027-03-12 sunrise -1", "2027-04-01 isha +1", "2027-04-06 fajr -1", "2027-04-26 fajr -1", "2027-05-18 fajr -1", "2027-05-20 isha +1"], "29.250,0.239": ["2026-10-25 fajr -1", "2026-11-25 dhuhr -1", "2026-12-16 isha -1", "2026-12-23 sunrise -1", "2027-01-24 isha -1", "2027-02-08 asr +1", "2027-03-14 isha +1", "2027-04-20 dhuhr -1", "2027-05-01 isha -1", "2027-05-12 maghrib -1", "2027-05-26 sunrise -1"], "30.131,-2.159": ["2026-10-17 asr +1", "2026-10-21 isha +1", "2026-10-22 fajr +1", "2026-11-14 sunrise -1", "2026-12-01 asr +1", "2026-12-06 fajr +1", "2026-12-09 asr -1", "2026-12-09 fajr +1", "2027-01-27 maghrib +1", "2027-01-31 isha +1", "2027-03-01 dhuhr +1", "2027-04-10 dhuhr +1", "2027-05-17 asr +1", "2027-05-28 sunrise +1"], "30.584,2.885": ["2026-10-11 sunrise -1", "2026-11-15 dhuhr -1", "2026-11-18 sunrise -1", "2026-11-27 asr -1", "2026-11-28 isha -1", "2026-11-30 isha -1", "2027-01-03 asr -1", "2027-02-07 asr -1", "2027-02-11 maghrib +1", "2027-02-19 fajr -1", "2027-02-21 maghrib +1", "2027-02-28 dhuhr -1", "2027-03-19 asr -1", "2027-05-30 dhuhr -1"], "31.607,-2.215": ["2026-10-05 maghrib -1", "2026-10-26 sunrise -1", "2026-10-30 fajr -1", "2026-11-06 fajr -1", "2026-12-15 dhuhr +1", "2027-02-20 sunrise -1", "2027-03-17 asr +1", "2027-05-08 fajr -1", "2027-06-03 dhuhr -1", "2027-06-04 sunrise -1"], "31.958,5.347": ["2026-12-02 dhuhr -1", "2026-12-07 isha -1", "2026-12-21 sunrise -1", "2027-01-10 sunrise +1", "2027-01-20 fajr +1", "2027-01-22 asr -1", "2027-04-02 asr -1", "2027-05-11 dhuhr -1"], "32.047,-1.245": ["2026-11-08 asr -1", "2026-12-01 dhuhr -1", "2026-12-06 dhuhr -1", "2027-01-06 isha -1", "2027-01-22 fajr +1", "2027-04-09 maghrib -1", "2027-04-22 maghrib -1", "2027-05-02 dhuhr +1", "2027-06-04 asr +1"], "32.483,3.684": ["2026-10-01 isha +1", "2026-11-11 asr -1", "2027-01-13 isha -1", "2027-02-20 dhuhr +1", "2027-02-23 asr -1", "2027-03-11 sunrise -1", "2027-03-29 isha +1", "2027-04-05 dhuhr -1", "2027-04-07 fajr -1", "2027-04-30 isha +1", "2027-05-01 isha +1", "2027-05-13 maghrib -1"], "32.933,3.279": ["2026-10-06 dhuhr -1", "2026-12-26 maghrib +1", "2027-01-30 maghrib +1", "2027-02-11 fajr +1"], "33.099,6.072": ["2026-10-23 dhuhr -1", "2026-11-10 isha -1", "2027-01-16 fajr +1", "2027-02-03 sunrise -1", "2027-03-06 dhuhr +1"], "33.266,-0.311": ["2026-10-08 fajr +1", "2026-10-20 dhuhr -1", "2026-12-17 maghrib +1", "2027-03-11 fajr +1", "2027-04-21 dhuhr +1", "2027-05-15 maghrib -1"], "33.363,6.874": ["2026-11-05 fajr -1", "2026-11-12 maghrib +1", "2026-12-17 asr -1", "2027-02-12 fajr +1", "2027-02-22 dhuhr -1", "2027-03-19 sunrise +1", "2027-03-31 maghrib +1", "2027-04-03 sunrise -1", "2027-04-17 fajr -1", "2027-05-06 isha +1", "2027-05-26 isha +1"], "33.682,1.027": ["2026-10-06 fajr -1", "2026-11-12 asr +1", "2026-11-22 dhuhr +1", "2026-11-23 fajr +1", "2026-12-15 fajr +1", "2027-01-07 maghrib +1", "2027-01-15 asr +1", "2027-02-22 sunrise -1", "2027-02-24 maghrib +1", "2027-03-22 asr +1", "2027-04-14 maghrib +1", "2027-04-25 sunrise +1", "2027-05-01 fajr -1"], "33.806,2.882": ["2026-10-14 maghrib -1", "2026-11-14 isha -1", "2026-11-22 isha -1", "2026-11-30 asr -1", "2026-12-05 isha -1", "2026-12-30 sunrise -1", "2027-01-02 asr -1", "2027-01-03 maghrib +1", "2027-01-29 isha -1", "2027-01-31 maghrib +1", "2027-03-13 sunrise -1", "2027-03-16 isha -1", "2027-04-15 asr -1", "2027-04-21 maghrib -1", "2027-04-26 fajr -1", "2027-04-28 dhuhr -1", "2027-04-29 isha -1", "2027-05-01 sunrise -1", "2027-05-04 maghrib -1", "2027-05-20 maghrib -1", "2027-05-30 dhuhr -1"], "34.626,-1.327": ["2026-10-06 asr -1", "2026-10-19 fajr -1", "2026-12-06 asr -1", "2027-01-15 isha -1", "2027-01-22 fajr +1", "2027-01-27 dhuhr -1", "2027-02-14 asr -1", "2027-04-27 fajr -1", "2027-05-02 asr +1", "2027-05-23 fajr -1", "2027-05-29 isha +1", "2027-06-03 asr +1", "2027-06-04 isha +1"], "34.663,3.255": ["2026-10-04 fajr -1", "2026-10-13 fajr +1", "2026-10-25 dhuhr -1", "2026-12-28 asr -1", "2026-12-31 asr -1", "2027-01-27 isha -1", "2027-01-29 asr -1", "2027-02-06 maghrib +1", "2027-02-19 asr -1", "2027-03-28 fajr -1", "2027-04-04 dhuhr -1", "2027-04-26 fajr -1"], "34.744,8.063": ["2026-10-11 sunrise -1", "2026-11-02 maghrib +1", "2026-11-08 isha -1", "2026-12-03 asr -1", "2026-12-25 sunrise -1", "2027-03-25 isha -1", "2027-04-02 fajr -1", "2027-04-10 sunrise -1", "2027-04-25 asr -1", "2027-05-09 fajr -1"], "34.838,0.154": ["2026-10-08 asr -1", "2026-11-07 dhuhr -1", "2026-12-19 sunrise -1", "2027-01-01 sunrise -1", "2027-02-21 dhuhr -1", "2027-02-22 isha -1", "2027-04-09 dhuhr -1", "2027-05-17 fajr -1", "2027-05-21 fajr -1", "2027-05-21 maghrib -1"], "34.846,4.172": ["2026-10-19 fajr +1", "2027-01-20 sunrise -1", "2027-02-02 maghrib +1", "2027-02-03 maghrib +1", "2027-02-11 maghrib +1", "2027-05-16 fajr -1"], "34.850,5.738": ["2026-10-13 fajr -1", "2026-11-21 asr -1", "2026-11-25 dhuhr -1", "2026-12-20 maghrib +1", "2027-01-14 dhuhr -1", "2027-01-18 isha -1", "2027-01-26 isha -1", "2027-04-29 sunrise -1", "2027-05-21 sunrise -1", "2027-06-03 fajr -1"], "34.863,-1.725": ["2026-10-16 maghrib -1", "2026-11-03 maghrib +1", "2026-11-12 dhuhr +1", "2026-12-08 fajr -1", "2026-12-17 dhuhr -1", "2026-12-18 sunrise -1", "2027-01-02 maghrib +1", "2027-01-19 sunrise -1", "2027-03-31 fajr -1"], "34.877,-1.309": ["2026-10-15 dhuhr +1", "2026-10-25 asr -1", "2026-11-15 fajr +1", "2027-01-10 fajr +1", "2027-01-11 fajr +1", "2027-02-16 asr +1", "2027-03-21 asr +1", "2027-04-15 isha +1", "2027-04-21 dhuhr +1", "2027-05-14 fajr -1", "2027-05-17 isha +1", "2027-05-23 dhuhr +1"], "34.946,-0.910": ["2026-10-22 isha -1", "2026-11-06 asr -1", "2026-11-23 dhuhr -1", "2026-12-23 asr -1", "2027-01-09 isha -1", "2027-01-27 maghrib -1", "2027-03-27 isha -1", "2027-05-14 dhuhr -1", "2027-05-15 fajr -1", "2027-06-01 maghrib -1"], "35.200,-0.625": ["2026-10-10 fajr +1", "2026-10-14 asr +1", "2026-12-14 isha +1", "2027-01-26 dhuhr +1", "2027-02-15 isha +1", "2027-02-16 sunrise -1", "2027-03-02 fajr +1", "2027-03-19 sunrise +1", "2027-03-31 isha +1", "2027-04-22 asr +1", "2027-04-28 fajr +1", "2027-05-19 dhuhr +1", "2027-05-26 asr +1"], "35.214,4.188": ["2026-10-28 dhuhr +1", "2026-11-15 sunrise -1", "2026-12-14 maghrib +1", "2026-12-17 maghrib +1", "2027-01-16 fajr +1", "2027-01-24 maghrib +1", "2027-02-23 maghrib +1", "2027-03-24 maghrib +1", "2027-04-26 sunrise +1"], "35.298,-1.140": ["2026-10-02 sunrise -1", "2026-10-17 maghrib -1", "2026-11-08 asr -1", "2026-12-21 asr -1", "2026-12-31 asr -1", "2027-01-15 asr -1", "2027-01-18 isha -1", "2027-03-03 sunrise -1", "2027-04-27 sunrise -1", "2027-05-18 dhuhr -1", "2027-06-01 isha +1"], "35.372,1.332": ["2027-01-03 sunrise +1", "2027-01-15 dhuhr +1", "2027-01-17 maghrib +1", "2027-01-18 dhuhr -1", "2027-03-08 maghrib +1", "2027-03-17 sunrise -1", "2027-03-22 isha +1", "2027-06-03 fajr -1", "2027-06-05 fajr -1"], "35.400,0.146": ["2026-12-20 dhuhr +1", "2026-12-24 maghrib +1", "2027-01-05 sunrise -1", "2027-03-15 fajr -1"], "35.405,8.129": ["2026-11-04 dhuhr -1", "2027-01-10 sunrise +1", "2027-01-29 maghrib +1", "2027-02-07 fajr +1", "2027-02-14 isha +1", "2027-03-30 dhuhr +1"], "35.437,7.155": ["2026-10-14 fajr +1", "2026-10-16 maghrib +1", "2026-10-30 dhuhr +1", "2026-12-16 dhuhr +1", "2027-02-02 maghrib +1", "2027-02-13 isha +1", "2027-02-21 maghrib +1", "2027-02-25 fajr +1", "2027-03-10 isha +1", "2027-03-23 dhuhr +1"], "35.447,2.909": ["2026-10-07 maghrib -1", "2026-11-30 dhuhr -1", "2026-12-01 sunrise -1", "2027-01-01 isha -1", "2027-04-24 fajr -1", "2027-06-04 isha +1"], "35.547,6.172": ["2026-12-13 asr -1", "2027-01-27 dhuhr -1", "2027-02-04 sunrise -1", "2027-03-10 isha +1", "2027-04-13 asr -1", "2027-05-11 isha +1"], "35.603,1.816": ["2026-10-19 asr -1", "2026-12-12 asr -1", "2027-02-09 sunrise -1", "2027-03-15 maghrib -1", "2027-04-25 maghrib -1", "2027-05-04 asr +1", "2027-05-08 fajr -1", "2027-05-28 dhuhr -1"], "35.697,-0.626": ["2026-11-04 asr +1", "2027-01-26 dhuhr +1", "2027-02-12 maghrib +1", "2027-02-14 fajr +1", "2027-02-14 maghrib +1", "2027-02-15 maghrib +1", "2027-03-13 isha +1", "2027-03-30 dhuhr -1", "2027-05-19 dhuhr +1"], "35.700,4.552": ["2026-10-29 asr -1", "2026-11-18 maghrib +1", "2026-12-13 maghrib +1", "2026-12-23 maghrib +1", "2027-01-28 fajr -1", "2027-02-03 maghrib +1", "2027-04-11 fajr -1", "2027-05-06 sunrise +1", "2027-05-26 fajr -1"], "35.733,0.558": ["2026-10-13 dhuhr +1", "2026-12-13 asr +1", "2027-02-05 maghrib +1", "2027-02-11 dhuhr +1", "2027-02-12 dhuhr +1", "2027-02-16 isha +1", "2027-03-16 isha -1", "2027-05-24 asr +1"], "35.872,7.120": ["2026-10-25 sunrise -1", "2026-11-03 maghrib -1", "2026-12-14 isha -1", "2027-05-19 dhuhr -1", "2027-05-24 isha +1"], "35.930,0.088": ["2026-10-09 fajr -1", "2026-10-27 fajr -1", "2026-10-29 sunrise -1", "2026-11-29 maghrib -1", "2026-12-24 asr -1", "2026-12-26 maghrib +1", "2027-02-23 dhuhr -1", "2027-02-25 asr -1", "2027-03-21 maghrib -1", "2027-04-10 dhuhr -1", "2027-04-23 dhuhr -1", "2027-05-01 asr -1", "2027-05-12 isha +1", "2027-05-13 dhuhr -1", "2027-05-14 dhuhr -1"], "36.069,4.765": ["2026-10-01 isha -1", "2026-11-25 asr -1", "2026-12-18 asr -1", "2026-12-21 isha -1", "2027-01-08 maghrib +1", "2027-02-06 dhuhr +1", "2027-02-25 dhuhr -1", "2027-04-23 sunrise +1", "2027-05-05 asr +1", "2027-05-20 isha +1"], "36.164,1.338": ["2026-12-13 fajr +1", "2027-01-26 asr -1", "2027-03-01 dhuhr -1", "2027-03-26 sunrise -1", "2027-04-09 sunrise -1", "2027-04-10 dhuhr -1"], "36.187,5.421": ["2026-10-21 asr +1", "2027-01-20 sunrise -1", "2027-02-10 maghrib +1", "2027-03-05 asr +1", "2027-05-30 fajr -1", "2027-05-31 dhuhr +1", "2027-05-31 sunrise +1"], "36.266,1.972": ["2026-10-06 isha -1", "2026-10-11 fajr -1", "2026-10-31 maghrib -1", "2026-11-20 maghrib +1", "2027-01-28 dhuhr -1", "2027-02-05 isha -1", "2027-04-08 dhuhr -1"], "36.266,2.755": ["2026-10-25 dhuhr -1", "2026-11-06 asr -1", "2027-01-20 fajr +1", "2027-03-11 sunrise -1", "2027-04-04 dhuhr -1", "2027-04-06 fajr -1", "2027-04-06 maghrib -1", "2027-05-10 asr -1", "2027-05-21 maghrib -1", "2027-05-28 asr +1"], "36.282,7.960": ["2026-10-29 sunrise -1", "2026-11-12 sunrise -1", "2026-12-28 asr -1", "2027-02-19 dhuhr +1", "2027-04-14 maghrib -1", "2027-04-16 dhuhr -1", "2027-04-21 fajr -1", "2027-04-26 dhuhr -1", "2027-04-27 isha -1"], "36.353,6.607": ["2026-12-23 maghrib +1", "2027-01-01 maghrib +1", "2027-01-07 maghrib +1", "2027-02-10 maghrib +1", "2027-02-11 isha +1", "2027-02-17 asr +1", "2027-03-23 fajr +1", "2027-03-27 asr +1", "2027-05-31 maghrib -1"], "36.376,3.904": ["2026-12-23 asr -1", "2027-01-04 asr -1", "2027-01-08 fajr +1", "2027-01-08 isha -1", "2027-02-22 maghrib +1", "2027-03-21 sunrise -1", "2027-03-23 dhuhr +1", "2027-04-02 dhuhr -1"], "36.451,6.269": ["2026-11-08 sunrise -1", "2026-11-17 asr -1", "2026-12-05 asr -1", "2026-12-13 sunrise -1", "2027-01-08 maghrib +1", "2027-01-18 isha -1", "2027-01-31 isha -1", "2027-03-18 fajr -1", "2027-04-15 dhuhr -1"], "36.461,7.434": ["2026-10-04 dhuhr +1", "2026-10-11 dhuhr +1", "2026-10-25 fajr -1", "2027-01-08 fajr +1", "2027-04-02 maghrib -1", "2027-04-05 dhuhr -1", "2027-04-09 fajr -1", "2027-04-22 fajr -1", "2027-04-22 sunrise -1", "2027-05-06 fajr -1", "2027-05-07 sunrise -1"], "36.474,2.840": ["2026-10-02 dhuhr +1", "2026-10-08 asr -1", "2026-10-12 sunrise +1", "2026-10-23 sunrise -1", "2026-11-05 asr -1", "2026-11-19 dhuhr +1", "2026-11-24 asr -1", "2026-12-14 maghrib -1", "2026-12-23 asr -1", "2026-12-25 fajr +1", "2027-01-04 asr -1", "2027-01-25 fajr +1", "2027-03-08 sunrise +1", "2027-04-28 fajr -1", "2027-04-30 fajr -1", "2027-05-13 fajr -1", "2027-05-25 isha +1"], "36.584,2.450": ["2026-10-03 maghrib -1", "2026-12-03 dhuhr +1", "2027-02-03 dhuhr +1", "2027-03-08 dhuhr -1", "2027-04-17 maghrib +1", "2027-05-16 maghrib +1", "2027-05-24 isha +1"], "36.712,4.057": ["2026-11-13 dhuhr -1", "2026-12-15 asr -1", "2026-12-29 maghrib +1", "2027-01-25 isha -1", "2027-02-11 asr -1", "2027-02-19 maghrib +1", "2027-02-21 fajr +1", "2027-02-24 dhuhr +1", "2027-04-17 asr +1", "2027-04-25 fajr -1", "2027-05-13 asr +1", "2027-05-19 fajr -1", "2027-05-22 isha +1"], "36.746,5.075": ["2026-12-03 asr -1", "2027-03-01 fajr +1", "2027-03-06 dhuhr +1", "2027-03-17 fajr +1", "2027-04-01 fajr +1", "2027-04-05 isha +1", "2027-04-15 isha +1", "2027-05-01 maghrib +1"], "36.757,3.480": ["2026-10-07 maghrib +1", "2026-11-24 maghrib +1", "2026-12-21 fajr +1", "2026-12-28 fajr +1", "2027-01-09 isha +1", "2027-02-13 sunrise +1", "2027-02-26 dhuhr +1", "2027-03-07 sunrise +1", "2027-03-22 dhuhr +1", "2027-04-19 isha +1", "2027-05-04 isha +1", "2027-06-05 fajr -1"], "36.764,8.324": ["2026-10-04 maghrib +1", "2026-11-10 isha -1", "2026-11-29 dhuhr +1", "2026-12-02 asr -1", "2027-02-10 isha +1", "2027-02-26 isha +1", "2027-03-06 dhuhr +1", "2027-03-09 asr -1", "2027-03-17 fajr +1", "2027-05-25 maghrib -1", "2027-06-03 asr +1"], "36.765,3.055": ["2026-12-18 sunrise -1", "2026-12-29 asr -1", "2027-02-07 fajr -1", "2027-02-12 dhuhr +1"], "36.817,5.773": ["2026-10-01 sunrise -1", "2026-11-02 asr -1", "2026-11-07 maghrib -1", "2026-11-17 sunrise -1", "2026-11-22 isha -1", "2026-12-12 asr -1", "2026-12-17 dhuhr -1", "2027-01-03 isha -1", "2027-02-12 sunrise +1", "2027-02-27 maghrib +1", "2027-03-24 maghrib +1", "2027-03-27 isha +1", "2027-04-01 maghrib +1", "2027-05-31 isha +1"], "36.862,6.905": ["2026-10-26 maghrib -1", "2026-11-02 isha -1", "2026-11-07 dhuhr -1", "2026-12-30 asr -1", "2027-01-29 asr -1", "2027-02-07 asr -1", "2027-02-18 fajr -1", "2027-02-21 dhuhr -1", "2027-03-23 sunrise -1", "2027-04-17 dhuhr +1", "2027-04-27 fajr -1", "2027-05-05 fajr -1", "2027-05-08 maghrib -1"], "36.895,7.761": ["2026-12-07 asr -1", "2026-12-16 asr -1", "2027-01-05 fajr +1", "2027-01-11 asr -1", "2027-01-14 fajr +1", "2027-02-06 dhuhr -1", "2027-03-29 asr +1", "2027-04-10 isha +1", "2027-04-28 isha +1", "2027-05-06 fajr -1", "2027-05-11 isha +1", "2027-05-15 fajr -1"], "36.909,3.914": ["2026-10-01 maghrib +1", "2026-11-14 fajr +1", "2027-01-19 dhuhr +1", "2027-01-23 fajr +1", "2027-01-30 maghrib +1", "2027-03-23 fajr -1", "2027-04-05 maghrib +1", "2027-04-17 sunrise +1", "2027-05-01 asr +1", "2027-05-09 isha +1", "2027-05-29 fajr -1"] } };
2
+ export default data;
@@ -0,0 +1,2 @@
1
+ declare const data: Record<string, [number, number]>;
2
+ export default data;
@@ -0,0 +1,3 @@
1
+ // Generated by scripts/embed.mjs — do not edit; edit the JSON under data/ instead.
2
+ const data = { "1": [34.6626, 3.2551], "2": [35.4052, 8.1287], "3": [34.7443, 8.0625], "4": [35.4373, 7.1553], "5": [33.3633, 6.8739], "6": [35.5474, 6.1716], "7": [33.0989, 6.072], "8": [34.8505, 5.7378], "10": [35.2138, 4.1877], "11": [34.846, 4.1721], "12": [32.9334, 3.2785], "13": [33.8055, 2.8825], "14": [35.4465, 2.9095], "15": [35.6035, 1.816], "16": [35.3719, 1.3319], "17": [33.6816, 1.0267], "18": [34.8383, 0.1542], "19": [35.3997, 0.1458], "20": [33.2662, -0.3107], "21": [35.2004, -0.6253], "22": [34.946, -0.91], "23": [34.8775, -1.309], "24": [35.2977, -1.1398], "25": [34.6261, -1.3273], "26": [34.863, -1.7248], "27": [36.7648, 3.0553], "28": [35.6971, -0.6257], "29": [35.9303, 0.0881], "30": [35.7333, 0.5578], "31": [36.1637, 1.338], "32": [36.2661, 1.9719], "33": [36.5835, 2.4497], "34": [36.2655, 2.7553], "35": [36.474, 2.8397], "36": [36.7569, 3.4802], "37": [36.3764, 3.9035], "38": [36.9086, 3.9136], "39": [36.7118, 4.0569], "40": [35.6998, 4.5519], "41": [36.0691, 4.7651], "42": [36.7464, 5.0747], "43": [36.1873, 5.4208], "44": [36.817, 5.7727], "45": [36.4511, 6.2692], "46": [36.353, 6.6067], "47": [36.8622, 6.9047], "48": [35.8724, 7.1195], "49": [36.4611, 7.4336], "50": [36.8955, 7.7607], "51": [36.2824, 7.9601], "52": [36.7637, 8.3237], "53": [27.8658, -0.2764], "54": [27.6701, -8.1459], "55": [31.6067, -2.2147], "56": [29.2499, 0.2388], "57": [26.7182, 0.1702], "58": [21.3169, 0.9511], "59": [30.1313, -2.1587], "60": [27.1941, 2.4793], "61": [30.5843, 2.8848], "62": [32.4828, 3.6837], "63": [31.958, 5.3473], "64": [22.7775, 5.5293], "65": [19.5617, 5.7732], "66": [26.5068, 8.4775], "67": [24.5552, 9.4902], "68": [28.0465, 9.5632], "69": [32.0475, -1.245] };
3
+ export default data;
@@ -0,0 +1,5 @@
1
+ declare const data: {
2
+ scale: number;
3
+ countries: Record<string, number[][][]>;
4
+ };
5
+ export default data;