tezx 3.0.14-beta.1 → 3.0.14-beta2
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/env.d.ts +5 -0
- package/bun/env.js +44 -0
- package/bun/index.d.ts +1 -1
- package/bun/index.js +1 -1
- package/bun/ws.js +4 -3
- package/cjs/bun/env.js +47 -0
- package/cjs/bun/index.js +1 -1
- package/cjs/bun/ws.js +4 -3
- package/cjs/core/context.js +3 -2
- package/cjs/core/error.js +8 -0
- package/cjs/core/request.js +3 -2
- package/cjs/core/router.js +10 -16
- package/cjs/core/server.js +14 -9
- package/cjs/deno/env.js +2 -1
- package/cjs/deno/serveStatic.js +2 -1
- package/cjs/deno/ws.js +4 -3
- package/cjs/helper/index.js +11 -11
- package/cjs/index.js +1 -1
- package/cjs/jwt/node.js +94 -0
- package/cjs/jwt/web.js +178 -0
- package/cjs/middleware/basic-auth.js +9 -14
- package/cjs/middleware/bearer-auth.js +5 -5
- package/cjs/middleware/cache-control.js +1 -2
- package/cjs/middleware/cors.js +1 -1
- package/cjs/middleware/i18n.js +0 -1
- package/cjs/middleware/logger.js +3 -2
- package/cjs/middleware/rate-limiter.js +1 -1
- package/cjs/middleware/sanitize-headers.js +1 -1
- package/cjs/middleware/secure-headers copy.js +27 -13
- package/cjs/middleware/secure-headers.js +18 -6
- package/cjs/node/env.js +4 -3
- package/cjs/node/serveStatic.js +2 -1
- package/cjs/node/ws.js +3 -2
- package/cjs/registry/RadixRouter.js +2 -1
- package/cjs/utils/buffer.js +17 -0
- package/cjs/utils/file.js +9 -6
- package/cjs/utils/generateID.js +1 -1
- package/cjs/utils/response.js +3 -1
- package/core/context.d.ts +3 -3
- package/core/context.js +4 -3
- package/core/error.d.ts +1 -0
- package/core/error.js +7 -0
- package/core/request.js +3 -2
- package/core/router.d.ts +3 -8
- package/core/router.js +10 -16
- package/core/server.d.ts +10 -23
- package/core/server.js +15 -10
- package/deno/env.js +2 -1
- package/deno/index.d.ts +1 -1
- package/deno/serveStatic.js +2 -1
- package/deno/ws.d.ts +1 -1
- package/deno/ws.js +4 -3
- package/helper/index.d.ts +6 -6
- package/helper/index.js +6 -6
- package/index.d.ts +5 -2
- package/index.js +1 -1
- 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 +2 -1
- package/middleware/basic-auth.js +9 -14
- package/middleware/bearer-auth.d.ts +2 -1
- package/middleware/bearer-auth.js +5 -5
- package/middleware/cache-control.js +2 -3
- package/middleware/cors.js +1 -1
- package/middleware/detect-bot.js +1 -1
- package/middleware/i18n.js +0 -1
- package/middleware/logger.d.ts +1 -1
- package/middleware/logger.js +3 -2
- package/middleware/rate-limiter.d.ts +3 -2
- package/middleware/rate-limiter.js +1 -1
- package/middleware/sanitize-headers.js +1 -1
- package/middleware/secure-headers copy.js +27 -13
- package/middleware/secure-headers.d.ts +8 -8
- package/middleware/secure-headers.js +18 -6
- package/node/env.js +4 -3
- package/node/serveStatic.js +2 -1
- package/node/ws.d.ts +1 -1
- package/node/ws.js +3 -2
- package/package.json +12 -1
- package/registry/RadixRouter.js +2 -1
- package/types/index.d.ts +1 -1
- package/utils/buffer.d.ts +1 -0
- package/utils/buffer.js +14 -0
- package/utils/file.js +9 -6
- package/utils/generateID.js +1 -1
- package/utils/response.js +3 -1
- package/cjs/utils/regexRouter.js +0 -57
- package/utils/regexRouter.d.ts +0 -66
- package/utils/regexRouter.js +0 -52
package/bun/env.d.ts
ADDED
package/bun/env.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { TezXError } from "../core/error.js";
|
|
2
|
+
import { colorText } from "../utils/colors.js";
|
|
3
|
+
import { runtime } from "../utils/runtime.js";
|
|
4
|
+
async function parseEnvFile(filePath, result) {
|
|
5
|
+
try {
|
|
6
|
+
if (runtime !== "bun") {
|
|
7
|
+
throw new TezXError(`Please use ${colorText(`import {loadEnv} from "tezx/${runtime}"`, "bgRed")} environment`);
|
|
8
|
+
}
|
|
9
|
+
const fileExists = await Bun.file(filePath).exists();
|
|
10
|
+
if (!fileExists)
|
|
11
|
+
return;
|
|
12
|
+
const fileContent = await Bun.file(filePath).text();
|
|
13
|
+
const lines = fileContent.split("\n");
|
|
14
|
+
for (const line of lines) {
|
|
15
|
+
const trimmedLine = line.trim();
|
|
16
|
+
if (!trimmedLine || trimmedLine.startsWith("#"))
|
|
17
|
+
continue;
|
|
18
|
+
const [key, value] = trimmedLine.split("=", 2).map((p) => p.trim());
|
|
19
|
+
if (key && value) {
|
|
20
|
+
const parsedValue = value
|
|
21
|
+
.replace(/^"(.*)"$/, "$1")
|
|
22
|
+
.replace(/^'(.*)'$/, "$1");
|
|
23
|
+
result[key] = parsedValue;
|
|
24
|
+
Bun.env[key] = parsedValue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error(`[dotenv] Error parsing file: ${filePath}`, error);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function loadEnv(basePath = "./") {
|
|
33
|
+
const result = {};
|
|
34
|
+
const envFiles = [
|
|
35
|
+
".env",
|
|
36
|
+
".env.local",
|
|
37
|
+
`.env.${Bun.env.NODE_ENV || "development"}`,
|
|
38
|
+
`.env.${Bun.env.NODE_ENV || "development"}.local`,
|
|
39
|
+
];
|
|
40
|
+
for (const envFile of envFiles) {
|
|
41
|
+
await parseEnvFile(`${basePath && basePath.endsWith("/") ? basePath : `${basePath}/`}${envFile}`, result);
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
package/bun/index.d.ts
CHANGED
package/bun/index.js
CHANGED
package/bun/ws.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TezXError } from "../core/error.js";
|
|
1
2
|
export function upgradeWebSocket(callback, options = {}) {
|
|
2
3
|
const { onUpgradeError = (error, ctx) => {
|
|
3
4
|
ctx.setStatus = 401;
|
|
@@ -13,15 +14,15 @@ export function upgradeWebSocket(callback, options = {}) {
|
|
|
13
14
|
return next();
|
|
14
15
|
}
|
|
15
16
|
ctx.setStatus = 401;
|
|
16
|
-
return onUpgradeError(new
|
|
17
|
+
return onUpgradeError(new TezXError("401 Bad Request: Invalid WebSocket headers", 401), ctx);
|
|
17
18
|
}
|
|
18
19
|
ctx.wsProtocol = ctx.url?.startsWith("https") ? "wss" : "ws";
|
|
19
20
|
if (!callback) {
|
|
20
|
-
throw new
|
|
21
|
+
throw new TezXError("WebSocket callback is missing. Please provide a valid callback function to handle the WebSocket events.");
|
|
21
22
|
}
|
|
22
23
|
let args = ctx.args[0];
|
|
23
24
|
if (!args?.upgrade) {
|
|
24
|
-
return onUpgradeError(new
|
|
25
|
+
return onUpgradeError(new TezXError("Bun server instance missing for WebSocket"), ctx);
|
|
25
26
|
}
|
|
26
27
|
const success = args.upgrade(ctx.rawRequest, {
|
|
27
28
|
data: callback(ctx),
|
package/cjs/bun/env.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadEnv = loadEnv;
|
|
4
|
+
const error_js_1 = require("../core/error.js");
|
|
5
|
+
const colors_js_1 = require("../utils/colors.js");
|
|
6
|
+
const runtime_js_1 = require("../utils/runtime.js");
|
|
7
|
+
async function parseEnvFile(filePath, result) {
|
|
8
|
+
try {
|
|
9
|
+
if (runtime_js_1.runtime !== "bun") {
|
|
10
|
+
throw new error_js_1.TezXError(`Please use ${(0, colors_js_1.colorText)(`import {loadEnv} from "tezx/${runtime_js_1.runtime}"`, "bgRed")} environment`);
|
|
11
|
+
}
|
|
12
|
+
const fileExists = await Bun.file(filePath).exists();
|
|
13
|
+
if (!fileExists)
|
|
14
|
+
return;
|
|
15
|
+
const fileContent = await Bun.file(filePath).text();
|
|
16
|
+
const lines = fileContent.split("\n");
|
|
17
|
+
for (const line of lines) {
|
|
18
|
+
const trimmedLine = line.trim();
|
|
19
|
+
if (!trimmedLine || trimmedLine.startsWith("#"))
|
|
20
|
+
continue;
|
|
21
|
+
const [key, value] = trimmedLine.split("=", 2).map((p) => p.trim());
|
|
22
|
+
if (key && value) {
|
|
23
|
+
const parsedValue = value
|
|
24
|
+
.replace(/^"(.*)"$/, "$1")
|
|
25
|
+
.replace(/^'(.*)'$/, "$1");
|
|
26
|
+
result[key] = parsedValue;
|
|
27
|
+
Bun.env[key] = parsedValue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
console.error(`[dotenv] Error parsing file: ${filePath}`, error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function loadEnv(basePath = "./") {
|
|
36
|
+
const result = {};
|
|
37
|
+
const envFiles = [
|
|
38
|
+
".env",
|
|
39
|
+
".env.local",
|
|
40
|
+
`.env.${Bun.env.NODE_ENV || "development"}`,
|
|
41
|
+
`.env.${Bun.env.NODE_ENV || "development"}.local`,
|
|
42
|
+
];
|
|
43
|
+
for (const envFile of envFiles) {
|
|
44
|
+
await parseEnvFile(`${basePath && basePath.endsWith("/") ? basePath : `${basePath}/`}${envFile}`, result);
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
package/cjs/bun/index.js
CHANGED
|
@@ -34,7 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.wsHandlers = exports.upgradeWebSocket = exports.serveStatic = exports.loadEnv = exports.getConnInfo = void 0;
|
|
37
|
-
const env_js_1 = require("
|
|
37
|
+
const env_js_1 = require("./env.js");
|
|
38
38
|
Object.defineProperty(exports, "loadEnv", { enumerable: true, get: function () { return env_js_1.loadEnv; } });
|
|
39
39
|
const serveStatic_js_1 = require("../node/serveStatic.js");
|
|
40
40
|
Object.defineProperty(exports, "serveStatic", { enumerable: true, get: function () { return serveStatic_js_1.serveStatic; } });
|
package/cjs/bun/ws.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.wsHandlers = void 0;
|
|
4
4
|
exports.upgradeWebSocket = upgradeWebSocket;
|
|
5
|
+
const error_js_1 = require("../core/error.js");
|
|
5
6
|
function upgradeWebSocket(callback, options = {}) {
|
|
6
7
|
const { onUpgradeError = (error, ctx) => {
|
|
7
8
|
ctx.setStatus = 401;
|
|
@@ -17,15 +18,15 @@ function upgradeWebSocket(callback, options = {}) {
|
|
|
17
18
|
return next();
|
|
18
19
|
}
|
|
19
20
|
ctx.setStatus = 401;
|
|
20
|
-
return onUpgradeError(new
|
|
21
|
+
return onUpgradeError(new error_js_1.TezXError("401 Bad Request: Invalid WebSocket headers", 401), ctx);
|
|
21
22
|
}
|
|
22
23
|
ctx.wsProtocol = ctx.url?.startsWith("https") ? "wss" : "ws";
|
|
23
24
|
if (!callback) {
|
|
24
|
-
throw new
|
|
25
|
+
throw new error_js_1.TezXError("WebSocket callback is missing. Please provide a valid callback function to handle the WebSocket events.");
|
|
25
26
|
}
|
|
26
27
|
let args = ctx.args[0];
|
|
27
28
|
if (!args?.upgrade) {
|
|
28
|
-
return onUpgradeError(new
|
|
29
|
+
return onUpgradeError(new error_js_1.TezXError("Bun server instance missing for WebSocket"), ctx);
|
|
29
30
|
}
|
|
30
31
|
const success = args.upgrade(ctx.rawRequest, {
|
|
31
32
|
data: callback(ctx),
|
package/cjs/core/context.js
CHANGED
|
@@ -5,6 +5,7 @@ const file_js_1 = require("../utils/file.js");
|
|
|
5
5
|
const low_level_js_1 = require("../utils/low-level.js");
|
|
6
6
|
const mimeTypes_js_1 = require("../utils/mimeTypes.js");
|
|
7
7
|
const response_js_1 = require("../utils/response.js");
|
|
8
|
+
const error_js_1 = require("./error.js");
|
|
8
9
|
const request_js_1 = require("./request.js");
|
|
9
10
|
class Context {
|
|
10
11
|
#status = 200;
|
|
@@ -136,7 +137,7 @@ class Context {
|
|
|
136
137
|
}
|
|
137
138
|
async download(filePath, filename) {
|
|
138
139
|
if (!(await (0, file_js_1.fileExists)(filePath)))
|
|
139
|
-
throw
|
|
140
|
+
throw error_js_1.TezXError.notFound("File not found");
|
|
140
141
|
const buf = await (0, file_js_1.getFileBuffer)(filePath);
|
|
141
142
|
const headers = {
|
|
142
143
|
"Content-Disposition": `attachment; filename="${filename}"`,
|
|
@@ -149,7 +150,7 @@ class Context {
|
|
|
149
150
|
}
|
|
150
151
|
async sendFile(filePath, init) {
|
|
151
152
|
if (!(await (0, file_js_1.fileExists)(filePath)))
|
|
152
|
-
throw
|
|
153
|
+
throw error_js_1.TezXError.notFound("File not found");
|
|
153
154
|
let { size, mtime } = await (0, file_js_1.fileSize)(filePath);
|
|
154
155
|
const ext = (0, low_level_js_1.extensionExtract)(filePath);
|
|
155
156
|
const mimeType = mimeTypes_js_1.mimeTypes[ext] ?? mimeTypes_js_1.defaultMimeType;
|
package/cjs/core/error.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TezXError = void 0;
|
|
4
|
+
exports.TezXErrorParse = TezXErrorParse;
|
|
4
5
|
class TezXError extends Error {
|
|
5
6
|
statusCode;
|
|
6
7
|
details;
|
|
@@ -39,3 +40,10 @@ class TezXError extends Error {
|
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
exports.TezXError = TezXError;
|
|
43
|
+
function TezXErrorParse(err, statusCode) {
|
|
44
|
+
if (err instanceof TezXError)
|
|
45
|
+
return err;
|
|
46
|
+
else if (err instanceof Error)
|
|
47
|
+
return new TezXError(err?.message, 500, err?.stack);
|
|
48
|
+
return new TezXError(String(err), statusCode);
|
|
49
|
+
}
|
package/cjs/core/request.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TezXRequest = void 0;
|
|
4
4
|
const url_js_1 = require("../utils/url.js");
|
|
5
|
+
const error_js_1 = require("./error.js");
|
|
5
6
|
class TezXRequest {
|
|
6
7
|
url;
|
|
7
8
|
method;
|
|
@@ -83,11 +84,11 @@ class TezXRequest {
|
|
|
83
84
|
return this.#cachedFormObject;
|
|
84
85
|
const ct = this.#contentType;
|
|
85
86
|
if (!ct)
|
|
86
|
-
throw new
|
|
87
|
+
throw new error_js_1.TezXError("Missing Content-Type");
|
|
87
88
|
if (ct === "application/x-www-form-urlencoded" ||
|
|
88
89
|
ct === "multipart/form-data") {
|
|
89
90
|
if (this.#bodyConsumed) {
|
|
90
|
-
throw new
|
|
91
|
+
throw new error_js_1.TezXError("Multipart body already consumed elsewhere");
|
|
91
92
|
}
|
|
92
93
|
this.#cachedFormObject = (await this.#rawRequest.formData());
|
|
93
94
|
this.#bodyConsumed = true;
|
package/cjs/core/router.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Router = void 0;
|
|
4
|
-
const RadixRouter_js_1 = require("../registry/RadixRouter.js");
|
|
5
4
|
const low_level_js_1 = require("../utils/low-level.js");
|
|
5
|
+
const error_js_1 = require("./error.js");
|
|
6
6
|
class Router {
|
|
7
7
|
env = {};
|
|
8
8
|
router;
|
|
9
9
|
route = [];
|
|
10
10
|
staticFile = Object.create(null);
|
|
11
11
|
basePath;
|
|
12
|
-
constructor({ basePath = "/", env = {}
|
|
13
|
-
this.router = routeRegistry;
|
|
12
|
+
constructor({ basePath = "/", env = {} } = {}) {
|
|
14
13
|
this.basePath = basePath;
|
|
15
14
|
this.env = { ...env };
|
|
16
15
|
this.get = this.get.bind(this);
|
|
@@ -77,14 +76,14 @@ class Router {
|
|
|
77
76
|
return this;
|
|
78
77
|
}
|
|
79
78
|
addRouter(path, router) {
|
|
80
|
-
return this.#
|
|
79
|
+
return this.#addRouterInstance(path, router);
|
|
81
80
|
}
|
|
82
81
|
group(prefix, callback) {
|
|
83
82
|
const router = new Router({
|
|
84
83
|
basePath: prefix,
|
|
85
84
|
});
|
|
86
85
|
callback(router);
|
|
87
|
-
this.#
|
|
86
|
+
this.#addRouterInstance("/", router);
|
|
88
87
|
return this;
|
|
89
88
|
}
|
|
90
89
|
use(...args) {
|
|
@@ -131,7 +130,7 @@ class Router {
|
|
|
131
130
|
}
|
|
132
131
|
#addRoute(method, path, handlers) {
|
|
133
132
|
let pattern = `/${(0, low_level_js_1.sanitizePathSplitBasePath)(this.basePath, path).join("/")}`;
|
|
134
|
-
this.router
|
|
133
|
+
this.router?.addRoute(method, pattern, handlers);
|
|
135
134
|
this.route.push({
|
|
136
135
|
method: method,
|
|
137
136
|
pattern: pattern,
|
|
@@ -140,7 +139,7 @@ class Router {
|
|
|
140
139
|
}
|
|
141
140
|
#registerRoute(method, path, ...args) {
|
|
142
141
|
if (args.length === 0) {
|
|
143
|
-
throw new
|
|
142
|
+
throw new error_js_1.TezXError("At least one handler is required.");
|
|
144
143
|
}
|
|
145
144
|
let middlewares = [];
|
|
146
145
|
let callback;
|
|
@@ -157,22 +156,17 @@ class Router {
|
|
|
157
156
|
callback = args[0];
|
|
158
157
|
}
|
|
159
158
|
if (typeof callback !== "function") {
|
|
160
|
-
throw new
|
|
159
|
+
throw new error_js_1.TezXError("Route callback function is missing or invalid.");
|
|
161
160
|
}
|
|
162
161
|
if (!middlewares.every((middleware) => typeof middleware === "function")) {
|
|
163
|
-
throw new
|
|
162
|
+
throw new error_js_1.TezXError("Middleware must be a function or an array of functions.");
|
|
164
163
|
}
|
|
165
164
|
this.#addRoute(method, path, [...middlewares, callback]);
|
|
166
165
|
}
|
|
167
|
-
#
|
|
166
|
+
#addRouterInstance(path, router) {
|
|
168
167
|
this.env = { ...this.env, ...router.env };
|
|
169
|
-
if (this.router?.name &&
|
|
170
|
-
router.router?.name &&
|
|
171
|
-
this.router?.name !== router.router?.name) {
|
|
172
|
-
throw new Error(`Router name mismatch: expected "${this.router.name}", got "${router.router.name}"`);
|
|
173
|
-
}
|
|
174
168
|
if (!(router instanceof Router)) {
|
|
175
|
-
throw new
|
|
169
|
+
throw new error_js_1.TezXError("Router instance is required.");
|
|
176
170
|
}
|
|
177
171
|
router.route.forEach((r) => {
|
|
178
172
|
this.#addRoute(r?.method, `/${(0, low_level_js_1.sanitizePathSplitBasePath)(path, r?.pattern).join("/")}`, r?.handlers);
|
package/cjs/core/server.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TezX = void 0;
|
|
4
|
+
const RadixRouter_js_1 = require("../registry/RadixRouter.js");
|
|
4
5
|
const response_js_1 = require("../utils/response.js");
|
|
5
6
|
const url_js_1 = require("../utils/url.js");
|
|
6
7
|
const config_js_1 = require("./config.js");
|
|
@@ -11,11 +12,15 @@ class TezX extends router_js_1.Router {
|
|
|
11
12
|
#pathResolver;
|
|
12
13
|
#notFound = response_js_1.notFoundResponse;
|
|
13
14
|
#errorHandler = response_js_1.handleErrorResponse;
|
|
14
|
-
constructor({ basePath = "/", env = {}, debugMode = false, onPathResolve, routeRegistry, } = {}) {
|
|
15
|
+
constructor({ basePath = "/", env = {}, debugMode = false, onPathResolve, routeRegistry = new RadixRouter_js_1.RadixRouter(), } = {}) {
|
|
15
16
|
if (debugMode) {
|
|
16
17
|
config_js_1.GlobalConfig.debugMode = debugMode;
|
|
17
18
|
}
|
|
18
|
-
super({ basePath, env
|
|
19
|
+
super({ basePath, env });
|
|
20
|
+
if (!routeRegistry) {
|
|
21
|
+
throw new Error("routeRegistry is required for TezX initialization");
|
|
22
|
+
}
|
|
23
|
+
this.router = routeRegistry;
|
|
19
24
|
this.#pathResolver = onPathResolve;
|
|
20
25
|
this.serve = this.serve.bind(this);
|
|
21
26
|
}
|
|
@@ -32,7 +37,7 @@ class TezX extends router_js_1.Router {
|
|
|
32
37
|
let res;
|
|
33
38
|
async function dispatch(i) {
|
|
34
39
|
if (i <= index)
|
|
35
|
-
throw new
|
|
40
|
+
throw new error_js_1.TezXError("next() called multiple times");
|
|
36
41
|
index = i;
|
|
37
42
|
if (i < mLen) {
|
|
38
43
|
const fn = middlewares[i];
|
|
@@ -62,7 +67,7 @@ class TezX extends router_js_1.Router {
|
|
|
62
67
|
}
|
|
63
68
|
async #handleRequest(req, method, args) {
|
|
64
69
|
if (!(req instanceof Request))
|
|
65
|
-
throw new
|
|
70
|
+
throw new error_js_1.TezXError("Invalid request object provided to tezX server.");
|
|
66
71
|
const rawPath = (0, url_js_1.getPathname)(req.url);
|
|
67
72
|
const pathname = this.#pathResolver
|
|
68
73
|
? await this.#pathResolver(rawPath)
|
|
@@ -73,7 +78,7 @@ class TezX extends router_js_1.Router {
|
|
|
73
78
|
if (staticHandler) {
|
|
74
79
|
return staticHandler(ctx);
|
|
75
80
|
}
|
|
76
|
-
const route = this.router
|
|
81
|
+
const route = this.router?.search(method, pathname);
|
|
77
82
|
const mLen = route?.middlewares?.length;
|
|
78
83
|
const hLen = route?.handlers?.length;
|
|
79
84
|
if (!route || (hLen === 0 && mLen === 0)) {
|
|
@@ -87,10 +92,7 @@ class TezX extends router_js_1.Router {
|
|
|
87
92
|
return await this.#chain(ctx, mLen, route.middlewares, hLen, route.handlers);
|
|
88
93
|
}
|
|
89
94
|
catch (err) {
|
|
90
|
-
|
|
91
|
-
return this.#errorHandler?.(error_js_1.TezXError.internal(err?.message, err?.stack), ctx);
|
|
92
|
-
}
|
|
93
|
-
return this.#errorHandler?.(err, ctx);
|
|
95
|
+
return this.#errorHandler?.((0, error_js_1.TezXErrorParse)(err), ctx);
|
|
94
96
|
}
|
|
95
97
|
}
|
|
96
98
|
async serve(req, ...args) {
|
|
@@ -108,3 +110,6 @@ class TezX extends router_js_1.Router {
|
|
|
108
110
|
}
|
|
109
111
|
}
|
|
110
112
|
exports.TezX = TezX;
|
|
113
|
+
if (!globalThis.TezX) {
|
|
114
|
+
globalThis.TezX = TezX;
|
|
115
|
+
}
|
package/cjs/deno/env.js
CHANGED
|
@@ -3,10 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.loadEnv = loadEnv;
|
|
4
4
|
const runtime_js_1 = require("../utils/runtime.js");
|
|
5
5
|
const colors_js_1 = require("../utils/colors.js");
|
|
6
|
+
const error_js_1 = require("../core/error.js");
|
|
6
7
|
function parseEnvFile(filePath, result) {
|
|
7
8
|
try {
|
|
8
9
|
if (runtime_js_1.runtime !== "deno") {
|
|
9
|
-
throw new
|
|
10
|
+
throw new error_js_1.TezXError(`Please use ${(0, colors_js_1.colorText)(`import {loadEnv} from "tezx/${runtime_js_1.runtime}"`, "bgRed")} environment`);
|
|
10
11
|
}
|
|
11
12
|
let fileExists = false;
|
|
12
13
|
try {
|
package/cjs/deno/serveStatic.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.serveStatic = serveStatic;
|
|
4
4
|
exports.getFiles = getFiles;
|
|
5
|
+
const error_js_1 = require("../core/error.js");
|
|
5
6
|
const low_level_js_1 = require("../utils/low-level.js");
|
|
6
7
|
function serveStatic(...args) {
|
|
7
8
|
let route = "";
|
|
@@ -23,7 +24,7 @@ function serveStatic(...args) {
|
|
|
23
24
|
[dir] = args;
|
|
24
25
|
break;
|
|
25
26
|
default:
|
|
26
|
-
throw new
|
|
27
|
+
throw new error_js_1.TezXError(`\x1b[1;31m404 Not Found\x1b[0m \x1b[1;32mInvalid arguments\x1b[0m`);
|
|
27
28
|
}
|
|
28
29
|
return {
|
|
29
30
|
files: getFiles(dir, route, options),
|
package/cjs/deno/ws.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.upgradeWebSocket = upgradeWebSocket;
|
|
4
|
+
const error_js_1 = require("../core/error.js");
|
|
4
5
|
function upgradeWebSocket(callback, options = {}) {
|
|
5
6
|
const { onUpgradeError = (error, ctx) => {
|
|
6
7
|
ctx.setStatus = 401;
|
|
@@ -12,13 +13,13 @@ function upgradeWebSocket(callback, options = {}) {
|
|
|
12
13
|
const key = ctx.req.header("sec-websocket-key");
|
|
13
14
|
if (upgrade !== "websocket" || !connection?.includes("upgrade") || !key) {
|
|
14
15
|
ctx.setStatus = 401;
|
|
15
|
-
const error = new
|
|
16
|
+
const error = new error_js_1.TezXError("Invalid WebSocket upgrade request.", 401);
|
|
16
17
|
return next ? next() : onUpgradeError(error, ctx);
|
|
17
18
|
}
|
|
18
19
|
ctx.wsProtocol = ctx.url?.startsWith("https") ? "wss" : "ws";
|
|
19
20
|
try {
|
|
20
21
|
if (typeof callback !== "function") {
|
|
21
|
-
throw new
|
|
22
|
+
throw new error_js_1.TezXError("Missing or invalid WebSocket callback handler.");
|
|
22
23
|
}
|
|
23
24
|
const { socket, response } = Deno.upgradeWebSocket(ctx.rawRequest, {
|
|
24
25
|
protocol: options.protocol,
|
|
@@ -32,7 +33,7 @@ function upgradeWebSocket(callback, options = {}) {
|
|
|
32
33
|
return response;
|
|
33
34
|
}
|
|
34
35
|
catch (err) {
|
|
35
|
-
return onUpgradeError(
|
|
36
|
+
return onUpgradeError((0, error_js_1.TezXErrorParse)(err, 426), ctx);
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
39
|
}
|
package/cjs/helper/index.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.useFormData = exports.setCookie = exports.sanitized = exports.sanitizePathSplitBasePath = exports.sanitizePathSplit = exports.runtime = exports.readStream = exports.normalizeHeaderKey = exports.httpStatusMap = exports.getFileBuffer = exports.getCookie = exports.generateUUID = exports.generateRandomBase64 = exports.generateID = exports.fileSize = exports.fileExists = exports.extensionExtract = exports.deleteCookie = exports.colorText = exports.allCookies = exports.GlobalConfig = void 0;
|
|
4
4
|
const config_js_1 = require("../core/config.js");
|
|
5
5
|
Object.defineProperty(exports, "GlobalConfig", { enumerable: true, get: function () { return config_js_1.GlobalConfig; } });
|
|
6
6
|
const colors_js_1 = require("../utils/colors.js");
|
|
7
7
|
Object.defineProperty(exports, "colorText", { enumerable: true, get: function () { return colors_js_1.colorText; } });
|
|
8
|
-
const httpStatusMap_js_1 = require("../utils/httpStatusMap.js");
|
|
9
|
-
Object.defineProperty(exports, "httpStatusMap", { enumerable: true, get: function () { return httpStatusMap_js_1.httpStatusMap; } });
|
|
10
|
-
const generateID_js_1 = require("../utils/generateID.js");
|
|
11
|
-
Object.defineProperty(exports, "generateID", { enumerable: true, get: function () { return generateID_js_1.generateID; } });
|
|
12
|
-
Object.defineProperty(exports, "generateUUID", { enumerable: true, get: function () { return generateID_js_1.generateUUID; } });
|
|
13
|
-
Object.defineProperty(exports, "generateRandomBase64", { enumerable: true, get: function () { return generateID_js_1.generateRandomBase64; } });
|
|
14
8
|
const cookie_js_1 = require("../utils/cookie.js");
|
|
15
9
|
Object.defineProperty(exports, "allCookies", { enumerable: true, get: function () { return cookie_js_1.allCookies; } });
|
|
16
10
|
Object.defineProperty(exports, "deleteCookie", { enumerable: true, get: function () { return cookie_js_1.deleteCookie; } });
|
|
@@ -21,6 +15,14 @@ Object.defineProperty(exports, "fileExists", { enumerable: true, get: function (
|
|
|
21
15
|
Object.defineProperty(exports, "fileSize", { enumerable: true, get: function () { return file_js_1.fileSize; } });
|
|
22
16
|
Object.defineProperty(exports, "getFileBuffer", { enumerable: true, get: function () { return file_js_1.getFileBuffer; } });
|
|
23
17
|
Object.defineProperty(exports, "readStream", { enumerable: true, get: function () { return file_js_1.readStream; } });
|
|
18
|
+
const formData_js_1 = require("../utils/formData.js");
|
|
19
|
+
Object.defineProperty(exports, "useFormData", { enumerable: true, get: function () { return formData_js_1.useFormData; } });
|
|
20
|
+
const generateID_js_1 = require("../utils/generateID.js");
|
|
21
|
+
Object.defineProperty(exports, "generateID", { enumerable: true, get: function () { return generateID_js_1.generateID; } });
|
|
22
|
+
Object.defineProperty(exports, "generateRandomBase64", { enumerable: true, get: function () { return generateID_js_1.generateRandomBase64; } });
|
|
23
|
+
Object.defineProperty(exports, "generateUUID", { enumerable: true, get: function () { return generateID_js_1.generateUUID; } });
|
|
24
|
+
const httpStatusMap_js_1 = require("../utils/httpStatusMap.js");
|
|
25
|
+
Object.defineProperty(exports, "httpStatusMap", { enumerable: true, get: function () { return httpStatusMap_js_1.httpStatusMap; } });
|
|
24
26
|
const low_level_js_1 = require("../utils/low-level.js");
|
|
25
27
|
Object.defineProperty(exports, "extensionExtract", { enumerable: true, get: function () { return low_level_js_1.extensionExtract; } });
|
|
26
28
|
Object.defineProperty(exports, "normalizeHeaderKey", { enumerable: true, get: function () { return low_level_js_1.normalizeHeaderKey; } });
|
|
@@ -28,13 +30,11 @@ Object.defineProperty(exports, "sanitizePathSplit", { enumerable: true, get: fun
|
|
|
28
30
|
Object.defineProperty(exports, "sanitizePathSplitBasePath", { enumerable: true, get: function () { return low_level_js_1.sanitizePathSplitBasePath; } });
|
|
29
31
|
Object.defineProperty(exports, "sanitized", { enumerable: true, get: function () { return low_level_js_1.sanitized; } });
|
|
30
32
|
const runtime_js_1 = require("../utils/runtime.js");
|
|
31
|
-
Object.defineProperty(exports, "
|
|
32
|
-
const formData_js_1 = require("../utils/formData.js");
|
|
33
|
-
Object.defineProperty(exports, "useFormData", { enumerable: true, get: function () { return formData_js_1.useFormData; } });
|
|
33
|
+
Object.defineProperty(exports, "runtime", { enumerable: true, get: function () { return runtime_js_1.runtime; } });
|
|
34
34
|
exports.default = {
|
|
35
35
|
useFormData: formData_js_1.useFormData,
|
|
36
36
|
generateRandomBase64: generateID_js_1.generateRandomBase64,
|
|
37
|
-
|
|
37
|
+
runtime: runtime_js_1.runtime,
|
|
38
38
|
extensionExtract: low_level_js_1.extensionExtract,
|
|
39
39
|
normalizeHeaderKey: low_level_js_1.normalizeHeaderKey,
|
|
40
40
|
sanitizePathSplit: low_level_js_1.sanitizePathSplit,
|
package/cjs/index.js
CHANGED
|
@@ -7,7 +7,7 @@ const router_js_1 = require("./core/router.js");
|
|
|
7
7
|
Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return router_js_1.Router; } });
|
|
8
8
|
const server_js_1 = require("./core/server.js");
|
|
9
9
|
Object.defineProperty(exports, "TezX", { enumerable: true, get: function () { return server_js_1.TezX; } });
|
|
10
|
-
exports.version = "3.0.14-beta.
|
|
10
|
+
exports.version = "3.0.14-beta.2";
|
|
11
11
|
exports.default = {
|
|
12
12
|
Router: router_js_1.Router,
|
|
13
13
|
TezX: server_js_1.TezX,
|
package/cjs/jwt/node.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.sign = sign;
|
|
7
|
+
exports.verify = verify;
|
|
8
|
+
const node_buffer_1 = require("node:buffer");
|
|
9
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
10
|
+
function base64url(input) {
|
|
11
|
+
return node_buffer_1.Buffer.from(input)
|
|
12
|
+
.toString("base64")
|
|
13
|
+
.replace(/=/g, "")
|
|
14
|
+
.replace(/\+/g, "-")
|
|
15
|
+
.replace(/\//g, "_");
|
|
16
|
+
}
|
|
17
|
+
function parseExpiry(exp) {
|
|
18
|
+
const match = exp.match(/^(\d+)([smhd])$/);
|
|
19
|
+
if (!match)
|
|
20
|
+
return parseInt(exp, 10);
|
|
21
|
+
const [, val, unit] = match;
|
|
22
|
+
const num = parseInt(val, 10);
|
|
23
|
+
switch (unit) {
|
|
24
|
+
case "s":
|
|
25
|
+
return num;
|
|
26
|
+
case "m":
|
|
27
|
+
return num * 60;
|
|
28
|
+
case "h":
|
|
29
|
+
return num * 3600;
|
|
30
|
+
case "d":
|
|
31
|
+
return num * 86400;
|
|
32
|
+
default:
|
|
33
|
+
return num;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function base64urlDecode(input) {
|
|
37
|
+
input = input.replace(/-/g, "+").replace(/_/g, "/");
|
|
38
|
+
const pad = input.length % 4;
|
|
39
|
+
if (pad)
|
|
40
|
+
input += "=".repeat(4 - pad);
|
|
41
|
+
return node_buffer_1.Buffer.from(input, "base64").toString("utf8");
|
|
42
|
+
}
|
|
43
|
+
function sign(payload, options) {
|
|
44
|
+
const header = {
|
|
45
|
+
alg: options?.algorithm || "HS256",
|
|
46
|
+
typ: "JWT",
|
|
47
|
+
};
|
|
48
|
+
const now = Math.floor(Date.now() / 1000);
|
|
49
|
+
const exp = typeof options?.expiresIn === "string"
|
|
50
|
+
? now + parseExpiry(options.expiresIn)
|
|
51
|
+
: typeof options?.expiresIn === "number"
|
|
52
|
+
? now + options.expiresIn
|
|
53
|
+
: now + 86400;
|
|
54
|
+
const fullPayload = { ...payload, iat: now, exp };
|
|
55
|
+
const encodedHeader = base64url(JSON.stringify(header));
|
|
56
|
+
const encodedPayload = base64url(JSON.stringify(fullPayload));
|
|
57
|
+
const data = `${encodedHeader}.${encodedPayload}`;
|
|
58
|
+
const secret = options?.secret || process.env.JWT_SECRET || "tezx_secret";
|
|
59
|
+
const signature = node_crypto_1.default
|
|
60
|
+
.createHmac(header.alg === "HS512" ? "sha512" : "sha256", secret)
|
|
61
|
+
.update(data)
|
|
62
|
+
.digest("base64")
|
|
63
|
+
.replace(/=/g, "")
|
|
64
|
+
.replace(/\+/g, "-")
|
|
65
|
+
.replace(/\//g, "_");
|
|
66
|
+
return `${data}.${signature}`;
|
|
67
|
+
}
|
|
68
|
+
function verify(token, secret) {
|
|
69
|
+
try {
|
|
70
|
+
const [encodedHeader, encodedPayload, signature] = token.split(".");
|
|
71
|
+
const data = `${encodedHeader}.${encodedPayload}`;
|
|
72
|
+
const decodedHeader = JSON.parse(base64urlDecode(encodedHeader));
|
|
73
|
+
const expectedSig = node_crypto_1.default
|
|
74
|
+
.createHmac(decodedHeader.alg === "HS512" ? "sha512" : "sha256", secret || process.env.JWT_SECRET || "tezx_secret")
|
|
75
|
+
.update(data)
|
|
76
|
+
.digest("base64")
|
|
77
|
+
.replace(/=/g, "")
|
|
78
|
+
.replace(/\+/g, "-")
|
|
79
|
+
.replace(/\//g, "_");
|
|
80
|
+
if (expectedSig !== signature)
|
|
81
|
+
return null;
|
|
82
|
+
const payload = JSON.parse(base64urlDecode(encodedPayload));
|
|
83
|
+
if (payload.exp && Date.now() / 1000 > payload.exp)
|
|
84
|
+
return null;
|
|
85
|
+
return payload;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.default = {
|
|
92
|
+
verify,
|
|
93
|
+
sign,
|
|
94
|
+
};
|