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.
Files changed (91) hide show
  1. package/bun/env.d.ts +5 -0
  2. package/bun/env.js +44 -0
  3. package/bun/index.d.ts +1 -1
  4. package/bun/index.js +1 -1
  5. package/bun/ws.js +4 -3
  6. package/cjs/bun/env.js +47 -0
  7. package/cjs/bun/index.js +1 -1
  8. package/cjs/bun/ws.js +4 -3
  9. package/cjs/core/context.js +3 -2
  10. package/cjs/core/error.js +8 -0
  11. package/cjs/core/request.js +3 -2
  12. package/cjs/core/router.js +10 -16
  13. package/cjs/core/server.js +14 -9
  14. package/cjs/deno/env.js +2 -1
  15. package/cjs/deno/serveStatic.js +2 -1
  16. package/cjs/deno/ws.js +4 -3
  17. package/cjs/helper/index.js +11 -11
  18. package/cjs/index.js +1 -1
  19. package/cjs/jwt/node.js +94 -0
  20. package/cjs/jwt/web.js +178 -0
  21. package/cjs/middleware/basic-auth.js +9 -14
  22. package/cjs/middleware/bearer-auth.js +5 -5
  23. package/cjs/middleware/cache-control.js +1 -2
  24. package/cjs/middleware/cors.js +1 -1
  25. package/cjs/middleware/i18n.js +0 -1
  26. package/cjs/middleware/logger.js +3 -2
  27. package/cjs/middleware/rate-limiter.js +1 -1
  28. package/cjs/middleware/sanitize-headers.js +1 -1
  29. package/cjs/middleware/secure-headers copy.js +27 -13
  30. package/cjs/middleware/secure-headers.js +18 -6
  31. package/cjs/node/env.js +4 -3
  32. package/cjs/node/serveStatic.js +2 -1
  33. package/cjs/node/ws.js +3 -2
  34. package/cjs/registry/RadixRouter.js +2 -1
  35. package/cjs/utils/buffer.js +17 -0
  36. package/cjs/utils/file.js +9 -6
  37. package/cjs/utils/generateID.js +1 -1
  38. package/cjs/utils/response.js +3 -1
  39. package/core/context.d.ts +3 -3
  40. package/core/context.js +4 -3
  41. package/core/error.d.ts +1 -0
  42. package/core/error.js +7 -0
  43. package/core/request.js +3 -2
  44. package/core/router.d.ts +3 -8
  45. package/core/router.js +10 -16
  46. package/core/server.d.ts +10 -23
  47. package/core/server.js +15 -10
  48. package/deno/env.js +2 -1
  49. package/deno/index.d.ts +1 -1
  50. package/deno/serveStatic.js +2 -1
  51. package/deno/ws.d.ts +1 -1
  52. package/deno/ws.js +4 -3
  53. package/helper/index.d.ts +6 -6
  54. package/helper/index.js +6 -6
  55. package/index.d.ts +5 -2
  56. package/index.js +1 -1
  57. package/jwt/node.d.ts +39 -0
  58. package/jwt/node.js +87 -0
  59. package/jwt/web.d.ts +14 -0
  60. package/jwt/web.js +174 -0
  61. package/middleware/basic-auth.d.ts +2 -1
  62. package/middleware/basic-auth.js +9 -14
  63. package/middleware/bearer-auth.d.ts +2 -1
  64. package/middleware/bearer-auth.js +5 -5
  65. package/middleware/cache-control.js +2 -3
  66. package/middleware/cors.js +1 -1
  67. package/middleware/detect-bot.js +1 -1
  68. package/middleware/i18n.js +0 -1
  69. package/middleware/logger.d.ts +1 -1
  70. package/middleware/logger.js +3 -2
  71. package/middleware/rate-limiter.d.ts +3 -2
  72. package/middleware/rate-limiter.js +1 -1
  73. package/middleware/sanitize-headers.js +1 -1
  74. package/middleware/secure-headers copy.js +27 -13
  75. package/middleware/secure-headers.d.ts +8 -8
  76. package/middleware/secure-headers.js +18 -6
  77. package/node/env.js +4 -3
  78. package/node/serveStatic.js +2 -1
  79. package/node/ws.d.ts +1 -1
  80. package/node/ws.js +3 -2
  81. package/package.json +12 -1
  82. package/registry/RadixRouter.js +2 -1
  83. package/types/index.d.ts +1 -1
  84. package/utils/buffer.d.ts +1 -0
  85. package/utils/buffer.js +14 -0
  86. package/utils/file.js +9 -6
  87. package/utils/generateID.js +1 -1
  88. package/utils/response.js +3 -1
  89. package/cjs/utils/regexRouter.js +0 -57
  90. package/utils/regexRouter.d.ts +0 -66
  91. package/utils/regexRouter.js +0 -52
