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
@@ -14,55 +14,17 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.detectBot = void 0;
18
- const basicAuth_js_1 = require("./basicAuth.js");
19
- const cacheControl_js_1 = require("./cacheControl.js");
20
- const cors_js_1 = require("./cors.js");
21
- const detectBot_js_1 = require("./detectBot.js");
22
- const detectLocale_js_1 = require("./detectLocale.js");
23
- const i18n_js_1 = require("./i18n.js");
24
- const lazyLoadModules_js_1 = require("./lazyLoadModules.js");
25
- const logger_js_1 = require("./logger.js");
26
- const pagination_js_1 = require("./pagination.js");
27
- const powered_by_js_1 = require("./powered-by.js");
28
- const rateLimiter_js_1 = require("./rateLimiter.js");
29
- const request_id_js_1 = require("./request-id.js");
30
- const requestTimeout_js_1 = require("./requestTimeout.js");
31
- const sanitizeHeader_js_1 = require("./sanitizeHeader.js");
32
- const secureHeaders_js_1 = require("./secureHeaders.js");
33
- const xssProtection_js_1 = require("./xssProtection.js");
34
- __exportStar(require("./basicAuth.js"), exports);
35
- __exportStar(require("./cacheControl.js"), exports);
17
+ __exportStar(require("./basic-auth.js"), exports);
18
+ __exportStar(require("./bearer-auth.js"), exports);
19
+ __exportStar(require("./cache-control.js"), exports);
36
20
  __exportStar(require("./cors.js"), exports);
37
- var detectBot_js_2 = require("./detectBot.js");
38
- Object.defineProperty(exports, "detectBot", { enumerable: true, get: function () { return detectBot_js_2.detectBot; } });
39
- __exportStar(require("./detectLocale.js"), exports);
21
+ __exportStar(require("./detect-bot.js"), exports);
40
22
  __exportStar(require("./i18n.js"), exports);
41
- __exportStar(require("./lazyLoadModules.js"), exports);
42
23
  __exportStar(require("./logger.js"), exports);
43
24
  __exportStar(require("./pagination.js"), exports);
44
25
  __exportStar(require("./powered-by.js"), exports);
45
- __exportStar(require("./rateLimiter.js"), exports);
26
+ __exportStar(require("./rate-limiter.js"), exports);
46
27
  __exportStar(require("./request-id.js"), exports);
47
- __exportStar(require("./requestTimeout.js"), exports);
48
- __exportStar(require("./sanitizeHeader.js"), exports);
49
- __exportStar(require("./secureHeaders.js"), exports);
50
- __exportStar(require("./xssProtection.js"), exports);
51
- exports.default = {
52
- basicAuth: basicAuth_js_1.basicAuth,
53
- cacheControl: cacheControl_js_1.cacheControl,
54
- cors: cors_js_1.cors,
55
- detectBot: detectBot_js_1.detectBot,
56
- detectLocale: detectLocale_js_1.detectLocale,
57
- i18n: i18n_js_1.i18n,
58
- lazyLoadModules: lazyLoadModules_js_1.lazyLoadModules,
59
- logger: logger_js_1.logger,
60
- paginationHandler: pagination_js_1.paginationHandler,
61
- poweredBy: powered_by_js_1.poweredBy,
62
- rateLimiter: rateLimiter_js_1.rateLimiter,
63
- requestID: request_id_js_1.requestID,
64
- requestTimeout: requestTimeout_js_1.requestTimeout,
65
- sanitizeHeaders: sanitizeHeader_js_1.sanitizeHeaders,
66
- secureHeaders: secureHeaders_js_1.secureHeaders,
67
- xssProtection: xssProtection_js_1.xssProtection,
68
- };
28
+ __exportStar(require("./sanitize-headers.js"), exports);
29
+ __exportStar(require("./secure-headers.js"), exports);
30
+ __exportStar(require("./xss-protection.js"), exports);
@@ -1,21 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = logger;
3
4
  exports.logger = logger;
5
+ const error_js_1 = require("../core/error.js");
4
6
  const colors_js_1 = require("../utils/colors.js");
