azurajs 3.0.1 → 3.0.2

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 (106) hide show
  1. package/dist/config/index.js +128 -6
  2. package/dist/config/index.js.map +1 -1
  3. package/dist/config/index.mjs +130 -1
  4. package/dist/config/index.mjs.map +1 -1
  5. package/dist/core/index.js +1100 -11
  6. package/dist/core/index.js.map +1 -1
  7. package/dist/core/index.mjs +1102 -3
  8. package/dist/core/index.mjs.map +1 -1
  9. package/dist/decorators/index.js +117 -87
  10. package/dist/decorators/index.js.map +1 -1
  11. package/dist/decorators/index.mjs +98 -1
  12. package/dist/decorators/index.mjs.map +1 -1
  13. package/dist/index.js +2592 -236
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +2537 -9
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/middleware/index.js +16 -7
  18. package/dist/middleware/index.js.map +1 -1
  19. package/dist/middleware/index.mjs +17 -1
  20. package/dist/middleware/index.mjs.map +1 -1
  21. package/dist/plugins/index.js +1056 -73
  22. package/dist/plugins/index.js.map +1 -1
  23. package/dist/plugins/index.mjs +1042 -1
  24. package/dist/plugins/index.mjs.map +1 -1
  25. package/dist/types/index.js +49 -12
  26. package/dist/types/index.js.map +1 -1
  27. package/dist/types/index.mjs +49 -2
  28. package/dist/types/index.mjs.map +1 -1
  29. package/dist/utils/index.js +551 -50
  30. package/dist/utils/index.js.map +1 -1
  31. package/dist/utils/index.mjs +541 -3
  32. package/dist/utils/index.mjs.map +1 -1
  33. package/package.json +35 -17
  34. package/{dist/chunk-DR254CWJ.mjs → src/config/ConfigModule.ts} +169 -132
  35. package/src/config/index.ts +1 -0
  36. package/src/core/index.ts +2 -0
  37. package/src/core/router.ts +284 -0
  38. package/{dist/chunk-EYAHUNC7.mjs → src/core/server.ts} +590 -699
  39. package/src/decorators/Route.ts +110 -0
  40. package/src/decorators/index.ts +23 -0
  41. package/src/index.ts +12 -0
  42. package/src/middleware/LoggingMiddleware.ts +20 -0
  43. package/src/middleware/index.ts +1 -0
  44. package/src/plugins/CORSPlugin.ts +56 -0
  45. package/src/plugins/CircuitBreakerPlugin.ts +84 -0
  46. package/src/plugins/CompressionPlugin.ts +80 -0
  47. package/src/plugins/ETagPlugin.ts +31 -0
  48. package/src/plugins/HealthCheckPlugin.ts +57 -0
  49. package/src/plugins/HelmetPlugin.ts +89 -0
  50. package/src/plugins/JWTPlugin.ts +132 -0
  51. package/src/plugins/MultipartPlugin.ts +168 -0
  52. package/src/plugins/ProxyPlugin.ts +89 -0
  53. package/src/plugins/RateLimitPlugin.ts +96 -0
  54. package/src/plugins/RequestIdPlugin.ts +21 -0
  55. package/src/plugins/SSEPlugin.ts +114 -0
  56. package/src/plugins/SessionPlugin.ts +98 -0
  57. package/src/plugins/StaticPlugin.ts +152 -0
  58. package/src/plugins/TimeoutPlugin.ts +33 -0
  59. package/src/plugins/index.ts +18 -0
  60. package/src/types/common.type.ts +82 -0
  61. package/src/types/config.type.ts +57 -0
  62. package/{dist/chunk-OWUGAI5V.mjs → src/types/http/status.ts} +49 -51
  63. package/src/types/index.ts +55 -0
  64. package/src/types/plugins/plugin.type.ts +170 -0
  65. package/src/types/reflect.d.ts +14 -0
  66. package/src/types/routes.type.ts +70 -0
  67. package/src/utils/HttpError.ts +62 -0
  68. package/src/utils/IpResolver.ts +30 -0
  69. package/src/utils/Logger.ts +144 -0
  70. package/src/utils/Parser.ts +182 -0
  71. package/src/utils/cookies/CookieManager.ts +48 -0
  72. package/src/utils/index.ts +9 -0
  73. package/{dist/chunk-UWIFSGSQ.mjs → src/utils/validators/DTOValidator.ts} +145 -141
  74. package/src/utils/validators/SchemaValidator.ts +45 -0
  75. package/dist/chunk-3UFAWS2V.js +0 -392
  76. package/dist/chunk-3UFAWS2V.js.map +0 -1
  77. package/dist/chunk-4LSFAAZW.js +0 -4
  78. package/dist/chunk-4LSFAAZW.js.map +0 -1
  79. package/dist/chunk-7NSRIVZM.js +0 -54
  80. package/dist/chunk-7NSRIVZM.js.map +0 -1
  81. package/dist/chunk-AOG6NYAM.js +0 -144
  82. package/dist/chunk-AOG6NYAM.js.map +0 -1
  83. package/dist/chunk-DR254CWJ.mjs.map +0 -1
  84. package/dist/chunk-EYAHUNC7.mjs.map +0 -1
  85. package/dist/chunk-HHDQPIJN.mjs +0 -19
  86. package/dist/chunk-HHDQPIJN.mjs.map +0 -1
  87. package/dist/chunk-HHZNAGGI.js +0 -702
  88. package/dist/chunk-HHZNAGGI.js.map +0 -1
  89. package/dist/chunk-KJM5XCAY.js +0 -21
  90. package/dist/chunk-KJM5XCAY.js.map +0 -1
  91. package/dist/chunk-NLSZKAPA.mjs +0 -1044
  92. package/dist/chunk-NLSZKAPA.mjs.map +0 -1
  93. package/dist/chunk-OWUGAI5V.mjs.map +0 -1
  94. package/dist/chunk-POPNQEOK.js +0 -1063
  95. package/dist/chunk-POPNQEOK.js.map +0 -1
  96. package/dist/chunk-QPRW4YU4.js +0 -134
  97. package/dist/chunk-QPRW4YU4.js.map +0 -1
  98. package/dist/chunk-REJDZUZ5.mjs +0 -382
  99. package/dist/chunk-REJDZUZ5.mjs.map +0 -1
  100. package/dist/chunk-TC6N6TJZ.mjs +0 -100
  101. package/dist/chunk-TC6N6TJZ.mjs.map +0 -1
  102. package/dist/chunk-TEUXKMXP.js +0 -122
  103. package/dist/chunk-TEUXKMXP.js.map +0 -1
  104. package/dist/chunk-UWIFSGSQ.mjs.map +0 -1
  105. package/dist/chunk-YPBKY4KY.mjs +0 -3
  106. package/dist/chunk-YPBKY4KY.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
