@orrery/core 0.1.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,331 @@
1
+ // src/cities.ts
2
+ var JAMO_TO_INITIAL = {
3
+ 12593: 0,
4
+ 12594: 1,
5
+ 12596: 2,
6
+ 12599: 3,
7
+ 12600: 4,
8
+ 12601: 5,
9
+ 12609: 6,
10
+ 12610: 7,
11
+ 12611: 8,
12
+ 12613: 9,
13
+ 12614: 10,
14
+ 12615: 11,
15
+ 12616: 12,
16
+ 12617: 13,
17
+ 12618: 14,
18
+ 12619: 15,
19
+ 12620: 16,
20
+ 12621: 17,
21
+ 12622: 18
22
+ };
23
+ function getInitialIndex(char) {
24
+ const code = char.charCodeAt(0);
25
+ if (code >= 44032 && code <= 55203) {
26
+ return Math.floor((code - 44032) / (21 * 28));
27
+ }
28
+ if (code in JAMO_TO_INITIAL) {
29
+ return JAMO_TO_INITIAL[code];
30
+ }
31
+ return null;
32
+ }
33
+ function isJamo(char) {
34
+ return char.charCodeAt(0) in JAMO_TO_INITIAL;
35
+ }
36
+ function isAllChosung(query) {
37
+ return query.length > 0 && [...query].every(isJamo);
38
+ }
39
+ function matchChosung(name, query) {
40
+ if (query.length > name.length) return false;
41
+ for (let i = 0; i < query.length; i++) {
42
+ const qIdx = JAMO_TO_INITIAL[query.charCodeAt(i)];
43
+ const nIdx = getInitialIndex(name[i]);
44
+ if (qIdx === void 0 || nIdx === null || qIdx !== nIdx) return false;
45
+ }
46
+ return true;
47
+ }
48
+ var KOREAN_CITIES = [
49
+ // 특별/광역시
50
+ { name: "\uC11C\uC6B8", lat: 37.5665, lon: 126.978 },
51
+ { name: "\uBD80\uC0B0", lat: 35.1796, lon: 129.0756 },
52
+ { name: "\uC778\uCC9C", lat: 37.4563, lon: 126.7052 },
53
+ { name: "\uB300\uAD6C", lat: 35.8714, lon: 128.6014 },
54
+ { name: "\uB300\uC804", lat: 36.3504, lon: 127.3845 },
55
+ { name: "\uAD11\uC8FC", lat: 35.1595, lon: 126.8526 },
56
+ { name: "\uC6B8\uC0B0", lat: 35.5384, lon: 129.3114 },
57
+ { name: "\uC138\uC885", lat: 36.48, lon: 127.259 },
58
+ // 경기도
59
+ { name: "\uC218\uC6D0", lat: 37.2636, lon: 127.0286 },
60
+ { name: "\uACE0\uC591", lat: 37.6584, lon: 126.832 },
61
+ { name: "\uC6A9\uC778", lat: 37.2411, lon: 127.1776 },
62
+ { name: "\uC131\uB0A8", lat: 37.4386, lon: 127.1378 },
63
+ { name: "\uBD80\uCC9C", lat: 37.5034, lon: 126.766 },
64
+ { name: "\uC548\uC0B0", lat: 37.3219, lon: 126.8309 },
65
+ { name: "\uC548\uC591", lat: 37.3943, lon: 126.9568 },
66
+ { name: "\uB0A8\uC591\uC8FC", lat: 37.636, lon: 127.2165 },
67
+ { name: "\uD654\uC131", lat: 37.1996, lon: 126.8312 },
68
+ { name: "\uD3C9\uD0DD", lat: 36.9921, lon: 127.0857 },
69
+ { name: "\uC758\uC815\uBD80", lat: 37.7381, lon: 127.0338 },
70
+ { name: "\uC2DC\uD765", lat: 37.3801, lon: 126.8032 },
71
+ { name: "\uD30C\uC8FC", lat: 37.759, lon: 126.7802 },
72
+ { name: "\uAE40\uD3EC", lat: 37.6153, lon: 126.7156 },
73
+ { name: "\uAD11\uBA85", lat: 37.4786, lon: 126.8646 },
74
+ { name: "\uC774\uCC9C", lat: 37.272, lon: 127.435 },
75
+ // 강원도
76
+ { name: "\uCD98\uCC9C", lat: 37.8813, lon: 127.7299 },
77
+ { name: "\uC6D0\uC8FC", lat: 37.3422, lon: 127.9202 },
78
+ { name: "\uAC15\uB989", lat: 37.7519, lon: 128.8761 },
79
+ { name: "\uC18D\uCD08", lat: 38.207, lon: 128.5918 },
80
+ // 충청도
81
+ { name: "\uCCAD\uC8FC", lat: 36.6424, lon: 127.489 },
82
+ { name: "\uCC9C\uC548", lat: 36.8152, lon: 127.1139 },
83
+ { name: "\uCDA9\uC8FC", lat: 36.991, lon: 127.9259 },
84
+ { name: "\uC81C\uCC9C", lat: 37.1326, lon: 128.191 },
85
+ { name: "\uC544\uC0B0", lat: 36.7898, lon: 127.0018 },
86
+ // 전라도
87
+ { name: "\uC804\uC8FC", lat: 35.8242, lon: 127.148 },
88
+ { name: "\uBAA9\uD3EC", lat: 34.8118, lon: 126.3922 },
89
+ { name: "\uC5EC\uC218", lat: 34.7604, lon: 127.6622 },
90
+ { name: "\uC21C\uCC9C", lat: 34.9505, lon: 127.4873 },
91
+ { name: "\uAD70\uC0B0", lat: 35.9677, lon: 126.737 },
92
+ { name: "\uC775\uC0B0", lat: 35.9483, lon: 126.9576 },
93
+ // 경상도
94
+ { name: "\uD3EC\uD56D", lat: 36.019, lon: 129.3435 },
95
+ { name: "\uACBD\uC8FC", lat: 35.8562, lon: 129.2247 },
96
+ { name: "\uAE40\uD574", lat: 35.2285, lon: 128.8894 },
97
+ { name: "\uCC3D\uC6D0", lat: 35.2281, lon: 128.6811 },
98
+ { name: "\uC9C4\uC8FC", lat: 35.1798, lon: 128.1076 },
99
+ { name: "\uAD6C\uBBF8", lat: 36.1197, lon: 128.3446 },
100
+ { name: "\uC548\uB3D9", lat: 36.5684, lon: 128.7294 },
101
+ // 제주도
102
+ { name: "\uC81C\uC8FC", lat: 33.4996, lon: 126.5312 },
103
+ { name: "\uC11C\uADC0\uD3EC", lat: 33.2542, lon: 126.56 }
104
+ ];
105
+ var WORLD_CITIES = [
106
+ // ── 동아시아 ──
107
+ { name: "\uB3C4\uCFC4", country: "\uC77C\uBCF8", lat: 35.6762, lon: 139.6503 },
108
+ { name: "\uC624\uC0AC\uCE74", country: "\uC77C\uBCF8", lat: 34.6937, lon: 135.5023 },
109
+ { name: "\uAD50\uD1A0", country: "\uC77C\uBCF8", lat: 35.0116, lon: 135.7681 },
110
+ { name: "\uD6C4\uCFE0\uC624\uCE74", country: "\uC77C\uBCF8", lat: 33.5904, lon: 130.4017 },
111
+ { name: "\uC0BF\uD3EC\uB85C", country: "\uC77C\uBCF8", lat: 43.0618, lon: 141.3545 },
112
+ { name: "\uB098\uACE0\uC57C", country: "\uC77C\uBCF8", lat: 35.1815, lon: 136.9066 },
113
+ { name: "\uBCA0\uC774\uC9D5", country: "\uC911\uAD6D", lat: 39.9042, lon: 116.4074 },
114
+ { name: "\uC0C1\uD558\uC774", country: "\uC911\uAD6D", lat: 31.2304, lon: 121.4737 },
115
+ { name: "\uAD11\uC800\uC6B0", country: "\uC911\uAD6D", lat: 23.1291, lon: 113.2644 },
116
+ { name: "\uC120\uC804", country: "\uC911\uAD6D", lat: 22.5431, lon: 114.0579 },
117
+ { name: "\uCCAD\uB450", country: "\uC911\uAD6D", lat: 30.5728, lon: 104.0668 },
118
+ { name: "\uCDA9\uCE6D", country: "\uC911\uAD6D", lat: 29.4316, lon: 106.9123 },
119
+ { name: "\uC2DC\uC548", country: "\uC911\uAD6D", lat: 34.3416, lon: 108.9398 },
120
+ { name: "\uD64D\uCF69", country: "\uC911\uAD6D", lat: 22.3193, lon: 114.1694 },
121
+ { name: "\uD0C0\uC774\uBCA0\uC774", country: "\uB300\uB9CC", lat: 25.033, lon: 121.5654 },
122
+ { name: "\uC6B8\uB780\uBC14\uD1A0\uB974", country: "\uBABD\uACE8", lat: 47.8864, lon: 106.9057 },
123
+ { name: "\uD3C9\uC591", country: "\uBD81\uD55C", lat: 39.0392, lon: 125.7625 },
124
+ // ── 동남아시아 ──
125
+ { name: "\uBC29\uCF55", country: "\uD0DC\uAD6D", lat: 13.7563, lon: 100.5018 },
126
+ { name: "\uD558\uB178\uC774", country: "\uBCA0\uD2B8\uB0A8", lat: 21.0278, lon: 105.8342 },
127
+ { name: "\uD638\uCE58\uBBFC", country: "\uBCA0\uD2B8\uB0A8", lat: 10.8231, lon: 106.6297 },
128
+ { name: "\uB2E4\uB0AD", country: "\uBCA0\uD2B8\uB0A8", lat: 16.0544, lon: 108.2022 },
129
+ { name: "\uC790\uCE74\uB974\uD0C0", country: "\uC778\uB3C4\uB124\uC2DC\uC544", lat: -6.2088, lon: 106.8456 },
130
+ { name: "\uBC1C\uB9AC", country: "\uC778\uB3C4\uB124\uC2DC\uC544", lat: -8.3405, lon: 115.092 },
131
+ { name: "\uC2F1\uAC00\uD3EC\uB974", country: "\uC2F1\uAC00\uD3EC\uB974", lat: 1.3521, lon: 103.8198 },
132
+ { name: "\uCFE0\uC54C\uB77C\uB8F8\uD478\uB974", country: "\uB9D0\uB808\uC774\uC2DC\uC544", lat: 3.139, lon: 101.6869 },
133
+ { name: "\uB9C8\uB2D0\uB77C", country: "\uD544\uB9AC\uD540", lat: 14.5995, lon: 120.9842 },
134
+ { name: "\uC138\uBD80", country: "\uD544\uB9AC\uD540", lat: 10.3157, lon: 123.8854 },
135
+ { name: "\uC591\uACE4", country: "\uBBF8\uC580\uB9C8", lat: 16.8661, lon: 96.1951 },
136
+ { name: "\uD504\uB188\uD39C", country: "\uCE84\uBCF4\uB514\uC544", lat: 11.5564, lon: 104.9282 },
137
+ { name: "\uBE44\uC5D4\uD2F0\uC548", country: "\uB77C\uC624\uC2A4", lat: 17.9757, lon: 102.6331 },
138
+ // ── 남아시아 ──
139
+ { name: "\uB274\uB378\uB9AC", country: "\uC778\uB3C4", lat: 28.6139, lon: 77.209 },
140
+ { name: "\uBB44\uBC14\uC774", country: "\uC778\uB3C4", lat: 19.076, lon: 72.8777 },
141
+ { name: "\uBCB5\uAC08\uB8E8\uB8E8", country: "\uC778\uB3C4", lat: 12.9716, lon: 77.5946 },
142
+ { name: "\uB2E4\uCE74", country: "\uBC29\uAE00\uB77C\uB370\uC2DC", lat: 23.8103, lon: 90.4125 },
143
+ { name: "\uC774\uC2AC\uB77C\uB9C8\uBC14\uB4DC", country: "\uD30C\uD0A4\uC2A4\uD0C4", lat: 33.6844, lon: 73.0479 },
144
+ { name: "\uCE74\uB77C\uCE58", country: "\uD30C\uD0A4\uC2A4\uD0C4", lat: 24.8607, lon: 67.0011 },
145
+ { name: "\uCE74\uD2B8\uB9CC\uB450", country: "\uB124\uD314", lat: 27.7172, lon: 85.324 },
146
+ { name: "\uCF5C\uB86C\uBCF4", country: "\uC2A4\uB9AC\uB791\uCE74", lat: 6.9271, lon: 79.8612 },
147
+ // ── 중앙아시아 / 서아시아 ──
148
+ { name: "\uC544\uC2A4\uD0C0\uB098", country: "\uCE74\uC790\uD750\uC2A4\uD0C4", lat: 51.1694, lon: 71.4491 },
149
+ { name: "\uC54C\uB9C8\uD2F0", country: "\uCE74\uC790\uD750\uC2A4\uD0C4", lat: 43.222, lon: 76.8512 },
150
+ { name: "\uD0C0\uC288\uCF04\uD2B8", country: "\uC6B0\uC988\uBCA0\uD0A4\uC2A4\uD0C4", lat: 41.2995, lon: 69.2401 },
151
+ { name: "\uBE44\uC288\uCF00\uD06C", country: "\uD0A4\uB974\uAE30\uC2A4\uC2A4\uD0C4", lat: 42.8746, lon: 74.5698 },
152
+ { name: "\uB450\uC0E8\uBCA0", country: "\uD0C0\uC9C0\uD0A4\uC2A4\uD0C4", lat: 38.5598, lon: 68.7738 },
153
+ { name: "\uC544\uC2DC\uAC00\uBC14\uD2B8", country: "\uD22C\uB974\uD06C\uBA54\uB2C8\uC2A4\uD0C4", lat: 37.9601, lon: 58.3261 },
154
+ { name: "\uD14C\uD5E4\uB780", country: "\uC774\uB780", lat: 35.6892, lon: 51.389 },
155
+ { name: "\uBC14\uADF8\uB2E4\uB4DC", country: "\uC774\uB77C\uD06C", lat: 33.3128, lon: 44.3615 },
156
+ { name: "\uB9AC\uC57C\uB4DC", country: "\uC0AC\uC6B0\uB514\uC544\uB77C\uBE44\uC544", lat: 24.7136, lon: 46.6753 },
157
+ { name: "\uC81C\uB2E4", country: "\uC0AC\uC6B0\uB514\uC544\uB77C\uBE44\uC544", lat: 21.4858, lon: 39.1925 },
158
+ { name: "\uB450\uBC14\uC774", country: "\uC544\uB78D\uC5D0\uBBF8\uB9AC\uD2B8", lat: 25.2048, lon: 55.2708 },
159
+ { name: "\uC544\uBD80\uB2E4\uBE44", country: "\uC544\uB78D\uC5D0\uBBF8\uB9AC\uD2B8", lat: 24.4539, lon: 54.3773 },
160
+ { name: "\uB3C4\uD558", country: "\uCE74\uD0C0\uB974", lat: 25.2854, lon: 51.531 },
161
+ { name: "\uCFE0\uC6E8\uC774\uD2B8\uC2DC\uD2F0", country: "\uCFE0\uC6E8\uC774\uD2B8", lat: 29.3759, lon: 47.9774 },
162
+ { name: "\uC559\uCE74\uB77C", country: "\uD280\uB974\uD0A4\uC608", lat: 39.9334, lon: 32.8597 },
163
+ { name: "\uC774\uC2A4\uD0C4\uBD88", country: "\uD280\uB974\uD0A4\uC608", lat: 41.0082, lon: 28.9784 },
164
+ { name: "\uD154\uC544\uBE44\uBE0C", country: "\uC774\uC2A4\uB77C\uC5D8", lat: 32.0853, lon: 34.7818 },
165
+ { name: "\uC608\uB8E8\uC0B4\uB818", country: "\uC774\uC2A4\uB77C\uC5D8", lat: 31.7683, lon: 35.2137 },
166
+ { name: "\uBCA0\uC774\uB8E8\uD2B8", country: "\uB808\uBC14\uB17C", lat: 33.8938, lon: 35.5018 },
167
+ { name: "\uC554\uB9CC", country: "\uC694\uB974\uB2E8", lat: 31.9454, lon: 35.9284 },
168
+ { name: "\uB2E4\uB9C8\uC2A4\uCFE0\uC2A4", country: "\uC2DC\uB9AC\uC544", lat: 33.5138, lon: 36.2765 },
169
+ { name: "\uD2B8\uBE4C\uB9AC\uC2DC", country: "\uC870\uC9C0\uC544", lat: 41.7151, lon: 44.8271 },
170
+ { name: "\uBC14\uCFE0", country: "\uC544\uC81C\uB974\uBC14\uC774\uC794", lat: 40.4093, lon: 49.8671 },
171
+ { name: "\uC608\uB808\uBC18", country: "\uC544\uB974\uBA54\uB2C8\uC544", lat: 40.1792, lon: 44.4991 },
172
+ // ── 서유럽 ──
173
+ { name: "\uB7F0\uB358", country: "\uC601\uAD6D", lat: 51.5074, lon: -0.1278 },
174
+ { name: "\uC5D0\uB4E0\uBC84\uB7EC", country: "\uC601\uAD6D", lat: 55.9533, lon: -3.1883 },
175
+ { name: "\uB9E8\uCCB4\uC2A4\uD130", country: "\uC601\uAD6D", lat: 53.4808, lon: -2.2426 },
176
+ { name: "\uD30C\uB9AC", country: "\uD504\uB791\uC2A4", lat: 48.8566, lon: 2.3522 },
177
+ { name: "\uB9C8\uB974\uC138\uC720", country: "\uD504\uB791\uC2A4", lat: 43.2965, lon: 5.3698 },
178
+ { name: "\uB9AC\uC639", country: "\uD504\uB791\uC2A4", lat: 45.764, lon: 4.8357 },
179
+ { name: "\uBCA0\uB97C\uB9B0", country: "\uB3C5\uC77C", lat: 52.52, lon: 13.405 },
180
+ { name: "\uBB8C\uD5E8", country: "\uB3C5\uC77C", lat: 48.1351, lon: 11.582 },
181
+ { name: "\uD568\uBD80\uB974\uD06C", country: "\uB3C5\uC77C", lat: 53.5511, lon: 9.9937 },
182
+ { name: "\uD504\uB791\uD06C\uD478\uB974\uD2B8", country: "\uB3C5\uC77C", lat: 50.1109, lon: 8.6821 },
183
+ { name: "\uC554\uC2A4\uD14C\uB974\uB2F4", country: "\uB124\uB35C\uB780\uB4DC", lat: 52.3676, lon: 4.9041 },
184
+ { name: "\uBE0C\uB93C\uC140", country: "\uBCA8\uAE30\uC5D0", lat: 50.8503, lon: 4.3517 },
185
+ { name: "\uB8E9\uC148\uBD80\uB974\uD06C", country: "\uB8E9\uC148\uBD80\uB974\uD06C", lat: 49.6117, lon: 6.1319 },
186
+ // ── 남유럽 ──
187
+ { name: "\uB9C8\uB4DC\uB9AC\uB4DC", country: "\uC2A4\uD398\uC778", lat: 40.4168, lon: -3.7038 },
188
+ { name: "\uBC14\uB974\uC140\uB85C\uB098", country: "\uC2A4\uD398\uC778", lat: 41.3874, lon: 2.1686 },
189
+ { name: "\uB85C\uB9C8", country: "\uC774\uD0C8\uB9AC\uC544", lat: 41.9028, lon: 12.4964 },
190
+ { name: "\uBC00\uB77C\uB178", country: "\uC774\uD0C8\uB9AC\uC544", lat: 45.4642, lon: 9.19 },
191
+ { name: "\uB098\uD3F4\uB9AC", country: "\uC774\uD0C8\uB9AC\uC544", lat: 40.8518, lon: 14.2681 },
192
+ { name: "\uB9AC\uC2A4\uBCF8", country: "\uD3EC\uB974\uD22C\uAC08", lat: 38.7223, lon: -9.1393 },
193
+ { name: "\uC544\uD14C\uB124", country: "\uADF8\uB9AC\uC2A4", lat: 37.9838, lon: 23.7275 },
194
+ // ── 중유럽 ──
195
+ { name: "\uBE48", country: "\uC624\uC2A4\uD2B8\uB9AC\uC544", lat: 48.2082, lon: 16.3738 },
196
+ { name: "\uBCA0\uB978", country: "\uC2A4\uC704\uC2A4", lat: 46.948, lon: 7.4474 },
197
+ { name: "\uCDE8\uB9AC\uD788", country: "\uC2A4\uC704\uC2A4", lat: 47.3769, lon: 8.5417 },
198
+ { name: "\uC81C\uB124\uBC14", country: "\uC2A4\uC704\uC2A4", lat: 46.2044, lon: 6.1432 },
199
+ { name: "\uD504\uB77C\uD558", country: "\uCCB4\uCF54", lat: 50.0755, lon: 14.4378 },
200
+ { name: "\uBC14\uB974\uC0E4\uBC14", country: "\uD3F4\uB780\uB4DC", lat: 52.2297, lon: 21.0122 },
201
+ { name: "\uD06C\uB77C\uCFE0\uD504", country: "\uD3F4\uB780\uB4DC", lat: 50.0647, lon: 19.945 },
202
+ { name: "\uBD80\uB2E4\uD398\uC2A4\uD2B8", country: "\uD5DD\uAC00\uB9AC", lat: 47.4979, lon: 19.0402 },
203
+ { name: "\uBD80\uCFE0\uB808\uC288\uD2F0", country: "\uB8E8\uB9C8\uB2C8\uC544", lat: 44.4268, lon: 26.1025 },
204
+ { name: "\uC18C\uD53C\uC544", country: "\uBD88\uAC00\uB9AC\uC544", lat: 42.6977, lon: 23.3219 },
205
+ // ── 발칸/남동유럽 ──
206
+ { name: "\uC790\uADF8\uB808\uBE0C", country: "\uD06C\uB85C\uC544\uD2F0\uC544", lat: 45.815, lon: 15.9819 },
207
+ { name: "\uB958\uBE14\uB7B4\uB098", country: "\uC2AC\uB85C\uBCA0\uB2C8\uC544", lat: 46.0569, lon: 14.5058 },
208
+ { name: "\uBCA0\uC624\uADF8\uB77C\uB4DC", country: "\uC138\uB974\uBE44\uC544", lat: 44.7866, lon: 20.4489 },
209
+ { name: "\uC0AC\uB77C\uC608\uBCF4", country: "\uBCF4\uC2A4\uB2C8\uC544", lat: 43.8563, lon: 18.4131 },
210
+ { name: "\uD2F0\uB77C\uB098", country: "\uC54C\uBC14\uB2C8\uC544", lat: 41.3275, lon: 19.8187 },
211
+ // ── 북유럽 ──
212
+ { name: "\uD5EC\uC2F1\uD0A4", country: "\uD540\uB780\uB4DC", lat: 60.1699, lon: 24.9384 },
213
+ { name: "\uC2A4\uD1A1\uD640\uB984", country: "\uC2A4\uC6E8\uB374", lat: 59.3293, lon: 18.0686 },
214
+ { name: "\uC624\uC2AC\uB85C", country: "\uB178\uB974\uC6E8\uC774", lat: 59.9139, lon: 10.7522 },
215
+ { name: "\uCF54\uD39C\uD558\uAC90", country: "\uB374\uB9C8\uD06C", lat: 55.6761, lon: 12.5683 },
216
+ { name: "\uB808\uC774\uCEAC\uBE44\uD06C", country: "\uC544\uC774\uC2AC\uB780\uB4DC", lat: 64.1466, lon: -21.9426 },
217
+ { name: "\uB354\uBE14\uB9B0", country: "\uC544\uC77C\uB79C\uB4DC", lat: 53.3498, lon: -6.2603 },
218
+ // ── 발트 3국 ──
219
+ { name: "\uD0C8\uB9B0", country: "\uC5D0\uC2A4\uD1A0\uB2C8\uC544", lat: 59.437, lon: 24.7536 },
220
+ { name: "\uB9AC\uAC00", country: "\uB77C\uD2B8\uBE44\uC544", lat: 56.9496, lon: 24.1052 },
221
+ { name: "\uBE4C\uB274\uC2A4", country: "\uB9AC\uD22C\uC544\uB2C8\uC544", lat: 54.6872, lon: 25.2797 },
222
+ // ── 동유럽 / CIS ──
223
+ { name: "\uBAA8\uC2A4\uD06C\uBC14", country: "\uB7EC\uC2DC\uC544", lat: 55.7558, lon: 37.6173 },
224
+ { name: "\uC0C1\uD2B8\uD398\uD14C\uB974\uBD80\uB974\uD06C", country: "\uB7EC\uC2DC\uC544", lat: 59.9311, lon: 30.3609 },
225
+ { name: "\uBE14\uB77C\uB514\uBCF4\uC2A4\uD1A0\uD06C", country: "\uB7EC\uC2DC\uC544", lat: 43.1332, lon: 131.9113 },
226
+ { name: "\uD0A4\uC774\uC6B0", country: "\uC6B0\uD06C\uB77C\uC774\uB098", lat: 50.4504, lon: 30.5245 },
227
+ { name: "\uBBFC\uC2A4\uD06C", country: "\uBCA8\uB77C\uB8E8\uC2A4", lat: 53.9006, lon: 27.559 },
228
+ { name: "\uD0A4\uC2DC\uB108\uC6B0", country: "\uBAB0\uB3C4\uBC14", lat: 47.0105, lon: 28.8638 },
229
+ // ── 북아메리카 ──
230
+ { name: "\uC6CC\uC2F1\uD134 D.C.", country: "\uBBF8\uAD6D", lat: 38.9072, lon: -77.0369 },
231
+ { name: "\uB274\uC695", country: "\uBBF8\uAD6D", lat: 40.7128, lon: -74.006 },
232
+ { name: "\uB85C\uC2A4\uC564\uC824\uB808\uC2A4", country: "\uBBF8\uAD6D", lat: 34.0522, lon: -118.2437 },
233
+ { name: "\uC2DC\uCE74\uACE0", country: "\uBBF8\uAD6D", lat: 41.8781, lon: -87.6298 },
234
+ { name: "\uC0CC\uD504\uB780\uC2DC\uC2A4\uCF54", country: "\uBBF8\uAD6D", lat: 37.7749, lon: -122.4194 },
235
+ { name: "\uC2DC\uC560\uD2C0", country: "\uBBF8\uAD6D", lat: 47.6062, lon: -122.3321 },
236
+ { name: "\uBCF4\uC2A4\uD134", country: "\uBBF8\uAD6D", lat: 42.3601, lon: -71.0589 },
237
+ { name: "\uD638\uB180\uB8F0\uB8E8", country: "\uBBF8\uAD6D", lat: 21.3069, lon: -157.8583 },
238
+ { name: "\uB77C\uC2A4\uBCA0\uC774\uAC70\uC2A4", country: "\uBBF8\uAD6D", lat: 36.1699, lon: -115.1398 },
239
+ { name: "\uB9C8\uC774\uC560\uBBF8", country: "\uBBF8\uAD6D", lat: 25.7617, lon: -80.1918 },
240
+ { name: "\uD734\uC2A4\uD134", country: "\uBBF8\uAD6D", lat: 29.7604, lon: -95.3698 },
241
+ { name: "\uB308\uB7EC\uC2A4", country: "\uBBF8\uAD6D", lat: 32.7767, lon: -96.797 },
242
+ { name: "\uC560\uD2C0\uB79C\uD0C0", country: "\uBBF8\uAD6D", lat: 33.749, lon: -84.388 },
243
+ { name: "\uB374\uBC84", country: "\uBBF8\uAD6D", lat: 39.7392, lon: -104.9903 },
244
+ { name: "\uC624\uD0C0\uC640", country: "\uCE90\uB098\uB2E4", lat: 45.4215, lon: -75.6972 },
245
+ { name: "\uD1A0\uB860\uD1A0", country: "\uCE90\uB098\uB2E4", lat: 43.6532, lon: -79.3832 },
246
+ { name: "\uBC34\uCFE0\uBC84", country: "\uCE90\uB098\uB2E4", lat: 49.2827, lon: -123.1207 },
247
+ { name: "\uBAAC\uD2B8\uB9AC\uC62C", country: "\uCE90\uB098\uB2E4", lat: 45.5017, lon: -73.5673 },
248
+ { name: "\uBA55\uC2DC\uCF54\uC2DC\uD2F0", country: "\uBA55\uC2DC\uCF54", lat: 19.4326, lon: -99.1332 },
249
+ { name: "\uCE78\uCFE4", country: "\uBA55\uC2DC\uCF54", lat: 21.1619, lon: -86.8515 },
250
+ // ── 카리브해 / 중앙아메리카 ──
251
+ { name: "\uC544\uBC14\uB098", country: "\uCFE0\uBC14", lat: 23.1136, lon: -82.3666 },
252
+ { name: "\uC0B0\uD1A0\uB3C4\uBC0D\uACE0", country: "\uB3C4\uBBF8\uB2C8\uCE74\uACF5\uD654\uAD6D", lat: 18.4861, lon: -69.9312 },
253
+ { name: "\uACFC\uD14C\uB9D0\uB77C\uC2DC\uD2F0", country: "\uACFC\uD14C\uB9D0\uB77C", lat: 14.6349, lon: -90.5069 },
254
+ { name: "\uC0B0\uD638\uC138", country: "\uCF54\uC2A4\uD0C0\uB9AC\uCE74", lat: 9.9281, lon: -84.0907 },
255
+ { name: "\uD30C\uB098\uB9C8\uC2DC\uD2F0", country: "\uD30C\uB098\uB9C8", lat: 8.9824, lon: -79.5199 },
256
+ { name: "\uC0B0\uD6C4\uC548", country: "\uD478\uC5D0\uB974\uD1A0\uB9AC\uCF54", lat: 18.4655, lon: -66.1057 },
257
+ { name: "\uD0B9\uC2A4\uD134", country: "\uC790\uBA54\uC774\uCE74", lat: 18.0179, lon: -76.8099 },
258
+ // ── 남아메리카 ──
259
+ { name: "\uBCF4\uACE0\uD0C0", country: "\uCF5C\uB86C\uBE44\uC544", lat: 4.711, lon: -74.0721 },
260
+ { name: "\uB9AC\uB9C8", country: "\uD398\uB8E8", lat: -12.0464, lon: -77.0428 },
261
+ { name: "\uD0A4\uD1A0", country: "\uC5D0\uCF70\uB3C4\uB974", lat: -0.1807, lon: -78.4678 },
262
+ { name: "\uC0B0\uD2F0\uC544\uACE0", country: "\uCE60\uB808", lat: -33.4489, lon: -70.6693 },
263
+ { name: "\uBD80\uC5D0\uB178\uC2A4\uC544\uC774\uB808\uC2A4", country: "\uC544\uB974\uD5E8\uD2F0\uB098", lat: -34.6037, lon: -58.3816 },
264
+ { name: "\uBAAC\uD14C\uBE44\uB370\uC624", country: "\uC6B0\uB8E8\uACFC\uC774", lat: -34.9011, lon: -56.1645 },
265
+ { name: "\uC544\uC21C\uC2DC\uC628", country: "\uD30C\uB77C\uACFC\uC774", lat: -25.2637, lon: -57.5759 },
266
+ { name: "\uB77C\uD30C\uC2A4", country: "\uBCFC\uB9AC\uBE44\uC544", lat: -16.4897, lon: -68.1193 },
267
+ { name: "\uBE0C\uB77C\uC9C8\uB9AC\uC544", country: "\uBE0C\uB77C\uC9C8", lat: -15.7975, lon: -47.8919 },
268
+ { name: "\uC0C1\uD30C\uC6B8\uB8E8", country: "\uBE0C\uB77C\uC9C8", lat: -23.5505, lon: -46.6333 },
269
+ { name: "\uB9AC\uC6B0\uB370\uC790\uB124\uC774\uB8E8", country: "\uBE0C\uB77C\uC9C8", lat: -22.9068, lon: -43.1729 },
270
+ { name: "\uCE74\uB77C\uCE74\uC2A4", country: "\uBCA0\uB124\uC218\uC5D8\uB77C", lat: 10.4806, lon: -66.9036 },
271
+ // ── 아프리카 ──
272
+ { name: "\uCE74\uC774\uB85C", country: "\uC774\uC9D1\uD2B8", lat: 30.0444, lon: 31.2357 },
273
+ { name: "\uB098\uC774\uB85C\uBE44", country: "\uCF00\uB0D0", lat: -1.2921, lon: 36.8219 },
274
+ { name: "\uC544\uB514\uC2A4\uC544\uBC14\uBC14", country: "\uC5D0\uD2F0\uC624\uD53C\uC544", lat: 9.025, lon: 38.7469 },
275
+ { name: "\uC544\uD06C\uB77C", country: "\uAC00\uB098", lat: 5.6037, lon: -0.187 },
276
+ { name: "\uB77C\uACE0\uC2A4", country: "\uB098\uC774\uC9C0\uB9AC\uC544", lat: 6.5244, lon: 3.3792 },
277
+ { name: "\uC544\uBD80\uC790", country: "\uB098\uC774\uC9C0\uB9AC\uC544", lat: 9.0579, lon: 7.4951 },
278
+ { name: "\uB2E4\uB974\uC5D0\uC2A4\uC0B4\uB78C", country: "\uD0C4\uC790\uB2C8\uC544", lat: -6.7924, lon: 39.2083 },
279
+ { name: "\uCF00\uC774\uD504\uD0C0\uC6B4", country: "\uB0A8\uC544\uD504\uB9AC\uCE74\uACF5\uD654\uAD6D", lat: -33.9249, lon: 18.4241 },
280
+ { name: "\uC694\uD558\uB124\uC2A4\uBC84\uADF8", country: "\uB0A8\uC544\uD504\uB9AC\uCE74\uACF5\uD654\uAD6D", lat: -26.2041, lon: 28.0473 },
281
+ { name: "\uC54C\uC81C", country: "\uC54C\uC81C\uB9AC", lat: 36.7538, lon: 3.0588 },
282
+ { name: "\uD280\uB2C8\uC2A4", country: "\uD280\uB2C8\uC9C0", lat: 36.8065, lon: 10.1815 },
283
+ { name: "\uB77C\uBC14\uD2B8", country: "\uBAA8\uB85C\uCF54", lat: 34.0209, lon: -6.8416 },
284
+ { name: "\uCE74\uC0AC\uBE14\uB791\uCE74", country: "\uBAA8\uB85C\uCF54", lat: 33.5731, lon: -7.5898 },
285
+ { name: "\uCE84\uD314\uB77C", country: "\uC6B0\uAC04\uB2E4", lat: 0.3476, lon: 32.5825 },
286
+ { name: "\uB8E8\uC0AC\uCE74", country: "\uC7A0\uBE44\uC544", lat: -15.3875, lon: 28.3228 },
287
+ { name: "\uD558\uB77C\uB808", country: "\uC9D0\uBC14\uBE0C\uC6E8", lat: -17.8252, lon: 31.0335 },
288
+ { name: "\uB9C8\uD478\uD22C", country: "\uBAA8\uC7A0\uBE44\uD06C", lat: -25.9692, lon: 32.5732 },
289
+ { name: "\uC548\uD0C0\uB098\uB098\uB9AC\uBCF4", country: "\uB9C8\uB2E4\uAC00\uC2A4\uCE74\uB974", lat: -18.8792, lon: 47.5079 },
290
+ // ── 오세아니아 ──
291
+ { name: "\uCE94\uBC84\uB77C", country: "\uD638\uC8FC", lat: -35.2809, lon: 149.13 },
292
+ { name: "\uC2DC\uB4DC\uB2C8", country: "\uD638\uC8FC", lat: -33.8688, lon: 151.2093 },
293
+ { name: "\uBA5C\uBC84\uB978", country: "\uD638\uC8FC", lat: -37.8136, lon: 144.9631 },
294
+ { name: "\uBE0C\uB9AC\uC988\uBC88", country: "\uD638\uC8FC", lat: -27.4698, lon: 153.0251 },
295
+ { name: "\uD37C\uC2A4", country: "\uD638\uC8FC", lat: -31.9505, lon: 115.8605 },
296
+ { name: "\uC6F0\uB9C1\uD134", country: "\uB274\uC9C8\uB79C\uB4DC", lat: -41.2866, lon: 174.7756 },
297
+ { name: "\uC624\uD074\uB79C\uB4DC", country: "\uB274\uC9C8\uB79C\uB4DC", lat: -36.8485, lon: 174.7633 }
298
+ ];
299
+ var SEOUL = KOREAN_CITIES[0];
300
+ function formatCityName(city) {
301
+ return city.country ? `${city.name}, ${city.country}` : city.name;
302
+ }
303
+ function filterCities(query) {
304
+ const q = query.trim();
305
+ if (!q) return [];
306
+ const chosung = isAllChosung(q);
307
+ const koreanResults = [];
308
+ const worldResults = [];
309
+ for (const city of KOREAN_CITIES) {
310
+ if (chosung ? matchChosung(city.name, q) : city.name.includes(q)) {
311
+ koreanResults.push(city);
312
+ }
313
+ }
314
+ for (const city of WORLD_CITIES) {
315
+ if (chosung) {
316
+ if (matchChosung(city.name, q)) worldResults.push(city);
317
+ } else {
318
+ const label = formatCityName(city);
319
+ if (label.includes(q)) worldResults.push(city);
320
+ }
321
+ }
322
+ return [...koreanResults, ...worldResults].slice(0, 8);
323
+ }
324
+
325
+ export {
326
+ KOREAN_CITIES,
327
+ WORLD_CITIES,
328
+ SEOUL,
329
+ formatCityName,
330
+ filterCities
331
+ };
@@ -0,0 +1,81 @@
1
+ import {
2
+ analyzeAllRelations,
3
+ getDaewoon,
4
+ getFourPillars,
5
+ getHiddenStems,
6
+ getJeonggi,
7
+ getRelation,
8
+ getSpecialSals,
9
+ getTwelveMeteor,
10
+ getTwelveSpirit
11
+ } from "./chunk-DGSIRAXF.js";
12
+
13
+ // src/saju.ts
14
+ function getSipsin(dayStem, targetStem) {
15
+ const rel = getRelation(dayStem, targetStem);
16
+ return rel ? rel.hanja : "?";
17
+ }
18
+ function calculateSaju(input) {
19
+ const { year, month, day, hour, minute, gender } = input;
20
+ const isMale = gender === "M";
21
+ const [yp, mp, dp, hp] = getFourPillars(year, month, day, hour, minute);
22
+ const dayStem = dp[0];
23
+ const stems = [hp[0], dp[0], mp[0], yp[0]];
24
+ const branches = [hp[1], dp[1], mp[1], yp[1]];
25
+ const ganzis = [hp, dp, mp, yp];
26
+ const pillars = ganzis.map((ganzi, i) => {
27
+ const stem = stems[i];
28
+ const branch = branches[i];
29
+ let stemSipsin = getSipsin(dayStem, stem);
30
+ if (i === 1) stemSipsin = "\u672C\u5143";
31
+ const jeonggi = getJeonggi(branch);
32
+ const branchSipsin = getSipsin(dayStem, jeonggi);
33
+ const unseong = getTwelveMeteor(dayStem, branch);
34
+ const sinsal = getTwelveSpirit(yp[1], branch);
35
+ const jigang = getHiddenStems(branch);
36
+ const pillar = { ganzi, stem, branch };
37
+ return {
38
+ pillar,
39
+ stemSipsin,
40
+ branchSipsin,
41
+ unseong,
42
+ sinsal,
43
+ jigang
44
+ };
45
+ });
46
+ const rawDaewoon = input.unknownTime ? [] : getDaewoon(isMale, year, month, day, hour, minute);
47
+ const yearBranch = yp[1];
48
+ const daewoon = rawDaewoon.map((dw, i) => {
49
+ const age = dw.startDate.getFullYear() - year;
50
+ const dwStem = dw.ganzi[0];
51
+ const dwBranch = dw.ganzi[1];
52
+ const dwStemSipsin = getSipsin(dayStem, dwStem);
53
+ const dwBranchJeonggi = getJeonggi(dwBranch);
54
+ const dwBranchSipsin = getSipsin(dayStem, dwBranchJeonggi);
55
+ const unseong = getTwelveMeteor(dayStem, dwBranch);
56
+ const sinsal = getTwelveSpirit(yearBranch, dwBranch);
57
+ return {
58
+ index: i + 1,
59
+ ganzi: dw.ganzi,
60
+ startDate: dw.startDate,
61
+ age,
62
+ stemSipsin: dwStemSipsin,
63
+ branchSipsin: dwBranchSipsin,
64
+ unseong,
65
+ sinsal
66
+ };
67
+ });
68
+ const relations = analyzeAllRelations(ganzis);
69
+ const specialSals = getSpecialSals(dayStem, dp, branches);
70
+ return {
71
+ input,
72
+ pillars,
73
+ daewoon,
74
+ relations,
75
+ specialSals
76
+ };
77
+ }
78
+
79
+ export {
80
+ calculateSaju
81
+ };