jskelet 0.5.5 → 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.
- package/AGENTS.md +18 -13
- package/CHANGELOG.md +95 -0
- package/README.md +9 -7
- package/bin/jskelet.mjs +24 -10
- package/docs/01-baslangic.md +4 -3
- package/docs/02-mimari.md +4 -3
- package/docs/03-routing.md +11 -6
- package/docs/04-render-ve-sablonlar.md +35 -43
- package/docs/05-islands.md +12 -8
- package/docs/07-yapilandirma.md +40 -18
- package/docs/08-build.md +15 -9
- package/docs/09-dev-araclari.md +5 -1
- package/docs/10-dagitim.md +6 -1
- package/docs/11-tasima.md +51 -17
- package/docs/12-panel-ve-oturum.md +10 -4
- package/docs/README.md +7 -5
- package/docs/en/01-getting-started.md +4 -3
- package/docs/en/02-architecture.md +5 -5
- package/docs/en/03-routing.md +12 -7
- package/docs/en/04-rendering.md +47 -59
- package/docs/en/05-islands.md +13 -8
- package/docs/en/07-configuration.md +40 -20
- package/docs/en/08-build.md +16 -10
- package/docs/en/09-dev-tools.md +6 -1
- package/docs/en/10-deployment.md +6 -1
- package/docs/en/11-migration.md +51 -16
- package/docs/en/12-dashboards-and-sessions.md +9 -4
- package/docs/en/README.md +7 -5
- package/package.json +49 -14
- package/src/build/tasks/client.mjs +91 -10
- package/src/build/tasks/icons.mjs +11 -1
- package/src/client/index.js +2 -2
- package/src/compile/codegen.js +4 -0
- package/src/compile/compile-all.js +12 -21
- package/src/compile/expr.js +5 -0
- package/src/compile/parse.js +64 -8
- package/src/compile/resolve.js +3 -0
- package/src/config/defaults.js +12 -2
- package/src/config/index.js +1 -1
- package/src/dev-server.mjs +26 -3
- package/src/http/cookies-entry.js +1 -0
- package/src/http/cookies.js +18 -0
- package/src/logo.png +0 -0
- package/src/migrate/apply.mjs +262 -0
- package/src/migrate/babel.mjs +79 -0
- package/src/migrate/classify.mjs +155 -0
- package/src/migrate/config.mjs +126 -0
- package/src/migrate/fs-walk.mjs +191 -0
- package/src/migrate/parse.mjs +26 -0
- package/src/migrate/scan.mjs +177 -0
- package/src/migrate/transform/expr-source.mjs +168 -0
- package/src/migrate/transform/island.mjs +67 -0
- package/src/migrate/transform/jsx-to-component.mjs +302 -0
- package/src/migrate/transform/jsx-to-jsk.mjs +330 -0
- package/src/migrate/transform/page-split.mjs +435 -0
- package/src/migrate/write.mjs +81 -0
- package/src/migrate.mjs +171 -0
- package/src/server/auth/handoff.js +94 -11
- package/src/server/create-app.js +28 -10
- package/src/server/ejs-adapter.js +59 -0
- package/src/server/image-optimizer.js +94 -26
- package/src/server/port-guard.js +255 -0
- package/src/server/render.js +27 -9
- package/src/server/status-page.js +105 -4
- package/src/start.mjs +18 -3
- package/src/templates/layout.ejs +8 -28
- package/src/templates/layout.jsk +30 -0
- package/src/templates/layout.render.js +41 -0
- package/src/views/helpers/tags.js +86 -3
- package/types/build/resolve-peer.d.mts +13 -0
- package/types/client/dom.d.ts +55 -0
- package/types/client/form.d.ts +19 -0
- package/types/client/index.d.ts +20 -0
- package/types/client/registry.d.ts +53 -0
- package/types/client/safe-image.d.ts +19 -0
- package/types/client/shared-cookie.d.ts +82 -0
- package/types/client/store.d.ts +18 -0
- package/types/client/swap.d.ts +46 -0
- package/types/compile/codegen.d.ts +32 -0
- package/types/compile/compile-all.d.ts +42 -0
- package/types/compile/errors.d.ts +30 -0
- package/types/compile/expr.d.ts +67 -0
- package/types/compile/index.d.ts +10 -0
- package/types/compile/parse.d.ts +82 -0
- package/types/compile/resolve.d.ts +46 -0
- package/types/compile/scan-exports.d.ts +9 -0
- package/types/config/defaults.d.ts +449 -0
- package/types/config/index.d.ts +299 -0
- package/types/config/pattern.d.ts +38 -0
- package/types/http/control-flow.d.ts +45 -0
- package/types/http/cookies-entry.d.ts +5 -0
- package/types/http/cookies.d.ts +113 -0
- package/types/http/request-cache.d.ts +13 -0
- package/types/http/request-context.d.ts +67 -0
- package/types/http/shared-cookie.d.ts +73 -0
- package/types/index.d.ts +30 -0
- package/types/log.d.mts +153 -0
- package/types/server/admin/actions.d.ts +16 -0
- package/types/server/admin/auth.d.ts +52 -0
- package/types/server/admin/event-log.d.ts +38 -0
- package/types/server/admin/gate.d.ts +43 -0
- package/types/server/admin/inventory.d.ts +40 -0
- package/types/server/admin/mount.d.ts +6 -0
- package/types/server/admin/router.d.ts +6 -0
- package/types/server/admin/snapshot.d.ts +6 -0
- package/types/server/assets.d.ts +47 -0
- package/types/server/auth/handoff.d.ts +12 -0
- package/types/server/cache-deps.d.ts +16 -0
- package/types/server/cache-vary.d.ts +30 -0
- package/types/server/cloudflare.d.ts +163 -0
- package/types/server/create-app.d.ts +25 -0
- package/types/server/data-cache.d.ts +116 -0
- package/types/server/dev/devtools.d.ts +44 -0
- package/types/server/dev/report.d.ts +229 -0
- package/types/server/dev/socket.d.ts +17 -0
- package/types/server/dev/version-check.d.mts +15 -0
- package/types/server/ejs-adapter.d.ts +11 -0
- package/types/server/head-hints.d.ts +40 -0
- package/types/server/html-cache.d.ts +173 -0
- package/types/server/image-optimizer.d.ts +68 -0
- package/types/server/logs/access-middleware.d.ts +7 -0
- package/types/server/logs/file-sink.d.ts +17 -0
- package/types/server/logs/pipeline.d.ts +37 -0
- package/types/server/logs/s3-put.d.ts +85 -0
- package/types/server/logs/s3-sink.d.ts +26 -0
- package/types/server/metadata.d.ts +38 -0
- package/types/server/middleware/compression.d.ts +17 -0
- package/types/server/middleware/csrf.d.ts +4 -0
- package/types/server/middleware/dev-gate.d.ts +2 -0
- package/types/server/middleware/headers.d.ts +2 -0
- package/types/server/middleware/redirects.d.ts +2 -0
- package/types/server/middleware/static-precompressed.d.ts +5 -0
- package/types/server/middleware/trailing-slash.d.ts +11 -0
- package/types/server/middleware/upstream-proxy.d.ts +21 -0
- package/types/server/og-image.d.ts +149 -0
- package/types/server/port-guard.d.ts +50 -0
- package/types/server/prewarm.d.ts +128 -0
- package/types/server/redis.d.ts +163 -0
- package/types/server/render.d.ts +101 -0
- package/types/server/router.d.ts +5 -0
- package/types/server/status-page.d.ts +24 -0
- package/types/server/upstream-limiter.d.ts +123 -0
- package/types/server/upstream-tracking.d.ts +42 -0
- package/types/shared/cookie-domain.d.ts +29 -0
- package/types/templates/layout.render.d.ts +7 -0
- package/types/version.d.mts +10 -0
- package/types/views/components/loader.d.ts +5 -0
- package/types/views/helpers/html.d.ts +39 -0
- 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,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,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>;
|