1
+ {"version":3,"sources":["../../src/utils/Logger.ts","../../src/types/http/status.ts","../../src/utils/HttpError.ts","../../src/utils/IpResolver.ts","../../src/utils/Parser.ts","../../src/utils/cookies/CookieManager.ts","../../src/utils/validators/DTOValidator.ts","../../src/utils/validators/SchemaValidator.ts"],"names":[],"mappings":";AAEA,IAAM,cAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,MAAA,GAAS;AAAA,EACb,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,KAAA,EAAO,UAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAS,UAAA;AAAA,EACT,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,UAAA;AAAA,EACP,IAAA,EAAM,UAKR,CAAA;AAEA,IAAM,aAAA,GAAwC;AAAA,EAC5C,KAAK,MAAA,CAAO,KAAA;AAAA,EACZ,MAAM,MAAA,CAAO,IAAA;AAAA,EACb,KAAK,MAAA,CAAO,MAAA;AAAA,EACZ,QAAQ,MAAA,CAAO,GAAA;AAAA,EACf,OAAO,MAAA,CAAO,OAAA;AAAA,EACd,MAAM,MAAA,CAAO,IAAA;AAAA,EACb,SAAS,MAAA,CAAO;AAClB,CAAA;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,IAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,KAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,IAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,GAAA,EAAK,OAAO,MAAA,CAAO,MAAA;AAC9B,EAAA,OAAO,MAAA,CAAO,GAAA;AAChB;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,EAAE,CAAA,GAAI,GAAA;AACxB,EAAA,IAAI,KAAK,GAAA,EAAO,OAAO,GAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,CAAA;AACvC,EAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,EAAA,IAAI,KAAK,GAAA,EAAO,OAAO,GAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AACvC,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACnC;AAEO,IAAM,SAAN,MAAa;AAAA,EACV,KAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAKR,EAAC,EAAG;AACN,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,MAAA;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,OAAO,KAAA,KAAU,KAAA;AAC5D,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,SAAA,IAAa,IAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AAAA,EAClC;AAAA,EAEQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,OAAO,cAAA,CAAe,KAAK,CAAA,IAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,EAC3D;AAAA,EAEQ,SAAA,GAAoB;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,OAAO,EAAA;AAChC,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,EAAG,GAAA,CAAI,WAAA,EAAY,CAAE,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,EAAG,OAAO,KAAK,CAAA,CAAA,CAAA;AAAA,EACxE;AAAA,EAEQ,IAAI,KAAA,EAAyB;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,SAAkB,CAAA,CAAA,EAAI,KAAA,CAAM,aAAa,CAAA,CAAA,CAAA;AACnD,IAAA,MAAM,QAAA,GAAmC;AAAA,MACvC,OAAO,MAAA,CAAO,IAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,MAAA;AAAA,MACb,OAAO,MAAA,CAAO;AAAA,KAChB;AACA,IAAA,OAAO,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,IAAK,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,EACxE;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC7E;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAmB;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3E;AAAA,EAEA,IAAA,CAAK,YAAoB,IAAA,EAAmB;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC3E;AAAA,EAEA,KAAA,CAAM,YAAoB,IAAA,EAAmB;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,EAC7E;AAAA,EAEA,OAAA,CAAQ,MAAA,EAAgB,IAAA,EAAc,UAAA,EAAoB,QAAA,EAAwB;AAChF,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAK,IAAA,CAAK,SAAA,GAAY,cAAc,MAAM,CAAA,IAAK,OAAO,KAAA,GAAQ,EAAA;AACpE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA,GAAI,EAAA;AACtD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,KAAA,GAAQ,EAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,EAAG,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,EAAE,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,EAAG,UAAU,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAC,CAAA;AAAA,KACxG;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,MAAc,IAAA,EAAoB;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,IAAA,CAAK,SAAA;AACf,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,EAAA;AAAA,MACA,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,GAAO,EAAE,CAAA,uBAAA,EAAqB,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAA;AAAA,MAC/E,EAAA;AAAA,MACA,GAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,kBAAA,EAAgB,IAAI,MAAA,CAAO,IAAA,GAAO,EAAE,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,GAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,MAC3G,CAAA,EAAG,IAAI,MAAA,CAAO,GAAA,GAAM,EAAE,CAAA,6BAAA,EAA2B,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,EAAE,CAAA,CAAA;AAAA,MACtE;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC/B;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAEsB,IAAI,MAAA;;;ACrHnB,IAAM,cAAA,GAAyC;AAAA,EACpD,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,cAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,UAAA;AAAA,EACL,GAAA,EAAK,MAAA;AAAA,EACL,GAAA,EAAK,sBAAA;AAAA,EACL,GAAA,EAAK,mBAAA;AAAA,EACL,GAAA,EAAK,uBAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,GAAA,EAAK,aAAA;AAAA,EACL,GAAA,EAAK,qBAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;;;AC9CO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,KAAA,CAAM;AAAA,EACnB,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CAAY,UAAA,EAAoB,OAAA,EAAkB,OAAA,EAAe;AAC/D,IAAA,KAAA,CAAM,OAAA,IAAW,cAAA,CAAe,UAAU,CAAA,IAAK,eAAe,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,UAAA,CAAU,SAAS,CAAA;AAAA,EACjD;AAAA,EAEA,MAAA,GAA8B;AAC5B,IAAA,MAAM,GAAA,GAA2B;AAAA,MAC/B,KAAA,EAAO;AAAA,QACL,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,SAAS,IAAA,CAAK;AAAA;AAChB,KACF;AACA,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,UAAU,IAAA,CAAK,OAAA;AAC3C,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,OAAO,UAAA,CAAW,OAAA,EAAkB,OAAA,EAA0B;AAC5D,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,eAAe,OAAO,CAAA;AAAA,EAC7D;AAAA,EAEA,OAAO,aAAa,OAAA,EAA6B;AAC/C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,cAAc,CAAA;AAAA,EACrD;AAAA,EAEA,OAAO,UAAU,OAAA,EAA6B;AAC5C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,WAAW,CAAA;AAAA,EAClD;AAAA,EAEA,OAAO,SAAS,OAAA,EAA6B;AAC3C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,WAAW,CAAA;AAAA,EAClD;AAAA,EAEA,OAAO,iBAAiB,OAAA,EAA6B;AACnD,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,oBAAoB,CAAA;AAAA,EAC3D;AAAA,EAEA,OAAO,QAAA,CAAS,OAAA,EAAkB,OAAA,EAA0B;AAC1D,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,YAAY,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,mBAAA,CAAoB,OAAA,EAAkB,OAAA,EAA0B;AACrE,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,wBAAwB,OAAO,CAAA;AAAA,EACtE;AAAA,EAEA,OAAO,gBAAgB,OAAA,EAA6B;AAClD,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,mBAAmB,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAO,SAAS,OAAA,EAA6B;AAC3C,IAAA,OAAO,IAAI,UAAA,CAAU,GAAA,EAAK,OAAA,IAAW,uBAAuB,CAAA;AAAA,EAC9D;AACF;;;AC3DA,IAAM,aAAA,GAAgB;AAAA,EACpB,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAC9B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,EAAA,GAAK,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK,GAAI,IAAI,CAAC,CAAA;AACrE,MAAA,IAAI,MAAM,EAAA,CAAG,MAAA,GAAS,CAAA,EAAG,OAAO,YAAY,EAAE,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,EAAQ,aAAA,IAAiB,WAAA;AAChD,EAAA,OAAO,YAAY,UAAU,CAAA;AAC/B;AAEA,SAAS,YAAY,EAAA,EAAoB;AACvC,EAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,kBAAA,EAAoB,OAAO,WAAA;AACtD,EAAA,IAAI,GAAG,UAAA,CAAW,SAAS,GAAG,OAAO,EAAA,CAAG,MAAM,CAAC,CAAA;AAC/C,EAAA,OAAO,EAAA;AACT;;;AC3BO,SAAS,iBAAiB,EAAA,EAA+C;AAC9E,EAAA,MAAM,MAAA,mBAA4C,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACpE,EAAA,IAAI,CAAC,EAAA,IAAM,EAAA,CAAG,MAAA,KAAW,GAAG,OAAO,MAAA;AAEnC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,WAAA,GAAc,IAAA;AAClB,EAAA,IAAI,IAAI,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA;AAEtC,EAAA,OAAO,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAA,EAAK;AACzB,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA;AAE1B,IAAA,IAAI,EAAA,KAAO,MAAc,WAAA,EAAa;AACpC,MAAA,WAAA,GAAc,KAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,EAAA,EAAY;AACrB,MAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,QAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AACjC,QAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA;AACnC,QAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAAA,QACvB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACvC,UAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,QAC1B;AAAA,MACF;AACA,MAAA,GAAA,GAAM,EAAA;AACN,MAAA,KAAA,GAAQ,EAAA;AACR,MAAA,WAAA,GAAc,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,IAAO,GAAG,CAAC,CAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,GAAG,CAAC,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,IAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AACjC,IAAA,MAAM,UAAA,GAAa,WAAW,KAAK,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,OAAO,UAAU,CAAA;AAClC,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAAA,IACvB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACvC,MAAA,MAAA,CAAO,UAAU,CAAA,GAAI,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,EAAA,IAAM,IAAI,OAAA,CAAQ,GAAG,CAAA,KAAM,EAAA,EAAI,OAAO,GAAA;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEO,SAAS,aAAa,MAAA,EAAoD;AAC/E,EAAA,MAAM,OAAA,mBAAkC,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAC1D,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAEpB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AAEnB,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,OAAO,IAAI,GAAA,IAAO,MAAA,CAAO,UAAA,CAAW,CAAC,MAAM,EAAA,EAAI,CAAA,EAAA;AAE/C,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AAC9B,MAAA,IAAI,EAAA,KAAO,EAAA,IAAM,KAAA,KAAU,EAAA,EAAI,KAAA,GAAQ,CAAA;AACvC,MAAA,IAAI,OAAO,EAAA,EAAI;AAAE,QAAA,OAAA,GAAU,CAAA;AAAG,QAAA;AAAA,MAAO;AAAA,IACvC;AAEA,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,CAAA,GAAI,OAAA,KAAY,EAAA,GAAK,GAAA,GAAM,OAAA,GAAU,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,OAAA,KAAY,EAAA,GAAK,GAAA,GAAM,OAAA;AACnC,IAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI,MAAM,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAE5C,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,KAAM,EAAA,EAAI;AACrE,MAAA,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,KAAM,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,UAAA,CAAW,GAAG,CAAA;AAAA,IAChC;AAEA,IAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,EACZ;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,iBAAA,GAAoB,kBAAA;AAC1B,IAAM,iBAAA,GAAoB,mCAAA;AAE1B,eAAsB,UAAU,GAAA,EAAoC;AAClE,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,gBAAgB,CAAA;AAElD,EAAA,IACE,GAAA,CAAI,MAAA,KAAW,KAAA,IACf,GAAA,CAAI,MAAA,KAAW,MAAA,IACf,GAAA,CAAI,MAAA,KAAW,SAAA,IACd,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,GAAA,EAClD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,GAAO,IAAA;AAE5B,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AAChC,MAAA,SAAA,IAAa,KAAA,CAAM,MAAA;AACnB,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,MAAS,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAM,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAElD,MAAA,IAAI,WAAA,CAAY,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC7C,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QACzB,CAAA,CAAA,MAAQ;AACN,UAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,QACb;AAAA,MACF,CAAA,MAAA,IAAW,WAAA,CAAY,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACpD,QAAA,OAAA,CAAQ,gBAAA,CAAiB,GAAG,CAAC,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACb;AAAA,IACF,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEO,SAAS,SAAS,GAAA,EAAmD;AAC1E,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,EAAI;AAC5B,MAAA,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB,MAAA,MAAA,GAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AACpB,MAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAG;AACrC;;;ACnLO,SAAS,eAAA,CACd,IAAA,EACA,KAAA,EACA,OAAA,GAAyB,EAAC,EAClB;AACR,EAAA,IAAI,MAAA,GAAS,GAAG,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC1B,IAAA,MAAA,IAAU,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAA,IAAU,CAAA,UAAA,EAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAa,CAAA,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,IAAU,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA,EACtC;AAEA,EAAA,MAAA,IAAU,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,IAAQ,GAAG,CAAA,CAAA;AAEvC,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAA,IAAU,UAAA;AAAA,EACZ;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,KAAA,EAAO;AAC9B,IAAA,MAAA,IAAU,YAAA;AAAA,EACZ;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,IAAU,CAAA,WAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAA,CACd,IAAA,EACA,OAAA,GAAyB,EAAC,EAClB;AACR,EAAA,OAAO,eAAA,CAAgB,MAAM,EAAA,EAAI;AAAA,IAC/B,GAAG,OAAA;AAAA,IACH,MAAA,EAAQ,CAAA;AAAA,IACR,OAAA,kBAAS,IAAI,IAAA,CAAK,CAAC;AAAA,GACpB,CAAA;AACH;;;ACpBO,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAO,QAAA,CAAS,IAAA,EAAW,MAAA,EAAkC;AAC3D,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAC5C,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,CAAC,EAAE,OAAO,OAAA,EAAS,OAAA,EAAS,kCAAkC;AAAA,OACxE;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAK,CAAA;AAExB,MAAA,IAAI,KAAK,QAAA,KAAa,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,CAAA,EAAK;AAC5E,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,KAAK,CAAA,YAAA,CAAA;AAAA,UACjC;AAAA,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAU,OAAO,KAAA;AAC3D,QAAA,IAAI,UAAA,KAAe,KAAK,IAAA,EAAM;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,iBAAA,EAAoB,KAAK,IAAI,CAAA,CAAA;AAAA,YAC9D;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACvD,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,kBAAA,EAAqB,KAAK,GAAG,CAAA,WAAA,CAAA;AAAA,YAC9D;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,iBAAA,EAAoB,KAAK,GAAG,CAAA,WAAA,CAAA;AAAA,YAC7D;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAK,OAAA,IAAW,CAAC,KAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,KAAK,CAAA,mBAAA,CAAA;AAAA,YACjC;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACvD,QAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,KAAK,GAAA,EAAK;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,kBAAA,EAAqB,KAAK,GAAG,CAAA,CAAA;AAAA,YAC9D;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,KAAK,GAAA,EAAK;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,iBAAA,EAAoB,KAAK,GAAG,CAAA,CAAA;AAAA,YAC7D;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjD,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,oBAAA,EAAuB,KAAK,GAAG,CAAA,MAAA,CAAA;AAAA,YAChE;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,mBAAA,EAAsB,KAAK,GAAG,CAAA,MAAA,CAAA;AAAA,YAC/D;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,IAAA,IAAQ,CAAC,KAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3C,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,KAAK,oBAAoB,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UACzE;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACrC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,OAAO,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO;AAAA,KACrC;AAAA,EACF;AACF;;;ACpIO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,QAAA,CAAS,IAAA,EAAW,MAAA,EAAgD;AAEzE,IAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,UAAA,EAAY;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AACpC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,MAC1C;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,IAC9C;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,UAAA,EAAY;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAChC,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,MACrC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAI;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,UAAA,EAAY;AACzC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AACnC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,MAC9C;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC3C;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7B;AACF","file":"index.mjs","sourcesContent":["type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\r\n\r\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst COLORS = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n gray: \"\\x1b[90m\",\r\n bgRed: \"\\x1b[41m\",\r\n bgGreen: \"\\x1b[42m\",\r\n bgYellow: \"\\x1b[43m\",\r\n bgBlue: \"\\x1b[44m\",\r\n} as const;\r\n\r\nconst METHOD_COLORS: Record<string, string> = {\r\n GET: COLORS.green,\r\n POST: COLORS.blue,\r\n PUT: COLORS.yellow,\r\n DELETE: COLORS.red,\r\n PATCH: COLORS.magenta,\r\n HEAD: COLORS.cyan,\r\n OPTIONS: COLORS.gray,\r\n};\r\n\r\nfunction statusColor(code: number): string {\r\n if (code < 200) return COLORS.gray;\r\n if (code < 300) return COLORS.green;\r\n if (code < 400) return COLORS.cyan;\r\n if (code < 500) return COLORS.yellow;\r\n return COLORS.red;\r\n}\r\n\r\nfunction formatDuration(ns: bigint): string {\r\n const us = Number(ns) / 1_000;\r\n if (us < 1_000) return `${us.toFixed(0)}µs`;\r\n const ms = us / 1_000;\r\n if (ms < 1_000) return `${ms.toFixed(1)}ms`;\r\n return `${(ms / 1_000).toFixed(2)}s`;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private useColors: boolean;\r\n private showTimestamp: boolean;\r\n private prefix: string;\r\n\r\n constructor(options: {\r\n level?: LogLevel;\r\n colors?: boolean;\r\n timestamp?: boolean;\r\n prefix?: string;\r\n } = {}) {\r\n this.level = options.level ?? \"info\";\r\n this.useColors = options.colors ?? process.stdout.isTTY !== false;\r\n this.showTimestamp = options.timestamp ?? true;\r\n this.prefix = options.prefix ?? \"azura\";\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];\r\n }\r\n\r\n private timestamp(): string {\r\n if (!this.showTimestamp) return \"\";\r\n const now = new Date();\r\n return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;\r\n }\r\n\r\n private tag(level: LogLevel): string {\r\n if (!this.useColors) return `[${level.toUpperCase()}]`;\r\n const colorMap: Record<string, string> = {\r\n debug: COLORS.gray,\r\n info: COLORS.blue,\r\n warn: COLORS.yellow,\r\n error: COLORS.red,\r\n };\r\n return `${colorMap[level] ?? \"\"}[${level.toUpperCase()}]${COLORS.reset}`;\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"debug\")) return;\r\n console.debug(`${this.timestamp()}${this.tag(\"debug\")} ${message}`, ...args);\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n console.info(`${this.timestamp()}${this.tag(\"info\")} ${message}`, ...args);\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"warn\")) return;\r\n console.warn(`${this.timestamp()}${this.tag(\"warn\")} ${message}`, ...args);\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"error\")) return;\r\n console.error(`${this.timestamp()}${this.tag(\"error\")} ${message}`, ...args);\r\n }\r\n\r\n request(method: string, path: string, statusCode: number, duration: bigint): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : \"\";\r\n const sc = this.useColors ? statusColor(statusCode) : \"\";\r\n const r = this.useColors ? COLORS.reset : \"\";\r\n const dur = formatDuration(duration);\r\n console.info(\r\n `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`,\r\n );\r\n }\r\n\r\n banner(port: number, host: string): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const c = this.useColors;\r\n const lines = [\r\n \"\",\r\n `${c ? COLORS.bold + COLORS.cyan : \"\"} ⚡ AzuraJS v3.0.0${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n `${c ? COLORS.green : \"\"} ➜ Local: ${c ? COLORS.bold : \"\"}http://${host}:${port}/${c ? COLORS.reset : \"\"}`,\r\n `${c ? COLORS.dim : \"\"} ➜ Press Ctrl+C to stop${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n ];\r\n console.info(lines.join(\"\\n\"));\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n}\r\n\r\nexport const logger = new Logger();\r\n","export const HttpStatus = {\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];\r\n\r\nexport const HttpStatusText: Record<number, string> = {\r\n 200: \"OK\",\r\n 201: \"Created\",\r\n 202: \"Accepted\",\r\n 204: \"No Content\",\r\n 301: \"Moved Permanently\",\r\n 302: \"Found\",\r\n 304: \"Not Modified\",\r\n 400: \"Bad Request\",\r\n 401: \"Unauthorized\",\r\n 403: \"Forbidden\",\r\n 404: \"Not Found\",\r\n 405: \"Method Not Allowed\",\r\n 409: \"Conflict\",\r\n 410: \"Gone\",\r\n 422: \"Unprocessable Entity\",\r\n 429: \"Too Many Requests\",\r\n 500: \"Internal Server Error\",\r\n 501: \"Not Implemented\",\r\n 502: \"Bad Gateway\",\r\n 503: \"Service Unavailable\",\r\n 504: \"Gateway Timeout\",\r\n};\r\n","import { HttpStatusText } from \"../types/http/status.js\";\r\n\r\nexport class HttpError extends Error {\r\n public readonly statusCode: number;\r\n public readonly details?: any;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(statusCode: number, message?: string, details?: any) {\r\n super(message ?? HttpStatusText[statusCode] ?? \"Unknown Error\");\r\n this.statusCode = statusCode;\r\n this.details = details;\r\n this.isOperational = true;\r\n Object.setPrototypeOf(this, HttpError.prototype);\r\n }\r\n\r\n toJSON(): Record<string, any> {\r\n const obj: Record<string, any> = {\r\n error: {\r\n statusCode: this.statusCode,\r\n message: this.message,\r\n },\r\n };\r\n if (this.details) obj.error.details = this.details;\r\n return obj;\r\n }\r\n\r\n static badRequest(message?: string, details?: any): HttpError {\r\n return new HttpError(400, message ?? \"Bad Request\", details);\r\n }\r\n\r\n static unauthorized(message?: string): HttpError {\r\n return new HttpError(401, message ?? \"Unauthorized\");\r\n }\r\n\r\n static forbidden(message?: string): HttpError {\r\n return new HttpError(403, message ?? \"Forbidden\");\r\n }\r\n\r\n static notFound(message?: string): HttpError {\r\n return new HttpError(404, message ?? \"Not Found\");\r\n }\r\n\r\n static methodNotAllowed(message?: string): HttpError {\r\n return new HttpError(405, message ?? \"Method Not Allowed\");\r\n }\r\n\r\n static conflict(message?: string, details?: any): HttpError {\r\n return new HttpError(409, message ?? \"Conflict\", details);\r\n }\r\n\r\n static unprocessableEntity(message?: string, details?: any): HttpError {\r\n return new HttpError(422, message ?? \"Unprocessable Entity\", details);\r\n }\r\n\r\n static tooManyRequests(message?: string): HttpError {\r\n return new HttpError(429, message ?? \"Too Many Requests\");\r\n }\r\n\r\n static internal(message?: string): HttpError {\r\n return new HttpError(500, message ?? \"Internal Server Error\");\r\n }\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nconst PROXY_HEADERS = [\r\n \"x-forwarded-for\",\r\n \"x-real-ip\",\r\n \"cf-connecting-ip\",\r\n \"x-client-ip\",\r\n \"x-cluster-client-ip\",\r\n \"fastly-client-ip\",\r\n \"true-client-ip\",\r\n] as const;\r\n\r\nexport function resolveIp(req: IncomingMessage): string {\r\n for (const header of PROXY_HEADERS) {\r\n const val = req.headers[header];\r\n if (val) {\r\n const ip = typeof val === \"string\" ? val.split(\",\")[0].trim() : val[0];\r\n if (ip && ip.length > 0) return normalizeIp(ip);\r\n }\r\n }\r\n\r\n const remoteAddr = req.socket?.remoteAddress ?? \"127.0.0.1\";\r\n return normalizeIp(remoteAddr);\r\n}\r\n\r\nfunction normalizeIp(ip: string): string {\r\n if (ip === \"::1\" || ip === \"::ffff:127.0.0.1\") return \"127.0.0.1\";\r\n if (ip.startsWith(\"::ffff:\")) return ip.slice(7);\r\n return ip;\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nexport function parseQueryString(qs: string): Record<string, string | string[]> {\r\n const result: Record<string, string | string[]> = Object.create(null);\r\n if (!qs || qs.length === 0) return result;\r\n\r\n let key = \"\";\r\n let value = \"\";\r\n let startingKey = true;\r\n let i = qs.charCodeAt(0) === 63 ? 1 : 0; // skip leading ?\r\n\r\n for (; i < qs.length; i++) {\r\n const ch = qs.charCodeAt(i);\r\n\r\n if (ch === 61 /* = */ && startingKey) {\r\n startingKey = false;\r\n continue;\r\n }\r\n\r\n if (ch === 38 /* & */) {\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n key = \"\";\r\n value = \"\";\r\n startingKey = true;\r\n continue;\r\n }\r\n\r\n if (startingKey) {\r\n key += qs[i];\r\n } else {\r\n value += qs[i];\r\n }\r\n }\r\n\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction fastDecode(str: string): string {\r\n if (str.indexOf(\"%\") === -1 && str.indexOf(\"+\") === -1) return str;\r\n try {\r\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\nexport function parseCookies(header: string | undefined): Record<string, string> {\r\n const cookies: Record<string, string> = Object.create(null);\r\n if (!header) return cookies;\r\n\r\n let i = 0;\r\n const len = header.length;\r\n\r\n while (i < len) {\r\n while (i < len && header.charCodeAt(i) === 32) i++; // skip spaces\r\n\r\n let eqIdx = -1;\r\n let semiIdx = -1;\r\n for (let j = i; j < len; j++) {\r\n const ch = header.charCodeAt(j);\r\n if (ch === 61 && eqIdx === -1) eqIdx = j;\r\n if (ch === 59) { semiIdx = j; break; }\r\n }\r\n\r\n if (eqIdx === -1) {\r\n i = semiIdx === -1 ? len : semiIdx + 1;\r\n continue;\r\n }\r\n\r\n const end = semiIdx === -1 ? len : semiIdx;\r\n const name = header.slice(i, eqIdx).trim();\r\n let val = header.slice(eqIdx + 1, end).trim();\r\n\r\n if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {\r\n val = val.slice(1, -1);\r\n }\r\n\r\n if (cookies[name] === undefined) {\r\n cookies[name] = fastDecode(val);\r\n }\r\n\r\n i = end + 1;\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\nconst CONTENT_TYPE_JSON = \"application/json\";\r\nconst CONTENT_TYPE_FORM = \"application/x-www-form-urlencoded\";\r\n\r\nexport async function parseBody(req: IncomingMessage): Promise<any> {\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n const contentLength = req.headers[\"content-length\"];\r\n\r\n if (\r\n req.method === \"GET\" ||\r\n req.method === \"HEAD\" ||\r\n req.method === \"OPTIONS\" ||\r\n (contentLength !== undefined && contentLength === \"0\")\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n const maxSize = 10 * 1024 * 1024; // 10MB default\r\n\r\n return new Promise((resolve, reject) => {\r\n req.on(\"data\", (chunk: Buffer) => {\r\n totalSize += chunk.length;\r\n if (totalSize > maxSize) {\r\n req.destroy();\r\n reject(new Error(\"Request body too large\"));\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on(\"end\", () => {\r\n if (chunks.length === 0) {\r\n resolve(undefined);\r\n return;\r\n }\r\n\r\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\r\n\r\n if (contentType.startsWith(CONTENT_TYPE_JSON)) {\r\n try {\r\n resolve(JSON.parse(raw));\r\n } catch {\r\n resolve(raw);\r\n }\r\n } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {\r\n resolve(parseQueryString(raw));\r\n } else {\r\n resolve(raw);\r\n }\r\n });\r\n\r\n req.on(\"error\", reject);\r\n });\r\n}\r\n\r\nexport function parseUrl(url: string): { pathname: string; search: string } {\r\n let pathname = \"\";\r\n let search = \"\";\r\n let i = 0;\r\n\r\n for (; i < url.length; i++) {\r\n if (url.charCodeAt(i) === 63) { // ?\r\n pathname = url.slice(0, i);\r\n search = url.slice(i);\r\n return { pathname, search };\r\n }\r\n }\r\n\r\n return { pathname: url, search: \"\" };\r\n}\r\n","import type { CookieOptions } from \"../../types/common.type.js\";\r\n\r\nexport function serializeCookie(\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {},\r\n): string {\r\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\r\n\r\n if (options.maxAge != null) {\r\n cookie += `; Max-Age=${Math.floor(options.maxAge)}`;\r\n }\r\n\r\n if (options.expires) {\r\n cookie += `; Expires=${options.expires.toUTCString()}`;\r\n }\r\n\r\n if (options.domain) {\r\n cookie += `; Domain=${options.domain}`;\r\n }\r\n\r\n cookie += `; Path=${options.path ?? \"/\"}`;\r\n\r\n if (options.secure) {\r\n cookie += \"; Secure\";\r\n }\r\n\r\n if (options.httpOnly !== false) {\r\n cookie += \"; HttpOnly\";\r\n }\r\n\r\n if (options.sameSite) {\r\n cookie += `; SameSite=${options.sameSite}`;\r\n }\r\n\r\n return cookie;\r\n}\r\n\r\nexport function clearCookieHeader(\r\n name: string,\r\n options: CookieOptions = {},\r\n): string {\r\n return serializeCookie(name, \"\", {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n","export interface ValidationError {\r\n field: string;\r\n message: string;\r\n value?: any;\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: ValidationError[];\r\n data?: any;\r\n}\r\n\r\ntype RuleType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\r\n\r\ninterface FieldRule {\r\n type?: RuleType;\r\n required?: boolean;\r\n min?: number;\r\n max?: number;\r\n pattern?: RegExp;\r\n enum?: any[];\r\n custom?: (value: any) => string | null;\r\n message?: string;\r\n}\r\n\r\nexport type Schema = Record<string, FieldRule>;\r\n\r\nexport class DTOValidator {\r\n static validate(data: any, schema: Schema): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n\r\n if (data == null || typeof data !== \"object\") {\r\n return {\r\n valid: false,\r\n errors: [{ field: \"_root\", message: \"Request body must be an object\" }],\r\n };\r\n }\r\n\r\n for (const [field, rule] of Object.entries(schema)) {\r\n const value = data[field];\r\n\r\n if (rule.required && (value === undefined || value === null || value === \"\")) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} is required`,\r\n value,\r\n });\r\n continue;\r\n }\r\n\r\n if (value === undefined || value === null) continue;\r\n\r\n if (rule.type) {\r\n const actualType = Array.isArray(value) ? \"array\" : typeof value;\r\n if (actualType !== rule.type) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be of type ${rule.type}`,\r\n value,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n if (rule.type === \"string\" || typeof value === \"string\") {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} has invalid format`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"number\" || typeof value === \"number\") {\r\n if (rule.min !== undefined && value < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min}`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max}`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"array\" && Array.isArray(value)) {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at least ${rule.min} items`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at most ${rule.max} items`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.enum && !rule.enum.includes(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be one of: ${rule.enum.join(\", \")}`,\r\n value,\r\n });\r\n }\r\n\r\n if (rule.custom) {\r\n const customError = rule.custom(value);\r\n if (customError) {\r\n errors.push({ field, message: customError, value });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n data: errors.length === 0 ? data : undefined,\r\n };\r\n }\r\n}\r\n","export interface ExternalSchema {\r\n parse?: (data: any) => any;\r\n safeParse?: (data: any) => { success: boolean; data?: any; error?: any };\r\n validate?: (data: any) => { value?: any; error?: any };\r\n}\r\n\r\nexport interface SchemaValidationResult {\r\n valid: boolean;\r\n data?: any;\r\n errors?: any;\r\n}\r\n\r\nexport class SchemaValidator {\r\n static validate(data: any, schema: ExternalSchema): SchemaValidationResult {\r\n // Zod-style schema\r\n if (typeof schema.safeParse === \"function\") {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { valid: true, data: result.data };\r\n }\r\n return { valid: false, errors: result.error };\r\n }\r\n\r\n // Zod parse (throws on error)\r\n if (typeof schema.parse === \"function\") {\r\n try {\r\n const parsed = schema.parse(data);\r\n return { valid: true, data: parsed };\r\n } catch (err) {\r\n return { valid: false, errors: err };\r\n }\r\n }\r\n\r\n // Joi-style schema\r\n if (typeof schema.validate === \"function\") {\r\n const result = schema.validate(data);\r\n if (result.error) {\r\n return { valid: false, errors: result.error };\r\n }\r\n return { valid: true, data: result.value };\r\n }\r\n\r\n return { valid: true, data };\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "azurajs",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "description": "Ultra-fast TypeScript-first web framework for Node.js and Bun with decorator-based routing, zero dependencies, and built-in plugin system",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,71 +11,81 @@
11
11
  "bun": "./dist/index.mjs",
12
12
  "import": "./dist/index.mjs",
13
13
  "module": "./dist/index.mjs",
14
- "require": "./dist/index.js"
14
+ "require": "./dist/index.js",
15
+ "default": "./dist/index.mjs"
15
16
  },
16
17
  "./core": {
17
18
  "types": "./dist/core/index.d.ts",
18
19
  "bun": "./dist/core/index.mjs",
19
20
  "import": "./dist/core/index.mjs",
20
21
  "module": "./dist/core/index.mjs",
21
- "require": "./dist/core/index.js"
22
+ "require": "./dist/core/index.js",
23
+ "default": "./dist/core/index.mjs"
22
24
  },
23
25
  "./plugins": {
24
26
  "types": "./dist/plugins/index.d.ts",
25
27
  "bun": "./dist/plugins/index.mjs",
26
28
  "import": "./dist/plugins/index.mjs",
27
29
  "module": "./dist/plugins/index.mjs",
28
- "require": "./dist/plugins/index.js"
30
+ "require": "./dist/plugins/index.js",
31
+ "default": "./dist/plugins/index.mjs"
29
32
  },
30
33
  "./decorators": {
31
34
  "types": "./dist/decorators/index.d.ts",
32
35
  "bun": "./dist/decorators/index.mjs",
33
36
  "import": "./dist/decorators/index.mjs",
34
37
  "module": "./dist/decorators/index.mjs",
35
- "require": "./dist/decorators/index.js"
38
+ "require": "./dist/decorators/index.js",
39
+ "default": "./dist/decorators/index.mjs"
36
40
  },
37
41
  "./types": {
38
42
  "types": "./dist/types/index.d.ts",
39
43
  "bun": "./dist/types/index.mjs",
40
44
  "import": "./dist/types/index.mjs",
41
45
  "module": "./dist/types/index.mjs",
42
- "require": "./dist/types/index.js"
46
+ "require": "./dist/types/index.js",
47
+ "default": "./dist/types/index.mjs"
43
48
  },
44
49
  "./utils": {
45
50
  "types": "./dist/utils/index.d.ts",
46
51
  "bun": "./dist/utils/index.mjs",
47
52
  "import": "./dist/utils/index.mjs",
48
53
  "module": "./dist/utils/index.mjs",
49
- "require": "./dist/utils/index.js"
54
+ "require": "./dist/utils/index.js",
55
+ "default": "./dist/utils/index.mjs"
50
56
  },
51
57
  "./config": {
52
58
  "types": "./dist/config/index.d.ts",
53
59
  "bun": "./dist/config/index.mjs",
54
60
  "import": "./dist/config/index.mjs",
55
61
  "module": "./dist/config/index.mjs",
56
- "require": "./dist/config/index.js"
62
+ "require": "./dist/config/index.js",
63
+ "default": "./dist/config/index.mjs"
57
64
  },
58
65
  "./middleware": {
59
66
  "types": "./dist/middleware/index.d.ts",
60
67
  "bun": "./dist/middleware/index.mjs",
61
68
  "import": "./dist/middleware/index.mjs",
62
69
  "module": "./dist/middleware/index.mjs",
63
- "require": "./dist/middleware/index.js"
64
- }
70
+ "require": "./dist/middleware/index.js",
71
+ "default": "./dist/middleware/index.mjs"
72
+ },
73
+ "./package.json": "./package.json"
65
74
  },
