adorn-api 1.0.23 → 1.0.24

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 (382) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.cjs +30 -0
  3. package/README.md +375 -531
  4. package/dist/core/express-adapter.d.ts +27 -0
  5. package/dist/core/express-adapter.d.ts.map +1 -0
  6. package/dist/core/express-adapter.js +146 -0
  7. package/dist/core/express-adapter.js.map +1 -0
  8. package/dist/core/http-error.d.ts +7 -0
  9. package/dist/core/http-error.d.ts.map +1 -0
  10. package/dist/core/http-error.js +14 -0
  11. package/dist/core/http-error.js.map +1 -0
  12. package/dist/decorators/controller.decorator.d.ts +2 -0
  13. package/dist/decorators/controller.decorator.d.ts.map +1 -0
  14. package/dist/decorators/controller.decorator.js +26 -0
  15. package/dist/decorators/controller.decorator.js.map +1 -0
  16. package/dist/decorators/create.decorator.d.ts +8 -0
  17. package/dist/decorators/create.decorator.d.ts.map +1 -0
  18. package/dist/decorators/create.decorator.js +67 -0
  19. package/dist/decorators/create.decorator.js.map +1 -0
  20. package/dist/decorators/http-method.decorator.d.ts +16 -0
  21. package/dist/decorators/http-method.decorator.d.ts.map +1 -0
  22. package/dist/decorators/http-method.decorator.js +117 -0
  23. package/dist/decorators/http-method.decorator.js.map +1 -0
  24. package/dist/decorators/http-params.d.ts +17 -0
  25. package/dist/decorators/http-params.d.ts.map +1 -0
  26. package/dist/decorators/http-params.js +26 -0
  27. package/dist/decorators/http-params.js.map +1 -0
  28. package/dist/decorators/index.d.ts +10 -5
  29. package/dist/decorators/index.d.ts.map +1 -1
  30. package/dist/decorators/index.js +14 -0
  31. package/dist/decorators/index.js.map +1 -0
  32. package/dist/decorators/list.decorator.d.ts +18 -0
  33. package/dist/decorators/list.decorator.d.ts.map +1 -0
  34. package/dist/decorators/list.decorator.js +99 -0
  35. package/dist/decorators/list.decorator.js.map +1 -0
  36. package/dist/decorators/middleware.decorator.d.ts +4 -0
  37. package/dist/decorators/middleware.decorator.d.ts.map +1 -0
  38. package/dist/decorators/middleware.decorator.js +34 -0
  39. package/dist/decorators/middleware.decorator.js.map +1 -0
  40. package/dist/decorators/response.decorator.d.ts +8 -0
  41. package/dist/decorators/response.decorator.d.ts.map +1 -0
  42. package/dist/decorators/response.decorator.js +44 -0
  43. package/dist/decorators/response.decorator.js.map +1 -0
  44. package/dist/decorators/route-options.d.ts +14 -0
  45. package/dist/decorators/route-options.d.ts.map +1 -0
  46. package/dist/decorators/route-options.js +22 -0
  47. package/dist/decorators/route-options.js.map +1 -0
  48. package/dist/decorators/schema.decorator.d.ts +82 -0
  49. package/dist/decorators/schema.decorator.d.ts.map +1 -0
  50. package/dist/decorators/schema.decorator.js +123 -0
  51. package/dist/decorators/schema.decorator.js.map +1 -0
  52. package/dist/decorators/update.decorator.d.ts +8 -0
  53. package/dist/decorators/update.decorator.d.ts.map +1 -0
  54. package/dist/decorators/update.decorator.js +63 -0
  55. package/dist/decorators/update.decorator.js.map +1 -0
  56. package/dist/index.d.ts +11 -13
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +18 -637
  59. package/dist/index.js.map +1 -1
  60. package/dist/metadata/metadata-storage.d.ts +38 -0
  61. package/dist/metadata/metadata-storage.d.ts.map +1 -0
  62. package/dist/metadata/metadata-storage.js +102 -0
  63. package/dist/metadata/metadata-storage.js.map +1 -0
  64. package/dist/metal-orm-integration/dto-helper.d.ts +5 -0
  65. package/dist/metal-orm-integration/dto-helper.d.ts.map +1 -0
  66. package/dist/metal-orm-integration/dto-helper.js +48 -0
  67. package/dist/metal-orm-integration/dto-helper.js.map +1 -0
  68. package/dist/metal-orm-integration/dto-response.decorator.d.ts +4 -0
  69. package/dist/metal-orm-integration/dto-response.decorator.d.ts.map +1 -0
  70. package/dist/metal-orm-integration/dto-response.decorator.js +69 -0
  71. package/dist/metal-orm-integration/dto-response.decorator.js.map +1 -0
  72. package/dist/metal-orm-integration/entity-schema-builder.d.ts +20 -0
  73. package/dist/metal-orm-integration/entity-schema-builder.d.ts.map +1 -0
  74. package/dist/metal-orm-integration/entity-schema-builder.js +356 -0
  75. package/dist/metal-orm-integration/entity-schema-builder.js.map +1 -0
  76. package/dist/metal-orm-integration/index.d.ts +5 -0
  77. package/dist/metal-orm-integration/index.d.ts.map +1 -0
  78. package/dist/metal-orm-integration/index.js +5 -0
  79. package/dist/metal-orm-integration/index.js.map +1 -0
  80. package/dist/metal-orm-integration/schema-modifier.d.ts +11 -0
  81. package/dist/metal-orm-integration/schema-modifier.d.ts.map +1 -0
  82. package/dist/metal-orm-integration/schema-modifier.js +62 -0
  83. package/dist/metal-orm-integration/schema-modifier.js.map +1 -0
  84. package/dist/openapi/index.d.ts +4 -0
  85. package/dist/openapi/index.d.ts.map +1 -0
  86. package/dist/openapi/index.js +4 -0
  87. package/dist/openapi/index.js.map +1 -0
  88. package/dist/openapi/openapi-generator.d.ts +22 -0
  89. package/dist/openapi/openapi-generator.d.ts.map +1 -0
  90. package/dist/openapi/openapi-generator.js +428 -0
  91. package/dist/openapi/openapi-generator.js.map +1 -0
  92. package/dist/openapi/swagger-ui.d.ts +11 -0
  93. package/dist/openapi/swagger-ui.d.ts.map +1 -0
  94. package/dist/openapi/swagger-ui.js +20 -0
  95. package/dist/openapi/swagger-ui.js.map +1 -0
  96. package/dist/openapi/zod-to-openapi.d.ts +4 -0
  97. package/dist/openapi/zod-to-openapi.d.ts.map +1 -0
  98. package/dist/openapi/zod-to-openapi.js +184 -0
  99. package/dist/openapi/zod-to-openapi.js.map +1 -0
  100. package/dist/types/common.d.ts +4 -0
  101. package/dist/types/common.d.ts.map +1 -0
  102. package/dist/types/common.js +2 -0
  103. package/dist/types/common.js.map +1 -0
  104. package/dist/types/controller.d.ts +14 -0
  105. package/dist/types/controller.d.ts.map +1 -0
  106. package/dist/types/controller.js +2 -0
  107. package/dist/types/controller.js.map +1 -0
  108. package/dist/types/metadata.d.ts +48 -0
  109. package/dist/types/metadata.d.ts.map +1 -0
  110. package/dist/types/metadata.js +2 -0
  111. package/dist/types/metadata.js.map +1 -0
  112. package/dist/types/openapi.d.ts +30 -0
  113. package/dist/types/openapi.d.ts.map +1 -0
  114. package/dist/types/openapi.js +2 -0
  115. package/dist/types/openapi.js.map +1 -0
  116. package/dist/validation/zod-adapter.d.ts +15 -0
  117. package/dist/validation/zod-adapter.d.ts.map +1 -0
  118. package/dist/validation/zod-adapter.js +61 -0
  119. package/dist/validation/zod-adapter.js.map +1 -0
  120. package/examples/basic/app.ts +15 -0
  121. package/examples/basic/index.ts +6 -0
  122. package/examples/basic/user.controller.ts +35 -0
  123. package/examples/basic/user.dtos.ts +23 -0
  124. package/examples/metal-orm-sqlite/app.ts +18 -0
  125. package/examples/metal-orm-sqlite/db.ts +90 -0
  126. package/examples/metal-orm-sqlite/index.ts +6 -0
  127. package/examples/metal-orm-sqlite/post.controller.ts +209 -0
  128. package/examples/metal-orm-sqlite/post.dtos.ts +78 -0
  129. package/examples/metal-orm-sqlite/post.entity.ts +24 -0
  130. package/examples/metal-orm-sqlite/user.controller.helpers.ts +305 -0
  131. package/examples/metal-orm-sqlite/user.controller.ts +231 -0
  132. package/examples/metal-orm-sqlite/user.dtos.ts +88 -0
  133. package/examples/metal-orm-sqlite/user.entity.ts +21 -0
  134. package/examples/metal-orm-sqlite-music/album.controller.ts +278 -0
  135. package/examples/metal-orm-sqlite-music/album.dtos.ts +85 -0
  136. package/examples/metal-orm-sqlite-music/album.entity.ts +28 -0
  137. package/examples/metal-orm-sqlite-music/app.ts +19 -0
  138. package/examples/metal-orm-sqlite-music/artist.controller.ts +272 -0
  139. package/examples/metal-orm-sqlite-music/artist.dtos.ts +68 -0
  140. package/examples/metal-orm-sqlite-music/artist.entity.ts +27 -0
  141. package/examples/metal-orm-sqlite-music/db.ts +148 -0
  142. package/examples/metal-orm-sqlite-music/index.ts +6 -0
  143. package/examples/metal-orm-sqlite-music/track.controller.ts +221 -0
  144. package/examples/metal-orm-sqlite-music/track.dtos.ts +82 -0
  145. package/examples/metal-orm-sqlite-music/track.entity.ts +27 -0
  146. package/examples/openapi/health.controller.ts +11 -0
  147. package/examples/openapi/health.dto.ts +7 -0
  148. package/examples/openapi/index.ts +12 -0
  149. package/examples/restful/app.ts +15 -0
  150. package/examples/restful/index.ts +9 -0
  151. package/examples/restful/task.controller.ts +118 -0
  152. package/examples/restful/task.dtos.ts +66 -0
  153. package/examples/restful/task.store.ts +95 -0
  154. package/examples/tsconfig.json +8 -0
  155. package/examples/utils/start-server.ts +56 -0
  156. package/package.json +33 -97
  157. package/scripts/run-example.js +29 -0
  158. package/src/adapter/express.ts +589 -0
  159. package/src/adapter/metal-orm/convention-overrides.ts +115 -0
  160. package/src/adapter/metal-orm/crud-dtos.ts +141 -0
  161. package/src/adapter/metal-orm/dto.ts +20 -0
  162. package/src/adapter/metal-orm/error-dtos.ts +51 -0
  163. package/src/adapter/metal-orm/field-builder.ts +185 -0
  164. package/src/adapter/metal-orm/filters.ts +52 -0
  165. package/src/adapter/metal-orm/index.ts +66 -0
  166. package/src/adapter/metal-orm/paged-dtos.ts +94 -0
  167. package/src/adapter/metal-orm/pagination.ts +28 -0
  168. package/src/adapter/metal-orm/types.ts +250 -0
  169. package/src/adapter/metal-orm/utils.ts +36 -0
  170. package/src/adapter/metal-orm.test.ts +439 -0
  171. package/src/core/__tests__/coerce.test.ts +39 -0
  172. package/src/core/__tests__/dto-compose.test.ts +68 -0
  173. package/src/core/__tests__/schema-builder.test.ts +82 -0
  174. package/src/core/coerce.ts +190 -0
  175. package/src/core/decorators.ts +645 -0
  176. package/src/core/errors.ts +55 -0
  177. package/src/core/metadata.ts +110 -0
  178. package/src/core/openapi.ts +282 -0
  179. package/src/core/schema-builder.ts +287 -0
  180. package/src/core/schema.ts +400 -0
  181. package/src/core/types.ts +14 -0
  182. package/src/e2e/http-error.e2e.test.ts +52 -0
  183. package/src/e2e/sqlite-metal-orm.e2e.test.ts +174 -0
  184. package/src/e2e/sqlite.e2e.test.ts +126 -0
  185. package/src/index.ts +8 -0
  186. package/tsconfig.eslint.json +7 -0
  187. package/tsconfig.json +18 -0
  188. package/vitest.config.ts +8 -0
  189. package/dist/adapter/express/auth.d.ts +0 -13
  190. package/dist/adapter/express/auth.d.ts.map +0 -1
  191. package/dist/adapter/express/bootstrap.d.ts +0 -40
  192. package/dist/adapter/express/bootstrap.d.ts.map +0 -1
  193. package/dist/adapter/express/coercion.d.ts +0 -102
  194. package/dist/adapter/express/coercion.d.ts.map +0 -1
  195. package/dist/adapter/express/index.d.ts +0 -6
  196. package/dist/adapter/express/index.d.ts.map +0 -1
  197. package/dist/adapter/express/merge.d.ts +0 -45
  198. package/dist/adapter/express/merge.d.ts.map +0 -1
  199. package/dist/adapter/express/openapi.d.ts +0 -66
  200. package/dist/adapter/express/openapi.d.ts.map +0 -1
  201. package/dist/adapter/express/router.d.ts +0 -10
  202. package/dist/adapter/express/router.d.ts.map +0 -1
  203. package/dist/adapter/express/swagger.d.ts +0 -18
  204. package/dist/adapter/express/swagger.d.ts.map +0 -1
  205. package/dist/adapter/express/types.d.ts +0 -110
  206. package/dist/adapter/express/types.d.ts.map +0 -1
  207. package/dist/adapter/express/validation.d.ts +0 -27
  208. package/dist/adapter/express/validation.d.ts.map +0 -1
  209. package/dist/cli/progress.d.ts +0 -124
  210. package/dist/cli/progress.d.ts.map +0 -1
  211. package/dist/cli.cjs +0 -4622
  212. package/dist/cli.cjs.map +0 -1
  213. package/dist/cli.d.ts +0 -3
  214. package/dist/cli.d.ts.map +0 -1
  215. package/dist/cli.js +0 -4603
  216. package/dist/cli.js.map +0 -1
  217. package/dist/compiler/analyze/index.d.ts +0 -5
  218. package/dist/compiler/analyze/index.d.ts.map +0 -1
  219. package/dist/compiler/analyze/scanControllers.d.ts +0 -88
  220. package/dist/compiler/analyze/scanControllers.d.ts.map +0 -1
  221. package/dist/compiler/cache/isStale.d.ts +0 -46
  222. package/dist/compiler/cache/isStale.d.ts.map +0 -1
  223. package/dist/compiler/cache/loadArtifacts.d.ts +0 -149
  224. package/dist/compiler/cache/loadArtifacts.d.ts.map +0 -1
  225. package/dist/compiler/cache/schema.d.ts +0 -32
  226. package/dist/compiler/cache/schema.d.ts.map +0 -1
  227. package/dist/compiler/cache/writeCache.d.ts +0 -14
  228. package/dist/compiler/cache/writeCache.d.ts.map +0 -1
  229. package/dist/compiler/gems.d.ts +0 -75
  230. package/dist/compiler/gems.d.ts.map +0 -1
  231. package/dist/compiler/generator/index.d.ts +0 -7
  232. package/dist/compiler/generator/index.d.ts.map +0 -1
  233. package/dist/compiler/generator/manifest.d.ts +0 -23
  234. package/dist/compiler/generator/manifest.d.ts.map +0 -1
  235. package/dist/compiler/generator/openapi.d.ts +0 -118
  236. package/dist/compiler/generator/openapi.d.ts.map +0 -1
  237. package/dist/compiler/graph/builder.d.ts +0 -24
  238. package/dist/compiler/graph/builder.d.ts.map +0 -1
  239. package/dist/compiler/graph/index.d.ts +0 -7
  240. package/dist/compiler/graph/index.d.ts.map +0 -1
  241. package/dist/compiler/graph/schemaGraph.d.ts +0 -67
  242. package/dist/compiler/graph/schemaGraph.d.ts.map +0 -1
  243. package/dist/compiler/graph/types.d.ts +0 -203
  244. package/dist/compiler/graph/types.d.ts.map +0 -1
  245. package/dist/compiler/index.d.ts +0 -12
  246. package/dist/compiler/index.d.ts.map +0 -1
  247. package/dist/compiler/ir/index.d.ts +0 -7
  248. package/dist/compiler/ir/index.d.ts.map +0 -1
  249. package/dist/compiler/ir/pipeline.d.ts +0 -82
  250. package/dist/compiler/ir/pipeline.d.ts.map +0 -1
  251. package/dist/compiler/ir/stages.d.ts +0 -40
  252. package/dist/compiler/ir/stages.d.ts.map +0 -1
  253. package/dist/compiler/ir/visitor.d.ts +0 -98
  254. package/dist/compiler/ir/visitor.d.ts.map +0 -1
  255. package/dist/compiler/manifest/emit.d.ts +0 -21
  256. package/dist/compiler/manifest/emit.d.ts.map +0 -1
  257. package/dist/compiler/manifest/format.d.ts +0 -119
  258. package/dist/compiler/manifest/format.d.ts.map +0 -1
  259. package/dist/compiler/manifest/index.d.ts +0 -6
  260. package/dist/compiler/manifest/index.d.ts.map +0 -1
  261. package/dist/compiler/runner/createProgram.d.ts +0 -24
  262. package/dist/compiler/runner/createProgram.d.ts.map +0 -1
  263. package/dist/compiler/runner/index.d.ts +0 -5
  264. package/dist/compiler/runner/index.d.ts.map +0 -1
  265. package/dist/compiler/schema/extractAnnotations.d.ts +0 -57
  266. package/dist/compiler/schema/extractAnnotations.d.ts.map +0 -1
  267. package/dist/compiler/schema/index.d.ts +0 -10
  268. package/dist/compiler/schema/index.d.ts.map +0 -1
  269. package/dist/compiler/schema/intersectionHandler.d.ts +0 -44
  270. package/dist/compiler/schema/intersectionHandler.d.ts.map +0 -1
  271. package/dist/compiler/schema/objectHandler.d.ts +0 -146
  272. package/dist/compiler/schema/objectHandler.d.ts.map +0 -1
  273. package/dist/compiler/schema/openapi.d.ts +0 -71
  274. package/dist/compiler/schema/openapi.d.ts.map +0 -1
  275. package/dist/compiler/schema/parameters.d.ts +0 -90
  276. package/dist/compiler/schema/parameters.d.ts.map +0 -1
  277. package/dist/compiler/schema/partitioner.d.ts +0 -85
  278. package/dist/compiler/schema/partitioner.d.ts.map +0 -1
  279. package/dist/compiler/schema/primitives.d.ts +0 -68
  280. package/dist/compiler/schema/primitives.d.ts.map +0 -1
  281. package/dist/compiler/schema/queryBuilderAnalyzer.d.ts +0 -95
  282. package/dist/compiler/schema/queryBuilderAnalyzer.d.ts.map +0 -1
  283. package/dist/compiler/schema/queryBuilderSchemaBuilder.d.ts +0 -13
  284. package/dist/compiler/schema/queryBuilderSchemaBuilder.d.ts.map +0 -1
  285. package/dist/compiler/schema/serviceCallAnalyzer.d.ts +0 -102
  286. package/dist/compiler/schema/serviceCallAnalyzer.d.ts.map +0 -1
  287. package/dist/compiler/schema/splitOpenapi.d.ts +0 -46
  288. package/dist/compiler/schema/splitOpenapi.d.ts.map +0 -1
  289. package/dist/compiler/schema/typeToJsonSchema.d.ts +0 -26
  290. package/dist/compiler/schema/typeToJsonSchema.d.ts.map +0 -1
  291. package/dist/compiler/schema/types.d.ts +0 -70
  292. package/dist/compiler/schema/types.d.ts.map +0 -1
  293. package/dist/compiler/schema/unionHandler.d.ts +0 -70
  294. package/dist/compiler/schema/unionHandler.d.ts.map +0 -1
  295. package/dist/compiler/transform/dedup.d.ts +0 -35
  296. package/dist/compiler/transform/dedup.d.ts.map +0 -1
  297. package/dist/compiler/transform/flatten.d.ts +0 -50
  298. package/dist/compiler/transform/flatten.d.ts.map +0 -1
  299. package/dist/compiler/transform/index.d.ts +0 -7
  300. package/dist/compiler/transform/index.d.ts.map +0 -1
  301. package/dist/compiler/transform/inline.d.ts +0 -46
  302. package/dist/compiler/transform/inline.d.ts.map +0 -1
  303. package/dist/compiler/validation/emitPrecompiledValidators.d.ts +0 -62
  304. package/dist/compiler/validation/emitPrecompiledValidators.d.ts.map +0 -1
  305. package/dist/compiler/validation/index.d.ts +0 -5
  306. package/dist/compiler/validation/index.d.ts.map +0 -1
  307. package/dist/decorators/Auth.d.ts +0 -22
  308. package/dist/decorators/Auth.d.ts.map +0 -1
  309. package/dist/decorators/Controller.d.ts +0 -17
  310. package/dist/decorators/Controller.d.ts.map +0 -1
  311. package/dist/decorators/Public.d.ts +0 -15
  312. package/dist/decorators/Public.d.ts.map +0 -1
  313. package/dist/decorators/Use.d.ts +0 -23
  314. package/dist/decorators/Use.d.ts.map +0 -1
  315. package/dist/decorators/methods.d.ts +0 -26
  316. package/dist/decorators/methods.d.ts.map +0 -1
  317. package/dist/express.cjs +0 -1186
  318. package/dist/express.cjs.map +0 -1
  319. package/dist/express.d.ts +0 -8
  320. package/dist/express.d.ts.map +0 -1
  321. package/dist/express.js +0 -1150
  322. package/dist/express.js.map +0 -1
  323. package/dist/http.d.ts +0 -33
  324. package/dist/http.d.ts.map +0 -1
  325. package/dist/index.cjs +0 -724
  326. package/dist/index.cjs.map +0 -1
  327. package/dist/metal/applyListQuery.d.ts +0 -100
  328. package/dist/metal/applyListQuery.d.ts.map +0 -1
  329. package/dist/metal/index.cjs +0 -278
  330. package/dist/metal/index.cjs.map +0 -1
  331. package/dist/metal/index.d.ts +0 -15
  332. package/dist/metal/index.d.ts.map +0 -1
  333. package/dist/metal/index.js +0 -243
  334. package/dist/metal/index.js.map +0 -1
  335. package/dist/metal/listQuery.d.ts +0 -26
  336. package/dist/metal/listQuery.d.ts.map +0 -1
  337. package/dist/metal/queryOptions.d.ts +0 -16
  338. package/dist/metal/queryOptions.d.ts.map +0 -1
  339. package/dist/metal/readMetalBag.d.ts +0 -69
  340. package/dist/metal/readMetalBag.d.ts.map +0 -1
  341. package/dist/metal/registerMetalEntities.d.ts +0 -26
  342. package/dist/metal/registerMetalEntities.d.ts.map +0 -1
  343. package/dist/metal/schemaFromEntity.d.ts +0 -41
  344. package/dist/metal/schemaFromEntity.d.ts.map +0 -1
  345. package/dist/metal/searchWhere.d.ts +0 -97
  346. package/dist/metal/searchWhere.d.ts.map +0 -1
  347. package/dist/metal/symbolMetadata.d.ts +0 -8
  348. package/dist/metal/symbolMetadata.d.ts.map +0 -1
  349. package/dist/runtime/auth/runtime.d.ts +0 -183
  350. package/dist/runtime/auth/runtime.d.ts.map +0 -1
  351. package/dist/runtime/metadata/bucket.d.ts +0 -2
  352. package/dist/runtime/metadata/bucket.d.ts.map +0 -1
  353. package/dist/runtime/metadata/key.d.ts +0 -2
  354. package/dist/runtime/metadata/key.d.ts.map +0 -1
  355. package/dist/runtime/metadata/read.d.ts +0 -2
  356. package/dist/runtime/metadata/read.d.ts.map +0 -1
  357. package/dist/runtime/metadata/types.d.ts +0 -95
  358. package/dist/runtime/metadata/types.d.ts.map +0 -1
  359. package/dist/runtime/polyfill.d.ts +0 -2
  360. package/dist/runtime/polyfill.d.ts.map +0 -1
  361. package/dist/runtime/upload.d.ts +0 -44
  362. package/dist/runtime/upload.d.ts.map +0 -1
  363. package/dist/runtime/validation/ajv.d.ts +0 -120
  364. package/dist/runtime/validation/ajv.d.ts.map +0 -1
  365. package/dist/runtime/validation/index.d.ts +0 -11
  366. package/dist/runtime/validation/index.d.ts.map +0 -1
  367. package/dist/schema/decorators.d.ts +0 -37
  368. package/dist/schema/decorators.d.ts.map +0 -1
  369. package/dist/schema/index.cjs +0 -214
  370. package/dist/schema/index.cjs.map +0 -1
  371. package/dist/schema/index.d.ts +0 -2
  372. package/dist/schema/index.d.ts.map +0 -1
  373. package/dist/schema/index.js +0 -163
  374. package/dist/schema/index.js.map +0 -1
  375. package/dist/scripts/adorn-example.cjs +0 -404
  376. package/dist/scripts/adorn-example.cjs.map +0 -1
  377. package/dist/utils/operationId.d.ts +0 -2
  378. package/dist/utils/operationId.d.ts.map +0 -1
  379. package/dist/utils/path.d.ts +0 -2
  380. package/dist/utils/path.d.ts.map +0 -1
  381. package/dist/utils/port.d.ts +0 -9
  382. package/dist/utils/port.d.ts.map +0 -1
