adorn-api 1.0.0 → 1.0.1

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 (529) hide show
  1. package/README.md +51 -249
  2. package/dist/adapters/express/createApp.d.ts +20 -0
  3. package/dist/adapters/express/createApp.d.ts.map +1 -0
  4. package/dist/adapters/express/createApp.js +35 -0
  5. package/dist/adapters/express/createApp.js.map +1 -0
  6. package/dist/adapters/express/index.d.ts +7 -0
  7. package/dist/adapters/express/index.d.ts.map +1 -0
  8. package/dist/adapters/express/index.js +7 -0
  9. package/dist/adapters/express/index.js.map +1 -0
  10. package/dist/adapters/express/middleware/errorHandler.d.ts +3 -0
  11. package/dist/adapters/express/middleware/errorHandler.d.ts.map +1 -0
  12. package/dist/adapters/express/middleware/errorHandler.js +6 -0
  13. package/dist/adapters/express/middleware/errorHandler.js.map +1 -0
  14. package/dist/adapters/express/middleware/requestContext.d.ts +2 -0
  15. package/dist/adapters/express/middleware/requestContext.d.ts.map +1 -0
  16. package/dist/adapters/express/middleware/requestContext.js +3 -0
  17. package/dist/adapters/express/middleware/requestContext.js.map +1 -0
  18. package/dist/adapters/express/router.d.ts +10 -0
  19. package/dist/adapters/express/router.d.ts.map +1 -0
  20. package/dist/adapters/express/router.js +103 -0
  21. package/dist/adapters/express/router.js.map +1 -0
  22. package/dist/adapters/express/swagger/index.d.ts +2 -0
  23. package/dist/adapters/express/swagger/index.d.ts.map +1 -0
  24. package/dist/adapters/express/swagger/index.js +2 -0
  25. package/dist/adapters/express/swagger/index.js.map +1 -0
  26. package/dist/adapters/express/swagger/serve.d.ts +12 -0
  27. package/dist/adapters/express/swagger/serve.d.ts.map +1 -0
  28. package/dist/adapters/express/swagger/serve.js +72 -0
  29. package/dist/adapters/express/swagger/serve.js.map +1 -0
  30. package/dist/adapters/express/transport/request.d.ts +4 -0
  31. package/dist/adapters/express/transport/request.d.ts.map +1 -0
  32. package/dist/adapters/express/transport/request.js +12 -0
  33. package/dist/adapters/express/transport/request.js.map +1 -0
  34. package/dist/adapters/express/transport/response.d.ts +5 -0
  35. package/dist/adapters/express/transport/response.d.ts.map +1 -0
  36. package/dist/adapters/express/transport/response.js +36 -0
  37. package/dist/adapters/express/transport/response.js.map +1 -0
  38. package/dist/cli/commands/dev.d.ts +2 -0
  39. package/dist/cli/commands/dev.d.ts.map +1 -0
  40. package/dist/cli/commands/dev.js +3 -0
  41. package/dist/cli/commands/dev.js.map +1 -0
  42. package/dist/cli/commands/gen.d.ts +2 -0
  43. package/dist/cli/commands/gen.d.ts.map +1 -0
  44. package/dist/cli/commands/gen.js +3 -0
  45. package/dist/cli/commands/gen.js.map +1 -0
  46. package/dist/cli/main.d.ts +2 -0
  47. package/dist/cli/main.d.ts.map +1 -0
  48. package/dist/cli/main.js +3 -0
  49. package/dist/cli/main.js.map +1 -0
  50. package/dist/cli.d.ts +2 -0
  51. package/dist/cli.d.ts.map +1 -0
  52. package/dist/cli.js +3 -0
  53. package/dist/cli.js.map +1 -0
  54. package/dist/compiler/config/defaults.d.ts +2 -0
  55. package/dist/compiler/config/defaults.d.ts.map +1 -0
  56. package/dist/compiler/config/defaults.js +3 -0
  57. package/dist/compiler/config/defaults.js.map +1 -0
  58. package/dist/compiler/config/loadConfig.d.ts +2 -0
  59. package/dist/compiler/config/loadConfig.d.ts.map +1 -0
  60. package/dist/compiler/config/loadConfig.js +3 -0
  61. package/dist/compiler/config/loadConfig.js.map +1 -0
  62. package/dist/compiler/diagnostics/errors.d.ts +2 -0
  63. package/dist/compiler/diagnostics/errors.d.ts.map +1 -0
  64. package/dist/compiler/diagnostics/errors.js +3 -0
  65. package/dist/compiler/diagnostics/errors.js.map +1 -0
  66. package/dist/compiler/emit/openapi.d.ts +2 -0
  67. package/dist/compiler/emit/openapi.d.ts.map +1 -0
  68. package/dist/compiler/emit/openapi.js +3 -0
  69. package/dist/compiler/emit/openapi.js.map +1 -0
  70. package/dist/compiler/emit/routes.d.ts +2 -0
  71. package/dist/compiler/emit/routes.d.ts.map +1 -0
  72. package/dist/compiler/emit/routes.js +3 -0
  73. package/dist/compiler/emit/routes.js.map +1 -0
  74. package/dist/compiler/program/loadTsProgram.d.ts +2 -0
  75. package/dist/compiler/program/loadTsProgram.d.ts.map +1 -0
  76. package/dist/compiler/program/loadTsProgram.js +3 -0
  77. package/dist/compiler/program/loadTsProgram.js.map +1 -0
  78. package/dist/compiler/scan/actions.d.ts +2 -0
  79. package/dist/compiler/scan/actions.d.ts.map +1 -0
  80. package/dist/compiler/scan/actions.js +3 -0
  81. package/dist/compiler/scan/actions.js.map +1 -0
  82. package/dist/compiler/scan/controllers.d.ts +2 -0
  83. package/dist/compiler/scan/controllers.d.ts.map +1 -0
  84. package/dist/compiler/scan/controllers.js +3 -0
  85. package/dist/compiler/scan/controllers.js.map +1 -0
  86. package/dist/compiler/scan/types.d.ts +2 -0
  87. package/dist/compiler/scan/types.d.ts.map +1 -0
  88. package/dist/compiler/scan/types.js +3 -0
  89. package/dist/compiler/scan/types.js.map +1 -0
  90. package/dist/contracts/context.d.ts +10 -0
  91. package/dist/contracts/context.d.ts.map +1 -0
  92. package/dist/contracts/context.js +2 -0
  93. package/dist/contracts/context.js.map +1 -0
  94. package/dist/contracts/errors.d.ts +22 -0
  95. package/dist/contracts/errors.d.ts.map +1 -0
  96. package/dist/contracts/errors.js +2 -0
  97. package/dist/contracts/errors.js.map +1 -0
  98. package/dist/contracts/http.d.ts +2 -0
  99. package/dist/contracts/http.d.ts.map +1 -0
  100. package/dist/contracts/http.js +3 -0
  101. package/dist/contracts/http.js.map +1 -0
  102. package/dist/contracts/middleware.d.ts +2 -0
  103. package/dist/contracts/middleware.d.ts.map +1 -0
  104. package/dist/contracts/middleware.js +3 -0
  105. package/dist/contracts/middleware.js.map +1 -0
  106. package/dist/contracts/openapi-v3.d.ts +77 -0
  107. package/dist/contracts/openapi-v3.d.ts.map +1 -0
  108. package/dist/contracts/openapi-v3.js +2 -0
  109. package/dist/contracts/openapi-v3.js.map +1 -0
  110. package/dist/contracts/openapi.d.ts +2 -0
  111. package/dist/contracts/openapi.d.ts.map +1 -0
  112. package/dist/contracts/openapi.js +2 -0
  113. package/dist/contracts/openapi.js.map +1 -0
  114. package/dist/contracts/reply.d.ts +11 -0
  115. package/dist/contracts/reply.d.ts.map +1 -0
  116. package/dist/contracts/reply.js +4 -0
  117. package/dist/contracts/reply.js.map +1 -0
  118. package/dist/contracts/response-types.d.ts +40 -0
  119. package/dist/contracts/response-types.d.ts.map +1 -0
  120. package/dist/contracts/response-types.js +2 -0
  121. package/dist/contracts/response-types.js.map +1 -0
  122. package/dist/contracts/responses.d.ts +18 -0
  123. package/dist/contracts/responses.d.ts.map +1 -0
  124. package/dist/contracts/responses.js +2 -0
  125. package/dist/contracts/responses.js.map +1 -0
  126. package/dist/contracts/route-options.d.ts +24 -0
  127. package/dist/contracts/route-options.d.ts.map +1 -0
  128. package/dist/contracts/route-options.js +2 -0
  129. package/dist/contracts/route-options.js.map +1 -0
  130. package/dist/contracts/route-typing.d.ts +25 -0
  131. package/dist/contracts/route-typing.d.ts.map +1 -0
  132. package/dist/contracts/route-typing.js +2 -0
  133. package/dist/contracts/route-typing.js.map +1 -0
  134. package/dist/contracts/validator.d.ts +25 -0
  135. package/dist/contracts/validator.d.ts.map +1 -0
  136. package/dist/contracts/validator.js +2 -0
  137. package/dist/contracts/validator.js.map +1 -0
  138. package/dist/core/binding/binder.d.ts +19 -0
  139. package/dist/core/binding/binder.d.ts.map +1 -0
  140. package/dist/core/binding/binder.js +128 -0
  141. package/dist/core/binding/binder.js.map +1 -0
  142. package/dist/core/binding/coerce/arrays.d.ts +7 -0
  143. package/dist/core/binding/coerce/arrays.d.ts.map +1 -0
  144. package/dist/core/binding/coerce/arrays.js +28 -0
  145. package/dist/core/binding/coerce/arrays.js.map +1 -0
  146. package/dist/core/binding/coerce/csv.d.ts +2 -0
  147. package/dist/core/binding/coerce/csv.d.ts.map +1 -0
  148. package/dist/core/binding/coerce/csv.js +7 -0
  149. package/dist/core/binding/coerce/csv.js.map +1 -0
  150. package/dist/core/binding/coerce/objects.d.ts +2 -0
  151. package/dist/core/binding/coerce/objects.d.ts.map +1 -0
  152. package/dist/core/binding/coerce/objects.js +3 -0
  153. package/dist/core/binding/coerce/objects.js.map +1 -0
  154. package/dist/core/binding/coerce/primitives.d.ts +3 -0
  155. package/dist/core/binding/coerce/primitives.d.ts.map +1 -0
  156. package/dist/core/binding/coerce/primitives.js +18 -0
  157. package/dist/core/binding/coerce/primitives.js.map +1 -0
  158. package/dist/core/binding/index.d.ts +2 -0
  159. package/dist/core/binding/index.d.ts.map +1 -0
  160. package/dist/core/binding/index.js +2 -0
  161. package/dist/core/binding/index.js.map +1 -0
  162. package/dist/core/binding/rules/inferFromHttpMethod.d.ts +6 -0
  163. package/dist/core/binding/rules/inferFromHttpMethod.d.ts.map +1 -0
  164. package/dist/core/binding/rules/inferFromHttpMethod.js +11 -0
  165. package/dist/core/binding/rules/inferFromHttpMethod.js.map +1 -0
  166. package/dist/core/binding/rules/inferFromPath.d.ts +2 -0
  167. package/dist/core/binding/rules/inferFromPath.d.ts.map +1 -0
  168. package/dist/core/binding/rules/inferFromPath.js +9 -0
  169. package/dist/core/binding/rules/inferFromPath.js.map +1 -0
  170. package/dist/core/binding/rules/wrappers.d.ts +2 -0
  171. package/dist/core/binding/rules/wrappers.d.ts.map +1 -0
  172. package/dist/core/binding/rules/wrappers.js +3 -0
  173. package/dist/core/binding/rules/wrappers.js.map +1 -0
  174. package/dist/core/errors/http-error.d.ts +9 -0
  175. package/dist/core/errors/http-error.d.ts.map +1 -0
  176. package/dist/core/errors/http-error.js +17 -0
  177. package/dist/core/errors/http-error.js.map +1 -0
  178. package/dist/core/errors/index.d.ts +4 -0
  179. package/dist/core/errors/index.d.ts.map +1 -0
  180. package/dist/core/errors/index.js +4 -0
  181. package/dist/core/errors/index.js.map +1 -0
  182. package/dist/core/errors/problem.d.ts +3 -0
  183. package/dist/core/errors/problem.d.ts.map +1 -0
  184. package/dist/core/errors/problem.js +33 -0
  185. package/dist/core/errors/problem.js.map +1 -0
  186. package/dist/core/errors/validation-error.d.ts +8 -0
  187. package/dist/core/errors/validation-error.d.ts.map +1 -0
  188. package/dist/core/errors/validation-error.js +17 -0
  189. package/dist/core/errors/validation-error.js.map +1 -0
  190. package/dist/core/openapi/buildOpenApi.d.ts +14 -0
  191. package/dist/core/openapi/buildOpenApi.d.ts.map +1 -0
  192. package/dist/core/openapi/buildOpenApi.js +134 -0
  193. package/dist/core/openapi/buildOpenApi.js.map +1 -0
  194. package/dist/core/openapi/index.d.ts +2 -0
  195. package/dist/core/openapi/index.d.ts.map +1 -0
  196. package/dist/core/openapi/index.js +2 -0
  197. package/dist/core/openapi/index.js.map +1 -0
  198. package/dist/core/openapi/schema/formats.d.ts +2 -0
  199. package/dist/core/openapi/schema/formats.d.ts.map +1 -0
  200. package/dist/core/openapi/schema/formats.js +3 -0
  201. package/dist/core/openapi/schema/formats.js.map +1 -0
  202. package/dist/core/openapi/schema/registry.d.ts +9 -0
  203. package/dist/core/openapi/schema/registry.d.ts.map +1 -0
  204. package/dist/core/openapi/schema/registry.js +21 -0
  205. package/dist/core/openapi/schema/registry.js.map +1 -0
  206. package/dist/core/openapi/schema/schemaModel.d.ts +2 -0
  207. package/dist/core/openapi/schema/schemaModel.d.ts.map +1 -0
  208. package/dist/core/openapi/schema/schemaModel.js +3 -0
  209. package/dist/core/openapi/schema/schemaModel.js.map +1 -0
  210. package/dist/core/openapi/schema/schemaRegistry.d.ts +2 -0
  211. package/dist/core/openapi/schema/schemaRegistry.d.ts.map +1 -0
  212. package/dist/core/openapi/schema/schemaRegistry.js +3 -0
  213. package/dist/core/openapi/schema/schemaRegistry.js.map +1 -0
  214. package/dist/core/openapi/schema/toOpenApi.d.ts +4 -0
  215. package/dist/core/openapi/schema/toOpenApi.d.ts.map +1 -0
  216. package/dist/core/openapi/schema/toOpenApi.js +82 -0
  217. package/dist/core/openapi/schema/toOpenApi.js.map +1 -0
  218. package/dist/core/pipeline/compose.d.ts +2 -0
  219. package/dist/core/pipeline/compose.d.ts.map +1 -0
  220. package/dist/core/pipeline/compose.js +3 -0
  221. package/dist/core/pipeline/compose.js.map +1 -0
  222. package/dist/core/pipeline/errorMap.d.ts +2 -0
  223. package/dist/core/pipeline/errorMap.d.ts.map +1 -0
  224. package/dist/core/pipeline/errorMap.js +3 -0
  225. package/dist/core/pipeline/errorMap.js.map +1 -0
  226. package/dist/core/pipeline/invoke.d.ts +2 -0
  227. package/dist/core/pipeline/invoke.d.ts.map +1 -0
  228. package/dist/core/pipeline/invoke.js +3 -0
  229. package/dist/core/pipeline/invoke.js.map +1 -0
  230. package/dist/core/pipeline/result.d.ts +2 -0
  231. package/dist/core/pipeline/result.d.ts.map +1 -0
  232. package/dist/core/pipeline/result.js +3 -0
  233. package/dist/core/pipeline/result.js.map +1 -0
  234. package/dist/core/registry/buildRegistry.d.ts +3 -0
  235. package/dist/core/registry/buildRegistry.d.ts.map +1 -0
  236. package/dist/core/registry/buildRegistry.js +61 -0
  237. package/dist/core/registry/buildRegistry.js.map +1 -0
  238. package/dist/core/registry/conflicts.d.ts +6 -0
  239. package/dist/core/registry/conflicts.d.ts.map +1 -0
  240. package/dist/core/registry/conflicts.js +21 -0
  241. package/dist/core/registry/conflicts.js.map +1 -0
  242. package/dist/core/registry/index.d.ts +5 -0
  243. package/dist/core/registry/index.d.ts.map +1 -0
  244. package/dist/core/registry/index.js +5 -0
  245. package/dist/core/registry/index.js.map +1 -0
  246. package/dist/core/registry/normalize.d.ts +3 -0
  247. package/dist/core/registry/normalize.d.ts.map +1 -0
  248. package/dist/core/registry/normalize.js +24 -0
  249. package/dist/core/registry/normalize.js.map +1 -0
  250. package/dist/core/registry/types.d.ts +32 -0
  251. package/dist/core/registry/types.d.ts.map +1 -0
  252. package/dist/core/registry/types.js +2 -0
  253. package/dist/core/registry/types.js.map +1 -0
  254. package/dist/core/reply/index.d.ts +3 -0
  255. package/dist/core/reply/index.d.ts.map +1 -0
  256. package/dist/core/reply/index.js +3 -0
  257. package/dist/core/reply/index.js.map +1 -0
  258. package/dist/core/reply/reply.d.ts +8 -0
  259. package/dist/core/reply/reply.d.ts.map +1 -0
  260. package/dist/core/reply/reply.js +18 -0
  261. package/dist/core/reply/reply.js.map +1 -0
  262. package/dist/core/reply/typed.d.ts +27 -0
  263. package/dist/core/reply/typed.d.ts.map +1 -0
  264. package/dist/core/reply/typed.js +19 -0
  265. package/dist/core/reply/typed.js.map +1 -0
  266. package/dist/core/responses/helpers.d.ts +10 -0
  267. package/dist/core/responses/helpers.d.ts.map +1 -0
  268. package/dist/core/responses/helpers.js +8 -0
  269. package/dist/core/responses/helpers.js.map +1 -0
  270. package/dist/core/responses/index.d.ts +4 -0
  271. package/dist/core/responses/index.d.ts.map +1 -0
  272. package/dist/core/responses/index.js +4 -0
  273. package/dist/core/responses/index.js.map +1 -0
  274. package/dist/core/responses/normalize.d.ts +3 -0
  275. package/dist/core/responses/normalize.d.ts.map +1 -0
  276. package/dist/core/responses/normalize.js +32 -0
  277. package/dist/core/responses/normalize.js.map +1 -0
  278. package/dist/core/responses/pickStatus.d.ts +3 -0
  279. package/dist/core/responses/pickStatus.d.ts.map +1 -0
  280. package/dist/core/responses/pickStatus.js +27 -0
  281. package/dist/core/responses/pickStatus.js.map +1 -0
  282. package/dist/core/route/defineRoute.d.ts +27 -0
  283. package/dist/core/route/defineRoute.d.ts.map +1 -0
  284. package/dist/core/route/defineRoute.js +18 -0
  285. package/dist/core/route/defineRoute.js.map +1 -0
  286. package/dist/core/route/index.d.ts +2 -0
  287. package/dist/core/route/index.d.ts.map +1 -0
  288. package/dist/core/route/index.js +2 -0
  289. package/dist/core/route/index.js.map +1 -0
  290. package/dist/core/serialization/json.d.ts +2 -0
  291. package/dist/core/serialization/json.d.ts.map +1 -0
  292. package/dist/core/serialization/json.js +3 -0
  293. package/dist/core/serialization/json.js.map +1 -0
  294. package/dist/core/typing/path-params.d.ts +2 -0
  295. package/dist/core/typing/path-params.d.ts.map +1 -0
  296. package/dist/core/typing/path-params.js +2 -0
  297. package/dist/core/typing/path-params.js.map +1 -0
  298. package/dist/decorators/binding.d.ts +9 -0
  299. package/dist/decorators/binding.d.ts.map +1 -0
  300. package/dist/decorators/binding.js +18 -0
  301. package/dist/decorators/binding.js.map +1 -0
  302. package/dist/decorators/controller.d.ts +6 -0
  303. package/dist/decorators/controller.d.ts.map +1 -0
  304. package/dist/decorators/controller.js +26 -0
  305. package/dist/decorators/controller.js.map +1 -0
  306. package/dist/decorators/db.d.ts +2 -0
  307. package/dist/decorators/db.d.ts.map +1 -0
  308. package/dist/decorators/db.js +3 -0
  309. package/dist/decorators/db.js.map +1 -0
  310. package/dist/decorators/docs.d.ts +2 -0
  311. package/dist/decorators/docs.d.ts.map +1 -0
  312. package/dist/decorators/docs.js +3 -0
  313. package/dist/decorators/docs.js.map +1 -0
  314. package/dist/decorators/index.d.ts +4 -0
  315. package/dist/decorators/index.d.ts.map +1 -0
  316. package/dist/decorators/index.js +4 -0
  317. package/dist/decorators/index.js.map +1 -0
  318. package/dist/decorators/methods.d.ts +24 -0
  319. package/dist/decorators/methods.d.ts.map +1 -0
  320. package/dist/decorators/methods.js +46 -0
  321. package/dist/decorators/methods.js.map +1 -0
  322. package/dist/decorators/middleware.d.ts +2 -0
  323. package/dist/decorators/middleware.d.ts.map +1 -0
  324. package/dist/decorators/middleware.js +3 -0
  325. package/dist/decorators/middleware.js.map +1 -0
  326. package/dist/decorators/responses.d.ts +2 -0
  327. package/dist/decorators/responses.d.ts.map +1 -0
  328. package/dist/decorators/responses.js +3 -0
  329. package/dist/decorators/responses.js.map +1 -0
  330. package/dist/decorators/security.d.ts +2 -0
  331. package/dist/decorators/security.d.ts.map +1 -0
  332. package/dist/decorators/security.js +3 -0
  333. package/dist/decorators/security.js.map +1 -0
  334. package/dist/express.d.ts +2 -0
  335. package/dist/express.d.ts.map +1 -0
  336. package/dist/express.js +2 -0
  337. package/dist/express.js.map +1 -0
  338. package/dist/index.d.ts +12 -0
  339. package/dist/index.d.ts.map +1 -0
  340. package/dist/index.js +12 -2
  341. package/dist/index.js.map +1 -0
  342. package/dist/integrations/metal-orm/index.d.ts +2 -0
  343. package/dist/integrations/metal-orm/index.d.ts.map +1 -0
  344. package/dist/integrations/metal-orm/index.js +2 -0
  345. package/dist/integrations/metal-orm/index.js.map +1 -0
  346. package/dist/integrations/metal-orm/pagination/executePaged.d.ts +2 -0
  347. package/dist/integrations/metal-orm/pagination/executePaged.d.ts.map +1 -0
  348. package/dist/integrations/metal-orm/pagination/executePaged.js +3 -0
  349. package/dist/integrations/metal-orm/pagination/executePaged.js.map +1 -0
  350. package/dist/integrations/metal-orm/pagination/page.d.ts +2 -0
  351. package/dist/integrations/metal-orm/pagination/page.d.ts.map +1 -0
  352. package/dist/integrations/metal-orm/pagination/page.js +3 -0
  353. package/dist/integrations/metal-orm/pagination/page.js.map +1 -0
  354. package/dist/integrations/metal-orm/query/filters.d.ts +2 -0
  355. package/dist/integrations/metal-orm/query/filters.d.ts.map +1 -0
  356. package/dist/integrations/metal-orm/query/filters.js +3 -0
  357. package/dist/integrations/metal-orm/query/filters.js.map +1 -0
  358. package/dist/integrations/metal-orm/query/search.d.ts +2 -0
  359. package/dist/integrations/metal-orm/query/search.d.ts.map +1 -0
  360. package/dist/integrations/metal-orm/query/search.js +3 -0
  361. package/dist/integrations/metal-orm/query/search.js.map +1 -0
  362. package/dist/integrations/metal-orm/query/sort.d.ts +2 -0
  363. package/dist/integrations/metal-orm/query/sort.d.ts.map +1 -0
  364. package/dist/integrations/metal-orm/query/sort.js +3 -0
  365. package/dist/integrations/metal-orm/query/sort.js.map +1 -0
  366. package/dist/integrations/metal-orm/save-graph/helpers.d.ts +2 -0
  367. package/dist/integrations/metal-orm/save-graph/helpers.d.ts.map +1 -0
  368. package/dist/integrations/metal-orm/save-graph/helpers.js +3 -0
  369. package/dist/integrations/metal-orm/save-graph/helpers.js.map +1 -0
  370. package/dist/integrations/metal-orm/save-graph/types.d.ts +2 -0
  371. package/dist/integrations/metal-orm/save-graph/types.d.ts.map +1 -0
  372. package/dist/integrations/metal-orm/save-graph/types.js +3 -0
  373. package/dist/integrations/metal-orm/save-graph/types.js.map +1 -0
  374. package/dist/integrations/metal-orm/schema/column-map.d.ts +5 -0
  375. package/dist/integrations/metal-orm/schema/column-map.d.ts.map +1 -0
  376. package/dist/integrations/metal-orm/schema/column-map.js +80 -0
  377. package/dist/integrations/metal-orm/schema/column-map.js.map +1 -0
  378. package/dist/integrations/metal-orm/schema/ddl.d.ts +2 -0
  379. package/dist/integrations/metal-orm/schema/ddl.d.ts.map +1 -0
  380. package/dist/integrations/metal-orm/schema/ddl.js +3 -0
  381. package/dist/integrations/metal-orm/schema/ddl.js.map +1 -0
  382. package/dist/integrations/metal-orm/schema/dto.d.ts +7 -0
  383. package/dist/integrations/metal-orm/schema/dto.d.ts.map +1 -0
  384. package/dist/integrations/metal-orm/schema/dto.js +34 -0
  385. package/dist/integrations/metal-orm/schema/dto.js.map +1 -0
  386. package/dist/integrations/metal-orm/schema/entity.d.ts +17 -0
  387. package/dist/integrations/metal-orm/schema/entity.d.ts.map +1 -0
  388. package/dist/integrations/metal-orm/schema/entity.js +27 -0
  389. package/dist/integrations/metal-orm/schema/entity.js.map +1 -0
  390. package/dist/integrations/metal-orm/schema/filters.d.ts +11 -0
  391. package/dist/integrations/metal-orm/schema/filters.d.ts.map +1 -0
  392. package/dist/integrations/metal-orm/schema/filters.js +20 -0
  393. package/dist/integrations/metal-orm/schema/filters.js.map +1 -0
  394. package/dist/integrations/metal-orm/schema/index.d.ts +5 -0
  395. package/dist/integrations/metal-orm/schema/index.d.ts.map +1 -0
  396. package/dist/integrations/metal-orm/schema/index.js +5 -0
  397. package/dist/integrations/metal-orm/schema/index.js.map +1 -0
  398. package/dist/integrations/metal-orm/schema/openapi/entityToSchema.d.ts +2 -0
  399. package/dist/integrations/metal-orm/schema/openapi/entityToSchema.d.ts.map +1 -0
  400. package/dist/integrations/metal-orm/schema/openapi/entityToSchema.js +3 -0
  401. package/dist/integrations/metal-orm/schema/openapi/entityToSchema.js.map +1 -0
  402. package/dist/integrations/metal-orm/schema/openapi/tableDefToSchema.d.ts +2 -0
  403. package/dist/integrations/metal-orm/schema/openapi/tableDefToSchema.d.ts.map +1 -0
  404. package/dist/integrations/metal-orm/schema/openapi/tableDefToSchema.js +3 -0
  405. package/dist/integrations/metal-orm/schema/openapi/tableDefToSchema.js.map +1 -0
  406. package/dist/integrations/metal-orm/schema/sqlite.d.ts +2 -0
  407. package/dist/integrations/metal-orm/schema/sqlite.d.ts.map +1 -0
  408. package/dist/integrations/metal-orm/schema/sqlite.js +3 -0
  409. package/dist/integrations/metal-orm/schema/sqlite.js.map +1 -0
  410. package/dist/integrations/metal-orm/schema/tabledef.d.ts +4 -0
  411. package/dist/integrations/metal-orm/schema/tabledef.d.ts.map +1 -0
  412. package/dist/integrations/metal-orm/schema/tabledef.js +10 -0
  413. package/dist/integrations/metal-orm/schema/tabledef.js.map +1 -0
  414. package/dist/integrations/metal-orm/schema/types.d.ts +7 -0
  415. package/dist/integrations/metal-orm/schema/types.d.ts.map +1 -0
  416. package/dist/integrations/metal-orm/schema/types.js +2 -0
  417. package/dist/integrations/metal-orm/schema/types.js.map +1 -0
  418. package/dist/integrations/metal-orm/serialization/entitySerializer.d.ts +2 -0
  419. package/dist/integrations/metal-orm/serialization/entitySerializer.d.ts.map +1 -0
  420. package/dist/integrations/metal-orm/serialization/entitySerializer.js +3 -0
  421. package/dist/integrations/metal-orm/serialization/entitySerializer.js.map +1 -0
  422. package/dist/integrations/metal-orm/serialization/relationPolicy.d.ts +2 -0
  423. package/dist/integrations/metal-orm/serialization/relationPolicy.d.ts.map +1 -0
  424. package/dist/integrations/metal-orm/serialization/relationPolicy.js +3 -0
  425. package/dist/integrations/metal-orm/serialization/relationPolicy.js.map +1 -0
  426. package/dist/integrations/metal-orm/session/context.d.ts +2 -0
  427. package/dist/integrations/metal-orm/session/context.d.ts.map +1 -0
  428. package/dist/integrations/metal-orm/session/context.js +3 -0
  429. package/dist/integrations/metal-orm/session/context.js.map +1 -0
  430. package/dist/integrations/metal-orm/session/middleware.d.ts +2 -0
  431. package/dist/integrations/metal-orm/session/middleware.d.ts.map +1 -0
  432. package/dist/integrations/metal-orm/session/middleware.js +3 -0
  433. package/dist/integrations/metal-orm/session/middleware.js.map +1 -0
  434. package/dist/integrations/metal-orm/session/transaction.d.ts +2 -0
  435. package/dist/integrations/metal-orm/session/transaction.d.ts.map +1 -0
  436. package/dist/integrations/metal-orm/session/transaction.js +3 -0
  437. package/dist/integrations/metal-orm/session/transaction.js.map +1 -0
  438. package/dist/integrations/metal-orm/testing/setupSchema.d.ts +2 -0
  439. package/dist/integrations/metal-orm/testing/setupSchema.d.ts.map +1 -0
  440. package/dist/integrations/metal-orm/testing/setupSchema.js +3 -0
  441. package/dist/integrations/metal-orm/testing/setupSchema.js.map +1 -0
  442. package/dist/integrations/metal-orm/testing/sqliteMemory.d.ts +2 -0
  443. package/dist/integrations/metal-orm/testing/sqliteMemory.d.ts.map +1 -0
  444. package/dist/integrations/metal-orm/testing/sqliteMemory.js +3 -0
  445. package/dist/integrations/metal-orm/testing/sqliteMemory.js.map +1 -0
  446. package/dist/metadata/bag.d.ts +17 -0
  447. package/dist/metadata/bag.d.ts.map +1 -0
  448. package/dist/metadata/bag.js +38 -0
  449. package/dist/metadata/bag.js.map +1 -0
  450. package/dist/metadata/index.d.ts +4 -0
  451. package/dist/metadata/index.d.ts.map +1 -0
  452. package/dist/metadata/index.js +4 -0
  453. package/dist/metadata/index.js.map +1 -0
  454. package/dist/metadata/keys.d.ts +52 -0
  455. package/dist/metadata/keys.d.ts.map +1 -0
  456. package/dist/metadata/keys.js +29 -0
  457. package/dist/metadata/keys.js.map +1 -0
  458. package/dist/metadata/merge.d.ts +9 -0
  459. package/dist/metadata/merge.d.ts.map +1 -0
  460. package/dist/metadata/merge.js +27 -0
  461. package/dist/metadata/merge.js.map +1 -0
  462. package/dist/metal-orm.d.ts +2 -0
  463. package/dist/metal-orm.d.ts.map +1 -0
  464. package/dist/metal-orm.js +2 -0
  465. package/dist/metal-orm.js.map +1 -0
  466. package/dist/validation/native/index.d.ts +3 -0
  467. package/dist/validation/native/index.d.ts.map +1 -0
  468. package/dist/validation/native/index.js +3 -0
  469. package/dist/validation/native/index.js.map +1 -0
  470. package/dist/validation/native/ir.d.ts +38 -0
  471. package/dist/validation/native/ir.d.ts.map +1 -0
  472. package/dist/validation/native/ir.js +2 -0
  473. package/dist/validation/native/ir.js.map +1 -0
  474. package/dist/validation/native/schema.d.ts +63 -0
  475. package/dist/validation/native/schema.d.ts.map +1 -0
  476. package/dist/validation/native/schema.js +271 -0
  477. package/dist/validation/native/schema.js.map +1 -0
  478. package/dist/validation/native/validator.d.ts +21 -0
  479. package/dist/validation/native/validator.d.ts.map +1 -0
  480. package/dist/validation/native/validator.js +48 -0
  481. package/dist/validation/native/validator.js.map +1 -0
  482. package/package.json +53 -34
  483. package/dist/cli/generate-routes.js +0 -101
  484. package/dist/cli/generate-swagger.js +0 -197
  485. package/dist/controllers/advanced.controller.js +0 -131
  486. package/dist/controllers/user.controller.js +0 -121
  487. package/dist/entities/user.entity.js +0 -1
  488. package/dist/lib/common.js +0 -62
  489. package/dist/lib/decorators.js +0 -116
  490. package/dist/middleware/auth.middleware.js +0 -13
  491. package/dist/routes.js +0 -80
  492. package/dist/server.js +0 -18
  493. package/dist/src/cli/generate-routes.js +0 -105
  494. package/dist/src/cli/generate-swagger.js +0 -197
  495. package/dist/src/index.js +0 -4
  496. package/dist/src/lib/common.js +0 -62
  497. package/dist/src/lib/decorators.js +0 -116
  498. package/dist/src/routes.js +0 -80
  499. package/dist/src/server.js +0 -18
  500. package/dist/tests/example-app/controllers/advanced.controller.js +0 -130
  501. package/dist/tests/example-app/controllers/controllers/advanced.controller.js +0 -131
  502. package/dist/tests/example-app/controllers/controllers/user.controller.js +0 -121
  503. package/dist/tests/example-app/controllers/user.controller.js +0 -121
  504. package/dist/tests/example-app/entities/entities/user.entity.js +0 -1
  505. package/dist/tests/example-app/entities/user.entity.js +0 -1
  506. package/dist/tests/example-app/middleware/auth.middleware.js +0 -13
  507. package/dist/tests/example-app/middleware/middleware/auth.middleware.js +0 -13
  508. package/dist/tests/example-app/routes.js +0 -80
  509. package/dist/tests/example-app/server.js +0 -23
  510. package/scripts/run-example.js +0 -32
  511. package/src/cli/generate-routes.ts +0 -123
  512. package/src/cli/generate-swagger.ts +0 -216
  513. package/src/index.js +0 -20
  514. package/src/index.ts +0 -4
  515. package/src/lib/common.js +0 -68
  516. package/src/lib/common.ts +0 -35
  517. package/src/lib/decorators.js +0 -128
  518. package/src/lib/decorators.ts +0 -136
  519. package/swagger.json +0 -238
  520. package/tests/e2e.test.ts +0 -72
  521. package/tests/example-app/controllers/advanced.controller.ts +0 -52
  522. package/tests/example-app/controllers/user.controller.ts +0 -35
  523. package/tests/example-app/entities/user.entity.ts +0 -8
  524. package/tests/example-app/middleware/auth.middleware.ts +0 -16
  525. package/tests/example-app/routes.ts +0 -102
  526. package/tests/example-app/server.ts +0 -30
  527. package/tests/generators.test.ts +0 -48
  528. package/tests/utils.ts +0 -46
  529. package/tsconfig.json +0 -20