66
75
  "typesVersions": {
67
76
  "*": {
68
- "core": ["dist/core/index.d.ts"],
69
- "plugins": ["dist/plugins/index.d.ts"],
70
- "decorators": ["dist/decorators/index.d.ts"],
71
- "types": ["dist/types/index.d.ts"],
72
- "utils": ["dist/utils/index.d.ts"],
73
- "config": ["dist/config/index.d.ts"],
74
- "middleware": ["dist/middleware/index.d.ts"]
77
+ "core": ["./dist/core/index.d.ts"],
78
+ "plugins": ["./dist/plugins/index.d.ts"],
79
+ "decorators": ["./dist/decorators/index.d.ts"],
80
+ "types": ["./dist/types/index.d.ts"],
81
+ "utils": ["./dist/utils/index.d.ts"],
82
+ "config": ["./dist/config/index.d.ts"],
83
+ "middleware": ["./dist/middleware/index.d.ts"]
75
84
  }
76
85
  },
77
86
  "files": [
78
87
  "dist",
88
+ "src",
79
89
  "README.md",
80
90
  "LICENSE"
81
91
  ],
@@ -110,6 +120,14 @@
110
120
  "engines": {
111
121
  "node": ">=18.0.0"
112
122
  },
123
+ "peerDependencies": {
124
+ "typescript": ">=5.0.0"
125
+ },
126
+ "peerDependenciesMeta": {
127
+ "typescript": {
128
+ "optional": true
129
+ }
130
+ },
113
131
  "devDependencies": {
114
132
  "@types/node": "^25.5.2",
115
133
  "tsup": "^8.0.0",
@@ -1,132 +1,169 @@
1
- import { existsSync, readFileSync } from 'fs';
2
- import { resolve } from 'path';
3
-
4
- // src/config/ConfigModule.ts
5
- var CONFIG_FILES = [
6
- "azura.config.ts",
7
- "azura.config.js",
8
- "azura.config.mjs",
9
- "azura.config.json",
10
- "azura.config.yaml",
11
- "azura.config.yml"
12
- ];
13
- var ConfigModule = class _ConfigModule {
14
- static instance = null;
15
- config = {};
16
- constructor() {
17
- }
18
- static getInstance() {
19
- if (!_ConfigModule.instance) {
20
- _ConfigModule.instance = new _ConfigModule();
21
- }
22
- return _ConfigModule.instance;
23
- }
24
- static async load(cwd) {
25
- const instance = _ConfigModule.getInstance();
26
- const baseDir = cwd ?? process.cwd();
27
- for (const file of CONFIG_FILES) {
28
- const fullPath = resolve(baseDir, file);
29
- if (!existsSync(fullPath)) continue;
30
- if (file.endsWith(".json")) {
31
- instance.config = JSON.parse(readFileSync(fullPath, "utf-8"));
32
- return instance.config;
33
- }
34
- if (file.endsWith(".yaml") || file.endsWith(".yml")) {
35
- instance.config = parseSimpleYaml(readFileSync(fullPath, "utf-8"));
36
- return instance.config;
37
- }
38
- if (file.endsWith(".ts") || file.endsWith(".js") || file.endsWith(".mjs")) {
39
- try {
40
- const mod = await import(`file://${fullPath}`);
41
- instance.config = mod.default ?? mod;
42
- return instance.config;
43
- } catch {
44
- }
45
- }
46
- }
47
- return instance.config;
48
- }
49
- static loadSync(cwd) {
50
- const instance = _ConfigModule.getInstance();
51
- const baseDir = cwd ?? process.cwd();
52
- for (const file of CONFIG_FILES) {
53
- const fullPath = resolve(baseDir, file);
54
- if (!existsSync(fullPath)) continue;
55
- if (file.endsWith(".json")) {
56
- instance.config = JSON.parse(readFileSync(fullPath, "utf-8"));
57
- return instance.config;
58
- }
59
- if (file.endsWith(".yaml") || file.endsWith(".yml")) {
60
- instance.config = parseSimpleYaml(readFileSync(fullPath, "utf-8"));
61
- return instance.config;
62
- }
63
- }
64
- return instance.config;
65
- }
66
- static get() {
67
- return _ConfigModule.getInstance().config;
68
- }
69
- static set(config) {
70
- _ConfigModule.getInstance().config = config;
71
- }
72
- static merge(partial) {
73
- const instance = _ConfigModule.getInstance();
74
- instance.config = deepMerge(instance.config, partial);
75
- return instance.config;
76
- }
77
- };
78
- function deepMerge(target, source) {
79
- const output = { ...target };
80
- for (const key of Object.keys(source)) {
81
- if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key]) && target[key] && typeof target[key] === "object") {
82
- output[key] = deepMerge(target[key], source[key]);
83
- } else {
84
- output[key] = source[key];
85
- }
86
- }
87
- return output;
88
- }
89
- function parseSimpleYaml(content) {
90
- const result = {};
91
- const lines = content.split("\n");
92
- const stack = [{ indent: -1, obj: result }];
93
- for (const line of lines) {
94
- const trimmed = line.trim();
95
- if (!trimmed || trimmed.startsWith("#")) continue;
96
- const indent = line.search(/\S/);
97
- const colonIdx = trimmed.indexOf(":");
98
- if (colonIdx === -1) continue;
99
- const key = trimmed.slice(0, colonIdx).trim();
100
- const rawValue = trimmed.slice(colonIdx + 1).trim();
101
- while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {
102
- stack.pop();
103
- }
104
- const parent = stack[stack.length - 1].obj;
105
- if (!rawValue) {
106
- const newObj = {};
107
- parent[key] = newObj;
108
- stack.push({ indent, obj: newObj });
109
- } else {
110
- parent[key] = parseYamlValue(rawValue);
111
- }
112
- }
113
- return result;
114
- }
115
- function parseYamlValue(val) {
116
- if (val === "true") return true;
117
- if (val === "false") return false;
118
- if (val === "null") return null;
119
- if (/^-?\d+$/.test(val)) return parseInt(val, 10);
120
- if (/^-?\d+\.\d+$/.test(val)) return parseFloat(val);
121
- if (val.startsWith('"') && val.endsWith('"') || val.startsWith("'") && val.endsWith("'")) {
122
- return val.slice(1, -1);
123
- }
124
- if (val.startsWith("[") && val.endsWith("]")) {
125
- return val.slice(1, -1).split(",").map((v) => parseYamlValue(v.trim()));
126
- }
127
- return val;
128
- }
129
-
130
- export { ConfigModule };
131
- //# sourceMappingURL=chunk-DR254CWJ.mjs.map
132
- //# sourceMappingURL=chunk-DR254CWJ.mjs.map
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { resolve, join } from "node:path";
3
+ import type { AzuraConfig } from "../types/config.type.js";
4
+
5
+ const CONFIG_FILES = [
6
+ "azura.config.ts",
7
+ "azura.config.js",
8
+ "azura.config.mjs",
9
+ "azura.config.json",
10
+ "azura.config.yaml",
11
+ "azura.config.yml",
12
+ ];
13
+
14
+ export class ConfigModule {
15
+ private static instance: ConfigModule | null = null;
16
+ private config: AzuraConfig = {};
17
+
18
+ private constructor() {}
19
+
20
+ static getInstance(): ConfigModule {
21
+ if (!ConfigModule.instance) {
22
+ ConfigModule.instance = new ConfigModule();
23
+ }
24
+ return ConfigModule.instance;
25
+ }
26
+
27
+ static async load(cwd?: string): Promise<AzuraConfig> {
28
+ const instance = ConfigModule.getInstance();
29
+ const baseDir = cwd ?? process.cwd();
30
+
31
+ for (const file of CONFIG_FILES) {
32
+ const fullPath = resolve(baseDir, file);
33
+ if (!existsSync(fullPath)) continue;
34
+
35
+ if (file.endsWith(".json")) {
36
+ instance.config = JSON.parse(readFileSync(fullPath, "utf-8"));
37
+ return instance.config;
38
+ }
39
+
40
+ if (file.endsWith(".yaml") || file.endsWith(".yml")) {
41
+ instance.config = parseSimpleYaml(readFileSync(fullPath, "utf-8"));
42
+ return instance.config;
43
+ }
44
+
45
+ if (file.endsWith(".ts") || file.endsWith(".js") || file.endsWith(".mjs")) {
46
+ try {
47
+ const mod = await import(`file://${fullPath}`);
48
+ instance.config = mod.default ?? mod;
49
+ return instance.config;
50
+ } catch {
51
+ // TS files may need transpilation — skip if import fails
52
+ }
53
+ }
54
+ }
55
+
56
+ return instance.config;
57
+ }
58
+
59
+ static loadSync(cwd?: string): AzuraConfig {
60
+ const instance = ConfigModule.getInstance();
61
+ const baseDir = cwd ?? process.cwd();
62
+
63
+ for (const file of CONFIG_FILES) {
64
+ const fullPath = resolve(baseDir, file);
65
+ if (!existsSync(fullPath)) continue;
66
+
67
+ if (file.endsWith(".json")) {
68
+ instance.config = JSON.parse(readFileSync(fullPath, "utf-8"));
69
+ return instance.config;
70
+ }
71
+
72
+ if (file.endsWith(".yaml") || file.endsWith(".yml")) {
73
+ instance.config = parseSimpleYaml(readFileSync(fullPath, "utf-8"));
74
+ return instance.config;
75
+ }
76
+ }
77
+
78
+ return instance.config;
79
+ }
80
+
81
+ static get(): AzuraConfig {
82
+ return ConfigModule.getInstance().config;
83
+ }
84
+
85
+ static set(config: AzuraConfig): void {
86
+ ConfigModule.getInstance().config = config;
87
+ }
88
+
89
+ static merge(partial: Partial<AzuraConfig>): AzuraConfig {
90
+ const instance = ConfigModule.getInstance();
91
+ instance.config = deepMerge(instance.config, partial) as AzuraConfig;
92
+ return instance.config;
93
+ }
94
+ }
95
+
96
+ function deepMerge(target: any, source: any): any {
97
+ const output = { ...target };
98
+ for (const key of Object.keys(source)) {
99
+ if (
100
+ source[key] &&
101
+ typeof source[key] === "object" &&
102
+ !Array.isArray(source[key]) &&
103
+ target[key] &&
104
+ typeof target[key] === "object"
105
+ ) {
106
+ output[key] = deepMerge(target[key], source[key]);
107
+ } else {
108
+ output[key] = source[key];
109
+ }
110
+ }
111
+ return output;
112
+ }
113
+
114
+ /**
115
+ * Minimal YAML parser for flat/shallow config files.
116
+ * Does not handle complex YAML features — use JSON for complex configs.
117
+ */
118
+ function parseSimpleYaml(content: string): Record<string, any> {
119
+ const result: Record<string, any> = {};
120
+ const lines = content.split("\n");
121
+ const stack: { indent: number; obj: Record<string, any> }[] = [{ indent: -1, obj: result }];
122
+
123
+ for (const line of lines) {
124
+ const trimmed = line.trim();
125
+ if (!trimmed || trimmed.startsWith("#")) continue;
126
+
127
+ const indent = line.search(/\S/);
128
+ const colonIdx = trimmed.indexOf(":");
129
+
130
+ if (colonIdx === -1) continue;
131
+
132
+ const key = trimmed.slice(0, colonIdx).trim();
133
+ const rawValue = trimmed.slice(colonIdx + 1).trim();
134
+
135
+ while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {
136
+ stack.pop();
137
+ }
138
+
139
+ const parent = stack[stack.length - 1].obj;
140
+
141
+ if (!rawValue) {
142
+ const newObj: Record<string, any> = {};
143
+ parent[key] = newObj;
144
+ stack.push({ indent, obj: newObj });
145
+ } else {
146
+ parent[key] = parseYamlValue(rawValue);
147
+ }
148
+ }
149
+
150
+ return result;
151
+ }
152
+
153
+ function parseYamlValue(val: string): any {
154
+ if (val === "true") return true;
155
+ if (val === "false") return false;
156
+ if (val === "null") return null;
157
+ if (/^-?\d+$/.test(val)) return parseInt(val, 10);
158
+ if (/^-?\d+\.\d+$/.test(val)) return parseFloat(val);
159
+ if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
160
+ return val.slice(1, -1);
161
+ }
162
+ if (val.startsWith("[") && val.endsWith("]")) {
163
+ return val
164
+ .slice(1, -1)
165
+ .split(",")
166
+ .map((v) => parseYamlValue(v.trim()));
167
+ }
168
+ return val;
169
+ }
@@ -0,0 +1 @@
1
+ export { ConfigModule } from "./ConfigModule.js";
@@ -0,0 +1,2 @@
1
+ export { AzuraServer } from "./server.js";
2
+ export { Router } from "./router.js";