@@ -0,0 +1,141 @@
1
+ import { Dto } from "../../core/decorators";
2
+ import type { DtoConstructor } from "../../core/types";
3
+ import { MetalDto } from "./dto";
4
+ import type {
5
+ MetalCrudDtoOptions,
6
+ MetalCrudDtoClassOptions,
7
+ MetalCrudDtoClasses,
8
+ MetalCrudDtoDecorators,
9
+ NestedCreateDtoOptions
10
+ } from "./types";
11
+
12
+ export function createMetalCrudDtos(
13
+ target: any,
14
+ options: MetalCrudDtoOptions = {}
15
+ ): MetalCrudDtoDecorators {
16
+ const mutationExclude = options.mutationExclude;
17
+ const immutable = options.immutable;
18
+
19
+ const response = buildCrudOptions(options.response, options.overrides);
20
+ const create = buildCrudOptions(options.create, options.overrides, {
21
+ mode: "create",
22
+ exclude: mergeStringArrays(mutationExclude, options.create?.exclude)
23
+ });
24
+ const replace = buildCrudOptions(options.replace, options.overrides, {
25
+ mode: "create",
26
+ exclude: mergeStringArrays(mutationExclude, immutable, options.replace?.exclude)
27
+ });
28
+ const update = buildCrudOptions(options.update, options.overrides, {
29
+ mode: "update",
30
+ exclude: mergeStringArrays(mutationExclude, immutable, options.update?.exclude)
31
+ });
32
+
33
+ const params = buildCrudOptions(options.params, options.overrides);
34
+ params.include = params.include ?? options.paramsInclude ?? ["id"];
35
+
36
+ return {
37
+ response: MetalDto(target, response),
38
+ create: MetalDto(target, create),
39
+ replace: MetalDto(target, replace),
40
+ update: MetalDto(target, update),
41
+ params: MetalDto(target, params)
42
+ };
43
+ }
44
+
45
+ export function createMetalCrudDtoClasses(
46
+ target: any,
47
+ options: MetalCrudDtoClassOptions = {}
48
+ ): MetalCrudDtoClasses {
49
+ const { baseName, names, ...crudOptions } = options;
50
+ const decorators = createMetalCrudDtos(target, crudOptions);
51
+ const entityName = baseName ?? getTargetName(target);
52
+ const defaultNames: Record<keyof MetalCrudDtoDecorators, string> = {
53
+ response: `${entityName}Dto`,
54
+ create: `Create${entityName}Dto`,
55
+ replace: `Replace${entityName}Dto`,
56
+ update: `Update${entityName}Dto`,
57
+ params: `${entityName}ParamsDto`
58
+ };
59
+
60
+ const classes: Partial<MetalCrudDtoClasses> = {};
61
+ for (const key of Object.keys(decorators) as Array<keyof MetalCrudDtoDecorators>) {
62
+ const name = names?.[key] ?? defaultNames[key];
63
+ classes[key] = buildDtoClass(name, decorators[key]);
64
+ }
65
+ return classes as MetalCrudDtoClasses;
66
+ }
67
+
68
+ export function createNestedCreateDtoClass(
69
+ target: any,
70
+ overrides: Record<string, any>,
71
+ options: NestedCreateDtoOptions
72
+ ): DtoConstructor {
73
+ const { additionalExclude, name, parentEntity, ...metalDtoOptions } = options;
74
+
75
+ const allExcludes = mergeStringArrays(
76
+ ["id", "createdAt"],
77
+ additionalExclude,
78
+ metalDtoOptions.exclude
79
+ );
80
+
81
+ @MetalDto(target, {
82
+ ...metalDtoOptions,
83
+ mode: "create",
84
+ exclude: allExcludes,
85
+ overrides
86
+ })
87
+ class NestedCreateDto {}
88
+
89
+ Object.defineProperty(NestedCreateDto, "name", { value: name, configurable: true });
90
+
91
+ return NestedCreateDto;
92
+ }
93
+
94
+ function buildDtoClass(name: string, decorator: (target: DtoConstructor) => void): DtoConstructor {
95
+ const DtoClass = class {};
96
+ Object.defineProperty(DtoClass, "name", { value: name, configurable: true });
97
+ decorator(DtoClass);
98
+ return DtoClass;
99
+ }
100
+
101
+ function getTargetName(target: any): string {
102
+ if (typeof target === "function" && target.name) {
103
+ return target.name;
104
+ }
105
+ return "Entity";
106
+ }
107
+
108
+ function mergeOverrides(
109
+ base?: Record<string, any>,
110
+ override?: Record<string, any>
111
+ ): Record<string, any> | undefined {
112
+ if (!base && !override) {
113
+ return undefined;
114
+ }
115
+ return { ...(base ?? {}), ...(override ?? {}) };
116
+ }
117
+
118
+ function mergeStringArrays(
119
+ ...entries: Array<string[] | undefined>
120
+ ): string[] | undefined {
121
+ const merged = new Set<string>();
122
+ for (const entry of entries) {
123
+ for (const value of entry ?? []) {
124
+ merged.add(value);
125
+ }
126
+ }
127
+ return merged.size ? Array.from(merged) : undefined;
128
+ }
129
+
130
+ function buildCrudOptions(
131
+ base: any | undefined,
132
+ overrides: Record<string, any> | undefined,
133
+ extra: any = {}
134
+ ): any {
135
+ const mergedOverrides = mergeOverrides(overrides, base?.overrides);
136
+ const output: any = { ...base, ...extra };
137
+ if (mergedOverrides) {
138
+ output.overrides = mergedOverrides;
139
+ }
140
+ return output;
141
+ }
@@ -0,0 +1,20 @@
1
+ import { getColumnMap } from "metal-orm";
2
+ import type { DtoConstructor } from "../../core/types";
3
+ import { registerDto } from "../../core/metadata";
4
+ import { buildFields, type MetalDtoOptions } from "./field-builder";
5
+
6
+ export type MetalDtoTarget = Parameters<typeof getColumnMap>[0];
7
+
8
+ export function MetalDto(target: MetalDtoTarget, options: MetalDtoOptions = {}) {
9
+ return (value: DtoConstructor): void => {
10
+ const fields = buildFields(target, options);
11
+ registerDto(value, {
12
+ name: options.name ?? value.name,
13
+ description: options.description,
14
+ fields,
15
+ additionalProperties: options.additionalProperties
16
+ });
17
+ };
18
+ }
19
+
20
+ export type { MetalDtoOptions } from "./field-builder";
@@ -0,0 +1,51 @@
1
+ import { Dto, Field } from "../../core/decorators";
2
+ import type { DtoConstructor } from "../../core/types";
3
+ import type { ErrorDtoOptions } from "./types";
4
+ import { t } from "../../core/schema";
5
+
6
+ export function createErrorDtoClass(options: ErrorDtoOptions = {}): DtoConstructor {
7
+ const { withDetails = true, includeTraceId = true } = options;
8
+
9
+ if (withDetails) {
10
+ @Dto()
11
+ class ErrorDetailDto {
12
+ @Field(t.string())
13
+ field!: string;
14
+
15
+ @Field(t.string())
16
+ message!: string;
17
+ }
18
+
19
+ @Dto()
20
+ class ErrorDto {
21
+ @Field(t.string())
22
+ message!: string;
23
+
24
+ @Field(t.optional(t.string()))
25
+ code?: string;
26
+
27
+ @Field(t.optional(t.array(t.ref(ErrorDetailDto))))
28
+ errors?: ErrorDetailDto[];
29
+
30
+ @Field(t.optional(t.string()))
31
+ traceId?: string;
32
+ }
33
+
34
+ return ErrorDto;
35
+ }
36
+
37
+ @Dto()
38
+ class SimpleErrorDto {
39
+ @Field(t.string())
40
+ message!: string;
41
+
42
+ @Field(t.optional(t.string()))
43
+ traceId?: string;
44
+ }
45
+
46
+ return SimpleErrorDto;
47
+ }
48
+
49
+ export const StandardErrorDto = createErrorDtoClass({ withDetails: true, includeTraceId: true });
50
+ export const SimpleErrorDto = createErrorDtoClass({ withDetails: false, includeTraceId: true });
51
+ export const BasicErrorDto = createErrorDtoClass({ withDetails: false, includeTraceId: false });
@@ -0,0 +1,185 @@
1
+ import type { ColumnDef } from "metal-orm";
2
+ import {
3
+ columnTypeToOpenApiFormat,
4
+ columnTypeToOpenApiType,
5
+ getColumnMap
6
+ } from "metal-orm";
7
+ import type { SchemaNode } from "../../core/schema";
8
+ import { t } from "../../core/schema";
9
+ import type { FieldMeta } from "../../core/metadata";
10
+ import type { FieldOverride } from "../../core/decorators";
11
+
12
+ export type MetalDtoMode = "response" | "create" | "update";
13
+
14
+ export interface MetalDtoOptions {
15
+ mode?: MetalDtoMode;
16
+ include?: string[];
17
+ exclude?: string[];
18
+ overrides?: Record<string, FieldOverride>;
19
+ description?: string;
20
+ name?: string;
21
+ additionalProperties?: boolean;
22
+ }
23
+
24
+ export function buildFields(
25
+ target: any,
26
+ options: MetalDtoOptions
27
+ ): Record<string, FieldMeta> {
28
+ const columns = getColumnMap(target);
29
+ const include = options.include ? new Set(options.include) : undefined;
30
+ const exclude = options.exclude ? new Set(options.exclude) : undefined;
31
+ const mode = options.mode ?? "response";
32
+ const fields: Record<string, FieldMeta> = {};
33
+
34
+ for (const [name, col] of Object.entries(columns)) {
35
+ if (include && !include.has(name)) {
36
+ continue;
37
+ }
38
+ if (exclude && exclude.has(name)) {
39
+ continue;
40
+ }
41
+ if ((mode === "create" || mode === "update") && isAutoGenerated(col)) {
42
+ continue;
43
+ }
44
+ fields[name] = buildFieldMeta(col, mode);
45
+ }
46
+
47
+ return applyOverrides(fields, options.overrides, columns);
48
+ }
49
+
50
+ export function buildFieldMeta(col: any, mode: MetalDtoMode): FieldMeta {
51
+ let schema = columnToSchemaNode(col);
52
+ if (!col.notNull) {
53
+ schema = t.nullable(schema);
54
+ }
55
+
56
+ const optional = isOptional(col, mode);
57
+ const field: FieldMeta = { schema };
58
+ if (optional) {
59
+ field.optional = true;
60
+ }
61
+ if (col.comment) {
62
+ field.description = col.comment;
63
+ }
64
+ return field;
65
+ }
66
+
67
+ function isOptional(col: ColumnDef, mode: MetalDtoMode): boolean {
68
+ if (mode === "update") {
69
+ return true;
70
+ }
71
+ if (mode === "create") {
72
+ if (isAutoGenerated(col)) {
73
+ return true;
74
+ }
75
+ if (!col.notNull) {
76
+ return true;
77
+ }
78
+ if (col.default !== undefined) {
79
+ return true;
80
+ }
81
+ return false;
82
+ }
83
+ return !(col.notNull || col.primary);
84
+ }
85
+
86
+ function isAutoGenerated(col: ColumnDef): boolean {
87
+ return col.autoIncrement === true ||
88
+ col.generated === "always" ||
89
+ col.generated === "byDefault";
90
+ }
91
+
92
+ function columnToSchemaNode(col: ColumnDef): SchemaNode {
93
+ const enumValues = getEnumValues(col);
94
+ if (enumValues) {
95
+ return t.enum(enumValues);
96
+ }
97
+
98
+ const openApiType = columnTypeToOpenApiType(col);
99
+ switch (openApiType) {
100
+ case "integer":
101
+ return t.integer();
102
+ case "number":
103
+ return t.number();
104
+ case "boolean":
105
+ return t.boolean();
106
+ case "string":
107
+ return buildStringSchema(col);
108
+ case "array":
109
+ return t.array(t.any());
110
+ case "object":
111
+ return t.object({}, { additionalProperties: true });
112
+ case "null":
113
+ return t.null();
114
+ default:
115
+ return t.any();
116
+ }
117
+ }
118
+
119
+ function buildStringSchema(col: ColumnDef): SchemaNode {
120
+ const format = columnTypeToOpenApiFormat(col);
121
+ const type = col.type.toUpperCase();
122
+ const length = col.args?.[0];
123
+ if ((type === "VARCHAR" || type === "CHAR") && typeof length === "number") {
124
+ return t.string({
125
+ format,
126
+ maxLength: length,
127
+ minLength: type === "CHAR" ? length : undefined
128
+ });
129
+ }
130
+ return t.string({ format });
131
+ }
132
+
133
+ function getEnumValues(col: ColumnDef): string[] | undefined {
134
+ if (col.type.toUpperCase() !== "ENUM") {
135
+ return undefined;
136
+ }
137
+ if (!Array.isArray(col.args) || !col.args.every((value) => typeof value === "string")) {
138
+ return undefined;
139
+ }
140
+ return col.args as string[];
141
+ }
142
+
143
+ function applyOverrides(
144
+ fields: Record<string, FieldMeta>,
145
+ overrides: Record<string, FieldOverride> | undefined,
146
+ columns: Record<string, ColumnDef>
147
+ ): Record<string, FieldMeta> {
148
+ if (!overrides) {
149
+ return fields;
150
+ }
151
+ const output: Record<string, FieldMeta> = { ...fields };
152
+ const availableColumns = new Set(Object.keys(columns));
153
+ for (const [name, override] of Object.entries(overrides)) {
154
+ const field = output[name];
155
+ if (!field) {
156
+ if (availableColumns.has(name)) {
157
+ continue;
158
+ }
159
+ throw new Error(`DTO field "${name}" does not exist.`);
160
+ }
161
+ output[name] = normalizeOverride(field, override);
162
+ }
163
+ return output;
164
+ }
165
+
166
+ function normalizeOverride(field: FieldMeta, override: FieldOverride): FieldMeta {
167
+ if (isSchemaNode(override)) {
168
+ return {
169
+ schema: override,
170
+ optional: (override as any).optional ?? field.optional ?? (field.schema as any).optional,
171
+ description: field.description
172
+ };
173
+ }
174
+ const schema = override.schema ?? field.schema;
175
+ const optional = override.optional ?? (schema as any).optional ?? field.optional ?? (field.schema as any).optional;
176
+ return {
177
+ schema,
178
+ optional,
179
+ description: override.description ?? field.description
180
+ };
181
+ }
182
+
183
+ function isSchemaNode(value: unknown): value is SchemaNode {
184
+ return !!value && typeof value === "object" && "kind" in (value as SchemaNode);
185
+ }
@@ -0,0 +1,52 @@
1
+ import type { Filter, FilterMapping, ParseFilterOptions } from "./types";
2
+
3
+ /**
4
+ * Parses filter parameters from query parameters.
5
+ * @param query - Query parameters
6
+ * @param mappings - Filter field mappings
7
+ * @returns Parsed filter or undefined
8
+ */
9
+ export function parseFilter<T, K extends keyof T>(
10
+ query: Record<string, unknown> | undefined,
11
+ mappings: Record<string, { field: K; operator: "equals" | "contains" | "startsWith" | "endsWith" | "gt" | "gte" | "lt" | "lte" }>
12
+ ): Filter<T, K> | undefined {
13
+ if (!query) {
14
+ return undefined;
15
+ }
16
+
17
+ const filter: Filter<T, K> = {};
18
+
19
+ for (const [queryKey, value] of Object.entries(query)) {
20
+ const mapping = mappings[queryKey];
21
+ if (!mapping || value === undefined || value === null || value === "") {
22
+ continue;
23
+ }
24
+
25
+ const { field, operator } = mapping;
26
+ if (!filter[field]) {
27
+ filter[field] = {};
28
+ }
29
+ filter[field]![operator] = value as T[K];
30
+ }
31
+
32
+ return Object.keys(filter).length ? filter : undefined;
33
+ }
34
+
35
+ /**
36
+ * Creates filter mappings for an entity.
37
+ * @param entity - Entity type
38
+ * @param fields - Array of field definitions
39
+ * @returns Filter mappings
40
+ */
41
+ export function createFilterMappings<T extends Record<string, unknown>>(
42
+ entity: T,
43
+ fields: Array<{ queryKey: string; field: keyof T; operator?: "equals" | "contains" | "startsWith" | "endsWith" }>
44
+ ): Record<string, { field: keyof T; operator: "equals" | "contains" | "startsWith" | "endsWith" }> {
45
+ const mappings: Record<string, { field: keyof T; operator: "equals" | "contains" | "startsWith" | "endsWith" }> = {};
46
+
47
+ for (const { queryKey, field, operator = "equals" } of fields) {
48
+ mappings[queryKey] = { field, operator };
49
+ }
50
+
51
+ return mappings;
52
+ }
@@ -0,0 +1,66 @@
1
+ export {
2
+ MetalDto
3
+ } from "./dto";
4
+
5
+ export {
6
+ parsePagination
7
+ } from "./pagination";
8
+
9
+ export {
10
+ parseFilter,
11
+ createFilterMappings
12
+ } from "./filters";
13
+
14
+ export {
15
+ createPagedQueryDtoClass,
16
+ createPagedResponseDtoClass,
17
+ createPagedFilterQueryDtoClass
18
+ } from "./paged-dtos";
19
+
20
+ export {
21
+ createMetalCrudDtos,
22
+ createMetalCrudDtoClasses,
23
+ createNestedCreateDtoClass
24
+ } from "./crud-dtos";
25
+
26
+ export {
27
+ createMetalDtoOverrides,
28
+ type CreateMetalDtoOverridesOptions
29
+ } from "./convention-overrides";
30
+
31
+ export {
32
+ createErrorDtoClass,
33
+ StandardErrorDto,
34
+ SimpleErrorDto,
35
+ BasicErrorDto
36
+ } from "./error-dtos";
37
+
38
+ export {
39
+ withSession,
40
+ parseIdOrThrow
41
+ } from "./utils";
42
+
43
+ export type {
44
+ MetalDtoMode,
45
+ MetalDtoOptions,
46
+ MetalDtoTarget,
47
+ PaginationConfig,
48
+ PaginationOptions,
49
+ ParsedPagination,
50
+ Filter,
51
+ FilterMapping,
52
+ FilterFieldMapping,
53
+ ParseFilterOptions,
54
+ PagedQueryDtoOptions,
55
+ PagedResponseDtoOptions,
56
+ PagedFilterQueryDtoOptions,
57
+ FilterFieldDef,
58
+ MetalCrudDtoOptions,
59
+ MetalCrudDtoClassOptions,
60
+ MetalCrudDtoDecorators,
61
+ MetalCrudDtoClasses,
62
+ MetalCrudDtoClassNames,
63
+ NestedCreateDtoOptions,
64
+ ErrorDtoOptions,
65
+ CreateSessionFn
66
+ } from "./types";
@@ -0,0 +1,94 @@
1
+ import { Dto, Field } from "../../core/decorators";
2
+ import type { DtoConstructor } from "../../core/types";
3
+ import type { SchemaNode } from "../../core/schema";
4
+ import { t } from "../../core/schema";
5
+ import type { FieldMeta } from "../../core/metadata";
6
+ import { registerDto } from "../../core/metadata";
7
+ import type {
8
+ PagedQueryDtoOptions,
9
+ PagedResponseDtoOptions,
10
+ PagedFilterQueryDtoOptions
11
+ } from "./types";
12
+
13
+ export function createPagedQueryDtoClass(
14
+ options: PagedQueryDtoOptions = {}
15
+ ): DtoConstructor {
16
+ const { defaultPageSize = 25, maxPageSize = 100 } = options;
17
+
18
+ @Dto({ name: options.name })
19
+ class PagedQueryDto {
20
+ @Field(t.optional(t.integer({ minimum: 1, default: 1 })))
21
+ page?: number;
22
+
23
+ @Field(
24
+ t.optional(
25
+ t.integer({ minimum: 1, maximum: maxPageSize, default: defaultPageSize })
26
+ )
27
+ )
28
+ pageSize?: number;
29
+ }
30
+
31
+ return PagedQueryDto;
32
+ }
33
+
34
+ export function createPagedFilterQueryDtoClass(
35
+ options: PagedFilterQueryDtoOptions
36
+ ): DtoConstructor {
37
+ const { filters, defaultPageSize = 25, maxPageSize = 100, name } = options;
38
+
39
+ const PagedFilterQueryDto = class {
40
+ page?: number;
41
+ pageSize?: number;
42
+ [key: string]: any;
43
+ };
44
+
45
+ const fields: Record<string, FieldMeta> = {
46
+ page: { schema: t.optional(t.integer({ minimum: 1, default: 1 })), optional: true },
47
+ pageSize: { schema: t.optional(t.integer({ minimum: 1, maximum: maxPageSize, default: defaultPageSize })), optional: true }
48
+ };
49
+
50
+ for (const [fieldName, def] of Object.entries(filters)) {
51
+ const schema = def.schema ?? t.string({ minLength: 1 });
52
+ fields[fieldName] = { schema: t.optional(schema), optional: true };
53
+ }
54
+
55
+ registerDto(PagedFilterQueryDto, {
56
+ name: name ?? "PagedFilterQueryDto",
57
+ fields
58
+ });
59
+
60
+ return PagedFilterQueryDto as DtoConstructor;
61
+ }
62
+
63
+ export function createPagedResponseDtoClass(
64
+ options: PagedResponseDtoOptions
65
+ ): DtoConstructor {
66
+ const { itemDto, description, name } = options;
67
+ const responseDescription = description ?? "Paged response.";
68
+
69
+ @Dto({ name, description: responseDescription })
70
+ class PagedResponseDto {
71
+ @Field(t.array(t.ref(itemDto)))
72
+ items!: unknown[];
73
+
74
+ @Field(t.integer({ minimum: 0 }))
75
+ totalItems!: number;
76
+
77
+ @Field(t.integer({ minimum: 1 }))
78
+ page!: number;
79
+
80
+ @Field(t.integer({ minimum: 1 }))
81
+ pageSize!: number;
82
+
83
+ @Field(t.integer({ minimum: 1 }))
84
+ totalPages!: number;
85
+
86
+ @Field(t.boolean())
87
+ hasNextPage!: boolean;
88
+
89
+ @Field(t.boolean())
90
+ hasPrevPage!: boolean;
91
+ }
92
+
93
+ return PagedResponseDto;
94
+ }
@@ -0,0 +1,28 @@
1
+ import type { PaginationConfig, PaginationOptions, ParsedPagination } from "./types";
2
+ import { coerce } from "../../core/coerce";
3
+
4
+ /**
5
+ * Parses pagination parameters from query parameters.
6
+ * @param query - Query parameters
7
+ * @param config - Pagination configuration
8
+ * @returns Parsed pagination result
9
+ */
10
+ export function parsePagination(
11
+ query: Record<string, unknown>,
12
+ config: PaginationConfig = {}
13
+ ): ParsedPagination {
14
+ const { defaultPageSize = 25, maxPageSize = 100 } = config;
15
+
16
+ const page = coerce.integer(query.page as string | number, {
17
+ min: 1,
18
+ clamp: true
19
+ }) ?? 1;
20
+
21
+ const pageSize = coerce.integer(query.pageSize as string | number, {
22
+ min: 1,
23
+ max: maxPageSize,
24
+ clamp: true
25
+ }) ?? defaultPageSize;
26
+
27
+ return { page, pageSize };
28
+ }