5
- function logger() {
7
+ function logger(options = { enabled: true }) {
6
8
  return async function logger(ctx, next) {
7
9
  try {
10
+ if (!options?.enabled) {
11
+ return next();
12
+ }
8
13
  console.log(`${(0, colors_js_1.colorText)("<--", "bold")} ${(0, colors_js_1.colorText)(ctx.method, "bgMagenta")} ${ctx.pathname}`);
9
14
  const startTime = performance.now();
10
- let n = await next();
15
+ let n = (await next());
11
16
  const elapsed = performance.now() - startTime;
12
17
  console.log(`${(0, colors_js_1.colorText)("-->", "bold")} ${(0, colors_js_1.colorText)(ctx.method, "bgBlue")} ${ctx.pathname} ` +
13
- `${(0, colors_js_1.colorText)(ctx.getStatus, "yellow")} ${(0, colors_js_1.colorText)(`${elapsed.toFixed(2)}ms`, "magenta")}`);
18
+ `${(0, colors_js_1.colorText)(n ? ctx.getStatus : 404, "yellow")} ${(0, colors_js_1.colorText)(`${elapsed.toFixed(2)}ms`, "magenta")}`);
14
19
  return n;
15
20
  }
16
21
  catch (err) {
17
22
  console.error(`${(0, colors_js_1.colorText)("Error:", "red")}`, err.stack);
18
- throw new Error(err.stack);
23
+ throw new error_js_1.TezXError(err.stack);
19
24
  }
20
25
  };
21
26
  }
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.paginationHandler = void 0;
3
+ exports.default = exports.paginationHandler = void 0;
4
4
  const paginationHandler = (options = {}) => {
5
- const { defaultPage = 1, defaultLimit = 10, maxLimit = 100, queryKeyPage = "page", queryKeyLimit = "limit", countKey = "total", dataKey = "data", getDataSource, } = options;
5
+ let { defaultPage = 1, defaultLimit = 10, maxLimit = 100, queryKeyPage = "page", queryKeyLimit = "limit", countKey = "total", dataKey = "data", getDataSource, } = options;
6
6
  return async function paginationHandler(ctx, next) {
7
7
  const rawPage = ctx.req.query[queryKeyPage];
8
8
  const rawLimit = ctx.req.query[queryKeyLimit];
@@ -51,3 +51,4 @@ const paginationHandler = (options = {}) => {
51
51
  };
52
52
  };
53
53
  exports.paginationHandler = paginationHandler;
54
+ exports.default = paginationHandler;
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.poweredBy = void 0;
3
+ exports.default = exports.poweredBy = void 0;
4
4
  const poweredBy = (serverName) => {
5
5
  return function poweredBy(ctx, next) {
6
- ctx.header("X-Powered-By", serverName || "TezX");
6
+ ctx.headers.set("x-powered-by", serverName || "TezX");
7
7
  return next();
8
8
  };
9
9
  };
10
10
  exports.poweredBy = poweredBy;
11
+ exports.default = poweredBy;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = exports.rateLimiter = void 0;
4
+ const error_js_1 = require("../core/error.js");
5
+ const rateLimit_js_1 = require("../utils/rateLimit.js");
6
+ const rateLimiter = (options) => {
7
+ const { maxRequests, windowMs, keyGenerator = (ctx) => {
8
+ const xForwardedFor = ctx.req.header("x-forwarded-for");
9
+ if (xForwardedFor) {
10
+ const ip = xForwardedFor.split(",")[0].trim();
11
+ return ip;
12
+ }
13
+ const clientIp = ctx.req.header("client-ip");
14
+ if (clientIp)
15
+ return clientIp;
16
+ const addr = ctx.req.remoteAddress?.address || "unknown";
17
+ const port = ctx.req.remoteAddress?.port || "0";
18
+ return `${addr}:${port}`;
19
+ }, storage = (0, rateLimit_js_1.createRateLimitDefaultStorage)(), onError = (ctx, retryAfter, error) => {
20
+ ctx.setStatus = 429;
21
+ throw new error_js_1.TezXError(`Rate limit exceeded. Try again in ${retryAfter} seconds.`, 429);
22
+ }, } = options;
23
+ return async function rateLimiter(ctx, next) {
24
+ const key = keyGenerator(ctx);
25
+ const { check, entry } = (0, rateLimit_js_1.isRateLimit)(key, storage, maxRequests, windowMs);
26
+ if (check) {
27
+ const retryAfter = Math.ceil((entry.resetTime - Date.now()) / 1000);
28
+ ctx.headers.set("Retry-After", retryAfter.toString());
29
+ return onError(ctx, retryAfter, new error_js_1.TezXError(`Rate limit exceeded. Retry after ${retryAfter} seconds.`));
30
+ }
31
+ ctx.headers.set("X-RateLimit-Limit", maxRequests.toString());
32
+ ctx.headers.set("X-RateLimit-Remaining", (maxRequests - entry.count).toString());
33
+ ctx.headers.set("X-RateLimit-Reset", entry.resetTime.toString());
34
+ return await next();
35
+ };
36
+ };
37
+ exports.rateLimiter = rateLimiter;
38
+ exports.default = rateLimiter;
@@ -1,15 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.requestID = void 0;
3
+ exports.requestID = exports.default = void 0;
4
4
  const index_js_1 = require("../helper/index.js");
5
5
  const requestID = (headerName = "X-Request-ID", contextKey = "requestID") => {
6
6
  return function requestID(ctx, next) {
7
- const existingID = ctx.headers?.get(headerName.toLowerCase()) ||
8
- ctx.headers?.get(headerName);
9
- const requestId = existingID || `req-${(0, index_js_1.generateID)()}`;
7
+ let requestId = ctx.headers.get(headerName) ?? `req-${(0, index_js_1.generateUUID)()}`;
10
8
  ctx[contextKey] = requestId;
11
- ctx.header(headerName, requestId);
9
+ ctx.headers.set(headerName, requestId);
12
10
  return next();
13
11
  };
14
12
  };
13
+ exports.default = requestID;
15
14
  exports.requestID = requestID;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeHeaders = exports.default = void 0;
4
+ const sanitizeHeaders = (options = {}) => {
5
+ const { whitelist = [], blacklist = [] } = options;
6
+ const normalizedWhitelist = whitelist.map((h) => h.toLowerCase());
7
+ const normalizedBlacklist = blacklist.map((h) => h.toLowerCase());
8
+ let lWhite = normalizedWhitelist.length;
9
+ return async function sanitizeHeaders(ctx, next) {
10
+ await next();
11
+ for (const key of ctx.headers.keys()) {
12
+ if (lWhite > 0 && !normalizedWhitelist.includes(key)) {
13
+ ctx.headers.delete(key);
14
+ }
15
+ if (normalizedBlacklist.includes(key)) {
16
+ ctx.headers.delete(key);
17
+ }
18
+ }
19
+ };
20
+ };
21
+ exports.default = sanitizeHeaders;
22
+ exports.sanitizeHeaders = sanitizeHeaders;
@@ -0,0 +1,143 @@
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.secureHeaders = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const joinSrc = (v) => typeof v === "string" ? v : v.join(" ");
9
+ const buildCSPString = (cspObj) => {
10
+ const parts = [];
11
+ for (const key in cspObj) {
12
+ parts.push(`${key} ${joinSrc(cspObj[key])}`);
13
+ }
14
+ return parts.join("; ");
15
+ };
16
+ const defaultPresets = {
17
+ strict: {
18
+ preset: "strict",
19
+ hsts: true,
20
+ hstsMaxAge: 63072000,
21
+ frameGuard: "DENY",
22
+ noSniff: true,
23
+ xssProtection: true,
24
+ referrerPolicy: "strict-origin-when-cross-origin",
25
+ permissionsPolicy: "geolocation=(), microphone=(), camera=(), usb=()",
26
+ csp: {
27
+ "default-src": ["'self'"],
28
+ "script-src": ["'self'"],
29
+ "style-src": ["'self'", "'unsafe-inline'"],
30
+ "img-src": ["'self'", "data:", "blob:"],
31
+ "font-src": ["'self'"],
32
+ "connect-src": ["'self'"],
33
+ "object-src": ["'none'"],
34
+ "frame-ancestors": ["'none'"],
35
+ },
36
+ cspReportOnly: false,
37
+ },
38
+ balanced: {
39
+ preset: "balanced",
40
+ hsts: true,
41
+ hstsMaxAge: 31536000,
42
+ frameGuard: "SAMEORIGIN",
43
+ noSniff: true,
44
+ xssProtection: true,
45
+ referrerPolicy: "no-referrer-when-downgrade",
46
+ permissionsPolicy: "geolocation=(), microphone=()",
47
+ csp: {
48
+ "default-src": ["'self'"],
49
+ "script-src": ["'self'", "https://cdn.jsdelivr.net"],
50
+ "style-src": [
51
+ "'self'",
52
+ "'unsafe-inline'",
53
+ "https://fonts.googleapis.com",
54
+ ],
55
+ "img-src": ["'self'", "data:", "https://images.example.com"],
56
+ "connect-src": ["'self'", "https://api.example.com"],
57
+ },
58
+ cspReportOnly: true,
59
+ },
60
+ dev: {
61
+ preset: "dev",
62
+ hsts: false,
63
+ frameGuard: "SAMEORIGIN",
64
+ noSniff: false,
65
+ xssProtection: false,
66
+ referrerPolicy: "no-referrer",
67
+ permissionsPolicy: "",
68
+ csp: {
69
+ "default-src": [
70
+ "'self'",
71
+ "'unsafe-inline'",
72
+ "'unsafe-eval'",
73
+ "http://localhost:3000",
74
+ ],
75
+ "img-src": ["'self'", "data:", "blob:"],
76
+ },
77
+ cspReportOnly: true,
78
+ },
79
+ };
80
+ const setHeader = (ctx, name, value) => {
81
+ if (typeof ctx.setHeader === "function")
82
+ ctx.setHeader(name, value);
83
+ else if (ctx.response?.setHeader)
84
+ ctx.response.setHeader(name, value);
85
+ else if (ctx.headersOut)
86
+ ctx.headersOut[name] = value;
87
+ };
88
+ const secureHeaders = (userOpts = {}) => {
89
+ const preset = userOpts.preset ?? "balanced";
90
+ const base = {
91
+ ...(defaultPresets[preset] || defaultPresets.balanced),
92
+ ...userOpts,
93
+ };
94
+ const hstsHeader = base.hsts
95
+ ? `max-age=${base.hstsMaxAge || 31536000}; includeSubDomains; preload`
96
+ : "";
97
+ const frameHeader = base.frameGuard || "SAMEORIGIN";
98
+ const noSniffHeader = base.noSniff ? "nosniff" : "";
99
+ const xssHeader = base.xssProtection ? "1; mode=block" : "0";
100
+ const referrerHeader = base.referrerPolicy || "no-referrer";
101
+ const permissionsHeader = base.permissionsPolicy || "";
102
+ let cspStatic = null;
103
+ let cspNeedsNonce = !!base.cspUseNonce;
104
+ if (typeof base.csp === "string")
105
+ cspStatic = base.csp;
106
+ else if (base.csp && typeof base.csp === "object")
107
+ cspStatic = buildCSPString(base.csp);
108
+ if (base.ultraFastMode)
109
+ cspNeedsNonce = false;
110
+ const cspReportOnly = !!base.cspReportOnly;
111
+ return async (ctx, next) => {
112
+ try {
113
+ if (base.hsts)
114
+ setHeader(ctx, "Strict-Transport-Security", hstsHeader);
115
+ setHeader(ctx, "X-Frame-Options", frameHeader);
116
+ setHeader(ctx, "X-Content-Type-Options", noSniffHeader);
117
+ setHeader(ctx, "X-XSS-Protection", xssHeader);
118
+ setHeader(ctx, "Referrer-Policy", referrerHeader);
119
+ if (permissionsHeader)
120
+ setHeader(ctx, "Permissions-Policy", permissionsHeader);
121
+ if (cspNeedsNonce) {
122
+ const nonce = crypto_1.default.randomBytes(12).toString("base64");
123
+ let cspHeader = cspStatic || `default-src 'self'; script-src 'self' 'nonce-${nonce}'`;
124
+ if (cspReportOnly)
125
+ setHeader(ctx, "Content-Security-Policy-Report-Only", cspHeader);
126
+ else
127
+ setHeader(ctx, "Content-Security-Policy", cspHeader);
128
+ ctx.cspNonce = nonce;
129
+ }
130
+ else if (cspStatic) {
131
+ if (cspReportOnly)
132
+ setHeader(ctx, "Content-Security-Policy-Report-Only", cspStatic);
133
+ else
134
+ setHeader(ctx, "Content-Security-Policy", cspStatic);
135
+ }
136
+ return await next();
137
+ }
138
+ catch {
139
+ return await next();
140
+ }
141
+ };
142
+ };
143
+ exports.secureHeaders = secureHeaders;
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.secureHeaders = void 0;
4
+ const index_js_1 = require("../helper/index.js");
5
+ const joinSrc = (v) => typeof v === "string" ? v : v.join(" ");
6
+ const buildCSPString = (cspObj) => {
7
+ const parts = [];
8
+ for (const key in cspObj)
9
+ parts.push(`${key} ${joinSrc(cspObj[key])}`);
10
+ return parts.join("; ");
11
+ };
12
+ const secureHeaders = (userOpts = {}) => {
13
+ const defaultPresets = {
14
+ strict: {
15
+ preset: "strict",
16
+ hsts: { maxAge: 63072000, includeSubDomains: true, preload: true },
17
+ frameGuard: "DENY",
18
+ noSniff: true,
19
+ xssProtection: true,
20
+ referrerPolicy: "strict-origin-when-cross-origin",
21
+ permissionsPolicy: "geolocation=(), microphone=(), camera=(), usb=()",
22
+ csp: {
23
+ "default-src": ["'self'"],
24
+ "script-src": ["'self'"],
25
+ "style-src": ["'self'", "'unsafe-inline'"],
26
+ "img-src": ["'self'", "data:", "blob:"],
27
+ "font-src": ["'self'"],
28
+ "connect-src": ["'self'"],
29
+ "object-src": ["'none'"],
30
+ "frame-ancestors": ["'none'"],
31
+ },
32
+ cspReportOnly: false,
33
+ },
34
+ balanced: {
35
+ preset: "balanced",
36
+ hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
37
+ frameGuard: "SAMEORIGIN",
38
+ noSniff: true,
39
+ xssProtection: true,
40
+ referrerPolicy: "no-referrer-when-downgrade",
41
+ permissionsPolicy: "geolocation=(), microphone=()",
42
+ csp: {
43
+ "default-src": ["'self'"],
44
+ "script-src": ["'self'", "https://cdn.jsdelivr.net"],
45
+ "style-src": [
46
+ "'self'",
47
+ "'unsafe-inline'",
48
+ "https://fonts.googleapis.com",
49
+ ],
50
+ "img-src": ["'self'", "data:", "https://images.example.com"],
51
+ "connect-src": ["'self'", "https://api.example.com"],
52
+ },
53
+ cspReportOnly: true,
54
+ },
55
+ dev: {
56
+ preset: "dev",
57
+ hsts: undefined,
58
+ frameGuard: "SAMEORIGIN",
59
+ noSniff: false,
60
+ xssProtection: false,
61
+ referrerPolicy: "no-referrer",
62
+ permissionsPolicy: "",
63
+ csp: {
64
+ "default-src": [
65
+ "'self'",
66
+ "'unsafe-inline'",
67
+ "'unsafe-eval'",
68
+ "http://localhost:3000",
69
+ ],
70
+ "img-src": ["'self'", "data:", "blob:"],
71
+ },
72
+ cspReportOnly: true,
73
+ },
74
+ };
75
+ const preset = userOpts.preset ?? "balanced";
76
+ const base = {
77
+ ...(defaultPresets[preset] || defaultPresets.balanced),
78
+ ...userOpts,
79
+ };
80
+ const frameHeader = base.frameGuard || "SAMEORIGIN";
81
+ const xssHeader = base.xssProtection ? "1; mode=block" : "0";
82
+ const noSniffHeader = base.noSniff ? "nosniff" : "";
83
+ const permissionsHeader = base.permissionsPolicy || "";
84
+ const referrerHeader = base.referrerPolicy || "no-referrer";
85
+ const hstsParts = [`max-age=${base.hsts?.maxAge || 31536000}`];
86
+ if (base.hsts?.includeSubDomains)
87
+ hstsParts.push("includeSubDomains");
88
+ if (base.hsts?.preload)
89
+ hstsParts.push("preload");
90
+ const hstsHeader = hstsParts.join("; ");
91
+ let cspStatic = null;
92
+ let cspNeedsNonce = !!base.cspUseNonce;
93
+ if (typeof base.csp === "string")
94
+ cspStatic = base.csp;
95
+ else if (base.csp)
96
+ cspStatic = buildCSPString(base.csp);
97
+ const cspReportOnly = !!base.cspReportOnly;
98
+ const ultraFast = !!base.ultraFastMode;
99
+ if (cspNeedsNonce && ultraFast) {
100
+ index_js_1.GlobalConfig.debugging.warn("secureHeaders: ultraFastMode disables CSP nonce support. Nonce will not be used.");
101
+ }
102
+ if (ultraFast)
103
+ cspNeedsNonce = false;
104
+ return async (ctx, next) => {
105
+ try {
106
+ if (base.hsts) {
107
+ const proto = (ctx.req?.header("x-forwarded-proto") || "").toString();
108
+ if (!base.hsts.hstsOnlyOnHttps || proto.includes("https")) {
109
+ ctx.headers.set("Strict-Transport-Security", hstsHeader);
110
+ }
111
+ }
112
+ ctx.headers.set("X-Frame-Options", frameHeader);
113
+ ctx.headers.set("X-Content-Type-Options", noSniffHeader);
114
+ ctx.headers.set("X-XSS-Protection", xssHeader);
115
+ ctx.headers.set("Referrer-Policy", referrerHeader);
116
+ if (permissionsHeader)
117
+ ctx.headers.set("Permissions-Policy", permissionsHeader);
118
+ if (cspNeedsNonce) {
119
+ const nonce = (0, index_js_1.generateRandomBase64)();
120
+ let cspHeader = cspStatic;
121
+ if (!cspHeader) {
122
+ cspHeader = `default-src 'self'; script-src 'self' 'nonce-${nonce}'`;
123
+ }
124
+ if (typeof base.csp === "object") {
125
+ const idx = cspHeader.indexOf("script-src");
126
+ if (idx >= 0) {
127
+ const parts = [];
128
+ parts.push(cspHeader.slice(0, idx + 10));
129
+ parts.push(" 'nonce-" + nonce + "'");
130
+ parts.push(cspHeader.slice(idx + 10));
131
+ cspHeader = parts.join("");
132
+ }
133
+ else {
134
+ cspHeader += "; script-src 'self' 'nonce-" + nonce + "'";
135
+ }
136
+ }
137
+ ctx.cspNonce = nonce;
138
+ if (cspReportOnly)
139
+ ctx.headers.set("Content-Security-Policy-Report-Only", cspHeader);
140
+ else
141
+ ctx.headers.set("Content-Security-Policy", cspHeader);
142
+ }
143
+ else if (cspStatic) {
144
+ if (cspReportOnly)
145
+ ctx.headers.set("Content-Security-Policy-Report-Only", cspStatic);
146
+ else
147
+ ctx.headers.set("Content-Security-Policy", cspStatic);
148
+ }
149
+ return await next();
150
+ }
151
+ catch (err) {
152
+ console.error("secureHeaders middleware error", err);
153
+ return await next();
154
+ }
155
+ };
156
+ };
157
+ exports.secureHeaders = secureHeaders;
@@ -1,26 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.xssProtection = void 0;
4
- const config_js_1 = require("../core/config.js");
3
+ exports.xssProtection = exports.default = void 0;
5
4
  const xssProtection = (options = {}) => {
6
5
  const { enabled = true, mode = "block", fallbackCSP = "default-src 'self'; script-src 'self';", } = options;
7
6
  return async function xssProtection(ctx, next) {
8
7
  const isEnabled = typeof enabled === "function" ? enabled(ctx) : enabled;
9
8
  if (!isEnabled) {
10
- config_js_1.GlobalConfig.debugging.warn("🟠 XSS protection is disabled.");
11
9
  return await next();
12
10
  }
13
11
  const xssHeaderValue = mode === "block" ? "1; mode=block" : "1";
14
- ctx.headers.set("X-XSS-Protection", xssHeaderValue);
15
- config_js_1.GlobalConfig.debugging.warn(`🟢 X-XSS-Protection set to: ${xssHeaderValue}`);
12
+ ctx.setHeader("X-XSS-Protection", xssHeaderValue);
16
13
  if (fallbackCSP) {
17
- const existingCSP = ctx.req.headers.get("Content-Security-Policy");
14
+ const existingCSP = ctx.req.header("content-security-policy");
18
15
  if (!existingCSP) {
19
- ctx.headers.set("Content-Security-Policy", fallbackCSP);
20
- config_js_1.GlobalConfig.debugging.warn(`🟣 Fallback CSP set to: ${fallbackCSP}`);
16
+ ctx.setHeader("Content-Security-Policy", fallbackCSP);
21
17
  }
22
18
  }
23
19
  return await next();
24
20
  };
25
21
  };
22
+ exports.default = xssProtection;
26
23
  exports.xssProtection = xssProtection;
package/cjs/node/env.js CHANGED
@@ -1,21 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.loadEnv = loadEnv;
4
- const node_fs_1 = require("node:fs");
5
- const environment_js_1 = require("../core/environment.js");
4
+ const fs_1 = require("fs");
5
+ const error_js_1 = require("../core/error.js");
6
6
  const colors_js_1 = require("../utils/colors.js");
7
+ const runtime_js_1 = require("../utils/runtime.js");
7
8
  function parseEnvFile(filePath, result) {
8
9
  try {
9
- let runtime = environment_js_1.Environment.getEnvironment;
10
- if (runtime !== "bun" && runtime !== "node") {
11
- throw new Error(`Please use ${(0, colors_js_1.colorText)(`import {loadEnv} from "tezx/${runtime}"`, "bgRed")} environment`);
10
+ if (runtime_js_1.runtime !== "bun" && runtime_js_1.runtime !== "node") {
11
+ throw new error_js_1.TezXError(`Please use ${(0, colors_js_1.colorText)(`import {loadEnv} from "tezx/${runtime_js_1.runtime}"`, "bgRed")} environment`);
12
12
  }
13
- let fileExists = (0, node_fs_1.existsSync)(filePath);
13
+ let fileExists = (0, fs_1.existsSync)(filePath);
14
14
  if (!fileExists) {
15
15
  return;
16
16
  }
17
17
  let fileContent = "";
18
- fileContent = (0, node_fs_1.readFileSync)(filePath, "utf8");
18
+ fileContent = (0, fs_1.readFileSync)(filePath, "utf8");
19
19
  const lines = fileContent.split("\n");
20
20
  for (const line of lines) {
21
21
  const trimmedLine = line.trim();
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConnInfo = getConnInfo;
4
+ function getConnInfo() {
5
+ return (ctx, next) => {
6
+ let request = ctx.args?.[0];
7
+ if (request && request.socket) {
8
+ ctx.req.remoteAddress = {
9
+ family: request.socket.remoteFamily,
10
+ address: request.socket.remoteAddress,
11
+ port: request.socket.remotePort,
12
+ };
13
+ }
14
+ return next();
15
+ };
16
+ }
package/cjs/node/index.js CHANGED
@@ -1,24 +1,23 @@
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 adapter_js_1 = require("./adapter.js");
3
+ exports.mountTezXOnNode = exports.loadEnv = exports.toWebRequest = exports.getConnInfo = exports.upgradeWebSocket = exports.serveStatic = void 0;
18
4
  const env_js_1 = require("./env.js");
19
- __exportStar(require("./adapter.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 mount_node_js_1 = require("./mount-node.js");
9
+ Object.defineProperty(exports, "mountTezXOnNode", { enumerable: true, get: function () { return mount_node_js_1.mountTezXOnNode; } });
10
+ const serveStatic_js_1 = require("./serveStatic.js");
11
+ Object.defineProperty(exports, "serveStatic", { enumerable: true, get: function () { return serveStatic_js_1.serveStatic; } });
12
+ const toWebRequest_js_1 = require("./toWebRequest.js");
13
+ Object.defineProperty(exports, "toWebRequest", { enumerable: true, get: function () { return toWebRequest_js_1.toWebRequest; } });
14
+ const ws_js_1 = require("./ws.js");
15
+ Object.defineProperty(exports, "upgradeWebSocket", { enumerable: true, get: function () { return ws_js_1.upgradeWebSocket; } });
21
16
  exports.default = {
22
- nodeAdapter: adapter_js_1.nodeAdapter,
17
+ serveStatic: serveStatic_js_1.serveStatic,
18
+ upgradeWebSocket: ws_js_1.upgradeWebSocket,
19
+ mountTezXOnNode: mount_node_js_1.mountTezXOnNode,
20
+ toWebRequest: toWebRequest_js_1.toWebRequest,
21
+ getConnInfo: getConnInfo_js_1.getConnInfo,
23
22
  loadEnv: env_js_1.loadEnv,
24
23
  };