@ddd-ts-kit/http 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/README.md +388 -2
  2. package/dist/criteria/coerce-value.d.ts +8 -0
  3. package/dist/criteria/coerce-value.d.ts.map +1 -0
  4. package/dist/criteria/coerce-value.js +29 -0
  5. package/dist/criteria/coerce-value.js.map +1 -0
  6. package/dist/criteria/criteria-from.d.ts +11 -0
  7. package/dist/criteria/criteria-from.d.ts.map +1 -0
  8. package/dist/criteria/criteria-from.js +17 -0
  9. package/dist/criteria/criteria-from.js.map +1 -0
  10. package/dist/criteria/criteria-parameters.d.ts +10 -0
  11. package/dist/criteria/criteria-parameters.d.ts.map +1 -0
  12. package/dist/criteria/criteria-parameters.js +45 -0
  13. package/dist/criteria/criteria-parameters.js.map +1 -0
  14. package/dist/criteria/criteria-query-options.d.ts +6 -0
  15. package/dist/criteria/criteria-query-options.d.ts.map +1 -0
  16. package/dist/criteria/criteria-query-options.js +2 -0
  17. package/dist/criteria/criteria-query-options.js.map +1 -0
  18. package/dist/criteria/criteria-query-schema.d.ts +10 -0
  19. package/dist/criteria/criteria-query-schema.d.ts.map +1 -0
  20. package/dist/criteria/criteria-query-schema.js +12 -0
  21. package/dist/criteria/criteria-query-schema.js.map +1 -0
  22. package/dist/criteria/filter-entries.d.ts +9 -0
  23. package/dist/criteria/filter-entries.d.ts.map +1 -0
  24. package/dist/criteria/filter-entries.js +28 -0
  25. package/dist/criteria/filter-entries.js.map +1 -0
  26. package/dist/criteria/filter-entry.d.ts +6 -0
  27. package/dist/criteria/filter-entry.d.ts.map +1 -0
  28. package/dist/criteria/filter-entry.js +2 -0
  29. package/dist/criteria/filter-entry.js.map +1 -0
  30. package/dist/criteria/parse-condition.d.ts +7 -0
  31. package/dist/criteria/parse-condition.d.ts.map +1 -0
  32. package/dist/criteria/parse-condition.js +52 -0
  33. package/dist/criteria/parse-condition.js.map +1 -0
  34. package/dist/criteria/parse-criteria-query.d.ts +5 -0
  35. package/dist/criteria/parse-criteria-query.d.ts.map +1 -0
  36. package/dist/criteria/parse-criteria-query.js +31 -0
  37. package/dist/criteria/parse-criteria-query.js.map +1 -0
  38. package/dist/criteria/parse-filters.d.ts +15 -0
  39. package/dist/criteria/parse-filters.d.ts.map +1 -0
  40. package/dist/criteria/parse-filters.js +52 -0
  41. package/dist/criteria/parse-filters.js.map +1 -0
  42. package/dist/criteria/sortable-fields.d.ts +4 -0
  43. package/dist/criteria/sortable-fields.d.ts.map +1 -0
  44. package/dist/criteria/sortable-fields.js +6 -0
  45. package/dist/criteria/sortable-fields.js.map +1 -0
  46. package/dist/criteria/split-list.d.ts +3 -0
  47. package/dist/criteria/split-list.d.ts.map +1 -0
  48. package/dist/criteria/split-list.js +19 -0
  49. package/dist/criteria/split-list.js.map +1 -0
  50. package/dist/docs/docs-page.d.ts +11 -0
  51. package/dist/docs/docs-page.d.ts.map +1 -0
  52. package/dist/docs/docs-page.js +18 -0
  53. package/dist/docs/docs-page.js.map +1 -0
  54. package/dist/docs/docs-ui.d.ts +2 -0
  55. package/dist/docs/docs-ui.d.ts.map +1 -0
  56. package/dist/docs/docs-ui.js +2 -0
  57. package/dist/docs/docs-ui.js.map +1 -0
  58. package/dist/docs/open-api-docs-routes.d.ts +22 -0
  59. package/dist/docs/open-api-docs-routes.d.ts.map +1 -0
  60. package/dist/docs/open-api-docs-routes.js +54 -0
  61. package/dist/docs/open-api-docs-routes.js.map +1 -0
  62. package/dist/docs.d.ts +3 -0
  63. package/dist/docs.d.ts.map +1 -0
  64. package/dist/docs.js +2 -0
  65. package/dist/docs.js.map +1 -0
  66. package/dist/error/create-error-mapper.d.ts +10 -0
  67. package/dist/error/create-error-mapper.d.ts.map +1 -0
  68. package/dist/error/create-error-mapper.js +12 -0
  69. package/dist/error/create-error-mapper.js.map +1 -0
  70. package/dist/error/default-error-mapping.d.ts +3 -0
  71. package/dist/error/default-error-mapping.d.ts.map +1 -0
  72. package/dist/error/default-error-mapping.js +9 -0
  73. package/dist/error/default-error-mapping.js.map +1 -0
  74. package/dist/error/error-mapper.d.ts +12 -0
  75. package/dist/error/error-mapper.d.ts.map +1 -0
  76. package/dist/error/error-mapper.js +8 -0
  77. package/dist/error/error-mapper.js.map +1 -0
  78. package/dist/error/error-mapping.d.ts +3 -0
  79. package/dist/error/error-mapping.d.ts.map +1 -0
  80. package/dist/error/error-mapping.js +2 -0
  81. package/dist/error/error-mapping.js.map +1 -0
  82. package/dist/error/forbidden-error.d.ts +5 -0
  83. package/dist/error/forbidden-error.d.ts.map +1 -0
  84. package/dist/error/forbidden-error.js +5 -0
  85. package/dist/error/forbidden-error.js.map +1 -0
  86. package/dist/error/internal-error-code.d.ts +2 -0
  87. package/dist/error/internal-error-code.d.ts.map +1 -0
  88. package/dist/error/internal-error-code.js +2 -0
  89. package/dist/error/internal-error-code.js.map +1 -0
  90. package/dist/error/problem.d.ts +11 -0
  91. package/dist/error/problem.d.ts.map +1 -0
  92. package/dist/error/problem.js +2 -0
  93. package/dist/error/problem.js.map +1 -0
  94. package/dist/error/response-contract-error.d.ts +7 -0
  95. package/dist/error/response-contract-error.d.ts.map +1 -0
  96. package/dist/error/response-contract-error.js +10 -0
  97. package/dist/error/response-contract-error.js.map +1 -0
  98. package/dist/error/status-title.d.ts +2 -0
  99. package/dist/error/status-title.d.ts.map +1 -0
  100. package/dist/error/status-title.js +28 -0
  101. package/dist/error/status-title.js.map +1 -0
  102. package/dist/error/to-problem.d.ts +4 -0
  103. package/dist/error/to-problem.d.ts.map +1 -0
  104. package/dist/error/to-problem.js +34 -0
  105. package/dist/error/to-problem.js.map +1 -0
  106. package/dist/error/unauthorized-error.d.ts +5 -0
  107. package/dist/error/unauthorized-error.d.ts.map +1 -0
  108. package/dist/error/unauthorized-error.js +5 -0
  109. package/dist/error/unauthorized-error.js.map +1 -0
  110. package/dist/express/mount-express.d.ts +10 -0
  111. package/dist/express/mount-express.d.ts.map +1 -0
  112. package/dist/express/mount-express.js +38 -0
  113. package/dist/express/mount-express.js.map +1 -0
  114. package/dist/express.d.ts +2 -0
  115. package/dist/express.d.ts.map +1 -0
  116. package/dist/express.js +2 -0
  117. package/dist/express.js.map +1 -0
  118. package/dist/fastify/fastify-mount-options.d.ts +3 -0
  119. package/dist/fastify/fastify-mount-options.d.ts.map +1 -0
  120. package/dist/fastify/fastify-mount-options.js +2 -0
  121. package/dist/fastify/fastify-mount-options.js.map +1 -0
  122. package/dist/fastify/fastify-routes.d.ts +6 -0
  123. package/dist/fastify/fastify-routes.d.ts.map +1 -0
  124. package/dist/fastify/fastify-routes.js +10 -0
  125. package/dist/fastify/fastify-routes.js.map +1 -0
  126. package/dist/fastify/mount-fastify.d.ts +6 -0
  127. package/dist/fastify/mount-fastify.d.ts.map +1 -0
  128. package/dist/fastify/mount-fastify.js +19 -0
  129. package/dist/fastify/mount-fastify.js.map +1 -0
  130. package/dist/fastify.d.ts +4 -0
  131. package/dist/fastify.d.ts.map +1 -0
  132. package/dist/fastify.js +3 -0
  133. package/dist/fastify.js.map +1 -0
  134. package/dist/index.d.ts +50 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +27 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/nest/create-routes-module.d.ts +15 -0
  139. package/dist/nest/create-routes-module.d.ts.map +1 -0
  140. package/dist/nest/create-routes-module.js +54 -0
  141. package/dist/nest/create-routes-module.js.map +1 -0
  142. package/dist/nest/routes-factory.d.ts +8 -0
  143. package/dist/nest/routes-factory.d.ts.map +1 -0
  144. package/dist/nest/routes-factory.js +2 -0
  145. package/dist/nest/routes-factory.js.map +1 -0
  146. package/dist/nest/routes-mounter.d.ts +9 -0
  147. package/dist/nest/routes-mounter.d.ts.map +1 -0
  148. package/dist/nest/routes-mounter.js +8 -0
  149. package/dist/nest/routes-mounter.js.map +1 -0
  150. package/dist/nest.d.ts +4 -0
  151. package/dist/nest.d.ts.map +1 -0
  152. package/dist/nest.js +3 -0
  153. package/dist/nest.js.map +1 -0
  154. package/dist/openapi/check-open-api-drift.d.ts +6 -0
  155. package/dist/openapi/check-open-api-drift.d.ts.map +1 -0
  156. package/dist/openapi/check-open-api-drift.js +6 -0
  157. package/dist/openapi/check-open-api-drift.js.map +1 -0
  158. package/dist/openapi/compare.d.ts +3 -0
  159. package/dist/openapi/compare.d.ts.map +1 -0
  160. package/dist/openapi/compare.js +5 -0
  161. package/dist/openapi/compare.js.map +1 -0
  162. package/dist/openapi/definitions.d.ts +14 -0
  163. package/dist/openapi/definitions.d.ts.map +1 -0
  164. package/dist/openapi/definitions.js +61 -0
  165. package/dist/openapi/definitions.js.map +1 -0
  166. package/dist/openapi/generate-open-api.d.ts +21 -0
  167. package/dist/openapi/generate-open-api.d.ts.map +1 -0
  168. package/dist/openapi/generate-open-api.js +43 -0
  169. package/dist/openapi/generate-open-api.js.map +1 -0
  170. package/dist/openapi/open-api-document.d.ts +18 -0
  171. package/dist/openapi/open-api-document.d.ts.map +1 -0
  172. package/dist/openapi/open-api-document.js +2 -0
  173. package/dist/openapi/open-api-document.js.map +1 -0
  174. package/dist/openapi/open-api-info.d.ts +6 -0
  175. package/dist/openapi/open-api-info.d.ts.map +1 -0
  176. package/dist/openapi/open-api-info.js +2 -0
  177. package/dist/openapi/open-api-info.js.map +1 -0
  178. package/dist/openapi/open-api-path.d.ts +2 -0
  179. package/dist/openapi/open-api-path.d.ts.map +1 -0
  180. package/dist/openapi/open-api-path.js +4 -0
  181. package/dist/openapi/open-api-path.js.map +1 -0
  182. package/dist/openapi/open-api-server.d.ts +5 -0
  183. package/dist/openapi/open-api-server.d.ts.map +1 -0
  184. package/dist/openapi/open-api-server.js +2 -0
  185. package/dist/openapi/open-api-server.js.map +1 -0
  186. package/dist/openapi/path-items.d.ts +7 -0
  187. package/dist/openapi/path-items.d.ts.map +1 -0
  188. package/dist/openapi/path-items.js +43 -0
  189. package/dist/openapi/path-items.js.map +1 -0
  190. package/dist/openapi/path-parameters.d.ts +4 -0
  191. package/dist/openapi/path-parameters.d.ts.map +1 -0
  192. package/dist/openapi/path-parameters.js +13 -0
  193. package/dist/openapi/path-parameters.js.map +1 -0
  194. package/dist/openapi/problem-schema.d.ts +3 -0
  195. package/dist/openapi/problem-schema.d.ts.map +1 -0
  196. package/dist/openapi/problem-schema.js +27 -0
  197. package/dist/openapi/problem-schema.js.map +1 -0
  198. package/dist/openapi/requirement.d.ts +3 -0
  199. package/dist/openapi/requirement.d.ts.map +1 -0
  200. package/dist/openapi/requirement.js +5 -0
  201. package/dist/openapi/requirement.js.map +1 -0
  202. package/dist/openapi/responses.d.ts +7 -0
  203. package/dist/openapi/responses.d.ts.map +1 -0
  204. package/dist/openapi/responses.js +50 -0
  205. package/dist/openapi/responses.js.map +1 -0
  206. package/dist/openapi/schema-parameters.d.ts +5 -0
  207. package/dist/openapi/schema-parameters.d.ts.map +1 -0
  208. package/dist/openapi/schema-parameters.js +24 -0
  209. package/dist/openapi/schema-parameters.js.map +1 -0
  210. package/dist/openapi/stringify-open-api.d.ts +4 -0
  211. package/dist/openapi/stringify-open-api.d.ts.map +1 -0
  212. package/dist/openapi/stringify-open-api.js +5 -0
  213. package/dist/openapi/stringify-open-api.js.map +1 -0
  214. package/dist/openapi.d.ts +7 -0
  215. package/dist/openapi.d.ts.map +1 -0
  216. package/dist/openapi.js +4 -0
  217. package/dist/openapi.js.map +1 -0
  218. package/dist/pagination/issue.d.ts +3 -0
  219. package/dist/pagination/issue.d.ts.map +1 -0
  220. package/dist/pagination/issue.js +4 -0
  221. package/dist/pagination/issue.js.map +1 -0
  222. package/dist/pagination/limits-of.d.ts +3 -0
  223. package/dist/pagination/limits-of.d.ts.map +1 -0
  224. package/dist/pagination/limits-of.js +8 -0
  225. package/dist/pagination/limits-of.js.map +1 -0
  226. package/dist/pagination/page-body.d.ts +7 -0
  227. package/dist/pagination/page-body.d.ts.map +1 -0
  228. package/dist/pagination/page-body.js +2 -0
  229. package/dist/pagination/page-body.js.map +1 -0
  230. package/dist/pagination/page-query-options.d.ts +8 -0
  231. package/dist/pagination/page-query-options.d.ts.map +1 -0
  232. package/dist/pagination/page-query-options.js +2 -0
  233. package/dist/pagination/page-query-options.js.map +1 -0
  234. package/dist/pagination/page-query-schema.d.ts +6 -0
  235. package/dist/pagination/page-query-schema.d.ts.map +1 -0
  236. package/dist/pagination/page-query-schema.js +8 -0
  237. package/dist/pagination/page-query-schema.js.map +1 -0
  238. package/dist/pagination/page-request-from.d.ts +9 -0
  239. package/dist/pagination/page-request-from.d.ts.map +1 -0
  240. package/dist/pagination/page-request-from.js +16 -0
  241. package/dist/pagination/page-request-from.js.map +1 -0
  242. package/dist/pagination/page-request-parameters.d.ts +9 -0
  243. package/dist/pagination/page-request-parameters.d.ts.map +1 -0
  244. package/dist/pagination/page-request-parameters.js +30 -0
  245. package/dist/pagination/page-request-parameters.js.map +1 -0
  246. package/dist/pagination/page-response.d.ts +5 -0
  247. package/dist/pagination/page-response.d.ts.map +1 -0
  248. package/dist/pagination/page-response.js +9 -0
  249. package/dist/pagination/page-response.js.map +1 -0
  250. package/dist/pagination/page-schema-of.d.ts +9 -0
  251. package/dist/pagination/page-schema-of.d.ts.map +1 -0
  252. package/dist/pagination/page-schema-of.js +60 -0
  253. package/dist/pagination/page-schema-of.js.map +1 -0
  254. package/dist/pagination/parse-page-query.d.ts +5 -0
  255. package/dist/pagination/parse-page-query.d.ts.map +1 -0
  256. package/dist/pagination/parse-page-query.js +108 -0
  257. package/dist/pagination/parse-page-query.js.map +1 -0
  258. package/dist/pipeline/assert-declared-response.d.ts +4 -0
  259. package/dist/pipeline/assert-declared-response.d.ts.map +1 -0
  260. package/dist/pipeline/assert-declared-response.js +18 -0
  261. package/dist/pipeline/assert-declared-response.js.map +1 -0
  262. package/dist/pipeline/correlation-header.d.ts +2 -0
  263. package/dist/pipeline/correlation-header.d.ts.map +1 -0
  264. package/dist/pipeline/correlation-header.js +2 -0
  265. package/dist/pipeline/correlation-header.js.map +1 -0
  266. package/dist/pipeline/correlation-id-of.d.ts +4 -0
  267. package/dist/pipeline/correlation-id-of.d.ts.map +1 -0
  268. package/dist/pipeline/correlation-id-of.js +7 -0
  269. package/dist/pipeline/correlation-id-of.js.map +1 -0
  270. package/dist/pipeline/error-context.d.ts +15 -0
  271. package/dist/pipeline/error-context.d.ts.map +1 -0
  272. package/dist/pipeline/error-context.js +2 -0
  273. package/dist/pipeline/error-context.js.map +1 -0
  274. package/dist/pipeline/execute-options.d.ts +40 -0
  275. package/dist/pipeline/execute-options.d.ts.map +1 -0
  276. package/dist/pipeline/execute-options.js +2 -0
  277. package/dist/pipeline/execute-options.js.map +1 -0
  278. package/dist/pipeline/execute-route.d.ts +6 -0
  279. package/dist/pipeline/execute-route.d.ts.map +1 -0
  280. package/dist/pipeline/execute-route.js +108 -0
  281. package/dist/pipeline/execute-route.js.map +1 -0
  282. package/dist/pipeline/execution-of-request.d.ts +16 -0
  283. package/dist/pipeline/execution-of-request.d.ts.map +1 -0
  284. package/dist/pipeline/execution-of-request.js +44 -0
  285. package/dist/pipeline/execution-of-request.js.map +1 -0
  286. package/dist/pipeline/raw-request.d.ts +10 -0
  287. package/dist/pipeline/raw-request.d.ts.map +1 -0
  288. package/dist/pipeline/raw-request.js +2 -0
  289. package/dist/pipeline/raw-request.js.map +1 -0
  290. package/dist/pipeline/report-http-errors.d.ts +11 -0
  291. package/dist/pipeline/report-http-errors.d.ts.map +1 -0
  292. package/dist/pipeline/report-http-errors.js +17 -0
  293. package/dist/pipeline/report-http-errors.js.map +1 -0
  294. package/dist/pipeline/route-around.d.ts +5 -0
  295. package/dist/pipeline/route-around.d.ts.map +1 -0
  296. package/dist/pipeline/route-around.js +2 -0
  297. package/dist/pipeline/route-around.js.map +1 -0
  298. package/dist/pipeline/route-response.d.ts +7 -0
  299. package/dist/pipeline/route-response.d.ts.map +1 -0
  300. package/dist/pipeline/route-response.js +2 -0
  301. package/dist/pipeline/route-response.js.map +1 -0
  302. package/dist/pipeline/serialize-body.d.ts +7 -0
  303. package/dist/pipeline/serialize-body.d.ts.map +1 -0
  304. package/dist/pipeline/serialize-body.js +16 -0
  305. package/dist/pipeline/serialize-body.js.map +1 -0
  306. package/dist/pipeline/validate-request.d.ts +8 -0
  307. package/dist/pipeline/validate-request.d.ts.map +1 -0
  308. package/dist/pipeline/validate-request.js +30 -0
  309. package/dist/pipeline/validate-request.js.map +1 -0
  310. package/dist/pipeline/well-formed-identifier.d.ts +3 -0
  311. package/dist/pipeline/well-formed-identifier.d.ts.map +1 -0
  312. package/dist/pipeline/well-formed-identifier.js +6 -0
  313. package/dist/pipeline/well-formed-identifier.js.map +1 -0
  314. package/dist/route/assert-unique-routes.d.ts +3 -0
  315. package/dist/route/assert-unique-routes.d.ts.map +1 -0
  316. package/dist/route/assert-unique-routes.js +22 -0
  317. package/dist/route/assert-unique-routes.js.map +1 -0
  318. package/dist/route/define-route.d.ts +7 -0
  319. package/dist/route/define-route.d.ts.map +1 -0
  320. package/dist/route/define-route.js +17 -0
  321. package/dist/route/define-route.js.map +1 -0
  322. package/dist/route/define-routes.d.ts +4 -0
  323. package/dist/route/define-routes.d.ts.map +1 -0
  324. package/dist/route/define-routes.js +11 -0
  325. package/dist/route/define-routes.js.map +1 -0
  326. package/dist/route/duplicate-route-error.d.ts +4 -0
  327. package/dist/route/duplicate-route-error.d.ts.map +1 -0
  328. package/dist/route/duplicate-route-error.js +7 -0
  329. package/dist/route/duplicate-route-error.js.map +1 -0
  330. package/dist/route/handler-input.d.ts +23 -0
  331. package/dist/route/handler-input.d.ts.map +1 -0
  332. package/dist/route/handler-input.js +2 -0
  333. package/dist/route/handler-input.js.map +1 -0
  334. package/dist/route/handler-result.d.ts +20 -0
  335. package/dist/route/handler-result.d.ts.map +1 -0
  336. package/dist/route/handler-result.js +2 -0
  337. package/dist/route/handler-result.js.map +1 -0
  338. package/dist/route/http-method.d.ts +2 -0
  339. package/dist/route/http-method.d.ts.map +1 -0
  340. package/dist/route/http-method.js +2 -0
  341. package/dist/route/http-method.js.map +1 -0
  342. package/dist/route/prefix-routes.d.ts +4 -0
  343. package/dist/route/prefix-routes.d.ts.map +1 -0
  344. package/dist/route/prefix-routes.js +10 -0
  345. package/dist/route/prefix-routes.js.map +1 -0
  346. package/dist/route/raw-headers.d.ts +2 -0
  347. package/dist/route/raw-headers.d.ts.map +1 -0
  348. package/dist/route/raw-headers.js +2 -0
  349. package/dist/route/raw-headers.js.map +1 -0
  350. package/dist/route/request-context.d.ts +13 -0
  351. package/dist/route/request-context.d.ts.map +1 -0
  352. package/dist/route/request-context.js +2 -0
  353. package/dist/route/request-context.js.map +1 -0
  354. package/dist/route/request-schemas.d.ts +8 -0
  355. package/dist/route/request-schemas.d.ts.map +1 -0
  356. package/dist/route/request-schemas.js +2 -0
  357. package/dist/route/request-schemas.js.map +1 -0
  358. package/dist/route/response-spec.d.ts +6 -0
  359. package/dist/route/response-spec.d.ts.map +1 -0
  360. package/dist/route/response-spec.js +2 -0
  361. package/dist/route/response-spec.js.map +1 -0
  362. package/dist/route/responses-spec.d.ts +5 -0
  363. package/dist/route/responses-spec.d.ts.map +1 -0
  364. package/dist/route/responses-spec.js +2 -0
  365. package/dist/route/responses-spec.js.map +1 -0
  366. package/dist/route/route-handler.d.ts +6 -0
  367. package/dist/route/route-handler.d.ts.map +1 -0
  368. package/dist/route/route-handler.js +2 -0
  369. package/dist/route/route-handler.js.map +1 -0
  370. package/dist/route/route-input.d.ts +10 -0
  371. package/dist/route/route-input.d.ts.map +1 -0
  372. package/dist/route/route-input.js +2 -0
  373. package/dist/route/route-input.js.map +1 -0
  374. package/dist/route/route-output.d.ts +6 -0
  375. package/dist/route/route-output.d.ts.map +1 -0
  376. package/dist/route/route-output.js +2 -0
  377. package/dist/route/route-output.js.map +1 -0
  378. package/dist/route/route-spec.d.ts +23 -0
  379. package/dist/route/route-spec.d.ts.map +1 -0
  380. package/dist/route/route-spec.js +2 -0
  381. package/dist/route/route-spec.js.map +1 -0
  382. package/dist/route/route.d.ts +11 -0
  383. package/dist/route/route.d.ts.map +1 -0
  384. package/dist/route/route.js +2 -0
  385. package/dist/route/route.js.map +1 -0
  386. package/dist/route/without-trailing-slashes.d.ts +3 -0
  387. package/dist/route/without-trailing-slashes.d.ts.map +1 -0
  388. package/dist/route/without-trailing-slashes.js +9 -0
  389. package/dist/route/without-trailing-slashes.js.map +1 -0
  390. package/dist/support/is-record.d.ts +2 -0
  391. package/dist/support/is-record.d.ts.map +1 -0
  392. package/dist/support/is-record.js +4 -0
  393. package/dist/support/is-record.js.map +1 -0
  394. package/package.json +82 -4
