@authup/server-core 1.0.0-beta.56 → 1.0.0-beta.57

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 (410) hide show
  1. package/dist/adapters/database/domains/role/entity.d.ts.map +1 -1
  2. package/dist/adapters/database/domains/role/entity.mjs +2 -1
  3. package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
  4. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.d.ts +25 -0
  5. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.d.ts.map +1 -0
  6. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.mjs +60 -0
  7. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.mjs.map +1 -0
  8. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.d.ts +25 -0
  9. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.d.ts.map +1 -0
  10. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.mjs +60 -0
  11. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.mjs.map +1 -0
  12. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +1 -1
  13. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
  14. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +1 -1
  15. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
  16. package/dist/adapters/http/adapters/oauth2/grant-types/identity.mjs +1 -1
  17. package/dist/adapters/http/adapters/oauth2/grant-types/identity.mjs.map +1 -1
  18. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +1 -1
  19. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
  20. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +1 -1
  21. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
  22. package/dist/adapters/http/controllers/entities/client/module.d.ts +6 -6
  23. package/dist/adapters/http/controllers/entities/client/module.d.ts.map +1 -1
  24. package/dist/adapters/http/controllers/entities/client/module.mjs +30 -7
  25. package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
  26. package/dist/adapters/http/controllers/entities/client-permission/module.d.ts +5 -5
  27. package/dist/adapters/http/controllers/entities/client-permission/module.d.ts.map +1 -1
  28. package/dist/adapters/http/controllers/entities/client-permission/module.mjs +23 -5
  29. package/dist/adapters/http/controllers/entities/client-permission/module.mjs.map +1 -1
  30. package/dist/adapters/http/controllers/entities/client-role/module.d.ts +4 -4
  31. package/dist/adapters/http/controllers/entities/client-role/module.d.ts.map +1 -1
  32. package/dist/adapters/http/controllers/entities/client-role/module.mjs +19 -4
  33. package/dist/adapters/http/controllers/entities/client-role/module.mjs.map +1 -1
  34. package/dist/adapters/http/controllers/entities/client-scope/module.d.ts +4 -4
  35. package/dist/adapters/http/controllers/entities/client-scope/module.d.ts.map +1 -1
  36. package/dist/adapters/http/controllers/entities/client-scope/module.mjs +19 -4
  37. package/dist/adapters/http/controllers/entities/client-scope/module.mjs.map +1 -1
  38. package/dist/adapters/http/controllers/entities/consent/module.d.ts +3 -3
  39. package/dist/adapters/http/controllers/entities/consent/module.d.ts.map +1 -1
  40. package/dist/adapters/http/controllers/entities/consent/module.mjs +15 -3
  41. package/dist/adapters/http/controllers/entities/consent/module.mjs.map +1 -1
  42. package/dist/adapters/http/controllers/entities/event/module.d.ts +2 -2
  43. package/dist/adapters/http/controllers/entities/event/module.d.ts.map +1 -1
  44. package/dist/adapters/http/controllers/entities/event/module.mjs +11 -2
  45. package/dist/adapters/http/controllers/entities/event/module.mjs.map +1 -1
  46. package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts +5 -5
  47. package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts.map +1 -1
  48. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs +23 -5
  49. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs.map +1 -1
  50. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts +6 -6
  51. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  52. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +23 -7
  53. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  54. package/dist/adapters/http/controllers/entities/key/module.d.ts +5 -5
  55. package/dist/adapters/http/controllers/entities/key/module.d.ts.map +1 -1
  56. package/dist/adapters/http/controllers/entities/key/module.mjs +23 -5
  57. package/dist/adapters/http/controllers/entities/key/module.mjs.map +1 -1
  58. package/dist/adapters/http/controllers/entities/permission/module.d.ts +6 -6
  59. package/dist/adapters/http/controllers/entities/permission/module.d.ts.map +1 -1
  60. package/dist/adapters/http/controllers/entities/permission/module.mjs +27 -6
  61. package/dist/adapters/http/controllers/entities/permission/module.mjs.map +1 -1
  62. package/dist/adapters/http/controllers/entities/permission-policy/module.d.ts +4 -4
  63. package/dist/adapters/http/controllers/entities/permission-policy/module.d.ts.map +1 -1
  64. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs +19 -4
  65. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs.map +1 -1
  66. package/dist/adapters/http/controllers/entities/policy/module.d.ts +7 -7
  67. package/dist/adapters/http/controllers/entities/policy/module.d.ts.map +1 -1
  68. package/dist/adapters/http/controllers/entities/policy/module.mjs +27 -6
  69. package/dist/adapters/http/controllers/entities/policy/module.mjs.map +1 -1
  70. package/dist/adapters/http/controllers/entities/realm/module.d.ts +6 -6
  71. package/dist/adapters/http/controllers/entities/realm/module.d.ts.map +1 -1
  72. package/dist/adapters/http/controllers/entities/realm/module.mjs +29 -8
  73. package/dist/adapters/http/controllers/entities/realm/module.mjs.map +1 -1
  74. package/dist/adapters/http/controllers/entities/role/module.d.ts +6 -6
  75. package/dist/adapters/http/controllers/entities/role/module.d.ts.map +1 -1
  76. package/dist/adapters/http/controllers/entities/role/module.mjs +27 -6
  77. package/dist/adapters/http/controllers/entities/role/module.mjs.map +1 -1
  78. package/dist/adapters/http/controllers/entities/role-attribute/module.d.ts +5 -5
  79. package/dist/adapters/http/controllers/entities/role-attribute/module.d.ts.map +1 -1
  80. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs +23 -5
  81. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs.map +1 -1
  82. package/dist/adapters/http/controllers/entities/role-permission/module.d.ts +5 -5
  83. package/dist/adapters/http/controllers/entities/role-permission/module.d.ts.map +1 -1
  84. package/dist/adapters/http/controllers/entities/role-permission/module.mjs +23 -5
  85. package/dist/adapters/http/controllers/entities/role-permission/module.mjs.map +1 -1
  86. package/dist/adapters/http/controllers/entities/scope/module.d.ts +6 -6
  87. package/dist/adapters/http/controllers/entities/scope/module.d.ts.map +1 -1
  88. package/dist/adapters/http/controllers/entities/scope/module.mjs +27 -6
  89. package/dist/adapters/http/controllers/entities/scope/module.mjs.map +1 -1
  90. package/dist/adapters/http/controllers/entities/session/module.d.ts +3 -3
  91. package/dist/adapters/http/controllers/entities/session/module.d.ts.map +1 -1
  92. package/dist/adapters/http/controllers/entities/session/module.mjs +15 -3
  93. package/dist/adapters/http/controllers/entities/session/module.mjs.map +1 -1
  94. package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts +5 -5
  95. package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts.map +1 -1
  96. package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs +23 -5
  97. package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs.map +1 -1
  98. package/dist/adapters/http/controllers/entities/user/module.d.ts +6 -6
  99. package/dist/adapters/http/controllers/entities/user/module.d.ts.map +1 -1
  100. package/dist/adapters/http/controllers/entities/user/module.mjs +27 -6
  101. package/dist/adapters/http/controllers/entities/user/module.mjs.map +1 -1
  102. package/dist/adapters/http/controllers/entities/user-attribute/module.d.ts +5 -5
  103. package/dist/adapters/http/controllers/entities/user-attribute/module.d.ts.map +1 -1
  104. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs +23 -5
  105. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs.map +1 -1
  106. package/dist/adapters/http/controllers/entities/user-authenticator/module.d.ts +4 -4
  107. package/dist/adapters/http/controllers/entities/user-authenticator/module.d.ts.map +1 -1
  108. package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs +19 -4
  109. package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs.map +1 -1
  110. package/dist/adapters/http/controllers/entities/user-permission/module.d.ts +5 -5
  111. package/dist/adapters/http/controllers/entities/user-permission/module.d.ts.map +1 -1
  112. package/dist/adapters/http/controllers/entities/user-permission/module.mjs +23 -5
  113. package/dist/adapters/http/controllers/entities/user-permission/module.mjs.map +1 -1
  114. package/dist/adapters/http/controllers/entities/user-role/module.d.ts +4 -4
  115. package/dist/adapters/http/controllers/entities/user-role/module.d.ts.map +1 -1
  116. package/dist/adapters/http/controllers/entities/user-role/module.mjs +19 -4
  117. package/dist/adapters/http/controllers/entities/user-role/module.mjs.map +1 -1
  118. package/dist/adapters/http/controllers/index.mjs +2 -1
  119. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +1 -1
  120. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs.map +1 -1
  121. package/dist/adapters/http/controllers/workflows/index.d.ts +1 -0
  122. package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
  123. package/dist/adapters/http/controllers/workflows/index.mjs +3 -1
  124. package/dist/adapters/http/controllers/workflows/logout/module.d.ts.map +1 -1
  125. package/dist/adapters/http/controllers/workflows/logout/module.mjs +5 -1
  126. package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
  127. package/dist/adapters/http/controllers/workflows/userinfo/index.d.ts +2 -0
  128. package/dist/adapters/http/controllers/workflows/userinfo/index.d.ts.map +1 -0
  129. package/dist/adapters/http/controllers/workflows/userinfo/index.mjs +5 -0
  130. package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts +18 -0
  131. package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts.map +1 -0
  132. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs +53 -0
  133. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs.map +1 -0
  134. package/dist/adapters/http/index.mjs +2 -1
  135. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts +1 -0
  136. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts.map +1 -1
  137. package/dist/adapters/http/middleware/built-in/authorization/module.mjs +8 -0
  138. package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
  139. package/dist/adapters/http/middleware/built-in/rate-limit.d.ts.map +1 -1
  140. package/dist/adapters/http/middleware/built-in/rate-limit.mjs +2 -0
  141. package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
  142. package/dist/adapters/http/request/event-context.mjs +1 -1
  143. package/dist/adapters/http/request/event-context.mjs.map +1 -1
  144. package/dist/app/factory.d.ts +2 -1
  145. package/dist/app/factory.d.ts.map +1 -1
  146. package/dist/app/factory.mjs +2 -2
  147. package/dist/app/factory.mjs.map +1 -1
  148. package/dist/app/index.d.ts +1 -0
  149. package/dist/app/index.d.ts.map +1 -1
  150. package/dist/app/index.mjs +5 -1
  151. package/dist/app/modules/authentication/repositories/session.mjs +2 -2
  152. package/dist/app/modules/authentication/repositories/session.mjs.map +1 -1
  153. package/dist/app/modules/components/module.d.ts +3 -0
  154. package/dist/app/modules/components/module.d.ts.map +1 -1
  155. package/dist/app/modules/components/module.mjs +17 -2
  156. package/dist/app/modules/components/module.mjs.map +1 -1
  157. package/dist/app/modules/config/constants.d.ts +1 -0
  158. package/dist/app/modules/config/constants.d.ts.map +1 -1
  159. package/dist/app/modules/config/constants.mjs +1 -0
  160. package/dist/app/modules/config/constants.mjs.map +1 -1
  161. package/dist/app/modules/config/helpers.d.ts +9 -0
  162. package/dist/app/modules/config/helpers.d.ts.map +1 -0
  163. package/dist/app/modules/config/helpers.mjs +21 -0
  164. package/dist/app/modules/config/helpers.mjs.map +1 -0
  165. package/dist/app/modules/config/index.d.ts +2 -0
  166. package/dist/app/modules/config/index.d.ts.map +1 -1
  167. package/dist/app/modules/config/index.mjs +6 -1
  168. package/dist/app/modules/config/module.d.ts.map +1 -1
  169. package/dist/app/modules/config/module.mjs +2 -7
  170. package/dist/app/modules/config/module.mjs.map +1 -1
  171. package/dist/app/modules/config/normalize.d.ts.map +1 -1
  172. package/dist/app/modules/config/normalize.mjs +4 -0
  173. package/dist/app/modules/config/normalize.mjs.map +1 -1
  174. package/dist/app/modules/config/read/env.d.ts.map +1 -1
  175. package/dist/app/modules/config/read/env.mjs +2 -0
  176. package/dist/app/modules/config/read/env.mjs.map +1 -1
  177. package/dist/app/modules/config/read/fs.d.ts.map +1 -1
  178. package/dist/app/modules/config/read/fs.mjs +31 -8
  179. package/dist/app/modules/config/read/fs.mjs.map +1 -1
  180. package/dist/app/modules/config/trust-proxy.d.ts +28 -0
  181. package/dist/app/modules/config/trust-proxy.d.ts.map +1 -0
  182. package/dist/app/modules/config/trust-proxy.mjs +64 -0
  183. package/dist/app/modules/config/trust-proxy.mjs.map +1 -0
  184. package/dist/app/modules/config/types.d.ts +18 -0
  185. package/dist/app/modules/config/types.d.ts.map +1 -1
  186. package/dist/app/modules/config/validator.d.ts.map +1 -1
  187. package/dist/app/modules/config/validator.mjs +7 -0
  188. package/dist/app/modules/config/validator.mjs.map +1 -1
  189. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  190. package/dist/app/modules/database/repositories/client/repository.mjs +3 -4
  191. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  192. package/dist/app/modules/database/repositories/client-permission/repository.mjs +2 -2
  193. package/dist/app/modules/database/repositories/client-permission/repository.mjs.map +1 -1
  194. package/dist/app/modules/database/repositories/client-role/repository.mjs +2 -2
  195. package/dist/app/modules/database/repositories/client-role/repository.mjs.map +1 -1
  196. package/dist/app/modules/database/repositories/client-scope/repository.mjs +2 -2
  197. package/dist/app/modules/database/repositories/client-scope/repository.mjs.map +1 -1
  198. package/dist/app/modules/database/repositories/event/repository.d.ts.map +1 -1
  199. package/dist/app/modules/database/repositories/event/repository.mjs +4 -3
  200. package/dist/app/modules/database/repositories/event/repository.mjs.map +1 -1
  201. package/dist/app/modules/database/repositories/identity-provider/repository.mjs +2 -2
  202. package/dist/app/modules/database/repositories/identity-provider/repository.mjs.map +1 -1
  203. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs +2 -2
  204. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs.map +1 -1
  205. package/dist/app/modules/database/repositories/key/repository.mjs +2 -2
  206. package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
  207. package/dist/app/modules/database/repositories/permission/repository.mjs +2 -2
  208. package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
  209. package/dist/app/modules/database/repositories/permission-policy/repository.mjs +2 -2
  210. package/dist/app/modules/database/repositories/permission-policy/repository.mjs.map +1 -1
  211. package/dist/app/modules/database/repositories/policy/repository.mjs +2 -2
  212. package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
  213. package/dist/app/modules/database/repositories/query.d.ts +20 -0
  214. package/dist/app/modules/database/repositories/query.d.ts.map +1 -1
  215. package/dist/app/modules/database/repositories/query.mjs +26 -3
  216. package/dist/app/modules/database/repositories/query.mjs.map +1 -1
  217. package/dist/app/modules/database/repositories/realm/repository.mjs +2 -2
  218. package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
  219. package/dist/app/modules/database/repositories/role/repository.mjs +2 -2
  220. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  221. package/dist/app/modules/database/repositories/role-attribute/repository.mjs +2 -2
  222. package/dist/app/modules/database/repositories/role-attribute/repository.mjs.map +1 -1
  223. package/dist/app/modules/database/repositories/role-permission/repository.mjs +2 -2
  224. package/dist/app/modules/database/repositories/role-permission/repository.mjs.map +1 -1
  225. package/dist/app/modules/database/repositories/schema-validation.d.ts +17 -3
  226. package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -1
  227. package/dist/app/modules/database/repositories/schema-validation.mjs +29 -5
  228. package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -1
  229. package/dist/app/modules/database/repositories/scope/repository.mjs +2 -2
  230. package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
  231. package/dist/app/modules/database/repositories/trust-anchor/repository.mjs +2 -2
  232. package/dist/app/modules/database/repositories/trust-anchor/repository.mjs.map +1 -1
  233. package/dist/app/modules/database/repositories/user/repository.mjs +2 -2
  234. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  235. package/dist/app/modules/database/repositories/user-attribute/repository.mjs +2 -2
  236. package/dist/app/modules/database/repositories/user-attribute/repository.mjs.map +1 -1
  237. package/dist/app/modules/database/repositories/user-authenticator/repository.mjs +2 -2
  238. package/dist/app/modules/database/repositories/user-authenticator/repository.mjs.map +1 -1
  239. package/dist/app/modules/database/repositories/user-permission/repository.mjs +2 -2
  240. package/dist/app/modules/database/repositories/user-permission/repository.mjs.map +1 -1
  241. package/dist/app/modules/database/repositories/user-role/repository.mjs +2 -2
  242. package/dist/app/modules/database/repositories/user-role/repository.mjs.map +1 -1
  243. package/dist/app/modules/http/constants.d.ts +2 -13
  244. package/dist/app/modules/http/constants.d.ts.map +1 -1
  245. package/dist/app/modules/http/constants.mjs.map +1 -1
  246. package/dist/app/modules/http/module.d.ts.map +1 -1
  247. package/dist/app/modules/http/module.mjs +7 -1
  248. package/dist/app/modules/http/module.mjs.map +1 -1
  249. package/dist/app/modules/http/modules/controller.d.ts +4 -2
  250. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  251. package/dist/app/modules/http/modules/controller.mjs +16 -3
  252. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  253. package/dist/app/modules/index.mjs +5 -1
  254. package/dist/app/modules/oauth2/repositories/consent/repository.mjs +2 -2
  255. package/dist/app/modules/oauth2/repositories/consent/repository.mjs.map +1 -1
  256. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  257. package/dist/app/modules/provisioning/module.mjs +12 -4
  258. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  259. package/dist/app/types.d.ts +5 -0
  260. package/dist/app/types.d.ts.map +1 -0
  261. package/dist/app/types.mjs +4 -0
  262. package/dist/cli/commands/healthcheck.d.ts +2 -1
  263. package/dist/cli/commands/healthcheck.d.ts.map +1 -1
  264. package/dist/cli/commands/healthcheck.mjs +3 -2
  265. package/dist/cli/commands/healthcheck.mjs.map +1 -1
  266. package/dist/cli/commands/index.d.ts +0 -1
  267. package/dist/cli/commands/index.d.ts.map +1 -1
  268. package/dist/cli/commands/index.mjs +1 -2
  269. package/dist/cli/commands/migration.d.ts +2 -1
  270. package/dist/cli/commands/migration.d.ts.map +1 -1
  271. package/dist/cli/commands/migration.mjs +3 -2
  272. package/dist/cli/commands/migration.mjs.map +1 -1
  273. package/dist/cli/commands/start.d.ts +2 -1
  274. package/dist/cli/commands/start.d.ts.map +1 -1
  275. package/dist/cli/commands/start.mjs +3 -2
  276. package/dist/cli/commands/start.mjs.map +1 -1
  277. package/dist/cli/config.d.ts +18 -0
  278. package/dist/cli/config.d.ts.map +1 -0
  279. package/dist/cli/config.mjs +34 -0
  280. package/dist/cli/config.mjs.map +1 -0
  281. package/dist/cli/module.d.ts +8 -8
  282. package/dist/cli/module.d.ts.map +1 -1
  283. package/dist/cli/module.mjs +8 -28
  284. package/dist/cli/module.mjs.map +1 -1
  285. package/dist/cli/types.d.ts +5 -0
  286. package/dist/cli/types.d.ts.map +1 -0
  287. package/dist/cli/types.mjs +4 -0
  288. package/dist/components/event-cleaner/module.d.ts.map +1 -1
  289. package/dist/components/event-cleaner/module.mjs +26 -14
  290. package/dist/components/event-cleaner/module.mjs.map +1 -1
  291. package/dist/components/index.d.ts +0 -1
  292. package/dist/components/index.d.ts.map +1 -1
  293. package/dist/components/index.mjs +1 -4
  294. package/dist/components/oauth2-cleaner/module.d.ts.map +1 -1
  295. package/dist/components/oauth2-cleaner/module.mjs +29 -17
  296. package/dist/components/oauth2-cleaner/module.mjs.map +1 -1
  297. package/dist/components/types.d.ts +1 -0
  298. package/dist/components/types.d.ts.map +1 -1
  299. package/dist/core/authentication/login-throttle/service.d.ts.map +1 -1
  300. package/dist/core/authentication/login-throttle/service.mjs +2 -1
  301. package/dist/core/authentication/login-throttle/service.mjs.map +1 -1
  302. package/dist/core/entities/client/constants.d.ts +10 -0
  303. package/dist/core/entities/client/constants.d.ts.map +1 -0
  304. package/dist/core/entities/client/constants.mjs +20 -0
  305. package/dist/core/entities/client/constants.mjs.map +1 -0
  306. package/dist/core/entities/client/index.d.ts +1 -0
  307. package/dist/core/entities/client/index.d.ts.map +1 -1
  308. package/dist/core/entities/client/index.mjs +3 -2
  309. package/dist/core/entities/client/schema.d.ts.map +1 -1
  310. package/dist/core/entities/client/schema.mjs +40 -3
  311. package/dist/core/entities/client/schema.mjs.map +1 -1
  312. package/dist/core/entities/client/service.d.ts.map +1 -1
  313. package/dist/core/entities/client/service.mjs +8 -60
  314. package/dist/core/entities/client/service.mjs.map +1 -1
  315. package/dist/core/entities/client/web-client.d.ts +39 -3
  316. package/dist/core/entities/client/web-client.d.ts.map +1 -1
  317. package/dist/core/entities/client/web-client.mjs +68 -12
  318. package/dist/core/entities/client/web-client.mjs.map +1 -1
  319. package/dist/core/entities/client-scope/schema.d.ts.map +1 -1
  320. package/dist/core/entities/client-scope/schema.mjs +3 -1
  321. package/dist/core/entities/client-scope/schema.mjs.map +1 -1
  322. package/dist/core/entities/event/constants.d.ts +7 -0
  323. package/dist/core/entities/event/constants.d.ts.map +1 -1
  324. package/dist/core/entities/event/constants.mjs +7 -1
  325. package/dist/core/entities/event/constants.mjs.map +1 -1
  326. package/dist/core/entities/event/index.mjs +2 -2
  327. package/dist/core/entities/event/service.mjs +1 -1
  328. package/dist/core/entities/event/service.mjs.map +1 -1
  329. package/dist/core/entities/index.mjs +4 -3
  330. package/dist/core/entities/role/schema.d.ts.map +1 -1
  331. package/dist/core/entities/role/schema.mjs +4 -0
  332. package/dist/core/entities/role/schema.mjs.map +1 -1
  333. package/dist/core/entities/session/schema.d.ts.map +1 -1
  334. package/dist/core/entities/session/schema.mjs +2 -0
  335. package/dist/core/entities/session/schema.mjs.map +1 -1
  336. package/dist/core/entities/user/schema.d.ts.map +1 -1
  337. package/dist/core/entities/user/schema.mjs +2 -0
  338. package/dist/core/entities/user/schema.mjs.map +1 -1
  339. package/dist/core/identity/password-recovery/check.mjs +4 -4
  340. package/dist/core/identity/password-recovery/check.mjs.map +1 -1
  341. package/dist/core/identity/registration/check.mjs +2 -2
  342. package/dist/core/identity/registration/check.mjs.map +1 -1
  343. package/dist/core/index.mjs +5 -3
  344. package/dist/core/key/check.mjs +2 -2
  345. package/dist/core/key/check.mjs.map +1 -1
  346. package/dist/core/provisioning/entities/client/relations-validator.d.ts.map +1 -1
  347. package/dist/core/provisioning/entities/client/relations-validator.mjs +2 -0
  348. package/dist/core/provisioning/entities/client/relations-validator.mjs.map +1 -1
  349. package/dist/core/provisioning/entities/client/types.d.ts +8 -0
  350. package/dist/core/provisioning/entities/client/types.d.ts.map +1 -1
  351. package/dist/core/provisioning/synchronizer/client/module.d.ts +3 -1
  352. package/dist/core/provisioning/synchronizer/client/module.d.ts.map +1 -1
  353. package/dist/core/provisioning/synchronizer/client/module.mjs +10 -0
  354. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  355. package/dist/core/provisioning/synchronizer/client/types.d.ts +3 -1
  356. package/dist/core/provisioning/synchronizer/client/types.d.ts.map +1 -1
  357. package/dist/core/provisioning/synchronizer/entity-resolver.d.ts +4 -1
  358. package/dist/core/provisioning/synchronizer/entity-resolver.d.ts.map +1 -1
  359. package/dist/core/provisioning/synchronizer/entity-resolver.mjs +14 -29
  360. package/dist/core/provisioning/synchronizer/entity-resolver.mjs.map +1 -1
  361. package/dist/core/provisioning/synchronizer/index.d.ts +1 -0
  362. package/dist/core/provisioning/synchronizer/index.d.ts.map +1 -1
  363. package/dist/core/provisioning/synchronizer/realm/module.d.ts.map +1 -1
  364. package/dist/core/provisioning/synchronizer/realm/module.mjs +8 -8
  365. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  366. package/dist/core/provisioning/synchronizer/types.d.ts +11 -0
  367. package/dist/core/provisioning/synchronizer/types.d.ts.map +1 -0
  368. package/dist/core/provisioning/synchronizer/types.mjs +4 -0
  369. package/dist/core/query/describe.d.ts +25 -0
  370. package/dist/core/query/describe.d.ts.map +1 -0
  371. package/dist/core/query/describe.mjs +50 -0
  372. package/dist/core/query/describe.mjs.map +1 -0
  373. package/dist/core/query/fields.d.ts +44 -0
  374. package/dist/core/query/fields.d.ts.map +1 -0
  375. package/dist/core/query/fields.mjs +46 -0
  376. package/dist/core/query/fields.mjs.map +1 -0
  377. package/dist/core/query/index.d.ts +1 -0
  378. package/dist/core/query/index.d.ts.map +1 -1
  379. package/dist/core/query/index.mjs +2 -1
  380. package/dist/core/query/module.d.ts +1 -1
  381. package/dist/core/query/module.mjs +1 -1
  382. package/dist/core/query/module.mjs.map +1 -1
  383. package/dist/index.mjs +6 -2
  384. package/dist/swagger.json +852 -145
  385. package/dist/ui/client/.vite/ssr-manifest.json +858 -750
  386. package/dist/ui/client/assets/index-Bk6-OZy9.css +2 -0
  387. package/dist/ui/client/assets/index-DO6_7NTJ.js +106 -0
  388. package/dist/ui/client/index.html +2 -2
  389. package/dist/ui/server/server.js +2472 -6357
  390. package/package.json +40 -40
  391. package/dist/cli/commands/reset.d.ts +0 -2
  392. package/dist/cli/commands/reset.d.ts.map +0 -1
  393. package/dist/cli/commands/reset.mjs +0 -23
  394. package/dist/cli/commands/reset.mjs.map +0 -1
  395. package/dist/components/database/index.d.ts +0 -2
  396. package/dist/components/database/index.d.ts.map +0 -1
  397. package/dist/components/database/index.mjs +0 -7
  398. package/dist/components/database/unique-entries/factory.d.ts +0 -4
  399. package/dist/components/database/unique-entries/factory.d.ts.map +0 -1
  400. package/dist/components/database/unique-entries/factory.mjs +0 -12
  401. package/dist/components/database/unique-entries/factory.mjs.map +0 -1
  402. package/dist/components/database/unique-entries/index.d.ts +0 -3
  403. package/dist/components/database/unique-entries/index.d.ts.map +0 -1
  404. package/dist/components/database/unique-entries/index.mjs +0 -6
  405. package/dist/components/database/unique-entries/module.d.ts +0 -15
  406. package/dist/components/database/unique-entries/module.d.ts.map +0 -1
  407. package/dist/components/database/unique-entries/module.mjs +0 -69
  408. package/dist/components/database/unique-entries/module.mjs.map +0 -1
  409. package/dist/ui/client/assets/index-C05uGFDe.js +0 -131
  410. package/dist/ui/client/assets/index-CiHrf73J.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limit.mjs","names":["rateLimit","merge","useRequestIdentity","registerRateLimitMiddleware","router","input","options","max","event","identity","type","windowMs","use"],"sources":["../../../../../src/adapters/http/middleware/built-in/rate-limit.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OptionsInput } from '@routup/rate-limit';\nimport { rateLimit } from '@routup/rate-limit';\nimport type { App } from 'routup';\nimport { merge } from 'smob';\nimport { useRequestIdentity } from '../../request/index.ts';\n\nexport function registerRateLimitMiddleware(router: App, input?: OptionsInput) {\n let options : OptionsInput = {\n max(event) {\n const identity = useRequestIdentity(event);\n if (!identity) {\n return 60 * 20; // 20 req. p. sec\n }\n\n switch (identity.type) {\n case 'client': {\n return 60 * 5_000; // 1000 req p. sec\n }\n case 'user':\n default: {\n return 60 * 100; // 100 req p. sec\n }\n }\n },\n windowMs: 60 * 1000, // 60 sec\n };\n\n options = merge(input || {}, options);\n\n router.use(rateLimit(options));\n}\n"],"mappings":";;;;;;;;AAaA,SAAgBG,4BAA4BC,QAAaC,OAAoB;CACzE,IAAIC,UAAyB;EACzBC,IAAIC,OAAK;GACL,MAAMC,WAAWP,mBAAmBM,KAAAA;GACpC,IAAI,CAACC,UACD,OAAO;GAGX,QAAQA,SAASC,MAAjB;IACI,KAAK,UACD,OAAO,KAAK;IAGhB,SACI,OAAO;GAEf;EACJ;EACAC,UAAU,KAAK;CACnB;CAEAL,UAAUL,MAAMI,SAAS,CAAC,GAAGC,OAAAA;CAE7BF,OAAOQ,IAAIZ,UAAUM,OAAAA,CAAAA;AACzB"}
1
+ {"version":3,"file":"rate-limit.mjs","names":["rateLimit","getRequestIP","merge","useRequestIdentity","registerRateLimitMiddleware","router","input","options","keyGenerator","event","max","identity","type","windowMs","use"],"sources":["../../../../../src/adapters/http/middleware/built-in/rate-limit.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OptionsInput } from '@routup/rate-limit';\nimport { rateLimit } from '@routup/rate-limit';\nimport type { App } from 'routup';\nimport { getRequestIP } from 'routup';\nimport { merge } from 'smob';\nimport { useRequestIdentity } from '../../request/index.ts';\n\nexport function registerRateLimitMiddleware(router: App, input?: OptionsInput) {\n let options : OptionsInput = {\n // @routup/rate-limit's default keyGenerator hardcodes\n // `{ trustProxy: true }`; deriving the key here instead lets it\n // follow the app-level trust contract (config `trustProxy`).\n keyGenerator: (event) => getRequestIP(event) || '127.0.0.1',\n max(event) {\n const identity = useRequestIdentity(event);\n if (!identity) {\n return 60 * 20; // 20 req. p. sec\n }\n\n switch (identity.type) {\n case 'client': {\n return 60 * 5_000; // 1000 req p. sec\n }\n case 'user':\n default: {\n return 60 * 100; // 100 req p. sec\n }\n }\n },\n windowMs: 60 * 1000, // 60 sec\n };\n\n options = merge(input || {}, options);\n\n router.use(rateLimit(options));\n}\n"],"mappings":";;;;;;;;;AAcA,SAAgBI,4BAA4BC,QAAaC,OAAoB;CACzE,IAAIC,UAAyB;EAIzBC,eAAeC,UAAUR,aAAaQ,KAAAA,KAAU;EAChDC,IAAID,OAAK;GACL,MAAME,WAAWR,mBAAmBM,KAAAA;GACpC,IAAI,CAACE,UACD,OAAO;GAGX,QAAQA,SAASC,MAAjB;IACI,KAAK,UACD,OAAO,KAAK;IAGhB,SACI,OAAO;GAEf;EACJ;EACAC,UAAU,KAAK;CACnB;CAEAN,UAAUL,MAAMI,SAAS,CAAC,GAAGC,OAAAA;CAE7BF,OAAOS,IAAId,UAAUO,OAAAA,CAAAA;AACzB"}
@@ -26,7 +26,7 @@ function useRequestEventContext() {
26
26
  actorName: identity ? identity.data.name ?? null : null,
27
27
  requestPath: event.path,
28
28
  requestMethod: event.method,
29
- requestIpAddress: getRequestIP(event, { trustProxy: true }) ?? null,
29
+ requestIpAddress: getRequestIP(event) ?? null,
30
30
  requestUserAgent: getRequestHeader(event, "user-agent") ?? null
31
31
  }, () => event.next());
32
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"event-context.mjs","names":["AsyncLocalStorage","defineCoreHandler","getRequestHeader","getRequestIP","useRequestIdentity","storage","runWithRequestEventContext","ctx","fn","run","useRequestEventContext","getStore","createRequestEventContextMiddleware","event","identity","actorType","type","actorId","id","actorName","data","name","requestPath","path","requestMethod","method","requestIpAddress","trustProxy","requestUserAgent","next"],"sources":["../../../../src/adapters/http/request/event-context.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { defineCoreHandler, getRequestHeader, getRequestIP } from 'routup';\nimport type { Handler } from 'routup';\nimport type { EventRequestContext } from '../../../core/index.ts';\nimport { useRequestIdentity } from './helpers/index.ts';\n\n/**\n * Actor + request attribution snapshot for entity-CRUD audit rows, carried\n * across the request's async continuation via AsyncLocalStorage so the\n * database subscribers (which have no request handle) can attribute their\n * writes. Writes outside HTTP (provisioning, CLI, cron) have no store —\n * the getter returns undefined, the correct \"system\" semantics.\n */\nexport type RequestEventContext = EventRequestContext;\n\nconst storage = new AsyncLocalStorage<RequestEventContext>();\n\nexport function runWithRequestEventContext<R>(\n ctx: RequestEventContext,\n fn: () => R,\n): R {\n return storage.run(ctx, fn);\n}\n\nexport function useRequestEventContext(): RequestEventContext | undefined {\n return storage.getStore();\n}\n\n/**\n * Builds the {@link RequestEventContext} from the routup event and wraps the\n * downstream pipeline in it. Must be mounted AFTER the authorization\n * middleware — the identity has to be resolved for actor attribution.\n */\nexport function createRequestEventContextMiddleware() : Handler {\n return defineCoreHandler(async (event) => {\n const identity = useRequestIdentity(event);\n\n const ctx : RequestEventContext = {\n actorType: identity ? identity.type : null,\n actorId: identity ? identity.id : null,\n actorName: identity ? identity.data.name ?? null : null,\n requestPath: event.path,\n requestMethod: event.method,\n requestIpAddress: getRequestIP(event, { trustProxy: true }) ?? null,\n requestUserAgent: getRequestHeader(event, 'user-agent') ?? null,\n };\n\n return runWithRequestEventContext(ctx, () => event.next());\n });\n}\n"],"mappings":";;;;;;;;AAsBA,MAAMK,UAAU,IAAIL,kBAAAA;AAEpB,SAAgBM,2BACZC,KACAC,IAAW;CAEX,OAAOH,QAAQI,IAAIF,KAAKC,EAAAA;AAC5B;AAEA,SAAgBE,yBAAAA;CACZ,OAAOL,QAAQM,SAAQ;AAC3B;;;;;GAOA,SAAgBC,sCAAAA;CACZ,OAAOX,kBAAkB,OAAOY,UAAAA;EAC5B,MAAMC,WAAWV,mBAAmBS,KAAAA;EAYpC,OAAOP,2BAA2BC;GAT9BQ,WAAWD,WAAWA,SAASE,OAAO;GACtCC,SAASH,WAAWA,SAASI,KAAK;GAClCC,WAAWL,WAAWA,SAASM,KAAKC,QAAQ,OAAO;GACnDC,aAAaT,MAAMU;GACnBC,eAAeX,MAAMY;GACrBC,kBAAkBvB,aAAaU,OAAO,EAAEc,YAAY,KAAK,CAAA,KAAM;GAC/DC,kBAAkB1B,iBAAiBW,OAAO,YAAA,KAAiB;EAG7BN,SAAWM,MAAMgB,KAAI,CAAA;CAC3D,CAAA;AACJ"}
1
+ {"version":3,"file":"event-context.mjs","names":["AsyncLocalStorage","defineCoreHandler","getRequestHeader","getRequestIP","useRequestIdentity","storage","runWithRequestEventContext","ctx","fn","run","useRequestEventContext","getStore","createRequestEventContextMiddleware","event","identity","actorType","type","actorId","id","actorName","data","name","requestPath","path","requestMethod","method","requestIpAddress","requestUserAgent","next"],"sources":["../../../../src/adapters/http/request/event-context.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { defineCoreHandler, getRequestHeader, getRequestIP } from 'routup';\nimport type { Handler } from 'routup';\nimport type { EventRequestContext } from '../../../core/index.ts';\nimport { useRequestIdentity } from './helpers/index.ts';\n\n/**\n * Actor + request attribution snapshot for entity-CRUD audit rows, carried\n * across the request's async continuation via AsyncLocalStorage so the\n * database subscribers (which have no request handle) can attribute their\n * writes. Writes outside HTTP (provisioning, CLI, cron) have no store —\n * the getter returns undefined, the correct \"system\" semantics.\n */\nexport type RequestEventContext = EventRequestContext;\n\nconst storage = new AsyncLocalStorage<RequestEventContext>();\n\nexport function runWithRequestEventContext<R>(\n ctx: RequestEventContext,\n fn: () => R,\n): R {\n return storage.run(ctx, fn);\n}\n\nexport function useRequestEventContext(): RequestEventContext | undefined {\n return storage.getStore();\n}\n\n/**\n * Builds the {@link RequestEventContext} from the routup event and wraps the\n * downstream pipeline in it. Must be mounted AFTER the authorization\n * middleware — the identity has to be resolved for actor attribution.\n */\nexport function createRequestEventContextMiddleware() : Handler {\n return defineCoreHandler(async (event) => {\n const identity = useRequestIdentity(event);\n\n const ctx : RequestEventContext = {\n actorType: identity ? identity.type : null,\n actorId: identity ? identity.id : null,\n actorName: identity ? identity.data.name ?? null : null,\n requestPath: event.path,\n requestMethod: event.method,\n requestIpAddress: getRequestIP(event) ?? null,\n requestUserAgent: getRequestHeader(event, 'user-agent') ?? null,\n };\n\n return runWithRequestEventContext(ctx, () => event.next());\n });\n}\n"],"mappings":";;;;;;;;AAsBA,MAAMK,UAAU,IAAIL,kBAAAA;AAEpB,SAAgBM,2BACZC,KACAC,IAAW;CAEX,OAAOH,QAAQI,IAAIF,KAAKC,EAAAA;AAC5B;AAEA,SAAgBE,yBAAAA;CACZ,OAAOL,QAAQM,SAAQ;AAC3B;;;;;GAOA,SAAgBC,sCAAAA;CACZ,OAAOX,kBAAkB,OAAOY,UAAAA;EAC5B,MAAMC,WAAWV,mBAAmBS,KAAAA;EAYpC,OAAOP,2BAA2BC;GAT9BQ,WAAWD,WAAWA,SAASE,OAAO;GACtCC,SAASH,WAAWA,SAASI,KAAK;GAClCC,WAAWL,WAAWA,SAASM,KAAKC,QAAQ,OAAO;GACnDC,aAAaT,MAAMU;GACnBC,eAAeX,MAAMY;GACrBC,kBAAkBvB,aAAaU,KAAAA,KAAU;GACzCc,kBAAkBzB,iBAAiBW,OAAO,YAAA,KAAiB;EAG7BN,SAAWM,MAAMe,KAAI,CAAA;CAC3D,CAAA;AACJ"}
@@ -1,2 +1,3 @@
1
- export declare function createApplication(): import("orkos").IApplication;
1
+ import type { CreateApplicationContext } from './types.ts';
2
+ export declare function createApplication(context?: CreateApplicationContext): import("orkos").IApplication;
2
3
  //# sourceMappingURL=factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/app/factory.ts"],"names":[],"mappings":"AAaA,wBAAgB,iBAAiB,iCAkBhC"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/app/factory.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,gCAkBvE"}
@@ -6,8 +6,8 @@ import { ProvisionerModule } from "./modules/provisioning/module.mjs";
6
6
  import "./modules/index.mjs";
7
7
  import { ApplicationBuilder } from "./builder.mjs";
8
8
  //#region src/app/factory.ts
9
- function createApplication() {
10
- return new ApplicationBuilder().withConfig().withLogger().withCache().withMail().withRuntime().withDatabase().withProvisioning(new ProvisionerModule([new DefaultProvisioningSource()])).withLdap().withAuthentication().withIdentity().withOAuth2().withComponents().withHTTP().build();
9
+ function createApplication(context = {}) {
10
+ return new ApplicationBuilder().withConfig(context.config).withLogger().withCache().withMail().withRuntime().withDatabase().withProvisioning(new ProvisionerModule([new DefaultProvisioningSource()])).withLdap().withAuthentication().withIdentity().withOAuth2().withComponents().withHTTP().build();
11
11
  }
12
12
  //#endregion
13
13
  export { createApplication };
@@ -1 +1 @@
1
- {"version":3,"file":"factory.mjs","names":["ApplicationBuilder","DefaultProvisioningSource","ProvisionerModule","createApplication","withConfig","withLogger","withCache","withMail","withRuntime","withDatabase","withProvisioning","withLdap","withAuthentication","withIdentity","withOAuth2","withComponents","withHTTP","build"],"sources":["../../src/app/factory.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ApplicationBuilder } from './builder.ts';\nimport {\n DefaultProvisioningSource,\n ProvisionerModule,\n} from './modules/index.ts';\n\nexport function createApplication() {\n return new ApplicationBuilder()\n .withConfig()\n .withLogger()\n .withCache()\n .withMail()\n .withRuntime()\n .withDatabase()\n .withProvisioning(new ProvisionerModule([\n new DefaultProvisioningSource(),\n ]))\n .withLdap()\n .withAuthentication()\n .withIdentity()\n .withOAuth2()\n .withComponents()\n .withHTTP()\n .build();\n}\n"],"mappings":";;;;;;;;AAaA,SAAgBG,oBAAAA;CACZ,OAAO,IAAIH,mBAAAA,CAAAA,CACNI,WAAU,CAAA,CACVC,WAAU,CAAA,CACVC,UAAS,CAAA,CACTC,SAAQ,CAAA,CACRC,YAAW,CAAA,CACXC,aAAY,CAAA,CACZC,iBAAiB,IAAIR,kBAAkB,CACpC,IAAID,0BAAAA,CACP,CAAA,CAAA,CAAA,CACAU,SAAQ,CAAA,CACRC,mBAAkB,CAAA,CAClBC,aAAY,CAAA,CACZC,WAAU,CAAA,CACVC,eAAc,CAAA,CACdC,SAAQ,CAAA,CACRC,MAAK;AACd"}
1
+ {"version":3,"file":"factory.mjs","names":["ApplicationBuilder","DefaultProvisioningSource","ProvisionerModule","createApplication","context","withConfig","config","withLogger","withCache","withMail","withRuntime","withDatabase","withProvisioning","withLdap","withAuthentication","withIdentity","withOAuth2","withComponents","withHTTP","build"],"sources":["../../src/app/factory.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { ApplicationBuilder } from './builder.ts';\nimport {\n DefaultProvisioningSource,\n ProvisionerModule,\n} from './modules/index.ts';\nimport type { CreateApplicationContext } from './types.ts';\n\nexport function createApplication(context: CreateApplicationContext = {}) {\n return new ApplicationBuilder()\n .withConfig(context.config)\n .withLogger()\n .withCache()\n .withMail()\n .withRuntime()\n .withDatabase()\n .withProvisioning(new ProvisionerModule([\n new DefaultProvisioningSource(),\n ]))\n .withLdap()\n .withAuthentication()\n .withIdentity()\n .withOAuth2()\n .withComponents()\n .withHTTP()\n .build();\n}\n"],"mappings":";;;;;;;;AAcA,SAAgBG,kBAAkBC,UAAoC,CAAC,GAAC;CACpE,OAAO,IAAIJ,mBAAAA,CAAAA,CACNK,WAAWD,QAAQE,MAAM,CAAA,CACzBC,WAAU,CAAA,CACVC,UAAS,CAAA,CACTC,SAAQ,CAAA,CACRC,YAAW,CAAA,CACXC,aAAY,CAAA,CACZC,iBAAiB,IAAIV,kBAAkB,CACpC,IAAID,0BAAAA,CACP,CAAA,CAAA,CAAA,CACAY,SAAQ,CAAA,CACRC,mBAAkB,CAAA,CAClBC,aAAY,CAAA,CACZC,WAAU,CAAA,CACVC,eAAc,CAAA,CACdC,SAAQ,CAAA,CACRC,MAAK;AACd"}
@@ -1,4 +1,5 @@
1
1
  export * from './builder.ts';
2
2
  export * from './factory.ts';
3
3
  export * from './modules/index.ts';
4
+ export * from './types.ts';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAOA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAOA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
@@ -6,6 +6,10 @@ import { CacheInjectionKey } from "./modules/cache/constants.mjs";
6
6
  import { ModuleName } from "./modules/constants.mjs";
7
7
  import { ConfigEnvironmentVariableName, ConfigInjectionKey } from "./modules/config/constants.mjs";
8
8
  import { expandToOrigins, getAppOrigins } from "./modules/config/origins.mjs";
9
+ import { readConfigRawFromEnv } from "./modules/config/read/env.mjs";
10
+ import { readConfigRawFromFS } from "./modules/config/read/fs.mjs";
11
+ import { readConfigRaw } from "./modules/config/read/module.mjs";
12
+ import { readConfig } from "./modules/config/helpers.mjs";
9
13
  import { ConfigModule } from "./modules/config/module.mjs";
10
14
  import { CacheModule } from "./modules/cache/module.mjs";
11
15
  import { SessionRepository } from "./modules/authentication/repositories/session.mjs";
@@ -64,4 +68,4 @@ import { RuntimeModule } from "./modules/runtime/module.mjs";
64
68
  import "./modules/index.mjs";
65
69
  import { ApplicationBuilder } from "./builder.mjs";
66
70
  import { createApplication } from "./factory.mjs";
67
- export { ApplicationBuilder, AuthenticationInjectionKey, AuthenticationModule, CacheInjectionKey, CacheModule, ClientIdentityRepository, ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, ComponentsModule, CompositeProvisioningSource, ConfigEnvironmentVariableName, ConfigInjectionKey, ConfigModule, DatabaseInjectionKey, DatabaseModule, DefaultProvisioningSource, EventRepositoryAdapter, FileProvisioningSource, HTTPInjectionKey, HTTPModule, IdentityInjectionKey, IdentityModule, IdentityProviderAccountRepository, IdentityProviderAttributeMappingRepository, IdentityProviderPermissionMappingRepository, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepository, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, LDAPInjectionKey, LdapModule, LoggerInjectionKey, LoggerModule, MailInjectionKey, MailModule, MailTemplateRendererInjectionKey, MetricsInjectionKey, ModuleName, OAuth2InjectionToken, OAuth2Module, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, PromAuthFlowMetrics, ProvisionerModule, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, RuntimeModule, ScopeRepositoryAdapter, SessionRepository, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserIdentityRepository, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter, createApplication, expandToOrigins, getAppOrigins };
71
+ export { ApplicationBuilder, AuthenticationInjectionKey, AuthenticationModule, CacheInjectionKey, CacheModule, ClientIdentityRepository, ClientPermissionRepositoryAdapter, ClientRepositoryAdapter, ClientRoleRepositoryAdapter, ClientScopeRepositoryAdapter, ComponentsModule, CompositeProvisioningSource, ConfigEnvironmentVariableName, ConfigInjectionKey, ConfigModule, DatabaseInjectionKey, DatabaseModule, DefaultProvisioningSource, EventRepositoryAdapter, FileProvisioningSource, HTTPInjectionKey, HTTPModule, IdentityInjectionKey, IdentityModule, IdentityProviderAccountRepository, IdentityProviderAttributeMappingRepository, IdentityProviderPermissionMappingRepository, IdentityProviderRepositoryAdapter, IdentityProviderRoleMappingRepository, IdentityProviderRoleMappingRepositoryAdapter, KeyRepositoryAdapter, LDAPInjectionKey, LdapModule, LoggerInjectionKey, LoggerModule, MailInjectionKey, MailModule, MailTemplateRendererInjectionKey, MetricsInjectionKey, ModuleName, OAuth2InjectionToken, OAuth2Module, PermissionDatabaseProvider, PermissionPolicyRepositoryAdapter, PermissionRepositoryAdapter, PolicyRepositoryAdapter, PromAuthFlowMetrics, ProvisionerModule, RealmRepositoryAdapter, RoleAttributeRepositoryAdapter, RolePermissionRepositoryAdapter, RoleRepositoryAdapter, RuntimeModule, ScopeRepositoryAdapter, SessionRepository, TrustAnchorRepositoryAdapter, UserAttributeRepositoryAdapter, UserAuthenticatorRepositoryAdapter, UserIdentityRepository, UserPermissionRepositoryAdapter, UserRepositoryAdapter, UserRoleRepositoryAdapter, createApplication, expandToOrigins, getAppOrigins, readConfig, readConfigRaw, readConfigRawFromEnv, readConfigRawFromFS };
@@ -1,7 +1,7 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
- import { applyQuery } from "../../database/repositories/query.mjs";
4
+ import { applyQuery, redactFieldConditions } from "../../database/repositories/query.mjs";
5
5
  import { applyRealmScopeSelect } from "../../database/repositories/helpers.mjs";
6
6
  import { AuthenticationCachePrefix } from "./constants.mjs";
7
7
  import { buildCacheKey } from "@authup/server-kit";
@@ -31,7 +31,7 @@ var SessionRepository = class {
31
31
  });
32
32
  const [entities, total] = await qb.getManyAndCount();
33
33
  return {
34
- data: entities,
34
+ data: redactFieldConditions(query, entities),
35
35
  meta: {
36
36
  total,
37
37
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"session.mjs","names":["buildCacheKey","applyQuery","applyRealmScopeSelect","AuthenticationCachePrefix","SessionRepository","cache","repository","ctx","findOneById","id","session","get","prefix","SESSION","key","findOneBy","findMany","query","options","qb","createQueryBuilder","pagination","owner","andWhere","ownerSub","sub","ownerSubKind","subKind","entities","total","getManyAndCount","data","meta","findAllByOwner","where","getMany","findAllByQuery","save","input","create","set","ttl","Date","expiresAt","getTime","now","remove","drop","removeById"],"sources":["../../../../../src/app/modules/authentication/repositories/session.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Session } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { EntityRepositoryFindManyResult, ICache } from '@authup/server-kit';\nimport { buildCacheKey } from '@authup/server-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery } from '../../database/repositories/query.ts';\nimport type {\n ISessionRepository,\n SessionFindManyOptions,\n SessionOwner,\n} from '../../../../core/index.ts';\nimport { applyRealmScopeSelect } from '../../database/repositories/helpers.ts';\nimport { AuthenticationCachePrefix } from './constants.ts';\n\ntype SessionRepositoryContext = {\n repository: Repository<Session>,\n cache: ICache\n};\n\nexport class SessionRepository implements ISessionRepository {\n protected cache : ICache;\n\n protected repository : Repository<Session>;\n\n // -----------------------------------------------------\n\n constructor(ctx: SessionRepositoryContext) {\n this.cache = ctx.cache;\n this.repository = ctx.repository;\n }\n\n // -----------------------------------------------------\n\n async findOneById(id: string): Promise<Session | null> {\n const session = await this.cache.get<Session>(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: id, \n }),\n );\n\n if (session) {\n return session;\n }\n\n return this.repository.findOneBy({ id });\n }\n\n // -----------------------------------------------------\n\n async findMany(\n query: IQuery,\n options: SessionFindManyOptions = {},\n ): Promise<EntityRepositoryFindManyResult<Session>> {\n const qb = this.repository.createQueryBuilder('session');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'session', ['sub', 'subKind']);\n\n if (options.owner) {\n // mandatory constraint — not overridable by a rapiq filter\n qb.andWhere('session.sub = :ownerSub AND session.subKind = :ownerSubKind', {\n ownerSub: options.owner.sub,\n ownerSubKind: options.owner.subKind,\n });\n }\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findAllByOwner(owner: SessionOwner): Promise<Session[]> {\n return this.repository.createQueryBuilder('session')\n .where('session.sub = :sub AND session.subKind = :subKind', {\n sub: owner.sub,\n subKind: owner.subKind,\n })\n .getMany();\n }\n\n async findAllByQuery(query: IQuery): Promise<Session[]> {\n const qb = this.repository.createQueryBuilder('session');\n\n // NOTE: `parameters: ['filters']` — a bulk revoke must reach every\n // matching row. Applying the schema's `pagination.maxLimit` would\n // default the limit to that cap when the caller sends no page (rapiq\n // `finalizePagination`), silently truncating the delete.\n applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'session', ['sub', 'subKind']);\n\n return qb.getMany();\n }\n\n // -----------------------------------------------------\n\n async save(input: Partial<Session>): Promise<Session> {\n const session = this.repository.create(input);\n await this.repository.save(session);\n\n await this.cache.set(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: session.id, \n }),\n session,\n { ttl: new Date(session.expiresAt).getTime() - Date.now() },\n );\n\n return session;\n }\n\n // -----------------------------------------------------\n\n async remove(session: Session): Promise<void> {\n await this.repository.remove(session);\n await this.cache.drop(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: session.id, \n }),\n );\n }\n\n async removeById(id: string): Promise<void> {\n const session = await this.findOneById(id);\n\n if (session) {\n await this.remove(session);\n }\n }\n}\n"],"mappings":";;;;;;;;AA0BA,IAAaI,oBAAb,MAAaA;CACCC;CAEAC;CAIV,YAAYC,KAA+B;EACvC,KAAKF,QAAQE,IAAIF;EACjB,KAAKC,aAAaC,IAAID;CAC1B;CAIA,MAAME,YAAYC,IAAqC;EACnD,MAAMC,UAAU,MAAM,KAAKL,MAAMM,IAC7BX,cAAc;GACVY,QAAQT,0BAA0BU;GAClCC,KAAKL;EACT,CAAA,CAAA;EAGJ,IAAIC,SACA,OAAOA;EAGX,OAAO,KAAKJ,WAAWS,UAAU,EAAEN,GAAG,CAAA;CAC1C;CAIA,MAAMO,SACFC,OACAC,UAAkC,CAAC,GACa;EAChD,MAAMC,KAAK,KAAKb,WAAWc,mBAAmB,SAAA;EAE9C,MAAM,EAAEC,eAAepB,WAAWkB,IAAIF,KAAAA;EAEtCf,sBAAsBiB,IAAI,WAAW,CAAC,OAAO,SAAU,CAAA;EAEvD,IAAID,QAAQI,OAERH,GAAGI,SAAS,+DAA+D;GACvEC,UAAUN,QAAQI,MAAMG;GACxBC,cAAcR,QAAQI,MAAMK;EAChC,CAAA;EAGJ,MAAM,CAACC,UAAUC,SAAS,MAAMV,GAAGW,gBAAe;EAElD,OAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGR;GACP;EACJ;CACJ;CAEA,MAAMY,eAAeX,OAAyC;EAC1D,OAAO,KAAKhB,WAAWc,mBAAmB,SAAA,CAAA,CACrCc,MAAM,qDAAqD;GACxDT,KAAKH,MAAMG;GACXE,SAASL,MAAMK;EACnB,CAAA,CAAA,CACCQ,QAAO;CAChB;CAEA,MAAMC,eAAenB,OAAmC;EACpD,MAAME,KAAK,KAAKb,WAAWc,mBAAmB,SAAA;EAM9CnB,WAAWkB,IAAIF,KAAAA;EAEff,sBAAsBiB,IAAI,WAAW,CAAC,OAAO,SAAU,CAAA;EAEvD,OAAOA,GAAGgB,QAAO;CACrB;CAIA,MAAME,KAAKC,OAA2C;EAClD,MAAM5B,UAAU,KAAKJ,WAAWiC,OAAOD,KAAAA;EACvC,MAAM,KAAKhC,WAAW+B,KAAK3B,OAAAA;EAE3B,MAAM,KAAKL,MAAMmC,IACbxC,cAAc;GACVY,QAAQT,0BAA0BU;GAClCC,KAAKJ,QAAQD;EACjB,CAAA,GACAC,SACA,EAAE+B,KAAK,IAAIC,KAAKhC,QAAQiC,SAAS,CAAA,CAAEC,QAAO,IAAKF,KAAKG,IAAG,EAAG,CAAA;EAG9D,OAAOnC;CACX;CAIA,MAAMoC,OAAOpC,SAAiC;EAC1C,MAAM,KAAKJ,WAAWwC,OAAOpC,OAAAA;EAC7B,MAAM,KAAKL,MAAM0C,KACb/C,cAAc;GACVY,QAAQT,0BAA0BU;GAClCC,KAAKJ,QAAQD;EACjB,CAAA,CAAA;CAER;CAEA,MAAMuC,WAAWvC,IAA2B;EACxC,MAAMC,UAAU,MAAM,KAAKF,YAAYC,EAAAA;EAEvC,IAAIC,SACA,MAAM,KAAKoC,OAAOpC,OAAAA;CAE1B;AACJ"}
1
+ {"version":3,"file":"session.mjs","names":["buildCacheKey","applyQuery","redactFieldConditions","applyRealmScopeSelect","AuthenticationCachePrefix","SessionRepository","cache","repository","ctx","findOneById","id","session","get","prefix","SESSION","key","findOneBy","findMany","query","options","qb","createQueryBuilder","pagination","owner","andWhere","ownerSub","sub","ownerSubKind","subKind","entities","total","getManyAndCount","data","meta","findAllByOwner","where","getMany","findAllByQuery","save","input","create","set","ttl","Date","expiresAt","getTime","now","remove","drop","removeById"],"sources":["../../../../../src/app/modules/authentication/repositories/session.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Session } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { EntityRepositoryFindManyResult, ICache } from '@authup/server-kit';\nimport { buildCacheKey } from '@authup/server-kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, redactFieldConditions } from '../../database/repositories/query.ts';\nimport type {\n ISessionRepository,\n SessionFindManyOptions,\n SessionOwner,\n} from '../../../../core/index.ts';\nimport { applyRealmScopeSelect } from '../../database/repositories/helpers.ts';\nimport { AuthenticationCachePrefix } from './constants.ts';\n\ntype SessionRepositoryContext = {\n repository: Repository<Session>,\n cache: ICache\n};\n\nexport class SessionRepository implements ISessionRepository {\n protected cache : ICache;\n\n protected repository : Repository<Session>;\n\n // -----------------------------------------------------\n\n constructor(ctx: SessionRepositoryContext) {\n this.cache = ctx.cache;\n this.repository = ctx.repository;\n }\n\n // -----------------------------------------------------\n\n async findOneById(id: string): Promise<Session | null> {\n const session = await this.cache.get<Session>(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: id, \n }),\n );\n\n if (session) {\n return session;\n }\n\n return this.repository.findOneBy({ id });\n }\n\n // -----------------------------------------------------\n\n async findMany(\n query: IQuery,\n options: SessionFindManyOptions = {},\n ): Promise<EntityRepositoryFindManyResult<Session>> {\n const qb = this.repository.createQueryBuilder('session');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'session', ['sub', 'subKind']);\n\n if (options.owner) {\n // mandatory constraint — not overridable by a rapiq filter\n qb.andWhere('session.sub = :ownerSub AND session.subKind = :ownerSubKind', {\n ownerSub: options.owner.sub,\n ownerSubKind: options.owner.subKind,\n });\n }\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findAllByOwner(owner: SessionOwner): Promise<Session[]> {\n return this.repository.createQueryBuilder('session')\n .where('session.sub = :sub AND session.subKind = :subKind', {\n sub: owner.sub,\n subKind: owner.subKind,\n })\n .getMany();\n }\n\n async findAllByQuery(query: IQuery): Promise<Session[]> {\n const qb = this.repository.createQueryBuilder('session');\n\n // NOTE: `parameters: ['filters']` — a bulk revoke must reach every\n // matching row. Applying the schema's `pagination.maxLimit` would\n // default the limit to that cap when the caller sends no page (rapiq\n // `finalizePagination`), silently truncating the delete.\n applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'session', ['sub', 'subKind']);\n\n return qb.getMany();\n }\n\n // -----------------------------------------------------\n\n async save(input: Partial<Session>): Promise<Session> {\n const session = this.repository.create(input);\n await this.repository.save(session);\n\n await this.cache.set(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: session.id, \n }),\n session,\n { ttl: new Date(session.expiresAt).getTime() - Date.now() },\n );\n\n return session;\n }\n\n // -----------------------------------------------------\n\n async remove(session: Session): Promise<void> {\n await this.repository.remove(session);\n await this.cache.drop(\n buildCacheKey({\n prefix: AuthenticationCachePrefix.SESSION,\n key: session.id, \n }),\n );\n }\n\n async removeById(id: string): Promise<void> {\n const session = await this.findOneById(id);\n\n if (session) {\n await this.remove(session);\n }\n }\n}\n"],"mappings":";;;;;;;;AA0BA,IAAaK,oBAAb,MAAaA;CACCC;CAEAC;CAIV,YAAYC,KAA+B;EACvC,KAAKF,QAAQE,IAAIF;EACjB,KAAKC,aAAaC,IAAID;CAC1B;CAIA,MAAME,YAAYC,IAAqC;EACnD,MAAMC,UAAU,MAAM,KAAKL,MAAMM,IAC7BZ,cAAc;GACVa,QAAQT,0BAA0BU;GAClCC,KAAKL;EACT,CAAA,CAAA;EAGJ,IAAIC,SACA,OAAOA;EAGX,OAAO,KAAKJ,WAAWS,UAAU,EAAEN,GAAG,CAAA;CAC1C;CAIA,MAAMO,SACFC,OACAC,UAAkC,CAAC,GACa;EAChD,MAAMC,KAAK,KAAKb,WAAWc,mBAAmB,SAAA;EAE9C,MAAM,EAAEC,eAAerB,WAAWmB,IAAIF,KAAAA;EAEtCf,sBAAsBiB,IAAI,WAAW,CAAC,OAAO,SAAU,CAAA;EAEvD,IAAID,QAAQI,OAERH,GAAGI,SAAS,+DAA+D;GACvEC,UAAUN,QAAQI,MAAMG;GACxBC,cAAcR,QAAQI,MAAMK;EAChC,CAAA;EAGJ,MAAM,CAACC,UAAUC,SAAS,MAAMV,GAAGW,gBAAe;EAElD,OAAO;GACHC,MAAM9B,sBAAsBgB,OAAOW,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGR;GACP;EACJ;CACJ;CAEA,MAAMY,eAAeX,OAAyC;EAC1D,OAAO,KAAKhB,WAAWc,mBAAmB,SAAA,CAAA,CACrCc,MAAM,qDAAqD;GACxDT,KAAKH,MAAMG;GACXE,SAASL,MAAMK;EACnB,CAAA,CAAA,CACCQ,QAAO;CAChB;CAEA,MAAMC,eAAenB,OAAmC;EACpD,MAAME,KAAK,KAAKb,WAAWc,mBAAmB,SAAA;EAM9CpB,WAAWmB,IAAIF,KAAAA;EAEff,sBAAsBiB,IAAI,WAAW,CAAC,OAAO,SAAU,CAAA;EAEvD,OAAOA,GAAGgB,QAAO;CACrB;CAIA,MAAME,KAAKC,OAA2C;EAClD,MAAM5B,UAAU,KAAKJ,WAAWiC,OAAOD,KAAAA;EACvC,MAAM,KAAKhC,WAAW+B,KAAK3B,OAAAA;EAE3B,MAAM,KAAKL,MAAMmC,IACbzC,cAAc;GACVa,QAAQT,0BAA0BU;GAClCC,KAAKJ,QAAQD;EACjB,CAAA,GACAC,SACA,EAAE+B,KAAK,IAAIC,KAAKhC,QAAQiC,SAAS,CAAA,CAAEC,QAAO,IAAKF,KAAKG,IAAG,EAAG,CAAA;EAG9D,OAAOnC;CACX;CAIA,MAAMoC,OAAOpC,SAAiC;EAC1C,MAAM,KAAKJ,WAAWwC,OAAOpC,OAAAA;EAC7B,MAAM,KAAKL,MAAM0C,KACbhD,cAAc;GACVa,QAAQT,0BAA0BU;GAClCC,KAAKJ,QAAQD;EACjB,CAAA,CAAA;CAER;CAEA,MAAMuC,WAAWvC,IAA2B;EACxC,MAAMC,UAAU,MAAM,KAAKF,YAAYC,EAAAA;EAEvC,IAAIC,SACA,MAAM,KAAKoC,OAAOpC,OAAAA;CAE1B;AACJ"}
@@ -1,9 +1,12 @@
1
+ import type { Component } from '../../../components/index.ts';
1
2
  import type { IModule } from 'orkos';
2
3
  import type { IContainer } from 'eldin';
3
4
  export declare class ComponentsModule implements IModule {
4
5
  readonly name: string;
5
6
  readonly dependencies: string[];
7
+ protected components: Component[];
6
8
  constructor();
7
9
  setup(container: IContainer): Promise<void>;
10
+ teardown(container: IContainer): Promise<void>;
8
11
  }
9
12
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/components/module.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,qBAAa,gBAAiB,YAAW,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;;IAO1B,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BpD"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/components/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAQ9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,qBAAa,gBAAiB,YAAW,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAEhC,SAAS,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;;IAQ5B,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B3C,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBvD"}
@@ -4,7 +4,6 @@ import.meta.url;
4
4
  import { ModuleName } from "../constants.mjs";
5
5
  import { ConfigInjectionKey } from "../config/constants.mjs";
6
6
  import "../config/index.mjs";
7
- import { createDatabaseUniqueEntriesComponent } from "../../../components/database/unique-entries/factory.mjs";
8
7
  import { createEventCleanerComponent } from "../../../components/event-cleaner/module.mjs";
9
8
  import { createOAuth2CleanerComponent } from "../../../components/oauth2-cleaner/module.mjs";
10
9
  import "../../../components/index.mjs";
@@ -16,6 +15,7 @@ import "../database/index.mjs";
16
15
  var ComponentsModule = class {
17
16
  name;
18
17
  dependencies;
18
+ components;
19
19
  constructor() {
20
20
  this.name = ModuleName.COMPONENTS;
21
21
  this.dependencies = [
@@ -23,15 +23,17 @@ var ComponentsModule = class {
23
23
  ModuleName.LOGGER,
24
24
  ModuleName.DATABASE
25
25
  ];
26
+ this.components = [];
26
27
  }
27
28
  async setup(container) {
28
29
  const config = container.resolve(ConfigInjectionKey);
29
30
  const dataSource = container.resolve(DatabaseInjectionKey.DataSource);
30
31
  const logger = container.resolve(LoggerInjectionKey);
31
- const components = [createOAuth2CleanerComponent(dataSource, logger), createDatabaseUniqueEntriesComponent(dataSource)];
32
+ const components = [createOAuth2CleanerComponent(dataSource, logger)];
32
33
  const securitySweep = config.eventLogRetentionDays > 0;
33
34
  const entitySweep = config.eventLogEntityEnabled && config.eventLogEntityRetentionDays > 0;
34
35
  if (config.eventLogEnabled && (securitySweep || entitySweep)) components.push(createEventCleanerComponent(dataSource, logger));
36
+ this.components = components;
35
37
  components.forEach((component) => {
36
38
  component.start().catch((e) => {
37
39
  logger.error("Starting a background component failed.");
@@ -39,6 +41,19 @@ var ComponentsModule = class {
39
41
  });
40
42
  });
41
43
  }
44
+ async teardown(container) {
45
+ const logger = container.tryResolve(LoggerInjectionKey);
46
+ const { components } = this;
47
+ this.components = [];
48
+ for (const component of components) try {
49
+ await component.stop();
50
+ } catch (e) {
51
+ if (logger.success) {
52
+ logger.data.warn("Stopping a background component failed.");
53
+ logger.data.warn(e);
54
+ }
55
+ }
56
+ }
42
57
  };
43
58
  //#endregion
44
59
  export { ComponentsModule };
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["createDatabaseUniqueEntriesComponent","createEventCleanerComponent","createOAuth2CleanerComponent","ConfigInjectionKey","DatabaseInjectionKey","LoggerInjectionKey","ModuleName","ComponentsModule","name","dependencies","COMPONENTS","CONFIG","LOGGER","DATABASE","setup","container","config","resolve","dataSource","DataSource","logger","components","securitySweep","eventLogRetentionDays","entitySweep","eventLogEntityEnabled","eventLogEntityRetentionDays","eventLogEnabled","push","forEach","component","start","catch","e","error"],"sources":["../../../../src/app/modules/components/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Component } from '../../../components/index.ts';\nimport {\n createDatabaseUniqueEntriesComponent,\n createEventCleanerComponent,\n createOAuth2CleanerComponent,\n} from '../../../components/index.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport { DatabaseInjectionKey } from '../database/index.ts';\nimport { LoggerInjectionKey } from '../logger/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport type { IContainer } from 'eldin';\n\nexport class ComponentsModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n constructor() {\n this.name = ModuleName.COMPONENTS;\n this.dependencies = [ModuleName.CONFIG, ModuleName.LOGGER, ModuleName.DATABASE];\n }\n\n async setup(container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const logger = container.resolve(LoggerInjectionKey);\n\n const components: Component[] = [\n createOAuth2CleanerComponent(dataSource, logger),\n createDatabaseUniqueEntriesComponent(dataSource),\n ];\n\n // The sweep only exists when rows are written AND at least one row\n // family carries an expiry — security events (eventLogRetentionDays)\n // and entity-CRUD events (eventLogEntityRetentionDays) are stamped\n // independently, so either non-zero retention needs the cleaner.\n const securitySweep = config.eventLogRetentionDays > 0;\n const entitySweep = config.eventLogEntityEnabled && config.eventLogEntityRetentionDays > 0;\n if (config.eventLogEnabled && (securitySweep || entitySweep)) {\n components.push(createEventCleanerComponent(dataSource, logger));\n }\n\n // start() is deliberately fire-and-forget, so a rejection must be\n // caught here — an unhandled rejection is fatal on modern node.\n components.forEach((component) => {\n component.start().catch((e) => {\n logger.error('Starting a background component failed.');\n logger.error(e);\n });\n });\n }\n\n // ----------------------------------------------------\n}\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,IAAaO,mBAAb,MAAaA;CACAC;CAEAC;CAET,cAAc;EACV,KAAKD,OAAOF,WAAWI;EACvB,KAAKD,eAAe;GAACH,WAAWK;GAAQL,WAAWM;GAAQN,WAAWO;EAAS;CACnF;CAEA,MAAMC,MAAMC,WAAsC;EAC9C,MAAMC,SAASD,UAAUE,QAAQd,kBAAAA;EACjC,MAAMe,aAAaH,UAAUE,QAAQb,qBAAqBe,UAAU;EACpE,MAAMC,SAASL,UAAUE,QAAQZ,kBAAAA;EAEjC,MAAMgB,aAA0B,CAC5BnB,6BAA6BgB,YAAYE,MAAAA,GACzCpB,qCAAqCkB,UAAAA,CACxC;EAMD,MAAMI,gBAAgBN,OAAOO,wBAAwB;EACrD,MAAMC,cAAcR,OAAOS,yBAAyBT,OAAOU,8BAA8B;EACzF,IAAIV,OAAOW,oBAAoBL,iBAAiBE,cAC5CH,WAAWO,KAAK3B,4BAA4BiB,YAAYE,MAAAA,CAAAA;EAK5DC,WAAWQ,SAASC,cAAAA;GAChBA,UAAUC,MAAK,CAAA,CAAGC,OAAOC,MAAAA;IACrBb,OAAOc,MAAM,yCAAA;IACbd,OAAOc,MAAMD,CAAAA;GACjB,CAAA;EACJ,CAAA;CACJ;AAGJ"}
1
+ {"version":3,"file":"module.mjs","names":["createEventCleanerComponent","createOAuth2CleanerComponent","ConfigInjectionKey","DatabaseInjectionKey","LoggerInjectionKey","ModuleName","ComponentsModule","name","dependencies","components","COMPONENTS","CONFIG","LOGGER","DATABASE","setup","container","config","resolve","dataSource","DataSource","logger","securitySweep","eventLogRetentionDays","entitySweep","eventLogEntityEnabled","eventLogEntityRetentionDays","eventLogEnabled","push","forEach","component","start","catch","e","error","teardown","tryResolve","stop","success","data","warn"],"sources":["../../../../src/app/modules/components/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Component } from '../../../components/index.ts';\nimport {\n createEventCleanerComponent,\n createOAuth2CleanerComponent,\n} from '../../../components/index.ts';\nimport { ConfigInjectionKey } from '../config/index.ts';\nimport { DatabaseInjectionKey } from '../database/index.ts';\nimport { LoggerInjectionKey } from '../logger/index.ts';\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport type { IContainer } from 'eldin';\n\nexport class ComponentsModule implements IModule {\n readonly name: string;\n\n readonly dependencies: string[];\n\n protected components: Component[];\n\n constructor() {\n this.name = ModuleName.COMPONENTS;\n this.dependencies = [ModuleName.CONFIG, ModuleName.LOGGER, ModuleName.DATABASE];\n this.components = [];\n }\n\n async setup(container: IContainer): Promise<void> {\n const config = container.resolve(ConfigInjectionKey);\n const dataSource = container.resolve(DatabaseInjectionKey.DataSource);\n const logger = container.resolve(LoggerInjectionKey);\n\n const components: Component[] = [\n createOAuth2CleanerComponent(dataSource, logger),\n ];\n\n // The sweep only exists when rows are written AND at least one row\n // family carries an expiry — security events (eventLogRetentionDays)\n // and entity-CRUD events (eventLogEntityRetentionDays) are stamped\n // independently, so either non-zero retention needs the cleaner.\n const securitySweep = config.eventLogRetentionDays > 0;\n const entitySweep = config.eventLogEntityEnabled && config.eventLogEntityRetentionDays > 0;\n if (config.eventLogEnabled && (securitySweep || entitySweep)) {\n components.push(createEventCleanerComponent(dataSource, logger));\n }\n\n this.components = components;\n\n // start() is deliberately fire-and-forget, so a rejection must be\n // caught here — an unhandled rejection is fatal on modern node.\n components.forEach((component) => {\n component.start().catch((e) => {\n logger.error('Starting a background component failed.');\n logger.error(e);\n });\n });\n }\n\n async teardown(container: IContainer): Promise<void> {\n const logger = container.tryResolve(LoggerInjectionKey);\n\n const { components } = this;\n this.components = [];\n\n for (const component of components) {\n try {\n await component.stop();\n } catch (e) {\n if (logger.success) {\n logger.data.warn('Stopping a background component failed.');\n logger.data.warn(e);\n }\n }\n }\n }\n\n // ----------------------------------------------------\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,IAAaM,mBAAb,MAAaA;CACAC;CAEAC;CAECC;CAEV,cAAc;EACV,KAAKF,OAAOF,WAAWK;EACvB,KAAKF,eAAe;GAACH,WAAWM;GAAQN,WAAWO;GAAQP,WAAWQ;EAAS;EAC/E,KAAKJ,aAAa,CAAA;CACtB;CAEA,MAAMK,MAAMC,WAAsC;EAC9C,MAAMC,SAASD,UAAUE,QAAQf,kBAAAA;EACjC,MAAMgB,aAAaH,UAAUE,QAAQd,qBAAqBgB,UAAU;EACpE,MAAMC,SAASL,UAAUE,QAAQb,kBAAAA;EAEjC,MAAMK,aAA0B,CAC5BR,6BAA6BiB,YAAYE,MAAAA,CAC5C;EAMD,MAAMC,gBAAgBL,OAAOM,wBAAwB;EACrD,MAAMC,cAAcP,OAAOQ,yBAAyBR,OAAOS,8BAA8B;EACzF,IAAIT,OAAOU,oBAAoBL,iBAAiBE,cAC5Cd,WAAWkB,KAAK3B,4BAA4BkB,YAAYE,MAAAA,CAAAA;EAG5D,KAAKX,aAAaA;EAIlBA,WAAWmB,SAASC,cAAAA;GAChBA,UAAUC,MAAK,CAAA,CAAGC,OAAOC,MAAAA;IACrBZ,OAAOa,MAAM,yCAAA;IACbb,OAAOa,MAAMD,CAAAA;GACjB,CAAA;EACJ,CAAA;CACJ;CAEA,MAAME,SAASnB,WAAsC;EACjD,MAAMK,SAASL,UAAUoB,WAAW/B,kBAAAA;EAEpC,MAAM,EAAEK,eAAe;EACvB,KAAKA,aAAa,CAAA;EAElB,KAAK,MAAMoB,aAAapB,YACpB,IAAI;GACA,MAAMoB,UAAUO,KAAI;EACxB,SAASJ,GAAG;GACR,IAAIZ,OAAOiB,SAAS;IAChBjB,OAAOkB,KAAKC,KAAK,yCAAA;IACjBnB,OAAOkB,KAAKC,KAAKP,CAAAA;GACrB;EACJ;CAER;AAGJ"}
@@ -11,6 +11,7 @@ export declare enum ConfigEnvironmentVariableName {
11
11
  PUBLIC_URL = "PUBLIC_URL",
12
12
  MTLS_PUBLIC_URL = "MTLS_PUBLIC_URL",
13
13
  CERTIFICATE_SOURCE = "CERTIFICATE_SOURCE",
14
+ TRUST_PROXY = "TRUST_PROXY",
14
15
  TRUSTED_ORIGINS = "TRUSTED_ORIGINS",
15
16
  TOKEN_ACCESS_MAX_AGE = "TOKEN_ACCESS_MAX_AGE",
16
17
  TOKEN_REFRESH_MAX_AGE = "TOKEN_REFRESH_MAX_AGE",
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/constants.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,kBAAkB,oBAAmC,CAAC;AAEnE,oBAAY,6BAA6B;IACrC,QAAQ,aAAa;IACrB,uBAAuB,4BAA4B;IAEnD,KAAK,UAAU;IACf,IAAI,SAAS;IAEb,IAAI,SAAS;IACb,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,eAAe,oBAAoB;IACnC,kBAAkB,uBAAuB;IACzC,eAAe,oBAAoB;IACnC,oBAAoB,yBAAyB;IAC7C,qBAAqB,0BAA0B;IAC/C,0BAA0B,+BAA+B;IACzD,oBAAoB,yBAAyB;IAC7C,6BAA6B,kCAAkC;IAC/D,oBAAoB,yBAAyB;IAC7C,0BAA0B,+BAA+B;IACzD,yBAAyB,8BAA8B;IACvD,mBAAmB,wBAAwB;IAE3C,iBAAiB,sBAAsB;IACvC,wBAAwB,6BAA6B;IACrD,wBAAwB,6BAA6B;IACrD,+BAA+B,oCAAoC;IACnE,8BAA8B,mCAAmC;IACjE,uBAAuB,4BAA4B;IACnD,oBAAoB,yBAAyB;IAE7C,sBAAsB,2BAA2B;IAEjD,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,qBAAqB,0BAA0B;IAC/C,kBAAkB,uBAAuB;IAEzC,iBAAiB,sBAAsB;IACvC,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;IAC7C,0BAA0B,+BAA+B;IAEzD,eAAe,oBAAoB;IACnC,kBAAkB,uBAAuB;IACzC,mBAAmB,wBAAwB;IAC3C,yBAAyB,8BAA8B;IAEvD,WAAW,gBAAgB;IAC3B,qCAAqC,0CAA0C;CAClF"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/constants.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,kBAAkB,oBAAmC,CAAC;AAEnE,oBAAY,6BAA6B;IACrC,QAAQ,aAAa;IACrB,uBAAuB,4BAA4B;IAEnD,KAAK,UAAU;IACf,IAAI,SAAS;IAEb,IAAI,SAAS;IACb,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,eAAe,oBAAoB;IACnC,kBAAkB,uBAAuB;IACzC,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,oBAAoB,yBAAyB;IAC7C,qBAAqB,0BAA0B;IAC/C,0BAA0B,+BAA+B;IACzD,oBAAoB,yBAAyB;IAC7C,6BAA6B,kCAAkC;IAC/D,oBAAoB,yBAAyB;IAC7C,0BAA0B,+BAA+B;IACzD,yBAAyB,8BAA8B;IACvD,mBAAmB,wBAAwB;IAE3C,iBAAiB,sBAAsB;IACvC,wBAAwB,6BAA6B;IACrD,wBAAwB,6BAA6B;IACrD,+BAA+B,oCAAoC;IACnE,8BAA8B,mCAAmC;IACjE,uBAAuB,4BAA4B;IACnD,oBAAoB,yBAAyB;IAE7C,sBAAsB,2BAA2B;IAEjD,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAC7B,qBAAqB,0BAA0B;IAC/C,kBAAkB,uBAAuB;IAEzC,iBAAiB,sBAAsB;IACvC,qBAAqB,0BAA0B;IAC/C,oBAAoB,yBAAyB;IAC7C,0BAA0B,+BAA+B;IAEzD,eAAe,oBAAoB;IACnC,kBAAkB,uBAAuB;IACzC,mBAAmB,wBAAwB;IAC3C,yBAAyB,8BAA8B;IAEvD,WAAW,gBAAgB;IAC3B,qCAAqC,0CAA0C;CAClF"}
@@ -14,6 +14,7 @@ var ConfigEnvironmentVariableName = /*#__PURE__*/ function(ConfigEnvironmentVari
14
14
  ConfigEnvironmentVariableName["PUBLIC_URL"] = "PUBLIC_URL";
15
15
  ConfigEnvironmentVariableName["MTLS_PUBLIC_URL"] = "MTLS_PUBLIC_URL";
16
16
  ConfigEnvironmentVariableName["CERTIFICATE_SOURCE"] = "CERTIFICATE_SOURCE";
17
+ ConfigEnvironmentVariableName["TRUST_PROXY"] = "TRUST_PROXY";
17
18
  ConfigEnvironmentVariableName["TRUSTED_ORIGINS"] = "TRUSTED_ORIGINS";
18
19
  ConfigEnvironmentVariableName["TOKEN_ACCESS_MAX_AGE"] = "TOKEN_ACCESS_MAX_AGE";
19
20
  ConfigEnvironmentVariableName["TOKEN_REFRESH_MAX_AGE"] = "TOKEN_REFRESH_MAX_AGE";
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","names":["TypedToken","ConfigInjectionKey","ConfigEnvironmentVariableName"],"sources":["../../../../src/app/modules/config/constants.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { Config } from './types.ts';\n\nexport const ConfigInjectionKey = new TypedToken<Config>('Config');\n\nexport enum ConfigEnvironmentVariableName {\n NODE_ENV = 'NODE_ENV',\n WRITABLE_DIRECTORY_PATH = 'WRITABLE_DIRECTORY_PATH',\n\n REDIS = 'REDIS',\n SMTP = 'SMTP',\n\n HOST = 'HOST',\n PORT = 'PORT',\n PUBLIC_URL = 'PUBLIC_URL',\n MTLS_PUBLIC_URL = 'MTLS_PUBLIC_URL',\n CERTIFICATE_SOURCE = 'CERTIFICATE_SOURCE',\n TRUSTED_ORIGINS = 'TRUSTED_ORIGINS',\n TOKEN_ACCESS_MAX_AGE = 'TOKEN_ACCESS_MAX_AGE',\n TOKEN_REFRESH_MAX_AGE = 'TOKEN_REFRESH_MAX_AGE',\n TOKEN_REFRESH_GRACE_PERIOD = 'TOKEN_REFRESH_GRACE_PERIOD',\n PROMPT_LOGIN_MAX_AGE = 'PROMPT_LOGIN_MAX_AGE',\n END_SESSION_HINT_GRACE_PERIOD = 'END_SESSION_HINT_GRACE_PERIOD',\n REGISTRATION_ENABLED = 'REGISTRATION_ENABLED',\n EMAIL_VERIFICATION_ENABLED = 'EMAIL_VERIFICATION_ENABLED',\n PASSWORD_RECOVERY_ENABLED = 'PASSWORD_RECOVERY_ENABLED',\n PASSWORD_MIN_LENGTH = 'PASSWORD_MIN_LENGTH',\n\n EVENT_LOG_ENABLED = 'EVENT_LOG_ENABLED',\n EVENT_LOG_RETENTION_DAYS = 'EVENT_LOG_RETENTION_DAYS',\n EVENT_LOG_ENTITY_ENABLED = 'EVENT_LOG_ENTITY_ENABLED',\n EVENT_LOG_ENTITY_RETENTION_DAYS = 'EVENT_LOG_ENTITY_RETENTION_DAYS',\n LOGIN_ATTEMPT_THROTTLE_ENABLED = 'LOGIN_ATTEMPT_THROTTLE_ENABLED',\n LOGIN_ATTEMPT_THRESHOLD = 'LOGIN_ATTEMPT_THRESHOLD',\n LOGIN_ATTEMPT_WINDOW = 'LOGIN_ATTEMPT_WINDOW',\n\n SECRETS_ENCRYPTION_KEY = 'SECRETS_ENCRYPTION_KEY',\n\n MFA_ENABLED = 'MFA_ENABLED',\n MFA_REQUIRED = 'MFA_REQUIRED',\n MFA_FRESHNESS_MAX_AGE = 'MFA_FRESHNESS_MAX_AGE',\n MFA_TICKET_MAX_AGE = 'MFA_TICKET_MAX_AGE',\n\n CLIENT_AUTH_BASIC = 'CLIENT_AUTH_BASIC',\n CLIENT_SYSTEM_ENABLED = 'CLIENT_SYSTEM_ENABLED',\n CLIENT_SYSTEM_SECRET = 'CLIENT_SYSTEM_SECRET',\n CLIENT_SYSTEM_SECRET_RESET = 'CLIENT_SYSTEM_SECRET_RESET',\n\n USER_AUTH_BASIC = 'USER_AUTH_BASIC',\n USER_ADMIN_ENABLED = 'USER_ADMIN_ENABLED',\n USER_ADMIN_PASSWORD = 'USER_ADMIN_PASSWORD',\n USER_ADMIN_PASSWORD_RESET = 'USER_ADMIN_PASSWORD_RESET',\n\n PERMISSIONS = 'PERMISSIONS',\n PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT = 'PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT',\n}\n"],"mappings":";;;;;AAUA,MAAaC,qBAAqB,IAAID,WAAmB,QAAA;AAEzD,IAAO,gCAAKE,uBAAAA,+BAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAAA,OAAAA;AAkDX,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"constants.mjs","names":["TypedToken","ConfigInjectionKey","ConfigEnvironmentVariableName"],"sources":["../../../../src/app/modules/config/constants.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { TypedToken } from 'eldin';\nimport type { Config } from './types.ts';\n\nexport const ConfigInjectionKey = new TypedToken<Config>('Config');\n\nexport enum ConfigEnvironmentVariableName {\n NODE_ENV = 'NODE_ENV',\n WRITABLE_DIRECTORY_PATH = 'WRITABLE_DIRECTORY_PATH',\n\n REDIS = 'REDIS',\n SMTP = 'SMTP',\n\n HOST = 'HOST',\n PORT = 'PORT',\n PUBLIC_URL = 'PUBLIC_URL',\n MTLS_PUBLIC_URL = 'MTLS_PUBLIC_URL',\n CERTIFICATE_SOURCE = 'CERTIFICATE_SOURCE',\n TRUST_PROXY = 'TRUST_PROXY',\n TRUSTED_ORIGINS = 'TRUSTED_ORIGINS',\n TOKEN_ACCESS_MAX_AGE = 'TOKEN_ACCESS_MAX_AGE',\n TOKEN_REFRESH_MAX_AGE = 'TOKEN_REFRESH_MAX_AGE',\n TOKEN_REFRESH_GRACE_PERIOD = 'TOKEN_REFRESH_GRACE_PERIOD',\n PROMPT_LOGIN_MAX_AGE = 'PROMPT_LOGIN_MAX_AGE',\n END_SESSION_HINT_GRACE_PERIOD = 'END_SESSION_HINT_GRACE_PERIOD',\n REGISTRATION_ENABLED = 'REGISTRATION_ENABLED',\n EMAIL_VERIFICATION_ENABLED = 'EMAIL_VERIFICATION_ENABLED',\n PASSWORD_RECOVERY_ENABLED = 'PASSWORD_RECOVERY_ENABLED',\n PASSWORD_MIN_LENGTH = 'PASSWORD_MIN_LENGTH',\n\n EVENT_LOG_ENABLED = 'EVENT_LOG_ENABLED',\n EVENT_LOG_RETENTION_DAYS = 'EVENT_LOG_RETENTION_DAYS',\n EVENT_LOG_ENTITY_ENABLED = 'EVENT_LOG_ENTITY_ENABLED',\n EVENT_LOG_ENTITY_RETENTION_DAYS = 'EVENT_LOG_ENTITY_RETENTION_DAYS',\n LOGIN_ATTEMPT_THROTTLE_ENABLED = 'LOGIN_ATTEMPT_THROTTLE_ENABLED',\n LOGIN_ATTEMPT_THRESHOLD = 'LOGIN_ATTEMPT_THRESHOLD',\n LOGIN_ATTEMPT_WINDOW = 'LOGIN_ATTEMPT_WINDOW',\n\n SECRETS_ENCRYPTION_KEY = 'SECRETS_ENCRYPTION_KEY',\n\n MFA_ENABLED = 'MFA_ENABLED',\n MFA_REQUIRED = 'MFA_REQUIRED',\n MFA_FRESHNESS_MAX_AGE = 'MFA_FRESHNESS_MAX_AGE',\n MFA_TICKET_MAX_AGE = 'MFA_TICKET_MAX_AGE',\n\n CLIENT_AUTH_BASIC = 'CLIENT_AUTH_BASIC',\n CLIENT_SYSTEM_ENABLED = 'CLIENT_SYSTEM_ENABLED',\n CLIENT_SYSTEM_SECRET = 'CLIENT_SYSTEM_SECRET',\n CLIENT_SYSTEM_SECRET_RESET = 'CLIENT_SYSTEM_SECRET_RESET',\n\n USER_AUTH_BASIC = 'USER_AUTH_BASIC',\n USER_ADMIN_ENABLED = 'USER_ADMIN_ENABLED',\n USER_ADMIN_PASSWORD = 'USER_ADMIN_PASSWORD',\n USER_ADMIN_PASSWORD_RESET = 'USER_ADMIN_PASSWORD_RESET',\n\n PERMISSIONS = 'PERMISSIONS',\n PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT = 'PERMISSIONS_DEFAULT_POLICY_ASSIGNMENT',\n}\n"],"mappings":";;;;;AAUA,MAAaC,qBAAqB,IAAID,WAAmB,QAAA;AAEzD,IAAO,gCAAKE,uBAAAA,+BAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAAA,OAAAA;AAmDX,EAAA,CAAA,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { ConfigRawReadOptions } from './read/index.ts';
2
+ import type { Config } from './types.ts';
3
+ /**
4
+ * Read config from env (and optionally fs) and normalize it.
5
+ *
6
+ * @param options
7
+ */
8
+ export declare function readConfig(options?: ConfigRawReadOptions): Promise<Config>;
9
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/helpers.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,oBAAyB,GAAI,OAAO,CAAC,MAAM,CAAC,CAOrF"}
@@ -0,0 +1,21 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import { normalizeConfig } from "./normalize.mjs";
5
+ import { readConfigRaw } from "./read/module.mjs";
6
+ import "./read/index.mjs";
7
+ //#region src/app/modules/config/helpers.ts
8
+ /**
9
+ * Read config from env (and optionally fs) and normalize it.
10
+ *
11
+ * @param options
12
+ */ async function readConfig(options = {}) {
13
+ return normalizeConfig(await readConfigRaw({
14
+ env: true,
15
+ ...options
16
+ }));
17
+ }
18
+ //#endregion
19
+ export { readConfig };
20
+
21
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":["normalizeConfig","readConfigRaw","readConfig","options","raw","env"],"sources":["../../../../src/app/modules/config/helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { normalizeConfig } from './normalize.ts';\nimport type { ConfigRawReadOptions } from './read/index.ts';\nimport { readConfigRaw } from './read/index.ts';\nimport type { Config } from './types.ts';\n\n/**\n * Read config from env (and optionally fs) and normalize it.\n *\n * @param options\n */\nexport async function readConfig(options: ConfigRawReadOptions = {}) : Promise<Config> {\n const raw = await readConfigRaw({\n env: true,\n ...options,\n });\n\n return normalizeConfig(raw);\n}\n"],"mappings":";;;;;;;;;;;GAiBA,eAAsBE,WAAWC,UAAgC,CAAC,GAAC;CAM/D,OAAOH,gBAAgBI,MALLH,cAAc;EAC5BI,KAAK;EACL,GAAGF;CACP,CAAA,CAEuBC;AAC3B"}
@@ -1,5 +1,7 @@
1
1
  export * from './constants.ts';
2
+ export * from './helpers.ts';
2
3
  export * from './module.ts';
3
4
  export * from './origins.ts';
5
+ export * from './read/index.ts';
4
6
  export * from './types.ts';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/index.ts"],"names":[],"mappings":"AAOA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/index.ts"],"names":[],"mappings":"AAOA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC"}
@@ -3,5 +3,10 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { ConfigEnvironmentVariableName, ConfigInjectionKey } from "./constants.mjs";
5
5
  import { expandToOrigins, getAppOrigins } from "./origins.mjs";
6
+ import { readConfigRawFromEnv } from "./read/env.mjs";
7
+ import { readConfigRawFromFS } from "./read/fs.mjs";
8
+ import { readConfigRaw } from "./read/module.mjs";
9
+ import "./read/index.mjs";
10
+ import { readConfig } from "./helpers.mjs";
6
11
  import { ConfigModule } from "./module.mjs";
7
- export { ConfigEnvironmentVariableName, ConfigInjectionKey, ConfigModule, expandToOrigins, getAppOrigins };
12
+ export { ConfigEnvironmentVariableName, ConfigInjectionKey, ConfigModule, expandToOrigins, getAppOrigins, readConfig, readConfigRaw, readConfigRawFromEnv, readConfigRawFromFS };
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,YAAa,YAAW,OAAO;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,QAAQ,EAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;gBAI5C,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa;IAOrC,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD;;;;OAIG;IACG,IAAI,CAAC,OAAO,GAAE,oBAAyB,GAAI,OAAO,CAAC,MAAM,CAAC;CAQnE"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAExD,qBAAa,YAAa,YAAW,OAAO;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,SAAS,CAAC,QAAQ,EAAG,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;gBAI5C,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa;IAOrC,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAejD;;;;OAIG;IACG,IAAI,CAAC,OAAO,GAAE,oBAAyB,GAAI,OAAO,CAAC,MAAM,CAAC;CAGnE"}
@@ -3,9 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { ModuleName } from "../constants.mjs";
5
5
  import { ConfigInjectionKey } from "./constants.mjs";
6
- import { normalizeConfig } from "./normalize.mjs";
7
- import { readConfigRaw } from "./read/module.mjs";
8
- import "./read/index.mjs";
6
+ import { readConfig } from "./helpers.mjs";
9
7
  //#region src/app/modules/config/module.ts
10
8
  var ConfigModule = class {
11
9
  name;
@@ -26,10 +24,7 @@ var ConfigModule = class {
26
24
  *
27
25
  * @param options
28
26
  */ async read(options = {}) {
29
- return normalizeConfig(await readConfigRaw({
30
- env: true,
31
- ...options
32
- }));
27
+ return readConfig(options);
33
28
  }
34
29
  };
35
30
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["ModuleName","ConfigInjectionKey","normalizeConfig","readConfigRaw","ConfigModule","name","instance","config","CONFIG","setup","container","read","register","useValue","options","raw","env"],"sources":["../../../../src/app/modules/config/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { ConfigInjectionKey } from './constants.ts';\nimport type { IContainer } from 'eldin';\nimport { normalizeConfig } from './normalize.ts';\nimport type { ConfigRawReadOptions } from './read/index.ts';\nimport { readConfigRaw } from './read/index.ts';\nimport type { Config, ConfigFactory } from './types.ts';\n\nexport class ConfigModule implements IModule {\n readonly name: string;\n\n protected instance : Config | ConfigFactory | undefined;\n\n // ----------------------------------------------------\n\n constructor(config?: Config | ConfigFactory) {\n this.name = ModuleName.CONFIG;\n this.instance = config;\n }\n\n // ----------------------------------------------------\n\n async setup(container: IContainer): Promise<void> {\n let instance : Config;\n if (typeof this.instance === 'function') {\n instance = await this.instance();\n } else if (this.instance) {\n instance = this.instance;\n } else {\n instance = await this.read();\n }\n\n container.register(ConfigInjectionKey, { useValue: instance });\n }\n\n // ----------------------------------------------------\n\n /**\n * Read config from env and fs.\n *\n * @param options\n */\n async read(options: ConfigRawReadOptions = {}) : Promise<Config> {\n const raw = await readConfigRaw({\n env: true,\n ...options,\n });\n\n return normalizeConfig(raw);\n }\n}\n"],"mappings":";;;;;;;;;AAgBA,IAAaI,eAAb,MAAaA;CACAC;CAECC;CAIV,YAAYC,QAAiC;EACzC,KAAKF,OAAOL,WAAWQ;EACvB,KAAKF,WAAWC;CACpB;CAIA,MAAME,MAAMC,WAAsC;EAC9C,IAAIJ;EACJ,IAAI,OAAO,KAAKA,aAAa,YACzBA,WAAW,MAAM,KAAKA,SAAQ;OAC3B,IAAI,KAAKA,UACZA,WAAW,KAAKA;OAEhBA,WAAW,MAAM,KAAKK,KAAI;EAG9BD,UAAUE,SAASX,oBAAoB,EAAEY,UAAUP,SAAS,CAAA;CAChE;;;;;IASA,MAAMK,KAAKG,UAAgC,CAAC,GAAqB;EAM7D,OAAOZ,gBAAgBa,MALLZ,cAAc;GAC5Ba,KAAK;GACL,GAAGF;EACP,CAAA,CAEuBC;CAC3B;AACJ"}
1
+ {"version":3,"file":"module.mjs","names":["ModuleName","ConfigInjectionKey","readConfig","ConfigModule","name","instance","config","CONFIG","setup","container","read","register","useValue","options"],"sources":["../../../../src/app/modules/config/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IModule } from 'orkos';\nimport { ModuleName } from '../constants.ts';\nimport { ConfigInjectionKey } from './constants.ts';\nimport type { IContainer } from 'eldin';\nimport { readConfig } from './helpers.ts';\nimport type { ConfigRawReadOptions } from './read/index.ts';\nimport type { Config, ConfigFactory } from './types.ts';\n\nexport class ConfigModule implements IModule {\n readonly name: string;\n\n protected instance : Config | ConfigFactory | undefined;\n\n // ----------------------------------------------------\n\n constructor(config?: Config | ConfigFactory) {\n this.name = ModuleName.CONFIG;\n this.instance = config;\n }\n\n // ----------------------------------------------------\n\n async setup(container: IContainer): Promise<void> {\n let instance : Config;\n if (typeof this.instance === 'function') {\n instance = await this.instance();\n } else if (this.instance) {\n instance = this.instance;\n } else {\n instance = await this.read();\n }\n\n container.register(ConfigInjectionKey, { useValue: instance });\n }\n\n // ----------------------------------------------------\n\n /**\n * Read config from env and fs.\n *\n * @param options\n */\n async read(options: ConfigRawReadOptions = {}) : Promise<Config> {\n return readConfig(options);\n }\n}\n"],"mappings":";;;;;;;AAeA,IAAaG,eAAb,MAAaA;CACAC;CAECC;CAIV,YAAYC,QAAiC;EACzC,KAAKF,OAAOJ,WAAWO;EACvB,KAAKF,WAAWC;CACpB;CAIA,MAAME,MAAMC,WAAsC;EAC9C,IAAIJ;EACJ,IAAI,OAAO,KAAKA,aAAa,YACzBA,WAAW,MAAM,KAAKA,SAAQ;OAC3B,IAAI,KAAKA,UACZA,WAAW,KAAKA;OAEhBA,WAAW,MAAM,KAAKK,KAAI;EAG9BD,UAAUE,SAASV,oBAAoB,EAAEW,UAAUP,SAAS,CAAA;CAChE;;;;;IASA,MAAMK,KAAKG,UAAgC,CAAC,GAAqB;EAC7D,OAAOX,WAAWW,OAAAA;CACtB;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/normalize.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAsB,eAAe,CAAC,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsJ9E"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../src/app/modules/config/normalize.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAsB,eAAe,CAAC,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiK9E"}
@@ -5,6 +5,7 @@ import "../../../core/entities/event/constants.mjs";
5
5
  import "../../../core/index.mjs";
6
6
  import { toPublicHost } from "../../../utils/host.mjs";
7
7
  import { expandToOrigins } from "./origins.mjs";
8
+ import { canonicalizeTrustProxy, canonicalizeTrustProxyListEntry } from "./trust-proxy.mjs";
8
9
  import { parseConfig } from "./parse.mjs";
9
10
  import { EnvironmentName, base64ToArrayBuffer } from "@authup/kit";
10
11
  import { USER_PASSWORD_MIN_LENGTH } from "@authup/core-kit";
@@ -46,6 +47,7 @@ async function normalizeConfig(input = {}) {
46
47
  publicUrl,
47
48
  mtlsPublicUrl: null,
48
49
  certificateSource: "disabled",
50
+ trustProxy: true,
49
51
  middlewareBody: true,
50
52
  middlewareCookie: true,
51
53
  middlewareCors: true,
@@ -87,6 +89,8 @@ async function normalizeConfig(input = {}) {
87
89
  ...parsed,
88
90
  trustedOrigins
89
91
  };
92
+ if (typeof config.trustProxy === "string") config.trustProxy = canonicalizeTrustProxy(config.trustProxy);
93
+ else if (Array.isArray(config.trustProxy)) config.trustProxy = config.trustProxy.map(canonicalizeTrustProxyListEntry);
90
94
  if (config.loginAttemptThrottleEnabled && !config.eventLogEnabled) throw new AuthupError("loginAttemptThrottleEnabled requires eventLogEnabled.");
91
95
  if (config.mfaRequired && !config.mfaEnabled) throw new AuthupError("mfaRequired requires mfaEnabled.");
92
96
  if (config.mtlsPublicUrl && config.certificateSource === "disabled") throw new AuthupError("mtlsPublicUrl requires certificateSource to be enabled.");
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.mjs","names":["read","path","process","USER_PASSWORD_MIN_LENGTH","AuthupError","EnvironmentName","base64ToArrayBuffer","EVENT_LOG_RETENTION_DAYS_DEFAULT","toPublicHost","expandToOrigins","parseConfig","normalizeConfig","input","parsed","writableDirectoryPath","join","cwd","port","host","publicUrl","regex","match","env","DEVELOPMENT","trustedOrigins","value","origin","includes","push","PRODUCTION","devOrigin","config","rootPath","logger","redis","smtp","mtlsPublicUrl","certificateSource","middlewareBody","middlewareCookie","middlewareCors","middlewarePrometheus","middlewareQuery","middlewareRateLimit","middlewareSwagger","tokenRefreshMaxAge","tokenAccessMaxAge","tokenRefreshGracePeriod","promptLoginMaxAge","endSessionHintGracePeriod","registrationEnabled","emailVerificationEnabled","passwordRecoveryEnabled","passwordMinLength","eventLogEnabled","eventLogRetentionDays","eventLogEntityEnabled","eventLogEntityRetentionDays","loginAttemptThrottleEnabled","loginAttemptThreshold","loginAttemptWindow","secretsEncryptionKey","mfaEnabled","mfaRequired","mfaFreshnessMaxAge","mfaTicketMaxAge","clientAuthBasic","clientSystemEnabled","clientSystemSecret","clientSystemSecretReset","userAuthBasic","userAdminEnabled","userAdminPassword","userAdminPasswordReset","permissions","permissionsDefaultPolicyAssignment","byteLength","trim"],"sources":["../../../../src/app/modules/config/normalize.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { USER_PASSWORD_MIN_LENGTH } from '@authup/core-kit';\nimport { AuthupError } from '@authup/errors';\nimport { EnvironmentName, base64ToArrayBuffer } from '@authup/kit';\nimport { EVENT_LOG_RETENTION_DAYS_DEFAULT } from '../../../core/index.ts';\nimport { toPublicHost } from '../../../utils/host.ts';\nimport { expandToOrigins } from './origins.ts';\nimport { parseConfig } from './parse.ts';\nimport type { Config, ConfigInput } from './types.ts';\n\nexport async function normalizeConfig(input: ConfigInput = {}): Promise<Config> {\n const parsed = await parseConfig(input);\n\n const writableDirectoryPath = parsed.writableDirectoryPath ||\n path.join(process.cwd(), 'writable');\n\n const port = parsed.port ?? 3001;\n let host = parsed.host || '0.0.0.0';\n\n let publicUrl : string;\n if (parsed.publicUrl) {\n publicUrl = parsed.publicUrl;\n } else {\n const regex = /^([^:]+)(?::(\\d+))?$/;\n const match = host.match(regex);\n if (match) {\n [, host] = match;\n publicUrl = `http://${toPublicHost(host)}:${match[2] || port}`;\n } else {\n publicUrl = `http://${toPublicHost(host)}:${port}`;\n }\n }\n\n const env = parsed.env || read('NODE_ENV', EnvironmentName.DEVELOPMENT);\n\n // Canonicalize to bare origins (scheme://host[:port]) — a scheme-less\n // entry (e.g. `hub.local`) expands to both its http and https origin.\n // Downstream consumers (redirect allowlist, getAppOrigins) can rely on\n // every entry being a full origin. Building a fresh array also keeps a\n // repeated normalizeConfig() on the same input from accumulating the\n // dev origin into a security-sensitive allowlist.\n const trustedOrigins: string[] = [];\n for (const value of parsed.trustedOrigins ?? []) {\n for (const origin of expandToOrigins(value)) {\n if (!trustedOrigins.includes(origin)) {\n trustedOrigins.push(origin);\n }\n }\n }\n\n // In non-production (development & test) client-web runs on :3000 while\n // the API (publicUrl) runs on :3001. Seed :3000 into the trusted origins\n // so the redirect allowlist (<origin>/**) and CORS accept logins from the\n // dev UI out of the box; otherwise the realm-selection login is dead on\n // first run.\n if (env !== EnvironmentName.PRODUCTION) {\n const devOrigin = 'http://localhost:3000';\n if (!trustedOrigins.includes(devOrigin)) {\n trustedOrigins.push(devOrigin);\n }\n }\n\n const config : Config = {\n env,\n rootPath: process.cwd(),\n writableDirectoryPath,\n\n logger: true,\n redis: false,\n smtp: false,\n\n port,\n host,\n publicUrl,\n mtlsPublicUrl: null,\n certificateSource: 'disabled',\n\n middlewareBody: true,\n middlewareCookie: true,\n middlewareCors: true,\n middlewarePrometheus: true,\n middlewareQuery: true,\n middlewareRateLimit: true,\n middlewareSwagger: true,\n tokenRefreshMaxAge: 259_200,\n tokenAccessMaxAge: 900,\n tokenRefreshGracePeriod: 0,\n promptLoginMaxAge: 60,\n endSessionHintGracePeriod: 0,\n registrationEnabled: false,\n emailVerificationEnabled: false,\n passwordRecoveryEnabled: false,\n passwordMinLength: USER_PASSWORD_MIN_LENGTH,\n\n eventLogEnabled: true,\n eventLogRetentionDays: EVENT_LOG_RETENTION_DAYS_DEFAULT,\n eventLogEntityEnabled: true,\n eventLogEntityRetentionDays: 7,\n loginAttemptThrottleEnabled: false,\n loginAttemptThreshold: 5,\n loginAttemptWindow: 900,\n\n secretsEncryptionKey: '',\n\n mfaEnabled: false,\n mfaRequired: false,\n mfaFreshnessMaxAge: 60,\n mfaTicketMaxAge: 600,\n\n clientAuthBasic: false,\n clientSystemEnabled: false,\n clientSystemSecret: 'start123',\n clientSystemSecretReset: false,\n\n userAuthBasic: false,\n userAdminEnabled: true,\n userAdminPassword: 'start123',\n userAdminPasswordReset: false,\n\n permissions: [],\n permissionsDefaultPolicyAssignment: true,\n ...parsed,\n\n // After the spread so the canonicalized + dev-seeded list wins over\n // the raw parsed list (parsed.trustedOrigins is merged in above).\n trustedOrigins,\n };\n\n // fail loud at boot: the throttle counts loginFailed rows in\n // auth_events — with the audit log disabled it would silently no-op.\n if (config.loginAttemptThrottleEnabled && !config.eventLogEnabled) {\n throw new AuthupError('loginAttemptThrottleEnabled requires eventLogEnabled.');\n }\n\n if (config.mfaRequired && !config.mfaEnabled) {\n throw new AuthupError('mfaRequired requires mfaEnabled.');\n }\n\n if (config.mtlsPublicUrl && config.certificateSource === 'disabled') {\n throw new AuthupError('mtlsPublicUrl requires certificateSource to be enabled.');\n }\n\n // fail loud at boot rather than at first key-store access: wrapped key\n // material must never be minted under a malformed KEK. Validate the\n // DECODED length here (not just base64 shape) so a whitespace / invalid /\n // wrong-length key fails at config time, not asynchronously inside the\n // cipher at first wrap/unwrap.\n if (config.secretsEncryptionKey) {\n let byteLength = -1;\n try {\n byteLength = base64ToArrayBuffer(config.secretsEncryptionKey.trim()).byteLength;\n } catch {\n // fall through — treated as invalid below\n }\n if (byteLength !== 32) {\n throw new AuthupError('secretsEncryptionKey must decode to exactly 32 bytes (base64).');\n }\n }\n\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,eAAsBW,gBAAgBC,QAAqB,CAAC,GAAC;CACzD,MAAMC,SAAS,MAAMH,YAAYE,KAAAA;CAEjC,MAAME,wBAAwBD,OAAOC,yBACjCb,KAAKc,KAAKb,QAAQc,IAAG,GAAI,UAAA;CAE7B,MAAMC,OAAOJ,OAAOI,QAAQ;CAC5B,IAAIC,OAAOL,OAAOK,QAAQ;CAE1B,IAAIC;CACJ,IAAIN,OAAOM,WACPA,YAAYN,OAAOM;MAChB;EAEH,MAAME,QAAQH,KAAKG,MAAMD,sBAAAA;EACzB,IAAIC,OAAO;GACP,GAAGH,QAAQG;GACXF,YAAY,UAAUX,aAAaU,IAAAA,EAAM,GAAGG,MAAM,MAAMJ;EAC5D,OACIE,YAAY,UAAUX,aAAaU,IAAAA,EAAM,GAAGD;CAEpD;CAEA,MAAMK,MAAMT,OAAOS,OAAOtB,KAAK,YAAYK,gBAAgBkB,WAAW;CAQtE,MAAMC,iBAA2B,CAAA;CACjC,KAAK,MAAMC,SAASZ,OAAOW,kBAAkB,CAAA,GACzC,KAAK,MAAME,UAAUjB,gBAAgBgB,KAAAA,GACjC,IAAI,CAACD,eAAeG,SAASD,MAAAA,GACzBF,eAAeI,KAAKF,MAAAA;CAUhC,IAAIJ,QAAQjB,gBAAgBwB,YAAY;EACpC,MAAMC,YAAY;EAClB,IAAI,CAACN,eAAeG,SAASG,SAAAA,GACzBN,eAAeI,KAAKE,SAAAA;CAE5B;CAEA,MAAMC,SAAkB;EACpBT;EACAU,UAAU9B,QAAQc,IAAG;EACrBF;EAEAmB,QAAQ;EACRC,OAAO;EACPC,MAAM;EAENlB;EACAC;EACAC;EACAiB,eAAe;EACfC,mBAAmB;EAEnBC,gBAAgB;EAChBC,kBAAkB;EAClBC,gBAAgB;EAChBC,sBAAsB;EACtBC,iBAAiB;EACjBC,qBAAqB;EACrBC,mBAAmB;EACnBC,oBAAoB;EACpBC,mBAAmB;EACnBC,yBAAyB;EACzBC,mBAAmB;EACnBC,2BAA2B;EAC3BC,qBAAqB;EACrBC,0BAA0B;EAC1BC,yBAAyB;EACzBC,mBAAmBlD;EAEnBmD,iBAAiB;EACjBC,uBAAAA;EACAC,uBAAuB;EACvBC,6BAA6B;EAC7BC,6BAA6B;EAC7BC,uBAAuB;EACvBC,oBAAoB;EAEpBC,sBAAsB;EAEtBC,YAAY;EACZC,aAAa;EACbC,oBAAoB;EACpBC,iBAAiB;EAEjBC,iBAAiB;EACjBC,qBAAqB;EACrBC,oBAAoB;EACpBC,yBAAyB;EAEzBC,eAAe;EACfC,kBAAkB;EAClBC,mBAAmB;EACnBC,wBAAwB;EAExBC,aAAa,CAAA;EACbC,oCAAoC;EACpC,GAAG9D;EAIHW;CACJ;CAIA,IAAIO,OAAO2B,+BAA+B,CAAC3B,OAAOuB,iBAC9C,MAAM,IAAIlD,YAAY,uDAAA;CAG1B,IAAI2B,OAAOgC,eAAe,CAAChC,OAAO+B,YAC9B,MAAM,IAAI1D,YAAY,kCAAA;CAG1B,IAAI2B,OAAOK,iBAAiBL,OAAOM,sBAAsB,YACrD,MAAM,IAAIjC,YAAY,yDAAA;CAQ1B,IAAI2B,OAAO8B,sBAAsB;EAC7B,IAAIe,aAAa;EACjB,IAAI;GACAA,aAAatE,oBAAoByB,OAAO8B,qBAAqBgB,KAAI,CAAA,CAAA,CAAID;EACzE,QAAQ,CAER;EACA,IAAIA,eAAe,IACf,MAAM,IAAIxE,YAAY,gEAAA;CAE9B;CAEA,OAAO2B;AACX"}
1
+ {"version":3,"file":"normalize.mjs","names":["read","path","process","USER_PASSWORD_MIN_LENGTH","AuthupError","EnvironmentName","base64ToArrayBuffer","EVENT_LOG_RETENTION_DAYS_DEFAULT","toPublicHost","expandToOrigins","parseConfig","canonicalizeTrustProxy","canonicalizeTrustProxyListEntry","normalizeConfig","input","parsed","writableDirectoryPath","join","cwd","port","host","publicUrl","regex","match","env","DEVELOPMENT","trustedOrigins","value","origin","includes","push","PRODUCTION","devOrigin","config","rootPath","logger","redis","smtp","mtlsPublicUrl","certificateSource","trustProxy","middlewareBody","middlewareCookie","middlewareCors","middlewarePrometheus","middlewareQuery","middlewareRateLimit","middlewareSwagger","tokenRefreshMaxAge","tokenAccessMaxAge","tokenRefreshGracePeriod","promptLoginMaxAge","endSessionHintGracePeriod","registrationEnabled","emailVerificationEnabled","passwordRecoveryEnabled","passwordMinLength","eventLogEnabled","eventLogRetentionDays","eventLogEntityEnabled","eventLogEntityRetentionDays","loginAttemptThrottleEnabled","loginAttemptThreshold","loginAttemptWindow","secretsEncryptionKey","mfaEnabled","mfaRequired","mfaFreshnessMaxAge","mfaTicketMaxAge","clientAuthBasic","clientSystemEnabled","clientSystemSecret","clientSystemSecretReset","userAuthBasic","userAdminEnabled","userAdminPassword","userAdminPasswordReset","permissions","permissionsDefaultPolicyAssignment","Array","isArray","map","byteLength","trim"],"sources":["../../../../src/app/modules/config/normalize.ts"],"sourcesContent":["/*\n * Copyright (c) 2023-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { read } from 'envix';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { USER_PASSWORD_MIN_LENGTH } from '@authup/core-kit';\nimport { AuthupError } from '@authup/errors';\nimport { EnvironmentName, base64ToArrayBuffer } from '@authup/kit';\nimport { EVENT_LOG_RETENTION_DAYS_DEFAULT } from '../../../core/index.ts';\nimport { toPublicHost } from '../../../utils/host.ts';\nimport { expandToOrigins } from './origins.ts';\nimport { parseConfig } from './parse.ts';\nimport { canonicalizeTrustProxy, canonicalizeTrustProxyListEntry } from './trust-proxy.ts';\nimport type { Config, ConfigInput } from './types.ts';\n\nexport async function normalizeConfig(input: ConfigInput = {}): Promise<Config> {\n const parsed = await parseConfig(input);\n\n const writableDirectoryPath = parsed.writableDirectoryPath ||\n path.join(process.cwd(), 'writable');\n\n const port = parsed.port ?? 3001;\n let host = parsed.host || '0.0.0.0';\n\n let publicUrl : string;\n if (parsed.publicUrl) {\n publicUrl = parsed.publicUrl;\n } else {\n const regex = /^([^:]+)(?::(\\d+))?$/;\n const match = host.match(regex);\n if (match) {\n [, host] = match;\n publicUrl = `http://${toPublicHost(host)}:${match[2] || port}`;\n } else {\n publicUrl = `http://${toPublicHost(host)}:${port}`;\n }\n }\n\n const env = parsed.env || read('NODE_ENV', EnvironmentName.DEVELOPMENT);\n\n // Canonicalize to bare origins (scheme://host[:port]) — a scheme-less\n // entry (e.g. `hub.local`) expands to both its http and https origin.\n // Downstream consumers (redirect allowlist, getAppOrigins) can rely on\n // every entry being a full origin. Building a fresh array also keeps a\n // repeated normalizeConfig() on the same input from accumulating the\n // dev origin into a security-sensitive allowlist.\n const trustedOrigins: string[] = [];\n for (const value of parsed.trustedOrigins ?? []) {\n for (const origin of expandToOrigins(value)) {\n if (!trustedOrigins.includes(origin)) {\n trustedOrigins.push(origin);\n }\n }\n }\n\n // In non-production (development & test) client-web runs on :3000 while\n // the API (publicUrl) runs on :3001. Seed :3000 into the trusted origins\n // so the redirect allowlist (<origin>/**) and CORS accept logins from the\n // dev UI out of the box; otherwise the realm-selection login is dead on\n // first run.\n if (env !== EnvironmentName.PRODUCTION) {\n const devOrigin = 'http://localhost:3000';\n if (!trustedOrigins.includes(devOrigin)) {\n trustedOrigins.push(devOrigin);\n }\n }\n\n const config : Config = {\n env,\n rootPath: process.cwd(),\n writableDirectoryPath,\n\n logger: true,\n redis: false,\n smtp: false,\n\n port,\n host,\n publicUrl,\n mtlsPublicUrl: null,\n certificateSource: 'disabled',\n trustProxy: true,\n\n middlewareBody: true,\n middlewareCookie: true,\n middlewareCors: true,\n middlewarePrometheus: true,\n middlewareQuery: true,\n middlewareRateLimit: true,\n middlewareSwagger: true,\n tokenRefreshMaxAge: 259_200,\n tokenAccessMaxAge: 900,\n tokenRefreshGracePeriod: 0,\n promptLoginMaxAge: 60,\n endSessionHintGracePeriod: 0,\n registrationEnabled: false,\n emailVerificationEnabled: false,\n passwordRecoveryEnabled: false,\n passwordMinLength: USER_PASSWORD_MIN_LENGTH,\n\n eventLogEnabled: true,\n eventLogRetentionDays: EVENT_LOG_RETENTION_DAYS_DEFAULT,\n eventLogEntityEnabled: true,\n eventLogEntityRetentionDays: 7,\n loginAttemptThrottleEnabled: false,\n loginAttemptThreshold: 5,\n loginAttemptWindow: 900,\n\n secretsEncryptionKey: '',\n\n mfaEnabled: false,\n mfaRequired: false,\n mfaFreshnessMaxAge: 60,\n mfaTicketMaxAge: 600,\n\n clientAuthBasic: false,\n clientSystemEnabled: false,\n clientSystemSecret: 'start123',\n clientSystemSecretReset: false,\n\n userAuthBasic: false,\n userAdminEnabled: true,\n userAdminPassword: 'start123',\n userAdminPasswordReset: false,\n\n permissions: [],\n permissionsDefaultPolicyAssignment: true,\n ...parsed,\n\n // After the spread so the canonicalized + dev-seeded list wins over\n // the raw parsed list (parsed.trustedOrigins is merged in above).\n trustedOrigins,\n };\n\n // Canonicalize the string form on EVERY config surface (env, .conf,\n // file, programmatic) — proxy-addr accepts single-integer \"long value\"\n // IPv4 notation, so an un-canonicalized `trustProxy: \"1\"` would silently\n // compile to an allowlist of `0.0.0.1` instead of one trusted hop.\n if (typeof config.trustProxy === 'string') {\n config.trustProxy = canonicalizeTrustProxy(config.trustProxy);\n } else if (Array.isArray(config.trustProxy)) {\n config.trustProxy = config.trustProxy.map(canonicalizeTrustProxyListEntry);\n }\n\n // fail loud at boot: the throttle counts loginFailed rows in\n // auth_events — with the audit log disabled it would silently no-op.\n if (config.loginAttemptThrottleEnabled && !config.eventLogEnabled) {\n throw new AuthupError('loginAttemptThrottleEnabled requires eventLogEnabled.');\n }\n\n if (config.mfaRequired && !config.mfaEnabled) {\n throw new AuthupError('mfaRequired requires mfaEnabled.');\n }\n\n if (config.mtlsPublicUrl && config.certificateSource === 'disabled') {\n throw new AuthupError('mtlsPublicUrl requires certificateSource to be enabled.');\n }\n\n // fail loud at boot rather than at first key-store access: wrapped key\n // material must never be minted under a malformed KEK. Validate the\n // DECODED length here (not just base64 shape) so a whitespace / invalid /\n // wrong-length key fails at config time, not asynchronously inside the\n // cipher at first wrap/unwrap.\n if (config.secretsEncryptionKey) {\n let byteLength = -1;\n try {\n byteLength = base64ToArrayBuffer(config.secretsEncryptionKey.trim()).byteLength;\n } catch {\n // fall through — treated as invalid below\n }\n if (byteLength !== 32) {\n throw new AuthupError('secretsEncryptionKey must decode to exactly 32 bytes (base64).');\n }\n }\n\n return config;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAoBA,eAAsBa,gBAAgBC,QAAqB,CAAC,GAAC;CACzD,MAAMC,SAAS,MAAML,YAAYI,KAAAA;CAEjC,MAAME,wBAAwBD,OAAOC,yBACjCf,KAAKgB,KAAKf,QAAQgB,IAAG,GAAI,UAAA;CAE7B,MAAMC,OAAOJ,OAAOI,QAAQ;CAC5B,IAAIC,OAAOL,OAAOK,QAAQ;CAE1B,IAAIC;CACJ,IAAIN,OAAOM,WACPA,YAAYN,OAAOM;MAChB;EAEH,MAAME,QAAQH,KAAKG,MAAMD,sBAAAA;EACzB,IAAIC,OAAO;GACP,GAAGH,QAAQG;GACXF,YAAY,UAAUb,aAAaY,IAAAA,EAAM,GAAGG,MAAM,MAAMJ;EAC5D,OACIE,YAAY,UAAUb,aAAaY,IAAAA,EAAM,GAAGD;CAEpD;CAEA,MAAMK,MAAMT,OAAOS,OAAOxB,KAAK,YAAYK,gBAAgBoB,WAAW;CAQtE,MAAMC,iBAA2B,CAAA;CACjC,KAAK,MAAMC,SAASZ,OAAOW,kBAAkB,CAAA,GACzC,KAAK,MAAME,UAAUnB,gBAAgBkB,KAAAA,GACjC,IAAI,CAACD,eAAeG,SAASD,MAAAA,GACzBF,eAAeI,KAAKF,MAAAA;CAUhC,IAAIJ,QAAQnB,gBAAgB0B,YAAY;EACpC,MAAMC,YAAY;EAClB,IAAI,CAACN,eAAeG,SAASG,SAAAA,GACzBN,eAAeI,KAAKE,SAAAA;CAE5B;CAEA,MAAMC,SAAkB;EACpBT;EACAU,UAAUhC,QAAQgB,IAAG;EACrBF;EAEAmB,QAAQ;EACRC,OAAO;EACPC,MAAM;EAENlB;EACAC;EACAC;EACAiB,eAAe;EACfC,mBAAmB;EACnBC,YAAY;EAEZC,gBAAgB;EAChBC,kBAAkB;EAClBC,gBAAgB;EAChBC,sBAAsB;EACtBC,iBAAiB;EACjBC,qBAAqB;EACrBC,mBAAmB;EACnBC,oBAAoB;EACpBC,mBAAmB;EACnBC,yBAAyB;EACzBC,mBAAmB;EACnBC,2BAA2B;EAC3BC,qBAAqB;EACrBC,0BAA0B;EAC1BC,yBAAyB;EACzBC,mBAAmBrD;EAEnBsD,iBAAiB;EACjBC,uBAAAA;EACAC,uBAAuB;EACvBC,6BAA6B;EAC7BC,6BAA6B;EAC7BC,uBAAuB;EACvBC,oBAAoB;EAEpBC,sBAAsB;EAEtBC,YAAY;EACZC,aAAa;EACbC,oBAAoB;EACpBC,iBAAiB;EAEjBC,iBAAiB;EACjBC,qBAAqB;EACrBC,oBAAoB;EACpBC,yBAAyB;EAEzBC,eAAe;EACfC,kBAAkB;EAClBC,mBAAmB;EACnBC,wBAAwB;EAExBC,aAAa,CAAA;EACbC,oCAAoC;EACpC,GAAG/D;EAIHW;CACJ;CAMA,IAAI,OAAOO,OAAOO,eAAe,UAC7BP,OAAOO,aAAa7B,uBAAuBsB,OAAOO,UAAU;MACzD,IAAIuC,MAAMC,QAAQ/C,OAAOO,UAAU,GACtCP,OAAOO,aAAaP,OAAOO,WAAWyC,IAAIrE,+BAAAA;CAK9C,IAAIqB,OAAO4B,+BAA+B,CAAC5B,OAAOwB,iBAC9C,MAAM,IAAIrD,YAAY,uDAAA;CAG1B,IAAI6B,OAAOiC,eAAe,CAACjC,OAAOgC,YAC9B,MAAM,IAAI7D,YAAY,kCAAA;CAG1B,IAAI6B,OAAOK,iBAAiBL,OAAOM,sBAAsB,YACrD,MAAM,IAAInC,YAAY,yDAAA;CAQ1B,IAAI6B,OAAO+B,sBAAsB;EAC7B,IAAIkB,aAAa;EACjB,IAAI;GACAA,aAAa5E,oBAAoB2B,OAAO+B,qBAAqBmB,KAAI,CAAA,CAAA,CAAID;EACzE,QAAQ,CAER;EACA,IAAIA,eAAe,IACf,MAAM,IAAI9E,YAAY,gEAAA;CAE9B;CAEA,OAAO6B;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/config/read/env.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B/C,wBAAgB,oBAAoB,IAAK,WAAW,CA4OnD"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/config/read/env.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B/C,wBAAgB,oBAAoB,IAAK,WAAW,CAmPnD"}
@@ -55,6 +55,8 @@ function readConfigRawFromEnv() {
55
55
  if (mtlsPublicURL) options.mtlsPublicUrl = mtlsPublicURL;
56
56
  const certificateSource = read(ConfigEnvironmentVariableName.CERTIFICATE_SOURCE);
57
57
  if (certificateSource) options.certificateSource = certificateSource;
58
+ const trustProxy = read(ConfigEnvironmentVariableName.TRUST_PROXY);
59
+ if (typeof trustProxy === "string" && trustProxy.trim().length > 0) options.trustProxy = trustProxy;
58
60
  const trustedOrigins = readArray(ConfigEnvironmentVariableName.TRUSTED_ORIGINS);
59
61
  if (trustedOrigins && trustedOrigins.length > 0) options.trustedOrigins = trustedOrigins;
60
62
  const tokenAccessMaxAge = readInt(ConfigEnvironmentVariableName.TOKEN_ACCESS_MAX_AGE);