jskelet 0.6.2 → 0.6.3

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 (155) hide show
  1. package/AGENTS.md +136 -136
  2. package/CHANGELOG.md +620 -596
  3. package/LICENSE +21 -21
  4. package/bin/jskelet.mjs +130 -130
  5. package/docs/01-baslangic.md +291 -291
  6. package/docs/02-mimari.md +310 -309
  7. package/docs/03-routing.md +515 -515
  8. package/docs/04-render-ve-sablonlar.md +661 -661
  9. package/docs/05-islands.md +486 -486
  10. package/docs/06-cache.md +1443 -1423
  11. package/docs/07-yapilandirma.md +12 -6
  12. package/docs/08-build.md +429 -428
  13. package/docs/09-dev-araclari.md +364 -364
  14. package/docs/10-dagitim.md +338 -338
  15. package/docs/12-panel-ve-oturum.md +478 -478
  16. package/docs/README.md +83 -83
  17. package/docs/en/01-getting-started.md +298 -298
  18. package/docs/en/02-architecture.md +329 -328
  19. package/docs/en/03-routing.md +531 -531
  20. package/docs/en/04-rendering.md +669 -669
  21. package/docs/en/05-islands.md +497 -497
  22. package/docs/en/06-caching.md +1453 -1431
  23. package/docs/en/07-configuration.md +1219 -1214
  24. package/docs/en/08-build.md +447 -446
  25. package/docs/en/09-dev-tools.md +373 -373
  26. package/docs/en/10-deployment.md +340 -340
  27. package/docs/en/11-migration.md +398 -398
  28. package/docs/en/12-dashboards-and-sessions.md +488 -488
  29. package/docs/en/README.md +87 -87
  30. package/package.json +137 -137
  31. package/src/build/ensure-build.mjs +19 -19
  32. package/src/build/paths.mjs +153 -153
  33. package/src/build/resolve-peer.mjs +36 -36
  34. package/src/build/tasks/client.mjs +349 -349
  35. package/src/build/tasks/css.mjs +235 -235
  36. package/src/build/tasks/fonts.mjs +146 -146
  37. package/src/build/tasks/icons.mjs +357 -357
  38. package/src/build/tasks/images.mjs +244 -244
  39. package/src/build/tasks/precompress.mjs +78 -78
  40. package/src/build/tasks/templates.mjs +20 -20
  41. package/src/client/admin/i18n.js +764 -764
  42. package/src/client/admin/login.html +74 -74
  43. package/src/client/admin/panel.css +809 -809
  44. package/src/client/admin/panel.html +495 -495
  45. package/src/client/admin/panel.js +1251 -1251
  46. package/src/client/devtools/report.html +185 -185
  47. package/src/client/devtools/report.js +745 -745
  48. package/src/client/devtools/seo.js +628 -628
  49. package/src/client/dom.js +95 -95
  50. package/src/client/form.js +192 -192
  51. package/src/client/index.js +45 -45
  52. package/src/client/registry.js +305 -305
  53. package/src/client/safe-image.js +91 -91
  54. package/src/client/shared-cookie.js +225 -225
  55. package/src/client/store.js +36 -36
  56. package/src/client/swap.js +188 -188
  57. package/src/compile/codegen.js +336 -336
  58. package/src/compile/compile-all.js +149 -149
  59. package/src/compile/errors.js +66 -66
  60. package/src/compile/expr.js +409 -409
  61. package/src/compile/index.js +17 -17
  62. package/src/compile/parse.js +541 -541
  63. package/src/compile/resolve.js +211 -211
  64. package/src/compile/scan-exports.js +51 -51
  65. package/src/config/defaults.js +17 -1
  66. package/src/config/index.js +13 -0
  67. package/src/config/pattern.js +107 -107
  68. package/src/generate.mjs +163 -163
  69. package/src/http/control-flow.js +71 -71
  70. package/src/http/cookies-entry.js +21 -21
  71. package/src/http/cookies.js +277 -277
  72. package/src/http/request-cache.js +46 -46
  73. package/src/http/request-context.js +165 -165
  74. package/src/http/shared-cookie.js +178 -178
  75. package/src/index.js +101 -101
  76. package/src/init.mjs +230 -230
  77. package/src/migrate/apply.mjs +262 -262
  78. package/src/migrate/babel.mjs +79 -79
  79. package/src/migrate/classify.mjs +155 -155
  80. package/src/migrate/config.mjs +126 -126
  81. package/src/migrate/fs-walk.mjs +191 -191
  82. package/src/migrate/parse.mjs +26 -26
  83. package/src/migrate/scan.mjs +177 -177
  84. package/src/migrate/transform/expr-source.mjs +168 -168
  85. package/src/migrate/transform/island.mjs +67 -67
  86. package/src/migrate/transform/jsx-to-component.mjs +302 -302
  87. package/src/migrate/transform/jsx-to-jsk.mjs +330 -330
  88. package/src/migrate/transform/page-split.mjs +435 -435
  89. package/src/migrate/write.mjs +81 -81
  90. package/src/migrate.mjs +171 -171
  91. package/src/runtime/alias-hooks.mjs +119 -119
  92. package/src/runtime/register.mjs +4 -4
  93. package/src/server/admin/actions.js +229 -229
  94. package/src/server/admin/auth.js +125 -125
  95. package/src/server/admin/event-log.js +151 -151
  96. package/src/server/admin/gate.js +209 -209
  97. package/src/server/admin/inventory.js +188 -188
  98. package/src/server/admin/mount.js +56 -56
  99. package/src/server/admin/router.js +216 -216
  100. package/src/server/admin/snapshot.js +241 -241
  101. package/src/server/assets.js +147 -147
  102. package/src/server/auth/handoff.js +309 -309
  103. package/src/server/cache-blob.js +70 -0
  104. package/src/server/cache-deps.js +42 -42
  105. package/src/server/cache-vary.js +113 -113
  106. package/src/server/cloudflare.js +607 -607
  107. package/src/server/create-app.js +366 -366
  108. package/src/server/data-cache.js +553 -462
  109. package/src/server/dev/report.js +485 -485
  110. package/src/server/dev/socket.js +170 -170
  111. package/src/server/dev/version-check.mjs +139 -139
  112. package/src/server/disk-cache.js +233 -0
  113. package/src/server/ejs-adapter.js +59 -59
  114. package/src/server/html-cache.js +1196 -1122
  115. package/src/server/image-optimizer.js +500 -407
  116. package/src/server/logs/access-middleware.js +66 -66
  117. package/src/server/logs/file-sink.js +193 -66
  118. package/src/server/logs/pipeline.js +165 -158
  119. package/src/server/logs/s3-put.js +214 -214
  120. package/src/server/logs/s3-sink.js +112 -112
  121. package/src/server/metadata.js +102 -102
  122. package/src/server/middleware/compression.js +205 -205
  123. package/src/server/middleware/csrf.js +134 -134
  124. package/src/server/middleware/dev-gate.js +75 -75
  125. package/src/server/middleware/headers.js +37 -37
  126. package/src/server/middleware/redirects.js +32 -32
  127. package/src/server/middleware/robots-txt.js +341 -341
  128. package/src/server/middleware/static-precompressed.js +121 -100
  129. package/src/server/middleware/trailing-slash.js +53 -53
  130. package/src/server/middleware/upstream-proxy.js +141 -141
  131. package/src/server/og-image.js +356 -356
  132. package/src/server/port-guard.js +255 -255
  133. package/src/server/prewarm.js +1082 -1058
  134. package/src/server/redis.js +588 -569
  135. package/src/server/render.js +4 -4
  136. package/src/server/router.js +157 -157
  137. package/src/server/status-page.js +265 -265
  138. package/src/server/upstream-limiter.js +376 -376
  139. package/src/server/upstream-tracking.js +166 -166
  140. package/src/shared/cookie-domain.js +66 -66
  141. package/src/start.mjs +22 -22
  142. package/src/templates/layout.ejs +30 -30
  143. package/src/templates/layout.jsk +30 -30
  144. package/src/version.mjs +31 -31
  145. package/src/views/components/loader.js +101 -101
  146. package/src/views/helpers/html.js +102 -102
  147. package/src/views/helpers/tags.js +375 -375
  148. package/types/config/defaults.d.ts +15 -1
  149. package/types/config/index.d.ts +8 -0
  150. package/types/server/cache-blob.d.ts +13 -0
  151. package/types/server/data-cache.d.ts +9 -0
  152. package/types/server/disk-cache.d.ts +36 -0
  153. package/types/server/html-cache.d.ts +26 -3
  154. package/types/server/logs/file-sink.d.ts +16 -5
  155. package/types/server/redis.d.ts +2 -1
