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.
Files changed (234) hide show
  1. package/README.md +122 -89
  2. package/bun/getConnInfo.d.ts +21 -0
  3. package/bun/getConnInfo.js +9 -0
  4. package/bun/index.d.ts +10 -4
  5. package/bun/index.js +8 -4
  6. package/bun/ws.d.ts +48 -0
  7. package/bun/ws.js +58 -0
  8. package/cjs/bun/getConnInfo.js +12 -0
  9. package/cjs/bun/index.js +35 -7
  10. package/cjs/bun/ws.js +63 -0
  11. package/cjs/core/config.js +2 -12
  12. package/cjs/core/context.js +131 -379
  13. package/cjs/core/error.js +49 -0
  14. package/cjs/core/request.js +79 -131
  15. package/cjs/core/router.js +54 -387
  16. package/cjs/core/server.js +83 -202
  17. package/cjs/deno/env.js +4 -4
  18. package/cjs/deno/getConnInfo.js +18 -0
  19. package/cjs/deno/index.js +11 -18
  20. package/cjs/deno/serveStatic.js +53 -0
  21. package/cjs/deno/ws.js +39 -0
  22. package/cjs/helper/index.js +46 -10
  23. package/cjs/index.js +5 -7
  24. package/cjs/jwt/node.js +94 -0
  25. package/cjs/jwt/web.js +178 -0
  26. package/cjs/middleware/basic-auth.js +42 -0
  27. package/cjs/middleware/bearer-auth.js +34 -0
  28. package/cjs/middleware/cache-control.js +44 -0
  29. package/cjs/middleware/cors.js +11 -21
  30. package/cjs/middleware/detect-bot.js +57 -0
  31. package/cjs/middleware/i18n.js +73 -60
  32. package/cjs/middleware/index.js +8 -46
  33. package/cjs/middleware/logger.js +9 -4
  34. package/cjs/middleware/pagination.js +3 -2
  35. package/cjs/middleware/powered-by.js +3 -2
  36. package/cjs/middleware/rate-limiter.js +38 -0
  37. package/cjs/middleware/request-id.js +4 -5
  38. package/cjs/middleware/sanitize-headers.js +22 -0
  39. package/cjs/middleware/secure-headers copy.js +143 -0
  40. package/cjs/middleware/secure-headers.js +157 -0
  41. package/cjs/middleware/{xssProtection.js → xss-protection.js} +5 -8
  42. package/cjs/node/env.js +7 -7
  43. package/cjs/node/getConnInfo.js +16 -0
  44. package/cjs/node/index.js +17 -18
  45. package/cjs/node/mount-node.js +59 -0
  46. package/cjs/node/serveStatic.js +56 -0
  47. package/cjs/node/toWebRequest.js +25 -0
  48. package/cjs/node/ws.js +82 -0
  49. package/cjs/registry/RadixRouter.js +148 -0
  50. package/cjs/registry/index.js +17 -0
  51. package/cjs/types/headers.js +2 -0
  52. package/cjs/types/index.js +13 -0
  53. package/cjs/utils/buffer.js +17 -0
  54. package/cjs/utils/colors.js +2 -0
  55. package/cjs/utils/cookie.js +59 -0
  56. package/cjs/utils/file.js +136 -0
  57. package/cjs/utils/formData.js +60 -10
  58. package/cjs/utils/generateID.js +37 -0
  59. package/cjs/utils/low-level.js +115 -0
  60. package/cjs/utils/{staticFile.js → mimeTypes.js} +0 -87
  61. package/cjs/utils/rateLimit.js +41 -0
  62. package/cjs/utils/response.js +65 -0
  63. package/cjs/{core/environment.js → utils/runtime.js} +2 -1
  64. package/cjs/utils/url.js +65 -30
  65. package/core/config.d.ts +2 -7
  66. package/core/config.js +2 -12
  67. package/core/context.d.ts +209 -164
  68. package/core/context.js +131 -346
  69. package/core/error.d.ts +96 -0
  70. package/core/error.js +44 -0
  71. package/core/request.d.ts +67 -107
  72. package/core/request.js +78 -130
  73. package/core/router.d.ts +138 -133
  74. package/core/router.js +53 -352
  75. package/core/server.d.ts +99 -38
  76. package/core/server.js +83 -202
  77. package/deno/env.js +3 -3
  78. package/deno/getConnInfo.d.ts +21 -0
  79. package/deno/getConnInfo.js +15 -0
  80. package/deno/index.d.ts +9 -4
  81. package/deno/index.js +7 -4
  82. package/deno/serveStatic.d.ts +28 -0
  83. package/deno/serveStatic.js +49 -0
  84. package/deno/ws.d.ts +42 -0
  85. package/deno/ws.js +36 -0
  86. package/helper/index.d.ts +29 -15
  87. package/helper/index.js +27 -7
  88. package/index.d.ts +10 -8
  89. package/index.js +4 -5
  90. package/jwt/node.d.ts +39 -0
  91. package/jwt/node.js +87 -0
  92. package/jwt/web.d.ts +14 -0
  93. package/jwt/web.js +174 -0
  94. package/middleware/basic-auth.d.ts +56 -0
  95. package/middleware/basic-auth.js +38 -0
  96. package/middleware/bearer-auth.d.ts +53 -0
  97. package/middleware/bearer-auth.js +30 -0
  98. package/middleware/cache-control.d.ts +30 -0
  99. package/middleware/cache-control.js +40 -0
  100. package/middleware/cors.d.ts +30 -3
  101. package/middleware/cors.js +12 -22
  102. package/middleware/detect-bot.d.ts +113 -0
  103. package/middleware/detect-bot.js +53 -0
  104. package/middleware/i18n.d.ts +166 -73
  105. package/middleware/i18n.js +73 -60
  106. package/middleware/index.d.ts +8 -32
  107. package/middleware/index.js +8 -44
  108. package/middleware/logger.d.ts +5 -2
  109. package/middleware/logger.js +9 -4
  110. package/middleware/pagination.d.ts +9 -6
  111. package/middleware/pagination.js +3 -2
  112. package/middleware/powered-by.d.ts +2 -1
  113. package/middleware/powered-by.js +3 -2
  114. package/middleware/{rateLimiter.d.ts → rate-limiter.d.ts} +15 -9
  115. package/middleware/rate-limiter.js +34 -0
  116. package/middleware/request-id.d.ts +2 -1
  117. package/middleware/request-id.js +5 -6
  118. package/middleware/{sanitizeHeader.d.ts → sanitize-headers.d.ts} +5 -19
  119. package/middleware/sanitize-headers.js +18 -0
  120. package/middleware/secure-headers copy.d.ts +15 -0
  121. package/middleware/secure-headers copy.js +136 -0
  122. package/middleware/secure-headers.d.ts +132 -0
  123. package/middleware/secure-headers.js +153 -0
  124. package/middleware/{xssProtection.d.ts → xss-protection.d.ts} +2 -1
  125. package/middleware/xss-protection.js +19 -0
  126. package/node/env.js +4 -4
  127. package/node/getConnInfo.d.ts +21 -0
  128. package/node/getConnInfo.js +13 -0
  129. package/node/index.d.ts +13 -4
  130. package/node/index.js +11 -4
  131. package/node/mount-node.d.ts +11 -0
  132. package/node/mount-node.js +56 -0
  133. package/node/serveStatic.d.ts +36 -0
  134. package/node/serveStatic.js +52 -0
  135. package/node/toWebRequest.js +22 -0
  136. package/node/ws.d.ts +56 -0
  137. package/node/ws.js +46 -0
  138. package/package.json +39 -30
  139. package/registry/RadixRouter.d.ts +40 -0
  140. package/registry/RadixRouter.js +144 -0
  141. package/registry/index.d.ts +2 -0
  142. package/registry/index.js +1 -0
  143. package/types/headers.d.ts +2 -0
  144. package/types/headers.js +1 -0
  145. package/types/index.d.ts +318 -18
  146. package/types/index.js +12 -1
  147. package/utils/buffer.d.ts +1 -0
  148. package/utils/buffer.js +14 -0
  149. package/utils/colors.d.ts +24 -0
  150. package/utils/colors.js +2 -0
  151. package/utils/cookie.d.ts +55 -0
  152. package/utils/cookie.js +53 -0
  153. package/utils/file.d.ts +38 -0
  154. package/utils/file.js +96 -0
  155. package/utils/formData.d.ts +41 -1
  156. package/utils/formData.js +58 -9
  157. package/utils/generateID.d.ts +42 -0
  158. package/utils/generateID.js +32 -0
  159. package/utils/httpStatusMap.d.ts +14 -0
  160. package/utils/low-level.d.ts +58 -0
  161. package/utils/low-level.js +108 -0
  162. package/utils/mimeTypes.d.ts +4 -0
  163. package/utils/{staticFile.js → mimeTypes.js} +0 -53
  164. package/utils/rateLimit.d.ts +18 -0
  165. package/utils/rateLimit.js +37 -0
  166. package/utils/response.d.ts +18 -0
  167. package/utils/response.js +58 -0
  168. package/{core/environment.d.ts → utils/runtime.d.ts} +1 -0
  169. package/{core/environment.js → utils/runtime.js} +1 -0
  170. package/utils/url.d.ts +42 -14
  171. package/utils/url.js +61 -27
  172. package/bun/adapter.d.ts +0 -127
  173. package/bun/adapter.js +0 -97
  174. package/cjs/bun/adapter.js +0 -100
  175. package/cjs/core/MiddlewareConfigure.js +0 -68
  176. package/cjs/core/common.js +0 -15
  177. package/cjs/deno/adpater.js +0 -67
  178. package/cjs/helper/common.js +0 -17
  179. package/cjs/middleware/basicAuth.js +0 -71
  180. package/cjs/middleware/cacheControl.js +0 -90
  181. package/cjs/middleware/detectBot.js +0 -104
  182. package/cjs/middleware/detectLocale.js +0 -43
  183. package/cjs/middleware/lazyLoadModules.js +0 -73
  184. package/cjs/middleware/rateLimiter.js +0 -24
  185. package/cjs/middleware/requestTimeout.js +0 -42
  186. package/cjs/middleware/sanitizeHeader.js +0 -51
  187. package/cjs/middleware/secureHeaders.js +0 -42
  188. package/cjs/node/adapter.js +0 -138
  189. package/cjs/utils/regexRouter.js +0 -58
  190. package/cjs/utils/state.js +0 -34
  191. package/cjs/utils/toWebRequest.js +0 -35
  192. package/cjs/ws/deno.js +0 -20
  193. package/cjs/ws/index.js +0 -53
  194. package/cjs/ws/node.js +0 -65
  195. package/core/MiddlewareConfigure.d.ts +0 -15
  196. package/core/MiddlewareConfigure.js +0 -63
  197. package/core/common.d.ts +0 -21
  198. package/core/common.js +0 -11
  199. package/deno/adpater.d.ts +0 -38
  200. package/deno/adpater.js +0 -64
  201. package/helper/common.d.ts +0 -5
  202. package/helper/common.js +0 -14
  203. package/middleware/basicAuth.d.ts +0 -81
  204. package/middleware/basicAuth.js +0 -67
  205. package/middleware/cacheControl.d.ts +0 -48
  206. package/middleware/cacheControl.js +0 -53
  207. package/middleware/detectBot.d.ts +0 -121
  208. package/middleware/detectBot.js +0 -98
  209. package/middleware/detectLocale.d.ts +0 -55
  210. package/middleware/detectLocale.js +0 -39
  211. package/middleware/lazyLoadModules.d.ts +0 -72
  212. package/middleware/lazyLoadModules.js +0 -69
  213. package/middleware/rateLimiter.js +0 -20
  214. package/middleware/requestTimeout.d.ts +0 -25
  215. package/middleware/requestTimeout.js +0 -38
  216. package/middleware/sanitizeHeader.js +0 -47
  217. package/middleware/secureHeaders.d.ts +0 -78
  218. package/middleware/secureHeaders.js +0 -38
  219. package/middleware/xssProtection.js +0 -22
  220. package/node/adapter.d.ts +0 -46
  221. package/node/adapter.js +0 -102
  222. package/utils/regexRouter.d.ts +0 -66
  223. package/utils/regexRouter.js +0 -53
  224. package/utils/state.d.ts +0 -50
  225. package/utils/state.js +0 -30
  226. package/utils/staticFile.d.ts +0 -10
  227. package/utils/toWebRequest.js +0 -32
  228. package/ws/deno.d.ts +0 -6
  229. package/ws/deno.js +0 -16
  230. package/ws/index.d.ts +0 -180
  231. package/ws/index.js +0 -50
  232. package/ws/node.d.ts +0 -7
  233. package/ws/node.js +0 -28
  234. /package/{utils → node}/toWebRequest.d.ts +0 -0