@@ -0,0 +1,63 @@
1
+ import type { ValidationIssue, ValidationResult } from '../../contracts/validator.js';
2
+ import type { SchemaIR } from './ir.js';
3
+ export type Schema<T> = {
4
+ readonly kind: string;
5
+ readonly ir: SchemaIR;
6
+ readonly name?: string;
7
+ parse(value: unknown, path?: Array<string | number>): ValidationResult<T>;
8
+ };
9
+ export type Infer<S extends Schema<any>> = S extends Schema<infer T> ? T : never;
10
+ export declare function optional<T>(inner: Schema<T>): Schema<T | undefined>;
11
+ declare function literalBase<T extends string | number | boolean | null>(lit: T): Schema<T>;
12
+ declare function enumBase<T extends readonly string[]>(values: T): Schema<T[number]>;
13
+ type ObjectShape = Record<string, Schema<any>>;
14
+ type StringBuilder = Schema<string> & {
15
+ min(n: number): StringBuilder;
16
+ max(n: number): StringBuilder;
17
+ email(): StringBuilder;
18
+ regex(re: RegExp, message?: string): StringBuilder;
19
+ optional(): Schema<string | undefined>;
20
+ nullable(): Schema<string | null>;
21
+ };
22
+ declare function string(): StringBuilder;
23
+ type NumberBuilder = Schema<number> & {
24
+ int(): NumberBuilder;
25
+ min(n: number): NumberBuilder;
26
+ max(n: number): NumberBuilder;
27
+ optional(): Schema<number | undefined>;
28
+ nullable(): Schema<number | null>;
29
+ };
30
+ declare function number(): NumberBuilder;
31
+ type BooleanBuilder = Schema<boolean> & {
32
+ optional(): Schema<boolean | undefined>;
33
+ nullable(): Schema<boolean | null>;
34
+ };
35
+ declare function boolean(): BooleanBuilder;
36
+ type ObjectBuilder<S extends ObjectShape> = Schema<{
37
+ [K in keyof S]: Infer<S[K]>;
38
+ }> & {
39
+ strict(): ObjectBuilder<S>;
40
+ optional(): Schema<Infer<ObjectBuilder<S>> | undefined>;
41
+ nullable(): Schema<Infer<ObjectBuilder<S>> | null>;
42
+ };
43
+ declare function object<S extends ObjectShape>(shape: S): ObjectBuilder<S>;
44
+ type ArrayBuilder<T> = Schema<T[]> & {
45
+ min(n: number): ArrayBuilder<T>;
46
+ max(n: number): ArrayBuilder<T>;
47
+ optional(): Schema<T[] | undefined>;
48
+ nullable(): Schema<T[] | null>;
49
+ };
50
+ declare function array<T>(item: Schema<T>): ArrayBuilder<T>;
51
+ declare function named<T>(name: string, schema: Schema<T>): Schema<T>;
52
+ export declare const v: {
53
+ string: typeof string;
54
+ number: typeof number;
55
+ boolean: typeof boolean;
56
+ object: typeof object;
57
+ array: typeof array;
58
+ literal: typeof literalBase;
59
+ enum: typeof enumBase;
60
+ named: typeof named;
61
+ };
62
+ export type { ValidationIssue, ValidationResult };
63
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/validation/native/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ function ok(value) {
2
+ return { ok: true, value };
3
+ }
4
+ function fail(issues) {
5
+ return { ok: false, issues };
6
+ }
7
+ function issue(path, message, code, expected, received) {
8
+ return {
9
+ path,
10
+ message,
11
+ ...(code !== undefined ? { code } : {}),
12
+ ...(expected !== undefined ? { expected } : {}),
13
+ ...(received !== undefined ? { received } : {}),
14
+ };
15
+ }
16
+ function withChecks(base, checks, ir) {
17
+ const schema = {
18
+ kind: base.kind,
19
+ ir: ir ?? base.ir,
20
+ parse(value, path = []) {
21
+ const r = base.parse(value, path);
22
+ if (!r.ok)
23
+ return r;
24
+ const issues = [];
25
+ for (const chk of checks) {
26
+ const is = chk(r.value, path);
27
+ if (is)
28
+ issues.push(is);
29
+ }
30
+ return issues.length ? fail(issues) : r;
31
+ },
32
+ };
33
+ if (base.name !== undefined) {
34
+ schema.name = base.name;
35
+ }
36
+ return schema;
37
+ }
38
+ export function optional(inner) {
39
+ return {
40
+ kind: `${inner.kind}.optional`,
41
+ ir: { kind: 'optional', inner: inner.ir },
42
+ parse(value, path = []) {
43
+ if (value === undefined)
44
+ return ok(undefined);
45
+ return inner.parse(value, path);
46
+ },
47
+ };
48
+ }
49
+ function nullable(inner) {
50
+ return {
51
+ kind: `${inner.kind}.nullable`,
52
+ ir: { kind: 'nullable', inner: inner.ir },
53
+ parse(value, path = []) {
54
+ if (value === null)
55
+ return ok(null);
56
+ return inner.parse(value, path);
57
+ },
58
+ };
59
+ }
60
+ function stringBase() {
61
+ return {
62
+ kind: 'string',
63
+ ir: { kind: 'string' },
64
+ parse(value, path = []) {
65
+ if (typeof value !== 'string') {
66
+ return fail([issue(path, 'Expected string', 'invalid_type', 'string', typeof value)]);
67
+ }
68
+ return ok(value);
69
+ },
70
+ };
71
+ }
72
+ function numberBase() {
73
+ return {
74
+ kind: 'number',
75
+ ir: { kind: 'number' },
76
+ parse(value, path = []) {
77
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
78
+ return fail([issue(path, 'Expected finite number', 'invalid_type', 'number', value)]);
79
+ }
80
+ return ok(value);
81
+ },
82
+ };
83
+ }
84
+ function booleanBase() {
85
+ return {
86
+ kind: 'boolean',
87
+ ir: { kind: 'boolean' },
88
+ parse(value, path = []) {
89
+ if (typeof value !== 'boolean') {
90
+ return fail([issue(path, 'Expected boolean', 'invalid_type', 'boolean', typeof value)]);
91
+ }
92
+ return ok(value);
93
+ },
94
+ };
95
+ }
96
+ function literalBase(lit) {
97
+ return {
98
+ kind: 'literal',
99
+ ir: { kind: 'literal', value: lit },
100
+ parse(value, path = []) {
101
+ if (value !== lit) {
102
+ return fail([issue(path, `Expected literal ${JSON.stringify(lit)}`, 'invalid_literal', lit, value)]);
103
+ }
104
+ return ok(lit);
105
+ },
106
+ };
107
+ }
108
+ function enumBase(values) {
109
+ const set = new Set(values);
110
+ return {
111
+ kind: 'enum',
112
+ ir: { kind: 'string', enum: [...values] },
113
+ parse(value, path = []) {
114
+ if (typeof value !== 'string' || !set.has(value)) {
115
+ return fail([issue(path, `Expected one of: ${values.join(', ')}`, 'invalid_enum', values, value)]);
116
+ }
117
+ return ok(value);
118
+ },
119
+ };
120
+ }
121
+ function arrayBase(item) {
122
+ return {
123
+ kind: 'array',
124
+ ir: { kind: 'array', items: item.ir },
125
+ parse(value, path = []) {
126
+ if (!Array.isArray(value)) {
127
+ return fail([issue(path, 'Expected array', 'invalid_type', 'array', typeof value)]);
128
+ }
129
+ const issues = [];
130
+ const out = [];
131
+ for (let i = 0; i < value.length; i++) {
132
+ const r = item.parse(value[i], [...path, i]);
133
+ if (!r.ok)
134
+ issues.push(...r.issues);
135
+ else
136
+ out.push(r.value);
137
+ }
138
+ return issues.length ? fail(issues) : ok(out);
139
+ },
140
+ };
141
+ }
142
+ function unwrapOptionalIr(ir) {
143
+ if (ir.kind === 'optional')
144
+ return ir.inner;
145
+ return ir;
146
+ }
147
+ function objectBase(shape, opts) {
148
+ const properties = {};
149
+ const required = [];
150
+ for (const [k, sch] of Object.entries(shape)) {
151
+ properties[k] = unwrapOptionalIr(sch.ir);
152
+ if (sch.ir.kind !== 'optional')
153
+ required.push(k);
154
+ }
155
+ return {
156
+ kind: 'object',
157
+ ir: {
158
+ kind: 'object',
159
+ properties,
160
+ required,
161
+ ...(opts?.strict ? { strict: true } : {}),
162
+ },
163
+ parse(value, path = []) {
164
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
165
+ return fail([issue(path, 'Expected object', 'invalid_type', 'object', typeof value)]);
166
+ }
167
+ const v = value;
168
+ const issues = [];
169
+ const out = {};
170
+ for (const [k, sch] of Object.entries(shape)) {
171
+ const r = sch.parse(v[k], [...path, k]);
172
+ if (!r.ok)
173
+ issues.push(...r.issues);
174
+ else
175
+ out[k] = r.value;
176
+ }
177
+ if (opts?.strict) {
178
+ for (const k of Object.keys(v)) {
179
+ if (!(k in shape)) {
180
+ issues.push(issue([...path, k], 'Unknown key', 'unknown_key'));
181
+ }
182
+ }
183
+ }
184
+ return issues.length ? fail(issues) : ok(out);
185
+ },
186
+ };
187
+ }
188
+ function string() {
189
+ const base = stringBase();
190
+ const baseIr = base.ir;
191
+ const build = (checks, ir) => {
192
+ const s = withChecks(base, checks, ir);
193
+ s.min = (n) => build([...checks, (v, p) => (v.length < n ? issue(p, `Must be at least ${n} chars`, 'too_small', n, v.length) : null)], { ...ir, minLength: n });
194
+ s.max = (n) => build([...checks, (v, p) => (v.length > n ? issue(p, `Must be at most ${n} chars`, 'too_big', n, v.length) : null)], { ...ir, maxLength: n });
195
+ s.email = () => build([
196
+ ...checks,
197
+ (v, p) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)
198
+ ? null
199
+ : issue(p, 'Invalid email', 'invalid_email'),
200
+ ], { ...ir, format: 'email' });
201
+ s.regex = (re, message) => build([
202
+ ...checks,
203
+ (v, p) => (re.test(v) ? null : issue(p, message ?? 'Invalid format', 'invalid_format', String(re), v)),
204
+ ], { ...ir, pattern: re.source });
205
+ s.optional = () => optional(s);
206
+ s.nullable = () => nullable(s);
207
+ return s;
208
+ };
209
+ return build([], baseIr);
210
+ }
211
+ function number() {
212
+ const base = numberBase();
213
+ const baseIr = base.ir;
214
+ const build = (checks, ir) => {
215
+ const s = withChecks(base, checks, ir);
216
+ s.int = () => build([
217
+ ...checks,
218
+ (v, p) => (Number.isInteger(v) ? null : issue(p, 'Must be an integer', 'not_integer')),
219
+ ], { ...ir, int: true });
220
+ s.min = (n) => build([...checks, (v, p) => (v < n ? issue(p, `Must be >= ${n}`, 'too_small', n, v) : null)], { ...ir, min: n });
221
+ s.max = (n) => build([...checks, (v, p) => (v > n ? issue(p, `Must be <= ${n}`, 'too_big', n, v) : null)], { ...ir, max: n });
222
+ s.optional = () => optional(s);
223
+ s.nullable = () => nullable(s);
224
+ return s;
225
+ };
226
+ return build([], baseIr);
227
+ }
228
+ function boolean() {
229
+ const base = booleanBase();
230
+ const s = base;
231
+ s.optional = () => optional(s);
232
+ s.nullable = () => nullable(s);
233
+ return s;
234
+ }
235
+ function object(shape) {
236
+ const build = (strictMode) => {
237
+ const base = objectBase(shape, { strict: strictMode });
238
+ base.strict = () => build(true);
239
+ base.optional = () => optional(base);
240
+ base.nullable = () => nullable(base);
241
+ return base;
242
+ };
243
+ return build(false);
244
+ }
245
+ function array(item) {
246
+ const base = arrayBase(item);
247
+ const baseIr = base.ir;
248
+ const build = (checks, ir) => {
249
+ const a = withChecks(base, checks, ir);
250
+ a.min = (n) => build([...checks, (v, p) => (v.length < n ? issue(p, `Must have at least ${n} items`, 'too_small', n, v.length) : null)], { ...ir, minItems: n });
251
+ a.max = (n) => build([...checks, (v, p) => (v.length > n ? issue(p, `Must have at most ${n} items`, 'too_big', n, v.length) : null)], { ...ir, maxItems: n });
252
+ a.optional = () => optional(a);
253
+ a.nullable = () => nullable(a);
254
+ return a;
255
+ };
256
+ return build([], baseIr);
257
+ }
258
+ function named(name, schema) {
259
+ return { ...schema, name };
260
+ }
261
+ export const v = {
262
+ string,
263
+ number,
264
+ boolean,
265
+ object,
266
+ array,
267
+ literal: literalBase,
268
+ enum: enumBase,
269
+ named,
270
+ };
271
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/validation/native/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { Validator, ValidationResult } from '../../contracts/validator.js';
2
+ import type { Schema } from './schema.js';
3
+ type SchemaMap = Record<string, Schema<any>>;
4
+ export declare class NativeValidator implements Validator {
5
+ private readonly bodies;
6
+ private readonly queries;
7
+ private readonly params;
8
+ constructor(opts?: {
9
+ body?: SchemaMap;
10
+ query?: SchemaMap;
11
+ params?: SchemaMap;
12
+ });
13
+ validateBody<T = unknown>(body: unknown, schemaId: string): ValidationResult<T>;
14
+ validateQuery<T = unknown>(query: unknown, schemaId: string): ValidationResult<T>;
15
+ validateParams<T = unknown>(params: unknown, schemaId: string): ValidationResult<T>;
16
+ assertBody<T = unknown>(body: unknown, schemaId: string): T;
17
+ assertQuery<T = unknown>(query: unknown, schemaId: string): T;
18
+ assertParams<T = unknown>(params: unknown, schemaId: string): T;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/validation/native/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7C,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAC;QAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAAE;IAM9E,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAM/E,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAMjF,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAMnF,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;IAM3D,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;IAM7D,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC;CAKhE"}
@@ -0,0 +1,48 @@
1
+ import { ValidationError } from '../../core/errors/validation-error.js';
2
+ export class NativeValidator {
3
+ bodies;
4
+ queries;
5
+ params;
6
+ constructor(opts) {
7
+ this.bodies = opts?.body ?? {};
8
+ this.queries = opts?.query ?? {};
9
+ this.params = opts?.params ?? {};
10
+ }
11
+ validateBody(body, schemaId) {
12
+ const sch = this.bodies[schemaId];
13
+ if (!sch)
14
+ return { ok: true, value: body };
15
+ return sch.parse(body, ['body']);
16
+ }
17
+ validateQuery(query, schemaId) {
18
+ const sch = this.queries[schemaId];
19
+ if (!sch)
20
+ return { ok: true, value: query };
21
+ return sch.parse(query, ['query']);
22
+ }
23
+ validateParams(params, schemaId) {
24
+ const sch = this.params[schemaId];
25
+ if (!sch)
26
+ return { ok: true, value: params };
27
+ return sch.parse(params, ['params']);
28
+ }
29
+ assertBody(body, schemaId) {
30
+ const r = this.validateBody(body, schemaId);
31
+ if (!r.ok)
32
+ throw ValidationError.fromIssues(r.issues, 'Body validation failed');
33
+ return r.value;
34
+ }
35
+ assertQuery(query, schemaId) {
36
+ const r = this.validateQuery(query, schemaId);
37
+ if (!r.ok)
38
+ throw ValidationError.fromIssues(r.issues, 'Query validation failed');
39
+ return r.value;
40
+ }
41
+ assertParams(params, schemaId) {
42
+ const r = this.validateParams(params, schemaId);
43
+ if (!r.ok)
44
+ throw ValidationError.fromIssues(r.issues, 'Params validation failed');
45
+ return r.value;
46
+ }
47
+ }
48
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/validation/native/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAKxE,MAAM,OAAO,eAAe;IACT,MAAM,CAAY;IAClB,OAAO,CAAY;IACnB,MAAM,CAAY;IAEnC,YAAY,IAAkE;QAC5E,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,YAAY,CAAc,IAAa,EAAE,QAAgB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAS,EAAE,CAAC;QAChD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAwB,CAAC;IAC1D,CAAC;IAED,aAAa,CAAc,KAAc,EAAE,QAAgB;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAU,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAwB,CAAC;IAC5D,CAAC;IAED,cAAc,CAAc,MAAe,EAAE,QAAgB;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAW,EAAE,CAAC;QAClD,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAwB,CAAC;IAC9D,CAAC;IAED,UAAU,CAAc,IAAa,EAAE,QAAgB;QACrD,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAI,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC;IAED,WAAW,CAAc,KAAc,EAAE,QAAgB;QACvD,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAI,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC;IAED,YAAY,CAAc,MAAe,EAAE,QAAgB;QACzD,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAI,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAClF,OAAO,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC;CACF"}
package/package.json CHANGED
@@ -1,34 +1,53 @@
1
- {
2
- "name": "adorn-api",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "index.js",
6
- "scripts": {
7
- "build": "tsc",
8
- "gen:spec": "ts-node --esm src/cli/generate-swagger.ts",
9
- "gen:routes": "ts-node --esm src/cli/generate-routes.ts",
10
- "gen": "npm run gen:spec && npm run gen:routes",
11
- "example": "node scripts/run-example.js",
12
- "test": "vitest run"
13
- },
14
- "keywords": [],
15
- "author": "",
16
- "license": "ISC",
17
- "type": "module",
18
- "dependencies": {
19
- "body-parser": "^2.2.0",
20
- "express": "^4.21.1",
21
- "reflect-metadata": "^0.2.2",
22
- "swagger-ui-express": "^5.0.1",
23
- "ts-morph": "^27.0.2",
24
- "typescript": "^5.9.3",
25
- "zod": "^4.2.1"
26
- },
27
- "devDependencies": {
28
- "@types/express": "^5.0.0",
29
- "@types/node": "^25.0.3",
30
- "@types/swagger-ui-express": "^4.1.8",
31
- "ts-node": "^10.9.2",
32
- "vitest": "^2.1.8"
33
- }
34
- }
1
+ {
2
+ "name": "adorn-api",
3
+ "version": "1.0.1",
4
+ "description": "Stage-3 decorator router + OpenAPI, with optional MetalORM integration",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "./express": {
19
+ "types": "./dist/express.d.ts",
20
+ "default": "./dist/express.js"
21
+ },
22
+ "./metal-orm": {
23
+ "types": "./dist/metal-orm.d.ts",
24
+ "default": "./dist/metal-orm.js"
25
+ }
26
+ },
27
+ "engines": {
28
+ "node": ">=18"
29
+ },
30
+ "dependencies": {
31
+ "express": "^5.2.1",
32
+ "metal-orm": "^1.0.64"
33
+ },
34
+ "devDependencies": {
35
+ "@types/express": "^5.0.6",
36
+ "@types/node": "^25.0.3",
37
+ "@types/supertest": "^6.0.3",
38
+ "sqlite3": "^5.1.7",
39
+ "supertest": "^7.1.4",
40
+ "typescript": "^5.9.3",
41
+ "vitest": "^4.0.16"
42
+ },
43
+ "scripts": {
44
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
45
+ "build": "npm run clean && tsc -p tsconfig.build.json",
46
+ "check": "npm run typecheck && npm run check:decorated-returns && npm run test",
47
+ "check:decorated-returns": "node scripts/check-decorated-returns.js",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit",
49
+ "test": "vitest run",
50
+ "test:watch": "vitest",
51
+ "test:e2e": "vitest run test/e2e"
52
+ }
53
+ }
@@ -1,101 +0,0 @@
1
- // src/cli/generate-routes.ts
2
- import { Project } from "ts-morph";
3
- import * as fs from "fs";
4
- const PROJECT_ROOT = "./tsconfig.json";
5
- const OUTPUT_FILE = "./src/routes.ts"; // We generate this file!
6
- const project = new Project({ tsConfigFilePath: PROJECT_ROOT });
7
- let routeCode = `/* tslint:disable */
8
- /* eslint-disable */
9
- // WARNING: This file was auto-generated by adorn-api. Do not edit.
10
- import { Express, Request, Response } from 'express';
11
- `;
12
- // Helper to keep track of imports we need to add to the generated file
13
- const imports = new Set();
14
- function processController(classDec) {
15
- const className = classDec.getName();
16
- if (!className)
17
- return "";
18
- // Track import (assuming controllers are in ./controllers/)
19
- const sourceFile = classDec.getSourceFile();
20
- const baseName = sourceFile.getBaseName().replace('.ts', '.js');
21
- const relativePath = sourceFile.getDirectoryPath().replace(process.cwd() + "/src", ".");
22
- imports.add(`import { ${className} } from '${relativePath}/${baseName}';`);
23
- const controllerDec = classDec.getDecorators().find(d => d.getName() === "Controller");
24
- if (!controllerDec)
25
- return "";
26
- const basePath = controllerDec.getArguments()[0]?.getText().replace(/['"]/g, "") || "/";
27
- let methodBlocks = "";
28
- classDec.getMethods().forEach(method => {
29
- const getDec = method.getDecorator("Get");
30
- const postDec = method.getDecorator("Post");
31
- const putDec = method.getDecorator("Put");
32
- const deleteDec = method.getDecorator("Delete");
33
- const decorator = getDec || postDec || putDec || deleteDec;
34
- if (!decorator)
35
- return;
36
- const httpMethod = getDec ? "get" : postDec ? "post" : putDec ? "put" : "delete";
37
- const pathArg = decorator.getArguments()[0]?.getText().replace(/['"]/g, "") || "/";
38
- const fullPath = `/${basePath}${pathArg}`.replace("//", "/").replace(/{/g, ":").replace(/}/g, ""); // Convert {id} to :id for Express
39
- const methodName = method.getName();
40
- const params = method.getParameters();
41
- // Authentication check
42
- const authDec = method.getDecorator("Authorized");
43
- const controllerAuthDec = classDec.getDecorator("Authorized");
44
- const hasAuth = !!authDec || !!controllerAuthDec;
45
- const middlewareArgs = hasAuth ? "authenticationMiddleware, " : "";
46
- // Logic to instantiate the DTO
47
- let paramInstantiation = "";
48
- if (params.length > 0) {
49
- const paramName = params[0].getName();
50
- const paramType = params[0].getType().getSymbol()?.getName();
51
- // We assume the DTO is a class we can instantiate, or a shape we construct
52
- // Here we map request parts to the DTO
53
- paramInstantiation = `
54
- const input: any = {};
55
- // Map Query
56
- Object.assign(input, req.query);
57
- // Map Params
58
- Object.assign(input, req.params);
59
- // Map Body
60
- Object.assign(input, req.body);
61
-
62
- // In a real app, you would run 'zod' or 'class-validator' here on 'input'
63
- `;
64
- }
65
- methodBlocks += `
66
- app.${httpMethod}('${fullPath}', ${middlewareArgs}async (req: Request, res: Response) => {
67
- const controller = new ${className}();
68
- try {
69
- ${paramInstantiation}
70
- const response = await controller.${methodName}(${params.length > 0 ? 'input' : ''});
71
- res.status(200).json(response);
72
- } catch (err: any) {
73
- console.error(err);
74
- res.status(500).send(err.message);
75
- }
76
- });
77
- `;
78
- });
79
- return methodBlocks;
80
- }
81
- const sourceFiles = project.getSourceFiles("src/controllers/**/*.ts");
82
- let allRoutes = "";
83
- sourceFiles.forEach(file => {
84
- file.getClasses().forEach(c => {
85
- allRoutes += processController(c);
86
- });
87
- });
88
- // Add authentication middleware import if needed
89
- if (allRoutes.includes('authenticationMiddleware')) {
90
- routeCode += `import { authenticationMiddleware } from './middleware/auth.middleware.js';\n`;
91
- }
92
- // Prepend imports
93
- routeCode += Array.from(imports).join('\n');
94
- routeCode += `
95
-
96
- export function RegisterRoutes(app: Express) {
97
- ${allRoutes}
98
- }
99
- `;
100
- fs.writeFileSync(OUTPUT_FILE, routeCode);
101
- console.log(`✅ Generated Routes at ${OUTPUT_FILE}`);