@@ -139,6 +139,17 @@ export declare const HTML_CACHE_MAX_ENTRIES_CEILING = 800;
139
139
  * saklanmaz, yanıt yine gider.
140
140
  */
141
141
  export declare const HTML_CACHE_BYTE_BUDGET: number;
142
+ /**
143
+ * Süreç içi veri önbelleğinin JSON bayt tavanı (64 MB). Sayı tavanı
144
+ * şişman gövdeleri tutmaz; config yükseltemez. Tek değer bütçeden büyükse
145
+ * saklanmaz, çağıran sonucu yine alır.
146
+ */
147
+ export declare const DATA_CACHE_BYTE_BUDGET: number;
148
+ /**
149
+ * Uzak görsel disk önbelleğinin tavanı (256 MB). `.jskelet/image-cache/`
150
+ * bu boyutu aşınca en eski dosya düşer. Config yükseltemez.
151
+ */
152
+ export declare const IMAGE_CACHE_BYTE_BUDGET: number;
142
153
  /** `cache().data.maxEntries` için sert tavan. Uzun kuyruk burada durur, HTML'de değil. */
143
154
  export declare const DATA_CACHE_MAX_ENTRIES_CEILING = 20000;
144
155
  /**
@@ -262,7 +273,10 @@ export declare const DEFAULT_LOGS: {
262
273
  enabled: boolean;
263
274
  /** Proje köküne göre relative. */
