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,13 +1,63 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sanitized = sanitized;
4
- function sanitized(title) {
5
- const base = title
6
- .toLowerCase()
7
- .trim()
8
- .replace(/[_\s]+/g, "-")
9
- .replace(/[^a-z0-9-.]+/g, "")
10
- .replace(/--+/g, "-")
11
- .replace(/^-+|-+$/g, "");
12
- return base;
3
+ exports.useFormData = useFormData;
4
+ exports.processFile = processFile;
5
+ const low_level_js_1 = require("./low-level.js");
6
+ async function useFormData(ctx, options) {
7
+ const fd = await ctx.req.formData();
8
+ const result = {};
9
+ let totalFileBytes = 0;
10
+ for (const [key, originalVal] of fd.entries()) {
11
+ let val = originalVal;
12
+ if (val instanceof File && options) {
13
+ val = await processFile(val, key, options, () => totalFileBytes);
14
+ totalFileBytes += val.size;
15
+ if (typeof options.maxTotalSize === "number" &&
16
+ totalFileBytes > options.maxTotalSize) {
17
+ throw new Error(`Total file bytes exceeded maxTotalSize=${options.maxTotalSize}`);
18
+ }
19
+ }
20
+ else if (typeof val === "string" &&
21
+ options?.maxFieldSize &&
22
+ val.length > options.maxFieldSize) {
23
+ throw new Error(`Field "${key}" length ${val.length} exceeds maxFieldSize=${options.maxFieldSize}`);
24
+ }
25
+ if (key in result) {
26
+ if (!Array.isArray(result[key])) {
27
+ result[key] = [result[key]];
28
+ }
29
+ result[key].push(val);
30
+ }
31
+ else {
32
+ result[key] = val;
33
+ }
34
+ if (val instanceof File && typeof options?.maxFiles === "number") {
35
+ const filesForKey = Array.isArray(result[key])
36
+ ? result[key].filter((v) => v instanceof File).length
37
+ : result[key] instanceof File
38
+ ? 1
39
+ : 0;
40
+ if (filesForKey > options.maxFiles) {
41
+ throw new Error(`Field "${key}" exceeds maxFiles (${options.maxFiles})`);
42
+ }
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ async function processFile(file, key, options, totalGetter) {
48
+ let name = file.name;
49
+ if (options.sanitized) {
50
+ name = `${Date.now()}-${(0, low_level_js_1.sanitized)(name)}`;
51
+ }
52
+ if (Array.isArray(options.allowedTypes) &&
53
+ !options.allowedTypes.includes(file.type)) {
54
+ throw new Error(`Field "${key}": invalid file type "${file.type}". Allowed: ${options.allowedTypes.join(", ")}`);
55
+ }
56
+ if (typeof options.maxSize === "number" && file.size > options.maxSize) {
57
+ throw new Error(`Field "${key}": file size ${file.size} > maxSize ${options.maxSize}`);
58
+ }
59
+ if (name !== file.name) {
60
+ return new File([await file.arrayBuffer()], name, { type: file.type });
61
+ }
62
+ return file;
13
63
  }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateID = generateID;
4
+ exports.generateUUID = generateUUID;
5
+ exports.generateRandomBase64 = generateRandomBase64;
6
+ function generateID() {
7
+ const timestamp = Date.now().toString(16);
8
+ let randomHex = "";
9
+ if (typeof crypto !== "undefined" &&
10
+ typeof crypto.getRandomValues === "function") {
11
+ const array = new Uint8Array(6);
12
+ crypto.getRandomValues(array);
13
+ for (let i = 0; i < array.length; i++) {
14
+ randomHex += array[i].toString(16).padStart(2, "0");
15
+ }
16
+ }
17
+ else {
18
+ randomHex = Math.floor(Math.random() * 0xffffffffffff)
19
+ .toString(16)
20
+ .padStart(12, "0");
21
+ }
22
+ return `${timestamp}-${randomHex}`;
23
+ }
24
+ function generateUUID() {
25
+ if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function")
26
+ return crypto.randomUUID();
27
+ return generateID();
28
+ }
29
+ function generateRandomBase64(length = 16) {
30
+ let result = "";
31
+ const BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
32
+ for (let i = 0; i < length; i++) {
33
+ const idx = Math.floor(Math.random() * 64);
34
+ result += BASE64[idx];
35
+ }
36
+ return result;
37
+ }
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeHeaderKey = normalizeHeaderKey;
4
+ exports.extensionExtract = extensionExtract;
5
+ exports.sanitizePathSplitBasePath = sanitizePathSplitBasePath;
6
+ exports.sanitizePathSplit = sanitizePathSplit;
7
+ exports.sanitized = sanitized;
8
+ function normalizeHeaderKey(key) {
9
+ let result = "";
10
+ let upperNext = true;
11
+ for (let i = 0; i < key.length; i++) {
12
+ const ch = key.charCodeAt(i);
13
+ if (ch === 45) {
14
+ result += "-";
15
+ upperNext = true;
16
+ }
17
+ else {
18
+ result += upperNext
19
+ ? String.fromCharCode(ch >= 97 && ch <= 122 ? ch - 32 : ch)
20
+ : String.fromCharCode(ch >= 65 && ch <= 90 ? ch + 32 : ch);
21
+ upperNext = false;
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+ function extensionExtract(filePath) {
27
+ let lastDot = -1;
28
+ for (let i = filePath.length - 1; i >= 0; i--) {
29
+ if (filePath[i] === ".") {
30
+ lastDot = i;
31
+ break;
32
+ }
33
+ }
34
+ if (lastDot === -1 || lastDot === filePath.length - 1)
35
+ return "";
36
+ let ext = "";
37
+ for (let i = lastDot + 1; i < filePath.length; i++) {
38
+ let c = filePath.charCodeAt(i);
39
+ if (c >= 65 && c <= 90) {
40
+ c += 32;
41
+ }
42
+ ext += String.fromCharCode(c);
43
+ }
44
+ return ext;
45
+ }
46
+ function sanitizePathSplitBasePath(basePath, path, out) {
47
+ const combined = `${basePath}/${path}`;
48
+ const parts = out ?? [];
49
+ let segStart = 0;
50
+ let i = 0;
51
+ const len = combined.length;
52
+ while (i < len) {
53
+ const code = combined.charCodeAt(i);
54
+ if (code === 47 || code === 92) {
55
+ if (segStart < i) {
56
+ const seg = combined.slice(segStart, i);
57
+ if (seg !== "..")
58
+ parts.push(seg);
59
+ }
60
+ segStart = i + 1;
61
+ }
62
+ i++;
63
+ }
64
+ if (segStart < len) {
65
+ const seg = combined.slice(segStart, len);
66
+ if (seg !== "..")
67
+ parts.push(seg);
68
+ }
69
+ return parts;
70
+ }
71
+ function sanitizePathSplit(path, out) {
72
+ const parts = out ?? [];
73
+ let segStart = 0;
74
+ let i = 0;
75
+ const len = path.length;
76
+ while (i < len) {
77
+ const code = path.charCodeAt(i);
78
+ if (code === 47 || code === 92) {
79
+ if (segStart < i) {
80
+ const seg = path.slice(segStart, i);
81
+ if (seg !== "..")
82
+ parts.push(seg);
83
+ }
84
+ segStart = i + 1;
85
+ }
86
+ i++;
87
+ }
88
+ if (segStart < len) {
89
+ const seg = path.slice(segStart, len);
90
+ if (seg !== "..")
91
+ parts.push(seg);
92
+ }
93
+ return parts;
94
+ }
95
+ function sanitized(title) {
96
+ const len = title.length;
97
+ let result = "";
98
+ let dash = false;
99
+ for (let i = 0; i < len; i++) {
100
+ let ch = title.charCodeAt(i);
101
+ if (ch >= 65 && ch <= 90)
102
+ ch += 32;
103
+ if ((ch >= 97 && ch <= 122) || (ch >= 48 && ch <= 57) || ch === 46) {
104
+ result += String.fromCharCode(ch);
105
+ dash = false;
106
+ }
107
+ else if (ch === 32 || ch === 95 || ch === 45) {
108
+ if (!dash && result.length > 0) {
109
+ result += "-";
110
+ dash = true;
111
+ }
112
+ }
113
+ }
114
+ return result.endsWith("-") ? result.slice(0, -1) : result;
115
+ }
@@ -1,41 +1,6 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.defaultMimeType = exports.mimeTypes = void 0;
37
- exports.getFiles = getFiles;
38
- const environment_js_1 = require("../core/environment.js");
39
4
  exports.mimeTypes = {
40
5
  html: "text/html",
41
6
  htm: "text/html",
@@ -140,55 +105,3 @@ exports.mimeTypes = {
140
105
  gcode: "text/x.gcode",
141
106
  };
142
107
  exports.defaultMimeType = "application/octet-stream";
143
- async function getFiles(dir, basePath = "/", ref, option) {
144
- const files = [];
145
- const runtime = environment_js_1.Environment.getEnvironment;
146
- if (runtime == "deno") {
147
- for await (const entry of Deno.readDir(dir)) {
148
- const path = `${dir}/${entry.name}`;
149
- if (entry.isDirectory) {
150
- files.push(...(await getFiles(path, `${basePath}/${entry.name}`, ref, option)));
151
- }
152
- else {
153
- const x = `${basePath}/${entry.name}`;
154
- files.push({
155
- file: path,
156
- path: x.replace(/\\/g, "/"),
157
- });
158
- }
159
- }
160
- }
161
- else {
162
- const fs = await Promise.resolve().then(() => __importStar(require("node:fs/promises")));
163
- const path = await Promise.resolve().then(() => __importStar(require("node:path")));
164
- const entries = await fs.readdir(dir, { withFileTypes: true });
165
- for (const entry of entries) {
166
- const fullPath = path.join(dir, entry.name);
167
- if (entry.isDirectory()) {
168
- files.push(...(await getFiles(fullPath, `${basePath}/${entry.name}`, ref, option)));
169
- }
170
- else {
171
- const path = `${basePath}/${entry.name}`;
172
- files.push({
173
- file: fullPath,
174
- path: path.replace(/\\/g, "/"),
175
- });
176
- }
177
- }
178
- }
179
- files.forEach((r) => {
180
- ref.get(r.path, (ctx) => {
181
- if (option.cacheControl) {
182
- ctx.headers.set("Cache-Control", option.cacheControl);
183
- }
184
- if (option.headers) {
185
- for (const key in option.headers) {
186
- let value = option.headers?.[key];
187
- ctx.headers.set(key, value);
188
- }
189
- }
190
- return ctx.sendFile(r.file);
191
- });
192
- });
193
- return files;
194
- }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRateLimitDefaultStorage = createRateLimitDefaultStorage;
4
+ exports.isRateLimit = isRateLimit;
5
+ function createRateLimitDefaultStorage() {
6
+ const store = new Map();
7
+ return {
8
+ get: (key) => store.get(key),
9
+ set: (key, value) => store.set(key, value),
10
+ clearExpired: () => {
11
+ const now = Date.now();
12
+ for (const [key, entry] of store.entries()) {
13
+ if (now >= entry.resetTime) {
14
+ store.delete(key);
15
+ }
16
+ }
17
+ },
18
+ };
19
+ }
20
+ function isRateLimit(key, store, maxRequests, windowMs) {
21
+ store?.clearExpired();
22
+ const now = Date.now();
23
+ let entry = store.get(key) || { count: 0, resetTime: now + windowMs };
24
+ if (now < entry.resetTime) {
25
+ entry.count++;
26
+ if (entry.count > maxRequests) {
27
+ return {
28
+ check: true,
29
+ entry: entry,
30
+ };
31
+ }
32
+ }
33
+ else {
34
+ entry = { count: 1, resetTime: now + windowMs };
35
+ }
36
+ store.set(key, entry);
37
+ return {
38
+ check: false,
39
+ entry: entry,
40
+ };
41
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.notFoundResponse = void 0;
4
+ exports.handleErrorResponse = handleErrorResponse;
5
+ exports.toString = toString;
6
+ exports.determineContentTypeBody = determineContentTypeBody;
7
+ const config_js_1 = require("../core/config.js");
8
+ const error_js_1 = require("../core/error.js");
9
+ let notFoundResponse = (ctx) => {
10
+ const { method, pathname } = ctx;
11
+ return ctx.text(`${method}: '${pathname}' could not find\n`, {
12
+ status: 404,
13
+ });
14
+ };
15
+ exports.notFoundResponse = notFoundResponse;
16
+ async function handleErrorResponse(err = error_js_1.TezXError.internal(), ctx) {
17
+ if (err instanceof error_js_1.TezXError) {
18
+ config_js_1.GlobalConfig.debugging.error(err.details ?? err?.message);
19
+ return ctx
20
+ .status(err.statusCode ?? 500)
21
+ .send(err.details ?? err?.message ?? "Internal Server Error");
22
+ }
23
+ return await handleErrorResponse(error_js_1.TezXError.internal(), ctx);
24
+ }
25
+ function toString(input, values) {
26
+ if (typeof input === "string") {
27
+ return input;
28
+ }
29
+ let result = "";
30
+ for (let i = 0; i < input.length; i++) {
31
+ result += input[i];
32
+ if (i < values.length)
33
+ result += values[i];
34
+ }
35
+ return result;
36
+ }
37
+ function determineContentTypeBody(body) {
38
+ if (typeof body === "string" ||
39
+ typeof body === "number" ||
40
+ typeof body === "boolean") {
41
+ return { type: "text/plain; charset=utf-8", body: String(body) };
42
+ }
43
+ if (body instanceof Uint8Array || body instanceof ArrayBuffer) {
44
+ return { type: "application/octet-stream", body };
45
+ }
46
+ if (typeof Buffer !== "undefined" && Buffer.isBuffer(body)) {
47
+ return { type: "application/octet-stream", body };
48
+ }
49
+ if (typeof ReadableStream !== "undefined" && body instanceof ReadableStream) {
50
+ return { type: "application/octet-stream", body };
51
+ }
52
+ if (typeof Blob !== "undefined" && body instanceof Blob) {
53
+ return { type: body.type || "application/octet-stream", body };
54
+ }
55
+ if (typeof body === "object" && typeof body?.pipe === "function") {
56
+ return { type: "application/octet-stream", body };
57
+ }
58
+ if (typeof body === "object") {
59
+ return {
60
+ type: "application/json; charset=utf-8",
61
+ body: JSON.stringify(body),
62
+ };
63
+ }
64
+ return { type: "text/plain; charset=utf-8", body: String(body ?? "") };
65
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Environment = void 0;
3
+ exports.runtime = exports.Environment = void 0;
4
4
  class Environment {
5
5
  static get getEnvironment() {
6
6
  if (typeof Bun !== "undefined")
@@ -13,3 +13,4 @@ class Environment {
13
13
  }
14
14
  }
15
15
  exports.Environment = Environment;
16
+ exports.runtime = Environment.getEnvironment;
package/cjs/utils/url.js CHANGED
@@ -1,35 +1,70 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.wildcardOrOptionalParamRegex = void 0;
4
- exports.sanitizePathSplit = sanitizePathSplit;
5
- exports.urlParse = urlParse;
6
- function normalizePath(path) {
7
- return ("/" + path.replace(/\\/g, "").replace(/\/+/g, "/").replace(/^\/+/, ""));
8
- }
9
- function sanitizePathSplit(basePath, path) {
10
- const parts = `${basePath}/${path}`
11
- .replace(/\\/g, "")
12
- .replace(/\/+/g, "/")
13
- ?.split("/")
14
- .filter(Boolean);
15
- return parts;
3
+ exports.getPathname = void 0;
4
+ exports.queryParser = queryParser;
5
+ exports.url2query = url2query;
6
+ let getPathname = (url) => {
7
+ const len = url.length;
8
+ if (len === 0)
9
+ return "/";
10
+ const start = url.indexOf("/", url.charCodeAt(9) === 58 ? 13 : 8);
11
+ if (start === -1)
12
+ return "/";
13
+ let end = url.indexOf("?", start);
14
+ if (end === -1)
15
+ end = url.indexOf("#", start);
16
+ if (end === -1)
17
+ end = len;
18
+ return start === end ? "/" : url.slice(start, end);
19
+ };
20
+ exports.getPathname = getPathname;
21
+ function queryParser(qs) {
22
+ if (!qs?.length)
23
+ return {};
24
+ const startPos = qs.charCodeAt(0) === 63 ? 1 : 0;
25
+ const len = qs.length;
26
+ const query = {};
27
+ let keyStart = startPos, valStart = -1;
28
+ let i = startPos;
29
+ const reuseArray = [];
30
+ for (; i <= len; i++) {
31
+ const ch = i < len ? qs.charCodeAt(i) : 38;
32
+ if (ch === 61 && valStart === -1) {
33
+ valStart = i + 1;
34
+ }
35
+ else if (ch === 38 || i === len) {
36
+ const keyEnd = valStart === -1 ? i : valStart - 1;
37
+ const key = qs.slice(keyStart, keyEnd);
38
+ const val = valStart === -1 ? "" : qs.slice(valStart, i);
39
+ const existing = query[key];
40
+ if (existing !== undefined) {
41
+ if (Array.isArray(existing)) {
42
+ existing.push(val);
43
+ }
44
+ else {
45
+ reuseArray.length = 0;
46
+ reuseArray[0] = existing;
47
+ reuseArray[1] = val;
48
+ query[key] = reuseArray.slice();
49
+ }
50
+ }
51
+ else {
52
+ query[key] = val;
53
+ }
54
+ keyStart = i + 1;
55
+ valStart = -1;
56
+ }
57
+ }
58
+ return query;
16
59
  }
17
- exports.wildcardOrOptionalParamRegex = /\/\*|:[^/]+[?*]/;
18
- function urlParse(url) {
19
- let u = URL.parse(url);
20
- let query = {};
21
- if (u?.search) {
22
- new URLSearchParams(u?.search).forEach((value, key) => {
23
- query[key] = value;
24
- });
60
+ function url2query(url) {
61
+ let pathStart = url.indexOf("/", url.charCodeAt(9) === 58 ? 13 : 8);
62
+ if (pathStart === -1)
63
+ pathStart = url.length;
64
+ let queryStart = url.indexOf("?", pathStart);
65
+ if (queryStart === -1) {
66
+ return {};
25
67
  }
26
- return {
27
- pathname: u?.pathname,
28
- query: query,
29
- protocol: u?.protocol,
30
- origin: u?.origin,
31
- hostname: u?.hostname,
32
- href: url,
33
- port: u?.port,
34
- };
68
+ let qs = url.slice(queryStart + 1);
69
+ return queryParser(qs);
35
70
  }
package/core/config.d.ts CHANGED
@@ -1,13 +1,8 @@
1
- import { AdapterType, Callback, ctx } from "../types/index.js";
1
+ import { Runtime } from "../types/index.js";
2
2
  export declare let GlobalConfig: {
3
3
  new (): {};
4
- notFound: Callback;
5
- onError: <T extends Record<string, any> = {}>(err: string, ctx: ctx<T>) => Response;
6
- allowDuplicateMw?: boolean;
7
- overwriteMethod?: boolean;
8
4
  debugMode?: boolean;
9
- server: any;
10
- adapter: AdapterType;
5
+ adapter: Runtime;
11
6
  readonly debugging: {
12
7
  info: (msg: string, ...args: unknown[]) => void;
13
8
  warn: (msg: string, ...args: unknown[]) => void;
package/core/config.js CHANGED
@@ -1,18 +1,8 @@
1
1
  import { loggerOutput } from "../utils/debugging.js";
2
- import { Environment } from "./environment.js";
2
+ import { runtime } from "../utils/runtime.js";
3
3
  export let GlobalConfig = class {
4
- static notFound = (ctx) => {
5
- const { method, urlRef: { pathname }, } = ctx.req;
6
- return ctx.text(`${method}: '${pathname}' could not find\n`, 404);
7
- };
8
- static onError = (err, ctx) => {
9
- return ctx.text(err, 500);
10
- };
11
- static allowDuplicateMw = false;
12
- static overwriteMethod = true;
13
4
  static debugMode = false;
14
- static server;
15
- static adapter = Environment.getEnvironment;
5
+ static adapter = runtime;
16
6
  static get debugging() {
17
7
  return this.debugMode
18
8
  ? {