@@ -1,234 +1,115 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TezX = void 0;
4
- const colors_js_1 = require("../utils/colors.js");
5
- const httpStatusMap_js_1 = require("../utils/httpStatusMap.js");
6
- const regexRouter_js_1 = require("../utils/regexRouter.js");
4
+ const RadixRouter_js_1 = require("../registry/RadixRouter.js");
5
+ const response_js_1 = require("../utils/response.js");
6
+ const url_js_1 = require("../utils/url.js");
7
7
  const config_js_1 = require("./config.js");
8
8
  const context_js_1 = require("./context.js");
9
+ const error_js_1 = require("./error.js");
9
10
  const router_js_1 = require("./router.js");
10
11
  class TezX extends router_js_1.Router {
11
- #onPathResolve;
12
- constructor({ basePath = "/", env = {}, debugMode = false, onPathResolve, allowDuplicateMw = false, overwriteMethod = true, } = {}) {
13
- config_js_1.GlobalConfig.allowDuplicateMw = allowDuplicateMw;
14
- config_js_1.GlobalConfig.overwriteMethod = overwriteMethod;
12
+ #pathResolver;
13
+ #notFound = response_js_1.notFoundResponse;
14
+ #errorHandler = response_js_1.handleErrorResponse;
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
19
  super({ basePath, env });
19
- this.#onPathResolve = onPathResolve;
20
+ if (!routeRegistry) {
21
+ throw new Error("routeRegistry is required for TezX initialization");
22
+ }
23
+ this.router = routeRegistry;
24
+ this.#pathResolver = onPathResolve;
20
25
  this.serve = this.serve.bind(this);
21
26
  }
22
- #regexRouter(method, pathname) {
23
- for (let pattern of this.routers.values()) {
24
- const handler = pattern?.get(method) || pattern?.get("ALL");
25
- const { success, params } = (0, regexRouter_js_1.regexMatchRoute)(handler?.regex, pathname, handler?.paramNames || []);
26
- if (success && handler) {
27
- return {
28
- callback: handler.callback,
29
- middlewares: handler.middlewares,
30
- params: params,
31
- };
32
- }
33
- }
34
- return null;
27
+ notFound(callback) {
28
+ this.#notFound = callback;
29
+ return this;
35
30
  }
36
- #triRouter(method, pathname, priority = "static") {
37
- const parts = pathname.split("/").filter(Boolean);
38
- const params = {};
39
- let node = this.triRouter;
40
- if (priority == "static") {
41
- for (let part of parts) {
42
- if (node.children.has(part)) {
43
- node = node.children.get(part);
44
- }
45
- else if (node.children.has(":")) {
46
- node = node.children.get(":");
47
- if (node.paramName)
48
- params[node.paramName] = part;
49
- }
50
- else {
51
- return null;
52
- }
53
- }
54
- }
55
- else {
56
- for (let part of parts) {
57
- if (node.children.has(":")) {
58
- node = node.children.get(":");
59
- if (node.paramName)
60
- params[node.paramName] = part;
61
- }
62
- else if (node.children.has(part)) {
63
- node = node.children.get(part);
64
- }
65
- else {
66
- return null;
67
- }
68
- }
69
- }
70
- if (node?.handlers?.size && node?.pathname) {
71
- const handlers = node.handlers.get(method) || node.handlers.get("ALL");
72
- if (handlers) {
73
- return {
74
- middlewares: handlers.middlewares,
75
- callback: handlers.callback,
76
- params: params,
77
- };
78
- }
79
- return null;
80
- }
81
- return null;
82
- }
83
- findRoute(method, pathname) {
84
- const route = this.#triRouter(method, pathname) ||
85
- this.#regexRouter(method, pathname) ||
86
- this.#triRouter(method, pathname, "param");
87
- if (route) {
88
- return {
89
- ...route,
90
- middlewares: [...route.middlewares],
91
- };
92
- }
93
- return null;
31
+ onError(callback) {
32
+ this.#errorHandler = callback;
33
+ return this;
94
34
  }
95
- #createHandler(middlewares) {
96
- return async (ctx) => {
97
- let index = 0;
98
- let response = undefined;
99
- const next = async () => {
100
- if (index >= middlewares.length) {
101
- return;
35
+ async #chain(ctx, mLen, middlewares, hLen, handlers) {
36
+ let index = -1;
37
+ let res;
38
+ async function dispatch(i) {
39
+ if (i <= index)
40
+ throw new error_js_1.TezXError("next() called multiple times");
41
+ index = i;
42
+ if (i < mLen) {
43
+ const fn = middlewares[i];
44
+ if (typeof fn !== "function")
45
+ throw new TypeError(`Middleware[${i}] must be a function`);
46
+ res = (await fn(ctx, () => dispatch(i + 1)));
47
+ if (res !== undefined) {
48
+ ctx.res = res;
102
49
  }
103
- const currentMiddleware = middlewares[index++];
104
- try {
105
- const result = await currentMiddleware(ctx, next);
106
- if (result instanceof Response) {
107
- ctx.res = result;
108
- }
109
- if (result !== undefined) {
110
- response = result;
111
- }
112
- return response;
113
- }
114
- catch (err) {
115
- ctx.body = err;
116
- throw err;
117
- }
118
- };
119
- let res = await next();
120
- if (res instanceof Response) {
121
- return res;
122
- }
123
- if (typeof res == "function" && ctx.wsProtocol) {
124
- return res;
125
- }
126
- if (!res && !ctx.body) {
127
- throw new Error(`Handler failed: Middleware chain incomplete or response missing. Did you forget ${(0, colors_js_1.colorText)(" await next() ", "bgRed")} or to return a response? ${(0, colors_js_1.colorText)(` Path: ${ctx.pathname}, Method: ${ctx.method} `, "bgCyan")}`);
128
- }
129
- const resBody = res || ctx.body;
130
- const toJson = {};
131
- for (const [key, value] of ctx.headers.entries()) {
132
- toJson[key] = value;
133
- }
134
- return ctx.send(resBody, toJson);
135
- };
136
- }
137
- #findMiddleware(pathname) {
138
- const parts = pathname.split("/").filter(Boolean);
139
- let middlewares = [];
140
- let node = this.triMiddlewares;
141
- for (let part of parts) {
142
- if (node.children.has(part)) {
143
- node = node.children.get(part);
144
- }
145
- else if (node.children.has("*")) {
146
- node = node.children.get("*");
50
+ return ctx.res;
147
51
  }
148
- else if (node.children.has(":")) {
149
- node = node.children.get(":");
150
- }
151
- else {
152
- break;
52
+ const hi = i - mLen;
53
+ if (hi < hLen) {
54
+ const fn = handlers[hi];
55
+ if (typeof fn !== "function")
56
+ throw new TypeError(`Handler[${hi}] must be a function`);
57
+ res = (await fn(ctx, () => dispatch(i + 1)));
58
+ if (res !== undefined) {
59
+ ctx.res = res;
60
+ }
61
+ return ctx.res;
153
62
  }
154
- middlewares.push(...node.middlewares);
155
- }
156
- return middlewares;
157
- }
158
- async #resolvePath(pathname) {
159
- let resolvePath = pathname;
160
- if (this.#onPathResolve) {
161
- resolvePath = await this.#onPathResolve(pathname);
162
- config_js_1.GlobalConfig.debugging.warn(`${(0, colors_js_1.colorText)(" PATH RESOLVE ", "white")} ${(0, colors_js_1.colorText)(pathname, "red")} ➞ ${(0, colors_js_1.colorText)(resolvePath, "cyan")}`);
163
63
  }
164
- if (typeof resolvePath !== "string") {
165
- throw new Error(`Path resolution failed: expected a string, got ${typeof resolvePath}`);
166
- }
167
- return resolvePath;
64
+ await dispatch(0);
65
+ return (ctx.res ??
66
+ (ctx.body !== undefined ? ctx.send(ctx.body) : this.#notFound(ctx)));
168
67
  }
169
- async #handleRequest(req, options) {
170
- let ctx = new context_js_1.Context(req, options);
171
- const urlRef = ctx.req.urlRef;
172
- const { pathname } = urlRef;
173
- let resolvePath = await this.#resolvePath(pathname);
174
- let middlewares = this.#findMiddleware(resolvePath);
175
- ctx.env = this.env;
68
+ async #handleRequest(req, method, args) {
69
+ if (!(req instanceof Request))
70
+ throw new error_js_1.TezXError("Invalid request object provided to tezX server.");
71
+ const rawPath = (0, url_js_1.getPathname)(req.url);
72
+ const pathname = this.#pathResolver
73
+ ? await this.#pathResolver(rawPath)
74
+ : rawPath;
75
+ const ctx = new context_js_1.Context(req, pathname, method, this.env, args);
176
76
  try {
177
- let combine = [...this.triMiddlewares.middlewares, ...middlewares];
178
- const find = this.findRoute(ctx.req.method, resolvePath);
179
- if (find?.callback) {
180
- ctx.params = find.params;
181
- const callback = find.callback;
182
- let routeMiddlewares = find.middlewares || [];
183
- combine.push(...routeMiddlewares, callback);
77
+ const staticHandler = this.staticFile?.[`${method} ${pathname}`];
78
+ if (staticHandler) {
79
+ return staticHandler(ctx);
184
80
  }
185
- else {
186
- ctx.setStatus = 404;
187
- combine.push(config_js_1.GlobalConfig.notFound);
81
+ const route = this.router?.search(method, pathname);
82
+ const mLen = route?.middlewares?.length;
83
+ const hLen = route?.handlers?.length;
84
+ if (!route || (hLen === 0 && mLen === 0)) {
85
+ return this.#notFound(ctx);
188
86
  }
189
- let response = await this.#createHandler(combine)(ctx);
190
- if (ctx.wsProtocol) {
191
- if (typeof response == "function") {
192
- return {
193
- websocket: response,
194
- ctx: ctx,
195
- };
196
- }
197
- return response;
87
+ ctx.params = route.params;
88
+ if (hLen === 1 && mLen === 0) {
89
+ return ((await route.handlers[0](ctx)) ??
90
+ (ctx.body !== undefined ? ctx.send(ctx.body) : this.#notFound(ctx)));
198
91
  }
199
- let finalResponse = () => {
200
- return (ctx) => {
201
- let headers = response?.headers;
202
- for (const [key, value] of headers.entries()) {
203
- ctx.headers.set(key, value);
204
- }
205
- const statusText = response?.statusText || httpStatusMap_js_1.httpStatusMap[response?.status] || "";
206
- const status = response.status || ctx.getStatus;
207
- return new Response(response.body, {
208
- status,
209
- statusText,
210
- headers: ctx.headers,
211
- });
212
- };
213
- };
214
- return finalResponse()(ctx);
92
+ return await this.#chain(ctx, mLen, route.middlewares, hLen, route.handlers);
215
93
  }
216
94
  catch (err) {
217
- return this.#handleError(err, ctx);
95
+ return this.#errorHandler?.((0, error_js_1.TezXErrorParse)(err), ctx);
218
96
  }
219
97
  }
220
- async #handleError(err, ctx) {
221
- let error = err;
222
- if (err instanceof Error) {
223
- error = err.stack;
98
+ async serve(req, ...args) {
99
+ const method = (req.method ?? "GET").toUpperCase();
100
+ if (method === "HEAD") {
101
+ const getRequest = new Request(req.url, { ...req, method: "GET" });
102
+ const headResponse = await this.#handleRequest(getRequest, method, args);
103
+ return new Response(null, {
104
+ status: headResponse.status,
105
+ statusText: headResponse.statusText,
106
+ headers: headResponse.headers,
107
+ });
224
108
  }
225
- config_js_1.GlobalConfig.debugging.error(`${(0, colors_js_1.colorText)(` ${ctx.pathname}, Method: ${ctx.method} `, "bgRed")}`, `${httpStatusMap_js_1.httpStatusMap[500]}: ${error} `);
226
- let res = await config_js_1.GlobalConfig.onError(error, ctx);
227
- ctx.setStatus = res.status;
228
- return res;
229
- }
230
- async serve(req, options) {
231
- return this.#handleRequest(req, options);
109
+ return this.#handleRequest(req, method, args);
232
110
  }
233
111
  }
234
112
  exports.TezX = TezX;
113
+ if (!globalThis.TezX) {
114
+ globalThis.TezX = TezX;
115
+ }
package/cjs/deno/env.js CHANGED
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.loadEnv = loadEnv;
4
- const environment_js_1 = require("../core/environment.js");
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
- let runtime = environment_js_1.Environment.getEnvironment;
9
- if (runtime !== "deno") {
10
- throw new Error(`Please use ${(0, colors_js_1.colorText)(`import {loadEnv} from "tezx/${runtime}"`, "bgRed")} environment`);
9
+ if (runtime_js_1.runtime !== "deno") {
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
11
  }
12
12
  let fileExists = false;
13
13
  try {
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConnInfo = getConnInfo;
4
+ function getConnInfo() {
5
+ return (ctx, next) => {
6
+ let connInfo = ctx.args?.[0];
7
+ if (connInfo && connInfo.remoteAddr) {
8
+ let remoteAddr = connInfo.remoteAddr;
9
+ ctx.req.remoteAddress = {
10
+ port: remoteAddr?.port,
11
+ address: remoteAddr?.hostname,
12
+ transport: remoteAddr?.transport,
13
+ family: remoteAddr?.family,
14
+ };
15
+ }
16
+ return next();
17
+ };
18
+ }
package/cjs/deno/index.js CHANGED
@@ -1,24 +1,17 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
17
- const adpater_js_1 = require("./adpater.js");
3
+ exports.upgradeWebSocket = exports.serveStatic = exports.loadEnv = exports.getConnInfo = void 0;
18
4
  const env_js_1 = require("./env.js");
19
- __exportStar(require("./adpater.js"), exports);
20
- __exportStar(require("./env.js"), exports);
5
+ Object.defineProperty(exports, "loadEnv", { enumerable: true, get: function () { return env_js_1.loadEnv; } });
6
+ const getConnInfo_js_1 = require("./getConnInfo.js");
7
+ Object.defineProperty(exports, "getConnInfo", { enumerable: true, get: function () { return getConnInfo_js_1.getConnInfo; } });
8
+ const serveStatic_js_1 = require("./serveStatic.js");
9
+ Object.defineProperty(exports, "serveStatic", { enumerable: true, get: function () { return serveStatic_js_1.serveStatic; } });
10
+ const ws_js_1 = require("./ws.js");
11
+ Object.defineProperty(exports, "upgradeWebSocket", { enumerable: true, get: function () { return ws_js_1.upgradeWebSocket; } });
21
12
  exports.default = {
22
- denoAdapter: adpater_js_1.denoAdapter,
13
+ serveStatic: serveStatic_js_1.serveStatic,
14
+ getConnInfo: getConnInfo_js_1.getConnInfo,
23
15
  loadEnv: env_js_1.loadEnv,
16
+ upgradeWebSocket: ws_js_1.upgradeWebSocket,
24
17
  };
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serveStatic = serveStatic;
4
+ exports.getFiles = getFiles;
5
+ const error_js_1 = require("../core/error.js");
6
+ const low_level_js_1 = require("../utils/low-level.js");
7
+ function serveStatic(...args) {
8
+ let route = "";
9
+ let dir;
10
+ let options = {};
11
+ switch (args.length) {
12
+ case 3:
13
+ [route, dir, options] = args;
14
+ break;
15
+ case 2:
16
+ if (typeof args[1] === "object") {
17
+ [dir, options] = args;
18
+ }
19
+ else {
20
+ [route, dir] = args;
21
+ }
22
+ break;
23
+ case 1:
24
+ [dir] = args;
25
+ break;
26
+ default:
27
+ throw new error_js_1.TezXError(`\x1b[1;31m404 Not Found\x1b[0m \x1b[1;32mInvalid arguments\x1b[0m`);
28
+ }
29
+ return {
30
+ files: getFiles(dir, route, options),
31
+ options,
32
+ };
33
+ }
34
+ function getFiles(dir, basePath = "/", option = {}) {
35
+ const files = [];
36
+ for (const entry of Deno.readDirSync(dir)) {
37
+ const path = `${dir}/${entry.name}`;
38
+ if (entry.isDirectory) {
39
+ files.push(...getFiles(path, `${basePath}/${entry.name}`, option));
40
+ }
41
+ else {
42
+ const ext = (0, low_level_js_1.extensionExtract)(entry.name);
43
+ if (option?.extensions?.length && !option.extensions.includes(ext)) {
44
+ continue;
45
+ }
46
+ files.push({
47
+ fileSource: path,
48
+ route: `/${(0, low_level_js_1.sanitizePathSplitBasePath)(basePath, entry.name).join("/")}`,
49
+ });
50
+ }
51
+ }
52
+ return files;
53
+ }
package/cjs/deno/ws.js ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.upgradeWebSocket = upgradeWebSocket;
4
+ const error_js_1 = require("../core/error.js");
5
+ function upgradeWebSocket(callback, options = {}) {
6
+ const { onUpgradeError = (error, ctx) => {
7
+ ctx.setStatus = 401;
8
+ return ctx.text(error.message);
9
+ }, } = options;
10
+ return async (ctx, next) => {
11
+ const upgrade = ctx.req.header("upgrade")?.toLowerCase();
12
+ const connection = ctx.req.header("connection")?.toLowerCase();
13
+ const key = ctx.req.header("sec-websocket-key");
14
+ if (upgrade !== "websocket" || !connection?.includes("upgrade") || !key) {
15
+ ctx.setStatus = 401;
16
+ const error = new error_js_1.TezXError("Invalid WebSocket upgrade request.", 401);
17
+ return next ? next() : onUpgradeError(error, ctx);
18
+ }
19
+ ctx.wsProtocol = ctx.url?.startsWith("https") ? "wss" : "ws";
20
+ try {
21
+ if (typeof callback !== "function") {
22
+ throw new error_js_1.TezXError("Missing or invalid WebSocket callback handler.");
23
+ }
24
+ const { socket, response } = Deno.upgradeWebSocket(ctx.rawRequest, {
25
+ protocol: options.protocol,
26
+ idleTimeout: options.idleTimeout,
27
+ });
28
+ const event = callback(ctx);
29
+ socket.onopen = () => event.open?.(socket, ctx);
30
+ socket.onmessage = (e) => event.message?.(socket, e.data);
31
+ socket.onclose = (e) => event.close?.(socket, { code: e.code, reason: e.reason });
32
+ socket.onerror = (err) => event.error?.(socket, err);
33
+ return response;
34
+ }
35
+ catch (err) {
36
+ return onUpgradeError((0, error_js_1.TezXErrorParse)(err, 426), ctx);
37
+ }
38
+ };
39
+ }
@@ -1,20 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sanitizePathSplit = exports.GlobalConfig = exports.generateID = exports.Environment = exports.colorText = 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
- const environment_js_1 = require("../core/environment.js");
7
- Object.defineProperty(exports, "Environment", { enumerable: true, get: function () { return environment_js_1.Environment; } });
8
6
  const colors_js_1 = require("../utils/colors.js");
9
7
  Object.defineProperty(exports, "colorText", { enumerable: true, get: function () { return colors_js_1.colorText; } });
10
- const url_js_1 = require("../utils/url.js");
11
- Object.defineProperty(exports, "sanitizePathSplit", { enumerable: true, get: function () { return url_js_1.sanitizePathSplit; } });
12
- const common_js_1 = require("./common.js");
13
- Object.defineProperty(exports, "generateID", { enumerable: true, get: function () { return common_js_1.generateID; } });
8
+ const cookie_js_1 = require("../utils/cookie.js");
9
+ Object.defineProperty(exports, "allCookies", { enumerable: true, get: function () { return cookie_js_1.allCookies; } });
10
+ Object.defineProperty(exports, "deleteCookie", { enumerable: true, get: function () { return cookie_js_1.deleteCookie; } });
11
+ Object.defineProperty(exports, "getCookie", { enumerable: true, get: function () { return cookie_js_1.getCookie; } });
12
+ Object.defineProperty(exports, "setCookie", { enumerable: true, get: function () { return cookie_js_1.setCookie; } });
13
+ const file_js_1 = require("../utils/file.js");
14
+ Object.defineProperty(exports, "fileExists", { enumerable: true, get: function () { return file_js_1.fileExists; } });
15
+ Object.defineProperty(exports, "fileSize", { enumerable: true, get: function () { return file_js_1.fileSize; } });
16
+ Object.defineProperty(exports, "getFileBuffer", { enumerable: true, get: function () { return file_js_1.getFileBuffer; } });
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; } });
26
+ const low_level_js_1 = require("../utils/low-level.js");
27
+ Object.defineProperty(exports, "extensionExtract", { enumerable: true, get: function () { return low_level_js_1.extensionExtract; } });
28
+ Object.defineProperty(exports, "normalizeHeaderKey", { enumerable: true, get: function () { return low_level_js_1.normalizeHeaderKey; } });
29
+ Object.defineProperty(exports, "sanitizePathSplit", { enumerable: true, get: function () { return low_level_js_1.sanitizePathSplit; } });
30
+ Object.defineProperty(exports, "sanitizePathSplitBasePath", { enumerable: true, get: function () { return low_level_js_1.sanitizePathSplitBasePath; } });
31
+ Object.defineProperty(exports, "sanitized", { enumerable: true, get: function () { return low_level_js_1.sanitized; } });
32
+ const runtime_js_1 = require("../utils/runtime.js");
33
+ Object.defineProperty(exports, "runtime", { enumerable: true, get: function () { return runtime_js_1.runtime; } });
14
34
  exports.default = {
15
- Environment: environment_js_1.Environment,
35
+ useFormData: formData_js_1.useFormData,
36
+ generateRandomBase64: generateID_js_1.generateRandomBase64,
37
+ runtime: runtime_js_1.runtime,
38
+ extensionExtract: low_level_js_1.extensionExtract,
39
+ normalizeHeaderKey: low_level_js_1.normalizeHeaderKey,
40
+ sanitizePathSplit: low_level_js_1.sanitizePathSplit,
41
+ sanitizePathSplitBasePath: low_level_js_1.sanitizePathSplitBasePath,
42
+ sanitized: low_level_js_1.sanitized,
43
+ allCookies: cookie_js_1.allCookies,
44
+ deleteCookie: cookie_js_1.deleteCookie,
45
+ getCookie: cookie_js_1.getCookie,
46
+ setCookie: cookie_js_1.setCookie,
47
+ fileExists: file_js_1.fileExists,
48
+ fileSize: file_js_1.fileSize,
49
+ getFileBuffer: file_js_1.getFileBuffer,
50
+ readStream: file_js_1.readStream,
51
+ generateID: generateID_js_1.generateID,
52
+ generateUUID: generateID_js_1.generateUUID,
53
+ httpStatusMap: httpStatusMap_js_1.httpStatusMap,
16
54
  colorText: colors_js_1.colorText,
17
55
  GlobalConfig: config_js_1.GlobalConfig,
18
- sanitizePathSplit: url_js_1.sanitizePathSplit,
19
- generateID: common_js_1.generateID,
20
56
  };
package/cjs/index.js CHANGED
@@ -1,18 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.version = exports.TezX = exports.Router = exports.regexMatchRoute = exports.compileRegexRoute = void 0;
3
+ exports.version = exports.TezXError = exports.TezX = exports.Router = void 0;
4
+ const error_js_1 = require("./core/error.js");
5
+ Object.defineProperty(exports, "TezXError", { enumerable: true, get: function () { return error_js_1.TezXError; } });
4
6
  const router_js_1 = require("./core/router.js");
5
7
  Object.defineProperty(exports, "Router", { enumerable: true, get: function () { return router_js_1.Router; } });
6
8
  const server_js_1 = require("./core/server.js");
7
9
  Object.defineProperty(exports, "TezX", { enumerable: true, get: function () { return server_js_1.TezX; } });
8
- const regexRouter_js_1 = require("./utils/regexRouter.js");
9
- Object.defineProperty(exports, "compileRegexRoute", { enumerable: true, get: function () { return regexRouter_js_1.compileRegexRoute; } });
10
- Object.defineProperty(exports, "regexMatchRoute", { enumerable: true, get: function () { return regexRouter_js_1.regexMatchRoute; } });
11
- exports.version = "2.0.11";
10
+ exports.version = "3.0.0";
12
11
  exports.default = {
13
12
  Router: router_js_1.Router,
14
- regexMatchRoute: regexRouter_js_1.regexMatchRoute,
15
- compileRegexRoute: regexRouter_js_1.compileRegexRoute,
16
13
  TezX: server_js_1.TezX,
17
14
  version: exports.version,
15
+ TezXError: error_js_1.TezXError,
18
16
  };