264
275
  dir: string;
265
- /** Yalnızca günlük rotasyon. */
276
+ /**
277
+ * Artık kullanılmıyor. Parçalar en fazla 5 dakika durur; alan çözülen
278
+ * config'te durur ki eski okuyucular kırılmasın.
279
+ */
266
280
  rotate: "daily";
267
281
  };
268
282
  s3: {
@@ -45,11 +45,19 @@ export type LogsConfig = {
45
45
  * Sink'lere giden kayıt türleri.
46
46
  */
47
47
  kinds: LogKind[];
48
+ /**
49
+ * `rotate` durur; dosya parçaları en fazla 5 dakika tutulur.
50
+ */
48
51
  file: {
49
52
  enabled: boolean;
50
53
  dir: string;
51
54
  rotate: "daily";
52
55
  };
56
+ /**
57
+ * Mühürlenen zstd parçasını uygulamanın seçtiği yere aktarır. Hata
58
+ * siteyi düşürmez.
59
+ */
60
+ drainLog: import('../server/logs/file-sink.js').DrainLog | null;
53
61
  s3: {
54
62
  enabled: boolean;
55
63
  bucket: string | null;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Küçük gövde düz `string` döner (çağıran senkron yazabilsin). Büyük gövde
3
+ * brotli bitince çözülen bir Promise.
4
+ *
5
+ * @param {unknown} value
6
+ * @returns {string | Buffer | Promise<string | Buffer> | null}
7
+ */
8
+ export declare function encodeCacheValue(value: unknown): string | Buffer | Promise<string | Buffer> | null;
9
+ /**
10
+ * @param {Buffer | string} raw
11
+ * @returns {unknown}
12
+ */
13
+ export declare function decodeCacheValue(raw: Buffer | string): unknown;
@@ -2,6 +2,7 @@ export type DataEntry = {
2
2
  value: unknown;
3
3
  expiresAt: number;
4
4
  staleUntil: number;
5
+ bytes: number;
5
6
  };
6
7
  /**
7
8
  * Süreç ömrü boyunca biriken sayaçlar.
@@ -90,6 +91,14 @@ export declare function clearDataCache(prefix?: string): number;
90
91
  export declare function dropDataCacheKey(key: string): boolean;
91
92
  /** @returns {number} */
92
93
  export declare function getDataCacheSize(): number;
94
+ /**
95
+ * Bellek freninin bayt tavanını geçici olarak değiştirir. Testler LRU
96
+ * tahliyesini küçük bir değerle doğrular; `null` üretim tavanına döner.
97
+ *
98
+ * @param {number | null} bytes
99
+ * @returns {void}
100
+ */
101
+ export declare function setDataCacheByteBudget(bytes: number | null): void;
93
102
  /**
94
103
  * Süreç başından beri biriken sayaçlar. `produced` kotaya yazılan tek sayıdır:
95
104
  * geri kalan her şey upstream'e hiç gitmemiş bir okuma.
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @param {string | null} root Mutlak dizin, ya da config yoluna dönmek için `null`.
3
+ */
4
+ export declare function setDiskCacheRootForTests(root: string | null): void;
5
+ /**
6
+ * @param {"html" | "data"} kind
7
+ * @returns {boolean}
8
+ */
9
+ export declare function diskShares(kind: "html" | "data"): boolean;
10
+ /**
11
+ * @param {"html" | "data"} kind
12
+ * @param {string} key
13
+ * @returns {Promise<unknown | null>}
14
+ */
15
+ export declare function diskGetJson(kind: "html" | "data", key: string): Promise<unknown | null>;
16
+ /**
17
+ * Ateşle-unut. Dönüş değeri testler bekleyebilsin diye durur; istek yolu
18
+ * beklemez.
19
+ *
20
+ * @param {"html" | "data"} kind
21
+ * @param {string} key
22
+ * @param {unknown} value
23
+ * @returns {Promise<void>}
24
+ */
25
+ export declare function diskSetJson(kind: "html" | "data", key: string, value: unknown): Promise<void>;
26
+ /**
27
+ * @param {"html" | "data"} kind
28
+ * @param {string[]} keys
29
+ */
30
+ export declare function diskDrop(kind: "html" | "data", keys: string[]): void;
31
+ /**
32
+ * @param {"html" | "data"} kind
33
+ * @param {(key: string) => boolean} [match] Verilmezse türün tamamı silinir.
34
+ * @returns {Promise<number>}
35
+ */
36
+ export declare function diskDropMatching(kind: "html" | "data", match?: (key: string) => boolean): Promise<number>;
@@ -26,8 +26,8 @@
26
26
  * (L1) **birincil kalır**: `read()` senkron, sıkıştırılmış gövdeler girdiyle
27
27
  * birlikte ve tutarlılık makinesi (`tokens`, `purgedDeps`) tek proseste. Redis
28
28
  * yalnızca L1'de bulunmayan bir yol için render'ı atlatır ve invalidation'ı
29
- * diğer node'lara duyurur. Redis erişilemez olduğunda bu modül birebir eskisi
30
- * gibi çalışır.
29
+ * diğer node'lara duyurur. Redis yoksa aynı kayıt `.jskelet/cache/<buildId>/`
30
+ * altına yazılır; bu tek makinenin yeniden açılışını karşılar, kümeyi değil.
31
31
  */
32
32
  export type HtmlEntry = {
33
33
  html: string;
@@ -144,9 +144,10 @@ export declare function dropHtmlCacheKey(key: string): boolean;
144
144
  * açılmaz.
145
145
  *
146
146
  * @param {string} [onlyHost]
147
- * @returns {{ path: string, host: string }[]}
147
+ * @returns {{ key: string, path: string, host: string }[]}
148
148
  */
149
149
  export declare function takeInvalidatedTargets(onlyHost?: string): {
150
+ key: string;
150
151
  path: string;
151
152
  host: string;
152
153
  }[];
@@ -190,11 +191,33 @@ export declare function isHtmlCacheFresh(pathname: string, req?: {
190
191
  headers?: Record<string, unknown>;
191
192
  get?: (name: string) => string | undefined;
192
193
  }): boolean;
194
+ /**
195
+ * Bu anahtarın girdisi hâlâ taze mi? Süre dolumu ısıtması anahtarı bildiği
196
+ * için yol taraması yapmaz. Soft-bayat (`expiresAt === 0`) taze sayılmaz:
197
+ * ziyaretçi arada yenilediyse yeni `expiresAt` taze döner ve HTTP atlanır.
198
+ *
199
+ * @param {string} key
200
+ * @returns {boolean}
201
+ */
202
+ export declare function isHtmlCacheKeyFresh(key: string): boolean;
203
+ /**
204
+ * Girdide en fazla bir sıkıştırılmış gövde durur. Yeni kodlama eskisinin
205
+ * yerini alır; ham HTML kalır. Bayt sayacı `noteHtmlCacheGrowth` ile işlenir.
206
+ *
207
+ * @param {Map<string, Buffer>} encoded
208
+ * @param {string} encoding
209
+ * @param {Buffer} buffer
210
+ * @returns {void}
211
+ */
212
+ export declare function rememberHtmlEncoding(encoded: Map<string, Buffer>, encoding: string, buffer: Buffer): void;
193
213
  /**
194
214
  * Erken tazeleme penceresine girmiş (veya TTL'i dolmuş) trafiksiz girdileri
195
215
  * soft-bayatlatır ve ısıtma kuyruğuna alır. HTTP ısıtması producer'sız
196
216
  * çalıştığı için soft-bayat şart: taze HIT yenileme tetiklemez.
197
217
  *
218
+ * Tur başına en fazla `EARLY_SWEEP_MARK_BUDGET` girdi. Önce süresi en yakın
219
+ * dolacak olan; kota dolunca kalanlar bir sonraki tura kalır.
220
+ *
198
221
  * @returns {number} İşaretlenen girdi sayısı.
199
222
  */
200
223
  export declare function sweepEarlyExpiry(): number;
@@ -1,17 +1,28 @@
1
+ export type LogChunk = {
2
+ body: Buffer;
3
+ encoding: "zstd";
4
+ bytes: number;
5
+ lines: number;
6
+ at: number;
7
+ };
1
8
  export type LogSink = {
2
9
  write: (entry: Record<string, unknown>) => Promise<void>;
3
10
  flush: () => Promise<void>;
4
11
  close: () => Promise<void>;
5
12
  };
13
+ export type DrainLog = (chunk: LogChunk) => void | Promise<void>;
14
+ /** Diskteki parçaların ömrü. Config yükseltemez. */
15
+ export declare const FILE_LOG_RETENTION_MS: number;
6
16
  /**
7
- * @typedef {{ write: (entry: Record<string, unknown>) => Promise<void>,
8
- * flush: () => Promise<void>, close: () => Promise<void> }} LogSink
9
- */
10
- /**
11
- * @param {{ root: string, dir: string }} options
17
+ * @param {{ root: string, dir: string, persist?: boolean,
18
+ * retentionMs?: number, drainLog?: DrainLog | null }} options
19
+ * `persist: false` diske yazmaz; yalnız `drainLog` çağrılır.
12
20
  * @returns {LogSink}
13
21
  */
14
22
  export declare function createFileSink(options: {
15
23
  root: string;
16
24
  dir: string;
25
+ persist?: boolean;
26
+ retentionMs?: number;
27
+ drainLog?: DrainLog | null;
17
28
  }): LogSink;
@@ -56,7 +56,8 @@ export declare function cacheKey(kind: "html" | "data", key: string): string;
56
56
  export declare function redisGetJson(key: string): Promise<any | null>;
57
57
  /**
58
58
  * Ateşle-unut yazma. İsteğin yanıt yolunda beklenmez: HTML zaten L1'e
59
- * yazıldı, Redis kopyası yalnızca diğer node'lar için.
59
+ * yazıldı, Redis kopyası yalnızca diğer node'lar için. 1 KB ve üstü gövdeler
60
+ * brotli ile yazılır; okuma düz JSON'u da kabul eder.
60
61
  *
61
62
  * @param {string} key
62
63
  * @param {unknown} value