webapp-factory 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 (574) hide show
  1. package/README.md +145 -0
  2. package/dist/access-control/adapters/in-memory-relations.d.ts +7 -0
  3. package/dist/access-control/adapters/in-memory-relations.d.ts.map +1 -0
  4. package/dist/access-control/adapters/in-memory-relations.js +6 -0
  5. package/dist/access-control/adapters/in-memory-relations.js.map +1 -0
  6. package/dist/access-control/core/enforcement.d.ts +13 -0
  7. package/dist/access-control/core/enforcement.d.ts.map +1 -0
  8. package/dist/access-control/core/enforcement.js +38 -0
  9. package/dist/access-control/core/enforcement.js.map +1 -0
  10. package/dist/access-control/core/errors.d.ts +30 -0
  11. package/dist/access-control/core/errors.d.ts.map +1 -0
  12. package/dist/access-control/core/errors.js +46 -0
  13. package/dist/access-control/core/errors.js.map +1 -0
  14. package/dist/access-control/core/pdp.d.ts +14 -0
  15. package/dist/access-control/core/pdp.d.ts.map +1 -0
  16. package/dist/access-control/core/pdp.js +79 -0
  17. package/dist/access-control/core/pdp.js.map +1 -0
  18. package/dist/access-control/core/ports.d.ts +68 -0
  19. package/dist/access-control/core/ports.d.ts.map +1 -0
  20. package/dist/access-control/core/ports.js +6 -0
  21. package/dist/access-control/core/ports.js.map +1 -0
  22. package/dist/access-control/core/rbac.d.ts +10 -0
  23. package/dist/access-control/core/rbac.d.ts.map +1 -0
  24. package/dist/access-control/core/rbac.js +78 -0
  25. package/dist/access-control/core/rbac.js.map +1 -0
  26. package/dist/access-control/core/rebac.d.ts +15 -0
  27. package/dist/access-control/core/rebac.d.ts.map +1 -0
  28. package/dist/access-control/core/rebac.js +48 -0
  29. package/dist/access-control/core/rebac.js.map +1 -0
  30. package/dist/access-control/index.d.ts +15 -0
  31. package/dist/access-control/index.d.ts.map +1 -0
  32. package/dist/access-control/index.js +20 -0
  33. package/dist/access-control/index.js.map +1 -0
  34. package/dist/access-control/nestjs/access-control.module.d.ts +34 -0
  35. package/dist/access-control/nestjs/access-control.module.d.ts.map +1 -0
  36. package/dist/access-control/nestjs/access-control.module.js +80 -0
  37. package/dist/access-control/nestjs/access-control.module.js.map +1 -0
  38. package/dist/audit/adapters/in-memory-store.d.ts +3 -0
  39. package/dist/audit/adapters/in-memory-store.d.ts.map +1 -0
  40. package/dist/audit/adapters/in-memory-store.js +66 -0
  41. package/dist/audit/adapters/in-memory-store.js.map +1 -0
  42. package/dist/audit/adapters/pg-store.d.ts +22 -0
  43. package/dist/audit/adapters/pg-store.d.ts.map +1 -0
  44. package/dist/audit/adapters/pg-store.js +119 -0
  45. package/dist/audit/adapters/pg-store.js.map +1 -0
  46. package/dist/audit/core/audit-log.d.ts +41 -0
  47. package/dist/audit/core/audit-log.d.ts.map +1 -0
  48. package/dist/audit/core/audit-log.js +78 -0
  49. package/dist/audit/core/audit-log.js.map +1 -0
  50. package/dist/audit/core/errors.d.ts +22 -0
  51. package/dist/audit/core/errors.d.ts.map +1 -0
  52. package/dist/audit/core/errors.js +35 -0
  53. package/dist/audit/core/errors.js.map +1 -0
  54. package/dist/audit/core/hash.d.ts +9 -0
  55. package/dist/audit/core/hash.d.ts.map +1 -0
  56. package/dist/audit/core/hash.js +45 -0
  57. package/dist/audit/core/hash.js.map +1 -0
  58. package/dist/audit/core/ports.d.ts +68 -0
  59. package/dist/audit/core/ports.d.ts.map +1 -0
  60. package/dist/audit/core/ports.js +6 -0
  61. package/dist/audit/core/ports.js.map +1 -0
  62. package/dist/audit/index.d.ts +13 -0
  63. package/dist/audit/index.d.ts.map +1 -0
  64. package/dist/audit/index.js +16 -0
  65. package/dist/audit/index.js.map +1 -0
  66. package/dist/auth/adapters/argon2id-hasher.d.ts +15 -0
  67. package/dist/auth/adapters/argon2id-hasher.d.ts.map +1 -0
  68. package/dist/auth/adapters/argon2id-hasher.js +61 -0
  69. package/dist/auth/adapters/argon2id-hasher.js.map +1 -0
  70. package/dist/auth/adapters/in-memory-stores.d.ts +14 -0
  71. package/dist/auth/adapters/in-memory-stores.d.ts.map +1 -0
  72. package/dist/auth/adapters/in-memory-stores.js +78 -0
  73. package/dist/auth/adapters/in-memory-stores.js.map +1 -0
  74. package/dist/auth/core/auth-service.d.ts +40 -0
  75. package/dist/auth/core/auth-service.d.ts.map +1 -0
  76. package/dist/auth/core/auth-service.js +106 -0
  77. package/dist/auth/core/auth-service.js.map +1 -0
  78. package/dist/auth/core/credentials.d.ts +15 -0
  79. package/dist/auth/core/credentials.d.ts.map +1 -0
  80. package/dist/auth/core/credentials.js +15 -0
  81. package/dist/auth/core/credentials.js.map +1 -0
  82. package/dist/auth/core/crypto-util.d.ts +7 -0
  83. package/dist/auth/core/crypto-util.d.ts.map +1 -0
  84. package/dist/auth/core/crypto-util.js +15 -0
  85. package/dist/auth/core/crypto-util.js.map +1 -0
  86. package/dist/auth/core/errors.d.ts +33 -0
  87. package/dist/auth/core/errors.d.ts.map +1 -0
  88. package/dist/auth/core/errors.js +48 -0
  89. package/dist/auth/core/errors.js.map +1 -0
  90. package/dist/auth/core/jwt.d.ts +5 -0
  91. package/dist/auth/core/jwt.d.ts.map +1 -0
  92. package/dist/auth/core/jwt.js +40 -0
  93. package/dist/auth/core/jwt.js.map +1 -0
  94. package/dist/auth/core/ports.d.ts +95 -0
  95. package/dist/auth/core/ports.d.ts.map +1 -0
  96. package/dist/auth/core/ports.js +7 -0
  97. package/dist/auth/core/ports.js.map +1 -0
  98. package/dist/auth/core/single-use.d.ts +10 -0
  99. package/dist/auth/core/single-use.d.ts.map +1 -0
  100. package/dist/auth/core/single-use.js +47 -0
  101. package/dist/auth/core/single-use.js.map +1 -0
  102. package/dist/auth/core/tokens.d.ts +14 -0
  103. package/dist/auth/core/tokens.d.ts.map +1 -0
  104. package/dist/auth/core/tokens.js +85 -0
  105. package/dist/auth/core/tokens.js.map +1 -0
  106. package/dist/auth/index.d.ts +18 -0
  107. package/dist/auth/index.d.ts.map +1 -0
  108. package/dist/auth/index.js +22 -0
  109. package/dist/auth/index.js.map +1 -0
  110. package/dist/auth/nestjs/auth.module.d.ts +17 -0
  111. package/dist/auth/nestjs/auth.module.d.ts.map +1 -0
  112. package/dist/auth/nestjs/auth.module.js +18 -0
  113. package/dist/auth/nestjs/auth.module.js.map +1 -0
  114. package/dist/cache/adapters/in-memory-store.d.ts +6 -0
  115. package/dist/cache/adapters/in-memory-store.d.ts.map +1 -0
  116. package/dist/cache/adapters/in-memory-store.js +65 -0
  117. package/dist/cache/adapters/in-memory-store.js.map +1 -0
  118. package/dist/cache/adapters/redis-store.d.ts +32 -0
  119. package/dist/cache/adapters/redis-store.d.ts.map +1 -0
  120. package/dist/cache/adapters/redis-store.js +59 -0
  121. package/dist/cache/adapters/redis-store.js.map +1 -0
  122. package/dist/cache/core/cache.d.ts +31 -0
  123. package/dist/cache/core/cache.d.ts.map +1 -0
  124. package/dist/cache/core/cache.js +89 -0
  125. package/dist/cache/core/cache.js.map +1 -0
  126. package/dist/cache/core/errors.d.ts +17 -0
  127. package/dist/cache/core/errors.d.ts.map +1 -0
  128. package/dist/cache/core/errors.js +27 -0
  129. package/dist/cache/core/errors.js.map +1 -0
  130. package/dist/cache/core/lock.d.ts +21 -0
  131. package/dist/cache/core/lock.d.ts.map +1 -0
  132. package/dist/cache/core/lock.js +47 -0
  133. package/dist/cache/core/lock.js.map +1 -0
  134. package/dist/cache/core/ports.d.ts +33 -0
  135. package/dist/cache/core/ports.d.ts.map +1 -0
  136. package/dist/cache/core/ports.js +6 -0
  137. package/dist/cache/core/ports.js.map +1 -0
  138. package/dist/cache/core/pubsub.d.ts +14 -0
  139. package/dist/cache/core/pubsub.d.ts.map +1 -0
  140. package/dist/cache/core/pubsub.js +13 -0
  141. package/dist/cache/core/pubsub.js.map +1 -0
  142. package/dist/cache/core/serializer.d.ts +4 -0
  143. package/dist/cache/core/serializer.d.ts.map +1 -0
  144. package/dist/cache/core/serializer.js +6 -0
  145. package/dist/cache/core/serializer.js.map +1 -0
  146. package/dist/cache/index.d.ts +14 -0
  147. package/dist/cache/index.d.ts.map +1 -0
  148. package/dist/cache/index.js +19 -0
  149. package/dist/cache/index.js.map +1 -0
  150. package/dist/config/adapters/reporters.d.ts +17 -0
  151. package/dist/config/adapters/reporters.d.ts.map +1 -0
  152. package/dist/config/adapters/reporters.js +35 -0
  153. package/dist/config/adapters/reporters.js.map +1 -0
  154. package/dist/config/adapters/secret-resolvers.d.ts +21 -0
  155. package/dist/config/adapters/secret-resolvers.d.ts.map +1 -0
  156. package/dist/config/adapters/secret-resolvers.js +60 -0
  157. package/dist/config/adapters/secret-resolvers.js.map +1 -0
  158. package/dist/config/adapters/zod-schema.d.ts +20 -0
  159. package/dist/config/adapters/zod-schema.d.ts.map +1 -0
  160. package/dist/config/adapters/zod-schema.js +35 -0
  161. package/dist/config/adapters/zod-schema.js.map +1 -0
  162. package/dist/config/core/env-loader.d.ts +47 -0
  163. package/dist/config/core/env-loader.d.ts.map +1 -0
  164. package/dist/config/core/env-loader.js +155 -0
  165. package/dist/config/core/env-loader.js.map +1 -0
  166. package/dist/config/core/errors.d.ts +34 -0
  167. package/dist/config/core/errors.d.ts.map +1 -0
  168. package/dist/config/core/errors.js +49 -0
  169. package/dist/config/core/errors.js.map +1 -0
  170. package/dist/config/core/freeze.d.ts +7 -0
  171. package/dist/config/core/freeze.d.ts.map +1 -0
  172. package/dist/config/core/freeze.js +20 -0
  173. package/dist/config/core/freeze.js.map +1 -0
  174. package/dist/config/core/load-config.d.ts +43 -0
  175. package/dist/config/core/load-config.d.ts.map +1 -0
  176. package/dist/config/core/load-config.js +74 -0
  177. package/dist/config/core/load-config.js.map +1 -0
  178. package/dist/config/core/merge.d.ts +19 -0
  179. package/dist/config/core/merge.d.ts.map +1 -0
  180. package/dist/config/core/merge.js +31 -0
  181. package/dist/config/core/merge.js.map +1 -0
  182. package/dist/config/core/ports.d.ts +58 -0
  183. package/dist/config/core/ports.d.ts.map +1 -0
  184. package/dist/config/core/ports.js +2 -0
  185. package/dist/config/core/ports.js.map +1 -0
  186. package/dist/config/core/secret-resolver.d.ts +16 -0
  187. package/dist/config/core/secret-resolver.d.ts.map +1 -0
  188. package/dist/config/core/secret-resolver.js +73 -0
  189. package/dist/config/core/secret-resolver.js.map +1 -0
  190. package/dist/config/core/secret.d.ts +21 -0
  191. package/dist/config/core/secret.d.ts.map +1 -0
  192. package/dist/config/core/secret.js +40 -0
  193. package/dist/config/core/secret.js.map +1 -0
  194. package/dist/config/index.d.ts +16 -0
  195. package/dist/config/index.d.ts.map +1 -0
  196. package/dist/config/index.js +23 -0
  197. package/dist/config/index.js.map +1 -0
  198. package/dist/config/nestjs/config-kit.module.d.ts +37 -0
  199. package/dist/config/nestjs/config-kit.module.d.ts.map +1 -0
  200. package/dist/config/nestjs/config-kit.module.js +24 -0
  201. package/dist/config/nestjs/config-kit.module.js.map +1 -0
  202. package/dist/http/adapters/zod-schema.d.ts +11 -0
  203. package/dist/http/adapters/zod-schema.d.ts.map +1 -0
  204. package/dist/http/adapters/zod-schema.js +74 -0
  205. package/dist/http/adapters/zod-schema.js.map +1 -0
  206. package/dist/http/core/context.d.ts +25 -0
  207. package/dist/http/core/context.d.ts.map +1 -0
  208. package/dist/http/core/context.js +60 -0
  209. package/dist/http/core/context.js.map +1 -0
  210. package/dist/http/core/errors.d.ts +41 -0
  211. package/dist/http/core/errors.d.ts.map +1 -0
  212. package/dist/http/core/errors.js +99 -0
  213. package/dist/http/core/errors.js.map +1 -0
  214. package/dist/http/core/kernel.d.ts +54 -0
  215. package/dist/http/core/kernel.d.ts.map +1 -0
  216. package/dist/http/core/kernel.js +122 -0
  217. package/dist/http/core/kernel.js.map +1 -0
  218. package/dist/http/core/openapi.d.ts +37 -0
  219. package/dist/http/core/openapi.d.ts.map +1 -0
  220. package/dist/http/core/openapi.js +99 -0
  221. package/dist/http/core/openapi.js.map +1 -0
  222. package/dist/http/core/pagination.d.ts +17 -0
  223. package/dist/http/core/pagination.d.ts.map +1 -0
  224. package/dist/http/core/pagination.js +108 -0
  225. package/dist/http/core/pagination.js.map +1 -0
  226. package/dist/http/core/ports.d.ts +106 -0
  227. package/dist/http/core/ports.d.ts.map +1 -0
  228. package/dist/http/core/ports.js +6 -0
  229. package/dist/http/core/ports.js.map +1 -0
  230. package/dist/http/core/redaction.d.ts +8 -0
  231. package/dist/http/core/redaction.d.ts.map +1 -0
  232. package/dist/http/core/redaction.js +45 -0
  233. package/dist/http/core/redaction.js.map +1 -0
  234. package/dist/http/core/router.d.ts +37 -0
  235. package/dist/http/core/router.d.ts.map +1 -0
  236. package/dist/http/core/router.js +120 -0
  237. package/dist/http/core/router.js.map +1 -0
  238. package/dist/http/core/security.d.ts +43 -0
  239. package/dist/http/core/security.d.ts.map +1 -0
  240. package/dist/http/core/security.js +66 -0
  241. package/dist/http/core/security.js.map +1 -0
  242. package/dist/http/core/validation.d.ts +9 -0
  243. package/dist/http/core/validation.d.ts.map +1 -0
  244. package/dist/http/core/validation.js +36 -0
  245. package/dist/http/core/validation.js.map +1 -0
  246. package/dist/http/index.d.ts +20 -0
  247. package/dist/http/index.d.ts.map +1 -0
  248. package/dist/http/index.js +29 -0
  249. package/dist/http/index.js.map +1 -0
  250. package/dist/http/nestjs/http-kernel.module.d.ts +37 -0
  251. package/dist/http/nestjs/http-kernel.module.d.ts.map +1 -0
  252. package/dist/http/nestjs/http-kernel.module.js +77 -0
  253. package/dist/http/nestjs/http-kernel.module.js.map +1 -0
  254. package/dist/http/nodejs/http-adapter.d.ts +11 -0
  255. package/dist/http/nodejs/http-adapter.d.ts.map +1 -0
  256. package/dist/http/nodejs/http-adapter.js +60 -0
  257. package/dist/http/nodejs/http-adapter.js.map +1 -0
  258. package/dist/i18n/core/catalog.d.ts +23 -0
  259. package/dist/i18n/core/catalog.d.ts.map +1 -0
  260. package/dist/i18n/core/catalog.js +31 -0
  261. package/dist/i18n/core/catalog.js.map +1 -0
  262. package/dist/i18n/core/errors.d.ts +14 -0
  263. package/dist/i18n/core/errors.d.ts.map +1 -0
  264. package/dist/i18n/core/errors.js +22 -0
  265. package/dist/i18n/core/errors.js.map +1 -0
  266. package/dist/i18n/core/i18n.d.ts +20 -0
  267. package/dist/i18n/core/i18n.d.ts.map +1 -0
  268. package/dist/i18n/core/i18n.js +48 -0
  269. package/dist/i18n/core/i18n.js.map +1 -0
  270. package/dist/i18n/core/message.d.ts +8 -0
  271. package/dist/i18n/core/message.d.ts.map +1 -0
  272. package/dist/i18n/core/message.js +38 -0
  273. package/dist/i18n/core/message.js.map +1 -0
  274. package/dist/i18n/core/negotiate.d.ts +13 -0
  275. package/dist/i18n/core/negotiate.d.ts.map +1 -0
  276. package/dist/i18n/core/negotiate.js +46 -0
  277. package/dist/i18n/core/negotiate.js.map +1 -0
  278. package/dist/i18n/core/ports.d.ts +35 -0
  279. package/dist/i18n/core/ports.d.ts.map +1 -0
  280. package/dist/i18n/core/ports.js +6 -0
  281. package/dist/i18n/core/ports.js.map +1 -0
  282. package/dist/i18n/index.d.ts +14 -0
  283. package/dist/i18n/index.d.ts.map +1 -0
  284. package/dist/i18n/index.js +18 -0
  285. package/dist/i18n/index.js.map +1 -0
  286. package/dist/i18n/nestjs/i18n.module.d.ts +16 -0
  287. package/dist/i18n/nestjs/i18n.module.d.ts.map +1 -0
  288. package/dist/i18n/nestjs/i18n.module.js +17 -0
  289. package/dist/i18n/nestjs/i18n.module.js.map +1 -0
  290. package/dist/index.d.ts +31 -0
  291. package/dist/index.d.ts.map +1 -0
  292. package/dist/index.js +31 -0
  293. package/dist/index.js.map +1 -0
  294. package/dist/jobs/adapters/in-memory-idempotency.d.ts +9 -0
  295. package/dist/jobs/adapters/in-memory-idempotency.d.ts.map +1 -0
  296. package/dist/jobs/adapters/in-memory-idempotency.js +34 -0
  297. package/dist/jobs/adapters/in-memory-idempotency.js.map +1 -0
  298. package/dist/jobs/adapters/in-memory-queue-store.d.ts +7 -0
  299. package/dist/jobs/adapters/in-memory-queue-store.d.ts.map +1 -0
  300. package/dist/jobs/adapters/in-memory-queue-store.js +70 -0
  301. package/dist/jobs/adapters/in-memory-queue-store.js.map +1 -0
  302. package/dist/jobs/adapters/redis-queue-store.d.ts +28 -0
  303. package/dist/jobs/adapters/redis-queue-store.d.ts.map +1 -0
  304. package/dist/jobs/adapters/redis-queue-store.js +86 -0
  305. package/dist/jobs/adapters/redis-queue-store.js.map +1 -0
  306. package/dist/jobs/core/backoff.d.ts +15 -0
  307. package/dist/jobs/core/backoff.d.ts.map +1 -0
  308. package/dist/jobs/core/backoff.js +20 -0
  309. package/dist/jobs/core/backoff.js.map +1 -0
  310. package/dist/jobs/core/cron.d.ts +13 -0
  311. package/dist/jobs/core/cron.d.ts.map +1 -0
  312. package/dist/jobs/core/cron.js +101 -0
  313. package/dist/jobs/core/cron.js.map +1 -0
  314. package/dist/jobs/core/errors.d.ts +18 -0
  315. package/dist/jobs/core/errors.d.ts.map +1 -0
  316. package/dist/jobs/core/errors.js +30 -0
  317. package/dist/jobs/core/errors.js.map +1 -0
  318. package/dist/jobs/core/ports.d.ts +80 -0
  319. package/dist/jobs/core/ports.d.ts.map +1 -0
  320. package/dist/jobs/core/ports.js +6 -0
  321. package/dist/jobs/core/ports.js.map +1 -0
  322. package/dist/jobs/core/queue.d.ts +16 -0
  323. package/dist/jobs/core/queue.d.ts.map +1 -0
  324. package/dist/jobs/core/queue.js +29 -0
  325. package/dist/jobs/core/queue.js.map +1 -0
  326. package/dist/jobs/core/registry.d.ts +4 -0
  327. package/dist/jobs/core/registry.d.ts.map +1 -0
  328. package/dist/jobs/core/registry.js +11 -0
  329. package/dist/jobs/core/registry.js.map +1 -0
  330. package/dist/jobs/core/scheduler.d.ts +30 -0
  331. package/dist/jobs/core/scheduler.d.ts.map +1 -0
  332. package/dist/jobs/core/scheduler.js +53 -0
  333. package/dist/jobs/core/scheduler.js.map +1 -0
  334. package/dist/jobs/core/serializer.d.ts +3 -0
  335. package/dist/jobs/core/serializer.d.ts.map +1 -0
  336. package/dist/jobs/core/serializer.js +5 -0
  337. package/dist/jobs/core/serializer.js.map +1 -0
  338. package/dist/jobs/core/worker.d.ts +28 -0
  339. package/dist/jobs/core/worker.d.ts.map +1 -0
  340. package/dist/jobs/core/worker.js +118 -0
  341. package/dist/jobs/core/worker.js.map +1 -0
  342. package/dist/jobs/index.d.ts +18 -0
  343. package/dist/jobs/index.d.ts.map +1 -0
  344. package/dist/jobs/index.js +23 -0
  345. package/dist/jobs/index.js.map +1 -0
  346. package/dist/mailer/adapters/dev-inbox.d.ts +17 -0
  347. package/dist/mailer/adapters/dev-inbox.d.ts.map +1 -0
  348. package/dist/mailer/adapters/dev-inbox.js +29 -0
  349. package/dist/mailer/adapters/dev-inbox.js.map +1 -0
  350. package/dist/mailer/adapters/i18n-renderer.d.ts +13 -0
  351. package/dist/mailer/adapters/i18n-renderer.d.ts.map +1 -0
  352. package/dist/mailer/adapters/i18n-renderer.js +27 -0
  353. package/dist/mailer/adapters/i18n-renderer.js.map +1 -0
  354. package/dist/mailer/adapters/in-memory-templates.d.ts +6 -0
  355. package/dist/mailer/adapters/in-memory-templates.d.ts.map +1 -0
  356. package/dist/mailer/adapters/in-memory-templates.js +6 -0
  357. package/dist/mailer/adapters/in-memory-templates.js.map +1 -0
  358. package/dist/mailer/adapters/transports.d.ts +19 -0
  359. package/dist/mailer/adapters/transports.d.ts.map +1 -0
  360. package/dist/mailer/adapters/transports.js +38 -0
  361. package/dist/mailer/adapters/transports.js.map +1 -0
  362. package/dist/mailer/core/errors.d.ts +23 -0
  363. package/dist/mailer/core/errors.d.ts.map +1 -0
  364. package/dist/mailer/core/errors.js +40 -0
  365. package/dist/mailer/core/errors.js.map +1 -0
  366. package/dist/mailer/core/failover.d.ts +3 -0
  367. package/dist/mailer/core/failover.d.ts.map +1 -0
  368. package/dist/mailer/core/failover.js +30 -0
  369. package/dist/mailer/core/failover.js.map +1 -0
  370. package/dist/mailer/core/mailer.d.ts +25 -0
  371. package/dist/mailer/core/mailer.d.ts.map +1 -0
  372. package/dist/mailer/core/mailer.js +61 -0
  373. package/dist/mailer/core/mailer.js.map +1 -0
  374. package/dist/mailer/core/ports.d.ts +54 -0
  375. package/dist/mailer/core/ports.d.ts.map +1 -0
  376. package/dist/mailer/core/ports.js +6 -0
  377. package/dist/mailer/core/ports.js.map +1 -0
  378. package/dist/mailer/core/render.d.ts +4 -0
  379. package/dist/mailer/core/render.d.ts.map +1 -0
  380. package/dist/mailer/core/render.js +29 -0
  381. package/dist/mailer/core/render.js.map +1 -0
  382. package/dist/mailer/index.d.ts +17 -0
  383. package/dist/mailer/index.d.ts.map +1 -0
  384. package/dist/mailer/index.js +21 -0
  385. package/dist/mailer/index.js.map +1 -0
  386. package/dist/mailer/nestjs/mailer.module.d.ts +17 -0
  387. package/dist/mailer/nestjs/mailer.module.d.ts.map +1 -0
  388. package/dist/mailer/nestjs/mailer.module.js +15 -0
  389. package/dist/mailer/nestjs/mailer.module.js.map +1 -0
  390. package/dist/observability/core/context.d.ts +9 -0
  391. package/dist/observability/core/context.d.ts.map +1 -0
  392. package/dist/observability/core/context.js +15 -0
  393. package/dist/observability/core/context.js.map +1 -0
  394. package/dist/observability/core/health.d.ts +40 -0
  395. package/dist/observability/core/health.d.ts.map +1 -0
  396. package/dist/observability/core/health.js +51 -0
  397. package/dist/observability/core/health.js.map +1 -0
  398. package/dist/observability/core/logger.d.ts +22 -0
  399. package/dist/observability/core/logger.d.ts.map +1 -0
  400. package/dist/observability/core/logger.js +45 -0
  401. package/dist/observability/core/logger.js.map +1 -0
  402. package/dist/observability/core/metrics.d.ts +63 -0
  403. package/dist/observability/core/metrics.d.ts.map +1 -0
  404. package/dist/observability/core/metrics.js +172 -0
  405. package/dist/observability/core/metrics.js.map +1 -0
  406. package/dist/observability/core/redaction.d.ts +10 -0
  407. package/dist/observability/core/redaction.d.ts.map +1 -0
  408. package/dist/observability/core/redaction.js +48 -0
  409. package/dist/observability/core/redaction.js.map +1 -0
  410. package/dist/observability/core/tracing.d.ts +52 -0
  411. package/dist/observability/core/tracing.d.ts.map +1 -0
  412. package/dist/observability/core/tracing.js +88 -0
  413. package/dist/observability/core/tracing.js.map +1 -0
  414. package/dist/observability/index.d.ts +14 -0
  415. package/dist/observability/index.d.ts.map +1 -0
  416. package/dist/observability/index.js +19 -0
  417. package/dist/observability/index.js.map +1 -0
  418. package/dist/observability/nestjs/observability.module.d.ts +35 -0
  419. package/dist/observability/nestjs/observability.module.d.ts.map +1 -0
  420. package/dist/observability/nestjs/observability.module.js +87 -0
  421. package/dist/observability/nestjs/observability.module.js.map +1 -0
  422. package/dist/persistence/adapters/in-memory-driver.d.ts +18 -0
  423. package/dist/persistence/adapters/in-memory-driver.d.ts.map +1 -0
  424. package/dist/persistence/adapters/in-memory-driver.js +229 -0
  425. package/dist/persistence/adapters/in-memory-driver.js.map +1 -0
  426. package/dist/persistence/adapters/pg-driver.d.ts +21 -0
  427. package/dist/persistence/adapters/pg-driver.d.ts.map +1 -0
  428. package/dist/persistence/adapters/pg-driver.js +42 -0
  429. package/dist/persistence/adapters/pg-driver.js.map +1 -0
  430. package/dist/persistence/adapters/testcontainer-harness.d.ts +37 -0
  431. package/dist/persistence/adapters/testcontainer-harness.d.ts.map +1 -0
  432. package/dist/persistence/adapters/testcontainer-harness.js +79 -0
  433. package/dist/persistence/adapters/testcontainer-harness.js.map +1 -0
  434. package/dist/persistence/core/errors.d.ts +36 -0
  435. package/dist/persistence/core/errors.d.ts.map +1 -0
  436. package/dist/persistence/core/errors.js +58 -0
  437. package/dist/persistence/core/errors.js.map +1 -0
  438. package/dist/persistence/core/migrations.d.ts +16 -0
  439. package/dist/persistence/core/migrations.d.ts.map +1 -0
  440. package/dist/persistence/core/migrations.js +95 -0
  441. package/dist/persistence/core/migrations.js.map +1 -0
  442. package/dist/persistence/core/pool.d.ts +4 -0
  443. package/dist/persistence/core/pool.d.ts.map +1 -0
  444. package/dist/persistence/core/pool.js +180 -0
  445. package/dist/persistence/core/pool.js.map +1 -0
  446. package/dist/persistence/core/ports.d.ts +91 -0
  447. package/dist/persistence/core/ports.d.ts.map +1 -0
  448. package/dist/persistence/core/ports.js +6 -0
  449. package/dist/persistence/core/ports.js.map +1 -0
  450. package/dist/persistence/core/repository.d.ts +18 -0
  451. package/dist/persistence/core/repository.d.ts.map +1 -0
  452. package/dist/persistence/core/repository.js +113 -0
  453. package/dist/persistence/core/repository.js.map +1 -0
  454. package/dist/persistence/core/sql.d.ts +13 -0
  455. package/dist/persistence/core/sql.d.ts.map +1 -0
  456. package/dist/persistence/core/sql.js +35 -0
  457. package/dist/persistence/core/sql.js.map +1 -0
  458. package/dist/persistence/index.d.ts +14 -0
  459. package/dist/persistence/index.d.ts.map +1 -0
  460. package/dist/persistence/index.js +22 -0
  461. package/dist/persistence/index.js.map +1 -0
  462. package/dist/persistence/pg.d.ts +7 -0
  463. package/dist/persistence/pg.d.ts.map +1 -0
  464. package/dist/persistence/pg.js +7 -0
  465. package/dist/persistence/pg.js.map +1 -0
  466. package/dist/privacy/adapters/audit-sink.d.ts +19 -0
  467. package/dist/privacy/adapters/audit-sink.d.ts.map +1 -0
  468. package/dist/privacy/adapters/audit-sink.js +13 -0
  469. package/dist/privacy/adapters/audit-sink.js.map +1 -0
  470. package/dist/privacy/adapters/in-memory-consent-store.d.ts +7 -0
  471. package/dist/privacy/adapters/in-memory-consent-store.d.ts.map +1 -0
  472. package/dist/privacy/adapters/in-memory-consent-store.js +18 -0
  473. package/dist/privacy/adapters/in-memory-consent-store.js.map +1 -0
  474. package/dist/privacy/adapters/pg-consent-store.d.ts +26 -0
  475. package/dist/privacy/adapters/pg-consent-store.d.ts.map +1 -0
  476. package/dist/privacy/adapters/pg-consent-store.js +43 -0
  477. package/dist/privacy/adapters/pg-consent-store.js.map +1 -0
  478. package/dist/privacy/core/consent.d.ts +35 -0
  479. package/dist/privacy/core/consent.d.ts.map +1 -0
  480. package/dist/privacy/core/consent.js +49 -0
  481. package/dist/privacy/core/consent.js.map +1 -0
  482. package/dist/privacy/core/erasure.d.ts +22 -0
  483. package/dist/privacy/core/erasure.d.ts.map +1 -0
  484. package/dist/privacy/core/erasure.js +35 -0
  485. package/dist/privacy/core/erasure.js.map +1 -0
  486. package/dist/privacy/core/errors.d.ts +18 -0
  487. package/dist/privacy/core/errors.d.ts.map +1 -0
  488. package/dist/privacy/core/errors.js +30 -0
  489. package/dist/privacy/core/errors.js.map +1 -0
  490. package/dist/privacy/core/export.d.ts +20 -0
  491. package/dist/privacy/core/export.d.ts.map +1 -0
  492. package/dist/privacy/core/export.js +30 -0
  493. package/dist/privacy/core/export.js.map +1 -0
  494. package/dist/privacy/core/ports.d.ts +48 -0
  495. package/dist/privacy/core/ports.d.ts.map +1 -0
  496. package/dist/privacy/core/ports.js +6 -0
  497. package/dist/privacy/core/ports.js.map +1 -0
  498. package/dist/privacy/core/registry.d.ts +17 -0
  499. package/dist/privacy/core/registry.d.ts.map +1 -0
  500. package/dist/privacy/core/registry.js +31 -0
  501. package/dist/privacy/core/registry.js.map +1 -0
  502. package/dist/privacy/index.d.ts +16 -0
  503. package/dist/privacy/index.d.ts.map +1 -0
  504. package/dist/privacy/index.js +21 -0
  505. package/dist/privacy/index.js.map +1 -0
  506. package/dist/rate-limit/adapters/in-memory-store.d.ts +7 -0
  507. package/dist/rate-limit/adapters/in-memory-store.d.ts.map +1 -0
  508. package/dist/rate-limit/adapters/in-memory-store.js +50 -0
  509. package/dist/rate-limit/adapters/in-memory-store.js.map +1 -0
  510. package/dist/rate-limit/adapters/redis-store.d.ts +11 -0
  511. package/dist/rate-limit/adapters/redis-store.d.ts.map +1 -0
  512. package/dist/rate-limit/adapters/redis-store.js +93 -0
  513. package/dist/rate-limit/adapters/redis-store.js.map +1 -0
  514. package/dist/rate-limit/core/enforcer.d.ts +23 -0
  515. package/dist/rate-limit/core/enforcer.d.ts.map +1 -0
  516. package/dist/rate-limit/core/enforcer.js +27 -0
  517. package/dist/rate-limit/core/enforcer.js.map +1 -0
  518. package/dist/rate-limit/core/errors.d.ts +19 -0
  519. package/dist/rate-limit/core/errors.d.ts.map +1 -0
  520. package/dist/rate-limit/core/errors.js +32 -0
  521. package/dist/rate-limit/core/errors.js.map +1 -0
  522. package/dist/rate-limit/core/ports.d.ts +50 -0
  523. package/dist/rate-limit/core/ports.d.ts.map +1 -0
  524. package/dist/rate-limit/core/ports.js +6 -0
  525. package/dist/rate-limit/core/ports.js.map +1 -0
  526. package/dist/rate-limit/core/sliding-window.d.ts +9 -0
  527. package/dist/rate-limit/core/sliding-window.d.ts.map +1 -0
  528. package/dist/rate-limit/core/sliding-window.js +24 -0
  529. package/dist/rate-limit/core/sliding-window.js.map +1 -0
  530. package/dist/rate-limit/core/token-bucket.d.ts +9 -0
  531. package/dist/rate-limit/core/token-bucket.d.ts.map +1 -0
  532. package/dist/rate-limit/core/token-bucket.js +24 -0
  533. package/dist/rate-limit/core/token-bucket.js.map +1 -0
  534. package/dist/rate-limit/index.d.ts +15 -0
  535. package/dist/rate-limit/index.d.ts.map +1 -0
  536. package/dist/rate-limit/index.js +19 -0
  537. package/dist/rate-limit/index.js.map +1 -0
  538. package/dist/rate-limit/nestjs/rate-limit.module.d.ts +25 -0
  539. package/dist/rate-limit/nestjs/rate-limit.module.d.ts.map +1 -0
  540. package/dist/rate-limit/nestjs/rate-limit.module.js +63 -0
  541. package/dist/rate-limit/nestjs/rate-limit.module.js.map +1 -0
  542. package/dist/rate-limit/nodejs/middleware.d.ts +16 -0
  543. package/dist/rate-limit/nodejs/middleware.d.ts.map +1 -0
  544. package/dist/rate-limit/nodejs/middleware.js +26 -0
  545. package/dist/rate-limit/nodejs/middleware.js.map +1 -0
  546. package/dist/test-kit/adapters/infra-bootstrap.d.ts +40 -0
  547. package/dist/test-kit/adapters/infra-bootstrap.d.ts.map +1 -0
  548. package/dist/test-kit/adapters/infra-bootstrap.js +64 -0
  549. package/dist/test-kit/adapters/infra-bootstrap.js.map +1 -0
  550. package/dist/test-kit/core/contract.d.ts +49 -0
  551. package/dist/test-kit/core/contract.d.ts.map +1 -0
  552. package/dist/test-kit/core/contract.js +52 -0
  553. package/dist/test-kit/core/contract.js.map +1 -0
  554. package/dist/test-kit/core/errors.d.ts +12 -0
  555. package/dist/test-kit/core/errors.d.ts.map +1 -0
  556. package/dist/test-kit/core/errors.js +19 -0
  557. package/dist/test-kit/core/errors.js.map +1 -0
  558. package/dist/test-kit/core/factories.d.ts +24 -0
  559. package/dist/test-kit/core/factories.d.ts.map +1 -0
  560. package/dist/test-kit/core/factories.js +57 -0
  561. package/dist/test-kit/core/factories.js.map +1 -0
  562. package/dist/test-kit/core/http-client.d.ts +46 -0
  563. package/dist/test-kit/core/http-client.d.ts.map +1 -0
  564. package/dist/test-kit/core/http-client.js +63 -0
  565. package/dist/test-kit/core/http-client.js.map +1 -0
  566. package/dist/test-kit/index.d.ts +10 -0
  567. package/dist/test-kit/index.d.ts.map +1 -0
  568. package/dist/test-kit/index.js +14 -0
  569. package/dist/test-kit/index.js.map +1 -0
  570. package/dist/test-kit/infra.d.ts +6 -0
  571. package/dist/test-kit/infra.d.ts.map +1 -0
  572. package/dist/test-kit/infra.js +6 -0
  573. package/dist/test-kit/infra.js.map +1 -0
  574. package/package.json +170 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * US-0203 — Input-validatie (DTO/schema).
