jskelet 0.2.5 → 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.
Files changed (106) hide show
  1. package/AGENTS.md +132 -132
  2. package/CHANGELOG.md +403 -383
  3. package/LICENSE +21 -21
  4. package/bin/jskelet.mjs +103 -103
  5. package/docs/01-baslangic.md +285 -285
  6. package/docs/02-mimari.md +293 -287
  7. package/docs/03-routing.md +486 -480
  8. package/docs/04-render-ve-sablonlar.md +490 -490
  9. package/docs/05-islands.md +482 -482
  10. package/docs/06-cache.md +1231 -1209
  11. package/docs/07-yapilandirma.md +44 -21
  12. package/docs/08-build.md +366 -366
  13. package/docs/09-dev-araclari.md +335 -335
  14. package/docs/10-dagitim.md +329 -329
  15. package/docs/11-tasima.md +1 -0
  16. package/docs/12-panel-ve-oturum.md +384 -384
  17. package/docs/README.md +105 -105
  18. package/docs/en/01-getting-started.md +292 -292
  19. package/docs/en/02-architecture.md +311 -305
  20. package/docs/en/03-routing.md +503 -497
  21. package/docs/en/04-rendering.md +504 -504
  22. package/docs/en/05-islands.md +492 -492
  23. package/docs/en/06-caching.md +1197 -1198
  24. package/docs/en/07-configuration.md +1009 -986
  25. package/docs/en/08-build.md +383 -383
  26. package/docs/en/09-dev-tools.md +342 -342
  27. package/docs/en/10-deployment.md +332 -332
  28. package/docs/en/11-migration.md +360 -359
  29. package/docs/en/12-dashboards-and-sessions.md +392 -392
  30. package/docs/en/README.md +112 -112
  31. package/package.json +102 -102
  32. package/src/build/ensure-build.mjs +15 -15
  33. package/src/build/paths.mjs +143 -143
  34. package/src/build/resolve-peer.mjs +36 -36
  35. package/src/build/tasks/client.mjs +268 -268
  36. package/src/build/tasks/css.mjs +124 -124
  37. package/src/build/tasks/fonts.mjs +146 -146
  38. package/src/build/tasks/icons.mjs +224 -224
  39. package/src/build/tasks/images.mjs +244 -244
  40. package/src/build/tasks/precompress.mjs +78 -78
  41. package/src/client/{cache-panel → admin}/i18n.js +756 -670
  42. package/src/client/{cache-panel → admin}/login.html +74 -74
  43. package/src/client/{cache-panel → admin}/panel.css +804 -756
  44. package/src/client/admin/panel.html +486 -0
  45. package/src/client/{cache-panel → admin}/panel.js +1242 -915
  46. package/src/client/devtools/report.html +185 -185
  47. package/src/client/devtools/report.js +725 -725
  48. package/src/client/dom.js +95 -95
  49. package/src/client/form.js +192 -192
  50. package/src/client/index.js +35 -35
  51. package/src/client/registry.js +297 -297
  52. package/src/client/safe-image.js +91 -91
  53. package/src/client/store.js +36 -36
  54. package/src/client/swap.js +188 -188
  55. package/src/config/defaults.js +16 -7
  56. package/src/config/index.js +38 -22
  57. package/src/config/pattern.js +107 -107
  58. package/src/http/control-flow.js +71 -71
  59. package/src/http/cookies.js +257 -257
  60. package/src/http/request-cache.js +46 -46
  61. package/src/http/request-context.js +162 -162
  62. package/src/index.js +83 -83
  63. package/src/init.mjs +221 -221
  64. package/src/log.mjs +58 -0
  65. package/src/runtime/alias-hooks.mjs +119 -119
  66. package/src/runtime/register.mjs +4 -4
  67. package/src/server/admin/actions.js +229 -0
  68. package/src/server/admin/auth.js +125 -0
  69. package/src/server/admin/event-log.js +151 -0
  70. package/src/server/admin/gate.js +209 -0
  71. package/src/server/admin/inventory.js +188 -0
  72. package/src/server/admin/mount.js +56 -0
  73. package/src/server/admin/router.js +216 -0
  74. package/src/server/admin/snapshot.js +126 -0
  75. package/src/server/assets.js +147 -147
  76. package/src/server/cache-deps.js +42 -42
  77. package/src/server/cloudflare.js +607 -607
  78. package/src/server/create-app.js +295 -291
  79. package/src/server/data-cache.js +462 -462
  80. package/src/server/dev/report.js +369 -369
  81. package/src/server/dev/socket.js +170 -170
  82. package/src/server/dev/version-check.mjs +139 -139
  83. package/src/server/html-cache.js +817 -817
  84. package/src/server/metadata.js +102 -102
  85. package/src/server/middleware/compression.js +205 -205
  86. package/src/server/middleware/csrf.js +134 -134
  87. package/src/server/middleware/dev-gate.js +62 -62
  88. package/src/server/middleware/headers.js +37 -37
  89. package/src/server/middleware/redirects.js +32 -32
  90. package/src/server/middleware/static-precompressed.js +100 -100
  91. package/src/server/middleware/trailing-slash.js +53 -0
  92. package/src/server/middleware/upstream-proxy.js +141 -141
  93. package/src/server/prewarm.js +601 -601
  94. package/src/server/redis.js +569 -569
  95. package/src/server/router.js +128 -128
  96. package/src/server/status-page.js +164 -164
  97. package/src/server/upstream-limiter.js +376 -376
  98. package/src/server/upstream-tracking.js +166 -166
  99. package/src/start.mjs +7 -7
  100. package/src/templates/layout.ejs +44 -44
  101. package/src/version.mjs +31 -31
  102. package/src/views/components/loader.js +85 -85
  103. package/src/views/helpers/html.js +102 -102
  104. package/src/views/helpers/tags.js +245 -245
  105. package/src/client/cache-panel/panel.html +0 -308
  106. package/src/server/cache-panel.js +0 -759