@@ -0,0 +1,3 @@
1
+ /** Code-unit order, not locale order: the output must not depend on the machine's locale. */
2
+ export declare function compare(a: string, b: string): number;
3
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/openapi/compare.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,5 @@
1
+ /** Code-unit order, not locale order: the output must not depend on the machine's locale. */
2
+ export function compare(a, b) {
3
+ return a < b ? -1 : a > b ? 1 : 0;
4
+ }
5
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/openapi/compare.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { JsonSchema, Schema } from '@ddd-ts-kit/validation';
2
+ /**
3
+ * Local definitions (`$defs`) of the embedded JSON Schemas are moved to `components.schemas`,
4
+ * because a `#/$defs/...` pointer means nothing once the schema sits inside a document.
5
+ */
6
+ export declare class Definitions {
7
+ private readonly schemas;
8
+ private readonly sources;
9
+ embed(schema: Schema<unknown>): JsonSchema;
10
+ all(): Record<string, JsonSchema>;
11
+ /** Two different definitions sharing a name get distinct component names. */
12
+ private reserve;
13
+ }
14
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/openapi/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAIjE;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IAEzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,CAgBzC;IAED,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAEhC;IAED,6EAA6E;IAC7E,OAAO,CAAC,OAAO;CAgBhB"}
@@ -0,0 +1,61 @@
1
+ import { isRecord } from '../support/is-record.js';
2
+ import { compare } from './compare.js';
3
+ /**
4
+ * Local definitions (`$defs`) of the embedded JSON Schemas are moved to `components.schemas`,
5
+ * because a `#/$defs/...` pointer means nothing once the schema sits inside a document.
6
+ */
7
+ export class Definitions {
8
+ schemas = new Map();
9
+ sources = new Map();
10
+ embed(schema) {
11
+ const { $schema: _dialect, $defs, definitions, ...rest } = schema.toJsonSchema();
12
+ const local = { ...(isRecord(definitions) ? definitions : {}), ...(isRecord($defs) ? $defs : {}) };
13
+ const names = new Map();
14
+ for (const name of Object.keys(local).sort(compare)) {
15
+ names.set(name, this.reserve(name, JSON.stringify(local[name])));
16
+ }
17
+ for (const [name, component] of names) {
18
+ if (!this.schemas.has(component)) {
19
+ this.schemas.set(component, asSchema(rewriteRefs(local[name], names)));
20
+ }
21
+ }
22
+ return asSchema(rewriteRefs(rest, names));
23
+ }
24
+ all() {
25
+ return Object.fromEntries(this.schemas);
26
+ }
27
+ /** Two different definitions sharing a name get distinct component names. */
28
+ reserve(name, source) {
29
+ for (let attempt = 1;; attempt += 1) {
30
+ const candidate = attempt === 1 ? name : `${name}_${attempt}`;
31
+ const known = candidate === 'Problem' ? '' : this.sources.get(candidate);
32
+ if (known === undefined) {
33
+ this.sources.set(candidate, source);
34
+ return candidate;
35
+ }
36
+ if (known === source) {
37
+ return candidate;
38
+ }
39
+ }
40
+ }
41
+ }
42
+ function rewriteRefs(node, names) {
43
+ if (Array.isArray(node)) {
44
+ return node.map((item) => rewriteRefs(item, names));
45
+ }
46
+ if (!isRecord(node)) {
47
+ return node;
48
+ }
49
+ return Object.fromEntries(Object.entries(node).map(([key, value]) => {
50
+ if (key === '$ref' && typeof value === 'string') {
51
+ const local = /^#\/(?:\$defs|definitions)\/(.+)$/.exec(value);
52
+ const component = local?.[1] === undefined ? undefined : names.get(local[1]);
53
+ return [key, component === undefined ? value : `#/components/schemas/${component}`];
54
+ }
55
+ return [key, rewriteRefs(value, names)];
56
+ }));
57
+ }
58
+ function asSchema(node) {
59
+ return isRecord(node) ? node : {};
60
+ }
61
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/openapi/definitions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { JsonSchema } from '@ddd-ts-kit/validation';
2
+ import type { ErrorMapper } from '../error/error-mapper.js';
3
+ import type { Route } from '../route/route.js';
4
+ import type { OpenApiDocument } from './open-api-document.js';
5
+ import type { OpenApiInfo } from './open-api-info.js';
6
+ import type { OpenApiServer } from './open-api-server.js';
7
+ export interface GenerateOpenApiOptions {
8
+ readonly info: OpenApiInfo;
9
+ readonly servers?: readonly OpenApiServer[];
10
+ readonly routes: readonly Route[];
11
+ readonly securitySchemes?: Readonly<Record<string, JsonSchema>>;
12
+ /**
13
+ * The document-wide default requirement. Every route declares its own `security`, which
14
+ * overrides it in each operation: it only speaks to readers of the document as a whole.
15
+ */
16
+ readonly security?: readonly string[];
17
+ /** Must be the mapper the server runs with, or the documented statuses lie. */
18
+ readonly errorMapper?: ErrorMapper;
19
+ }
20
+ export declare function generateOpenApi(options: GenerateOpenApiOptions): OpenApiDocument;
21
+ //# sourceMappingURL=generate-open-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-open-api.d.ts","sourceRoot":"","sources":["../../src/openapi/generate-open-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAChE;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,+EAA+E;IAC/E,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;CACpC;AAKD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAyBhF"}
@@ -0,0 +1,43 @@
1
+ import { createErrorMapper } from '../error/create-error-mapper.js';
2
+ import { assertUniqueRoutes } from '../route/assert-unique-routes.js';
3
+ import { compare } from './compare.js';
4
+ import { Definitions } from './definitions.js';
5
+ import { openApiPath } from './open-api-path.js';
6
+ import { pathItems } from './path-items.js';
7
+ import { PROBLEM_SCHEMA } from './problem-schema.js';
8
+ import { requirement } from './requirement.js';
9
+ // The order OpenAPI tooling conventionally prints operations in.
10
+ const METHOD_ORDER = ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'HEAD', 'PATCH'];
11
+ export function generateOpenApi(options) {
12
+ assertUniqueRoutes(options.routes);
13
+ const definitions = new Definitions();
14
+ const routes = sortedRoutes(options.routes);
15
+ const paths = pathItems(routes, options.errorMapper ?? createErrorMapper(), definitions);
16
+ const tags = [...new Set(routes.flatMap((route) => route.tags ?? []))].sort(compare);
17
+ const securitySchemes = options.securitySchemes;
18
+ return {
19
+ openapi: '3.1.0',
20
+ info: {
21
+ title: options.info.title,
22
+ version: options.info.version,
23
+ ...(options.info.description === undefined ? {} : { description: options.info.description }),
24
+ },
25
+ ...(options.servers === undefined ? {} : { servers: options.servers }),
26
+ ...(tags.length === 0 ? {} : { tags: tags.map((name) => ({ name })) }),
27
+ ...(options.security === undefined ? {} : { security: requirement(options.security) }),
28
+ paths,
29
+ components: {
30
+ schemas: sortKeys({ ...definitions.all(), Problem: PROBLEM_SCHEMA }),
31
+ ...(securitySchemes === undefined ? {} : { securitySchemes: sortKeys(securitySchemes) }),
32
+ },
33
+ };
34
+ }
35
+ /** Sorting first makes every later decision (component naming included) order independent. */
36
+ function sortedRoutes(routes) {
37
+ return [...routes].sort((a, b) => compare(openApiPath(a.path), openApiPath(b.path)) ||
38
+ METHOD_ORDER.indexOf(a.method) - METHOD_ORDER.indexOf(b.method));
39
+ }
40
+ function sortKeys(record) {
41
+ return Object.fromEntries(Object.entries(record).sort(([a], [b]) => compare(a, b)));
42
+ }
43
+ //# sourceMappingURL=generate-open-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-open-api.js","sourceRoot":"","sources":["../../src/openapi/generate-open-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { JsonSchema } from '@ddd-ts-kit/validation';
2
+ import type { OpenApiInfo } from './open-api-info.js';
3
+ import type { OpenApiServer } from './open-api-server.js';
4
+ export interface OpenApiDocument {
5
+ readonly openapi: '3.1.0';
6
+ readonly info: OpenApiInfo;
7
+ readonly servers?: readonly OpenApiServer[];
8
+ readonly tags?: readonly {
9
+ readonly name: string;
10
+ }[];
11
+ readonly security?: readonly Record<string, string[]>[];
12
+ readonly paths: Record<string, Record<string, JsonSchema>>;
13
+ readonly components: {
14
+ readonly schemas: Record<string, JsonSchema>;
15
+ readonly securitySchemes?: Record<string, JsonSchema>;
16
+ };
17
+ }
18
+ //# sourceMappingURL=open-api-document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-document.d.ts","sourceRoot":"","sources":["../../src/openapi/open-api-document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KACvD,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=open-api-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-document.js","sourceRoot":"","sources":["../../src/openapi/open-api-document.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface OpenApiInfo {
2
+ readonly title: string;
3
+ readonly version: string;
4
+ readonly description?: string;
5
+ }
6
+ //# sourceMappingURL=open-api-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-info.d.ts","sourceRoot":"","sources":["../../src/openapi/open-api-info.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=open-api-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-info.js","sourceRoot":"","sources":["../../src/openapi/open-api-info.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function openApiPath(path: string): string;
2
+ //# sourceMappingURL=open-api-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-path.d.ts","sourceRoot":"","sources":["../../src/openapi/open-api-path.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,4 @@
1
+ export function openApiPath(path) {
2
+ return path.replace(/:([A-Za-z_][A-Za-z0-9_]*)/g, '{$1}');
3
+ }
4
+ //# sourceMappingURL=open-api-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-path.js","sourceRoot":"","sources":["../../src/openapi/open-api-path.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface OpenApiServer {
2
+ readonly url: string;
3
+ readonly description?: string;
4
+ }
5
+ //# sourceMappingURL=open-api-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-server.d.ts","sourceRoot":"","sources":["../../src/openapi/open-api-server.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=open-api-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-api-server.js","sourceRoot":"","sources":["../../src/openapi/open-api-server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { JsonSchema } from '@ddd-ts-kit/validation';
2
+ import type { ErrorMapper } from '../error/error-mapper.js';
3
+ import type { Route } from '../route/route.js';
4
+ import type { Definitions } from './definitions.js';
5
+ /** The `paths` of the document: one item per path, one operation per method. */
6
+ export declare function pathItems(routes: readonly Route[], mapper: ErrorMapper, definitions: Definitions): Record<string, Record<string, JsonSchema>>;
7
+ //# sourceMappingURL=path-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-items.d.ts","sourceRoot":"","sources":["../../src/openapi/path-items.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAOpD,gFAAgF;AAChF,wBAAgB,SAAS,CACvB,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAY5C"}
@@ -0,0 +1,43 @@
1
+ import { openApiPath } from './open-api-path.js';
2
+ import { pathParameters } from './path-parameters.js';
3
+ import { requirement } from './requirement.js';
4
+ import { responses } from './responses.js';
5
+ import { schemaParameters } from './schema-parameters.js';
6
+ /** The `paths` of the document: one item per path, one operation per method. */
7
+ export function pathItems(routes, mapper, definitions) {
8
+ const paths = new Map();
9
+ for (const route of routes) {
10
+ const path = openApiPath(route.path);
11
+ const item = paths.get(path) ?? new Map();
12
+ item.set(route.method.toLowerCase(), operation(route, mapper, definitions));
13
+ paths.set(path, item);
14
+ }
15
+ return Object.fromEntries([...paths].map(([path, item]) => [path, Object.fromEntries(item)]));
16
+ }
17
+ function operation(route, mapper, definitions) {
18
+ const request = route.request ?? {};
19
+ const parameters = [
20
+ ...pathParameters(route.path, request.params, definitions),
21
+ ...schemaParameters('query', request.query, definitions),
22
+ ...schemaParameters('header', request.headers, definitions),
23
+ ];
24
+ return {
25
+ operationId: route.operationId,
26
+ summary: route.summary,
27
+ ...(route.description === undefined ? {} : { description: route.description }),
28
+ ...(route.tags === undefined ? {} : { tags: [...route.tags] }),
29
+ ...(route.deprecated === true ? { deprecated: true } : {}),
30
+ security: route.security === false ? [] : requirement(route.security),
31
+ ...(parameters.length === 0 ? {} : { parameters }),
32
+ ...(request.body === undefined
33
+ ? {}
34
+ : {
35
+ requestBody: {
36
+ required: true,
37
+ content: { 'application/json': { schema: definitions.embed(request.body) } },
38
+ },
39
+ }),
40
+ responses: responses(route, mapper, definitions),
41
+ };
42
+ }
43
+ //# sourceMappingURL=path-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-items.js","sourceRoot":"","sources":["../../src/openapi/path-items.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { JsonSchema, Schema } from '@ddd-ts-kit/validation';
2
+ import type { Definitions } from './definitions.js';
3
+ export declare function pathParameters(path: string, schema: Schema<unknown> | undefined, definitions: Definitions): JsonSchema[];
4
+ //# sourceMappingURL=path-parameters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-parameters.d.ts","sourceRoot":"","sources":["../../src/openapi/path-parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,EACnC,WAAW,EAAE,WAAW,GACvB,UAAU,EAAE,CAad"}
@@ -0,0 +1,13 @@
1
+ import { schemaParameters } from './schema-parameters.js';
2
+ export function pathParameters(path, schema, definitions) {
3
+ const described = new Map(schemaParameters('path', schema, definitions).map((parameter) => [parameter['name'], parameter]));
4
+ // The path is the authority on which parameters exist; the schema only refines their type.
5
+ return [...path.matchAll(/:([A-Za-z_][A-Za-z0-9_]*)/g)].map((match) => ({
6
+ name: match[1],
7
+ in: 'path',
8
+ schema: { type: 'string' },
9
+ ...described.get(match[1]),
10
+ required: true,
11
+ }));
12
+ }
13
+ //# sourceMappingURL=path-parameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-parameters.js","sourceRoot":"","sources":["../../src/openapi/path-parameters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,MAAmC,EACnC,WAAwB;IAExB,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CACjG,CAAC;IAEF,2FAA2F;IAC3F,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACd,EAAE,EAAE,MAAM;QACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { JsonSchema } from '@ddd-ts-kit/validation';
2
+ export declare const PROBLEM_SCHEMA: JsonSchema;
3
+ //# sourceMappingURL=problem-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problem-schema.d.ts","sourceRoot":"","sources":["../../src/openapi/problem-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,eAAO,MAAM,cAAc,EAAE,UAyB5B,CAAC"}
@@ -0,0 +1,27 @@
1
+ export const PROBLEM_SCHEMA = {
2
+ type: 'object',
3
+ description: 'Problem details (RFC 9457) with a stable machine-readable code.',
4
+ required: ['type', 'title', 'status', 'code', 'requestId'],
5
+ properties: {
6
+ type: { type: 'string', description: 'URI identifying the kind of problem.' },
7
+ title: { type: 'string' },
8
+ status: { type: 'integer' },
9
+ code: { type: 'string', description: 'Stable error code; branch on this, not on the title.' },
10
+ detail: { type: 'string' },
11
+ issues: {
12
+ type: 'array',
13
+ description: 'Present when the request failed validation.',
14
+ items: {
15
+ type: 'object',
16
+ required: ['path', 'code', 'message'],
17
+ properties: {
18
+ path: { type: 'string', description: 'Dotted path, for example body.items.0.sku.' },
19
+ code: { type: 'string' },
20
+ message: { type: 'string' },
21
+ },
22
+ },
23
+ },
24
+ requestId: { type: 'string' },
25
+ },
26
+ };
27
+ //# sourceMappingURL=problem-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"problem-schema.js","sourceRoot":"","sources":["../../src/openapi/problem-schema.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,iEAAiE;IAC9E,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC;IAC1D,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC7E,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sDAAsD,EAAE;QAC7F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,MAAM,EAAE;YACN,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,6CAA6C;YAC1D,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC;gBACrC,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;oBACnF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;aACF;SACF;QACD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC9B;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** A security requirement: every named scheme, with no scope. */
2
+ export declare function requirement(schemes: readonly string[]): Record<string, string[]>[];
3
+ //# sourceMappingURL=requirement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement.d.ts","sourceRoot":"","sources":["../../src/openapi/requirement.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAElF"}
@@ -0,0 +1,5 @@
1
+ /** A security requirement: every named scheme, with no scope. */
2
+ export function requirement(schemes) {
3
+ return schemes.map((scheme) => ({ [scheme]: [] }));
4
+ }
5
+ //# sourceMappingURL=requirement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requirement.js","sourceRoot":"","sources":["../../src/openapi/requirement.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,OAA0B;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { JsonSchema } from '@ddd-ts-kit/validation';
2
+ import type { ErrorMapper } from '../error/error-mapper.js';
3
+ import type { Route } from '../route/route.js';
4
+ import type { Definitions } from './definitions.js';
5
+ /** The declared responses, plus one problem response per status of the declared error codes. */
6
+ export declare function responses(route: Route, mapper: ErrorMapper, definitions: Definitions): JsonSchema;
7
+ //# sourceMappingURL=responses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/openapi/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,UAAU,CAUjG"}
@@ -0,0 +1,50 @@
1
+ import { statusTitle } from '../error/status-title.js';
2
+ import { isRecord } from '../support/is-record.js';
3
+ import { compare } from './compare.js';
4
+ const VALIDATION_FAILED = 'VALIDATION_FAILED';
5
+ const PROBLEM_REF = { $ref: '#/components/schemas/Problem' };
6
+ /** The declared responses, plus one problem response per status of the declared error codes. */
7
+ export function responses(route, mapper, definitions) {
8
+ const byStatus = declaredResponses(route, definitions);
9
+ for (const [status, codes] of errorCodesByStatus(route, mapper)) {
10
+ byStatus.set(status, problemResponse(status, codes, byStatus.get(status)));
11
+ }
12
+ const statuses = [...byStatus.keys()].sort((a, b) => a - b);
13
+ return Object.fromEntries(statuses.map((status) => [String(status), byStatus.get(status)]));
14
+ }
15
+ function declaredResponses(route, definitions) {
16
+ const byStatus = new Map();
17
+ // A copy has a string index, which is how the statuses are enumerated.
18
+ const declaredByKey = { ...route.responses };
19
+ for (const [key, declared] of Object.entries(declaredByKey)) {
20
+ byStatus.set(Number(key), {
21
+ description: declared.description,
22
+ ...(declared.body === undefined
23
+ ? {}
24
+ : { content: { 'application/json': { schema: definitions.embed(declared.body) } } }),
25
+ });
26
+ }
27
+ return byStatus;
28
+ }
29
+ function errorCodesByStatus(route, mapper) {
30
+ const validatesInput = Object.values(route.request ?? {}).some((schema) => schema !== undefined);
31
+ const codes = new Set([...(route.errors ?? []), ...(validatesInput ? [VALIDATION_FAILED] : [])]);
32
+ const codesByStatus = new Map();
33
+ for (const code of codes) {
34
+ const status = mapper.statusOf(code);
35
+ codesByStatus.set(status, [...(codesByStatus.get(status) ?? []), code]);
36
+ }
37
+ return codesByStatus;
38
+ }
39
+ function problemResponse(status, codes, declared) {
40
+ const sorted = [...codes].sort(compare);
41
+ return {
42
+ description: declared === undefined ? `${statusTitle(status)}. Error codes: ${sorted.join(', ')}.` : declared['description'],
43
+ content: {
44
+ ...(isRecord(declared?.['content']) ? declared['content'] : {}),
45
+ 'application/problem+json': { schema: PROBLEM_REF },
46
+ },
47
+ 'x-error-codes': sorted,
48
+ };
49
+ }
50
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/openapi/responses.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAC9C,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;AAE7D,gGAAgG;AAChG,MAAM,UAAU,SAAS,CAAC,KAAY,EAAE,MAAmB,EAAE,WAAwB;IACnF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAEvD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE5D,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAY,EAAE,WAAwB;IAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC/C,uEAAuE;IACvE,MAAM,aAAa,GAA2C,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAErF,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5D,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACxB,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;gBAC7B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;SACvF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAY,EAAE,MAAmB;IAC3D,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAErC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,KAAwB,EAAE,QAAgC;IACjG,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO;QACL,WAAW,EACT,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,kBAAkB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;QACjH,OAAO,EAAE;YACP,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,0BAA0B,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;SACpD;QACD,eAAe,EAAE,MAAM;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { JsonSchema, Schema } from '@ddd-ts-kit/validation';
2
+ import type { Definitions } from './definitions.js';
3
+ /** One OpenAPI parameter per property of the schema of a request part. */
4
+ export declare function schemaParameters(location: 'path' | 'query' | 'header', schema: Schema<unknown> | undefined, definitions: Definitions): JsonSchema[];
5
+ //# sourceMappingURL=schema-parameters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-parameters.d.ts","sourceRoot":"","sources":["../../src/openapi/schema-parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,EACrC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,EACnC,WAAW,EAAE,WAAW,GACvB,UAAU,EAAE,CAyBd"}
@@ -0,0 +1,24 @@
1
+ import { isRecord } from '../support/is-record.js';
2
+ /** One OpenAPI parameter per property of the schema of a request part. */
3
+ export function schemaParameters(location, schema, definitions) {
4
+ if (schema === undefined) {
5
+ return [];
6
+ }
7
+ const embedded = definitions.embed(schema);
8
+ const properties = embedded['properties'];
9
+ if (!isRecord(properties)) {
10
+ return [];
11
+ }
12
+ const required = Array.isArray(embedded['required']) ? embedded['required'] : [];
13
+ return Object.entries(properties).map(([name, property]) => {
14
+ const description = isRecord(property) ? property['description'] : undefined;
15
+ return {
16
+ name,
17
+ in: location,
18
+ ...(typeof description === 'string' ? { description } : {}),
19
+ required: required.includes(name),
20
+ schema: property,
21
+ };
22
+ });
23
+ }
24
+ //# sourceMappingURL=schema-parameters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-parameters.js","sourceRoot":"","sources":["../../src/openapi/schema-parameters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAC9B,QAAqC,EACrC,MAAmC,EACnC,WAAwB;IAExB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE1C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;QACzD,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAE7E,OAAO;YACL,IAAI;YACJ,EAAE,EAAE,QAAQ;YACZ,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjC,MAAM,EAAE,QAAQ;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { OpenApiDocument } from './open-api-document.js';
2
+ /** The exact bytes to commit: two-space JSON and a trailing newline. */
3
+ export declare function stringifyOpenApi(document: OpenApiDocument): string;
4
+ //# sourceMappingURL=stringify-open-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-open-api.d.ts","sourceRoot":"","sources":["../../src/openapi/stringify-open-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAElE"}
@@ -0,0 +1,5 @@
1
+ /** The exact bytes to commit: two-space JSON and a trailing newline. */
2
+ export function stringifyOpenApi(document) {
3
+ return `${JSON.stringify(document, null, 2)}\n`;
4
+ }
5
+ //# sourceMappingURL=stringify-open-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringify-open-api.js","sourceRoot":"","sources":["../../src/openapi/stringify-open-api.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,QAAyB;IACxD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { checkOpenApiDrift } from './openapi/check-open-api-drift.js';
2
+ export { generateOpenApi, type GenerateOpenApiOptions } from './openapi/generate-open-api.js';
3
+ export type { OpenApiDocument } from './openapi/open-api-document.js';
4
+ export type { OpenApiInfo } from './openapi/open-api-info.js';
5
+ export type { OpenApiServer } from './openapi/open-api-server.js';
6
+ export { stringifyOpenApi } from './openapi/stringify-open-api.js';
7
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC9F,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { checkOpenApiDrift } from './openapi/check-open-api-drift.js';
2
+ export { generateOpenApi } from './openapi/generate-open-api.js';
3
+ export { stringifyOpenApi } from './openapi/stringify-open-api.js';
4
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../src/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAA+B,MAAM,gCAAgC,CAAC;AAI9F,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ValidationIssue } from '@ddd-ts-kit/validation';
2
+ export declare function issue(path: string, code: string, message: string): ValidationIssue;
3
+ //# sourceMappingURL=issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.d.ts","sourceRoot":"","sources":["../../src/pagination/issue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAElF"}
@@ -0,0 +1,4 @@
1
+ export function issue(path, code, message) {
2
+ return { path, code, message };
3
+ }
4
+ //# sourceMappingURL=issue.js.map