tezx 2.0.11 → 3.0.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/README.md +122 -89
- package/bun/getConnInfo.d.ts +21 -0
- package/bun/getConnInfo.js +9 -0
- package/bun/index.d.ts +10 -4
- package/bun/index.js +8 -4
- package/bun/ws.d.ts +48 -0
- package/bun/ws.js +58 -0
- package/cjs/bun/getConnInfo.js +12 -0
- package/cjs/bun/index.js +35 -7
- package/cjs/bun/ws.js +63 -0
- package/cjs/core/config.js +2 -12
- package/cjs/core/context.js +131 -379
- package/cjs/core/error.js +49 -0
- package/cjs/core/request.js +79 -131
- package/cjs/core/router.js +54 -387
- package/cjs/core/server.js +83 -202
- package/cjs/deno/env.js +4 -4
- package/cjs/deno/getConnInfo.js +18 -0
- package/cjs/deno/index.js +11 -18
- package/cjs/deno/serveStatic.js +53 -0
- package/cjs/deno/ws.js +39 -0
- package/cjs/helper/index.js +46 -10
- package/cjs/index.js +5 -7
- package/cjs/jwt/node.js +94 -0
- package/cjs/jwt/web.js +178 -0
- package/cjs/middleware/basic-auth.js +42 -0
- package/cjs/middleware/bearer-auth.js +34 -0
- package/cjs/middleware/cache-control.js +44 -0
- package/cjs/middleware/cors.js +11 -21
- package/cjs/middleware/detect-bot.js +57 -0
- package/cjs/middleware/i18n.js +73 -60
- package/cjs/middleware/index.js +8 -46
- package/cjs/middleware/logger.js +9 -4
- package/cjs/middleware/pagination.js +3 -2
- package/cjs/middleware/powered-by.js +3 -2
- package/cjs/middleware/rate-limiter.js +38 -0
- package/cjs/middleware/request-id.js +4 -5
- package/cjs/middleware/sanitize-headers.js +22 -0
- package/cjs/middleware/secure-headers copy.js +143 -0
- package/cjs/middleware/secure-headers.js +157 -0
- package/cjs/middleware/{xssProtection.js → xss-protection.js} +5 -8
- package/cjs/node/env.js +7 -7
- package/cjs/node/getConnInfo.js +16 -0
- package/cjs/node/index.js +17 -18
- package/cjs/node/mount-node.js +59 -0
- package/cjs/node/serveStatic.js +56 -0
- package/cjs/node/toWebRequest.js +25 -0
- package/cjs/node/ws.js +82 -0
- package/cjs/registry/RadixRouter.js +148 -0
- package/cjs/registry/index.js +17 -0
- package/cjs/types/headers.js +2 -0
- package/cjs/types/index.js +13 -0
- package/cjs/utils/buffer.js +17 -0
- package/cjs/utils/colors.js +2 -0
- package/cjs/utils/cookie.js +59 -0
- package/cjs/utils/file.js +136 -0
- package/cjs/utils/formData.js +60 -10
- package/cjs/utils/generateID.js +37 -0
- package/cjs/utils/low-level.js +115 -0
- package/cjs/utils/{staticFile.js → mimeTypes.js} +0 -87
- package/cjs/utils/rateLimit.js +41 -0
- package/cjs/utils/response.js +65 -0
- package/cjs/{core/environment.js → utils/runtime.js} +2 -1
- package/cjs/utils/url.js +65 -30
- package/core/config.d.ts +2 -7
- package/core/config.js +2 -12
- package/core/context.d.ts +209 -164
- package/core/context.js +131 -346
- package/core/error.d.ts +96 -0
- package/core/error.js +44 -0
- package/core/request.d.ts +67 -107
- package/core/request.js +78 -130
- package/core/router.d.ts +138 -133
- package/core/router.js +53 -352
- package/core/server.d.ts +99 -38
- package/core/server.js +83 -202
- package/deno/env.js +3 -3
- package/deno/getConnInfo.d.ts +21 -0
- package/deno/getConnInfo.js +15 -0
- package/deno/index.d.ts +9 -4
- package/deno/index.js +7 -4
- package/deno/serveStatic.d.ts +28 -0
- package/deno/serveStatic.js +49 -0
- package/deno/ws.d.ts +42 -0
- package/deno/ws.js +36 -0
- package/helper/index.d.ts +29 -15
- package/helper/index.js +27 -7
- package/index.d.ts +10 -8
- package/index.js +4 -5
- package/jwt/node.d.ts +39 -0
- package/jwt/node.js +87 -0
- package/jwt/web.d.ts +14 -0
- package/jwt/web.js +174 -0
- package/middleware/basic-auth.d.ts +56 -0
- package/middleware/basic-auth.js +38 -0
- package/middleware/bearer-auth.d.ts +53 -0
- package/middleware/bearer-auth.js +30 -0
- package/middleware/cache-control.d.ts +30 -0
- package/middleware/cache-control.js +40 -0
- package/middleware/cors.d.ts +30 -3
- package/middleware/cors.js +12 -22
- package/middleware/detect-bot.d.ts +113 -0
- package/middleware/detect-bot.js +53 -0
- package/middleware/i18n.d.ts +166 -73
- package/middleware/i18n.js +73 -60
- package/middleware/index.d.ts +8 -32
- package/middleware/index.js +8 -44
- package/middleware/logger.d.ts +5 -2
- package/middleware/logger.js +9 -4
- package/middleware/pagination.d.ts +9 -6
- package/middleware/pagination.js +3 -2
- package/middleware/powered-by.d.ts +2 -1
- package/middleware/powered-by.js +3 -2
- package/middleware/{rateLimiter.d.ts → rate-limiter.d.ts} +15 -9
- package/middleware/rate-limiter.js +34 -0
- package/middleware/request-id.d.ts +2 -1
- package/middleware/request-id.js +5 -6
- package/middleware/{sanitizeHeader.d.ts → sanitize-headers.d.ts} +5 -19
- package/middleware/sanitize-headers.js +18 -0
- package/middleware/secure-headers copy.d.ts +15 -0
- package/middleware/secure-headers copy.js +136 -0
- package/middleware/secure-headers.d.ts +132 -0
- package/middleware/secure-headers.js +153 -0
- package/middleware/{xssProtection.d.ts → xss-protection.d.ts} +2 -1
- package/middleware/xss-protection.js +19 -0
- package/node/env.js +4 -4
- package/node/getConnInfo.d.ts +21 -0
- package/node/getConnInfo.js +13 -0
- package/node/index.d.ts +13 -4
- package/node/index.js +11 -4
- package/node/mount-node.d.ts +11 -0
- package/node/mount-node.js +56 -0
- package/node/serveStatic.d.ts +36 -0
- package/node/serveStatic.js +52 -0
- package/node/toWebRequest.js +22 -0
- package/node/ws.d.ts +56 -0
- package/node/ws.js +46 -0
- package/package.json +39 -30
- package/registry/RadixRouter.d.ts +40 -0
- package/registry/RadixRouter.js +144 -0
- package/registry/index.d.ts +2 -0
- package/registry/index.js +1 -0
- package/types/headers.d.ts +2 -0
- package/types/headers.js +1 -0
- package/types/index.d.ts +318 -18
- package/types/index.js +12 -1
- package/utils/buffer.d.ts +1 -0
- package/utils/buffer.js +14 -0
- package/utils/colors.d.ts +24 -0
- package/utils/colors.js +2 -0
- package/utils/cookie.d.ts +55 -0
- package/utils/cookie.js +53 -0
- package/utils/file.d.ts +38 -0
- package/utils/file.js +96 -0
- package/utils/formData.d.ts +41 -1
- package/utils/formData.js +58 -9
- package/utils/generateID.d.ts +42 -0
- package/utils/generateID.js +32 -0
- package/utils/httpStatusMap.d.ts +14 -0
- package/utils/low-level.d.ts +58 -0
- package/utils/low-level.js +108 -0
- package/utils/mimeTypes.d.ts +4 -0
- package/utils/{staticFile.js → mimeTypes.js} +0 -53
- package/utils/rateLimit.d.ts +18 -0
- package/utils/rateLimit.js +37 -0
- package/utils/response.d.ts +18 -0
- package/utils/response.js +58 -0
- package/{core/environment.d.ts → utils/runtime.d.ts} +1 -0
- package/{core/environment.js → utils/runtime.js} +1 -0
- package/utils/url.d.ts +42 -14
- package/utils/url.js +61 -27
- package/bun/adapter.d.ts +0 -127
- package/bun/adapter.js +0 -97
- package/cjs/bun/adapter.js +0 -100
- package/cjs/core/MiddlewareConfigure.js +0 -68
- package/cjs/core/common.js +0 -15
- package/cjs/deno/adpater.js +0 -67
- package/cjs/helper/common.js +0 -17
- package/cjs/middleware/basicAuth.js +0 -71
- package/cjs/middleware/cacheControl.js +0 -90
- package/cjs/middleware/detectBot.js +0 -104
- package/cjs/middleware/detectLocale.js +0 -43
- package/cjs/middleware/lazyLoadModules.js +0 -73
- package/cjs/middleware/rateLimiter.js +0 -24
- package/cjs/middleware/requestTimeout.js +0 -42
- package/cjs/middleware/sanitizeHeader.js +0 -51
- package/cjs/middleware/secureHeaders.js +0 -42
- package/cjs/node/adapter.js +0 -138
- package/cjs/utils/regexRouter.js +0 -58
- package/cjs/utils/state.js +0 -34
- package/cjs/utils/toWebRequest.js +0 -35
- package/cjs/ws/deno.js +0 -20
- package/cjs/ws/index.js +0 -53
- package/cjs/ws/node.js +0 -65
- package/core/MiddlewareConfigure.d.ts +0 -15
- package/core/MiddlewareConfigure.js +0 -63
- package/core/common.d.ts +0 -21
- package/core/common.js +0 -11
- package/deno/adpater.d.ts +0 -38
- package/deno/adpater.js +0 -64
- package/helper/common.d.ts +0 -5
- package/helper/common.js +0 -14
- package/middleware/basicAuth.d.ts +0 -81
- package/middleware/basicAuth.js +0 -67
- package/middleware/cacheControl.d.ts +0 -48
- package/middleware/cacheControl.js +0 -53
- package/middleware/detectBot.d.ts +0 -121
- package/middleware/detectBot.js +0 -98
- package/middleware/detectLocale.d.ts +0 -55
- package/middleware/detectLocale.js +0 -39
- package/middleware/lazyLoadModules.d.ts +0 -72
- package/middleware/lazyLoadModules.js +0 -69
- package/middleware/rateLimiter.js +0 -20
- package/middleware/requestTimeout.d.ts +0 -25
- package/middleware/requestTimeout.js +0 -38
- package/middleware/sanitizeHeader.js +0 -47
- package/middleware/secureHeaders.d.ts +0 -78
- package/middleware/secureHeaders.js +0 -38
- package/middleware/xssProtection.js +0 -22
- package/node/adapter.d.ts +0 -46
- package/node/adapter.js +0 -102
- package/utils/regexRouter.d.ts +0 -66
- package/utils/regexRouter.js +0 -53
- package/utils/state.d.ts +0 -50
- package/utils/state.js +0 -30
- package/utils/staticFile.d.ts +0 -10
- package/utils/toWebRequest.js +0 -32
- package/ws/deno.d.ts +0 -6
- package/ws/deno.js +0 -16
- package/ws/index.d.ts +0 -180
- package/ws/index.js +0 -50
- package/ws/node.d.ts +0 -7
- package/ws/node.js +0 -28
- /package/{utils → node}/toWebRequest.d.ts +0 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mountTezXOnNode = mountTezXOnNode;
|
|
4
|
+
const node_stream_1 = require("node:stream");
|
|
5
|
+
const config_js_1 = require("../core/config.js");
|
|
6
|
+
const toWebRequest_js_1 = require("./toWebRequest.js");
|
|
7
|
+
function readableStreamToNodeStream(stream) {
|
|
8
|
+
const reader = stream.getReader();
|
|
9
|
+
return new node_stream_1.Readable({
|
|
10
|
+
async read() {
|
|
11
|
+
try {
|
|
12
|
+
const { done, value } = await reader.read();
|
|
13
|
+
if (done) {
|
|
14
|
+
this.push(null);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
this.push(value);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
this.destroy(err);
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
destroy(err, callback) {
|
|
25
|
+
reader.cancel().then(() => callback(err), (cancelErr) => callback(cancelErr));
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function mountTezXOnNode(app, server) {
|
|
30
|
+
server.on("request", async (req, res) => {
|
|
31
|
+
try {
|
|
32
|
+
const request = (0, toWebRequest_js_1.toWebRequest)(req, req.method);
|
|
33
|
+
const response = await app.serve(request, req, res, server);
|
|
34
|
+
if (res.writableEnded || res.headersSent)
|
|
35
|
+
return;
|
|
36
|
+
const { status = 200, statusText = "", headers = {}, body } = response;
|
|
37
|
+
const nodeHeaders = Object.fromEntries(headers instanceof Headers
|
|
38
|
+
? headers.entries()
|
|
39
|
+
: Object.entries(headers));
|
|
40
|
+
res.writeHead(status, statusText, nodeHeaders);
|
|
41
|
+
if (!body) {
|
|
42
|
+
return res.end();
|
|
43
|
+
}
|
|
44
|
+
if (body instanceof node_stream_1.Readable) {
|
|
45
|
+
return body.pipe(res);
|
|
46
|
+
}
|
|
47
|
+
if (typeof body.getReader === "function") {
|
|
48
|
+
return (node_stream_1.Readable.fromWeb?.(body)?.pipe?.(res) ??
|
|
49
|
+
readableStreamToNodeStream(body).pipe(res));
|
|
50
|
+
}
|
|
51
|
+
res.end(body);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
res.statusCode = 500;
|
|
55
|
+
config_js_1.GlobalConfig.debugging?.error?.(err?.message || "Unknown error");
|
|
56
|
+
res.end(err?.message || "Internal Server Error");
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serveStatic = serveStatic;
|
|
4
|
+
exports.getFiles = getFiles;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const low_level_js_1 = require("../utils/low-level.js");
|
|
8
|
+
const error_js_1 = require("../core/error.js");
|
|
9
|
+
function serveStatic(...args) {
|
|
10
|
+
let route = "";
|
|
11
|
+
let dir;
|
|
12
|
+
let options = {};
|
|
13
|
+
switch (args.length) {
|
|
14
|
+
case 3:
|
|
15
|
+
[route, dir, options] = args;
|
|
16
|
+
break;
|
|
17
|
+
case 2:
|
|
18
|
+
if (typeof args[1] === "object") {
|
|
19
|
+
[dir, options] = args;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
[route, dir] = args;
|
|
23
|
+
}
|
|
24
|
+
break;
|
|
25
|
+
case 1:
|
|
26
|
+
[dir] = args;
|
|
27
|
+
break;
|
|
28
|
+
default:
|
|
29
|
+
throw new error_js_1.TezXError(`\x1b[1;31m404 Not Found\x1b[0m \x1b[1;32mInvalid arguments\x1b[0m`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
files: getFiles(dir, route, options),
|
|
33
|
+
options,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function getFiles(dir, basePath = "/", option = {}) {
|
|
37
|
+
const files = [];
|
|
38
|
+
const entries = (0, node_fs_1.readdirSync)(dir, { withFileTypes: true });
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
const fullPath = (0, node_path_1.join)(dir, entry.name);
|
|
41
|
+
if (entry.isDirectory()) {
|
|
42
|
+
files.push(...getFiles(fullPath, `${basePath}/${entry.name}`, option));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const ext = (0, low_level_js_1.extensionExtract)(entry.name);
|
|
46
|
+
if (option?.extensions?.length && !option.extensions.includes(ext)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
files.push({
|
|
50
|
+
fileSource: fullPath,
|
|
51
|
+
route: `/${(0, low_level_js_1.sanitizePathSplitBasePath)(basePath, entry.name).join("/")}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return files;
|
|
56
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toWebRequest = toWebRequest;
|
|
4
|
+
const node_stream_1 = require("node:stream");
|
|
5
|
+
function toWebRequest(req, method = "GET") {
|
|
6
|
+
const protocol = req.socket && req.socket.encrypted ? "https:" : "http:";
|
|
7
|
+
const upperMethod = method.length === 3
|
|
8
|
+
? method === "get"
|
|
9
|
+
? "GET"
|
|
10
|
+
: method === "put"
|
|
11
|
+
? "PUT"
|
|
12
|
+
: method.toUpperCase()
|
|
13
|
+
: method.toUpperCase();
|
|
14
|
+
let host = req.headers.host || "localhost";
|
|
15
|
+
const hasBody = upperMethod !== "GET" && upperMethod !== "HEAD";
|
|
16
|
+
const abortController = new AbortController();
|
|
17
|
+
req?.once("close", () => abortController.abort());
|
|
18
|
+
return new Request(protocol + "//" + host + (req.url ?? "/"), {
|
|
19
|
+
method,
|
|
20
|
+
headers: req?.headers,
|
|
21
|
+
body: hasBody ? node_stream_1.Readable.toWeb(req) : undefined,
|
|
22
|
+
signal: abortController.signal,
|
|
23
|
+
duplex: hasBody ? "half" : undefined,
|
|
24
|
+
});
|
|
25
|
+
}
|
package/cjs/node/ws.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.upgradeWebSocket = upgradeWebSocket;
|
|
37
|
+
const error_js_1 = require("../core/error.js");
|
|
38
|
+
function upgradeWebSocket(callback, options = {}) {
|
|
39
|
+
const { onUpgradeError = (error, ctx) => {
|
|
40
|
+
ctx.setStatus = 401;
|
|
41
|
+
return ctx.text(error.message);
|
|
42
|
+
}, } = options;
|
|
43
|
+
return async (ctx, next) => {
|
|
44
|
+
const upgrade = ctx.req.header("upgrade")?.toLowerCase();
|
|
45
|
+
const connection = ctx.req.header("connection")?.toLowerCase();
|
|
46
|
+
const key = ctx.req.header("sec-websocket-key");
|
|
47
|
+
if (upgrade !== "websocket" || !connection?.includes("upgrade") || !key) {
|
|
48
|
+
if (next) {
|
|
49
|
+
ctx.body = { error: "401 Bad Request: Invalid WebSocket headers" };
|
|
50
|
+
return next();
|
|
51
|
+
}
|
|
52
|
+
ctx.setStatus = 401;
|
|
53
|
+
return onUpgradeError(new error_js_1.TezXError("401 Bad Request: Invalid WebSocket headers", 401), ctx);
|
|
54
|
+
}
|
|
55
|
+
ctx.wsProtocol = ctx.url?.startsWith("https") ? "wss" : "ws";
|
|
56
|
+
const server = ctx.args?.[2];
|
|
57
|
+
if (!server?.on) {
|
|
58
|
+
ctx.setStatus = 500;
|
|
59
|
+
return onUpgradeError(new error_js_1.TezXError("Node server instance missing for WebSocket", 426), ctx);
|
|
60
|
+
}
|
|
61
|
+
const { WebSocketServer } = await Promise.resolve().then(() => __importStar(require("ws")));
|
|
62
|
+
const wss = new WebSocketServer({
|
|
63
|
+
noServer: true,
|
|
64
|
+
maxPayload: options.maxPayload ?? 1048576,
|
|
65
|
+
perMessageDeflate: options.perMessageDeflate ?? false,
|
|
66
|
+
});
|
|
67
|
+
server.on("upgrade", (request, socket, head) => {
|
|
68
|
+
wss?.handleUpgrade(request, socket, head, (ws) => {
|
|
69
|
+
wss?.emit("connection", ws, request);
|
|
70
|
+
let event = callback(ctx);
|
|
71
|
+
event.open?.(ws);
|
|
72
|
+
ws.on("open", () => event.open?.(ws));
|
|
73
|
+
ws.on("message", (data) => event.message?.(ws, data));
|
|
74
|
+
ws.on("close", (code, reason) => event.close?.(ws, { code, reason }));
|
|
75
|
+
ws.on("error", (err) => event.error?.(ws, err));
|
|
76
|
+
ws.on("ping", (data) => event.ping?.(ws, data));
|
|
77
|
+
ws.on("pong", (data) => event.pong?.(ws, data));
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
return next();
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RadixRouter = void 0;
|
|
4
|
+
const error_js_1 = require("../core/error.js");
|
|
5
|
+
const index_js_1 = require("../helper/index.js");
|
|
6
|
+
class RadixRouter {
|
|
7
|
+
root = { children: {} };
|
|
8
|
+
name;
|
|
9
|
+
constructor() {
|
|
10
|
+
this.name = "RadixRouter";
|
|
11
|
+
}
|
|
12
|
+
addRoute(method, path, handlers) {
|
|
13
|
+
const segments = this.parsePattern(path);
|
|
14
|
+
let node = this.root;
|
|
15
|
+
for (let i = 0; i < segments.length; i++) {
|
|
16
|
+
const { type, value, paramName, isOptional } = segments[i];
|
|
17
|
+
if (type === "static") {
|
|
18
|
+
node = node.children[value] ??= { children: {} };
|
|
19
|
+
}
|
|
20
|
+
else if (type === "dynamic") {
|
|
21
|
+
if (!node.children[":"]) {
|
|
22
|
+
node.children[":"] = { children: {}, paramName, isOptional };
|
|
23
|
+
}
|
|
24
|
+
else if (node.children[":"]?.paramName !== paramName ||
|
|
25
|
+
node.children[":"]?.isOptional !== isOptional) {
|
|
26
|
+
throw new error_js_1.TezXError(`Conflicting param definition for ${paramName}`);
|
|
27
|
+
}
|
|
28
|
+
node = node.children[":"];
|
|
29
|
+
}
|
|
30
|
+
else if (type === "wildcard") {
|
|
31
|
+
node = node.children["*"] ??= { children: {}, paramName };
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
node.isEndpoint = true;
|
|
36
|
+
node.handlers ??= {};
|
|
37
|
+
node.handlers[method] ??= [];
|
|
38
|
+
node.handlers[method].push(...(handlers || []));
|
|
39
|
+
}
|
|
40
|
+
search(method, path) {
|
|
41
|
+
let params = {};
|
|
42
|
+
let middlewares = [];
|
|
43
|
+
const { success, node } = this._match(method, this.root, path?.split("/")?.filter(Boolean), 0, params, middlewares);
|
|
44
|
+
if (success && node) {
|
|
45
|
+
const handlers = node.handlers?.[method] ?? [];
|
|
46
|
+
return { method, params, handlers, middlewares };
|
|
47
|
+
}
|
|
48
|
+
return { method, params: {}, handlers: [], middlewares };
|
|
49
|
+
}
|
|
50
|
+
_match(method, node, segments, index, params, middlewares) {
|
|
51
|
+
if (node?.handlers?.ALL) {
|
|
52
|
+
const mw = node.handlers?.ALL;
|
|
53
|
+
for (let i = 0; i < mw.length; i++) {
|
|
54
|
+
middlewares.push(mw[i]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (index === segments.length) {
|
|
58
|
+
if (node.isEndpoint && node.handlers?.[method])
|
|
59
|
+
return { success: true, node };
|
|
60
|
+
const opt = node.children[":"];
|
|
61
|
+
if (opt?.isOptional) {
|
|
62
|
+
params[opt.paramName] = null;
|
|
63
|
+
return this._match(method, opt, segments, index, params, middlewares);
|
|
64
|
+
}
|
|
65
|
+
return { success: false, node: node };
|
|
66
|
+
}
|
|
67
|
+
const wc = node.children["*"];
|
|
68
|
+
const seg = segments[index];
|
|
69
|
+
if (node.children[seg]) {
|
|
70
|
+
const res = this._match(method, node.children[seg], segments, index + 1, params, middlewares);
|
|
71
|
+
if (res.success) {
|
|
72
|
+
if (wc?.handlers?.ALL) {
|
|
73
|
+
const mw = wc.handlers?.ALL;
|
|
74
|
+
for (let i = 0; i < mw.length; i++) {
|
|
75
|
+
middlewares.push(mw[i]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return res;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const dyn = node.children[":"];
|
|
82
|
+
if (dyn) {
|
|
83
|
+
params[dyn.paramName] = seg;
|
|
84
|
+
const res = this._match(method, dyn, segments, index + 1, params, middlewares);
|
|
85
|
+
if (res.success) {
|
|
86
|
+
if (wc?.handlers?.ALL) {
|
|
87
|
+
const mw = wc.handlers?.ALL;
|
|
88
|
+
for (let i = 0; i < mw.length; i++) {
|
|
89
|
+
middlewares.push(mw[i]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return res;
|
|
93
|
+
}
|
|
94
|
+
if (dyn.isOptional) {
|
|
95
|
+
params[dyn.paramName] = null;
|
|
96
|
+
const skip = this._match(method, dyn, segments, index, params, middlewares);
|
|
97
|
+
if (skip.success) {
|
|
98
|
+
if (wc?.handlers?.ALL) {
|
|
99
|
+
const mw = wc.handlers?.ALL;
|
|
100
|
+
for (let i = 0; i < mw.length; i++) {
|
|
101
|
+
middlewares.push(mw[i]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return skip;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (wc) {
|
|
109
|
+
let wildcard = segments.slice(index).join("/");
|
|
110
|
+
if (wc?.handlers?.ALL) {
|
|
111
|
+
const mw = wc.handlers?.ALL;
|
|
112
|
+
for (let i = 0; i < mw.length; i++) {
|
|
113
|
+
middlewares.push(mw[i]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (wildcard) {
|
|
117
|
+
params[wc.paramName] = wildcard;
|
|
118
|
+
return { node: wc, success: true };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { success: false, node };
|
|
122
|
+
}
|
|
123
|
+
parsePattern(pattern) {
|
|
124
|
+
const segments = (0, index_js_1.sanitizePathSplit)(pattern);
|
|
125
|
+
const result = [];
|
|
126
|
+
for (const segment of segments) {
|
|
127
|
+
if (segment === "*") {
|
|
128
|
+
result.push({ type: "wildcard", paramName: "*" });
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
else if (segment.startsWith("*")) {
|
|
132
|
+
const paramName = segment.slice(1) || "*";
|
|
133
|
+
result.push({ type: "wildcard", paramName });
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
else if (segment.startsWith(":")) {
|
|
137
|
+
const isOptional = segment.endsWith("?");
|
|
138
|
+
const paramName = isOptional ? segment.slice(1, -1) : segment.slice(1);
|
|
139
|
+
result.push({ type: "dynamic", paramName, isOptional });
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
result.push({ type: "static", value: segment });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.RadixRouter = RadixRouter;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./RadixRouter.js"), exports);
|
package/cjs/types/index.js
CHANGED
|
@@ -1,2 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpMethod = void 0;
|
|
4
|
+
exports.httpMethod = [
|
|
5
|
+
"GET",
|
|
6
|
+
"POST",
|
|
7
|
+
"PUT",
|
|
8
|
+
"DELETE",
|
|
9
|
+
"OPTIONS",
|
|
10
|
+
"PATCH",
|
|
11
|
+
"HEAD",
|
|
12
|
+
"ALL",
|
|
13
|
+
"TRACE",
|
|
14
|
+
"CONNECT",
|
|
15
|
+
];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.base64Decode = base64Decode;
|
|
4
|
+
function base64Decode(base64) {
|
|
5
|
+
const pad = base64.length % 4;
|
|
6
|
+
if (pad)
|
|
7
|
+
base64 += "=".repeat(4 - pad);
|
|
8
|
+
if (typeof Buffer !== "undefined") {
|
|
9
|
+
return Buffer.from(base64, "base64").toString("utf-8");
|
|
10
|
+
}
|
|
11
|
+
else if (typeof atob === "function") {
|
|
12
|
+
return new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
throw new Error("Base64 decode not supported in this environment");
|
|
16
|
+
}
|
|
17
|
+
}
|
package/cjs/utils/colors.js
CHANGED
|
@@ -22,6 +22,8 @@ exports.COLORS = {
|
|
|
22
22
|
bgMagenta: "\x1b[45m",
|
|
23
23
|
bgCyan: "\x1b[46m",
|
|
24
24
|
bgWhite: "\x1b[47m",
|
|
25
|
+
orange: "\x1b[38;2;255;88;30m",
|
|
26
|
+
bgOrange: "\x1b[48;2;255;88;30m",
|
|
25
27
|
};
|
|
26
28
|
function colorText(text, color) {
|
|
27
29
|
return `${exports.COLORS[color]}${text}${exports.COLORS.reset}`;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCookie = getCookie;
|
|
4
|
+
exports.allCookies = allCookies;
|
|
5
|
+
exports.setCookie = setCookie;
|
|
6
|
+
exports.deleteCookie = deleteCookie;
|
|
7
|
+
function getCookie(ctx, name) {
|
|
8
|
+
return allCookies(ctx)?.[name];
|
|
9
|
+
}
|
|
10
|
+
function allCookies(ctx) {
|
|
11
|
+
const cookieHeader = ctx.req.header("cookie");
|
|
12
|
+
const cookies = {};
|
|
13
|
+
if (!cookieHeader)
|
|
14
|
+
return cookies;
|
|
15
|
+
let start = 0;
|
|
16
|
+
let sep = -1;
|
|
17
|
+
const len = cookieHeader.length;
|
|
18
|
+
for (let i = 0; i <= len; i++) {
|
|
19
|
+
const ch = cookieHeader.charCodeAt(i) || 59;
|
|
20
|
+
if (ch === 61 && sep === -1) {
|
|
21
|
+
sep = i;
|
|
22
|
+
}
|
|
23
|
+
else if (ch === 59 || i === len) {
|
|
24
|
+
if (sep > -1) {
|
|
25
|
+
const key = cookieHeader.slice(start, sep).trim();
|
|
26
|
+
const value = cookieHeader.slice(sep + 1, i).trim();
|
|
27
|
+
cookies[key] = decodeURIComponent(value);
|
|
28
|
+
}
|
|
29
|
+
start = i + 1;
|
|
30
|
+
sep = -1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
ctx.cookies = cookies;
|
|
34
|
+
return cookies;
|
|
35
|
+
}
|
|
36
|
+
function setCookie(ctx, name, value, options) {
|
|
37
|
+
ctx.setHeader("Set-Cookie", `${name}=${value}; ${serializeOptions(options ?? {})}`);
|
|
38
|
+
}
|
|
39
|
+
function deleteCookie(ctx, name, options) {
|
|
40
|
+
ctx.setHeader("Set-Cookie", `${name}=; ${serializeOptions({ ...options, maxAge: 0, expires: new Date(0) })}`);
|
|
41
|
+
}
|
|
42
|
+
function serializeOptions(options) {
|
|
43
|
+
const parts = [];
|
|
44
|
+
if (options.maxAge)
|
|
45
|
+
parts.push(`Max-Age=${options.maxAge}`);
|
|
46
|
+
if (options.expires)
|
|
47
|
+
parts.push(`Expires=${options.expires.toUTCString()}`);
|
|
48
|
+
if (options.path)
|
|
49
|
+
parts.push(`Path=${options.path}`);
|
|
50
|
+
if (options.domain)
|
|
51
|
+
parts.push(`Domain=${options.domain}`);
|
|
52
|
+
if (options.secure)
|
|
53
|
+
parts.push(`Secure`);
|
|
54
|
+
if (options.httpOnly)
|
|
55
|
+
parts.push(`HttpOnly`);
|
|
56
|
+
if (options.sameSite)
|
|
57
|
+
parts.push(`SameSite=${options.sameSite}`);
|
|
58
|
+
return parts.join("; ");
|
|
59
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.fileExists = fileExists;
|
|
37
|
+
exports.getFileBuffer = getFileBuffer;
|
|
38
|
+
exports.readStream = readStream;
|
|
39
|
+
exports.fileSize = fileSize;
|
|
40
|
+
exports.etagDigest = etagDigest;
|
|
41
|
+
const error_js_1 = require("../core/error.js");
|
|
42
|
+
const runtime_js_1 = require("./runtime.js");
|
|
43
|
+
async function fileExists(path) {
|
|
44
|
+
switch (runtime_js_1.runtime) {
|
|
45
|
+
case "node": {
|
|
46
|
+
const { access } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
|
|
47
|
+
try {
|
|
48
|
+
await access(path);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
case "bun":
|
|
56
|
+
return Bun.file(path).exists();
|
|
57
|
+
case "deno":
|
|
58
|
+
try {
|
|
59
|
+
await Deno.stat(path);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
default:
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function getFileBuffer(path) {
|
|
70
|
+
switch (runtime_js_1.runtime) {
|
|
71
|
+
case "node": {
|
|
72
|
+
const { readFile } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
|
|
73
|
+
return readFile(path);
|
|
74
|
+
}
|
|
75
|
+
case "bun": {
|
|
76
|
+
return new Uint8Array(await Bun.file(path).arrayBuffer());
|
|
77
|
+
}
|
|
78
|
+
case "deno":
|
|
79
|
+
return Deno.readFile(path);
|
|
80
|
+
default:
|
|
81
|
+
throw new error_js_1.TezXError("Unsupported runtime environment");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async function readStream(path) {
|
|
85
|
+
switch (runtime_js_1.runtime) {
|
|
86
|
+
case "node": {
|
|
87
|
+
const { createReadStream } = await Promise.resolve().then(() => __importStar(require("node:fs")));
|
|
88
|
+
const { Readable } = await Promise.resolve().then(() => __importStar(require("node:stream")));
|
|
89
|
+
return Readable.toWeb(createReadStream(path));
|
|
90
|
+
}
|
|
91
|
+
case "bun": {
|
|
92
|
+
return Bun.file(path).stream();
|
|
93
|
+
}
|
|
94
|
+
case "deno": {
|
|
95
|
+
return (await Deno.open(path, { read: true })).readable;
|
|
96
|
+
}
|
|
97
|
+
default:
|
|
98
|
+
throw new error_js_1.TezXError("Unsupported runtime environment");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function fileSize(path) {
|
|
102
|
+
switch (runtime_js_1.runtime) {
|
|
103
|
+
case "node": {
|
|
104
|
+
const { stat } = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
|
|
105
|
+
const st = await stat(path);
|
|
106
|
+
return { size: st.size, mtime: st.mtime };
|
|
107
|
+
}
|
|
108
|
+
case "bun": {
|
|
109
|
+
const st = await Bun.file(path).stat();
|
|
110
|
+
return { size: st.size, mtime: st.mtime };
|
|
111
|
+
}
|
|
112
|
+
case "deno": {
|
|
113
|
+
const st = await Deno.stat(path);
|
|
114
|
+
return {
|
|
115
|
+
size: st.size,
|
|
116
|
+
mtime: st.mtime ?? new Date(),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
default:
|
|
120
|
+
throw new error_js_1.TezXError("Unsupported runtime: " + runtime_js_1.runtime);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async function etagDigest(algo = "MD5", data) {
|
|
124
|
+
const encoded = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
125
|
+
if (runtime_js_1.runtime === "bun") {
|
|
126
|
+
return Bun.hash(data, 256).toString(16);
|
|
127
|
+
}
|
|
128
|
+
if (globalThis?.crypto?.subtle) {
|
|
129
|
+
const buffer = await crypto.subtle.digest(algo, encoded);
|
|
130
|
+
return Array.from(new Uint8Array(buffer))
|
|
131
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
132
|
+
.join("");
|
|
133
|
+
}
|
|
134
|
+
const { createHash } = await Promise.resolve().then(() => __importStar(require("node:crypto")));
|
|
135
|
+
return createHash(algo).update(encoded).digest("hex");
|
|
136
|
+
}
|