3
+ *
4
+ * Valideert body, query en path-params tegen per-route geregistreerde schema's. Bij succes krijgt de
5
+ * handler getypte data; bij falen wordt een {@link ValidationError} met een geaggregeerde,
6
+ * geredigeerde lijst overtredingen geworpen (die de kernel als 400 mapt). De validatie-engine is
7
+ * vervangbaar via de {@link Schema}-poort; de laag is domein-loos.
8
+ */
9
+ import { ValidationError } from './errors.js';
10
+ /** Valideert de request-onderdelen; verzamelt álle overtredingen over body/query/params heen. */
11
+ export function validateRequest(req, schemas) {
12
+ if (!schemas) {
13
+ return { body: req.body, query: req.query ?? {}, params: req.params ?? {} };
14
+ }
15
+ const issues = [];
16
+ const body = check('body', req.body, schemas.body, issues);
17
+ const query = check('query', req.query ?? {}, schemas.query, issues);
18
+ const params = check('params', req.params ?? {}, schemas.params, issues);
19
+ if (issues.length > 0) {
20
+ throw new ValidationError(issues);
21
+ }
22
+ return { body, query, params };
23
+ }
24
+ function check(scope, value, schema, issues) {
25
+ if (!schema)
26
+ return value;
27
+ const result = schema.validate(value);
28
+ if (result.success)
29
+ return result.value;
30
+ for (const issue of result.issues) {
31
+ const path = issue.path && issue.path !== '(root)' ? `${scope}.${issue.path}` : scope;
32
+ issues.push({ path, message: issue.message });
33
+ }
34
+ return undefined;
35
+ }
36
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/http/core/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS9C,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAAC,GAAkB,EAAE,OAAsB;IACxE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEzE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,KAAK,CACZ,KAAkC,EAClC,KAAc,EACd,MAA4B,EAC5B,MAAyB;IAEzB,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `http` kit — domein-loze HTTP-plumbing: bootstrap + route-mounting, request-context, validatie,
3
+ * error-taxonomie, paginatie, OpenAPI en CORS/security-headers. Framework-agnostische core + adapters.
4
+ *
5
+ * De NestJS-adapter zit bewust achter de subpath `webapp-factory/backend-foundation/http/nestjs` (harde
6
+ * `@nestjs/*`-import), zodat de core-kit zonder Nest bruikbaar blijft.
7
+ */
8
+ export { createKernel, type Kernel, type KernelConfig, type CreateKernelOptions, type KernelLogEvent, } from './core/kernel.js';
9
+ export type { HttpMethod, KernelRequest, KernelResponse, Schema, ValidationOutcome, ValidationIssue, JsonSchema, RequestContext, RouteModule, RouteDefinition, RouteHandler, RouteHandlerInput, RouteSchemas, ListConfig, ListParams, SortField, } from './core/ports.js';
10
+ export { HttpError, ValidationError, toErrorResponse, isHttpError, badRequest, unauthorized, forbidden, notFound, conflict, unprocessable, internal, type ErrorCategory, type ErrorResponseOptions, } from './core/errors.js';
11
+ export { buildRequestContext, contextHeaders, runWithContext, getRequestContext, type ContextConfig, } from './core/context.js';
12
+ export { validateRequest } from './core/validation.js';
13
+ export { parseListQuery, paginate } from './core/pagination.js';
14
+ export { securityHeaders, resolveCors, type SecurityHeadersConfig, type CorsConfig, type CorsResult, } from './core/security.js';
15
+ export { compileRoutes, matchRoute, validateRouteModule, KernelBootstrapError, type CompiledRoute, type RouteMatch, } from './core/router.js';
16
+ export { generateOpenApi, type OpenApiDocument, type OpenApiInfo, type OpenApiOptions, } from './core/openapi.js';
17
+ export { redactSensitive, DEFAULT_SENSITIVE_KEYS } from './core/redaction.js';
18
+ export { zodSchema, zodToJsonSchema } from './adapters/zod-schema.js';
19
+ export { createRequestListener, type NodeRequestListener } from './nodejs/http-adapter.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,SAAS,EACT,eAAe,EACf,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhE,OAAO,EACL,eAAe,EACf,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `http` kit — domein-loze HTTP-plumbing: bootstrap + route-mounting, request-context, validatie,
3
+ * error-taxonomie, paginatie, OpenAPI en CORS/security-headers. Framework-agnostische core + adapters.
4
+ *
5
+ * De NestJS-adapter zit bewust achter de subpath `webapp-factory/backend-foundation/http/nestjs` (harde
6
+ * `@nestjs/*`-import), zodat de core-kit zonder Nest bruikbaar blijft.
7
+ */
8
+ // Kernel (US-0201..0207)
9
+ export { createKernel, } from './core/kernel.js';
10
+ // Error-taxonomie (US-0204)
11
+ export { HttpError, ValidationError, toErrorResponse, isHttpError, badRequest, unauthorized, forbidden, notFound, conflict, unprocessable, internal, } from './core/errors.js';
12
+ // Request-context (US-0202)
13
+ export { buildRequestContext, contextHeaders, runWithContext, getRequestContext, } from './core/context.js';
14
+ // Validatie (US-0203)
15
+ export { validateRequest } from './core/validation.js';
16
+ // Paginatie/filtering/sortering (US-0205)
17
+ export { parseListQuery, paginate } from './core/pagination.js';
18
+ // CORS + security-headers (US-0207)
19
+ export { securityHeaders, resolveCors, } from './core/security.js';
20
+ // Router (US-0201)
21
+ export { compileRoutes, matchRoute, validateRouteModule, KernelBootstrapError, } from './core/router.js';
22
+ // OpenAPI (US-0206)
23
+ export { generateOpenApi, } from './core/openapi.js';
24
+ // Redactie
25
+ export { redactSensitive, DEFAULT_SENSITIVE_KEYS } from './core/redaction.js';
26
+ // Adapters (dep-vrij / peer via zod)
27
+ export { zodSchema, zodToJsonSchema } from './adapters/zod-schema.js';
28
+ export { createRequestListener } from './nodejs/http-adapter.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yBAAyB;AACzB,OAAO,EACL,YAAY,GAKb,MAAM,kBAAkB,CAAC;AAsB1B,4BAA4B;AAC5B,OAAO,EACL,SAAS,EACT,eAAe,EACf,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,QAAQ,GAGT,MAAM,kBAAkB,CAAC;AAE1B,4BAA4B;AAC5B,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,0CAA0C;AAC1C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhE,oCAAoC;AACpC,OAAO,EACL,eAAe,EACf,WAAW,GAIZ,MAAM,oBAAoB,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EACL,aAAa,EACb,UAAU,EACV,mBAAmB,EACnB,oBAAoB,GAGrB,MAAM,kBAAkB,CAAC;AAE1B,oBAAoB;AACpB,OAAO,EACL,eAAe,GAIhB,MAAM,mBAAmB,CAAC;AAE3B,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,qCAAqC;AACrC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAA4B,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * NestJS-adapter voor de http-kernel. Registreert een wildcard-controller die elk request naar de
3
+ * kernel routeert, zodat de kernel de routing/plumbing verzorgt en Nest de HTTP-transport levert.
4
+ *
5
+ * `@nestjs/common` en `@nestjs/platform-express` zijn optionele peer-dependencies; alleen nodig als je
6
+ * deze subpath importeert.
7
+ */
8
+ import { type DynamicModule } from '@nestjs/common';
9
+ import { type CreateKernelOptions, type Kernel } from '../core/kernel.js';
10
+ /** DI-token waaronder de kernel-instance beschikbaar is. */
11
+ export declare const HTTP_KERNEL: unique symbol;
12
+ /** Minimale vorm van een Express-achtig request/response (geen harde type-dep). */
13
+ interface ExpressLikeRequest {
14
+ method: string;
15
+ path?: string;
16
+ url: string;
17
+ headers: Record<string, string | string[] | undefined>;
18
+ query?: Record<string, unknown>;
19
+ body?: unknown;
20
+ }
21
+ interface ExpressLikeResponse {
22
+ status(code: number): unknown;
23
+ setHeader(name: string, value: string): unknown;
24
+ json(body: unknown): unknown;
25
+ end(): unknown;
26
+ }
27
+ export declare class HttpKernelController {
28
+ private readonly kernel;
29
+ constructor(kernel: Kernel);
30
+ handle(req: ExpressLikeRequest, res: ExpressLikeResponse): Promise<void>;
31
+ }
32
+ export declare class HttpKernelModule {
33
+ /** Bootstrap de kernel (fail-fast bij ongeldige route-modules) en mount de wildcard-controller. */
34
+ static forRoot(options: CreateKernelOptions): DynamicModule;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=http-kernel.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-kernel.module.d.ts","sourceRoot":"","sources":["../../../src/http/nestjs/http-kernel.module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAgB,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGxF,4DAA4D;AAC5D,eAAO,MAAM,WAAW,eAAmC,CAAC;AAE5D,mFAAmF;AACnF,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,mBAAmB;IAC3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,GAAG,IAAI,OAAO,CAAC;CAChB;AAED,qBACa,oBAAoB;IACE,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAG1D,MAAM,CAAQ,GAAG,EAAE,kBAAkB,EAAS,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAmB7F;AAED,qBAAa,gBAAgB;IAC3B,mGAAmG;IACnG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa;CAU5D"}
@@ -0,0 +1,77 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ /**
14
+ * NestJS-adapter voor de http-kernel. Registreert een wildcard-controller die elk request naar de
15
+ * kernel routeert, zodat de kernel de routing/plumbing verzorgt en Nest de HTTP-transport levert.
16
+ *
17
+ * `@nestjs/common` en `@nestjs/platform-express` zijn optionele peer-dependencies; alleen nodig als je
18
+ * deze subpath importeert.
19
+ */
20
+ import { All, Controller, Inject, Req, Res } from '@nestjs/common';
21
+ import { createKernel } from '../core/kernel.js';
22
+ /** DI-token waaronder de kernel-instance beschikbaar is. */
23
+ export const HTTP_KERNEL = Symbol.for('http-kernel.kernel');
24
+ let HttpKernelController = class HttpKernelController {
25
+ kernel;
26
+ constructor(kernel) {
27
+ this.kernel = kernel;
28
+ }
29
+ async handle(req, res) {
30
+ const kreq = {
31
+ method: req.method,
32
+ path: req.path ?? new URL(req.url, 'http://localhost').pathname,
33
+ headers: req.headers,
34
+ query: req.query ?? {},
35
+ body: req.body,
36
+ };
37
+ const kres = await this.kernel.handle(kreq);
38
+ res.status(kres.status);
39
+ for (const [key, value] of Object.entries(kres.headers)) {
40
+ res.setHeader(key, value);
41
+ }
42
+ if (kres.body === null || kres.body === undefined) {
43
+ res.end();
44
+ }
45
+ else {
46
+ res.json(kres.body);
47
+ }
48
+ }
49
+ };
50
+ __decorate([
51
+ All('*'),
52
+ __param(0, Req()),
53
+ __param(1, Res()),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", [Object, Object]),
56
+ __metadata("design:returntype", Promise)
57
+ ], HttpKernelController.prototype, "handle", null);
58
+ HttpKernelController = __decorate([
59
+ Controller(),
60
+ __param(0, Inject(HTTP_KERNEL)),
61
+ __metadata("design:paramtypes", [Object])
62
+ ], HttpKernelController);
63
+ export { HttpKernelController };
64
+ export class HttpKernelModule {
65
+ /** Bootstrap de kernel (fail-fast bij ongeldige route-modules) en mount de wildcard-controller. */
66
+ static forRoot(options) {
67
+ const kernel = createKernel(options);
68
+ return {
69
+ module: HttpKernelModule,
70
+ global: true,
71
+ controllers: [HttpKernelController],
72
+ providers: [{ provide: HTTP_KERNEL, useValue: kernel }],
73
+ exports: [HTTP_KERNEL],
74
+ };
75
+ }
76
+ }
77
+ //# sourceMappingURL=http-kernel.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-kernel.module.js","sourceRoot":"","sources":["../../../src/http/nestjs/http-kernel.module.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;GAMG;AACH,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAsB,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,YAAY,EAAyC,MAAM,mBAAmB,CAAC;AAGxF,4DAA4D;AAC5D,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAmBrD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACmB;IAAlD,YAAkD,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAG9D,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAuB,EAAS,GAAwB;QAC1E,MAAM,IAAI,GAAkB;YAC1B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ;YAC/D,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;CACF,CAAA;AAnBO;IADL,GAAG,CAAC,GAAG,CAAC;IACK,WAAA,GAAG,EAAE,CAAA;IAA2B,WAAA,GAAG,EAAE,CAAA;;;;kDAkBlD;AAtBU,oBAAoB;IADhC,UAAU,EAAE;IAEE,WAAA,MAAM,CAAC,WAAW,CAAC,CAAA;;GADrB,oBAAoB,CAuBhC;;AAED,MAAM,OAAO,gBAAgB;IAC3B,mGAAmG;IACnG,MAAM,CAAC,OAAO,CAAC,OAA4B;QACzC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO;YACL,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,CAAC,oBAAoB,CAAC;YACnC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC,WAAW,CAAC;SACvB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Node-http-adapter: bindt de kernel aan het ingebouwde `node:http`-servermodel zonder externe deps.
3
+ * Vertaalt een `IncomingMessage` naar een {@link KernelRequest} en schrijft de {@link KernelResponse}
4
+ * naar de `ServerResponse`.
5
+ */
6
+ import type { IncomingMessage, ServerResponse } from 'node:http';
7
+ import type { Kernel } from '../core/kernel.js';
8
+ export type NodeRequestListener = (req: IncomingMessage, res: ServerResponse) => void;
9
+ /** Maakt een `http.createServer`-compatibele listener die requests naar de kernel routeert. */
10
+ export declare function createRequestListener(kernel: Kernel): NodeRequestListener;
11
+ //# sourceMappingURL=http-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-adapter.d.ts","sourceRoot":"","sources":["../../../src/http/nodejs/http-adapter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;AAEtF,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAUzE"}
@@ -0,0 +1,60 @@
1
+ /** Maakt een `http.createServer`-compatibele listener die requests naar de kernel routeert. */
2
+ export function createRequestListener(kernel) {
3
+ return (req, res) => {
4
+ handle(kernel, req, res).catch(() => {
5
+ if (!res.headersSent) {
6
+ res.statusCode = 500;
7
+ res.setHeader('Content-Type', 'application/json');
8
+ }
9
+ res.end(JSON.stringify({ error: { code: 'INTERNAL_ERROR', message: 'Internal server error' } }));
10
+ });
11
+ };
12
+ }
13
+ async function handle(kernel, req, res) {
14
+ const url = new URL(req.url ?? '/', 'http://localhost');
15
+ const query = {};
16
+ for (const [key, value] of url.searchParams.entries()) {
17
+ query[key] = value;
18
+ }
19
+ const kreq = {
20
+ method: req.method ?? 'GET',
21
+ path: url.pathname,
22
+ headers: req.headers,
23
+ query,
24
+ body: await readBody(req),
25
+ };
26
+ const kres = await kernel.handle(kreq);
27
+ res.statusCode = kres.status;
28
+ for (const [key, value] of Object.entries(kres.headers)) {
29
+ res.setHeader(key, value);
30
+ }
31
+ if (kres.body === null || kres.body === undefined) {
32
+ res.end();
33
+ return;
34
+ }
35
+ res.setHeader('Content-Type', 'application/json');
36
+ res.end(JSON.stringify(kres.body));
37
+ }
38
+ async function readBody(req) {
39
+ const method = (req.method ?? 'GET').toUpperCase();
40
+ if (method === 'GET' || method === 'HEAD')
41
+ return undefined;
42
+ const chunks = [];
43
+ for await (const chunk of req) {
44
+ chunks.push(chunk);
45
+ }
46
+ if (chunks.length === 0)
47
+ return undefined;
48
+ const raw = Buffer.concat(chunks).toString('utf8');
49
+ const contentType = req.headers['content-type'] ?? '';
50
+ if (contentType.includes('application/json')) {
51
+ try {
52
+ return JSON.parse(raw);
53
+ }
54
+ catch {
55
+ return raw; // ongeldige JSON -> laat validatie het afvangen
56
+ }
57
+ }
58
+ return raw;
59
+ }
60
+ //# sourceMappingURL=http-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-adapter.js","sourceRoot":"","sources":["../../../src/http/nodejs/http-adapter.ts"],"names":[],"mappings":"AAWA,+FAA+F;AAC/F,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClB,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YACpD,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC,CAAC;QACnG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,GAAoB,EAAE,GAAmB;IAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACxD,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,GAAkB;QAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;QAC3B,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK;QACL,IAAI,EAAE,MAAM,QAAQ,CAAC,GAAG,CAAC;KAC1B,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAoB;IAC1C,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAE5D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACtD,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC,CAAC,gDAAgD;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * US-1301 — Catalogus-loader + fallback-keten. Indexeert geïnjecteerde locale-catalogi en resolvet een
3
+ * sleutel via de fallback-keten (bv. `nl-BE → nl → default`). Bevat geen vertaalinhoud.
4
+ */
5
+ import type { Catalogs, MessageValue } from './ports.js';
6
+ export interface ResolvedMessage {
7
+ value: MessageValue;
8
+ /** De locale waaruit de sleutel uiteindelijk is opgehaald (voor pluralisatie). */
9
+ locale: string;
10
+ }
11
+ export interface CatalogResolver {
12
+ resolveKey(locale: string, key: string): ResolvedMessage | null;
13
+ readonly supportedLocales: string[];
14
+ readonly defaultLocale: string;
15
+ }
16
+ /** Bouwt de fallback-keten voor een locale, eindigend op de default-locale. */
17
+ export declare function fallbackChain(locale: string, defaultLocale: string): string[];
18
+ export declare function createCatalogResolver(options: {
19
+ catalogs: Catalogs;
20
+ defaultLocale: string;
21
+ supportedLocales?: string[];
22
+ }): CatalogResolver;
23
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/catalog.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IAChE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAS7E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B,GAAG,eAAe,CAgBlB"}
@@ -0,0 +1,31 @@
1
+ /** Bouwt de fallback-keten voor een locale, eindigend op de default-locale. */
2
+ export function fallbackChain(locale, defaultLocale) {
3
+ const chain = [];
4
+ const parts = locale.split('-');
5
+ for (let i = parts.length; i >= 1; i--) {
6
+ const candidate = parts.slice(0, i).join('-');
7
+ if (!chain.includes(candidate))
8
+ chain.push(candidate);
9
+ }
10
+ if (!chain.includes(defaultLocale))
11
+ chain.push(defaultLocale);
12
+ return chain;
13
+ }
14
+ export function createCatalogResolver(options) {
15
+ const catalogs = options.catalogs;
16
+ const defaultLocale = options.defaultLocale;
17
+ const supportedLocales = options.supportedLocales ?? Object.keys(catalogs);
18
+ return {
19
+ supportedLocales,
20
+ defaultLocale,
21
+ resolveKey(locale, key) {
22
+ for (const candidate of fallbackChain(locale, defaultLocale)) {
23
+ const value = catalogs[candidate]?.[key];
24
+ if (value !== undefined)
25
+ return { value, locale: candidate };
26
+ }
27
+ return null;
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/i18n/core/catalog.ts"],"names":[],"mappings":"AAkBA,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,aAAqB;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAIrC;IACC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC5C,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE3E,OAAO;QACL,gBAAgB;QAChB,aAAa;QACb,UAAU,CAAC,MAAM,EAAE,GAAG;YACpB,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;gBAC7D,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YAC/D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Foutentaxonomie voor i18n. Ontbrekende sleutels crashen niet (ze leveren een marker + waarschuwing);
3
+ * een ontbrekende interpolatie-parameter is wél een expliciete fout (US-1302 AC3).
4
+ */
5
+ export declare class I18nError extends Error {
6
+ readonly code: string;
7
+ constructor(message: string, code: string);
8
+ }
9
+ /** Een of meer benoemde interpolatie-parameters ontbreken (US-1302 AC3). */
10
+ export declare class MissingParamError extends I18nError {
11
+ readonly params: string[];
12
+ constructor(params: string[]);
13
+ }
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAM1C;AAED,4EAA4E;AAC5E,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBACd,MAAM,EAAE,MAAM,EAAE;CAI7B"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Foutentaxonomie voor i18n. Ontbrekende sleutels crashen niet (ze leveren een marker + waarschuwing);
3
+ * een ontbrekende interpolatie-parameter is wél een expliciete fout (US-1302 AC3).
4
+ */
5
+ export class I18nError extends Error {
6
+ code;
7
+ constructor(message, code) {
8
+ super(message);
9
+ this.name = new.target.name;
10
+ this.code = code;
11
+ Object.setPrototypeOf(this, new.target.prototype);
12
+ }
13
+ }
14
+ /** Een of meer benoemde interpolatie-parameters ontbreken (US-1302 AC3). */
15
+ export class MissingParamError extends I18nError {
16
+ params;
17
+ constructor(params) {
18
+ super(`Ontbrekende interpolatie-parameter(s): ${params.join(', ')}`, 'MISSING_PARAM');
19
+ this.params = params;
20
+ }
21
+ }
22
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/i18n/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAS;IACtB,YAAY,OAAe,EAAE,IAAY;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IACrC,MAAM,CAAW;IAC1B,YAAY,MAAgB;QAC1B,KAAK,CAAC,0CAA0C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { Catalogs, I18nLogger, LocaleContext, MessageParams } from './ports.js';
2
+ export interface I18n {
3
+ /** Directe vertaling; gooit bij een ontbrekende interpolatie-parameter (US-1302). */
4
+ translate(locale: string, key: string, params?: MessageParams): string;
5
+ negotiate(context: LocaleContext): string;
6
+ /** Gelokaliseerd foutbericht; crash-veilig. */
7
+ resolveError(code: string, params: MessageParams, context: LocaleContext): string;
8
+ /** Gelokaliseerd e-mailbericht; crash-veilig. */
9
+ resolveEmail(templateKey: string, params: MessageParams, context: LocaleContext): string;
10
+ readonly supportedLocales: string[];
11
+ readonly defaultLocale: string;
12
+ }
13
+ export interface I18nOptions {
14
+ catalogs: Catalogs;
15
+ defaultLocale: string;
16
+ supportedLocales?: string[];
17
+ logger?: I18nLogger;
18
+ }
19
+ export declare function createI18n(options: I18nOptions): I18n;
20
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/i18n.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,WAAW,IAAI;IACnB,qFAAqF;IACrF,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACvE,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAAC;IAC1C,+CAA+C;IAC/C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAAC;IAClF,iDAAiD;IACjD,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAAC;IACzF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAuCrD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * US-1304 — Resolutie-façade. Bindt catalogus-loader (US-1301), interpolatie/pluralisatie (US-1302) en
3
+ * locale-negotiatie (US-1303) samen tot `translate`, `resolveError` en `resolveEmail`. De façade is
4
+ * crash-veilig: onbekende sleutels/parameters leveren een herkenbare fallback + waarschuwing, zonder
5
+ * PII of stacktrace te lekken. Alleen expliciet meegegeven parameters worden geïnterpoleerd.
6
+ */
7
+ import { createCatalogResolver } from './catalog.js';
8
+ import { MissingParamError } from './errors.js';
9
+ import { buildMessage } from './message.js';
10
+ import { negotiateLocale, parseAcceptLanguage } from './negotiate.js';
11
+ export function createI18n(options) {
12
+ const resolver = createCatalogResolver(options);
13
+ const logger = options.logger ?? { warn: (message, meta) => console.warn(message, meta) };
14
+ function translate(locale, key, params = {}) {
15
+ const resolved = resolver.resolveKey(locale, key);
16
+ if (!resolved) {
17
+ logger.warn('i18n: ontbrekende sleutel', { key, locale });
18
+ return key; // herkenbare missing-key-marker (US-1301 AC3)
19
+ }
20
+ return buildMessage(resolved.locale, resolved.value, params);
21
+ }
22
+ function negotiate(context) {
23
+ const desired = 'acceptLanguage' in context ? parseAcceptLanguage(context.acceptLanguage) : context.desired;
24
+ return negotiateLocale(desired, resolver.supportedLocales, resolver.defaultLocale);
25
+ }
26
+ function resolve(key, params, context) {
27
+ const locale = negotiate(context);
28
+ try {
29
+ return translate(locale, key, params);
30
+ }
31
+ catch (error) {
32
+ logger.warn('i18n: resolutie-fout', {
33
+ key,
34
+ ...(error instanceof MissingParamError ? { missingParams: error.params } : {}),
35
+ });
36
+ return key; // crash-veilige fallback, geen half-ingevuld bericht (US-1304 AC3)
37
+ }
38
+ }
39
+ return {
40
+ translate,
41
+ negotiate,
42
+ resolveError: (code, params, context) => resolve(code, params, context),
43
+ resolveEmail: (templateKey, params, context) => resolve(templateKey, params, context),
44
+ supportedLocales: resolver.supportedLocales,
45
+ defaultLocale: resolver.defaultLocale,
46
+ };
47
+ }
48
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../../src/i18n/core/i18n.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAsBtE,MAAM,UAAU,UAAU,CAAC,OAAoB;IAC7C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAe,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;IAEtG,SAAS,SAAS,CAAC,MAAc,EAAE,GAAW,EAAE,SAAwB,EAAE;QACxE,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,OAAO,GAAG,CAAC,CAAC,8CAA8C;QAC5D,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,SAAS,SAAS,CAAC,OAAsB;QACvC,MAAM,OAAO,GAAG,gBAAgB,IAAI,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5G,OAAO,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IACrF,CAAC;IAED,SAAS,OAAO,CAAC,GAAW,EAAE,MAAqB,EAAE,OAAsB;QACzE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBAClC,GAAG;gBACH,GAAG,CAAC,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/E,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,CAAC,mEAAmE;QACjF,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,SAAS;QACT,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;QACvE,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC;QACrF,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;QAC3C,aAAa,EAAE,QAAQ,CAAC,aAAa;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { MessageParams, MessageValue, PluralForms } from './ports.js';
2
+ /** Vervangt `{name}` door parameters; gooit {@link MissingParamError} bij ontbrekende parameters. */
3
+ export declare function interpolate(template: string, params: MessageParams): string;
4
+ /** Kiest de juiste plural-vorm voor `count` in de gegeven locale (CLDR via `Intl.PluralRules`). */
5
+ export declare function selectPluralForm(locale: string, forms: PluralForms, count: number): string;
6
+ /** Bouwt het uiteindelijke bericht: kiest de plural-vorm (indien nodig) en interpoleert. */
7
+ export declare function buildMessage(locale: string, value: MessageValue, params: MessageParams): string;
8
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/message.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI3E,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAW3E;AAED,mGAAmG;AACnG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ1F;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAI/F"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * US-1302 — Interpolatie + pluralisatie. Interpoleert benoemde variabelen (`{name}`) en kiest de
3
+ * CLDR-plural-vorm via de ingebouwde `Intl.PluralRules` (geen externe dep). Een ontbrekende parameter
4
+ * levert een expliciete fout op — nooit een half ingevuld bericht.
5
+ */
6
+ import { MissingParamError } from './errors.js';
7
+ const PLACEHOLDER = /\{(\w+)\}/g;
8
+ /** Vervangt `{name}` door parameters; gooit {@link MissingParamError} bij ontbrekende parameters. */
9
+ export function interpolate(template, params) {
10
+ const missing = [];
11
+ const result = template.replace(PLACEHOLDER, (_, name) => {
12
+ if (!(name in params)) {
13
+ missing.push(name);
14
+ return '';
15
+ }
16
+ return String(params[name]);
17
+ });
18
+ if (missing.length > 0)
19
+ throw new MissingParamError([...new Set(missing)]);
20
+ return result;
21
+ }
22
+ /** Kiest de juiste plural-vorm voor `count` in de gegeven locale (CLDR via `Intl.PluralRules`). */
23
+ export function selectPluralForm(locale, forms, count) {
24
+ let category = 'other';
25
+ try {
26
+ category = new Intl.PluralRules(locale).select(count);
27
+ }
28
+ catch {
29
+ category = 'other';
30
+ }
31
+ return forms[category] ?? forms.other;
32
+ }
33
+ /** Bouwt het uiteindelijke bericht: kiest de plural-vorm (indien nodig) en interpoleert. */
34
+ export function buildMessage(locale, value, params) {
35
+ const template = typeof value === 'string' ? value : selectPluralForm(locale, value, Number(params['count'] ?? 0));
36
+ return interpolate(template, params);
37
+ }
38
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/i18n/core/message.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAqB;IACjE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QAC/D,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,iBAAiB,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAAkB,EAAE,KAAa;IAChF,IAAI,QAAQ,GAAwB,OAAO,CAAC;IAC5C,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;AACxC,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,KAAmB,EAAE,MAAqB;IACrF,MAAM,QAAQ,GACZ,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpG,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * US-1303 — Locale-negotiatie. Matcht gewenste locales (met q-weging, zoals in `Accept-Language`)
3
+ * tegen de ondersteunde locales; valt terug op de default als geen enkele wordt ondersteund.
4
+ */
5
+ export interface DesiredLocale {
6
+ locale: string;
7
+ q?: number;
8
+ }
9
+ /** Parset een `Accept-Language`-headerwaarde naar een lijst met q-weging. */
10
+ export declare function parseAcceptLanguage(header: string): DesiredLocale[];
11
+ /** Kiest de best passende ondersteunde locale, of de default-locale bij geen match. */
12
+ export declare function negotiateLocale(desired: DesiredLocale[], supported: string[], defaultLocale: string): string;
13
+ //# sourceMappingURL=negotiate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negotiate.d.ts","sourceRoot":"","sources":["../../../src/i18n/core/negotiate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,EAAE,CAanE;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EAAE,EACxB,SAAS,EAAE,MAAM,EAAE,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,CAUR"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * US-1303 — Locale-negotiatie. Matcht gewenste locales (met q-weging, zoals in `Accept-Language`)
3
+ * tegen de ondersteunde locales; valt terug op de default als geen enkele wordt ondersteund.
4
+ */
5
+ /** Parset een `Accept-Language`-headerwaarde naar een lijst met q-weging. */
6
+ export function parseAcceptLanguage(header) {
7
+ return header
8
+ .split(',')
9
+ .map((part) => {
10
+ const [locale, ...params] = part.trim().split(';');
11
+ let q = 1;
12
+ for (const param of params) {
13
+ const match = /q=([0-9.]+)/.exec(param.trim());
14
+ if (match)
15
+ q = Number(match[1]);
16
+ }
17
+ return { locale: (locale ?? '').trim(), q };
18
+ })
19
+ .filter((entry) => entry.locale.length > 0 && entry.locale !== '*');
20
+ }
21
+ /** Kiest de best passende ondersteunde locale, of de default-locale bij geen match. */
22
+ export function negotiateLocale(desired, supported, defaultLocale) {
23
+ const sorted = desired
24
+ .map((d, index) => ({ locale: d.locale, q: d.q ?? 1, index }))
25
+ .sort((a, b) => b.q - a.q || a.index - b.index);
26
+ for (const { locale } of sorted) {
27
+ const match = matchSupported(locale, supported);
28
+ if (match)
29
+ return match;
30
+ }
31
+ return defaultLocale;
32
+ }
33
+ function matchSupported(desired, supported) {
34
+ const d = desired.toLowerCase();
35
+ for (const candidate of supported) {
36
+ const s = candidate.toLowerCase();
37
+ if (d === s)
38
+ return candidate;
39
+ if (d.startsWith(`${s}-`))
40
+ return candidate; // "nl-NL" matcht ondersteunde "nl"
41
+ if (s.startsWith(`${d}-`))
42
+ return candidate; // "nl" matcht ondersteunde "nl-BE"
43
+ }
44
+ return null;
45
+ }
46
+ //# sourceMappingURL=negotiate.js.map