tezx 3.0.10-beta → 3.0.12-beta
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/bun/index.d.ts +4 -2
- package/bun/index.js +3 -2
- package/bun/ws.d.ts +37 -0
- package/bun/ws.js +23 -0
- package/cjs/bun/index.js +37 -5
- package/cjs/bun/ws.js +25 -0
- package/cjs/core/context.js +86 -85
- package/cjs/core/error.js +41 -0
- package/cjs/core/request.js +6 -6
- package/cjs/core/router.js +4 -2
- package/cjs/core/server.js +45 -63
- package/cjs/index.js +5 -2
- package/cjs/middleware/basic-auth.js +28 -54
- package/cjs/middleware/bearer-auth.js +34 -0
- package/cjs/middleware/cors.js +16 -23
- package/cjs/middleware/index.js +25 -0
- package/cjs/middleware/logger.js +6 -3
- package/cjs/middleware/pagination.js +1 -1
- package/cjs/middleware/powered-by.js +1 -1
- package/cjs/middleware/rate-limiter.js +20 -7
- package/cjs/middleware/request-id.js +4 -7
- package/cjs/middleware/sanitize-headers.js +8 -40
- package/cjs/middleware/xss-protection.js +2 -6
- package/cjs/registry/RadixRouter.js +72 -23
- package/cjs/utils/cookie.js +1 -1
- package/cjs/utils/rateLimit.js +2 -2
- package/cjs/utils/regexRouter.js +1 -0
- package/cjs/utils/response.js +20 -29
- package/core/context.d.ts +68 -59
- package/core/context.js +87 -86
- package/core/error.d.ts +95 -0
- package/core/error.js +37 -0
- package/core/request.d.ts +4 -4
- package/core/request.js +6 -6
- package/core/router.d.ts +11 -6
- package/core/router.js +4 -2
- package/core/server.js +45 -63
- package/index.d.ts +4 -2
- package/index.js +4 -2
- package/middleware/basic-auth.d.ts +38 -66
- package/middleware/basic-auth.js +28 -54
- package/middleware/bearer-auth.d.ts +52 -0
- package/middleware/bearer-auth.js +30 -0
- package/middleware/cors.d.ts +7 -21
- package/middleware/cors.js +16 -23
- package/middleware/index.d.ts +9 -0
- package/middleware/index.js +9 -0
- package/middleware/logger.d.ts +3 -1
- package/middleware/logger.js +6 -3
- package/middleware/pagination.d.ts +8 -6
- package/middleware/pagination.js +1 -1
- package/middleware/powered-by.js +1 -1
- package/middleware/rate-limiter.d.ts +0 -4
- package/middleware/rate-limiter.js +20 -7
- package/middleware/request-id.d.ts +1 -1
- package/middleware/request-id.js +3 -6
- package/middleware/sanitize-headers.d.ts +3 -11
- package/middleware/sanitize-headers.js +8 -40
- package/middleware/xss-protection.d.ts +1 -1
- package/middleware/xss-protection.js +1 -5
- package/package.json +6 -1
- package/registry/RadixRouter.js +72 -23
- package/types/index.d.ts +2 -1
- package/utils/cookie.js +1 -1
- package/utils/rateLimit.d.ts +1 -2
- package/utils/rateLimit.js +2 -2
- package/utils/regexRouter.js +1 -0
- package/utils/response.d.ts +12 -14
- package/utils/response.js +19 -28
- package/cjs/middleware/cache-control.js +0 -93
- package/cjs/middleware/detect-bot.js +0 -66
- package/cjs/middleware/detect-locale.js +0 -45
- package/cjs/middleware/i18n.js +0 -93
- package/cjs/middleware/lazy-loader.js +0 -74
- package/cjs/middleware/request-timeout.js +0 -43
- package/cjs/middleware/secure-headers.js +0 -43
- package/middleware/cache-control.d.ts +0 -56
- package/middleware/cache-control.js +0 -56
- package/middleware/detect-bot.d.ts +0 -111
- package/middleware/detect-bot.js +0 -62
- package/middleware/detect-locale.d.ts +0 -56
- package/middleware/detect-locale.js +0 -41
- package/middleware/i18n.d.ts +0 -102
- package/middleware/i18n.js +0 -89
- package/middleware/lazy-loader.d.ts +0 -73
- package/middleware/lazy-loader.js +0 -70
- package/middleware/request-timeout.d.ts +0 -26
- package/middleware/request-timeout.js +0 -39
- package/middleware/secure-headers.d.ts +0 -78
- package/middleware/secure-headers.js +0 -39
|
@@ -39,20 +39,18 @@ class RadixRouter {
|
|
|
39
39
|
search(method, path) {
|
|
40
40
|
let params = {};
|
|
41
41
|
let middlewares = [];
|
|
42
|
-
const { success, node } = this._match(method, this.root, (
|
|
42
|
+
const { success, node } = this._match(method, this.root, path?.split("/")?.filter(Boolean), 0, params, middlewares);
|
|
43
43
|
if (success && node) {
|
|
44
44
|
const handlers = node.handlers?.[method] ?? [];
|
|
45
45
|
return { method, params, handlers, middlewares };
|
|
46
46
|
}
|
|
47
47
|
return { method, params: {}, handlers: [], middlewares };
|
|
48
48
|
}
|
|
49
|
-
_match(method, node, segments, index, params, middlewares
|
|
50
|
-
if (node
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
middlewares.push(mw);
|
|
55
|
-
}
|
|
49
|
+
_match(method, node, segments, index, params, middlewares) {
|
|
50
|
+
if (node?.handlers?.ALL) {
|
|
51
|
+
const mw = node.handlers?.ALL;
|
|
52
|
+
for (let i = 0; i < mw.length; i++) {
|
|
53
|
+
middlewares.push(mw[i]);
|
|
56
54
|
}
|
|
57
55
|
}
|
|
58
56
|
if (index === segments.length) {
|
|
@@ -61,40 +59,59 @@ class RadixRouter {
|
|
|
61
59
|
const opt = node.children[":"];
|
|
62
60
|
if (opt?.isOptional) {
|
|
63
61
|
params[opt.paramName] = null;
|
|
64
|
-
return this._match(method, opt, segments, index, params, middlewares
|
|
62
|
+
return this._match(method, opt, segments, index, params, middlewares);
|
|
65
63
|
}
|
|
66
64
|
return { success: false, node: node };
|
|
67
65
|
}
|
|
68
66
|
const wc = node.children["*"];
|
|
69
|
-
if (wc?.handlers?.ALL) {
|
|
70
|
-
for (const mw of wc.handlers.ALL) {
|
|
71
|
-
if (!seen.has(mw)) {
|
|
72
|
-
seen.add(mw);
|
|
73
|
-
middlewares.push(mw);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
67
|
const seg = segments[index];
|
|
78
68
|
if (node.children[seg]) {
|
|
79
|
-
const res = this._match(method, node.children[seg], segments, index + 1, params, middlewares
|
|
80
|
-
if (res.success)
|
|
69
|
+
const res = this._match(method, node.children[seg], segments, index + 1, params, middlewares);
|
|
70
|
+
if (res.success) {
|
|
71
|
+
if (wc?.handlers?.ALL) {
|
|
72
|
+
const mw = wc.handlers?.ALL;
|
|
73
|
+
for (let i = 0; i < mw.length; i++) {
|
|
74
|
+
middlewares.push(mw[i]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
81
77
|
return res;
|
|
78
|
+
}
|
|
82
79
|
}
|
|
83
80
|
const dyn = node.children[":"];
|
|
84
81
|
if (dyn) {
|
|
85
82
|
params[dyn.paramName] = seg;
|
|
86
|
-
const res = this._match(method, dyn, segments, index + 1, params, middlewares
|
|
87
|
-
if (res.success)
|
|
83
|
+
const res = this._match(method, dyn, segments, index + 1, params, middlewares);
|
|
84
|
+
if (res.success) {
|
|
85
|
+
if (wc?.handlers?.ALL) {
|
|
86
|
+
const mw = wc.handlers?.ALL;
|
|
87
|
+
for (let i = 0; i < mw.length; i++) {
|
|
88
|
+
middlewares.push(mw[i]);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
88
91
|
return res;
|
|
92
|
+
}
|
|
89
93
|
if (dyn.isOptional) {
|
|
90
94
|
params[dyn.paramName] = null;
|
|
91
|
-
const skip = this._match(method, dyn, segments, index, params, middlewares
|
|
92
|
-
if (skip.success)
|
|
95
|
+
const skip = this._match(method, dyn, segments, index, params, middlewares);
|
|
96
|
+
if (skip.success) {
|
|
97
|
+
if (wc?.handlers?.ALL) {
|
|
98
|
+
const mw = wc.handlers?.ALL;
|
|
99
|
+
for (let i = 0; i < mw.length; i++) {
|
|
100
|
+
middlewares.push(mw[i]);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
93
103
|
return skip;
|
|
104
|
+
}
|
|
94
105
|
}
|
|
95
106
|
}
|
|
96
107
|
if (wc) {
|
|
97
108
|
let wildcard = segments.slice(index).join("/");
|
|
109
|
+
if (wc?.handlers?.ALL) {
|
|
110
|
+
const mw = wc.handlers?.ALL;
|
|
111
|
+
for (let i = 0; i < mw.length; i++) {
|
|
112
|
+
middlewares.push(mw[i]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
98
115
|
if (wildcard) {
|
|
99
116
|
params[wc.paramName] = wildcard;
|
|
100
117
|
return { node: wc, success: true };
|
|
@@ -128,3 +145,35 @@ class RadixRouter {
|
|
|
128
145
|
}
|
|
129
146
|
}
|
|
130
147
|
exports.RadixRouter = RadixRouter;
|
|
148
|
+
const routes = [
|
|
149
|
+
"/",
|
|
150
|
+
"/users",
|
|
151
|
+
"/users/:id",
|
|
152
|
+
"/users/:id/profile",
|
|
153
|
+
"/posts/:postId?",
|
|
154
|
+
"/files/*",
|
|
155
|
+
"/admin/settings",
|
|
156
|
+
"/search/:term?",
|
|
157
|
+
"/categories/:categoryId/products/:productId",
|
|
158
|
+
"/about",
|
|
159
|
+
];
|
|
160
|
+
const testPaths = [
|
|
161
|
+
"/",
|
|
162
|
+
"/users",
|
|
163
|
+
"/users/123",
|
|
164
|
+
"/users/123/profile",
|
|
165
|
+
"/posts",
|
|
166
|
+
"/posts/456",
|
|
167
|
+
"/files/path/to/file.txt",
|
|
168
|
+
"/admin/settings",
|
|
169
|
+
"/search",
|
|
170
|
+
"/search/nodejs",
|
|
171
|
+
"/categories/12/products/999",
|
|
172
|
+
"/notfound",
|
|
173
|
+
];
|
|
174
|
+
const router = new RadixRouter();
|
|
175
|
+
let x = function xx() {
|
|
176
|
+
return {
|
|
177
|
+
body: "3453455",
|
|
178
|
+
};
|
|
179
|
+
};
|
package/cjs/utils/cookie.js
CHANGED
|
@@ -34,7 +34,7 @@ function allCookies(ctx) {
|
|
|
34
34
|
return cookies;
|
|
35
35
|
}
|
|
36
36
|
function setCookie(ctx, name, value, options) {
|
|
37
|
-
ctx.setHeader("Set-Cookie", `${name}=${value}; ${serializeOptions(options
|
|
37
|
+
ctx.setHeader("Set-Cookie", `${name}=${value}; ${serializeOptions(options ?? {})}`);
|
|
38
38
|
}
|
|
39
39
|
function deleteCookie(ctx, name, options) {
|
|
40
40
|
ctx.setHeader("Set-Cookie", `${name}=; ${serializeOptions({ ...options, maxAge: 0, expires: new Date(0) })}`);
|
package/cjs/utils/rateLimit.js
CHANGED
|
@@ -17,8 +17,8 @@ function createRateLimitDefaultStorage() {
|
|
|
17
17
|
},
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
function isRateLimit(
|
|
21
|
-
store
|
|
20
|
+
function isRateLimit(key, store, maxRequests, windowMs) {
|
|
21
|
+
store?.clearExpired();
|
|
22
22
|
const now = Date.now();
|
|
23
23
|
let entry = store.get(key) || { count: 0, resetTime: now + windowMs };
|
|
24
24
|
if (now < entry.resetTime) {
|
package/cjs/utils/regexRouter.js
CHANGED
package/cjs/utils/response.js
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.notFoundResponse = void 0;
|
|
4
4
|
exports.handleErrorResponse = handleErrorResponse;
|
|
5
|
+
exports.toString = toString;
|
|
5
6
|
exports.determineContentTypeBody = determineContentTypeBody;
|
|
6
|
-
|
|
7
|
+
const config_js_1 = require("../core/config.js");
|
|
8
|
+
const error_js_1 = require("../core/error.js");
|
|
7
9
|
let notFoundResponse = (ctx) => {
|
|
8
10
|
const { method, pathname } = ctx;
|
|
9
11
|
return ctx.text(`${method}: '${pathname}' could not find\n`, {
|
|
@@ -11,14 +13,24 @@ let notFoundResponse = (ctx) => {
|
|
|
11
13
|
});
|
|
12
14
|
};
|
|
13
15
|
exports.notFoundResponse = notFoundResponse;
|
|
14
|
-
async function handleErrorResponse(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
async function handleErrorResponse(err = error_js_1.TezXError.internal(), ctx) {
|
|
17
|
+
if (err instanceof error_js_1.TezXError) {
|
|
18
|
+
config_js_1.GlobalConfig.debugging.error(err.details ?? err?.message);
|
|
19
|
+
return ctx.status(err.statusCode ?? 500).send(err.details ?? err?.message ?? "Internal Server Error");
|
|
18
20
|
}
|
|
19
|
-
return
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
return await handleErrorResponse(error_js_1.TezXError.internal(), ctx);
|
|
22
|
+
}
|
|
23
|
+
function toString(input, values) {
|
|
24
|
+
if (typeof input === "string") {
|
|
25
|
+
return input;
|
|
26
|
+
}
|
|
27
|
+
let result = "";
|
|
28
|
+
for (let i = 0; i < input.length; i++) {
|
|
29
|
+
result += input[i];
|
|
30
|
+
if (i < values.length)
|
|
31
|
+
result += values[i];
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
22
34
|
}
|
|
23
35
|
function determineContentTypeBody(body) {
|
|
24
36
|
if (typeof body === "string" ||
|
|
@@ -49,24 +61,3 @@ function determineContentTypeBody(body) {
|
|
|
49
61
|
}
|
|
50
62
|
return { type: "text/plain; charset=utf-8", body: String(body ?? "") };
|
|
51
63
|
}
|
|
52
|
-
function newResponse(body, type, init = {}, baseHeaders, defaultStatus) {
|
|
53
|
-
let headers;
|
|
54
|
-
if (init.headers) {
|
|
55
|
-
headers = {
|
|
56
|
-
"Content-Type": type,
|
|
57
|
-
...baseHeaders,
|
|
58
|
-
...init.headers,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
headers = {
|
|
63
|
-
"Content-Type": type,
|
|
64
|
-
...baseHeaders,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
return new Response(body, {
|
|
68
|
-
status: init.status || defaultStatus,
|
|
69
|
-
statusText: init.statusText,
|
|
70
|
-
headers,
|
|
71
|
-
});
|
|
72
|
-
}
|
package/core/context.d.ts
CHANGED
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
import { HttpBaseResponse, ResHeaderKey,
|
|
1
|
+
import { HttpBaseResponse, ResHeaderKey, ResponseInit } from "../types/index.js";
|
|
2
2
|
import { TezXRequest } from "./request.js";
|
|
3
|
-
export
|
|
4
|
-
pathname: string;
|
|
5
|
-
method: string;
|
|
6
|
-
env: Record<string, any> & T;
|
|
7
|
-
args?: any[];
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Represents the context of an HTTP request lifecycle.
|
|
11
|
-
* Provides utilities to handle request, response, headers, and body.
|
|
12
|
-
*
|
|
13
|
-
* @template T - The type for environment variables or shared state.
|
|
14
|
-
* @template Path - The string literal type for route paths.
|
|
15
|
-
*/
|
|
16
|
-
export declare class Context<T extends Record<string, any> = {}, Path extends string = any> {
|
|
3
|
+
export declare class Context<TEnv extends Record<string, any> = {}, TPath extends string = any> {
|
|
17
4
|
#private;
|
|
18
5
|
[key: string]: any;
|
|
19
6
|
/**
|
|
@@ -22,11 +9,29 @@ export declare class Context<T extends Record<string, any> = {}, Path extends st
|
|
|
22
9
|
* @type {Request}
|
|
23
10
|
*/
|
|
24
11
|
rawRequest: Request;
|
|
12
|
+
/**
|
|
13
|
+
* The URL associated with the current context.
|
|
14
|
+
*
|
|
15
|
+
* This is a read-only string representing the resource location or endpoint.
|
|
16
|
+
*/
|
|
17
|
+
readonly url: string;
|
|
18
|
+
/**
|
|
19
|
+
* The native Response object associated with this context, if available.
|
|
20
|
+
*
|
|
21
|
+
* This property is set when a response has been created or is being manipulated directly.
|
|
22
|
+
* It may be undefined if the response has not yet been constructed.
|
|
23
|
+
*
|
|
24
|
+
* @type {Response | undefined}
|
|
25
|
+
* @remarks
|
|
26
|
+
* - When present, headers and status should be set directly on this object.
|
|
27
|
+
* - When undefined, internal header and status management is used.
|
|
28
|
+
*/
|
|
29
|
+
res?: Response;
|
|
25
30
|
/**
|
|
26
31
|
* Environment variables or shared state accessible in context.
|
|
27
|
-
* @type {Record<string, any> &
|
|
32
|
+
* @type {Record<string, any> & TEnv}
|
|
28
33
|
*/
|
|
29
|
-
env: Record<string, any> &
|
|
34
|
+
env: Record<string, any> & TEnv;
|
|
30
35
|
/**
|
|
31
36
|
* Request pathname (URL path without domain).
|
|
32
37
|
* @readonly
|
|
@@ -43,14 +48,9 @@ export declare class Context<T extends Record<string, any> = {}, Path extends st
|
|
|
43
48
|
* Creates a new context instance.
|
|
44
49
|
*
|
|
45
50
|
* @param {Request} req - The native Request object.
|
|
46
|
-
* @param {ContextOptions<
|
|
51
|
+
* @param {ContextOptions<TEnv>} options - Context options including pathname, method, env, params, and args.
|
|
47
52
|
*/
|
|
48
|
-
constructor(req: Request,
|
|
49
|
-
/**
|
|
50
|
-
* Returns the full URL string of the request, including query parameters.
|
|
51
|
-
* @type {string}
|
|
52
|
-
*/
|
|
53
|
-
get url(): string;
|
|
53
|
+
constructor(req: Request, pathname: string, method: string, env: Record<string, any> & TEnv, args: any[]);
|
|
54
54
|
/**
|
|
55
55
|
* Gets the current HTTP status code.
|
|
56
56
|
* @returns {number} The HTTP status code.
|
|
@@ -62,19 +62,34 @@ export declare class Context<T extends Record<string, any> = {}, Path extends st
|
|
|
62
62
|
*/
|
|
63
63
|
set setStatus(code: number);
|
|
64
64
|
/**
|
|
65
|
-
*
|
|
65
|
+
* Access the response headers.
|
|
66
66
|
*
|
|
67
|
-
* @
|
|
68
|
-
*
|
|
69
|
-
*
|
|
67
|
+
* @remarks
|
|
68
|
+
* This returns the native {@link Headers} object associated with the response.
|
|
69
|
+
* It gives you full control over reading, setting, appending, and deleting headers
|
|
70
|
+
* using the standard Web Headers API.
|
|
70
71
|
*
|
|
71
72
|
* @example
|
|
72
|
-
*
|
|
73
|
-
*
|
|
73
|
+
* ```ts
|
|
74
|
+
* // Get a header value
|
|
75
|
+
* const contentType = ctx.headers.get("content-type")
|
|
76
|
+
*
|
|
77
|
+
* // Set or overwrite a header
|
|
78
|
+
* ctx.headers.set("x-powered-by", "tezx")
|
|
79
|
+
*
|
|
80
|
+
* // Append multiple values
|
|
81
|
+
* ctx.headers.append("set-cookie", "id=123")
|
|
82
|
+
* ctx.headers.append("set-cookie", "token=xyz")
|
|
83
|
+
*
|
|
84
|
+
* // Iterate all headers
|
|
85
|
+
* for (const [key, value] of ctx.headers.entries()) {
|
|
86
|
+
* console.log(key, value)
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @returns {Headers} The response headers object.
|
|
74
91
|
*/
|
|
75
|
-
|
|
76
|
-
header(header: ResHeaderKey): string | undefined;
|
|
77
|
-
protected set clearHeader(header: ResponseHeaders);
|
|
92
|
+
get headers(): Headers;
|
|
78
93
|
/**
|
|
79
94
|
* Sets or appends a header to the response.
|
|
80
95
|
*
|
|
@@ -91,26 +106,15 @@ export declare class Context<T extends Record<string, any> = {}, Path extends st
|
|
|
91
106
|
setHeader(key: ResHeaderKey, value: string, options?: {
|
|
92
107
|
append?: boolean;
|
|
93
108
|
}): this;
|
|
94
|
-
/**
|
|
95
|
-
* Deletes a response header by key.
|
|
96
|
-
*
|
|
97
|
-
* If the native Response object is not yet available (`this.res` is falsy),
|
|
98
|
-
* it removes the header from the internal headers store.
|
|
99
|
-
* If the native Response object is available, it removes the header directly from the response headers.
|
|
100
|
-
*
|
|
101
|
-
* @param {ResHeaderKey} key - The name of the header to delete (case-insensitive).
|
|
102
|
-
* @returns {this} Returns the current instance for method chaining.
|
|
103
|
-
*/
|
|
104
|
-
deleteHeader(key: ResHeaderKey): this;
|
|
105
109
|
protected set params(params: Record<string, any>);
|
|
106
110
|
/**
|
|
107
111
|
* Gets the wrapped request object (`TezXRequest`).
|
|
108
112
|
*
|
|
109
113
|
* Lazily initializes the wrapped request on first access.
|
|
110
114
|
*
|
|
111
|
-
* @returns {TezXRequest<
|
|
115
|
+
* @returns {TezXRequest<TPath>} The wrapped request.
|
|
112
116
|
*/
|
|
113
|
-
get req(): TezXRequest<
|
|
117
|
+
get req(): TezXRequest<TPath>;
|
|
114
118
|
/**
|
|
115
119
|
* Gets the response body.
|
|
116
120
|
* @returns {*} The response body.
|
|
@@ -140,7 +144,7 @@ export declare class Context<T extends Record<string, any> = {}, Path extends st
|
|
|
140
144
|
* @returns {HttpBaseResponse} Response object suitable for runtime.
|
|
141
145
|
* @protected
|
|
142
146
|
*/
|
|
143
|
-
newResponse(body: BodyInit | null, init?: ResponseInit):
|
|
147
|
+
newResponse(body: BodyInit | null, init?: ResponseInit): Response;
|
|
144
148
|
/**
|
|
145
149
|
* Sends a plain text response.
|
|
146
150
|
*
|
|
@@ -154,28 +158,33 @@ export declare class Context<T extends Record<string, any> = {}, Path extends st
|
|
|
154
158
|
/**
|
|
155
159
|
* Sends an HTML response.
|
|
156
160
|
*
|
|
157
|
-
*
|
|
161
|
+
* Supports both:
|
|
162
|
+
* - Simple string: `ctx.html("<h1>Hello</h1>")`
|
|
163
|
+
* - Template literal: `ctx.html`<h1>${title}</h1>``
|
|
158
164
|
*
|
|
159
|
-
*
|
|
160
|
-
* @param {...any[]} [args] - Optional values for template literals or ResponseInit.
|
|
161
|
-
* @returns {HttpBaseResponse} A properly constructed HTML response.
|
|
165
|
+
* Minimizes intermediate string allocations for lower GC overhead.
|
|
162
166
|
*
|
|
163
|
-
* @
|
|
164
|
-
*
|
|
165
|
-
*
|
|
167
|
+
* @param {string | readonly string[]} strings - HTML string or template literal array.
|
|
168
|
+
* @param {...any[]} args - Values for template literals or a ResponseInit object if using a string.
|
|
169
|
+
* @returns {HttpBaseResponse} Constructed HTML response.
|
|
166
170
|
*/
|
|
167
171
|
html(strings: string, init?: ResponseInit): HttpBaseResponse;
|
|
168
172
|
html(strings: readonly string[], ...values: any[]): HttpBaseResponse;
|
|
169
173
|
/**
|
|
170
174
|
* Sends an XML response.
|
|
171
175
|
*
|
|
172
|
-
*
|
|
176
|
+
* Supports both:
|
|
177
|
+
* - Simple string: `ctx.xml("<note><to>User</to></note>")`
|
|
178
|
+
* - Template literal: `ctx.xml`<note><to>${user}</to></note>``
|
|
173
179
|
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
* @
|
|
180
|
+
* Minimizes intermediate string allocations for lower GC overhead.
|
|
181
|
+
*
|
|
182
|
+
* @param {string | readonly string[]} strings - XML string or template literal array.
|
|
183
|
+
* @param {...any[]} args - Values for template literals or a ResponseInit object if using a string.
|
|
184
|
+
* @returns {HttpBaseResponse} Constructed XML response.
|
|
177
185
|
*/
|
|
178
|
-
xml(
|
|
186
|
+
xml(strings: string, init?: ResponseInit): HttpBaseResponse;
|
|
187
|
+
xml(strings: readonly string[], ...values: any[]): HttpBaseResponse;
|
|
179
188
|
/**
|
|
180
189
|
* Sends a JSON response.
|
|
181
190
|
*
|