jskelet 0.5.4 → 0.6.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 (149) hide show
  1. package/AGENTS.md +18 -13
  2. package/CHANGELOG.md +387 -385
  3. package/README.md +9 -7
  4. package/bin/jskelet.mjs +24 -10
  5. package/docs/01-baslangic.md +4 -3
  6. package/docs/02-mimari.md +4 -3
  7. package/docs/03-routing.md +11 -6
  8. package/docs/04-render-ve-sablonlar.md +35 -43
  9. package/docs/05-islands.md +12 -8
  10. package/docs/07-yapilandirma.md +53 -25
  11. package/docs/08-build.md +40 -18
  12. package/docs/09-dev-araclari.md +5 -1
  13. package/docs/10-dagitim.md +6 -1
  14. package/docs/11-tasima.md +51 -17
  15. package/docs/12-panel-ve-oturum.md +10 -4
  16. package/docs/README.md +7 -5
  17. package/docs/en/01-getting-started.md +4 -3
  18. package/docs/en/02-architecture.md +5 -5
  19. package/docs/en/03-routing.md +12 -7
  20. package/docs/en/04-rendering.md +47 -59
  21. package/docs/en/05-islands.md +13 -8
  22. package/docs/en/07-configuration.md +55 -27
  23. package/docs/en/08-build.md +43 -21
  24. package/docs/en/09-dev-tools.md +6 -1
  25. package/docs/en/10-deployment.md +6 -1
  26. package/docs/en/11-migration.md +51 -16
  27. package/docs/en/12-dashboards-and-sessions.md +9 -4
  28. package/docs/en/README.md +7 -5
  29. package/package.json +49 -14
  30. package/src/build/tasks/client.mjs +91 -10
  31. package/src/build/tasks/icons.mjs +152 -18
  32. package/src/client/index.js +2 -2
  33. package/src/compile/codegen.js +4 -0
  34. package/src/compile/compile-all.js +12 -21
  35. package/src/compile/expr.js +5 -0
  36. package/src/compile/parse.js +64 -8
  37. package/src/compile/resolve.js +3 -0
  38. package/src/config/defaults.js +12 -2
  39. package/src/config/index.js +31 -3
  40. package/src/dev-server.mjs +26 -3
  41. package/src/http/cookies-entry.js +1 -0
  42. package/src/http/cookies.js +18 -0
  43. package/src/logo.png +0 -0
  44. package/src/migrate/apply.mjs +262 -0
  45. package/src/migrate/babel.mjs +79 -0
  46. package/src/migrate/classify.mjs +155 -0
  47. package/src/migrate/config.mjs +126 -0
  48. package/src/migrate/fs-walk.mjs +191 -0
  49. package/src/migrate/parse.mjs +26 -0
  50. package/src/migrate/scan.mjs +177 -0
  51. package/src/migrate/transform/expr-source.mjs +168 -0
  52. package/src/migrate/transform/island.mjs +67 -0
  53. package/src/migrate/transform/jsx-to-component.mjs +302 -0
  54. package/src/migrate/transform/jsx-to-jsk.mjs +330 -0
  55. package/src/migrate/transform/page-split.mjs +435 -0
  56. package/src/migrate/write.mjs +81 -0
  57. package/src/migrate.mjs +171 -0
  58. package/src/server/auth/handoff.js +94 -11
  59. package/src/server/create-app.js +28 -10
  60. package/src/server/ejs-adapter.js +59 -0
  61. package/src/server/image-optimizer.js +94 -26
  62. package/src/server/port-guard.js +255 -0
  63. package/src/server/render.js +27 -9
  64. package/src/server/status-page.js +105 -4
  65. package/src/start.mjs +18 -3
  66. package/src/templates/layout.ejs +8 -28
  67. package/src/templates/layout.jsk +30 -0
  68. package/src/templates/layout.render.js +41 -0
  69. package/src/views/helpers/tags.js +86 -3
  70. package/types/build/resolve-peer.d.mts +13 -0
  71. package/types/client/dom.d.ts +55 -0
  72. package/types/client/form.d.ts +19 -0
  73. package/types/client/index.d.ts +20 -0
  74. package/types/client/registry.d.ts +53 -0
  75. package/types/client/safe-image.d.ts +19 -0
  76. package/types/client/shared-cookie.d.ts +82 -0
  77. package/types/client/store.d.ts +18 -0
  78. package/types/client/swap.d.ts +46 -0
  79. package/types/compile/codegen.d.ts +32 -0
  80. package/types/compile/compile-all.d.ts +42 -0
  81. package/types/compile/errors.d.ts +30 -0
  82. package/types/compile/expr.d.ts +67 -0
  83. package/types/compile/index.d.ts +10 -0
  84. package/types/compile/parse.d.ts +82 -0
  85. package/types/compile/resolve.d.ts +46 -0
  86. package/types/compile/scan-exports.d.ts +9 -0
  87. package/types/config/defaults.d.ts +449 -0
  88. package/types/config/index.d.ts +299 -0
  89. package/types/config/pattern.d.ts +38 -0
  90. package/types/http/control-flow.d.ts +45 -0
  91. package/types/http/cookies-entry.d.ts +5 -0
  92. package/types/http/cookies.d.ts +113 -0
  93. package/types/http/request-cache.d.ts +13 -0
  94. package/types/http/request-context.d.ts +67 -0
  95. package/types/http/shared-cookie.d.ts +73 -0
  96. package/types/index.d.ts +30 -0
  97. package/types/log.d.mts +153 -0
  98. package/types/server/admin/actions.d.ts +16 -0
  99. package/types/server/admin/auth.d.ts +52 -0
  100. package/types/server/admin/event-log.d.ts +38 -0
  101. package/types/server/admin/gate.d.ts +43 -0
  102. package/types/server/admin/inventory.d.ts +40 -0
  103. package/types/server/admin/mount.d.ts +6 -0
  104. package/types/server/admin/router.d.ts +6 -0
  105. package/types/server/admin/snapshot.d.ts +6 -0
  106. package/types/server/assets.d.ts +47 -0
  107. package/types/server/auth/handoff.d.ts +12 -0
  108. package/types/server/cache-deps.d.ts +16 -0
  109. package/types/server/cache-vary.d.ts +30 -0
  110. package/types/server/cloudflare.d.ts +163 -0
  111. package/types/server/create-app.d.ts +25 -0
  112. package/types/server/data-cache.d.ts +116 -0
  113. package/types/server/dev/devtools.d.ts +44 -0
  114. package/types/server/dev/report.d.ts +229 -0
  115. package/types/server/dev/socket.d.ts +17 -0
  116. package/types/server/dev/version-check.d.mts +15 -0
  117. package/types/server/ejs-adapter.d.ts +11 -0
  118. package/types/server/head-hints.d.ts +40 -0
  119. package/types/server/html-cache.d.ts +173 -0
  120. package/types/server/image-optimizer.d.ts +68 -0
  121. package/types/server/logs/access-middleware.d.ts +7 -0
  122. package/types/server/logs/file-sink.d.ts +17 -0
  123. package/types/server/logs/pipeline.d.ts +37 -0
  124. package/types/server/logs/s3-put.d.ts +85 -0
  125. package/types/server/logs/s3-sink.d.ts +26 -0
  126. package/types/server/metadata.d.ts +38 -0
  127. package/types/server/middleware/compression.d.ts +17 -0
  128. package/types/server/middleware/csrf.d.ts +4 -0
  129. package/types/server/middleware/dev-gate.d.ts +2 -0
  130. package/types/server/middleware/headers.d.ts +2 -0
  131. package/types/server/middleware/redirects.d.ts +2 -0
  132. package/types/server/middleware/static-precompressed.d.ts +5 -0
  133. package/types/server/middleware/trailing-slash.d.ts +11 -0
  134. package/types/server/middleware/upstream-proxy.d.ts +21 -0
  135. package/types/server/og-image.d.ts +149 -0
  136. package/types/server/port-guard.d.ts +50 -0
  137. package/types/server/prewarm.d.ts +128 -0
  138. package/types/server/redis.d.ts +163 -0
  139. package/types/server/render.d.ts +101 -0
  140. package/types/server/router.d.ts +5 -0
  141. package/types/server/status-page.d.ts +24 -0
  142. package/types/server/upstream-limiter.d.ts +123 -0
  143. package/types/server/upstream-tracking.d.ts +42 -0
  144. package/types/shared/cookie-domain.d.ts +29 -0
  145. package/types/templates/layout.render.d.ts +7 -0
  146. package/types/version.d.mts +10 -0
  147. package/types/views/components/loader.d.ts +5 -0
  148. package/types/views/helpers/html.d.ts +39 -0
  149. package/types/views/helpers/tags.d.ts +127 -0
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @returns {import('../config/index.js').ImagesRemoteConfig | null}
3
+ */
4
+ export declare function getRemoteImages(): import('../config/index.js').ImagesRemoteConfig | null;
5
+ /**
6
+ * Mutlak http(s) URL mi ve allowHosts'ta mı.
7
+ * @param {string} src
8
+ * @returns {URL | null}
9
+ */
10
+ export declare function parseAllowedRemoteUrl(src: string): URL | null;
11
+ /**
12
+ * Host allowlist + literal private IP; redirect hop'larında da kullanılır.
13
+ *
14
+ * @param {URL} url
15
+ * @param {string[]} allowHosts
16
+ * @returns {boolean}
17
+ */
18
+ export declare function isRemoteUrlShapeAllowed(url: URL, allowHosts: string[]): boolean;
19
+ /**
20
+ * Hostname'i çözümleyip private IP'ye düşüyorsa reddet (DNS rebinding
21
+ * savunması; TOCTOU kalır ama check-time private resolve yakalanır).
22
+ *
23
+ * @param {string} hostname
24
+ * @returns {Promise<boolean>} true = güvenli
25
+ */
26
+ export declare function assertResolvedHostSafe(hostname: string): Promise<boolean>;
27
+ /**
28
+ * @param {string} hostname
29
+ * @param {string[]} allowHosts
30
+ * @returns {boolean}
31
+ */
32
+ export declare function isHostAllowed(hostname: string, allowHosts: string[]): boolean;
33
+ /**
34
+ * Literal private / link-local / loopback host'ları reddet (SSRF).
35
+ * Allowlist asıl koruma; bu ek bir savunma katmanı.
36
+ * @param {string} hostname
37
+ * @returns {boolean}
38
+ */
39
+ export declare function isBlockedAddress(hostname: string): boolean;
40
+ /**
41
+ * Optimizer URL'si üret. `image()` ve elle URL kuran uygulamalar için.
42
+ * @param {string} src Uzak görsel URL'si
43
+ * @param {{ width: number, quality?: number }} options
44
+ * @returns {string | null} Allowlist dışıysa null
45
+ */
46
+ export declare function remoteImageUrl(src: string, options: {
47
+ width: number;
48
+ quality?: number;
49
+ }): string | null;
50
+ /**
51
+ * @param {number} width
52
+ * @param {number} maxWidth
53
+ * @returns {number}
54
+ */
55
+ export declare function clampWidth(width: number, maxWidth: number): number;
56
+ /**
57
+ * Görüntülenen genişliğe göre srcset adayları (1x + 2x + config widths).
58
+ * @param {number} displayWidth
59
+ * @param {number[]} widths
60
+ * @param {number} maxWidth
61
+ * @returns {number[]}
62
+ */
63
+ export declare function srcsetWidths(displayWidth: number, widths: number[], maxWidth: number): number[];
64
+ /**
65
+ * @param {import('express').Express} app
66
+ * @returns {Promise<void>}
67
+ */
68
+ export declare function mountImageOptimizer(app: import('express').Express): Promise<void>;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @param {{ basePath?: string }} [options]
3
+ * @returns {import('express').RequestHandler}
4
+ */
5
+ export declare function accessLogMiddleware(options?: {
6
+ basePath?: string;
7
+ }): import('express').RequestHandler;
@@ -0,0 +1,17 @@
1
+ export type LogSink = {
2
+ write: (entry: Record<string, unknown>) => Promise<void>;
3
+ flush: () => Promise<void>;
4
+ close: () => Promise<void>;
5
+ };
6
+ /**
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
12
+ * @returns {LogSink}
13
+ */
14
+ export declare function createFileSink(options: {
15
+ root: string;
16
+ dir: string;
17
+ }): LogSink;
@@ -0,0 +1,37 @@
1
+ export type LogsConfig = import('../../config/index.js').LogsConfig;
2
+ export type ResolvedConfig = import('../../config/index.js').ResolvedConfig;
3
+ export type LogSink = import('./file-sink.js').LogSink;
4
+ /**
5
+ * Access middleware mount edilmeli mi?
6
+ *
7
+ * Dev'de yalnızca console isteniyorsa mount edilmez — HTML satırlarını
8
+ * zaten devtools basıyor; çift kayıt olmasın. Sink açıksa ya da production
9
+ * console access log istiyorsa mount edilir.
10
+ *
11
+ * @param {LogsConfig} logs
12
+ * @returns {boolean}
13
+ */
14
+ export declare function shouldMountAccessLog(logs: LogsConfig): boolean;
15
+ /**
16
+ * @param {ResolvedConfig} config
17
+ * @returns {Promise<{ accessLog: boolean }>}
18
+ */
19
+ export declare function configureLogs(config: ResolvedConfig): Promise<{
20
+ accessLog: boolean;
21
+ }>;
22
+ /**
23
+ * Access middleware ve `log.subscribe` ortak giriş noktası.
24
+ *
25
+ * @param {Record<string, unknown>} raw
26
+ */
27
+ export declare function acceptLogEntry(raw: Record<string, unknown>): void;
28
+ /**
29
+ * Kapanışta buffer'ları boşaltır.
30
+ *
31
+ * @returns {Promise<void>}
32
+ */
33
+ export declare function flushLogs(): Promise<void>;
34
+ /**
35
+ * @returns {Promise<void>}
36
+ */
37
+ export declare function closeLogs(): Promise<void>;
@@ -0,0 +1,85 @@
1
+ export type AwsCredentials = {
2
+ accessKeyId: string;
3
+ secretAccessKey: string;
4
+ sessionToken?: string | null;
5
+ };
6
+ export type PutObjectInput = {
7
+ bucket: string;
8
+ key: string;
9
+ body: string | Buffer;
10
+ region: string;
11
+ endpoint?: string | null;
12
+ credentials: AwsCredentials;
13
+ now?: Date;
14
+ };
15
+ /**
16
+ * @param {string | Buffer} data
17
+ * @returns {string}
18
+ */
19
+ export declare function sha256Hex(data: string | Buffer): string;
20
+ /**
21
+ * @param {Date} date
22
+ * @returns {{ amzDate: string, dateStamp: string }}
23
+ */
24
+ export declare function formatAmzDates(date: Date): {
25
+ amzDate: string;
26
+ dateStamp: string;
27
+ };
28
+ /**
29
+ * @param {string} secretAccessKey
30
+ * @param {string} dateStamp
31
+ * @param {string} region
32
+ * @param {string} service
33
+ * @returns {Buffer}
34
+ */
35
+ export declare function deriveSigningKey(secretAccessKey: string, dateStamp: string, region: string, service: string): Buffer;
36
+ /**
37
+ * @param {{ method: string, canonicalUri: string, canonicalQuerystring?: string,
38
+ * headers: Record<string, string>, payloadHash: string }} parts
39
+ * @returns {{ canonicalRequest: string, signedHeaders: string }}
40
+ */
41
+ export declare function buildCanonicalRequest(parts: {
42
+ method: string;
43
+ canonicalUri: string;
44
+ canonicalQuerystring?: string;
45
+ headers: Record<string, string>;
46
+ payloadHash: string;
47
+ }): {
48
+ canonicalRequest: string;
49
+ signedHeaders: string;
50
+ };
51
+ /**
52
+ * @param {{ amzDate: string, dateStamp: string, region: string, service: string,
53
+ * canonicalRequest: string }} parts
54
+ * @returns {string}
55
+ */
56
+ export declare function buildStringToSign(parts: {
57
+ amzDate: string;
58
+ dateStamp: string;
59
+ region: string;
60
+ service: string;
61
+ canonicalRequest: string;
62
+ }): string;
63
+ /**
64
+ * URI path encode (S3 key segment'leri). `/` korunur.
65
+ *
66
+ * @param {string} value
67
+ * @returns {string}
68
+ */
69
+ export declare function encodeS3Path(value: string): string;
70
+ /**
71
+ * PutObject isteğini imzalar; ağ çağrısı yapmaz — test edilebilir olsun diye.
72
+ *
73
+ * @param {PutObjectInput} input
74
+ * @returns {{ url: string, headers: Record<string, string>, body: Buffer }}
75
+ */
76
+ export declare function buildSignedPutObject(input: PutObjectInput): {
77
+ url: string;
78
+ headers: Record<string, string>;
79
+ body: Buffer;
80
+ };
81
+ /**
82
+ * @param {PutObjectInput} input
83
+ * @returns {Promise<void>}
84
+ */
85
+ export declare function putObject(input: PutObjectInput): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { putObject } from "./s3-put.js";
2
+ export type LogSink = import('./file-sink.js').LogSink;
3
+ export type AwsCredentials = import('./s3-put.js').AwsCredentials;
4
+ /**
5
+ * @typedef {import('./file-sink.js').LogSink} LogSink
6
+ * @typedef {import('./s3-put.js').AwsCredentials} AwsCredentials
7
+ */
8
+ /**
9
+ * @param {{ bucket: string, prefix: string, region: string,
10
+ * endpoint?: string | null, credentials: AwsCredentials,
11
+ * flushIntervalMs: number, maxBatch: number,
12
+ * put?: typeof putObject }} options
13
+ * @returns {LogSink & { pendingCount: () => number }}
14
+ */
15
+ export declare function createS3Sink(options: {
16
+ bucket: string;
17
+ prefix: string;
18
+ region: string;
19
+ endpoint?: string | null;
20
+ credentials: AwsCredentials;
21
+ flushIntervalMs: number;
22
+ maxBatch: number;
23
+ put?: typeof putObject;
24
+ }): LogSink & {
25
+ pendingCount: () => number;
26
+ };
@@ -0,0 +1,38 @@
1
+ export type Metadata = {
2
+ title?: string;
3
+ /**
4
+ * `"%s | Site"` — `title` buna gömülür.
5
+ */
6
+ titleTemplate?: string;
7
+ description?: string;
8
+ /**
9
+ * Mutlak ya da göreli URL.
10
+ */
11
+ canonical?: string;
12
+ /**
13
+ * Göreli canonical'ı mutlaklaştırmak için.
14
+ */
15
+ siteUrl?: string;
16
+ robots?: {
17
+ index?: boolean;
18
+ follow?: boolean;
19
+ };
20
+ locale?: string;
21
+ /**
22
+ * `{ title, description, url, type, siteName, image, imageWidth, imageHeight }`
23
+ */
24
+ openGraph?: object;
25
+ /**
26
+ * `{ card, site, creator, title, description, image }`
27
+ */
28
+ twitter?: object;
29
+ /**
30
+ * Olduğu gibi basılacak ham etiketler.
31
+ */
32
+ extraTags?: string[];
33
+ };
34
+ /**
35
+ * @param {Metadata} [metadata]
36
+ * @returns {string}
37
+ */
38
+ export declare function renderHeadMeta(metadata?: Metadata): string;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * İçeriği bir kez sıkıştırıp saklamak isteyen çağıranlar için (HTML cache).
3
+ *
4
+ * @param {string | undefined} acceptEncoding
5
+ * @returns {"br" | "gzip" | null}
6
+ */
7
+ export declare function negotiateEncoding(acceptEncoding: string | undefined): "br" | "gzip" | null;
8
+ /**
9
+ * @param {string} text
10
+ * @param {"br" | "gzip"} encoding
11
+ * @returns {Promise<Buffer>}
12
+ */
13
+ export declare function encodeText(text: string, encoding: "br" | "gzip"): Promise<Buffer>;
14
+ /**
15
+ * @returns {import('express').RequestHandler}
16
+ */
17
+ export declare function compression(): import('express').RequestHandler;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @returns {import('express').RequestHandler}
3
+ */
4
+ export declare function csrf(): import('express').RequestHandler;
@@ -0,0 +1,2 @@
1
+ /** @returns {import('express').RequestHandler} */
2
+ export declare function devGate(): import('express').RequestHandler;
@@ -0,0 +1,2 @@
1
+ /** @returns {import('express').RequestHandler} */
2
+ export declare function headersMiddleware(): import('express').RequestHandler;
@@ -0,0 +1,2 @@
1
+ /** @returns {import('express').RequestHandler} */
2
+ export declare function redirects(): import('express').RequestHandler;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @param {string} publicDir
3
+ * @returns {import('express').RequestHandler}
4
+ */
5
+ export declare function staticPrecompressed(publicDir: string): import('express').RequestHandler;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Bu yola trailing slash dayatılmamalı mı.
3
+ *
4
+ * @param {string} pathname
5
+ * @returns {boolean}
6
+ */
7
+ export declare function skipTrailingSlash(pathname: string): boolean;
8
+ /**
9
+ * @returns {import('express').RequestHandler}
10
+ */
11
+ export declare function trailingSlash(): import('express').RequestHandler;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Hedefi isteğe göre hesaplayan proxy üretir. `resolveTarget` fırlatırsa
3
+ * istek proxy'lenmez ve zincire devam eder — hedef origin yapılandırılmamış
4
+ * bir kurulumda 500 yerine normal 404 almak daha doğru.
5
+ *
6
+ * @param {(req: import('express').Request) => string} resolveTarget
7
+ * @returns {import('express').RequestHandler}
8
+ */
9
+ export declare function createProxy(resolveTarget: (req: import('express').Request) => string): import('express').RequestHandler;
10
+ /**
11
+ * Config'teki `rewrites()` kuralları.
12
+ *
13
+ * Hedef mutlaksa (http/https) istek proxy ile dışa taşınır; göreliyse
14
+ * yalnızca `req.url` değiştirilir ve istek kendi route tablosunda devam eder.
15
+ * İki faz var: `beforeFiles` statik dosyalardan önce, `afterFiles` statik
16
+ * denendikten sonra sayfalardan önce.
17
+ *
18
+ * @param {"beforeFiles" | "afterFiles"} phase
19
+ * @returns {import('express').RequestHandler}
20
+ */
21
+ export declare function configRewrites(phase: "beforeFiles" | "afterFiles"): import('express').RequestHandler;
@@ -0,0 +1,149 @@
1
+ /** Sosyal kartlar için yaygın boyut (Facebook / X / LinkedIn). */
2
+ export declare const OG_SIZE: Readonly<{
3
+ width: 1200;
4
+ height: 630;
5
+ }>;
6
+ export type OgCardOptions = {
7
+ title?: string;
8
+ description?: string;
9
+ siteName?: string;
10
+ /**
11
+ * Düz SVG rengi (`#0f172a`)
12
+ */
13
+ background?: string;
14
+ /**
15
+ * Ana metin rengi
16
+ */
17
+ color?: string;
18
+ /**
19
+ * Açıklama / site adı
20
+ */
21
+ mutedColor?: string;
22
+ /**
23
+ * Sol şerit rengi
24
+ */
25
+ accent?: string;
26
+ };
27
+ export type OgImageOptions = OgCardOptions & {
28
+ svg?: string;
29
+ width?: number;
30
+ height?: number;
31
+ format?: 'png' | 'svg';
32
+ cacheControl?: string;
33
+ };
34
+ export type OgImageResult = {
35
+ body: Buffer;
36
+ contentType: string;
37
+ width: number;
38
+ height: number;
39
+ };
40
+ /**
41
+ * @typedef {object} OgCardOptions
42
+ * @property {string} [title]
43
+ * @property {string} [description]
44
+ * @property {string} [siteName]
45
+ * @property {string} [background] Düz SVG rengi (`#0f172a`)
46
+ * @property {string} [color] Ana metin rengi
47
+ * @property {string} [mutedColor] Açıklama / site adı
48
+ * @property {string} [accent] Sol şerit rengi
49
+ */
50
+ /**
51
+ * @typedef {OgCardOptions & {
52
+ * svg?: string,
53
+ * width?: number,
54
+ * height?: number,
55
+ * format?: 'png' | 'svg',
56
+ * cacheControl?: string,
57
+ * }} OgImageOptions
58
+ */
59
+ /**
60
+ * @typedef {object} OgImageResult
61
+ * @property {Buffer} body
62
+ * @property {string} contentType
63
+ * @property {number} width
64
+ * @property {number} height
65
+ */
66
+ /**
67
+ * XML metin kaçışı — kullanıcı başlığı SVG'ye gömülür.
68
+ * @param {unknown} value
69
+ * @returns {string}
70
+ */
71
+ export declare function escapeXml(value: unknown): string;
72
+ /**
73
+ * Kelime sınırında satır kır. Uzun kelime kesilir; taşan içerik son satırda `…`.
74
+ * @param {string} text
75
+ * @param {number} maxChars
76
+ * @param {number} maxLines
77
+ * @returns {string[]}
78
+ */
79
+ export declare function wrapText(text: string, maxChars: number, maxLines: number): string[];
80
+ /**
81
+ * Hazır kart SVG'si. Uygulama kendi SVG'sini vermek isterse `svg` kullanır.
82
+ * @param {OgCardOptions & { width?: number, height?: number }} options
83
+ * @returns {string}
84
+ */
85
+ export declare function buildOgSvg(options?: OgCardOptions & {
86
+ width?: number;
87
+ height?: number;
88
+ }): string;
89
+ /**
90
+ * SVG veya kart alanlarından PNG/SVG gövde üretir.
91
+ * @param {OgImageOptions} [options]
92
+ * @returns {Promise<OgImageResult>}
93
+ */
94
+ export declare function ogImage(options?: OgImageOptions): Promise<OgImageResult>;
95
+ /**
96
+ * Express yanıtına OG görseli basar.
97
+ * @param {import('express').Response} res
98
+ * @param {OgImageOptions} [options]
99
+ * @returns {Promise<OgImageResult>}
100
+ */
101
+ export declare function sendOgImage(res: import('express').Response, options?: OgImageOptions): Promise<OgImageResult>;
102
+ /**
103
+ * Next `opengraph-image` route handler'ına yakın Express sarmalayıcı.
104
+ *
105
+ * Factory `null` dönerse veya `notFound()` fırlatırsa 404.
106
+ *
107
+ * @param {(ctx: { params: Record<string, string>, query: import('express').Request['query'], req: import('express').Request }) =>
108
+ * OgImageOptions | null | Promise<OgImageOptions | null>} factory
109
+ * @param {OgImageOptions} [defaults] Her istekte birleşen varsayılanlar
110
+ * @returns {import('express').RequestHandler}
111
+ */
112
+ export declare function ogHandler(factory: (ctx: {
113
+ params: Record<string, string>;
114
+ query: import('express').Request['query'];
115
+ req: import('express').Request;
116
+ }) => OgImageOptions | null | Promise<OgImageOptions | null>, defaults?: OgImageOptions): import('express').RequestHandler;
117
+ /**
118
+ * Next.js `new ImageResponse(...)` DX'si. JSX yok — ilk argüman SVG string
119
+ * veya kart alanları nesnesi.
120
+ *
121
+ * @example
122
+ * ```js
123
+ * return new ImageResponse(
124
+ * { title: post.title, description: post.excerpt, siteName: "Blog" },
125
+ * { width: 1200, height: 630 },
126
+ * );
127
+ * // handler içinde: await image.send(res)
128
+ * ```
129
+ */
130
+ export declare class ImageResponse {
131
+ #private;
132
+ /**
133
+ * @param {string | OgCardOptions} element
134
+ * @param {Omit<OgImageOptions, keyof OgCardOptions | 'svg'> & { width?: number, height?: number }} [init]
135
+ */
136
+ constructor(element: string | OgCardOptions, init?: Omit<OgImageOptions, keyof OgCardOptions | 'svg'> & {
137
+ width?: number;
138
+ height?: number;
139
+ });
140
+ /** @returns {OgImageOptions} */
141
+ get options(): OgImageOptions;
142
+ /** @returns {Promise<OgImageResult>} */
143
+ buffer(): Promise<OgImageResult>;
144
+ /**
145
+ * @param {import('express').Response} res
146
+ * @returns {Promise<OgImageResult>}
147
+ */
148
+ send(res: import('express').Response): Promise<OgImageResult>;
149
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * `netstat -ano -p tcp` çıktısından LISTENING PID'lerini çıkarır.
3
+ * `3000` ile `30001` karışmasın diye porttan sonra rakam olmamalı.
4
+ *
5
+ * @param {string} stdout
6
+ * @param {number} port
7
+ * @returns {number[]}
8
+ */
9
+ export declare function parseWindowsNetstat(stdout: string, port: number): number[];
10
+ /**
11
+ * `lsof -t` çıktısı: satır başına bir PID.
12
+ *
13
+ * @param {string} stdout
14
+ * @returns {number[]}
15
+ */
16
+ export declare function parseLsofPids(stdout: string): number[];
17
+ /**
18
+ * `ss -H -lptn` satırlarından `pid=` değerlerini alır.
19
+ *
20
+ * @param {string} stdout
21
+ * @returns {number[]}
22
+ */
23
+ export declare function parseSsPids(stdout: string): number[];
24
+ /**
25
+ * Portu dinleyen yabancı süreçlerin PID listesi.
26
+ *
27
+ * @param {number} port
28
+ * @returns {Promise<number[]>}
29
+ */
30
+ export declare function listListeningPids(port: number): Promise<number[]>;
31
+ /**
32
+ * Porttaki dinleyicileri öldürür ve soketin boşalmasını kısa süre bekler.
33
+ *
34
+ * @param {number} port
35
+ * @returns {Promise<number[]>} öldürülen PID'ler
36
+ */
37
+ export declare function murderPort(port: number): Promise<number[]>;
38
+ /**
39
+ * Port doluysa ya net hata fırlatır ya da `--murder` ile temizler.
40
+ *
41
+ * Dinleyici listesi alınamazsa (araç yok / yetki) sessizce geçer; asıl bağlama
42
+ * `EADDRINUSE` ile yine düşer.
43
+ *
44
+ * @param {number} port
45
+ * @param {{ murder?: boolean }} [options]
46
+ * @returns {Promise<void>}
47
+ */
48
+ export declare function ensurePortFree(port: number, options?: {
49
+ murder?: boolean;
50
+ }): Promise<void>;