package/bun/env.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Loads environment variables from .env files (Bun version).
3
+ * @param basePath - The base directory where .env files are located.
4
+ */
5
+ export declare function loadEnv(basePath?: string): Promise<Record<string, string>>;
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
@@ -1,4 +1,4 @@
1
- import { loadEnv } from "../node/env.js";
1
+ import { loadEnv } from "./env.js";
2
2
  import { serveStatic } from "../node/serveStatic.js";
3
3
  import { getConnInfo } from "./getConnInfo.js";
4
4
  import upgradeWebSocket, { wsHandlers } from "./ws.js";
package/bun/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { loadEnv } from "../node/env.js";
1
+ import { loadEnv } from "./env.js";
2
2
  import { serveStatic } from "../node/serveStatic.js";
3
3
  import { getConnInfo } from "./getConnInfo.js";
4
4
  import upgradeWebSocket, { wsHandlers } from "./ws.js";
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 Error("401 Bad Request: Invalid WebSocket headers"), ctx);
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 Error("WebSocket callback is missing. Please provide a valid callback function to handle the WebSocket events.");
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 Error("Bun server instance missing for WebSocket"), ctx);
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("../node/env.js");
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 Error("401 Bad Request: Invalid WebSocket headers"), ctx);
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 Error("WebSocket callback is missing. Please provide a valid callback function to handle the WebSocket events.");
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 Error("Bun server instance missing for WebSocket"), ctx);
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),
@@ -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 Error("File not found");
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 Error("File not found");
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
+ }
@@ -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 Error("Missing Content-Type");
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 Error("Multipart body already consumed elsewhere");
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;
@@ -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 = {}, routeRegistry = new RadixRouter_js_1.RadixRouter(), } = {}) {
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.#routeAddTriNode(path, router);
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.#routeAddTriNode("/", router);
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.addRoute(method, pattern, handlers);
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 Error("At least one handler is required.");
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 Error("Route callback function is missing or invalid.");
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 Error("Middleware must be a function or an array of functions.");
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
- #routeAddTriNode(path, router) {
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 Error("Router instance is required.");
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);
@@ -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, routeRegistry });
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 Error("next() called multiple times");
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 Error("Invalid request object provided to tezX server.");
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.search(method, pathname);
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
- if (!(err instanceof error_js_1.TezXError)) {
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 Error(`Please use ${(0, colors_js_1.colorText)(`import {loadEnv} from "tezx/${runtime_js_1.runtime}"`, "bgRed")} environment`);
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 {
@@ -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 Error(`\x1b[1;31m404 Not Found\x1b[0m \x1b[1;32mInvalid arguments\x1b[0m`);
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 Error("Invalid WebSocket upgrade request.");
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 Error("Missing or invalid WebSocket callback handler.");
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(err instanceof Error ? err : new Error("WebSocket Upgrade Failed"), ctx);
36
+ return onUpgradeError((0, error_js_1.TezXErrorParse)(err, 426), ctx);
36
37
  }
37
38
  };
38
39
  }
@@ -1,16 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GlobalConfig = exports.colorText = exports.httpStatusMap = exports.generateUUID = exports.generateID = exports.readStream = exports.getFileBuffer = exports.fileSize = exports.fileExists = exports.generateRandomBase64 = exports.setCookie = exports.getCookie = exports.deleteCookie = exports.allCookies = exports.sanitized = exports.sanitizePathSplitBasePath = exports.sanitizePathSplit = exports.normalizeHeaderKey = exports.extensionExtract = exports.Environment = exports.useFormData = void 0;
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, "Environment", { enumerable: true, get: function () { return runtime_js_1.Environment; } });
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
- Environment: runtime_js_1.Environment,
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.1";
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,
@@ -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
+ };