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,152 +1,100 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Request = void 0;
4
- const formData_js_1 = require("../utils/formData.js");
3
+ exports.TezXRequest = void 0;
5
4
  const url_js_1 = require("../utils/url.js");
6
- class Request {
5
+ const error_js_1 = require("./error.js");
6
+ class TezXRequest {
7
7
  url;
8
8
  method;
9
9
  pathname;
10
- urlRef = {
11
- protocol: undefined,
12
- origin: undefined,
13
- hostname: undefined,
14
- port: undefined,
15
- href: undefined,
16
- query: {},
17
- pathname: "/",
18
- };
19
- query;
20
- rawRequest;
10
+ #rawRequest;
21
11
  params = {};
22
12
  remoteAddress = {};
23
- constructor({ params, method, req, options, }) {
24
- let parse = (0, url_js_1.urlParse)(req.url);
25
- let url = parse?.href;
26
- this.remoteAddress = options?.connInfo?.remoteAddr;
27
- this.url = url || "";
28
- this.urlRef = parse;
13
+ #bodyConsumed = false;
14
+ #rawBodyArrayBuffer;
15
+ #cachedText;
16
+ #cachedJSON;
17
+ #cachedFormObject;
18
+ #headersCache;
19
+ #queryCache;
20
+ constructor(req, method, pathname, params) {
21
+ this.url = req.url;
22
+ this.params = params ?? {};
29
23
  this.method = method;
30
- this.params = params;
31
- this.rawRequest = req;
32
- this.pathname = parse.pathname;
33
- this.query = parse.query;
24
+ this.#rawRequest = req;
25
+ this.pathname = pathname ?? "/";
34
26
  }
35
- get headers() {
36
- let requestHeaders = this.rawRequest.headers;
37
- return {
38
- get: function get(key) {
39
- return requestHeaders.get(key.toLowerCase());
40
- },
41
- has: function has(key) {
42
- return requestHeaders.has(key.toLowerCase());
43
- },
44
- entries: function entries() {
45
- return requestHeaders.entries();
46
- },
47
- keys: function keys() {
48
- return requestHeaders.keys();
49
- },
50
- values: function values() {
51
- return requestHeaders.values();
52
- },
53
- forEach: function forEach(callbackfn) {
54
- return requestHeaders.forEach(callbackfn);
55
- },
56
- toJSON() {
57
- const obj = {};
58
- for (const [key, value] of requestHeaders.entries()) {
59
- obj[key] = value;
60
- }
61
- return obj;
62
- },
63
- };
27
+ header(header) {
28
+ if (header) {
29
+ return this.#rawRequest.headers.get(header.toLowerCase());
30
+ }
31
+ if (this.#headersCache)
32
+ return this.#headersCache;
33
+ const obj = {};
34
+ this.#rawRequest.headers.forEach((value, key) => {
35
+ obj[key.toLowerCase()] = value;
36
+ });
37
+ this.#headersCache = obj;
38
+ return this.#headersCache;
39
+ }
40
+ get query() {
41
+ return (this.#queryCache ??= (0, url_js_1.url2query)(this.url));
42
+ }
43
+ async #ensureRawBuffer() {
44
+ if (this.#bodyConsumed)
45
+ return;
46
+ this.#rawBodyArrayBuffer = await this.#rawRequest.arrayBuffer();
47
+ this.#bodyConsumed = true;
64
48
  }
65
49
  async text() {
66
- return await this.rawRequest.text();
50
+ if (this.#cachedText !== undefined)
51
+ return this.#cachedText;
52
+ await this.#ensureRawBuffer();
53
+ this.#cachedText = new TextDecoder().decode(this.#rawBodyArrayBuffer);
54
+ return this.#cachedText;
55
+ }
56
+ get #contentType() {
57
+ const ct = this.#rawRequest.headers.get("content-type");
58
+ if (!ct)
59
+ return "";
60
+ return ct.split(";")[0].trim().toLowerCase();
67
61
  }
68
62
  async json() {
69
- const contentType = this.rawRequest.headers.get("content-type") || "";
70
- if (contentType.includes("application/json")) {
71
- return await this.rawRequest.json();
72
- }
73
- else {
63
+ if (this.#cachedJSON !== undefined)
64
+ return this.#cachedJSON;
65
+ if (this.#contentType !== "application/json")
74
66
  return {};
75
- }
76
- }
77
- async formData(options) {
78
- const contentType = this.rawRequest.headers.get("content-type") || "";
79
- if (!contentType) {
80
- throw Error("Invalid Content-Type");
81
- }
82
- if (contentType.includes("application/json")) {
83
- return await this.rawRequest.json();
84
- }
85
- else if (contentType.includes("application/x-www-form-urlencoded")) {
86
- const formData = await this.rawRequest.formData();
87
- const result = {};
88
- for (const [key, value] of formData.entries()) {
89
- result[key] = value;
90
- }
91
- return result;
92
- }
93
- else if (contentType.includes("multipart/form-data")) {
94
- const boundaryMatch = contentType.match(/boundary=([^;]+)/);
95
- if (!boundaryMatch) {
96
- throw new Error("Boundary not found in multipart/form-data");
67
+ try {
68
+ if (!this.#bodyConsumed) {
69
+ this.#cachedJSON = await this.#rawRequest.json();
70
+ this.#bodyConsumed = true;
97
71
  }
98
- const formData = await this.rawRequest.formData();
99
- const result = {};
100
- for (const [key, value] of formData.entries()) {
101
- let val = value;
102
- if (val instanceof File && typeof options == "object") {
103
- let filename = val.name;
104
- if (options?.sanitized) {
105
- filename = `${Date.now()}-${(0, formData_js_1.sanitized)(filename)}`;
106
- }
107
- if (Array.isArray(options?.allowedTypes) &&
108
- !options.allowedTypes?.includes(val.type)) {
109
- throw new Error(`Invalid file type: "${val.type}". Allowed types: ${options.allowedTypes.join(", ")}`);
110
- }
111
- if (typeof options?.maxSize !== "undefined" &&
112
- val.size > options.maxSize) {
113
- throw new Error(`File size exceeds the limit: ${val.size} bytes (Max: ${options.maxSize} bytes)`);
114
- }
115
- if (typeof options?.maxFiles != "undefined" &&
116
- options.maxFiles == 0) {
117
- throw new Error(`Field "${key}" exceeds the maximum allowed file count of ${options.maxFiles}.`);
118
- }
119
- val = new File([await val.arrayBuffer()], filename, {
120
- type: val.type,
121
- });
122
- }
123
- if (result[key]) {
124
- if (Array.isArray(result[key])) {
125
- if (val instanceof File &&
126
- typeof options?.maxFiles != "undefined" &&
127
- result[key]?.length >= options.maxFiles) {
128
- throw new Error(`Field "${key}" exceeds the maximum allowed file count of ${options.maxFiles}.`);
129
- }
130
- result[key].push(val);
131
- }
132
- else {
133
- if (val instanceof File &&
134
- typeof options?.maxFiles != "undefined" &&
135
- options.maxFiles == 1) {
136
- throw new Error(`Field "${key}" exceeds the maximum allowed file count of ${options.maxFiles}.`);
137
- }
138
- result[key] = [result[key], val];
139
- }
140
- }
141
- else {
142
- result[key] = val;
143
- }
72
+ else {
73
+ const txt = await this.text();
74
+ this.#cachedJSON = txt ? JSON.parse(txt) : {};
144
75
  }
145
- return result;
146
76
  }
147
- else {
148
- return {};
77
+ catch {
78
+ this.#cachedJSON = {};
79
+ }
80
+ return this.#cachedJSON;
81
+ }
82
+ async formData() {
83
+ if (this.#cachedFormObject)
84
+ return this.#cachedFormObject;
85
+ const ct = this.#contentType;
86
+ if (!ct)
87
+ throw new error_js_1.TezXError("Missing Content-Type");
88
+ if (ct === "application/x-www-form-urlencoded" ||
89
+ ct === "multipart/form-data") {
90
+ if (this.#bodyConsumed) {
91
+ throw new error_js_1.TezXError("Multipart body already consumed elsewhere");
92
+ }
93
+ this.#cachedFormObject = (await this.#rawRequest.formData());
94
+ this.#bodyConsumed = true;
95
+ return this.#cachedFormObject;
149
96
  }
97
+ return this.#cachedFormObject;
150
98
  }
151
99
  }
152
- exports.Request = Request;
100
+ exports.TezXRequest = TezXRequest;