@@ -53,6 +53,7 @@ export default {
53
53
 
54
54
  layout: "views/layout.ejs",
55
55
  routes: ["./routes/10-pages.mjs", "./routes/99-catch-all.mjs"],
56
+ trailingSlash: false,
56
57
 
57
58
  static: {
58
59
  extensions: [".svg", ".png", ".webp", ".avif", ".ico", ".woff2"],
@@ -214,6 +215,29 @@ Ayrıntı: [03-routing.md](./03-routing.md).
214
215
  routes: ["./routes/api.js", "./routes/pages.js", "./routes/catch-all.js"]
215
216
  ```
216
217
 
218
+ ## `trailingSlash`
219
+
220
+ **Tip:** `boolean` — **Varsayılan:** `false`
221
+
222
+ `true` iken kanonik URL'ler `/` ile biter: `/hakkinda/` doğrudan **200**
223
+ döner; slash'sız `/hakkinda` **308** ile `/hakkinda/` adresine gider (301
224
+ değil — metodu koruyan kalıcı yönlendirme, framework'ün diğer `permanent`
225
+ redirect'leriyle aynı). Query string korunur.
226
+
227
+ İstisnalar: kök `/`, uzantılı dosya yolları (`/robots.txt`, `/assets/app.js`)
228
+ ve `/.well-known/**`. Bunlara slash eklenmez.
229
+
230
+ `false` iken (varsayılan) slash dayatılmaz. Express non-strict eşleşme ile
231
+ `/x` ve `/x/` ikisi de 200 olabilir — Next.js'in varsayılan "slash'ı kırp"
232
+ davranışından bilinçli fark; mevcut siteleri kırmamak için.
233
+
234
+ Açıkken şablonlardaki `href`, sitemap ve `redirects()` hedeflerini de
235
+ slash'lı yazın; aksi hâlde tarayıcı her tıklamada ekstra bir 308 görür.
236
+
237
+ ```js
238
+ trailingSlash: true
239
+ ```
240
+
217
241
  ## `static`
218
242
 
219
243
  **Tip:** `{ extensions?: string[], prefixes?: string[] }` — **Varsayılan:**
@@ -728,33 +752,38 @@ redis: {
728
752
  }
729
753
  ```
730
754
 
731
- ### `cache().panel`
755
+ ### `admin()`
732
756
 
733
- Önbellek yönetim paneli. Bellek içi kademenin ve Redis kademesinin durumunu
734
- gösterir; hedefli invalidation, tek girdi silme ve ısıtma tetikler.
757
+ Framework yönetim paneli (`/_jskelet/admin`). Bellek içi / Redis / Cloudflare
758
+ önbelleğini yönetir; route ve view envanteri ile canlı log kuyruğu sunar.
735
759
 
736
760
  Ortama bakmaz: `enabled` verilmedikçe **hiç mount edilmez** ve yol da yoktur.
737
761
  Açıkken production'da da çalışır — asıl sorular ("bu sayfa neden bayat",
738
- "webhook purge'ü geçti mi") orada soruluyor.
762
+ "webhook purge'ü geçti mi") orada soruluyor. `cache()` bölümünden ayrıdır.
739
763
 
740
764
  | Alan | Tip | Varsayılan | Anlamı |
741
765
  | --- | --- | --- | --- |
742
- | `enabled` | `boolean` | `false` | Yalnızca açıkça `true` verildiğinde açılır (`JSKELET_CACHE_PANEL` ezer) |
743
- | `basePath` | `string` | `"/_jskelet/cache"` | Panelin kökü |
766
+ | `enabled` | `boolean` | `false` | Yalnızca açıkça `true` verildiğinde açılır (`JSKELET_ADMIN` ezer) |
767
+ | `basePath` | `string` | `"/_jskelet/admin"` | Panelin kökü |
768
+ | `allowIps` | `string[]` | `[]` | Exact IP veya CIDR; boş = kısıt yok. Listede olmayan her istek 404 |
769
+ | `blockBots` | `boolean` | `true` | Bilinen crawler UA'ları 404 |
744
770
  | `banAttempts` | `number` | `3` | Kaç başarısız denemeden sonra IP yasaklanır |
745
771
  | `banHours` | `number` | `24` | Yasağın süresi |
746
772
  | `sessionHours` | `number` | `12` | Oturum çerezinin ömrü |
773
+ | `logSize` | `number` | `500` | Canlı log ring boyutu |
747
774
 
748
- Şifre **her süreç başlangıcında** üretilir ve yalnızca sunucu logunda görünür:
775
+ Şifre **her süreç başlangıcında** üretilir ve yalnızca sunucu logundaki
776
+ `ADMIN` kutusunda görünür. Yasaklı ve yetkisiz her cevap `404`'tür. Kullanım
777
+ ve ekran ayrıntıları: [06-cache.md](./06-cache.md).
749
778
 
779
+ ```js
780
+ admin() {
781
+ return {
782
+ enabled: process.env.JSKELET_ADMIN === "1",
783
+ allowIps: ["203.0.113.10", "10.0.0.0/8"],
784
+ };
785
+ }
750
786
  ```
751
- [cache-panel] http://localhost:3000/_jskelet/cache — password for this run: 3f9c…
752
- ```
753
-
754
- Kalıcı bir sır (config alanı ya da env) tutulmaz; sızması önbelleği boşaltma
755
- yetkisi demek ve her deploy eski erişimi kendiliğinden iptal etmeli. Yasaklı ve
756
- yetkisiz her cevap `404`'tür. Kullanım ve ekran ayrıntıları:
757
- [06-cache.md](./06-cache.md).
758
787
 
759
788
  ### `cache().cloudflare`
760
789
 
@@ -780,12 +809,6 @@ hata dönerse ilgili bölüm hatayı yazar ve panelin kalanı çalışmaya devam
780
809
  Neyin sorulabildiği — özellikle "bu sayfa kaç edge'de cache'li" sorusunun neden
781
810
  tam cevabı olmadığı — [06-cache.md](./06-cache.md) içinde.
782
811
 
783
- ```js
784
- panel: {
785
- enabled: process.env.CACHE_PANEL === "1",
786
- }
787
- ```
788
-
789
812
  ### `cache().prewarm`
790
813
 
791
814
  | Alan | Tip | Varsayılan | Anlamı |
@@ -909,7 +932,7 @@ basılmaz.
909
932
  | `HOST` | `startServer` | `::` | Bağlanılacak arayüz. Varsayılan çift yığın dinler (IPv6 + IPv4); IPv6 yoksa `0.0.0.0`'a düşer |
910
933
  | `JSKELET_SECRET` | `jskelet/cookies` | — | İmzalı cookie sırrı. `security.cookieSecret` verilmediğinde buradan okunur; ikisi de yoksa imzalı cookie API'si hata verir. [12](./12-panel-ve-oturum.md) |
911
934
  | `DEV_TOKEN` | `devGate`, `prewarm` | — | Ayarlıysa token taşımayan her isteğe 404 döner. Isıtma token'ı çerez olarak taşır. [09](./09-dev-araclari.md) |
912
- | `JSKELET_CACHE_PANEL` | `createApp` | — | Ayarlıysa önbellek panelini açar; `0` config'te açık olan paneli kapatır. Env config'i ezer, çünkü panel genelde bir arıza sırasında tek seferlik açılır. [06](./06-cache.md) |
935
+ | `JSKELET_ADMIN` | `createApp` | — | Ayarlıysa yönetim panelini açar; `0` config'te açık olan paneli kapatır. Env config'i ezer, çünkü panel genelde bir arıza sırasında tek seferlik açılır. [06](./06-cache.md) |
913
936
  | `JSKELET_CLOUDFLARE_KEY` | Cloudflare cache yüzeyi | — | API token. Verilene kadar CDN purge'ü ve edge analitiği kapalıdır; config'teki `apiToken`'ı ezer. Token hiçbir cevapta dönmez. [06](./06-cache.md) |
914
937
  | `JSKELET_CLOUDFLARE_ZONE_ID` | Cloudflare cache yüzeyi | — | Zone kimliği. Token'la birlikte verilmedikçe hiçbir Cloudflare ucu çağrılmaz |
915
938
  | `JSKELET_CLOUDFLARE_HOSTNAME` | Cloudflare cache yüzeyi | — | Purge URL'lerinin kökü. Panel iç bir adresten açılıyorsa gerekir |