jskelet 0.2.4 → 0.3.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.
- package/CHANGELOG.md +403 -375
- package/docs/02-mimari.md +9 -3
- package/docs/03-routing.md +6 -0
- package/docs/06-cache.md +34 -12
- package/docs/07-yapilandirma.md +44 -21
- package/docs/11-tasima.md +1 -0
- package/docs/en/02-architecture.md +9 -3
- package/docs/en/03-routing.md +6 -0
- package/docs/en/06-caching.md +71 -72
- package/docs/en/07-configuration.md +44 -21
- package/docs/en/11-migration.md +1 -0
- package/package.json +1 -1
- package/src/client/{cache-panel → admin}/i18n.js +94 -8
- package/src/client/{cache-panel → admin}/login.html +2 -2
- package/src/client/{cache-panel → admin}/panel.css +49 -1
- package/src/client/admin/panel.html +486 -0
- package/src/client/{cache-panel → admin}/panel.js +333 -6
- package/src/config/defaults.js +16 -7
- package/src/config/index.js +38 -22
- package/src/log.mjs +58 -0
- package/src/server/admin/actions.js +229 -0
- package/src/server/admin/auth.js +125 -0
- package/src/server/admin/event-log.js +151 -0
- package/src/server/admin/gate.js +209 -0
- package/src/server/admin/inventory.js +188 -0
- package/src/server/admin/mount.js +56 -0
- package/src/server/admin/router.js +216 -0
- package/src/server/admin/snapshot.js +126 -0
- package/src/server/cloudflare.js +21 -9
- package/src/server/create-app.js +10 -6
- package/src/server/middleware/trailing-slash.js +53 -0
- package/src/client/cache-panel/panel.html +0 -308
- package/src/server/cache-panel.js +0 -759
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Admin panelinin sözlüğü.
|
|
3
3
|
*
|
|
4
4
|
* Panel build hattından geçmiyor, bu yüzden hazır bir i18n kütüphanesi yok:
|
|
5
5
|
* düz bir nesne, `{ad}` yer tutucusu ve `data-i18n` gezintisi kadarı yetiyor.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* sunucuya taşınmasının bir karşılığı yok.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
const STORAGE_KEY = "jskelet.
|
|
16
|
+
const STORAGE_KEY = "jskelet.admin.lang";
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Sözlükler. Dışa açık, çünkü testler iki dilin anahtar kümesinin birebir
|
|
@@ -24,12 +24,20 @@ const STORAGE_KEY = "jskelet.cache-panel.lang";
|
|
|
24
24
|
export const MESSAGES = {
|
|
25
25
|
en: {
|
|
26
26
|
/* --- kabuk --- */
|
|
27
|
+
"nav.overview": "Overview",
|
|
27
28
|
"nav.cache": "Cache",
|
|
29
|
+
"nav.routes": "Routes",
|
|
30
|
+
"nav.views": "Views",
|
|
31
|
+
"nav.logs": "Logs",
|
|
32
|
+
"nav.system": "System",
|
|
28
33
|
"shell.live": "live",
|
|
29
34
|
"shell.refresh": "Refresh",
|
|
30
35
|
"shell.signOut": "Sign out",
|
|
31
36
|
"shell.language": "Language",
|
|
32
37
|
"chip.up": "up {value}",
|
|
38
|
+
"chip.sse.live": "SSE live",
|
|
39
|
+
"chip.sse.off": "SSE off",
|
|
40
|
+
"chip.sse.error": "SSE error",
|
|
33
41
|
|
|
34
42
|
/* --- kartlar --- */
|
|
35
43
|
"card.htmlEntries": "HTML entries",
|
|
@@ -215,7 +223,7 @@ export const MESSAGES = {
|
|
|
215
223
|
"entries.copyKey": "Copy key",
|
|
216
224
|
|
|
217
225
|
/* --- alt bilgi --- */
|
|
218
|
-
"footer.panel": "
|
|
226
|
+
"footer.panel": "Admin panel",
|
|
219
227
|
"footer.rotates": "Password rotates on restart",
|
|
220
228
|
|
|
221
229
|
/* --- bildirimler --- */
|
|
@@ -268,14 +276,49 @@ export const MESSAGES = {
|
|
|
268
276
|
"msg.action.unknown": "Unknown action: {type}",
|
|
269
277
|
|
|
270
278
|
/* --- giriş --- */
|
|
271
|
-
"login.title": "
|
|
272
|
-
"login.lead": "This run's password is printed in the server log (<code>
|
|
279
|
+
"login.title": "Admin panel",
|
|
280
|
+
"login.lead": "This run's password is printed in the server log (<code>ADMIN</code> box).",
|
|
273
281
|
"login.placeholder": "32-character password",
|
|
274
282
|
"login.submit": "Unlock",
|
|
275
283
|
"login.hint": "Three failed attempts block this address for 24 hours.",
|
|
276
284
|
"login.tooMany": "Too many attempts.",
|
|
277
285
|
"login.invalid": "Invalid password.",
|
|
278
286
|
|
|
287
|
+
"upstream.section": "Upstream",
|
|
288
|
+
"upstream.host": "Host",
|
|
289
|
+
"upstream.rate": "Rate",
|
|
290
|
+
"upstream.state": "State",
|
|
291
|
+
"upstream.empty": "No upstream hosts tracked.",
|
|
292
|
+
|
|
293
|
+
"routes.section": "Registered routes",
|
|
294
|
+
"routes.method": "Method",
|
|
295
|
+
"routes.path": "Path",
|
|
296
|
+
"routes.lastStatus": "Last status",
|
|
297
|
+
"routes.lastMs": "Last ms",
|
|
298
|
+
"routes.hits": "Hits",
|
|
299
|
+
"routes.empty": "No routes.",
|
|
300
|
+
"routes.modules": "Route modules",
|
|
301
|
+
"routes.file": "File",
|
|
302
|
+
"routes.openLogs": "Logs",
|
|
303
|
+
|
|
304
|
+
"views.section": "Views",
|
|
305
|
+
"views.path": "Path",
|
|
306
|
+
"views.kind": "Kind",
|
|
307
|
+
"views.search": "Filter views…",
|
|
308
|
+
"views.empty": "No views.",
|
|
309
|
+
|
|
310
|
+
"logs.section": "Live logs",
|
|
311
|
+
"logs.search": "Search url / message…",
|
|
312
|
+
"logs.kind.all": "all kinds",
|
|
313
|
+
"logs.method.all": "all methods",
|
|
314
|
+
"logs.status.all": "all status",
|
|
315
|
+
"logs.cache.all": "all cache",
|
|
316
|
+
"logs.path": "path / route…",
|
|
317
|
+
"logs.pause": "pause",
|
|
318
|
+
"logs.clear": "Clear view",
|
|
319
|
+
"logs.empty": "No log lines.",
|
|
320
|
+
"logs.shown": "{shown} shown · {total} buffered",
|
|
321
|
+
|
|
279
322
|
/* --- birimler --- */
|
|
280
323
|
"unit.second": "s",
|
|
281
324
|
"unit.minute": "m",
|
|
@@ -285,12 +328,20 @@ export const MESSAGES = {
|
|
|
285
328
|
},
|
|
286
329
|
|
|
287
330
|
tr: {
|
|
331
|
+
"nav.overview": "Özet",
|
|
288
332
|
"nav.cache": "Önbellek",
|
|
333
|
+
"nav.routes": "Rotalar",
|
|
334
|
+
"nav.views": "Şablonlar",
|
|
335
|
+
"nav.logs": "Loglar",
|
|
336
|
+
"nav.system": "Sistem",
|
|
289
337
|
"shell.live": "canlı",
|
|
290
338
|
"shell.refresh": "Yenile",
|
|
291
339
|
"shell.signOut": "Çıkış",
|
|
292
340
|
"shell.language": "Dil",
|
|
293
341
|
"chip.up": "{value} açık",
|
|
342
|
+
"chip.sse.live": "SSE canlı",
|
|
343
|
+
"chip.sse.off": "SSE kapalı",
|
|
344
|
+
"chip.sse.error": "SSE hata",
|
|
294
345
|
|
|
295
346
|
"card.htmlEntries": "HTML girdisi",
|
|
296
347
|
"card.htmlMemory": "Bellekteki HTML",
|
|
@@ -466,7 +517,7 @@ export const MESSAGES = {
|
|
|
466
517
|
"entries.drop": "düşür",
|
|
467
518
|
"entries.copyKey": "Anahtarı kopyala",
|
|
468
519
|
|
|
469
|
-
"footer.panel": "
|
|
520
|
+
"footer.panel": "Yönetim paneli",
|
|
470
521
|
"footer.rotates": "Şifre her restart'ta değişir",
|
|
471
522
|
|
|
472
523
|
"toast.keyCopied": "Anahtar kopyalandı",
|
|
@@ -516,14 +567,49 @@ export const MESSAGES = {
|
|
|
516
567
|
"msg.prewarm.all": "Bütün yollar ısıtılıyor",
|
|
517
568
|
"msg.action.unknown": "Bilinmeyen işlem: {type}",
|
|
518
569
|
|
|
519
|
-
"login.title": "
|
|
520
|
-
"login.lead": "Bu turun şifresi sunucu
|
|
570
|
+
"login.title": "Yönetim paneli",
|
|
571
|
+
"login.lead": "Bu turun şifresi sunucu logundaki <code>ADMIN</code> kutusunda.",
|
|
521
572
|
"login.placeholder": "32 haneli şifre",
|
|
522
573
|
"login.submit": "Aç",
|
|
523
574
|
"login.hint": "Üç başarısız deneme bu adresi 24 saat engeller.",
|
|
524
575
|
"login.tooMany": "Çok fazla deneme.",
|
|
525
576
|
"login.invalid": "Şifre geçersiz.",
|
|
526
577
|
|
|
578
|
+
"upstream.section": "Upstream",
|
|
579
|
+
"upstream.host": "Host",
|
|
580
|
+
"upstream.rate": "Hız",
|
|
581
|
+
"upstream.state": "Durum",
|
|
582
|
+
"upstream.empty": "İzlenen upstream host yok.",
|
|
583
|
+
|
|
584
|
+
"routes.section": "Kayıtlı rotalar",
|
|
585
|
+
"routes.method": "Method",
|
|
586
|
+
"routes.path": "Yol",
|
|
587
|
+
"routes.lastStatus": "Son status",
|
|
588
|
+
"routes.lastMs": "Son ms",
|
|
589
|
+
"routes.hits": "İsabet",
|
|
590
|
+
"routes.empty": "Rota yok.",
|
|
591
|
+
"routes.modules": "Route modülleri",
|
|
592
|
+
"routes.file": "Dosya",
|
|
593
|
+
"routes.openLogs": "Loglar",
|
|
594
|
+
|
|
595
|
+
"views.section": "Şablonlar",
|
|
596
|
+
"views.path": "Yol",
|
|
597
|
+
"views.kind": "Tür",
|
|
598
|
+
"views.search": "Şablon ara…",
|
|
599
|
+
"views.empty": "Şablon yok.",
|
|
600
|
+
|
|
601
|
+
"logs.section": "Canlı loglar",
|
|
602
|
+
"logs.search": "url / mesaj ara…",
|
|
603
|
+
"logs.kind.all": "tüm türler",
|
|
604
|
+
"logs.method.all": "tüm methodlar",
|
|
605
|
+
"logs.status.all": "tüm status",
|
|
606
|
+
"logs.cache.all": "tüm cache",
|
|
607
|
+
"logs.path": "yol / rota…",
|
|
608
|
+
"logs.pause": "duraklat",
|
|
609
|
+
"logs.clear": "Görünümü temizle",
|
|
610
|
+
"logs.empty": "Log satırı yok.",
|
|
611
|
+
"logs.shown": "{shown} görünüyor · {total} tamponda",
|
|
612
|
+
|
|
527
613
|
"unit.second": "sn",
|
|
528
614
|
"unit.minute": "dk",
|
|
529
615
|
"unit.hour": "sa",
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet" />
|
|
7
7
|
<meta name="referrer" content="no-referrer" />
|
|
8
|
-
<title>
|
|
8
|
+
<title>Admin · JSkelet</title>
|
|
9
9
|
<link rel="icon" href="logo.png" />
|
|
10
10
|
<link rel="stylesheet" href="panel.css" />
|
|
11
11
|
</head>
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<span class="wordmark">JSkelet</span>
|
|
17
17
|
<span id="language"></span>
|
|
18
18
|
</div>
|
|
19
|
-
<h1 data-i18n="login.title">
|
|
19
|
+
<h1 data-i18n="login.title">Admin panel</h1>
|
|
20
20
|
<p data-i18n-html="login.lead"></p>
|
|
21
21
|
<input
|
|
22
22
|
id="password"
|
|
@@ -177,7 +177,8 @@ header .spacer {
|
|
|
177
177
|
|
|
178
178
|
.crumbs {
|
|
179
179
|
display: flex;
|
|
180
|
-
|
|
180
|
+
flex-wrap: wrap;
|
|
181
|
+
gap: 4px 10px;
|
|
181
182
|
align-items: center;
|
|
182
183
|
padding-left: 12px;
|
|
183
184
|
border-left: 1px solid var(--line);
|
|
@@ -185,6 +186,53 @@ header .spacer {
|
|
|
185
186
|
font-size: 13px;
|
|
186
187
|
}
|
|
187
188
|
|
|
189
|
+
.crumbs a {
|
|
190
|
+
color: var(--muted);
|
|
191
|
+
text-decoration: none;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.crumbs a:hover {
|
|
195
|
+
color: var(--text);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.crumbs a[aria-current="page"] {
|
|
199
|
+
color: var(--accent);
|
|
200
|
+
font-weight: 600;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.page[hidden] {
|
|
204
|
+
display: none !important;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.filters {
|
|
208
|
+
flex-wrap: wrap;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.log-scroll {
|
|
212
|
+
max-height: min(70vh, 640px);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.log-list {
|
|
216
|
+
margin: 0;
|
|
217
|
+
padding: 12px 14px;
|
|
218
|
+
overflow: auto;
|
|
219
|
+
color: var(--text);
|
|
220
|
+
font-size: 12px;
|
|
221
|
+
line-height: 1.45;
|
|
222
|
+
white-space: pre;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
button.linkish {
|
|
226
|
+
padding: 0;
|
|
227
|
+
border: 0;
|
|
228
|
+
background: none;
|
|
229
|
+
color: var(--accent);
|
|
230
|
+
font: inherit;
|
|
231
|
+
cursor: pointer;
|
|
232
|
+
text-decoration: underline;
|
|
233
|
+
text-underline-offset: 2px;
|
|
234
|
+
}
|
|
235
|
+
|
|
188
236
|
/* ------------------------------------------------------------------ footer */
|
|
189
237
|
|
|
190
238
|
footer {
|