@navios/core 0.6.0 → 0.7.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 (273) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +18 -1
  3. package/docs/README.md +1 -0
  4. package/docs/legacy-compat.md +320 -0
  5. package/docs/testing.md +140 -17
  6. package/lib/index-BFwNx9WQ.d.cts +1951 -0
  7. package/lib/index-BFwNx9WQ.d.cts.map +1 -0
  8. package/lib/index-D657ijFO.d.mts +1951 -0
  9. package/lib/index-D657ijFO.d.mts.map +1 -0
  10. package/lib/index.cjs +157 -0
  11. package/lib/index.d.cts +3 -0
  12. package/lib/index.d.mts +3 -190
  13. package/lib/index.mjs +4 -1459
  14. package/lib/legacy-compat/index.cjs +315 -0
  15. package/lib/legacy-compat/index.cjs.map +1 -0
  16. package/lib/legacy-compat/index.d.cts +219 -0
  17. package/lib/legacy-compat/index.d.cts.map +1 -0
  18. package/lib/legacy-compat/index.d.mts +219 -0
  19. package/lib/legacy-compat/index.d.mts.map +1 -0
  20. package/lib/legacy-compat/index.mjs +308 -0
  21. package/lib/legacy-compat/index.mjs.map +1 -0
  22. package/lib/src-Cb1aTjl0.cjs +5710 -0
  23. package/lib/src-Cb1aTjl0.cjs.map +1 -0
  24. package/lib/src-DzPY5s6d.mjs +5353 -0
  25. package/lib/src-DzPY5s6d.mjs.map +1 -0
  26. package/lib/testing/index.cjs +106 -0
  27. package/lib/testing/index.cjs.map +1 -0
  28. package/lib/testing/index.d.cts +156 -0
  29. package/lib/testing/index.d.cts.map +1 -0
  30. package/lib/testing/index.d.mts +156 -0
  31. package/lib/testing/index.d.mts.map +1 -0
  32. package/lib/testing/index.mjs +100 -0
  33. package/lib/testing/index.mjs.map +1 -0
  34. package/lib/use-guards.decorator-DdvUhB03.cjs +622 -0
  35. package/lib/use-guards.decorator-DdvUhB03.cjs.map +1 -0
  36. package/lib/use-guards.decorator-kZ3lNK8v.mjs +454 -0
  37. package/lib/use-guards.decorator-kZ3lNK8v.mjs.map +1 -0
  38. package/package.json +24 -4
  39. package/project.json +2 -2
  40. package/src/attribute.factory.d.mts +175 -0
  41. package/src/attribute.factory.d.mts.map +1 -0
  42. package/src/attribute.factory.mts +154 -0
  43. package/src/config/config-service.interface.d.mts +39 -0
  44. package/src/config/config-service.interface.d.mts.map +1 -0
  45. package/src/config/config-service.interface.mts +31 -0
  46. package/src/config/config.provider.d.mts +46 -0
  47. package/src/config/config.provider.d.mts.map +1 -0
  48. package/src/config/config.provider.mts +36 -0
  49. package/src/config/config.service.d.mts +108 -0
  50. package/src/config/config.service.d.mts.map +1 -0
  51. package/src/config/config.service.mts +94 -4
  52. package/src/config/index.d.mts +6 -0
  53. package/src/config/index.d.mts.map +1 -0
  54. package/src/config/types.d.mts +13 -0
  55. package/src/config/types.d.mts.map +1 -0
  56. package/src/config/utils/helpers.d.mts +3 -0
  57. package/src/config/utils/helpers.d.mts.map +1 -0
  58. package/src/config/utils/index.d.mts +2 -0
  59. package/src/config/utils/index.d.mts.map +1 -0
  60. package/src/decorators/controller.decorator.d.mts +33 -0
  61. package/src/decorators/controller.decorator.d.mts.map +1 -0
  62. package/src/decorators/controller.decorator.mts +28 -0
  63. package/src/decorators/endpoint.decorator.d.mts +89 -0
  64. package/src/decorators/endpoint.decorator.d.mts.map +1 -0
  65. package/src/decorators/endpoint.decorator.mts +76 -0
  66. package/src/decorators/header.decorator.d.mts +22 -0
  67. package/src/decorators/header.decorator.d.mts.map +1 -0
  68. package/src/decorators/header.decorator.mts +19 -0
  69. package/src/decorators/http-code.decorator.d.mts +22 -0
  70. package/src/decorators/http-code.decorator.d.mts.map +1 -0
  71. package/src/decorators/http-code.decorator.mts +20 -0
  72. package/src/decorators/index.d.mts +9 -0
  73. package/src/decorators/index.d.mts.map +1 -0
  74. package/src/decorators/module.decorator.d.mts +42 -0
  75. package/src/decorators/module.decorator.d.mts.map +1 -0
  76. package/src/decorators/module.decorator.mts +34 -0
  77. package/src/decorators/multipart.decorator.d.mts +54 -0
  78. package/src/decorators/multipart.decorator.d.mts.map +1 -0
  79. package/src/decorators/multipart.decorator.mts +41 -0
  80. package/src/decorators/stream.decorator.d.mts +42 -0
  81. package/src/decorators/stream.decorator.d.mts.map +1 -0
  82. package/src/decorators/stream.decorator.mts +33 -0
  83. package/src/decorators/use-guards.decorator.d.mts +33 -0
  84. package/src/decorators/use-guards.decorator.d.mts.map +1 -0
  85. package/src/decorators/use-guards.decorator.mts +29 -0
  86. package/src/exceptions/bad-request.exception.d.mts +26 -0
  87. package/src/exceptions/bad-request.exception.d.mts.map +1 -0
  88. package/src/exceptions/bad-request.exception.mts +21 -0
  89. package/src/exceptions/conflict.exception.d.mts +29 -0
  90. package/src/exceptions/conflict.exception.d.mts.map +1 -0
  91. package/src/exceptions/conflict.exception.mts +24 -0
  92. package/src/exceptions/forbidden.exception.d.mts +28 -0
  93. package/src/exceptions/forbidden.exception.d.mts.map +1 -0
  94. package/src/exceptions/forbidden.exception.mts +23 -0
  95. package/src/exceptions/http.exception.d.mts +33 -0
  96. package/src/exceptions/http.exception.d.mts.map +1 -0
  97. package/src/exceptions/http.exception.mts +26 -0
  98. package/src/exceptions/index.d.mts +8 -0
  99. package/src/exceptions/index.d.mts.map +1 -0
  100. package/src/exceptions/internal-server-error.exception.d.mts +31 -0
  101. package/src/exceptions/internal-server-error.exception.d.mts.map +1 -0
  102. package/src/exceptions/internal-server-error.exception.mts +26 -0
  103. package/src/exceptions/not-found.exception.d.mts +30 -0
  104. package/src/exceptions/not-found.exception.d.mts.map +1 -0
  105. package/src/exceptions/not-found.exception.mts +23 -0
  106. package/src/exceptions/unauthorized.exception.d.mts +28 -0
  107. package/src/exceptions/unauthorized.exception.d.mts.map +1 -0
  108. package/src/exceptions/unauthorized.exception.mts +23 -0
  109. package/src/factories/endpoint-adapter.factory.d.mts +6 -0
  110. package/src/factories/endpoint-adapter.factory.d.mts.map +1 -0
  111. package/src/factories/http-adapter.factory.d.mts +6 -0
  112. package/src/factories/http-adapter.factory.d.mts.map +1 -0
  113. package/src/factories/index.d.mts +8 -0
  114. package/src/factories/index.d.mts.map +1 -0
  115. package/src/factories/multipart-adapter.factory.d.mts +6 -0
  116. package/src/factories/multipart-adapter.factory.d.mts.map +1 -0
  117. package/src/factories/reply.factory.d.mts +6 -0
  118. package/src/factories/reply.factory.d.mts.map +1 -0
  119. package/src/factories/request.factory.d.mts +6 -0
  120. package/src/factories/request.factory.d.mts.map +1 -0
  121. package/src/factories/stream-adapter.factory.d.mts +6 -0
  122. package/src/factories/stream-adapter.factory.d.mts.map +1 -0
  123. package/src/factories/xml-stream-adapter.factory.d.mts +6 -0
  124. package/src/factories/xml-stream-adapter.factory.d.mts.map +1 -0
  125. package/src/index.d.mts +15 -0
  126. package/src/index.d.mts.map +1 -0
  127. package/src/index.mts +1 -0
  128. package/src/interfaces/abstract-execution-context.inteface.d.mts +44 -0
  129. package/src/interfaces/abstract-execution-context.inteface.d.mts.map +1 -0
  130. package/src/interfaces/abstract-execution-context.inteface.mts +35 -0
  131. package/src/interfaces/abstract-http-adapter.interface.d.mts +15 -0
  132. package/src/interfaces/abstract-http-adapter.interface.d.mts.map +1 -0
  133. package/src/interfaces/abstract-http-cors-options.interface.d.mts +58 -0
  134. package/src/interfaces/abstract-http-cors-options.interface.d.mts.map +1 -0
  135. package/src/interfaces/abstract-http-handler-adapter.interface.d.mts +7 -0
  136. package/src/interfaces/abstract-http-handler-adapter.interface.d.mts.map +1 -0
  137. package/src/interfaces/abstract-http-handler-adapter.interface.mts +2 -2
  138. package/src/interfaces/abstract-http-listen-options.interface.d.mts +5 -0
  139. package/src/interfaces/abstract-http-listen-options.interface.d.mts.map +1 -0
  140. package/src/interfaces/can-activate.d.mts +36 -0
  141. package/src/interfaces/can-activate.d.mts.map +1 -0
  142. package/src/interfaces/can-activate.mts +31 -0
  143. package/src/interfaces/http-header.d.mts +10 -0
  144. package/src/interfaces/http-header.d.mts.map +1 -0
  145. package/src/interfaces/index.d.mts +9 -0
  146. package/src/interfaces/index.d.mts.map +1 -0
  147. package/src/interfaces/navios-module.d.mts +29 -0
  148. package/src/interfaces/navios-module.d.mts.map +1 -0
  149. package/src/interfaces/navios-module.mts +25 -0
  150. package/src/legacy-compat/__type-tests__/legacy-decorators.spec-d.mts +420 -0
  151. package/src/legacy-compat/__type-tests__/tsconfig.json +15 -0
  152. package/src/legacy-compat/context-compat.d.mts +19 -0
  153. package/src/legacy-compat/context-compat.d.mts.map +1 -0
  154. package/src/legacy-compat/context-compat.mts +93 -0
  155. package/src/legacy-compat/decorators/controller.decorator.d.mts +21 -0
  156. package/src/legacy-compat/decorators/controller.decorator.d.mts.map +1 -0
  157. package/src/legacy-compat/decorators/controller.decorator.mts +31 -0
  158. package/src/legacy-compat/decorators/endpoint.decorator.d.mts +33 -0
  159. package/src/legacy-compat/decorators/endpoint.decorator.d.mts.map +1 -0
  160. package/src/legacy-compat/decorators/endpoint.decorator.mts +99 -0
  161. package/src/legacy-compat/decorators/header.decorator.d.mts +24 -0
  162. package/src/legacy-compat/decorators/header.decorator.d.mts.map +1 -0
  163. package/src/legacy-compat/decorators/header.decorator.mts +42 -0
  164. package/src/legacy-compat/decorators/http-code.decorator.d.mts +22 -0
  165. package/src/legacy-compat/decorators/http-code.decorator.d.mts.map +1 -0
  166. package/src/legacy-compat/decorators/http-code.decorator.mts +38 -0
  167. package/src/legacy-compat/decorators/index.d.mts +9 -0
  168. package/src/legacy-compat/decorators/index.d.mts.map +1 -0
  169. package/src/legacy-compat/decorators/index.mts +9 -0
  170. package/src/legacy-compat/decorators/module.decorator.d.mts +22 -0
  171. package/src/legacy-compat/decorators/module.decorator.d.mts.map +1 -0
  172. package/src/legacy-compat/decorators/module.decorator.mts +37 -0
  173. package/src/legacy-compat/decorators/multipart.decorator.d.mts +34 -0
  174. package/src/legacy-compat/decorators/multipart.decorator.d.mts.map +1 -0
  175. package/src/legacy-compat/decorators/multipart.decorator.mts +93 -0
  176. package/src/legacy-compat/decorators/stream.decorator.d.mts +34 -0
  177. package/src/legacy-compat/decorators/stream.decorator.d.mts.map +1 -0
  178. package/src/legacy-compat/decorators/stream.decorator.mts +76 -0
  179. package/src/legacy-compat/decorators/use-guards.decorator.d.mts +29 -0
  180. package/src/legacy-compat/decorators/use-guards.decorator.d.mts.map +1 -0
  181. package/src/legacy-compat/decorators/use-guards.decorator.mts +80 -0
  182. package/src/legacy-compat/index.d.mts +19 -0
  183. package/src/legacy-compat/index.d.mts.map +1 -0
  184. package/src/legacy-compat/index.mts +40 -0
  185. package/src/logger/console-logger.service.d.mts +196 -0
  186. package/src/logger/console-logger.service.d.mts.map +1 -0
  187. package/src/logger/console-logger.service.mts +15 -2
  188. package/src/logger/index.d.mts +7 -0
  189. package/src/logger/index.d.mts.map +1 -0
  190. package/src/logger/log-levels.d.mts +14 -0
  191. package/src/logger/log-levels.d.mts.map +1 -0
  192. package/src/logger/log-levels.mts +9 -0
  193. package/src/logger/logger-service.interface.d.mts +36 -0
  194. package/src/logger/logger-service.interface.d.mts.map +1 -0
  195. package/src/logger/logger.service.d.mts +57 -0
  196. package/src/logger/logger.service.d.mts.map +1 -0
  197. package/src/logger/logger.service.mts +19 -0
  198. package/src/logger/logger.tokens.d.mts +36 -0
  199. package/src/logger/logger.tokens.d.mts.map +1 -0
  200. package/src/logger/logger.tokens.mts +23 -0
  201. package/src/logger/utils/cli-colors.util.d.mts +10 -0
  202. package/src/logger/utils/cli-colors.util.d.mts.map +1 -0
  203. package/src/logger/utils/filter-log-levelts.util.d.mts +6 -0
  204. package/src/logger/utils/filter-log-levelts.util.d.mts.map +1 -0
  205. package/src/logger/utils/index.d.mts +6 -0
  206. package/src/logger/utils/index.d.mts.map +1 -0
  207. package/src/logger/utils/is-log-level-enabled.d.mts +8 -0
  208. package/src/logger/utils/is-log-level-enabled.d.mts.map +1 -0
  209. package/src/logger/utils/is-log-level.util.d.mts +6 -0
  210. package/src/logger/utils/is-log-level.util.d.mts.map +1 -0
  211. package/src/logger/utils/shared.utils.d.mts +14 -0
  212. package/src/logger/utils/shared.utils.d.mts.map +1 -0
  213. package/src/metadata/controller.metadata.d.mts +13 -0
  214. package/src/metadata/controller.metadata.d.mts.map +1 -0
  215. package/src/metadata/handler.metadata.d.mts +18 -0
  216. package/src/metadata/handler.metadata.d.mts.map +1 -0
  217. package/src/metadata/index.d.mts +4 -0
  218. package/src/metadata/index.d.mts.map +1 -0
  219. package/src/metadata/module.metadata.d.mts +13 -0
  220. package/src/metadata/module.metadata.d.mts.map +1 -0
  221. package/src/navios.application.d.mts +210 -0
  222. package/src/navios.application.d.mts.map +1 -0
  223. package/src/navios.application.mts +176 -2
  224. package/src/navios.environment.d.mts +11 -0
  225. package/src/navios.environment.d.mts.map +1 -0
  226. package/src/navios.factory.d.mts +68 -0
  227. package/src/navios.factory.d.mts.map +1 -0
  228. package/src/navios.factory.mts +59 -1
  229. package/src/services/guard-runner.service.d.mts +10 -0
  230. package/src/services/guard-runner.service.d.mts.map +1 -0
  231. package/src/services/guard-runner.service.mts +12 -11
  232. package/src/services/index.d.mts +3 -0
  233. package/src/services/index.d.mts.map +1 -0
  234. package/src/services/module-loader.service.d.mts +17 -0
  235. package/src/services/module-loader.service.d.mts.map +1 -0
  236. package/src/services/module-loader.service.mts +16 -11
  237. package/src/stores/index.d.mts +2 -0
  238. package/src/stores/index.d.mts.map +1 -0
  239. package/src/stores/index.mts +1 -0
  240. package/src/stores/request-id.store.d.mts +37 -0
  241. package/src/stores/request-id.store.d.mts.map +1 -0
  242. package/src/stores/request-id.store.mts +43 -0
  243. package/src/testing/index.mts +2 -0
  244. package/src/testing/testing-module.mts +231 -0
  245. package/src/tokens/endpoint-adapter.token.d.mts +4 -0
  246. package/src/tokens/endpoint-adapter.token.d.mts.map +1 -0
  247. package/src/tokens/execution-context.token.d.mts +5 -0
  248. package/src/tokens/execution-context.token.d.mts.map +1 -0
  249. package/src/tokens/http-adapter.token.d.mts +4 -0
  250. package/src/tokens/http-adapter.token.d.mts.map +1 -0
  251. package/src/tokens/index.d.mts +9 -0
  252. package/src/tokens/index.d.mts.map +1 -0
  253. package/src/tokens/multipart-adapter.token.d.mts +4 -0
  254. package/src/tokens/multipart-adapter.token.d.mts.map +1 -0
  255. package/src/tokens/reply.token.d.mts +3 -0
  256. package/src/tokens/reply.token.d.mts.map +1 -0
  257. package/src/tokens/request.token.d.mts +3 -0
  258. package/src/tokens/request.token.d.mts.map +1 -0
  259. package/src/tokens/stream-adapter.token.d.mts +4 -0
  260. package/src/tokens/stream-adapter.token.d.mts.map +1 -0
  261. package/src/tokens/xml-stream-adapter.token.d.mts +4 -0
  262. package/src/tokens/xml-stream-adapter.token.d.mts.map +1 -0
  263. package/tsconfig.lib.json +1 -1
  264. package/tsconfig.spec.json +3 -0
  265. package/tsdown.config.mts +35 -0
  266. package/vitest.config.mts +6 -0
  267. package/lib/_tsup-dts-rollup.d.mts +0 -1365
  268. package/lib/_tsup-dts-rollup.d.ts +0 -1365
  269. package/lib/index.d.ts +0 -190
  270. package/lib/index.js +0 -1540
  271. package/lib/index.js.map +0 -1
  272. package/lib/index.mjs.map +0 -1
  273. package/tsup.config.mts +0 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-guards.decorator-DdvUhB03.cjs","names":["EndpointMetadataKey","Symbol","getAllEndpointMetadata","context","metadata","Set","Error","getEndpointMetadata","target","endpointMetadata","Array","from","find","item","classMethod","name","newMetadata","url","successStatusCode","adapterToken","headers","httpMethod","config","guards","customAttributes","Map","add","getAllEndpointMetadata","ControllerMetadataKey","Symbol","getControllerMetadata","target","context","metadata","endpointsMetadata","newMetadata","endpoints","guards","Set","customAttributes","Map","Error","extractControllerMetadata","hasControllerMetadata","ModuleMetadataKey","Symbol","getModuleMetadata","target","context","metadata","newMetadata","controllers","Set","imports","guards","customAttributes","Map","Error","extractModuleMetadata","name","hasModuleMetadata","Injectable","InjectableScope","InjectionToken","getControllerMetadata","Controller","guards","target","context","kind","Error","token","create","metadata","controllerMetadata","guard","Array","from","reverse","add","scope","Request","InjectionToken","EndpointAdapterToken","create","InjectionToken","ExecutionContextInjectionToken","ExecutionContext","create","InjectionToken","HttpAdapterToken","create","InjectionToken","MultipartAdapterToken","create","InjectionToken","Reply","create","InjectionToken","Request","create","InjectionToken","StreamAdapterToken","create","InjectionToken","XmlStreamAdapterToken","create","getEndpointMetadata","EndpointAdapterToken","Endpoint","endpoint","target","context","kind","Error","config","metadata","endpointMetadata","url","method","adapterToken","classMethod","name","httpMethod","getEndpointMetadata","Header","name","value","target","context","kind","Error","metadata","headers","getEndpointMetadata","HttpCode","code","target","context","kind","Error","metadata","successStatusCode","Injectable","InjectableScope","InjectionToken","getModuleMetadata","Module","controllers","imports","guards","target","context","kind","Error","token","create","moduleMetadata","controller","add","importedModule","guard","Array","from","reverse","scope","Singleton","getEndpointMetadata","MultipartAdapterToken","Multipart","endpoint","target","context","Error","kind","config","metadata","endpointMetadata","url","method","adapterToken","classMethod","name","httpMethod","getEndpointMetadata","StreamAdapterToken","Stream","endpoint","target","context","Error","kind","config","metadata","endpointMetadata","url","method","adapterToken","classMethod","name","httpMethod","getControllerMetadata","getEndpointMetadata","UseGuards","guards","target","context","kind","controllerMetadata","guard","reverse","add","endpointMetadata","Error"],"sources":["../src/metadata/handler.metadata.mts","../src/metadata/controller.metadata.mts","../src/metadata/module.metadata.mts","../src/decorators/controller.decorator.mts","../src/tokens/endpoint-adapter.token.mts","../src/tokens/execution-context.token.mts","../src/tokens/http-adapter.token.mts","../src/tokens/multipart-adapter.token.mts","../src/tokens/reply.token.mts","../src/tokens/request.token.mts","../src/tokens/stream-adapter.token.mts","../src/tokens/xml-stream-adapter.token.mts","../src/decorators/endpoint.decorator.mts","../src/decorators/header.decorator.mts","../src/decorators/http-code.decorator.mts","../src/decorators/module.decorator.mts","../src/decorators/multipart.decorator.mts","../src/decorators/stream.decorator.mts","../src/decorators/use-guards.decorator.mts"],"sourcesContent":["import type { HttpMethod } from '@navios/builder'\nimport type { ClassTypeWithInstance, InjectionToken } from '@navios/di'\n\nimport type {\n AbstractHttpHandlerAdapterInterface,\n CanActivate,\n HttpHeader,\n} from '../interfaces/index.mjs'\n\nexport const EndpointMetadataKey = Symbol('EndpointMetadataKey')\n\nexport interface HandlerMetadata<Config = null> {\n classMethod: string\n url: string\n successStatusCode: number\n adapterToken:\n | InjectionToken<AbstractHttpHandlerAdapterInterface, undefined>\n | ClassTypeWithInstance<AbstractHttpHandlerAdapterInterface>\n | null\n headers: Partial<Record<HttpHeader, number | string | string[] | undefined>>\n httpMethod: HttpMethod\n config: Config\n guards: Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n >\n customAttributes: Map<string | symbol, any>\n}\n\nexport function getAllEndpointMetadata(\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n): Set<HandlerMetadata<any>> {\n if (context.metadata) {\n const metadata = context.metadata[EndpointMetadataKey] as\n | Set<HandlerMetadata>\n | undefined\n if (metadata) {\n return metadata\n } else {\n context.metadata[EndpointMetadataKey] = new Set<HandlerMetadata<any>>()\n return context.metadata[EndpointMetadataKey] as Set<HandlerMetadata<any>>\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n\nexport function getEndpointMetadata<Config = any>(\n target: Function,\n context: ClassMethodDecoratorContext,\n): HandlerMetadata<Config> {\n if (context.metadata) {\n const metadata = getAllEndpointMetadata(context)\n if (metadata) {\n const endpointMetadata = Array.from(metadata).find(\n (item) => item.classMethod === target.name,\n )\n if (endpointMetadata) {\n return endpointMetadata\n } else {\n const newMetadata: HandlerMetadata<Config> = {\n classMethod: target.name,\n url: '',\n successStatusCode: 200,\n adapterToken: null,\n headers: {},\n httpMethod: 'GET',\n // @ts-expect-error We are using a generic type here\n config: null,\n guards: new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >(),\n customAttributes: new Map<string | symbol, any>(),\n }\n metadata.add(newMetadata)\n return newMetadata\n }\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n","import type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '@navios/di'\n\nimport type { CanActivate } from '../interfaces/index.mjs'\nimport type { HandlerMetadata } from './handler.metadata.mjs'\n\nimport { getAllEndpointMetadata } from './handler.metadata.mjs'\n\nexport const ControllerMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ControllerMetadata {\n endpoints: Set<HandlerMetadata>\n guards: Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n >\n customAttributes: Map<string | symbol, any>\n}\n\nexport function getControllerMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ControllerMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ControllerMetadataKey] as\n | ControllerMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const endpointsMetadata = getAllEndpointMetadata(context)\n const newMetadata: ControllerMetadata = {\n endpoints: endpointsMetadata,\n guards: new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >(),\n customAttributes: new Map<string | symbol, any>(),\n }\n context.metadata[ControllerMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ControllerMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n\nexport function extractControllerMetadata(\n target: ClassType,\n): ControllerMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ControllerMetadataKey] as\n | ControllerMetadata\n | undefined\n if (!metadata) {\n throw new Error(\n '[Navios] Controller metadata not found. Make sure to use @Controller decorator.',\n )\n }\n return metadata\n}\n\nexport function hasControllerMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ControllerMetadataKey] as\n | ControllerMetadata\n | undefined\n return !!metadata\n}\n","import type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '@navios/di'\n\nimport type { CanActivate } from '../index.mjs'\n\nexport const ModuleMetadataKey = Symbol('ControllerMetadataKey')\n\nexport interface ModuleMetadata {\n controllers: Set<ClassType>\n imports: Set<ClassType>\n guards: Set<\n ClassTypeWithInstance<CanActivate> | InjectionToken<CanActivate, undefined>\n >\n customAttributes: Map<string | symbol, any>\n}\n\nexport function getModuleMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n): ModuleMetadata {\n if (context.metadata) {\n const metadata = context.metadata[ModuleMetadataKey] as\n | ModuleMetadata\n | undefined\n if (metadata) {\n return metadata\n } else {\n const newMetadata: ModuleMetadata = {\n controllers: new Set<ClassType>(),\n imports: new Set<ClassType>(),\n guards: new Set<\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n >(),\n customAttributes: new Map<string | symbol, any>(),\n }\n context.metadata[ModuleMetadataKey] = newMetadata\n // @ts-expect-error We add a custom metadata key to the target\n target[ModuleMetadataKey] = newMetadata\n return newMetadata\n }\n }\n throw new Error('[Navios] Wrong environment.')\n}\n\nexport function extractModuleMetadata(target: ClassType): ModuleMetadata {\n // @ts-expect-error We add a custom metadata key to the target\n const metadata = target[ModuleMetadataKey] as ModuleMetadata | undefined\n if (!metadata) {\n throw new Error(\n `[Navios] Module metadata not found for ${target.name}. Make sure to use @Module decorator.`,\n )\n }\n return metadata\n}\n\nexport function hasModuleMetadata(target: ClassType): boolean {\n // @ts-expect-error We add a custom metadata key to the target\n return !!target[ModuleMetadataKey]\n}\n","import type { ClassType } from '@navios/di'\n\nimport { Injectable, InjectableScope, InjectionToken } from '@navios/di'\n\nimport { getControllerMetadata } from '../metadata/index.mjs'\n\n/**\n * Options for configuring a Navios controller.\n */\nexport interface ControllerOptions {\n /**\n * Guards to apply to all endpoints in this controller.\n * Guards are executed in reverse order (last guard first).\n */\n guards?: ClassType[] | Set<ClassType>\n}\n\n/**\n * Decorator that marks a class as a Navios controller.\n * \n * Controllers handle HTTP requests and define endpoints.\n * They are request-scoped by default, meaning a new instance is created for each request.\n * \n * @param options - Controller configuration options\n * @returns A class decorator\n * \n * @example\n * ```typescript\n * @Controller({ guards: [AuthGuard] })\n * export class UserController {\n * @Endpoint(getUserEndpoint)\n * async getUser(request: EndpointParams<typeof getUserEndpoint>) {\n * // Handle request\n * }\n * }\n * ```\n */\nexport function Controller({ guards }: ControllerOptions = {}) {\n return function (target: ClassType, context: ClassDecoratorContext) {\n if (context.kind !== 'class') {\n throw new Error(\n '[Navios] @Controller decorator can only be used on classes.',\n )\n }\n const token = InjectionToken.create(target)\n if (context.metadata) {\n const controllerMetadata = getControllerMetadata(target, context)\n if (guards) {\n for (const guard of Array.from(guards).reverse()) {\n controllerMetadata.guards.add(guard)\n }\n }\n }\n return Injectable({\n token,\n scope: InjectableScope.Request,\n })(target, context)\n }\n}\n","import { InjectionToken } from '@navios/di'\n\nimport type { AbstractHttpHandlerAdapterInterface } from '../interfaces/index.mjs'\n\nexport const EndpointAdapterToken =\n InjectionToken.create<AbstractHttpHandlerAdapterInterface>(\n 'EndpointAdapterToken',\n )\n","import { InjectionToken } from '@navios/di'\n\nimport type { AbstractExecutionContext } from '../interfaces/index.mjs'\n\nexport const ExecutionContextInjectionToken = 'ExecutionContextInjectionToken'\n\nexport const ExecutionContext = InjectionToken.create<AbstractExecutionContext>(\n ExecutionContextInjectionToken,\n)\n","import { InjectionToken } from '@navios/di'\n\nimport type { AbstractHttpAdapterInterface } from '../interfaces/index.mjs'\n\nexport const HttpAdapterToken =\n InjectionToken.create<AbstractHttpAdapterInterface<any, any, any, any>>(\n 'HttpAdapterToken',\n )\n","import { InjectionToken } from '@navios/di'\n\nimport type { AbstractHttpHandlerAdapterInterface } from '../interfaces/index.mjs'\n\nexport const MultipartAdapterToken =\n InjectionToken.create<AbstractHttpHandlerAdapterInterface>(\n 'MultipartAdapterToken',\n )\n","import { InjectionToken } from '@navios/di'\n\nexport const Reply = InjectionToken.create<any>('ReplyToken')\n","import { InjectionToken } from '@navios/di'\n\nexport const Request = InjectionToken.create<any>('RequestToken')\n","import { InjectionToken } from '@navios/di'\n\nimport type { AbstractHttpHandlerAdapterInterface } from '../interfaces/index.mjs'\n\nexport const StreamAdapterToken =\n InjectionToken.create<AbstractHttpHandlerAdapterInterface>(\n 'StreamAdapterToken',\n )\n","import { InjectionToken } from '@navios/di'\n\nimport type { AbstractHttpHandlerAdapterInterface } from '../interfaces/index.mjs'\n\nexport const XmlStreamAdapterToken =\n InjectionToken.create<AbstractHttpHandlerAdapterInterface>(\n 'XmlStreamAdapterToken',\n )\n","import type {\n BaseEndpointConfig,\n EndpointFunctionArgs,\n HttpMethod,\n Util_FlatObject,\n} from '@navios/builder'\nimport type { z, ZodType } from 'zod/v4'\n\nimport { ZodDiscriminatedUnion } from 'zod/v4'\n\nimport { getEndpointMetadata } from '../metadata/index.mjs'\nimport { EndpointAdapterToken } from '../tokens/index.mjs'\n\n/**\n * Extracts the typed parameters for an endpoint handler function.\n *\n * This utility type extracts URL parameters, query parameters, and request body\n * from an endpoint declaration and flattens them into a single object.\n *\n * @typeParam EndpointDeclaration - The endpoint declaration from @navios/builder\n *\n * @example\n * ```typescript\n * const getUserEndpoint = api.declareEndpoint({\n * method: 'get',\n * url: '/users/$userId',\n * querySchema: z.object({ include: z.string().optional() }),\n * responseSchema: z.object({ id: z.string(), name: z.string() }),\n * })\n *\n * @Endpoint(getUserEndpoint)\n * async getUser(request: EndpointParams<typeof getUserEndpoint>) {\n * // request.urlParams.userId is typed as string\n * // request.query.include is typed as string | undefined\n * }\n * ```\n */\nexport type EndpointParams<\n EndpointDeclaration extends {\n config: BaseEndpointConfig<any, any, any, any, any>\n },\n Url extends string = EndpointDeclaration['config']['url'],\n QuerySchema = EndpointDeclaration['config']['querySchema'],\n> = QuerySchema extends ZodType\n ? EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? Util_FlatObject<\n EndpointFunctionArgs<\n Url,\n QuerySchema,\n EndpointDeclaration['config']['requestSchema'],\n true\n >\n >\n : Util_FlatObject<EndpointFunctionArgs<Url, QuerySchema, undefined, true>>\n : EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? Util_FlatObject<\n EndpointFunctionArgs<\n Url,\n undefined,\n EndpointDeclaration['config']['requestSchema'],\n true\n >\n >\n : Util_FlatObject<EndpointFunctionArgs<Url, undefined, undefined, true>>\n\n/**\n * Extracts the typed return value for an endpoint handler function.\n *\n * This utility type extracts the response schema from an endpoint declaration\n * and returns the appropriate Promise type.\n *\n * @typeParam EndpointDeclaration - The endpoint declaration from @navios/builder\n *\n * @example\n * ```typescript\n * const getUserEndpoint = api.declareEndpoint({\n * method: 'get',\n * url: '/users/$userId',\n * responseSchema: z.object({ id: z.string(), name: z.string() }),\n * })\n *\n * @Endpoint(getUserEndpoint)\n * async getUser(request: EndpointParams<typeof getUserEndpoint>): EndpointResult<typeof getUserEndpoint> {\n * return { id: '1', name: 'John' } // Type-checked against responseSchema\n * }\n * ```\n */\nexport type EndpointResult<\n EndpointDeclaration extends {\n config: BaseEndpointConfig<any, any, any, any, any>\n },\n> =\n EndpointDeclaration['config']['responseSchema'] extends ZodDiscriminatedUnion<\n infer Options\n >\n ? Promise<z.input<Options[number]>>\n : Promise<z.input<EndpointDeclaration['config']['responseSchema']>>\n\n/**\n * Decorator that marks a method as an HTTP endpoint.\n *\n * The endpoint must be defined using @navios/builder's `declareEndpoint` method.\n * This ensures type safety and consistency between client and server.\n *\n * @param endpoint - The endpoint declaration from @navios/builder\n * @returns A method decorator\n *\n * @example\n * ```typescript\n * import { builder } from '@navios/builder'\n *\n * const api = builder()\n * const getUserEndpoint = api.declareEndpoint({\n * method: 'get',\n * url: '/users/$userId',\n * responseSchema: z.object({ id: z.string(), name: z.string() }),\n * })\n *\n * @Controller()\n * export class UserController {\n * @Endpoint(getUserEndpoint)\n * async getUser(request: EndpointParams<typeof getUserEndpoint>) {\n * const { userId } = request.urlParams\n * return { id: userId, name: 'John' }\n * }\n * }\n * ```\n */\nexport function Endpoint<\n Method extends HttpMethod = HttpMethod,\n Url extends string = string,\n QuerySchema = undefined,\n ResponseSchema extends ZodType = ZodType,\n RequestSchema = ZodType,\n>(endpoint: {\n config: BaseEndpointConfig<\n Method,\n Url,\n QuerySchema,\n ResponseSchema,\n RequestSchema\n >\n}) {\n return (\n target: (\n params: QuerySchema extends ZodType\n ? RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, QuerySchema, RequestSchema, true>\n : EndpointFunctionArgs<Url, QuerySchema, undefined, true>\n : RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, undefined, RequestSchema, true>\n : EndpointFunctionArgs<Url, undefined, undefined, true>,\n ) => Promise<z.input<ResponseSchema>>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on methods.',\n )\n }\n const config = endpoint.config\n if (context.metadata) {\n let endpointMetadata = getEndpointMetadata<BaseEndpointConfig>(\n target,\n context,\n )\n if (endpointMetadata.config && endpointMetadata.config.url) {\n throw new Error(\n `[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`,\n )\n }\n // @ts-expect-error We don't need to set correctly in the metadata\n endpointMetadata.config = config\n endpointMetadata.adapterToken = EndpointAdapterToken\n endpointMetadata.classMethod = target.name\n endpointMetadata.httpMethod = config.method\n endpointMetadata.url = config.url\n }\n return target\n }\n}\n","import type { HttpHeader } from '../interfaces/index.mjs'\n\nimport { getEndpointMetadata } from '../metadata/index.mjs'\n\n/**\n * Decorator that sets a custom HTTP response header for an endpoint.\n * \n * @param name - The header name (e.g., 'Content-Type', 'Cache-Control')\n * @param value - The header value (string, number, or array of strings)\n * @returns A method decorator\n * \n * @example\n * ```typescript\n * @Controller()\n * export class UserController {\n * @Endpoint(getUserEndpoint)\n * @Header('Cache-Control', 'max-age=3600')\n * async getUser() {\n * return { id: '1', name: 'John' }\n * }\n * }\n * ```\n */\nexport function Header(name: HttpHeader, value: string | number | string[]) {\n return <T extends Function>(\n target: T,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error('[Navios] Header decorator can only be used on methods.')\n }\n const metadata = getEndpointMetadata(target, context)\n\n metadata.headers[name] = value\n\n return target\n }\n}\n","import { getEndpointMetadata } from '../metadata/index.mjs'\n\n/**\n * Decorator that sets a custom HTTP status code for successful responses.\n * \n * By default, endpoints return 200 OK. Use this decorator to return a different status code.\n * \n * @param code - The HTTP status code to return (e.g., 201, 204, 202)\n * @returns A method decorator\n * \n * @example\n * ```typescript\n * @Controller()\n * export class UserController {\n * @Endpoint(createUserEndpoint)\n * @HttpCode(201)\n * async createUser() {\n * return { id: '1', name: 'John' }\n * }\n * }\n * ```\n */\nexport function HttpCode(code: number) {\n return <T extends Function>(\n target: T,\n context: ClassMethodDecoratorContext,\n ) => {\n if (context.kind !== 'method') {\n throw new Error(\n '[Navios] HttpCode decorator can only be used on methods.',\n )\n }\n const metadata = getEndpointMetadata(target, context)\n metadata.successStatusCode = code\n\n return target\n }\n}\n","import type { ClassType } from '@navios/di'\n\nimport { Injectable, InjectableScope, InjectionToken } from '@navios/di'\n\nimport { getModuleMetadata } from '../metadata/index.mjs'\n\n/**\n * Options for configuring a Navios module.\n */\nexport interface ModuleOptions {\n /**\n * Controllers to register in this module.\n * Controllers handle HTTP requests and define endpoints.\n */\n controllers?: ClassType[] | Set<ClassType>\n /**\n * Other modules to import into this module.\n * Imported modules' controllers and services become available.\n */\n imports?: ClassType[] | Set<ClassType>\n /**\n * Guards to apply to all controllers in this module.\n * Guards are executed in reverse order (last guard first).\n */\n guards?: ClassType[] | Set<ClassType>\n}\n\n/**\n * Decorator that marks a class as a Navios module.\n * \n * Modules are the basic building blocks of a Navios application.\n * They organize controllers, services, and other modules into logical units.\n * \n * @param options - Module configuration options\n * @returns A class decorator\n * \n * @example\n * ```typescript\n * @Module({\n * controllers: [UserController, AuthController],\n * imports: [DatabaseModule],\n * guards: [AuthGuard],\n * })\n * export class AppModule {}\n * ```\n */\nexport function Module(\n { controllers = [], imports = [], guards = [] }: ModuleOptions = {\n controllers: [],\n imports: [],\n guards: [],\n },\n) {\n return (target: ClassType, context: ClassDecoratorContext) => {\n if (context.kind !== 'class') {\n throw new Error('[Navios] @Module decorator can only be used on classes.')\n }\n // Register the module in the service locator\n const token = InjectionToken.create(target)\n const moduleMetadata = getModuleMetadata(target, context)\n for (const controller of controllers) {\n moduleMetadata.controllers.add(controller)\n }\n for (const importedModule of imports) {\n moduleMetadata.imports.add(importedModule)\n }\n for (const guard of Array.from(guards).reverse()) {\n moduleMetadata.guards.add(guard)\n }\n\n return Injectable({\n token,\n scope: InjectableScope.Singleton,\n })(target, context)\n }\n}\n","import type {\n BaseEndpointConfig,\n EndpointFunctionArgs,\n HttpMethod,\n Util_FlatObject,\n} from '@navios/builder'\nimport type { z, ZodObject, ZodType } from 'zod/v4'\n\nimport { ZodDiscriminatedUnion } from 'zod/v4'\n\nimport { getEndpointMetadata } from '../metadata/index.mjs'\nimport { MultipartAdapterToken } from '../tokens/index.mjs'\n\n/**\n * Extracts the typed parameters for a multipart endpoint handler function.\n * \n * Similar to `EndpointParams`, but specifically for multipart/form-data endpoints.\n * \n * @typeParam EndpointDeclaration - The endpoint declaration from @navios/builder\n */\nexport type MultipartParams<\n EndpointDeclaration extends {\n config: BaseEndpointConfig<any, any, any, any, any>\n },\n Url extends string = EndpointDeclaration['config']['url'],\n QuerySchema = EndpointDeclaration['config']['querySchema'],\n> = QuerySchema extends ZodObject\n ? EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? Util_FlatObject<\n EndpointFunctionArgs<\n Url,\n QuerySchema,\n EndpointDeclaration['config']['requestSchema'],\n true\n >\n >\n : Util_FlatObject<EndpointFunctionArgs<Url, QuerySchema, undefined, true>>\n : EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? Util_FlatObject<\n EndpointFunctionArgs<\n Url,\n undefined,\n EndpointDeclaration['config']['requestSchema'],\n true\n >\n >\n : Util_FlatObject<EndpointFunctionArgs<Url, undefined, undefined, true>>\n\n/**\n * Extracts the typed return value for a multipart endpoint handler function.\n * \n * @typeParam EndpointDeclaration - The endpoint declaration from @navios/builder\n */\nexport type MultipartResult<\n EndpointDeclaration extends {\n config: BaseEndpointConfig<any, any, any, any, any>\n },\n> =\n EndpointDeclaration['config']['responseSchema'] extends ZodDiscriminatedUnion<\n infer Options\n >\n ? Promise<z.input<Options[number]>>\n : Promise<z.input<EndpointDeclaration['config']['responseSchema']>>\n\n/**\n * Decorator that marks a method as a multipart/form-data endpoint.\n * \n * Use this decorator for endpoints that handle file uploads or form data.\n * The endpoint must be defined using @navios/builder's `declareMultipart` method.\n * \n * @param endpoint - The multipart endpoint declaration from @navios/builder\n * @returns A method decorator\n * \n * @example\n * ```typescript\n * const uploadFileEndpoint = api.declareMultipart({\n * method: 'post',\n * url: '/upload',\n * requestSchema: z.object({ file: z.instanceof(File) }),\n * responseSchema: z.object({ url: z.string() }),\n * })\n * \n * @Controller()\n * export class FileController {\n * @Multipart(uploadFileEndpoint)\n * async uploadFile(request: MultipartParams<typeof uploadFileEndpoint>) {\n * const { file } = request.data\n * // Handle file upload\n * return { url: 'https://example.com/file.jpg' }\n * }\n * }\n * ```\n */\nexport function Multipart<\n Method extends HttpMethod = HttpMethod,\n Url extends string = string,\n QuerySchema = undefined,\n ResponseSchema extends ZodType = ZodType,\n RequestSchema = ZodType,\n>(endpoint: {\n config: BaseEndpointConfig<\n Method,\n Url,\n QuerySchema,\n ResponseSchema,\n RequestSchema\n >\n}) {\n return (\n target: (\n params: QuerySchema extends ZodObject\n ? RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, QuerySchema, RequestSchema>\n : EndpointFunctionArgs<Url, QuerySchema, undefined>\n : RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, undefined, RequestSchema>\n : EndpointFunctionArgs<Url, undefined, undefined>,\n ) => Promise<z.input<ResponseSchema>>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (typeof target !== 'function') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on functions.',\n )\n }\n if (context.kind !== 'method') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on methods.',\n )\n }\n const config = endpoint.config\n if (context.metadata) {\n let endpointMetadata = getEndpointMetadata<BaseEndpointConfig>(\n target,\n context,\n )\n if (endpointMetadata.config && endpointMetadata.config.url) {\n throw new Error(\n `[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`,\n )\n }\n // @ts-expect-error We don't need to set correctly in the metadata\n endpointMetadata.config = config\n endpointMetadata.adapterToken = MultipartAdapterToken\n endpointMetadata.classMethod = target.name\n endpointMetadata.httpMethod = config.method\n endpointMetadata.url = config.url\n }\n return target\n }\n}\n","import type {\n BaseStreamConfig,\n EndpointFunctionArgs,\n HttpMethod,\n Util_FlatObject,\n} from '@navios/builder'\nimport type { ZodObject, ZodType } from 'zod/v4'\n\nimport { getEndpointMetadata } from '../metadata/index.mjs'\nimport { StreamAdapterToken } from '../tokens/index.mjs'\n\n/**\n * Extracts the typed parameters for a stream endpoint handler function.\n * \n * Similar to `EndpointParams`, but specifically for streaming endpoints.\n * \n * @typeParam EndpointDeclaration - The stream endpoint declaration from @navios/builder\n */\nexport type StreamParams<\n EndpointDeclaration extends {\n config: BaseStreamConfig<any, any, any, any>\n },\n Url extends string = EndpointDeclaration['config']['url'],\n QuerySchema = EndpointDeclaration['config']['querySchema'],\n> = QuerySchema extends ZodObject\n ? EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? Util_FlatObject<\n EndpointFunctionArgs<\n Url,\n QuerySchema,\n EndpointDeclaration['config']['requestSchema'],\n true\n >\n >\n : Util_FlatObject<EndpointFunctionArgs<Url, QuerySchema, undefined, true>>\n : EndpointDeclaration['config']['requestSchema'] extends ZodType\n ? Util_FlatObject<\n EndpointFunctionArgs<\n Url,\n undefined,\n EndpointDeclaration['config']['requestSchema'],\n true\n >\n >\n : Util_FlatObject<EndpointFunctionArgs<Url, undefined, undefined, true>>\n\n/**\n * Decorator that marks a method as a streaming endpoint.\n * \n * Use this decorator for endpoints that stream data (e.g., file downloads, SSE).\n * The endpoint must be defined using @navios/builder's `declareStream` method.\n * \n * @param endpoint - The stream endpoint declaration from @navios/builder\n * @returns A method decorator\n * \n * @example\n * ```typescript\n * const downloadFileEndpoint = api.declareStream({\n * method: 'get',\n * url: '/files/$fileId',\n * })\n * \n * @Controller()\n * export class FileController {\n * @Stream(downloadFileEndpoint)\n * async downloadFile(request: StreamParams<typeof downloadFileEndpoint>, reply: any) {\n * const { fileId } = request.urlParams\n * // Stream file data to reply\n * }\n * }\n * ```\n */\nexport function Stream<\n Method extends HttpMethod = HttpMethod,\n Url extends string = string,\n QuerySchema = undefined,\n RequestSchema = ZodType,\n>(endpoint: {\n config: BaseStreamConfig<Method, Url, QuerySchema, RequestSchema>\n}) {\n return (\n target: (\n params: QuerySchema extends ZodObject\n ? RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, QuerySchema, RequestSchema>\n : EndpointFunctionArgs<Url, QuerySchema, undefined>\n : RequestSchema extends ZodType\n ? EndpointFunctionArgs<Url, undefined, RequestSchema>\n : EndpointFunctionArgs<Url, undefined, undefined>,\n reply: any,\n ) => Promise<void>,\n context: ClassMethodDecoratorContext,\n ) => {\n if (typeof target !== 'function') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on functions.',\n )\n }\n if (context.kind !== 'method') {\n throw new Error(\n '[Navios] Endpoint decorator can only be used on methods.',\n )\n }\n const config = endpoint.config\n if (context.metadata) {\n let endpointMetadata = getEndpointMetadata<BaseStreamConfig>(\n target,\n context,\n )\n if (endpointMetadata.config && endpointMetadata.config.url) {\n throw new Error(\n `[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`,\n )\n }\n // @ts-expect-error We don't need to set correctly in the metadata\n endpointMetadata.config = config\n endpointMetadata.adapterToken = StreamAdapterToken\n endpointMetadata.classMethod = target.name\n endpointMetadata.httpMethod = config.method\n endpointMetadata.url = config.url\n }\n return target\n }\n}\n","import type {\n ClassType,\n ClassTypeWithInstance,\n InjectionToken,\n} from '@navios/di'\n\nimport type { CanActivate } from '../interfaces/index.mjs'\n\nimport {\n getControllerMetadata,\n getEndpointMetadata,\n} from '../metadata/index.mjs'\n\n/**\n * Decorator that applies guards to a controller or endpoint.\n * \n * Guards are used for authentication, authorization, and request validation.\n * They implement the `CanActivate` interface and are executed before the endpoint handler.\n * Guards can be applied at the module, controller, or endpoint level.\n * \n * @param guards - Guard classes or injection tokens to apply\n * @returns A class or method decorator\n * \n * @example\n * ```typescript\n * // Apply to a controller\n * @Controller()\n * @UseGuards(AuthGuard, RoleGuard)\n * export class UserController {\n * @Endpoint(getUserEndpoint)\n * async getUser() { }\n * }\n * \n * // Apply to a specific endpoint\n * @Controller()\n * export class UserController {\n * @Endpoint(getUserEndpoint)\n * @UseGuards(AuthGuard)\n * async getUser() { }\n * }\n * ```\n */\nexport function UseGuards(\n ...guards: (\n | ClassTypeWithInstance<CanActivate>\n | InjectionToken<CanActivate, undefined>\n )[]\n) {\n return function <T extends Function>(\n target: T,\n context: ClassMethodDecoratorContext | ClassDecoratorContext,\n ): T {\n if (context.kind === 'class') {\n const controllerMetadata = getControllerMetadata(\n target as unknown as ClassType,\n context,\n )\n for (const guard of guards.reverse()) {\n controllerMetadata.guards.add(guard)\n }\n } else if (context.kind === 'method') {\n const endpointMetadata = getEndpointMetadata(target, context)\n for (const guard of guards.reverse()) {\n endpointMetadata.guards.add(guard)\n }\n } else {\n throw new Error(\n '[Navios] @UseGuards decorator can only be used on classes or methods.',\n )\n }\n return target\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,454 @@
1
+ import { Injectable, InjectableScope, InjectionToken } from "@navios/di";
2
+
3
+ //#region src/metadata/handler.metadata.mts
4
+ const EndpointMetadataKey = Symbol("EndpointMetadataKey");
5
+ function getAllEndpointMetadata(context) {
6
+ if (context.metadata) {
7
+ const metadata = context.metadata[EndpointMetadataKey];
8
+ if (metadata) return metadata;
9
+ else {
10
+ context.metadata[EndpointMetadataKey] = /* @__PURE__ */ new Set();
11
+ return context.metadata[EndpointMetadataKey];
12
+ }
13
+ }
14
+ throw new Error("[Navios] Wrong environment.");
15
+ }
16
+ function getEndpointMetadata(target, context) {
17
+ if (context.metadata) {
18
+ const metadata = getAllEndpointMetadata(context);
19
+ if (metadata) {
20
+ const endpointMetadata = Array.from(metadata).find((item) => item.classMethod === target.name);
21
+ if (endpointMetadata) return endpointMetadata;
22
+ else {
23
+ const newMetadata = {
24
+ classMethod: target.name,
25
+ url: "",
26
+ successStatusCode: 200,
27
+ adapterToken: null,
28
+ headers: {},
29
+ httpMethod: "GET",
30
+ config: null,
31
+ guards: /* @__PURE__ */ new Set(),
32
+ customAttributes: /* @__PURE__ */ new Map()
33
+ };
34
+ metadata.add(newMetadata);
35
+ return newMetadata;
36
+ }
37
+ }
38
+ }
39
+ throw new Error("[Navios] Wrong environment.");
40
+ }
41
+
42
+ //#endregion
43
+ //#region src/metadata/controller.metadata.mts
44
+ const ControllerMetadataKey = Symbol("ControllerMetadataKey");
45
+ function getControllerMetadata(target, context) {
46
+ if (context.metadata) {
47
+ const metadata = context.metadata[ControllerMetadataKey];
48
+ if (metadata) return metadata;
49
+ else {
50
+ const newMetadata = {
51
+ endpoints: getAllEndpointMetadata(context),
52
+ guards: /* @__PURE__ */ new Set(),
53
+ customAttributes: /* @__PURE__ */ new Map()
54
+ };
55
+ context.metadata[ControllerMetadataKey] = newMetadata;
56
+ target[ControllerMetadataKey] = newMetadata;
57
+ return newMetadata;
58
+ }
59
+ }
60
+ throw new Error("[Navios] Wrong environment.");
61
+ }
62
+ function extractControllerMetadata(target) {
63
+ const metadata = target[ControllerMetadataKey];
64
+ if (!metadata) throw new Error("[Navios] Controller metadata not found. Make sure to use @Controller decorator.");
65
+ return metadata;
66
+ }
67
+ function hasControllerMetadata(target) {
68
+ return !!target[ControllerMetadataKey];
69
+ }
70
+
71
+ //#endregion
72
+ //#region src/metadata/module.metadata.mts
73
+ const ModuleMetadataKey = Symbol("ControllerMetadataKey");
74
+ function getModuleMetadata(target, context) {
75
+ if (context.metadata) {
76
+ const metadata = context.metadata[ModuleMetadataKey];
77
+ if (metadata) return metadata;
78
+ else {
79
+ const newMetadata = {
80
+ controllers: /* @__PURE__ */ new Set(),
81
+ imports: /* @__PURE__ */ new Set(),
82
+ guards: /* @__PURE__ */ new Set(),
83
+ customAttributes: /* @__PURE__ */ new Map()
84
+ };
85
+ context.metadata[ModuleMetadataKey] = newMetadata;
86
+ target[ModuleMetadataKey] = newMetadata;
87
+ return newMetadata;
88
+ }
89
+ }
90
+ throw new Error("[Navios] Wrong environment.");
91
+ }
92
+ function extractModuleMetadata(target) {
93
+ const metadata = target[ModuleMetadataKey];
94
+ if (!metadata) throw new Error(`[Navios] Module metadata not found for ${target.name}. Make sure to use @Module decorator.`);
95
+ return metadata;
96
+ }
97
+ function hasModuleMetadata(target) {
98
+ return !!target[ModuleMetadataKey];
99
+ }
100
+
101
+ //#endregion
102
+ //#region src/decorators/controller.decorator.mts
103
+ /**
104
+ * Decorator that marks a class as a Navios controller.
105
+ *
106
+ * Controllers handle HTTP requests and define endpoints.
107
+ * They are request-scoped by default, meaning a new instance is created for each request.
108
+ *
109
+ * @param options - Controller configuration options
110
+ * @returns A class decorator
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * @Controller({ guards: [AuthGuard] })
115
+ * export class UserController {
116
+ * @Endpoint(getUserEndpoint)
117
+ * async getUser(request: EndpointParams<typeof getUserEndpoint>) {
118
+ * // Handle request
119
+ * }
120
+ * }
121
+ * ```
122
+ */ function Controller({ guards } = {}) {
123
+ return function(target, context) {
124
+ if (context.kind !== "class") throw new Error("[Navios] @Controller decorator can only be used on classes.");
125
+ const token = InjectionToken.create(target);
126
+ if (context.metadata) {
127
+ const controllerMetadata = getControllerMetadata(target, context);
128
+ if (guards) for (const guard of Array.from(guards).reverse()) controllerMetadata.guards.add(guard);
129
+ }
130
+ return Injectable({
131
+ token,
132
+ scope: InjectableScope.Request
133
+ })(target, context);
134
+ };
135
+ }
136
+
137
+ //#endregion
138
+ //#region src/tokens/endpoint-adapter.token.mts
139
+ const EndpointAdapterToken = InjectionToken.create("EndpointAdapterToken");
140
+
141
+ //#endregion
142
+ //#region src/tokens/execution-context.token.mts
143
+ const ExecutionContextInjectionToken = "ExecutionContextInjectionToken";
144
+ const ExecutionContext = InjectionToken.create(ExecutionContextInjectionToken);
145
+
146
+ //#endregion
147
+ //#region src/tokens/http-adapter.token.mts
148
+ const HttpAdapterToken = InjectionToken.create("HttpAdapterToken");
149
+
150
+ //#endregion
151
+ //#region src/tokens/multipart-adapter.token.mts
152
+ const MultipartAdapterToken = InjectionToken.create("MultipartAdapterToken");
153
+
154
+ //#endregion
155
+ //#region src/tokens/reply.token.mts
156
+ const Reply = InjectionToken.create("ReplyToken");
157
+
158
+ //#endregion
159
+ //#region src/tokens/request.token.mts
160
+ const Request = InjectionToken.create("RequestToken");
161
+
162
+ //#endregion
163
+ //#region src/tokens/stream-adapter.token.mts
164
+ const StreamAdapterToken = InjectionToken.create("StreamAdapterToken");
165
+
166
+ //#endregion
167
+ //#region src/tokens/xml-stream-adapter.token.mts
168
+ const XmlStreamAdapterToken = InjectionToken.create("XmlStreamAdapterToken");
169
+
170
+ //#endregion
171
+ //#region src/decorators/endpoint.decorator.mts
172
+ /**
173
+ * Decorator that marks a method as an HTTP endpoint.
174
+ *
175
+ * The endpoint must be defined using @navios/builder's `declareEndpoint` method.
176
+ * This ensures type safety and consistency between client and server.
177
+ *
178
+ * @param endpoint - The endpoint declaration from @navios/builder
179
+ * @returns A method decorator
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * import { builder } from '@navios/builder'
184
+ *
185
+ * const api = builder()
186
+ * const getUserEndpoint = api.declareEndpoint({
187
+ * method: 'get',
188
+ * url: '/users/$userId',
189
+ * responseSchema: z.object({ id: z.string(), name: z.string() }),
190
+ * })
191
+ *
192
+ * @Controller()
193
+ * export class UserController {
194
+ * @Endpoint(getUserEndpoint)
195
+ * async getUser(request: EndpointParams<typeof getUserEndpoint>) {
196
+ * const { userId } = request.urlParams
197
+ * return { id: userId, name: 'John' }
198
+ * }
199
+ * }
200
+ * ```
201
+ */ function Endpoint(endpoint) {
202
+ return (target, context) => {
203
+ if (context.kind !== "method") throw new Error("[Navios] Endpoint decorator can only be used on methods.");
204
+ const config = endpoint.config;
205
+ if (context.metadata) {
206
+ let endpointMetadata = getEndpointMetadata(target, context);
207
+ if (endpointMetadata.config && endpointMetadata.config.url) throw new Error(`[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`);
208
+ endpointMetadata.config = config;
209
+ endpointMetadata.adapterToken = EndpointAdapterToken;
210
+ endpointMetadata.classMethod = target.name;
211
+ endpointMetadata.httpMethod = config.method;
212
+ endpointMetadata.url = config.url;
213
+ }
214
+ return target;
215
+ };
216
+ }
217
+
218
+ //#endregion
219
+ //#region src/decorators/header.decorator.mts
220
+ /**
221
+ * Decorator that sets a custom HTTP response header for an endpoint.
222
+ *
223
+ * @param name - The header name (e.g., 'Content-Type', 'Cache-Control')
224
+ * @param value - The header value (string, number, or array of strings)
225
+ * @returns A method decorator
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * @Controller()
230
+ * export class UserController {
231
+ * @Endpoint(getUserEndpoint)
232
+ * @Header('Cache-Control', 'max-age=3600')
233
+ * async getUser() {
234
+ * return { id: '1', name: 'John' }
235
+ * }
236
+ * }
237
+ * ```
238
+ */ function Header(name, value) {
239
+ return (target, context) => {
240
+ if (context.kind !== "method") throw new Error("[Navios] Header decorator can only be used on methods.");
241
+ const metadata = getEndpointMetadata(target, context);
242
+ metadata.headers[name] = value;
243
+ return target;
244
+ };
245
+ }
246
+
247
+ //#endregion
248
+ //#region src/decorators/http-code.decorator.mts
249
+ /**
250
+ * Decorator that sets a custom HTTP status code for successful responses.
251
+ *
252
+ * By default, endpoints return 200 OK. Use this decorator to return a different status code.
253
+ *
254
+ * @param code - The HTTP status code to return (e.g., 201, 204, 202)
255
+ * @returns A method decorator
256
+ *
257
+ * @example
258
+ * ```typescript
259
+ * @Controller()
260
+ * export class UserController {
261
+ * @Endpoint(createUserEndpoint)
262
+ * @HttpCode(201)
263
+ * async createUser() {
264
+ * return { id: '1', name: 'John' }
265
+ * }
266
+ * }
267
+ * ```
268
+ */ function HttpCode(code) {
269
+ return (target, context) => {
270
+ if (context.kind !== "method") throw new Error("[Navios] HttpCode decorator can only be used on methods.");
271
+ const metadata = getEndpointMetadata(target, context);
272
+ metadata.successStatusCode = code;
273
+ return target;
274
+ };
275
+ }
276
+
277
+ //#endregion
278
+ //#region src/decorators/module.decorator.mts
279
+ /**
280
+ * Decorator that marks a class as a Navios module.
281
+ *
282
+ * Modules are the basic building blocks of a Navios application.
283
+ * They organize controllers, services, and other modules into logical units.
284
+ *
285
+ * @param options - Module configuration options
286
+ * @returns A class decorator
287
+ *
288
+ * @example
289
+ * ```typescript
290
+ * @Module({
291
+ * controllers: [UserController, AuthController],
292
+ * imports: [DatabaseModule],
293
+ * guards: [AuthGuard],
294
+ * })
295
+ * export class AppModule {}
296
+ * ```
297
+ */ function Module({ controllers = [], imports = [], guards = [] } = {
298
+ controllers: [],
299
+ imports: [],
300
+ guards: []
301
+ }) {
302
+ return (target, context) => {
303
+ if (context.kind !== "class") throw new Error("[Navios] @Module decorator can only be used on classes.");
304
+ const token = InjectionToken.create(target);
305
+ const moduleMetadata = getModuleMetadata(target, context);
306
+ for (const controller of controllers) moduleMetadata.controllers.add(controller);
307
+ for (const importedModule of imports) moduleMetadata.imports.add(importedModule);
308
+ for (const guard of Array.from(guards).reverse()) moduleMetadata.guards.add(guard);
309
+ return Injectable({
310
+ token,
311
+ scope: InjectableScope.Singleton
312
+ })(target, context);
313
+ };
314
+ }
315
+
316
+ //#endregion
317
+ //#region src/decorators/multipart.decorator.mts
318
+ /**
319
+ * Decorator that marks a method as a multipart/form-data endpoint.
320
+ *
321
+ * Use this decorator for endpoints that handle file uploads or form data.
322
+ * The endpoint must be defined using @navios/builder's `declareMultipart` method.
323
+ *
324
+ * @param endpoint - The multipart endpoint declaration from @navios/builder
325
+ * @returns A method decorator
326
+ *
327
+ * @example
328
+ * ```typescript
329
+ * const uploadFileEndpoint = api.declareMultipart({
330
+ * method: 'post',
331
+ * url: '/upload',
332
+ * requestSchema: z.object({ file: z.instanceof(File) }),
333
+ * responseSchema: z.object({ url: z.string() }),
334
+ * })
335
+ *
336
+ * @Controller()
337
+ * export class FileController {
338
+ * @Multipart(uploadFileEndpoint)
339
+ * async uploadFile(request: MultipartParams<typeof uploadFileEndpoint>) {
340
+ * const { file } = request.data
341
+ * // Handle file upload
342
+ * return { url: 'https://example.com/file.jpg' }
343
+ * }
344
+ * }
345
+ * ```
346
+ */ function Multipart(endpoint) {
347
+ return (target, context) => {
348
+ if (typeof target !== "function") throw new Error("[Navios] Endpoint decorator can only be used on functions.");
349
+ if (context.kind !== "method") throw new Error("[Navios] Endpoint decorator can only be used on methods.");
350
+ const config = endpoint.config;
351
+ if (context.metadata) {
352
+ let endpointMetadata = getEndpointMetadata(target, context);
353
+ if (endpointMetadata.config && endpointMetadata.config.url) throw new Error(`[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`);
354
+ endpointMetadata.config = config;
355
+ endpointMetadata.adapterToken = MultipartAdapterToken;
356
+ endpointMetadata.classMethod = target.name;
357
+ endpointMetadata.httpMethod = config.method;
358
+ endpointMetadata.url = config.url;
359
+ }
360
+ return target;
361
+ };
362
+ }
363
+
364
+ //#endregion
365
+ //#region src/decorators/stream.decorator.mts
366
+ /**
367
+ * Decorator that marks a method as a streaming endpoint.
368
+ *
369
+ * Use this decorator for endpoints that stream data (e.g., file downloads, SSE).
370
+ * The endpoint must be defined using @navios/builder's `declareStream` method.
371
+ *
372
+ * @param endpoint - The stream endpoint declaration from @navios/builder
373
+ * @returns A method decorator
374
+ *
375
+ * @example
376
+ * ```typescript
377
+ * const downloadFileEndpoint = api.declareStream({
378
+ * method: 'get',
379
+ * url: '/files/$fileId',
380
+ * })
381
+ *
382
+ * @Controller()
383
+ * export class FileController {
384
+ * @Stream(downloadFileEndpoint)
385
+ * async downloadFile(request: StreamParams<typeof downloadFileEndpoint>, reply: any) {
386
+ * const { fileId } = request.urlParams
387
+ * // Stream file data to reply
388
+ * }
389
+ * }
390
+ * ```
391
+ */ function Stream(endpoint) {
392
+ return (target, context) => {
393
+ if (typeof target !== "function") throw new Error("[Navios] Endpoint decorator can only be used on functions.");
394
+ if (context.kind !== "method") throw new Error("[Navios] Endpoint decorator can only be used on methods.");
395
+ const config = endpoint.config;
396
+ if (context.metadata) {
397
+ let endpointMetadata = getEndpointMetadata(target, context);
398
+ if (endpointMetadata.config && endpointMetadata.config.url) throw new Error(`[Navios] Endpoint ${config.method} ${config.url} already exists. Please use a different method or url.`);
399
+ endpointMetadata.config = config;
400
+ endpointMetadata.adapterToken = StreamAdapterToken;
401
+ endpointMetadata.classMethod = target.name;
402
+ endpointMetadata.httpMethod = config.method;
403
+ endpointMetadata.url = config.url;
404
+ }
405
+ return target;
406
+ };
407
+ }
408
+
409
+ //#endregion
410
+ //#region src/decorators/use-guards.decorator.mts
411
+ /**
412
+ * Decorator that applies guards to a controller or endpoint.
413
+ *
414
+ * Guards are used for authentication, authorization, and request validation.
415
+ * They implement the `CanActivate` interface and are executed before the endpoint handler.
416
+ * Guards can be applied at the module, controller, or endpoint level.
417
+ *
418
+ * @param guards - Guard classes or injection tokens to apply
419
+ * @returns A class or method decorator
420
+ *
421
+ * @example
422
+ * ```typescript
423
+ * // Apply to a controller
424
+ * @Controller()
425
+ * @UseGuards(AuthGuard, RoleGuard)
426
+ * export class UserController {
427
+ * @Endpoint(getUserEndpoint)
428
+ * async getUser() { }
429
+ * }
430
+ *
431
+ * // Apply to a specific endpoint
432
+ * @Controller()
433
+ * export class UserController {
434
+ * @Endpoint(getUserEndpoint)
435
+ * @UseGuards(AuthGuard)
436
+ * async getUser() { }
437
+ * }
438
+ * ```
439
+ */ function UseGuards(...guards) {
440
+ return function(target, context) {
441
+ if (context.kind === "class") {
442
+ const controllerMetadata = getControllerMetadata(target, context);
443
+ for (const guard of guards.reverse()) controllerMetadata.guards.add(guard);
444
+ } else if (context.kind === "method") {
445
+ const endpointMetadata = getEndpointMetadata(target, context);
446
+ for (const guard of guards.reverse()) endpointMetadata.guards.add(guard);
447
+ } else throw new Error("[Navios] @UseGuards decorator can only be used on classes or methods.");
448
+ return target;
449
+ };
450
+ }
451
+
452
+ //#endregion
453
+ export { extractControllerMetadata as C, getAllEndpointMetadata as D, EndpointMetadataKey as E, getEndpointMetadata as O, ControllerMetadataKey as S, hasControllerMetadata as T, Controller as _, HttpCode as a, getModuleMetadata as b, XmlStreamAdapterToken as c, Reply as d, MultipartAdapterToken as f, EndpointAdapterToken as g, ExecutionContextInjectionToken as h, Module as i, StreamAdapterToken as l, ExecutionContext as m, Stream as n, Header as o, HttpAdapterToken as p, Multipart as r, Endpoint as s, UseGuards as t, Request as u, ModuleMetadataKey as v, getControllerMetadata as w, hasModuleMetadata as x, extractModuleMetadata as y };
454
+ //# sourceMappingURL=use-guards.decorator-kZ3lNK8v.mjs.map