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

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 (416) hide show
  1. package/dist/adapters/database/logger/module.mjs +2 -4
  2. package/dist/adapters/database/logger/module.mjs.map +1 -1
  3. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  4. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +1 -1
  5. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  6. package/dist/adapters/http/controllers/index.mjs +2 -1
  7. package/dist/adapters/http/controllers/workflows/account/index.d.ts +2 -0
  8. package/dist/adapters/http/controllers/workflows/account/index.d.ts.map +1 -0
  9. package/dist/adapters/http/controllers/workflows/account/index.mjs +5 -0
  10. package/dist/adapters/http/controllers/workflows/account/module.d.ts +24 -0
  11. package/dist/adapters/http/controllers/workflows/account/module.d.ts.map +1 -0
  12. package/dist/adapters/http/controllers/workflows/account/module.mjs +63 -0
  13. package/dist/adapters/http/controllers/workflows/account/module.mjs.map +1 -0
  14. package/dist/adapters/http/controllers/workflows/activate/module.mjs +1 -1
  15. package/dist/adapters/http/controllers/workflows/authorize/module.mjs +2 -2
  16. package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
  17. package/dist/adapters/http/controllers/workflows/index.d.ts +1 -0
  18. package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
  19. package/dist/adapters/http/controllers/workflows/index.mjs +3 -1
  20. package/dist/adapters/http/controllers/workflows/logout/module.mjs +2 -2
  21. package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
  22. package/dist/adapters/http/controllers/workflows/password-forgot/module.mjs +1 -1
  23. package/dist/adapters/http/controllers/workflows/password-reset/module.mjs +1 -1
  24. package/dist/adapters/http/controllers/workflows/register/module.mjs +1 -1
  25. package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts.map +1 -1
  26. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs +5 -1
  27. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs.map +1 -1
  28. package/dist/adapters/http/index.mjs +3 -1
  29. package/dist/adapters/http/middleware/built-in/assets.d.ts +8 -1
  30. package/dist/adapters/http/middleware/built-in/assets.d.ts.map +1 -1
  31. package/dist/adapters/http/middleware/built-in/assets.mjs +48 -4
  32. package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
  33. package/dist/adapters/http/middleware/built-in/authorization/module.mjs +2 -1
  34. package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
  35. package/dist/adapters/http/middleware/built-in/index.d.ts +2 -0
  36. package/dist/adapters/http/middleware/built-in/index.d.ts.map +1 -1
  37. package/dist/adapters/http/middleware/built-in/index.mjs +2 -1
  38. package/dist/adapters/http/middleware/built-in/rate-limit.mjs +2 -2
  39. package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
  40. package/dist/adapters/http/middleware/built-in/theme.d.ts +15 -0
  41. package/dist/adapters/http/middleware/built-in/theme.d.ts.map +1 -0
  42. package/dist/adapters/http/middleware/built-in/theme.mjs +27 -0
  43. package/dist/adapters/http/middleware/built-in/theme.mjs.map +1 -0
  44. package/dist/adapters/http/middleware/built-in/types.d.ts +14 -0
  45. package/dist/adapters/http/middleware/built-in/types.d.ts.map +1 -0
  46. package/dist/adapters/http/middleware/built-in/ui-http-client.d.ts +1 -1
  47. package/dist/adapters/http/middleware/built-in/ui-http-client.mjs +1 -1
  48. package/dist/adapters/http/middleware/built-in/ui-http-client.mjs.map +1 -1
  49. package/dist/adapters/http/middleware/index.mjs +2 -1
  50. package/dist/adapters/http/request/client-certificate.mjs +1 -1
  51. package/dist/adapters/http/request/client-certificate.mjs.map +1 -1
  52. package/dist/adapters/http/request/helpers/locations.mjs +1 -3
  53. package/dist/adapters/http/request/helpers/locations.mjs.map +1 -1
  54. package/dist/adapters/http/ui/account-console/index.d.ts +4 -0
  55. package/dist/adapters/http/ui/account-console/index.d.ts.map +1 -0
  56. package/dist/adapters/http/ui/account-console/index.mjs +6 -0
  57. package/dist/adapters/http/ui/account-console/module.d.ts +28 -0
  58. package/dist/adapters/http/ui/account-console/module.d.ts.map +1 -0
  59. package/dist/adapters/http/ui/account-console/module.mjs +80 -0
  60. package/dist/adapters/http/ui/account-console/module.mjs.map +1 -0
  61. package/dist/adapters/http/ui/account-console/ref.d.ts +30 -0
  62. package/dist/adapters/http/ui/account-console/ref.d.ts.map +1 -0
  63. package/dist/adapters/http/ui/account-console/ref.mjs +50 -0
  64. package/dist/adapters/http/ui/account-console/ref.mjs.map +1 -0
  65. package/dist/adapters/http/ui/account-console/types.d.ts +11 -0
  66. package/dist/adapters/http/ui/account-console/types.d.ts.map +1 -0
  67. package/dist/adapters/http/ui/account-console/types.mjs +4 -0
  68. package/dist/adapters/http/ui/{internal-http-client.d.ts → auth-console/http-client.d.ts} +1 -1
  69. package/dist/adapters/http/ui/auth-console/http-client.d.ts.map +1 -0
  70. package/dist/adapters/http/ui/{internal-http-client.mjs → auth-console/http-client.mjs} +2 -2
  71. package/dist/adapters/http/ui/auth-console/http-client.mjs.map +1 -0
  72. package/dist/adapters/http/ui/auth-console/index.d.ts +6 -0
  73. package/dist/adapters/http/ui/auth-console/index.d.ts.map +1 -0
  74. package/dist/adapters/http/ui/auth-console/index.mjs +8 -0
  75. package/dist/adapters/http/ui/auth-console/module.d.ts +4 -0
  76. package/dist/adapters/http/ui/auth-console/module.d.ts.map +1 -0
  77. package/dist/adapters/http/ui/auth-console/module.mjs +73 -0
  78. package/dist/adapters/http/ui/auth-console/module.mjs.map +1 -0
  79. package/dist/adapters/http/ui/auth-console/resolve.d.ts +21 -0
  80. package/dist/adapters/http/ui/auth-console/resolve.d.ts.map +1 -0
  81. package/dist/adapters/http/ui/auth-console/resolve.mjs +53 -0
  82. package/dist/adapters/http/ui/auth-console/resolve.mjs.map +1 -0
  83. package/dist/adapters/http/ui/{serve.d.ts → auth-console/serve.d.ts} +1 -8
  84. package/dist/adapters/http/ui/auth-console/serve.d.ts.map +1 -0
  85. package/dist/adapters/http/ui/{serve.mjs → auth-console/serve.mjs} +5 -5
  86. package/dist/adapters/http/ui/auth-console/serve.mjs.map +1 -0
  87. package/dist/adapters/http/ui/auth-console/types.d.ts +26 -0
  88. package/dist/adapters/http/ui/auth-console/types.d.ts.map +1 -0
  89. package/dist/adapters/http/ui/auth-console/types.mjs +4 -0
  90. package/dist/adapters/http/ui/console-packages/index.d.ts +3 -0
  91. package/dist/adapters/http/ui/console-packages/index.d.ts.map +1 -0
  92. package/dist/adapters/http/ui/console-packages/index.mjs +5 -0
  93. package/dist/adapters/http/ui/console-packages/module.d.ts +33 -0
  94. package/dist/adapters/http/ui/console-packages/module.d.ts.map +1 -0
  95. package/dist/adapters/http/ui/console-packages/module.mjs +70 -0
  96. package/dist/adapters/http/ui/console-packages/module.mjs.map +1 -0
  97. package/dist/adapters/http/ui/console-packages/types.d.ts +12 -0
  98. package/dist/adapters/http/ui/console-packages/types.d.ts.map +1 -0
  99. package/dist/adapters/http/ui/console-packages/types.mjs +4 -0
  100. package/dist/adapters/http/ui/index.d.ts +5 -5
  101. package/dist/adapters/http/ui/index.d.ts.map +1 -1
  102. package/dist/adapters/http/ui/index.mjs +22 -5
  103. package/dist/adapters/http/ui/shared/html.d.ts +76 -0
  104. package/dist/adapters/http/ui/shared/html.d.ts.map +1 -0
  105. package/dist/adapters/http/ui/shared/html.mjs +103 -0
  106. package/dist/adapters/http/ui/shared/html.mjs.map +1 -0
  107. package/dist/adapters/http/ui/shared/index.d.ts +2 -0
  108. package/dist/adapters/http/ui/shared/index.d.ts.map +1 -0
  109. package/dist/adapters/http/ui/shared/index.mjs +5 -0
  110. package/dist/adapters/http/ui/theme/apply.d.ts +12 -0
  111. package/dist/adapters/http/ui/theme/apply.d.ts.map +1 -0
  112. package/dist/adapters/http/ui/theme/apply.mjs +29 -0
  113. package/dist/adapters/http/ui/theme/apply.mjs.map +1 -0
  114. package/dist/adapters/http/ui/theme/assets.d.ts +20 -0
  115. package/dist/adapters/http/ui/theme/assets.d.ts.map +1 -0
  116. package/dist/adapters/http/ui/theme/assets.mjs +86 -0
  117. package/dist/adapters/http/ui/theme/assets.mjs.map +1 -0
  118. package/dist/adapters/http/ui/theme/constants.d.ts +16 -0
  119. package/dist/adapters/http/ui/theme/constants.d.ts.map +1 -0
  120. package/dist/adapters/http/ui/theme/constants.mjs +20 -0
  121. package/dist/adapters/http/ui/theme/constants.mjs.map +1 -0
  122. package/dist/adapters/http/ui/theme/contract/constants.d.ts +120 -0
  123. package/dist/adapters/http/ui/theme/contract/constants.d.ts.map +1 -0
  124. package/dist/adapters/http/ui/theme/contract/constants.mjs +136 -0
  125. package/dist/adapters/http/ui/theme/contract/constants.mjs.map +1 -0
  126. package/dist/adapters/http/ui/theme/contract/head.d.ts +12 -0
  127. package/dist/adapters/http/ui/theme/contract/head.d.ts.map +1 -0
  128. package/dist/adapters/http/ui/theme/contract/head.mjs +61 -0
  129. package/dist/adapters/http/ui/theme/contract/head.mjs.map +1 -0
  130. package/dist/adapters/http/ui/theme/contract/index.d.ts +6 -0
  131. package/dist/adapters/http/ui/theme/contract/index.d.ts.map +1 -0
  132. package/dist/adapters/http/ui/theme/contract/index.mjs +8 -0
  133. package/dist/adapters/http/ui/theme/contract/manifest.d.ts +25 -0
  134. package/dist/adapters/http/ui/theme/contract/manifest.d.ts.map +1 -0
  135. package/dist/adapters/http/ui/theme/contract/manifest.mjs +77 -0
  136. package/dist/adapters/http/ui/theme/contract/manifest.mjs.map +1 -0
  137. package/dist/adapters/http/ui/theme/contract/types.d.ts +26 -0
  138. package/dist/adapters/http/ui/theme/contract/types.d.ts.map +1 -0
  139. package/dist/adapters/http/ui/theme/contract/types.mjs +4 -0
  140. package/dist/adapters/http/ui/theme/contract/utils.d.ts +11 -0
  141. package/dist/adapters/http/ui/theme/contract/utils.d.ts.map +1 -0
  142. package/dist/adapters/http/ui/theme/contract/utils.mjs +22 -0
  143. package/dist/adapters/http/ui/theme/contract/utils.mjs.map +1 -0
  144. package/dist/adapters/http/ui/theme/index.d.ts +7 -0
  145. package/dist/adapters/http/ui/theme/index.d.ts.map +1 -0
  146. package/dist/adapters/http/ui/theme/index.mjs +13 -0
  147. package/dist/adapters/http/ui/theme/module.d.ts +79 -0
  148. package/dist/adapters/http/ui/theme/module.d.ts.map +1 -0
  149. package/dist/adapters/http/ui/theme/module.mjs +206 -0
  150. package/dist/adapters/http/ui/theme/module.mjs.map +1 -0
  151. package/dist/adapters/http/ui/theme/types.d.ts +42 -0
  152. package/dist/adapters/http/ui/theme/types.d.ts.map +1 -0
  153. package/dist/adapters/http/ui/theme/types.mjs +4 -0
  154. package/dist/app/index.mjs +3 -1
  155. package/dist/app/modules/authentication/module.mjs +6 -3
  156. package/dist/app/modules/authentication/module.mjs.map +1 -1
  157. package/dist/app/modules/config/constants.d.ts +5 -0
  158. package/dist/app/modules/config/constants.d.ts.map +1 -1
  159. package/dist/app/modules/config/constants.mjs +5 -0
  160. package/dist/app/modules/config/constants.mjs.map +1 -1
  161. package/dist/app/modules/config/helpers.mjs +3 -2
  162. package/dist/app/modules/config/helpers.mjs.map +1 -1
  163. package/dist/app/modules/config/normalize.d.ts.map +1 -1
  164. package/dist/app/modules/config/normalize.mjs +8 -0
  165. package/dist/app/modules/config/normalize.mjs.map +1 -1
  166. package/dist/app/modules/config/origins.d.ts.map +1 -1
  167. package/dist/app/modules/config/origins.mjs +2 -0
  168. package/dist/app/modules/config/origins.mjs.map +1 -1
  169. package/dist/app/modules/config/read/env.d.ts.map +1 -1
  170. package/dist/app/modules/config/read/env.mjs +10 -0
  171. package/dist/app/modules/config/read/env.mjs.map +1 -1
  172. package/dist/app/modules/config/read/module.mjs +8 -3
  173. package/dist/app/modules/config/read/module.mjs.map +1 -1
  174. package/dist/app/modules/config/types.d.ts +63 -3
  175. package/dist/app/modules/config/types.d.ts.map +1 -1
  176. package/dist/app/modules/config/validator.d.ts.map +1 -1
  177. package/dist/app/modules/config/validator.mjs +5 -0
  178. package/dist/app/modules/config/validator.mjs.map +1 -1
  179. package/dist/app/modules/database/module.mjs +2 -1
  180. package/dist/app/modules/database/module.mjs.map +1 -1
  181. package/dist/app/modules/http/module.d.ts.map +1 -1
  182. package/dist/app/modules/http/module.mjs +7 -1
  183. package/dist/app/modules/http/module.mjs.map +1 -1
  184. package/dist/app/modules/http/modules/controller.d.ts +2 -1
  185. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  186. package/dist/app/modules/http/modules/controller.mjs +214 -128
  187. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  188. package/dist/app/modules/http/modules/middleware.d.ts +9 -1
  189. package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
  190. package/dist/app/modules/http/modules/middleware.mjs +28 -8
  191. package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
  192. package/dist/app/modules/identity/module.mjs +6 -3
  193. package/dist/app/modules/identity/module.mjs.map +1 -1
  194. package/dist/app/modules/index.mjs +3 -1
  195. package/dist/app/modules/oauth2/module.mjs +37 -17
  196. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  197. package/dist/app/modules/oauth2/repositories/authorize/state/repository.mjs +1 -1
  198. package/dist/app/modules/oauth2/repositories/authorize/state/repository.mjs.map +1 -1
  199. package/dist/app/modules/oauth2/repositories/token/repository.mjs +1 -1
  200. package/dist/app/modules/oauth2/repositories/token/repository.mjs.map +1 -1
  201. package/dist/app/modules/provisioning/constants.d.ts +12 -0
  202. package/dist/app/modules/provisioning/constants.d.ts.map +1 -0
  203. package/dist/app/modules/provisioning/constants.mjs +16 -0
  204. package/dist/app/modules/provisioning/constants.mjs.map +1 -0
  205. package/dist/app/modules/provisioning/index.d.ts +2 -0
  206. package/dist/app/modules/provisioning/index.d.ts.map +1 -1
  207. package/dist/app/modules/provisioning/index.mjs +3 -1
  208. package/dist/app/modules/provisioning/lazy-wildcard.d.ts +15 -0
  209. package/dist/app/modules/provisioning/lazy-wildcard.d.ts.map +1 -0
  210. package/dist/app/modules/provisioning/lazy-wildcard.mjs +23 -0
  211. package/dist/app/modules/provisioning/lazy-wildcard.mjs.map +1 -0
  212. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  213. package/dist/app/modules/provisioning/module.mjs +30 -11
  214. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  215. package/dist/app/modules/provisioning/sources/composite/module.d.ts +0 -19
  216. package/dist/app/modules/provisioning/sources/composite/module.d.ts.map +1 -1
  217. package/dist/app/modules/provisioning/sources/composite/module.mjs +7 -77
  218. package/dist/app/modules/provisioning/sources/composite/module.mjs.map +1 -1
  219. package/dist/app/modules/provisioning/sources/file/module.d.ts.map +1 -1
  220. package/dist/app/modules/provisioning/sources/file/module.mjs +11 -2
  221. package/dist/app/modules/provisioning/sources/file/module.mjs.map +1 -1
  222. package/dist/core/authentication/session/module.mjs +2 -4
  223. package/dist/core/authentication/session/module.mjs.map +1 -1
  224. package/dist/core/entities/client/index.d.ts +1 -1
  225. package/dist/core/entities/client/index.d.ts.map +1 -1
  226. package/dist/core/entities/client/index.mjs +2 -2
  227. package/dist/core/entities/client/service.d.ts.map +1 -1
  228. package/dist/core/entities/client/service.mjs +1 -1
  229. package/dist/core/entities/client/service.mjs.map +1 -1
  230. package/dist/core/entities/client/system-clients.d.ts +95 -0
  231. package/dist/core/entities/client/system-clients.d.ts.map +1 -0
  232. package/dist/core/entities/client/system-clients.mjs +158 -0
  233. package/dist/core/entities/client/system-clients.mjs.map +1 -0
  234. package/dist/core/entities/client/types.d.ts +17 -4
  235. package/dist/core/entities/client/types.d.ts.map +1 -1
  236. package/dist/core/entities/client-permission/service.mjs +12 -9
  237. package/dist/core/entities/client-permission/service.mjs.map +1 -1
  238. package/dist/core/entities/index.mjs +2 -2
  239. package/dist/core/entities/key/service.mjs +4 -2
  240. package/dist/core/entities/key/service.mjs.map +1 -1
  241. package/dist/core/entities/permission/service.d.ts.map +1 -1
  242. package/dist/core/entities/permission/service.mjs +1 -1
  243. package/dist/core/entities/permission/service.mjs.map +1 -1
  244. package/dist/core/entities/policy/service.d.ts.map +1 -1
  245. package/dist/core/entities/policy/service.mjs +3 -2
  246. package/dist/core/entities/policy/service.mjs.map +1 -1
  247. package/dist/core/entities/realm/service.d.ts +8 -6
  248. package/dist/core/entities/realm/service.d.ts.map +1 -1
  249. package/dist/core/entities/realm/service.mjs +6 -9
  250. package/dist/core/entities/realm/service.mjs.map +1 -1
  251. package/dist/core/entities/role/service.d.ts.map +1 -1
  252. package/dist/core/entities/role/service.mjs +1 -1
  253. package/dist/core/entities/role/service.mjs.map +1 -1
  254. package/dist/core/entities/role-permission/service.mjs +12 -9
  255. package/dist/core/entities/role-permission/service.mjs.map +1 -1
  256. package/dist/core/entities/scope/service.d.ts.map +1 -1
  257. package/dist/core/entities/scope/service.mjs +1 -1
  258. package/dist/core/entities/scope/service.mjs.map +1 -1
  259. package/dist/core/entities/user/service.d.ts.map +1 -1
  260. package/dist/core/entities/user/service.mjs +1 -1
  261. package/dist/core/entities/user/service.mjs.map +1 -1
  262. package/dist/core/entities/user-authenticator/helpers.mjs +1 -1
  263. package/dist/core/entities/user-authenticator/helpers.mjs.map +1 -1
  264. package/dist/core/entities/user-authenticator/service.mjs +7 -7
  265. package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
  266. package/dist/core/entities/user-permission/service.mjs +12 -9
  267. package/dist/core/entities/user-permission/service.mjs.map +1 -1
  268. package/dist/core/identity/password-recovery/service.mjs +1 -1
  269. package/dist/core/identity/password-recovery/service.mjs.map +1 -1
  270. package/dist/core/index.mjs +6 -2
  271. package/dist/core/key/types.d.ts +2 -1
  272. package/dist/core/key/types.d.ts.map +1 -1
  273. package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
  274. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +2 -2
  275. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
  276. package/dist/core/oauth2/end-session/service.d.ts.map +1 -1
  277. package/dist/core/oauth2/end-session/service.mjs +2 -2
  278. package/dist/core/oauth2/end-session/service.mjs.map +1 -1
  279. package/dist/core/provisioning/constants.d.ts +8 -0
  280. package/dist/core/provisioning/constants.d.ts.map +1 -0
  281. package/dist/core/provisioning/constants.mjs +14 -0
  282. package/dist/core/provisioning/constants.mjs.map +1 -0
  283. package/dist/core/provisioning/entities/index.mjs +2 -1
  284. package/dist/core/provisioning/entities/realm/index.d.ts +1 -0
  285. package/dist/core/provisioning/entities/realm/index.d.ts.map +1 -1
  286. package/dist/core/provisioning/entities/realm/index.mjs +2 -1
  287. package/dist/core/provisioning/entities/realm/validator.d.ts +11 -0
  288. package/dist/core/provisioning/entities/realm/validator.d.ts.map +1 -1
  289. package/dist/core/provisioning/entities/realm/validator.mjs +14 -0
  290. package/dist/core/provisioning/entities/realm/validator.mjs.map +1 -1
  291. package/dist/core/provisioning/entities/realm/wildcard-validator.d.ts +19 -0
  292. package/dist/core/provisioning/entities/realm/wildcard-validator.d.ts.map +1 -0
  293. package/dist/core/provisioning/entities/realm/wildcard-validator.mjs +65 -0
  294. package/dist/core/provisioning/entities/realm/wildcard-validator.mjs.map +1 -0
  295. package/dist/core/provisioning/index.d.ts +3 -0
  296. package/dist/core/provisioning/index.d.ts.map +1 -1
  297. package/dist/core/provisioning/index.mjs +7 -1
  298. package/dist/core/provisioning/merge/index.d.ts +3 -0
  299. package/dist/core/provisioning/merge/index.d.ts.map +1 -0
  300. package/dist/core/provisioning/merge/index.mjs +5 -0
  301. package/dist/core/provisioning/merge/module.d.ts +18 -0
  302. package/dist/core/provisioning/merge/module.d.ts.map +1 -0
  303. package/dist/core/provisioning/merge/module.mjs +82 -0
  304. package/dist/core/provisioning/merge/module.mjs.map +1 -0
  305. package/dist/core/provisioning/merge/types.d.ts +34 -0
  306. package/dist/core/provisioning/merge/types.d.ts.map +1 -0
  307. package/dist/core/provisioning/merge/types.mjs +4 -0
  308. package/dist/core/provisioning/synchronizer/client/module.mjs +0 -1
  309. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  310. package/dist/core/provisioning/synchronizer/permission/module.mjs +0 -1
  311. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  312. package/dist/core/provisioning/synchronizer/realm/module.mjs +0 -1
  313. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  314. package/dist/core/provisioning/synchronizer/role/module.mjs +0 -1
  315. package/dist/core/provisioning/synchronizer/role/module.mjs.map +1 -1
  316. package/dist/core/provisioning/synchronizer/scope/module.mjs +0 -1
  317. package/dist/core/provisioning/synchronizer/scope/module.mjs.map +1 -1
  318. package/dist/core/provisioning/synchronizer/user/module.mjs +0 -1
  319. package/dist/core/provisioning/synchronizer/user/module.mjs.map +1 -1
  320. package/dist/core/provisioning/types.d.ts +10 -0
  321. package/dist/core/provisioning/types.d.ts.map +1 -1
  322. package/dist/core/provisioning/wildcard/index.d.ts +3 -0
  323. package/dist/core/provisioning/wildcard/index.d.ts.map +1 -0
  324. package/dist/core/provisioning/wildcard/index.mjs +5 -0
  325. package/dist/core/provisioning/wildcard/module.d.ts +53 -0
  326. package/dist/core/provisioning/wildcard/module.d.ts.map +1 -0
  327. package/dist/core/provisioning/wildcard/module.mjs +91 -0
  328. package/dist/core/provisioning/wildcard/module.mjs.map +1 -0
  329. package/dist/core/provisioning/wildcard/types.d.ts +19 -0
  330. package/dist/core/provisioning/wildcard/types.d.ts.map +1 -0
  331. package/dist/core/provisioning/wildcard/types.mjs +4 -0
  332. package/dist/index.mjs +5 -1
  333. package/dist/path.d.ts +0 -2
  334. package/dist/path.d.ts.map +1 -1
  335. package/dist/path.mjs +1 -3
  336. package/dist/path.mjs.map +1 -1
  337. package/dist/swagger.json +485 -17
  338. package/package.json +26 -63
  339. package/dist/adapters/http/ui/base-path.d.ts +0 -9
  340. package/dist/adapters/http/ui/base-path.d.ts.map +0 -1
  341. package/dist/adapters/http/ui/base-path.mjs +0 -18
  342. package/dist/adapters/http/ui/base-path.mjs.map +0 -1
  343. package/dist/adapters/http/ui/internal-http-client.d.ts.map +0 -1
  344. package/dist/adapters/http/ui/internal-http-client.mjs.map +0 -1
  345. package/dist/adapters/http/ui/render.d.ts +0 -4
  346. package/dist/adapters/http/ui/render.d.ts.map +0 -1
  347. package/dist/adapters/http/ui/render.mjs +0 -63
  348. package/dist/adapters/http/ui/render.mjs.map +0 -1
  349. package/dist/adapters/http/ui/serve.d.ts.map +0 -1
  350. package/dist/adapters/http/ui/serve.mjs.map +0 -1
  351. package/dist/adapters/http/ui/types.d.ts +0 -20
  352. package/dist/adapters/http/ui/types.d.ts.map +0 -1
  353. package/dist/core/entities/client/web-client.d.ts +0 -72
  354. package/dist/core/entities/client/web-client.d.ts.map +0 -1
  355. package/dist/core/entities/client/web-client.mjs +0 -123
  356. package/dist/core/entities/client/web-client.mjs.map +0 -1
  357. package/dist/ui/client/.vite/ssr-manifest.json +0 -54812
  358. package/dist/ui/client/assets/asap-latin-400-normal-Dc37g3Il.woff +0 -0
  359. package/dist/ui/client/assets/asap-latin-400-normal-DnZ1MOsG.woff2 +0 -0
  360. package/dist/ui/client/assets/asap-latin-700-normal-Dqcopq14.woff +0 -0
  361. package/dist/ui/client/assets/asap-latin-700-normal-l2Y8pi-F.woff2 +0 -0
  362. package/dist/ui/client/assets/asap-latin-ext-400-normal-C-fcRdtE.woff +0 -0
  363. package/dist/ui/client/assets/asap-latin-ext-400-normal-DwYtpHbV.woff2 +0 -0
  364. package/dist/ui/client/assets/asap-latin-ext-700-normal-D00OESsZ.woff +0 -0
  365. package/dist/ui/client/assets/asap-latin-ext-700-normal-y8bo5aW5.woff2 +0 -0
  366. package/dist/ui/client/assets/asap-vietnamese-400-normal-DGyJlJLT.woff2 +0 -0
  367. package/dist/ui/client/assets/asap-vietnamese-400-normal-lfLaoF2x.woff +0 -0
  368. package/dist/ui/client/assets/asap-vietnamese-700-normal-B-e19ug5.woff +0 -0
  369. package/dist/ui/client/assets/asap-vietnamese-700-normal-D-SxY94i.woff2 +0 -0
  370. package/dist/ui/client/assets/index-Bk6-OZy9.css +0 -2
  371. package/dist/ui/client/assets/index-DO6_7NTJ.js +0 -106
  372. package/dist/ui/client/assets/nunito-cyrillic-300-normal-BPQV259B.woff2 +0 -0
  373. package/dist/ui/client/assets/nunito-cyrillic-300-normal-g5qSsvc0.woff +0 -0
  374. package/dist/ui/client/assets/nunito-cyrillic-400-normal-D1j0u8EH.woff +0 -0
  375. package/dist/ui/client/assets/nunito-cyrillic-400-normal-xAOo5cBP.woff2 +0 -0
  376. package/dist/ui/client/assets/nunito-cyrillic-600-normal-BUjmtIuu.woff +0 -0
  377. package/dist/ui/client/assets/nunito-cyrillic-600-normal-DJGQ2h05.woff2 +0 -0
  378. package/dist/ui/client/assets/nunito-cyrillic-700-normal-DP36NgGt.woff2 +0 -0
  379. package/dist/ui/client/assets/nunito-cyrillic-700-normal-DfHRUDv-.woff +0 -0
  380. package/dist/ui/client/assets/nunito-cyrillic-ext-300-normal-BDHtqmCR.woff +0 -0
  381. package/dist/ui/client/assets/nunito-cyrillic-ext-300-normal-ChMQLIrm.woff2 +0 -0
  382. package/dist/ui/client/assets/nunito-cyrillic-ext-400-normal-CuPM9foi.woff2 +0 -0
  383. package/dist/ui/client/assets/nunito-cyrillic-ext-400-normal-xaE7D4Sw.woff +0 -0
  384. package/dist/ui/client/assets/nunito-cyrillic-ext-600-normal-CWPPjBOD.woff2 +0 -0
  385. package/dist/ui/client/assets/nunito-cyrillic-ext-600-normal-vnfu4DTE.woff +0 -0
  386. package/dist/ui/client/assets/nunito-cyrillic-ext-700-normal-BuR0mlCG.woff2 +0 -0
  387. package/dist/ui/client/assets/nunito-cyrillic-ext-700-normal-DfoqN4Gs.woff +0 -0
  388. package/dist/ui/client/assets/nunito-latin-300-normal-C3ZIKvzv.woff +0 -0
  389. package/dist/ui/client/assets/nunito-latin-300-normal-COoPE5VN.woff2 +0 -0
  390. package/dist/ui/client/assets/nunito-latin-400-normal-DKg4f3fz.woff +0 -0
  391. package/dist/ui/client/assets/nunito-latin-400-normal-r8SDr6Up.woff2 +0 -0
  392. package/dist/ui/client/assets/nunito-latin-600-normal-Br8yIETf.woff2 +0 -0
  393. package/dist/ui/client/assets/nunito-latin-600-normal-Cd0eNu1l.woff +0 -0
  394. package/dist/ui/client/assets/nunito-latin-700-normal-Dort48En.woff2 +0 -0
  395. package/dist/ui/client/assets/nunito-latin-700-normal-OcDqTBcA.woff +0 -0
  396. package/dist/ui/client/assets/nunito-latin-ext-300-normal-D1SyVuPt.woff2 +0 -0
  397. package/dist/ui/client/assets/nunito-latin-ext-300-normal-DfqbmdMl.woff +0 -0
  398. package/dist/ui/client/assets/nunito-latin-ext-400-normal-CjMJVfGn.woff +0 -0
  399. package/dist/ui/client/assets/nunito-latin-ext-400-normal-i-8OOpdj.woff2 +0 -0
  400. package/dist/ui/client/assets/nunito-latin-ext-600-normal-BKUpuB78.woff +0 -0
  401. package/dist/ui/client/assets/nunito-latin-ext-600-normal-Dd9Zuxh1.woff2 +0 -0
  402. package/dist/ui/client/assets/nunito-latin-ext-700-normal-BWeMsAzO.woff2 +0 -0
  403. package/dist/ui/client/assets/nunito-latin-ext-700-normal-D4woHhbd.woff +0 -0
  404. package/dist/ui/client/assets/nunito-vietnamese-300-normal-DATld5Vw.woff +0 -0
  405. package/dist/ui/client/assets/nunito-vietnamese-300-normal-mLneKULB.woff2 +0 -0
  406. package/dist/ui/client/assets/nunito-vietnamese-400-normal-BHkVbP3T.woff2 +0 -0
  407. package/dist/ui/client/assets/nunito-vietnamese-400-normal-DtOtW02z.woff +0 -0
  408. package/dist/ui/client/assets/nunito-vietnamese-600-normal-BY8O6Cug.woff2 +0 -0
  409. package/dist/ui/client/assets/nunito-vietnamese-600-normal-DO1RqFw5.woff +0 -0
  410. package/dist/ui/client/assets/nunito-vietnamese-700-normal-C9SQsXvj.woff +0 -0
  411. package/dist/ui/client/assets/nunito-vietnamese-700-normal-Ch8EUCfz.woff2 +0 -0
  412. package/dist/ui/client/index.html +0 -22
  413. package/dist/ui/server/assets/multipart-parser-BCMy8Xwv.js +0 -181
  414. package/dist/ui/server/assets/multipart-parser-BVY8pIV2.js +0 -176
  415. package/dist/ui/server/server.js +0 -158420
  416. /package/dist/adapters/http/{ui → middleware/built-in}/types.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["DContext","DController","DGet","DTags","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","UserInfoController","service","ctx","get","event","actor","id","identity","type","data","getOne"],"sources":["../../../../../../src/adapters/http/controllers/workflows/userinfo/module.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 {\n DContext,\n DController,\n DGet,\n DTags,\n} from '@routup/decorators';\nimport type { IAppEvent } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { User } from '@authup/core-kit';\nimport type { IUserService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type UserInfoControllerContext = {\n service: IUserService,\n};\n\n/**\n * The OIDC userinfo endpoint (advertised via discovery). It serves the\n * authenticated user's own record as a FLAT claims document — it must\n * never adopt the `{ data, meta }` entity-record envelope, which is why\n * it is a dedicated route instead of an alias of `GET /users/@me`.\n */\n@DTags('auth')\n@DController('/userinfo')\nexport class UserInfoController {\n protected service: IUserService;\n\n constructor(ctx: UserInfoControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async get(\n @DContext() event: IAppEvent,\n ): Promise<User> {\n const actor = buildActorContext(event);\n\n let id = '@me';\n if (\n actor.identity &&\n actor.identity.type === 'user'\n ) {\n id = actor.identity.data.id;\n }\n\n return this.service.getOne(id, actor, useRequestQuery(event));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAaO,qBAAb,MAAaA;CACCC;CAEV,YAAYC,KAAgC;EACxC,KAAKD,UAAUC,IAAID;CACvB;CAEA,MACME,IACF,OACa;EACb,MAAME,QAAQN,kBAAkBK,KAAAA;EAEhC,IAAIE,KAAK;EACT,IACID,MAAME,YACNF,MAAME,SAASC,SAAS,QAExBF,KAAKD,MAAME,SAASE,KAAKH;EAG7B,OAAO,KAAKL,QAAQS,OAAOJ,IAAID,OAAOR,gBAAgBO,KAAAA,CAAAA;CAC1D;AACJ;;CAhBeN,KAAAA,IAAAA,CAAAA,uBAAAA,CAAAA"}
1
+ {"version":3,"file":"module.mjs","names":["DContext","DController","DGet","DTags","useRequestQuery","ForceLoggedInMiddleware","buildActorContext","UserInfoController","service","ctx","get","event","actor","id","identity","type","data","query","getOne","fields"],"sources":["../../../../../../src/adapters/http/controllers/workflows/userinfo/module.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 {\n DContext,\n DController,\n DGet,\n DTags,\n} from '@routup/decorators';\nimport type { IAppEvent } from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { User } from '@authup/core-kit';\nimport type { IUserService } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { buildActorContext } from '../../../request/index.ts';\n\nexport type UserInfoControllerContext = {\n service: IUserService,\n};\n\n/**\n * The OIDC userinfo endpoint (advertised via discovery). It serves the\n * authenticated user's own record as a FLAT claims document — it must\n * never adopt the `{ data, meta }` entity-record envelope, which is why\n * it is a dedicated route instead of an alias of `GET /users/@me`.\n */\n@DTags('auth')\n@DController('/userinfo')\nexport class UserInfoController {\n protected service: IUserService;\n\n constructor(ctx: UserInfoControllerContext) {\n this.service = ctx.service;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async get(\n @DContext() event: IAppEvent,\n ): Promise<User> {\n const actor = buildActorContext(event);\n\n let id = '@me';\n if (\n actor.identity &&\n actor.identity.type === 'user'\n ) {\n id = actor.identity.data.id;\n }\n\n // `email` is a standard OIDC claim, but the column is `select: false`\n // (opt-in projection), so the default field set leaves it out and the\n // claims document arrives without it. This endpoint only ever serves\n // the CALLER'S OWN record, so the claim rides on top of the defaults.\n // A caller stating its own `fields` keeps full control: the opt-in\n // stays opt-in wherever the projection is explicit.\n const query = useRequestQuery(event);\n\n return this.service.getOne(id, actor, {\n ...query,\n fields: query.fields || '+email',\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAaO,qBAAb,MAAaA;CACCC;CAEV,YAAYC,KAAgC;EACxC,KAAKD,UAAUC,IAAID;CACvB;CAEA,MACME,IACF,OACa;EACb,MAAME,QAAQN,kBAAkBK,KAAAA;EAEhC,IAAIE,KAAK;EACT,IACID,MAAME,YACNF,MAAME,SAASC,SAAS,QAExBF,KAAKD,MAAME,SAASE,KAAKH;EAS7B,MAAMI,QAAQb,gBAAgBO,KAAAA;EAE9B,OAAO,KAAKH,QAAQU,OAAOL,IAAID,OAAO;GAClC,GAAGK;GACHE,QAAQF,MAAME,UAAU;EAC5B,CAAA;CACJ;AACJ;;CA3Bed,KAAAA,IAAAA,CAAAA,uBAAAA,CAAAA"}
@@ -25,6 +25,7 @@ import { ForceLoggedInMiddleware } from "./middleware/built-in/loggedin/module.m
25
25
  import { ForceUserLoggedInMiddleware } from "./middleware/built-in/loggedin/user.mjs";
26
26
  import { RealmResolverMiddleware } from "./middleware/built-in/realm-resolver/module.mjs";
27
27
  import { createRealmResolverMiddleware } from "./middleware/built-in/realm-resolver/factory.mjs";
28
+ import { THEME_STORE_KEY, registerThemeMiddleware, useRequestTheme } from "./middleware/built-in/theme.mjs";
28
29
  import { VITE_SERVER_STORE_KEY, registerAssetsMiddleware } from "./middleware/built-in/assets.mjs";
29
30
  import { registerBasicMiddleware } from "./middleware/built-in/basic.mjs";
30
31
  import { registerCorsMiddleware } from "./middleware/built-in/cors.mjs";
@@ -60,6 +61,7 @@ import { IdentityProviderRoleMappingController } from "./controllers/entities/id
60
61
  import { KeyController } from "./controllers/entities/key/module.mjs";
61
62
  import { PermissionController } from "./controllers/entities/permission/module.mjs";
62
63
  import { PermissionPolicyController } from "./controllers/entities/permission-policy/module.mjs";
64
+ import { AccountController } from "./controllers/workflows/account/module.mjs";
63
65
  import { ActivateController } from "./controllers/workflows/activate/module.mjs";
64
66
  import { AuthenticatorChallengeController } from "./controllers/workflows/authenticator-challenge/module.mjs";
65
67
  import { AuthorizeController } from "./controllers/workflows/authorize/module.mjs";
@@ -94,4 +96,4 @@ import { UserPermissionRequestValidator } from "./controllers/entities/user-perm
94
96
  import { UserRoleController } from "./controllers/entities/user-role/module.mjs";
95
97
  import { UserRoleRequestValidator } from "./controllers/entities/user-role/utils/validation.mjs";
96
98
  import "./controllers/index.mjs";
97
- export { ActivateController, AuthenticatorChallengeController, AuthorizationMiddleware, AuthorizeController, CERTIFICATE_SOURCES, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ConsentController, EventController, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, KeyController, LOCALE_COOKIE, LogoutController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RealmResolverMiddleware, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, SessionController, StatusController, TokenController, TrustAnchorController, UI_HTTP_CLIENT_FACTORY_STORE_KEY, UserAttributeController, UserAttributeRequestValidator, UserAuthenticatorController, UserController, UserInfoController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, VITE_SERVER_STORE_KEY, applyRouteRealmIDToBody, buildActorContext, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRequestEventContextMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, extractClientCertificateEvidence, extractClientCredentialsFromRequest, extractOAuth2ClientCertificateEvidence, getBodyRealmID, getJwkRouteHandler, getJwksRouteHandler, getRequestParamID, getRequestRealmID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, readFromLocations, readRealmHint, readStringField, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerUIHttpClientMiddleware, runWithRequestEventContext, sanitizeRelativeRedirect, setRequestIdentity, setRequestMfaLoginTicket, setRequestPermissionEvaluator, setRequestRealmID, setRequestScopes, setRequestSessionId, setRequestToken, useRequestEventContext, useRequestIdentity, useRequestIdentityOrFail, useRequestLocale, useRequestMfaLoginTicket, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestSessionId, useRequestToken };
99
+ export { AccountController, ActivateController, AuthenticatorChallengeController, AuthorizationMiddleware, AuthorizeController, CERTIFICATE_SOURCES, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ConsentController, EventController, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, KeyController, LOCALE_COOKIE, LogoutController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RealmResolverMiddleware, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, SessionController, StatusController, THEME_STORE_KEY, TokenController, TrustAnchorController, UI_HTTP_CLIENT_FACTORY_STORE_KEY, UserAttributeController, UserAttributeRequestValidator, UserAuthenticatorController, UserController, UserInfoController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, VITE_SERVER_STORE_KEY, applyRouteRealmIDToBody, buildActorContext, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRequestEventContextMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, extractClientCertificateEvidence, extractClientCredentialsFromRequest, extractOAuth2ClientCertificateEvidence, getBodyRealmID, getJwkRouteHandler, getJwksRouteHandler, getRequestParamID, getRequestRealmID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, readFromLocations, readRealmHint, readStringField, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerThemeMiddleware, registerUIHttpClientMiddleware, runWithRequestEventContext, sanitizeRelativeRedirect, setRequestIdentity, setRequestMfaLoginTicket, setRequestPermissionEvaluator, setRequestRealmID, setRequestScopes, setRequestSessionId, setRequestToken, useRequestEventContext, useRequestIdentity, useRequestIdentityOrFail, useRequestLocale, useRequestMfaLoginTicket, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestSessionId, useRequestTheme, useRequestToken };
@@ -1,4 +1,11 @@
1
1
  import type { App } from 'routup';
2
+ import type { ViteDevServer } from 'vite';
3
+ import type { AssetsMiddlewareOptions } from './types.ts';
2
4
  export declare const VITE_SERVER_STORE_KEY: unique symbol;
3
- export declare function registerAssetsMiddleware(router: App): Promise<void>;
5
+ /**
6
+ * Returns the vite dev server it created (JIT mode only), so the caller can
7
+ * close it on teardown. It owns a file watcher and an HMR websocket, which
8
+ * outlive the http listener otherwise.
9
+ */
10
+ export declare function registerAssetsMiddleware(router: App, options?: AssetsMiddlewareOptions): Promise<ViteDevServer | undefined>;
4
11
  //# sourceMappingURL=assets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/assets.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAOlC,eAAO,MAAM,qBAAqB,eAAuB,CAAC;AAE1D,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,GAAG,iBAyCzD"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/assets.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIlC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAM1C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,eAAO,MAAM,qBAAqB,eAAuB,CAAC;AAE1D;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,GAAG,EACX,OAAO,GAAE,uBAA4B,GACrC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAgFrC"}
@@ -1,29 +1,53 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
- import { PACKAGE_PATH, UI_DIST_PATH, UI_SOURCE_PATH } from "../../../../path.mjs";
4
+ import { PACKAGE_PATH } from "../../../../path.mjs";
5
+ import { THEME_ASSET_MOUNT_PATH } from "../../ui/theme/contract/constants.mjs";
6
+ import { createThemeAssetsHandler } from "../../ui/theme/assets.mjs";
7
+ import { ThemeProvider } from "../../ui/theme/module.mjs";
8
+ import "../../ui/theme/index.mjs";
9
+ import { resolveAuthConsoleDistPath, resolveAuthConsolePackagePath } from "../../ui/auth-console/resolve.mjs";
10
+ import "../../ui/auth-console/index.mjs";
11
+ import { registerThemeMiddleware } from "./theme.mjs";
12
+ import { resolveAccountConsoleDistPath } from "../../ui/account-console/module.mjs";
13
+ import "../../ui/account-console/index.mjs";
14
+ import { InternalError } from "@authup/errors";
5
15
  import path from "node:path";
6
16
  import { defineCoreHandler } from "routup";
7
17
  import { CodeTransformation, isCodeTransformation } from "typeorm-extension";
8
18
  import { fromNodeMiddleware } from "routup/node";
9
19
  import { read } from "locter";
20
+ import fs from "node:fs";
10
21
  import { createHandler } from "@routup/assets";
11
22
  //#region src/adapters/http/middleware/built-in/assets.ts
12
23
  const VITE_SERVER_STORE_KEY = Symbol("ViteServer");
13
- async function registerAssetsMiddleware(router) {
24
+ /**
25
+ * Returns the vite dev server it created (JIT mode only), so the caller can
26
+ * close it on teardown. It owns a file watcher and an HMR websocket, which
27
+ * outlive the http listener otherwise.
28
+ */ async function registerAssetsMiddleware(router, options = {}) {
29
+ await registerThemeAssets(router, options);
30
+ const accountDistPath = resolveAccountConsoleDistPath();
31
+ if (accountDistPath) router.use("account/assets", createHandler(path.posix.join(accountDistPath, "assets"), {
32
+ fallthrough: false,
33
+ scan: false
34
+ }));
14
35
  if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {
15
36
  router.use("public", createHandler(path.posix.join(PACKAGE_PATH, "public"), {
16
37
  fallthrough: true,
17
38
  scan: false
18
39
  }));
19
- router.use("public", createHandler(path.posix.join(UI_DIST_PATH, "client"), {
40
+ const authConsoleDistPath = resolveAuthConsoleDistPath();
41
+ if (authConsoleDistPath) router.use("public", createHandler(path.posix.join(authConsoleDistPath, "client"), {
20
42
  fallthrough: false,
21
43
  scan: false
22
44
  }));
23
45
  return;
24
46
  }
47
+ const authConsolePackagePath = resolveAuthConsolePackagePath();
48
+ if (!authConsolePackagePath) throw new InternalError("The auth console package (@authup/client-auth-console) is not installed.");
25
49
  const server = await (await read("vite")).createServer({
26
- root: UI_SOURCE_PATH,
50
+ root: authConsolePackagePath,
27
51
  base: "/public/",
28
52
  logLevel: "error",
29
53
  server: {
@@ -40,6 +64,26 @@ async function registerAssetsMiddleware(router) {
40
64
  event.store[VITE_SERVER_STORE_KEY] = server;
41
65
  return event.next();
42
66
  }));
67
+ return server;
68
+ }
69
+ /**
70
+ * Load the operator theme and mount its `assets/` directory at /theme.
71
+ *
72
+ * A missing directory disables the feature entirely: no provider is
73
+ * created, no middleware is registered, and both console serve paths keep
74
+ * returning byte-identical un-themed pages. So the default configuration
75
+ * pays nothing, not even a per-request core handler.
76
+ */ async function registerThemeAssets(router, options) {
77
+ const { themeDirectoryPath } = options;
78
+ if (!themeDirectoryPath || !fs.existsSync(themeDirectoryPath)) return;
79
+ const provider = new ThemeProvider({
80
+ directoryPath: themeDirectoryPath,
81
+ fragmentsEnabled: options.themeFragmentsEnabled,
82
+ logger: options.logger
83
+ });
84
+ await provider.load();
85
+ registerThemeMiddleware(router, provider);
86
+ router.use(THEME_ASSET_MOUNT_PATH, createThemeAssetsHandler(provider));
43
87
  }
44
88
  //#endregion
45
89
  export { VITE_SERVER_STORE_KEY, registerAssetsMiddleware };
@@ -1 +1 @@
1
- {"version":3,"file":"assets.mjs","names":["read","CodeTransformation","isCodeTransformation","createHandler","path","defineCoreHandler","fromNodeMiddleware","PACKAGE_PATH","UI_DIST_PATH","UI_SOURCE_PATH","VITE_SERVER_STORE_KEY","Symbol","registerAssetsMiddleware","router","JUST_IN_TIME","use","posix","join","fallthrough","scan","vite","server","createServer","root","base","logLevel","middlewareMode","watch","usePolling","interval","appType","middlewares","event","store","next"],"sources":["../../../../../src/adapters/http/middleware/built-in/assets.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 { read } from 'locter';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { createHandler } from '@routup/assets';\nimport path from 'node:path';\nimport type { App } from 'routup';\nimport { defineCoreHandler } from 'routup';\nimport { fromNodeMiddleware } from 'routup/node';\nimport type * as Vite from 'vite';\nimport type { ViteDevServer } from 'vite';\nimport { PACKAGE_PATH, UI_DIST_PATH, UI_SOURCE_PATH } from '../../../../path.ts';\n\nexport const VITE_SERVER_STORE_KEY = Symbol('ViteServer');\n\nexport async function registerAssetsMiddleware(router: App) {\n if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {\n router.use('public', createHandler(\n path.posix.join(PACKAGE_PATH, 'public'),\n {\n fallthrough: true,\n scan: false,\n },\n ));\n\n router.use('public', createHandler(\n path.posix.join(UI_DIST_PATH, 'client'),\n {\n fallthrough: false,\n scan: false,\n },\n ));\n return;\n }\n\n const vite = await read('vite') as typeof Vite;\n\n const server: ViteDevServer = await vite.createServer({\n root: UI_SOURCE_PATH,\n base: '/public/',\n logLevel: 'error',\n server: {\n middlewareMode: true,\n watch: {\n usePolling: true,\n interval: 100,\n },\n },\n appType: 'custom',\n });\n\n router.use('public', fromNodeMiddleware(server.middlewares));\n router.use(defineCoreHandler((event) => {\n event.store[VITE_SERVER_STORE_KEY] = server;\n return event.next();\n }));\n}\n"],"mappings":";;;;;;;;;;;AAkBA,MAAaU,wBAAwBC,OAAO,YAAA;AAE5C,eAAsBC,yBAAyBC,QAAW;CACtD,IAAI,CAACX,qBAAqBD,mBAAmBa,YAAY,GAAG;EACxDD,OAAOE,IAAI,UAAUZ,cACjBC,KAAKY,MAAMC,KAAKV,cAAc,QAAA,GAC9B;GACIW,aAAa;GACbC,MAAM;EACV,CAAA,CAAA;EAGJN,OAAOE,IAAI,UAAUZ,cACjBC,KAAKY,MAAMC,KAAKT,cAAc,QAAA,GAC9B;GACIU,aAAa;GACbC,MAAM;EACV,CAAA,CAAA;EAEJ;CACJ;CAIA,MAAME,SAAwB,OAAMD,MAFjBpB,KAAK,MAAA,EAAA,CAEiBsB,aAAa;EAClDC,MAAMd;EACNe,MAAM;EACNC,UAAU;EACVJ,QAAQ;GACJK,gBAAgB;GAChBC,OAAO;IACHC,YAAY;IACZC,UAAU;GACd;EACJ;EACAC,SAAS;CACb,CAAA;CAEAjB,OAAOE,IAAI,UAAUT,mBAAmBe,OAAOU,WAAW,CAAA;CAC1DlB,OAAOE,IAAIV,mBAAmB2B,UAAAA;EAC1BA,MAAMC,MAAMvB,yBAAyBW;EACrC,OAAOW,MAAME,KAAI;CACrB,CAAA,CAAA;AACJ"}
1
+ {"version":3,"file":"assets.mjs","names":["InternalError","read","CodeTransformation","isCodeTransformation","createHandler","fs","path","defineCoreHandler","fromNodeMiddleware","PACKAGE_PATH","resolveAccountConsoleDistPath","resolveAuthConsoleDistPath","resolveAuthConsolePackagePath","THEME_ASSET_MOUNT_PATH","ThemeProvider","createThemeAssetsHandler","registerThemeMiddleware","VITE_SERVER_STORE_KEY","Symbol","registerAssetsMiddleware","router","options","registerThemeAssets","accountDistPath","use","posix","join","fallthrough","scan","JUST_IN_TIME","authConsoleDistPath","undefined","authConsolePackagePath","vite","server","createServer","root","base","logLevel","middlewareMode","watch","usePolling","interval","appType","middlewares","event","store","next","themeDirectoryPath","existsSync","provider","directoryPath","fragmentsEnabled","themeFragmentsEnabled","logger","load"],"sources":["../../../../../src/adapters/http/middleware/built-in/assets.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 { InternalError } from '@authup/errors';\nimport { read } from 'locter';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { createHandler } from '@routup/assets';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { App } from 'routup';\nimport { defineCoreHandler } from 'routup';\nimport { fromNodeMiddleware } from 'routup/node';\nimport type * as Vite from 'vite';\nimport type { ViteDevServer } from 'vite';\nimport { PACKAGE_PATH } from '../../../../path.ts';\nimport { resolveAccountConsoleDistPath } from '../../ui/account-console/index.ts';\nimport { resolveAuthConsoleDistPath, resolveAuthConsolePackagePath } from '../../ui/auth-console/index.ts';\nimport { THEME_ASSET_MOUNT_PATH, ThemeProvider, createThemeAssetsHandler } from '../../ui/theme/index.ts';\nimport { registerThemeMiddleware } from './theme.ts';\nimport type { AssetsMiddlewareOptions } from './types.ts';\n\nexport const VITE_SERVER_STORE_KEY = Symbol('ViteServer');\n\n/**\n * Returns the vite dev server it created (JIT mode only), so the caller can\n * close it on teardown. It owns a file watcher and an HMR websocket, which\n * outlive the http listener otherwise.\n */\nexport async function registerAssetsMiddleware(\n router: App,\n options: AssetsMiddlewareOptions = {},\n) : Promise<ViteDevServer | undefined> {\n // Mounted FIRST, and outside the JIT early-return below, so an\n // operator theme applies in dev mode too. An invalid manifest throws\n // here and fails the boot.\n await registerThemeAssets(router, options);\n\n // Static assets of the account console SPA (its fixed vite base is\n // /account/). Served in dev mode too — the bundle is prebuilt, not\n // vite-transformed. A missing bundle only disables the mount; the page\n // route reports the actionable error.\n const accountDistPath = resolveAccountConsoleDistPath();\n if (accountDistPath) {\n router.use('account/assets', createHandler(\n path.posix.join(accountDistPath, 'assets'),\n {\n fallthrough: false,\n scan: false,\n },\n ));\n }\n\n if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {\n router.use('public', createHandler(\n path.posix.join(PACKAGE_PATH, 'public'),\n {\n fallthrough: true,\n scan: false,\n },\n ));\n\n // Static assets of the auth console SSR bundle (its fixed vite base\n // is /public/). A missing bundle only disables the mount; the page\n // routes report the actionable error.\n const authConsoleDistPath = resolveAuthConsoleDistPath();\n if (authConsoleDistPath) {\n router.use('public', createHandler(\n path.posix.join(authConsoleDistPath, 'client'),\n {\n fallthrough: false,\n scan: false,\n },\n ));\n }\n return undefined;\n }\n\n // JIT (dev) mode serves the auth console straight from the package\n // SOURCE directory (the workspace symlink carries index.html + src/ +\n // vite.config.ts; a published install has no JIT). Vite auto-loads the\n // package's own vite.config.ts from the root.\n const authConsolePackagePath = resolveAuthConsolePackagePath();\n if (!authConsolePackagePath) {\n throw new InternalError(\n 'The auth console package (@authup/client-auth-console) is not installed.',\n );\n }\n\n const vite = await read('vite') as typeof Vite;\n\n const server: ViteDevServer = await vite.createServer({\n root: authConsolePackagePath,\n base: '/public/',\n logLevel: 'error',\n server: {\n middlewareMode: true,\n watch: {\n usePolling: true,\n interval: 100,\n },\n },\n appType: 'custom',\n });\n\n router.use('public', fromNodeMiddleware(server.middlewares));\n router.use(defineCoreHandler((event) => {\n event.store[VITE_SERVER_STORE_KEY] = server;\n return event.next();\n }));\n\n return server;\n}\n\n/**\n * Load the operator theme and mount its `assets/` directory at /theme.\n *\n * A missing directory disables the feature entirely: no provider is\n * created, no middleware is registered, and both console serve paths keep\n * returning byte-identical un-themed pages. So the default configuration\n * pays nothing, not even a per-request core handler.\n */\nasync function registerThemeAssets(router: App, options: AssetsMiddlewareOptions) : Promise<void> {\n const { themeDirectoryPath } = options;\n if (!themeDirectoryPath || !fs.existsSync(themeDirectoryPath)) {\n return;\n }\n\n const provider = new ThemeProvider({\n directoryPath: themeDirectoryPath,\n fragmentsEnabled: options.themeFragmentsEnabled,\n logger: options.logger,\n });\n\n await provider.load();\n\n registerThemeMiddleware(router, provider);\n\n router.use(THEME_ASSET_MOUNT_PATH, createThemeAssetsHandler(provider));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAaiB,wBAAwBC,OAAO,YAAA;;;;;GAO5C,eAAsBC,yBAClBC,QACAC,UAAmC,CAAC,GAAC;CAKrC,MAAMC,oBAAoBF,QAAQC,OAAAA;CAMlC,MAAME,kBAAkBb,8BAAAA;CACxB,IAAIa,iBACAH,OAAOI,IAAI,kBAAkBpB,cACzBE,KAAKmB,MAAMC,KAAKH,iBAAiB,QAAA,GACjC;EACII,aAAa;EACbC,MAAM;CACV,CAAA,CAAA;CAIR,IAAI,CAACzB,qBAAqBD,mBAAmB2B,YAAY,GAAG;EACxDT,OAAOI,IAAI,UAAUpB,cACjBE,KAAKmB,MAAMC,KAAKjB,cAAc,QAAA,GAC9B;GACIkB,aAAa;GACbC,MAAM;EACV,CAAA,CAAA;EAMJ,MAAME,sBAAsBnB,2BAAAA;EAC5B,IAAImB,qBACAV,OAAOI,IAAI,UAAUpB,cACjBE,KAAKmB,MAAMC,KAAKI,qBAAqB,QAAA,GACrC;GACIH,aAAa;GACbC,MAAM;EACV,CAAA,CAAA;EAGR;CACJ;CAMA,MAAMI,yBAAyBpB,8BAAAA;CAC/B,IAAI,CAACoB,wBACD,MAAM,IAAIhC,cACN,0EAAA;CAMR,MAAMkC,SAAwB,OAAMD,MAFjBhC,KAAK,MAAA,EAAA,CAEiBkC,aAAa;EAClDC,MAAMJ;EACNK,MAAM;EACNC,UAAU;EACVJ,QAAQ;GACJK,gBAAgB;GAChBC,OAAO;IACHC,YAAY;IACZC,UAAU;GACd;EACJ;EACAC,SAAS;CACb,CAAA;CAEAvB,OAAOI,IAAI,UAAUhB,mBAAmB0B,OAAOU,WAAW,CAAA;CAC1DxB,OAAOI,IAAIjB,mBAAmBsC,UAAAA;EAC1BA,MAAMC,MAAM7B,yBAAyBiB;EACrC,OAAOW,MAAME,KAAI;CACrB,CAAA,CAAA;CAEA,OAAOb;AACX;;;;;;;;GAUA,eAAeZ,oBAAoBF,QAAaC,SAAgC;CAC5E,MAAM,EAAE2B,uBAAuB3B;CAC/B,IAAI,CAAC2B,sBAAsB,CAAC3C,GAAG4C,WAAWD,kBAAAA,GACtC;CAGJ,MAAME,WAAW,IAAIpC,cAAc;EAC/BqC,eAAeH;EACfI,kBAAkB/B,QAAQgC;EAC1BC,QAAQjC,QAAQiC;CACpB,CAAA;CAEA,MAAMJ,SAASK,KAAI;CAEnBvC,wBAAwBI,QAAQ8B,QAAAA;CAEhC9B,OAAOI,IAAIX,wBAAwBE,yBAAyBmC,QAAAA,CAAAA;AAChE"}
@@ -52,7 +52,8 @@ var AuthorizationMiddleware = class {
52
52
  return promise;
53
53
  }
54
54
  async runInner(event) {
55
- setRequestPermissionEvaluator(event, new RequestPermissionEvaluator(event, this.permissionEvaluator));
55
+ const requestAccessContext = new RequestPermissionEvaluator(event, this.permissionEvaluator);
56
+ setRequestPermissionEvaluator(event, requestAccessContext);
56
57
  const headerValue = event.headers.get("authorization");
57
58
  if (!headerValue) return;
58
59
  const header = parseAuthorizationHeader(headerValue);
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["PermissionEvaluator","IdentityType","ScopeName","AuthHeaderError","JWTError","OAuth2SubKind","OAuth2TokenKind","deserializeOAuth2Scope","AuthorizationHeaderType","parseAuthorizationHeader","ClientAuthenticator","PolicyEngine","UserAuthenticator","assertClientCertificateEvidenceValidForBinding","RequestIdentity","RequestPermissionEvaluator","extractClientCertificateEvidence","setRequestIdentity","setRequestMfaLoginTicket","setRequestPermissionEvaluator","setRequestScopes","setRequestSessionId","setRequestToken","runSymbol","Symbol","AuthorizationMiddleware","options","oauth2TokenVerifier","permissionEvaluator","identityResolver","sessionManager","clientAuthenticator","userAuthenticator","ctx","provider","permissionProvider","policyEngine","identityPermissionProvider","realmId","clientId","run","event","pending","store","promise","runInner","requestAccessContext","headerValue","headers","get","header","type","BEARER","verifyBearerAuthorizationHeader","BASIC","verifyBasicAuthorizationHeader","unsupportedType","payload","verify","token","verifyCertificateBinding","kind","MFA","verifyMfaLoginTicket","ACCESS","payloadPropertyInvalid","realm_id","scope","session_id","session","findOneById","expired","ping","sub_kind","sub","identity","resolve","cnf","expectedThumbprint","length","invalid","evidence","certificateSource","thumbprint","USER","subKind","clientAuthBasic","authenticator","safeAuthenticate","username","password","success","GLOBAL","CLIENT","data","userAuthBasic","authenticated"],"sources":["../../../../../../src/adapters/http/middleware/built-in/authorization/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 { IPermissionEvaluator } from '@authup/access';\nimport { PermissionEvaluator } from '@authup/access';\nimport type { Client, User } from '@authup/core-kit';\nimport {\n IdentityType,\n ScopeName,\n} from '@authup/core-kit';\nimport { AuthHeaderError } from '@authup/errors';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport {\n JWTError,\n OAuth2SubKind,\n OAuth2TokenKind,\n deserializeOAuth2Scope,\n} from '@authup/specs';\nimport type { IAppEvent } from 'routup';\nimport {\n AuthorizationHeaderType,\n type BasicAuthorizationHeader,\n type BearerAuthorizationHeader,\n parseAuthorizationHeader,\n} from 'hapic';\nimport {\n ClientAuthenticator,\n PolicyEngine,\n UserAuthenticator,\n assertClientCertificateEvidenceValidForBinding,\n} from '../../../../../core/index.ts';\nimport type {\n ICredentialsAuthenticator,\n IIdentityResolver,\n IOAuth2TokenVerifier,\n ISessionManager,\n} from '../../../../../core/index.ts';\nimport {\n RequestIdentity,\n RequestPermissionEvaluator,\n extractClientCertificateEvidence,\n setRequestIdentity,\n setRequestMfaLoginTicket,\n setRequestPermissionEvaluator,\n setRequestScopes,\n setRequestSessionId,\n setRequestToken,\n} from '../../../request/index.ts';\nimport type { HTTPAuthorizationMiddlewareContext, HTTPAuthorizationMiddlewareOptions } from './types.ts';\n\nconst runSymbol = Symbol('RAuthorizationMiddlewareRun');\n\nexport class AuthorizationMiddleware {\n protected options: HTTPAuthorizationMiddlewareOptions;\n\n // --------------------------------------\n\n protected oauth2TokenVerifier: IOAuth2TokenVerifier;\n\n protected permissionEvaluator: IPermissionEvaluator;\n\n // --------------------------------------\n\n protected identityResolver: IIdentityResolver;\n\n protected sessionManager : ISessionManager;\n\n // --------------------------------------\n\n protected clientAuthenticator : ICredentialsAuthenticator<Client>;\n\n protected userAuthenticator : ICredentialsAuthenticator<User>;\n\n // --------------------------------------\n\n constructor(ctx: HTTPAuthorizationMiddlewareContext) {\n this.options = ctx.options || {};\n\n this.identityResolver = ctx.identityResolver;\n this.sessionManager = ctx.sessionManager;\n\n this.clientAuthenticator = new ClientAuthenticator(ctx.identityResolver);\n this.userAuthenticator = new UserAuthenticator(ctx.identityResolver);\n\n this.oauth2TokenVerifier = ctx.oauth2TokenVerifier;\n\n this.permissionEvaluator = new PermissionEvaluator({\n provider: ctx.permissionProvider,\n policyEngine: new PolicyEngine(ctx.identityPermissionProvider),\n realmId: null,\n clientId: null,\n });\n }\n\n // --------------------------------------\n\n async run(event: IAppEvent): Promise<void> {\n // routup's dispatch walk re-enters earlier middlewares once per\n // remaining match when no handler produces a response — exponentially\n // (routup/routup#946), so an unmatched authenticated request re-ran\n // this middleware ~100+ times, re-verifying Basic credentials (bcrypt)\n // on every re-entry (~4s per 404). Authorization is a pure function of\n // the request: the first run's settlement — including a rejection —\n // is authoritative, so memoize the promise on the request store (the\n // store is shared by every re-entry of the same request).\n const pending = event.store[runSymbol] as Promise<void> | undefined;\n if (pending) {\n return pending;\n }\n\n const promise = this.runInner(event);\n event.store[runSymbol] = promise;\n return promise;\n }\n\n protected async runInner(event: IAppEvent): Promise<void> {\n const requestAccessContext = new RequestPermissionEvaluator(\n event,\n this.permissionEvaluator,\n );\n setRequestPermissionEvaluator(event, requestAccessContext);\n\n const headerValue = event.headers.get('authorization');\n if (!headerValue) {\n return;\n }\n\n const header = parseAuthorizationHeader(headerValue);\n\n if (header.type === AuthorizationHeaderType.BEARER) {\n await this.verifyBearerAuthorizationHeader(event, header);\n return;\n }\n\n if (header.type === AuthorizationHeaderType.BASIC) {\n await this.verifyBasicAuthorizationHeader(event, header);\n return;\n }\n\n throw AuthHeaderError.unsupportedType(header.type);\n }\n\n /**\n * @throws JWTError\n */\n protected async verifyBearerAuthorizationHeader(\n event: IAppEvent,\n header: BearerAuthorizationHeader,\n ) {\n const payload = await this.oauth2TokenVerifier.verify(header.token);\n await this.verifyCertificateBinding(event, payload);\n if (payload.kind === OAuth2TokenKind.MFA) {\n await this.verifyMfaLoginTicket(event, payload);\n return;\n }\n\n if (payload.kind !== OAuth2TokenKind.ACCESS) {\n throw JWTError.payloadPropertyInvalid('kind');\n }\n\n if (!payload.realm_id) {\n throw JWTError.payloadPropertyInvalid('realm_id');\n }\n\n setRequestToken(event, header.token);\n\n if (payload.scope) {\n setRequestScopes(event, deserializeOAuth2Scope(payload.scope));\n }\n\n // -------------------------------------------------------\n\n if (!payload.session_id) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n const session = await this.sessionManager.findOneById(payload.session_id);\n if (!session) {\n throw JWTError.expired();\n }\n\n try {\n await this.sessionManager.verify(session);\n } catch {\n throw JWTError.expired();\n }\n\n await this.sessionManager.ping(session);\n\n setRequestSessionId(event, payload.session_id);\n\n // -------------------------------------------------------\n\n if (!payload.sub_kind) {\n throw JWTError.payloadPropertyInvalid('sub_kind');\n }\n\n if (!payload.sub) {\n throw JWTError.payloadPropertyInvalid('sub');\n }\n\n const identity = await this.identityResolver.resolve(\n payload.sub_kind,\n payload.sub,\n );\n\n if (identity) {\n setRequestIdentity(event, identity);\n }\n }\n\n protected async verifyCertificateBinding(event: IAppEvent, payload: OAuth2TokenPayload): Promise<void> {\n if (!payload.cnf) {\n return;\n }\n\n const expectedThumbprint = payload.cnf['x5t#S256'];\n if (typeof expectedThumbprint !== 'string' || expectedThumbprint.length === 0) {\n throw JWTError.invalid();\n }\n\n try {\n const evidence = await extractClientCertificateEvidence(\n event,\n this.options.certificateSource ?? 'disabled',\n );\n if (!evidence || evidence.thumbprint !== expectedThumbprint) {\n throw JWTError.invalid();\n }\n\n assertClientCertificateEvidenceValidForBinding(evidence);\n } catch {\n throw JWTError.invalid();\n }\n }\n\n /**\n * An \"MFA-pending\" login ticket (issue #3242). Verified with the same\n * rigor as an access token (session existence + subject match), but\n * stashed on a DEDICATED request slot — the main identity / scope /\n * session slots stay empty, so every identity-gated route rejects a\n * ticket bearer (default-deny); only the challenge routes opt in via\n * useRequestMfaLoginTicket.\n *\n * @throws JWTError\n */\n protected async verifyMfaLoginTicket(\n event: IAppEvent,\n payload: OAuth2TokenPayload,\n ) {\n if (payload.sub_kind !== OAuth2SubKind.USER) {\n throw JWTError.payloadPropertyInvalid('sub_kind');\n }\n\n if (!payload.sub) {\n throw JWTError.payloadPropertyInvalid('sub');\n }\n\n if (!payload.realm_id) {\n throw JWTError.payloadPropertyInvalid('realm_id');\n }\n\n if (!payload.session_id) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n const session = await this.sessionManager.findOneById(payload.session_id);\n if (!session) {\n throw JWTError.expired();\n }\n\n try {\n await this.sessionManager.verify(session);\n } catch {\n throw JWTError.expired();\n }\n\n // defense in depth — the pending session must still belong to the\n // ticket subject.\n if (\n session.sub !== payload.sub ||\n session.subKind !== IdentityType.USER\n ) {\n throw JWTError.expired();\n }\n\n await this.sessionManager.ping(session);\n\n const identity = await this.identityResolver.resolve(\n payload.sub_kind,\n payload.sub,\n );\n if (!identity) {\n throw JWTError.expired();\n }\n\n setRequestMfaLoginTicket(event, {\n identity: new RequestIdentity(identity),\n payload,\n });\n }\n\n protected async verifyBasicAuthorizationHeader(\n event: IAppEvent,\n header: BasicAuthorizationHeader,\n ) {\n if (this.options.clientAuthBasic) {\n const authenticator = await this.clientAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n if (authenticator.success) {\n setRequestScopes(event, [ScopeName.GLOBAL]);\n setRequestIdentity(event, {\n type: IdentityType.CLIENT,\n data: authenticator.data,\n });\n }\n }\n\n if (this.options.userAuthBasic) {\n const authenticated = await this.userAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n\n if (authenticated.success) {\n setRequestScopes(event, [ScopeName.GLOBAL]);\n setRequestIdentity(event, {\n type: IdentityType.USER,\n data: authenticated.data,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"module.mjs","names":["PermissionEvaluator","IdentityType","ScopeName","AuthHeaderError","JWTError","OAuth2SubKind","OAuth2TokenKind","deserializeOAuth2Scope","AuthorizationHeaderType","parseAuthorizationHeader","ClientAuthenticator","PolicyEngine","UserAuthenticator","assertClientCertificateEvidenceValidForBinding","RequestIdentity","RequestPermissionEvaluator","extractClientCertificateEvidence","setRequestIdentity","setRequestMfaLoginTicket","setRequestPermissionEvaluator","setRequestScopes","setRequestSessionId","setRequestToken","runSymbol","Symbol","AuthorizationMiddleware","options","oauth2TokenVerifier","permissionEvaluator","identityResolver","sessionManager","clientAuthenticator","userAuthenticator","ctx","provider","permissionProvider","policyEngine","identityPermissionProvider","realmId","clientId","run","event","pending","store","promise","runInner","requestAccessContext","headerValue","headers","get","header","type","BEARER","verifyBearerAuthorizationHeader","BASIC","verifyBasicAuthorizationHeader","unsupportedType","payload","verify","token","verifyCertificateBinding","kind","MFA","verifyMfaLoginTicket","ACCESS","payloadPropertyInvalid","realm_id","scope","session_id","session","findOneById","expired","ping","sub_kind","sub","identity","resolve","cnf","expectedThumbprint","length","invalid","evidence","certificateSource","thumbprint","USER","subKind","clientAuthBasic","authenticator","safeAuthenticate","username","password","success","GLOBAL","CLIENT","data","userAuthBasic","authenticated"],"sources":["../../../../../../src/adapters/http/middleware/built-in/authorization/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 { IPermissionEvaluator } from '@authup/access';\nimport { PermissionEvaluator } from '@authup/access';\nimport type { Client, User } from '@authup/core-kit';\nimport {\n IdentityType,\n ScopeName,\n} from '@authup/core-kit';\nimport { AuthHeaderError } from '@authup/errors';\nimport type { OAuth2TokenPayload } from '@authup/specs';\nimport {\n JWTError,\n OAuth2SubKind,\n OAuth2TokenKind,\n deserializeOAuth2Scope,\n} from '@authup/specs';\nimport type { IAppEvent } from 'routup';\nimport {\n AuthorizationHeaderType,\n type BasicAuthorizationHeader,\n type BearerAuthorizationHeader,\n parseAuthorizationHeader,\n} from 'hapic';\nimport {\n ClientAuthenticator,\n PolicyEngine,\n UserAuthenticator,\n assertClientCertificateEvidenceValidForBinding,\n} from '../../../../../core/index.ts';\nimport type {\n ICredentialsAuthenticator,\n IIdentityResolver,\n IOAuth2TokenVerifier,\n ISessionManager,\n} from '../../../../../core/index.ts';\nimport {\n RequestIdentity,\n RequestPermissionEvaluator,\n extractClientCertificateEvidence,\n setRequestIdentity,\n setRequestMfaLoginTicket,\n setRequestPermissionEvaluator,\n setRequestScopes,\n setRequestSessionId,\n setRequestToken,\n} from '../../../request/index.ts';\nimport type { HTTPAuthorizationMiddlewareContext, HTTPAuthorizationMiddlewareOptions } from './types.ts';\n\nconst runSymbol = Symbol('RAuthorizationMiddlewareRun');\n\nexport class AuthorizationMiddleware {\n protected options: HTTPAuthorizationMiddlewareOptions;\n\n // --------------------------------------\n\n protected oauth2TokenVerifier: IOAuth2TokenVerifier;\n\n protected permissionEvaluator: IPermissionEvaluator;\n\n // --------------------------------------\n\n protected identityResolver: IIdentityResolver;\n\n protected sessionManager : ISessionManager;\n\n // --------------------------------------\n\n protected clientAuthenticator : ICredentialsAuthenticator<Client>;\n\n protected userAuthenticator : ICredentialsAuthenticator<User>;\n\n // --------------------------------------\n\n constructor(ctx: HTTPAuthorizationMiddlewareContext) {\n this.options = ctx.options || {};\n\n this.identityResolver = ctx.identityResolver;\n this.sessionManager = ctx.sessionManager;\n\n this.clientAuthenticator = new ClientAuthenticator(ctx.identityResolver);\n this.userAuthenticator = new UserAuthenticator(ctx.identityResolver);\n\n this.oauth2TokenVerifier = ctx.oauth2TokenVerifier;\n\n this.permissionEvaluator = new PermissionEvaluator({\n provider: ctx.permissionProvider,\n policyEngine: new PolicyEngine(ctx.identityPermissionProvider),\n realmId: null,\n clientId: null,\n });\n }\n\n // --------------------------------------\n\n async run(event: IAppEvent): Promise<void> {\n // routup's dispatch walk re-enters earlier middlewares once per\n // remaining match when no handler produces a response — exponentially\n // (routup/routup#946), so an unmatched authenticated request re-ran\n // this middleware ~100+ times, re-verifying Basic credentials (bcrypt)\n // on every re-entry (~4s per 404). Authorization is a pure function of\n // the request: the first run's settlement — including a rejection —\n // is authoritative, so memoize the promise on the request store (the\n // store is shared by every re-entry of the same request).\n const pending = event.store[runSymbol] as Promise<void> | undefined;\n if (pending) {\n return pending;\n }\n\n const promise = this.runInner(event);\n event.store[runSymbol] = promise;\n return promise;\n }\n\n protected async runInner(event: IAppEvent): Promise<void> {\n const requestAccessContext = new RequestPermissionEvaluator(\n event,\n this.permissionEvaluator,\n );\n setRequestPermissionEvaluator(event, requestAccessContext);\n\n const headerValue = event.headers.get('authorization');\n if (!headerValue) {\n return;\n }\n\n const header = parseAuthorizationHeader(headerValue);\n\n if (header.type === AuthorizationHeaderType.BEARER) {\n await this.verifyBearerAuthorizationHeader(event, header);\n return;\n }\n\n if (header.type === AuthorizationHeaderType.BASIC) {\n await this.verifyBasicAuthorizationHeader(event, header);\n return;\n }\n\n throw AuthHeaderError.unsupportedType(header.type);\n }\n\n /**\n * @throws JWTError\n */\n protected async verifyBearerAuthorizationHeader(\n event: IAppEvent,\n header: BearerAuthorizationHeader,\n ) {\n const payload = await this.oauth2TokenVerifier.verify(header.token);\n await this.verifyCertificateBinding(event, payload);\n if (payload.kind === OAuth2TokenKind.MFA) {\n await this.verifyMfaLoginTicket(event, payload);\n return;\n }\n\n if (payload.kind !== OAuth2TokenKind.ACCESS) {\n throw JWTError.payloadPropertyInvalid('kind');\n }\n\n if (!payload.realm_id) {\n throw JWTError.payloadPropertyInvalid('realm_id');\n }\n\n setRequestToken(event, header.token);\n\n if (payload.scope) {\n setRequestScopes(event, deserializeOAuth2Scope(payload.scope));\n }\n\n // -------------------------------------------------------\n\n if (!payload.session_id) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n const session = await this.sessionManager.findOneById(payload.session_id);\n if (!session) {\n throw JWTError.expired();\n }\n\n try {\n await this.sessionManager.verify(session);\n } catch {\n throw JWTError.expired();\n }\n\n await this.sessionManager.ping(session);\n\n setRequestSessionId(event, payload.session_id);\n\n // -------------------------------------------------------\n\n if (!payload.sub_kind) {\n throw JWTError.payloadPropertyInvalid('sub_kind');\n }\n\n if (!payload.sub) {\n throw JWTError.payloadPropertyInvalid('sub');\n }\n\n const identity = await this.identityResolver.resolve(\n payload.sub_kind,\n payload.sub,\n );\n\n if (identity) {\n setRequestIdentity(event, identity);\n }\n }\n\n protected async verifyCertificateBinding(event: IAppEvent, payload: OAuth2TokenPayload): Promise<void> {\n if (!payload.cnf) {\n return;\n }\n\n const expectedThumbprint = payload.cnf['x5t#S256'];\n if (typeof expectedThumbprint !== 'string' || expectedThumbprint.length === 0) {\n throw JWTError.invalid();\n }\n\n try {\n const evidence = await extractClientCertificateEvidence(\n event,\n this.options.certificateSource ?? 'disabled',\n );\n if (!evidence || evidence.thumbprint !== expectedThumbprint) {\n throw JWTError.invalid();\n }\n\n assertClientCertificateEvidenceValidForBinding(evidence);\n } catch {\n throw JWTError.invalid();\n }\n }\n\n /**\n * An \"MFA-pending\" login ticket (issue #3242). Verified with the same\n * rigor as an access token (session existence + subject match), but\n * stashed on a DEDICATED request slot — the main identity / scope /\n * session slots stay empty, so every identity-gated route rejects a\n * ticket bearer (default-deny); only the challenge routes opt in via\n * useRequestMfaLoginTicket.\n *\n * @throws JWTError\n */\n protected async verifyMfaLoginTicket(\n event: IAppEvent,\n payload: OAuth2TokenPayload,\n ) {\n if (payload.sub_kind !== OAuth2SubKind.USER) {\n throw JWTError.payloadPropertyInvalid('sub_kind');\n }\n\n if (!payload.sub) {\n throw JWTError.payloadPropertyInvalid('sub');\n }\n\n if (!payload.realm_id) {\n throw JWTError.payloadPropertyInvalid('realm_id');\n }\n\n if (!payload.session_id) {\n throw JWTError.payloadPropertyInvalid('session_id');\n }\n\n const session = await this.sessionManager.findOneById(payload.session_id);\n if (!session) {\n throw JWTError.expired();\n }\n\n try {\n await this.sessionManager.verify(session);\n } catch {\n throw JWTError.expired();\n }\n\n // defense in depth — the pending session must still belong to the\n // ticket subject.\n if (\n session.sub !== payload.sub ||\n session.subKind !== IdentityType.USER\n ) {\n throw JWTError.expired();\n }\n\n await this.sessionManager.ping(session);\n\n const identity = await this.identityResolver.resolve(\n payload.sub_kind,\n payload.sub,\n );\n if (!identity) {\n throw JWTError.expired();\n }\n\n setRequestMfaLoginTicket(event, {\n identity: new RequestIdentity(identity),\n payload,\n });\n }\n\n protected async verifyBasicAuthorizationHeader(\n event: IAppEvent,\n header: BasicAuthorizationHeader,\n ) {\n if (this.options.clientAuthBasic) {\n const authenticator = await this.clientAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n if (authenticator.success) {\n setRequestScopes(event, [ScopeName.GLOBAL]);\n setRequestIdentity(event, {\n type: IdentityType.CLIENT,\n data: authenticator.data,\n });\n }\n }\n\n if (this.options.userAuthBasic) {\n const authenticated = await this.userAuthenticator.safeAuthenticate(\n header.username,\n header.password,\n );\n\n if (authenticated.success) {\n setRequestScopes(event, [ScopeName.GLOBAL]);\n setRequestIdentity(event, {\n type: IdentityType.USER,\n data: authenticated.data,\n });\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -9,5 +9,7 @@ export * from './logger.ts';
9
9
  export * from './prometheus.ts';
10
10
  export * from './rate-limit.ts';
11
11
  export * from './swagger.ts';
12
+ export * from './theme.ts';
13
+ export * from './types.ts';
12
14
  export * from './ui-http-client.ts';
13
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/index.ts"],"names":[],"mappings":"AAOA,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/index.ts"],"names":[],"mappings":"AAOA,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAE1C,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
@@ -10,6 +10,7 @@ import "./loggedin/index.mjs";
10
10
  import { RealmResolverMiddleware } from "./realm-resolver/module.mjs";
11
11
  import { createRealmResolverMiddleware } from "./realm-resolver/factory.mjs";
12
12
  import "./realm-resolver/index.mjs";
13
+ import { THEME_STORE_KEY, registerThemeMiddleware, useRequestTheme } from "./theme.mjs";
13
14
  import { VITE_SERVER_STORE_KEY, registerAssetsMiddleware } from "./assets.mjs";
14
15
  import { registerBasicMiddleware } from "./basic.mjs";
15
16
  import { registerCorsMiddleware } from "./cors.mjs";
@@ -19,4 +20,4 @@ import { createRouteTemplateNormalizePath, registerPrometheusMiddleware } from "
19
20
  import { registerRateLimitMiddleware } from "./rate-limit.mjs";
20
21
  import { createSwaggerMiddleware } from "./swagger.mjs";
21
22
  import { UI_HTTP_CLIENT_FACTORY_STORE_KEY, registerUIHttpClientMiddleware } from "./ui-http-client.mjs";
22
- export { AuthorizationMiddleware, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, RealmResolverMiddleware, UI_HTTP_CLIENT_FACTORY_STORE_KEY, VITE_SERVER_STORE_KEY, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerUIHttpClientMiddleware };
23
+ export { AuthorizationMiddleware, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, RealmResolverMiddleware, THEME_STORE_KEY, UI_HTTP_CLIENT_FACTORY_STORE_KEY, VITE_SERVER_STORE_KEY, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerThemeMiddleware, registerUIHttpClientMiddleware, useRequestTheme };
@@ -14,11 +14,11 @@ function registerRateLimitMiddleware(router, input) {
14
14
  const identity = useRequestIdentity(event);
15
15
  if (!identity) return 1200;
16
16
  switch (identity.type) {
17
- case "client": return 60 * 5e3;
17
+ case "client": return 3e5;
18
18
  default: return 6e3;
19
19
  }
20
20
  },
21
- windowMs: 60 * 1e3
21
+ windowMs: 6e4
22
22
  };
23
23
  options = merge(input || {}, options);
24
24
  router.use(rateLimit(options));
@@ -1 +1 @@
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"}
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;IAGX,SACI,OAAO;GAEf;EACJ;EACAC,UAAU;CACd;CAEAN,UAAUL,MAAMI,SAAS,CAAC,GAAGC,OAAAA;CAE7BF,OAAOS,IAAId,UAAUO,OAAAA,CAAAA;AACzB"}
@@ -0,0 +1,15 @@
1
+ import type { App, IAppEvent } from 'routup';
2
+ import type { IThemeProvider } from '../../ui/theme/index.ts';
3
+ /**
4
+ * Per-request handoff of the operator theme into the two console serve
5
+ * paths, the same mechanism as UI_HTTP_CLIENT_FACTORY_STORE_KEY.
6
+ *
7
+ * A store handoff rather than module-scope state, so two applications in
8
+ * one process (the test suite) never share a theme, and rather than
9
+ * threading the provider through seven workflow controllers, which is a
10
+ * lot of plumbing for decoration.
11
+ */
12
+ export declare const THEME_STORE_KEY: unique symbol;
13
+ export declare function registerThemeMiddleware(router: App, provider: IThemeProvider): void;
14
+ export declare function useRequestTheme(event: IAppEvent): IThemeProvider | undefined;
15
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/theme.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,eAAkB,CAAC;AAE/C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,QAM5E;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAI,cAAc,GAAG,SAAS,CAE7E"}
@@ -0,0 +1,27 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import { defineCoreHandler } from "routup";
5
+ //#region src/adapters/http/middleware/built-in/theme.ts
6
+ /**
7
+ * Per-request handoff of the operator theme into the two console serve
8
+ * paths, the same mechanism as UI_HTTP_CLIENT_FACTORY_STORE_KEY.
9
+ *
10
+ * A store handoff rather than module-scope state, so two applications in
11
+ * one process (the test suite) never share a theme, and rather than
12
+ * threading the provider through seven workflow controllers, which is a
13
+ * lot of plumbing for decoration.
14
+ */ const THEME_STORE_KEY = Symbol("Theme");
15
+ function registerThemeMiddleware(router, provider) {
16
+ router.use(defineCoreHandler((event) => {
17
+ event.store[THEME_STORE_KEY] = provider;
18
+ return event.next();
19
+ }));
20
+ }
21
+ function useRequestTheme(event) {
22
+ return event.store[THEME_STORE_KEY];
23
+ }
24
+ //#endregion
25
+ export { THEME_STORE_KEY, registerThemeMiddleware, useRequestTheme };
26
+
27
+ //# sourceMappingURL=theme.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.mjs","names":["defineCoreHandler","THEME_STORE_KEY","Symbol","registerThemeMiddleware","router","provider","use","event","store","next","useRequestTheme"],"sources":["../../../../../src/adapters/http/middleware/built-in/theme.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 type { App, IAppEvent } from 'routup';\nimport { defineCoreHandler } from 'routup';\nimport type { IThemeProvider } from '../../ui/theme/index.ts';\n\n/**\n * Per-request handoff of the operator theme into the two console serve\n * paths, the same mechanism as UI_HTTP_CLIENT_FACTORY_STORE_KEY.\n *\n * A store handoff rather than module-scope state, so two applications in\n * one process (the test suite) never share a theme, and rather than\n * threading the provider through seven workflow controllers, which is a\n * lot of plumbing for decoration.\n */\nexport const THEME_STORE_KEY = Symbol('Theme');\n\nexport function registerThemeMiddleware(router: App, provider: IThemeProvider) {\n router.use(defineCoreHandler((event) => {\n event.store[THEME_STORE_KEY] = provider;\n\n return event.next();\n }));\n}\n\nexport function useRequestTheme(event: IAppEvent) : IThemeProvider | undefined {\n return event.store[THEME_STORE_KEY] as IThemeProvider | undefined;\n}\n"],"mappings":";;;;;;;;;;;;;GAoBA,MAAaC,kBAAkBC,OAAO,OAAA;AAEtC,SAAgBC,wBAAwBC,QAAaC,UAAwB;CACzED,OAAOE,IAAIN,mBAAmBO,UAAAA;EAC1BA,MAAMC,MAAMP,mBAAmBI;EAE/B,OAAOE,MAAME,KAAI;CACrB,CAAA,CAAA;AACJ;AAEA,SAAgBC,gBAAgBH,OAAgB;CAC5C,OAAOA,MAAMC,MAAMP;AACvB"}
@@ -0,0 +1,14 @@
1
+ import type { Logger } from '@authup/server-kit';
2
+ export type AssetsMiddlewareOptions = {
3
+ /**
4
+ * Absolute path of the operator theme directory. Empty or missing
5
+ * disables theming entirely.
6
+ */
7
+ themeDirectoryPath?: string;
8
+ /**
9
+ * Opt in to reading the theme's `fragments/head.html`. Default off.
10
+ */
11
+ themeFragmentsEnabled?: boolean;
12
+ logger?: Logger;
13
+ };
14
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/middleware/built-in/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,MAAM,uBAAuB,GAAG;IAClC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { IClient } from '@authup/core-http-kit';
2
2
  import type { App } from 'routup';
3
3
  /**
4
- * Per-request handoff of an HTTP-client factory into renderUIPage
4
+ * Per-request handoff of an HTTP-client factory into renderAuthConsolePage
5
5
  * same mechanism as VITE_SERVER_STORE_KEY. The wiring passes a thunk
6
6
  * over the DI container (`() => container.resolve(UIHttpClient)`)
7
7
  * whose registration carries `lifetime: 'transient'`, so every SSR
@@ -4,7 +4,7 @@ import.meta.url;
4
4
  import { defineCoreHandler } from "routup";
5
5
  //#region src/adapters/http/middleware/built-in/ui-http-client.ts
6
6
  /**
7
- * Per-request handoff of an HTTP-client factory into renderUIPage
7
+ * Per-request handoff of an HTTP-client factory into renderAuthConsolePage
8
8
  * same mechanism as VITE_SERVER_STORE_KEY. The wiring passes a thunk
9
9
  * over the DI container (`() => container.resolve(UIHttpClient)`)
10
10
  * whose registration carries `lifetime: 'transient'`, so every SSR
@@ -1 +1 @@
1
- {"version":3,"file":"ui-http-client.mjs","names":["defineCoreHandler","UI_HTTP_CLIENT_FACTORY_STORE_KEY","Symbol","registerUIHttpClientMiddleware","router","httpClientFactory","use","event","store","next"],"sources":["../../../../../src/adapters/http/middleware/built-in/ui-http-client.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 type { IClient } from '@authup/core-http-kit';\nimport type { App } from 'routup';\nimport { defineCoreHandler } from 'routup';\n\n/**\n * Per-request handoff of an HTTP-client factory into renderUIPage —\n * same mechanism as VITE_SERVER_STORE_KEY. The wiring passes a thunk\n * over the DI container (`() => container.resolve(UIHttpClient)`)\n * whose registration carries `lifetime: 'transient'`, so every SSR\n * render resolves a fresh client — never share one client instance\n * across renders (the authentication hook writes per-user state onto\n * it). Production binds the internal loopback client by default\n * (`HTTPModule.registerUIHttpClient`); tests may pre-register a fake.\n */\nexport const UI_HTTP_CLIENT_FACTORY_STORE_KEY = Symbol('UIHttpClientFactory');\n\nexport function registerUIHttpClientMiddleware(router: App, httpClientFactory: () => IClient) {\n router.use(defineCoreHandler((event) => {\n event.store[UI_HTTP_CLIENT_FACTORY_STORE_KEY] = httpClientFactory;\n return event.next();\n }));\n}\n"],"mappings":";;;;;;;;;;;;;;GAqBA,MAAaC,mCAAmCC,OAAO,qBAAA;AAEvD,SAAgBC,+BAA+BC,QAAaC,mBAAgC;CACxFD,OAAOE,IAAIN,mBAAmBO,UAAAA;EAC1BA,MAAMC,MAAMP,oCAAoCI;EAChD,OAAOE,MAAME,KAAI;CACrB,CAAA,CAAA;AACJ"}
1
+ {"version":3,"file":"ui-http-client.mjs","names":["defineCoreHandler","UI_HTTP_CLIENT_FACTORY_STORE_KEY","Symbol","registerUIHttpClientMiddleware","router","httpClientFactory","use","event","store","next"],"sources":["../../../../../src/adapters/http/middleware/built-in/ui-http-client.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 type { IClient } from '@authup/core-http-kit';\nimport type { App } from 'routup';\nimport { defineCoreHandler } from 'routup';\n\n/**\n * Per-request handoff of an HTTP-client factory into renderAuthConsolePage —\n * same mechanism as VITE_SERVER_STORE_KEY. The wiring passes a thunk\n * over the DI container (`() => container.resolve(UIHttpClient)`)\n * whose registration carries `lifetime: 'transient'`, so every SSR\n * render resolves a fresh client — never share one client instance\n * across renders (the authentication hook writes per-user state onto\n * it). Production binds the internal loopback client by default\n * (`HTTPModule.registerUIHttpClient`); tests may pre-register a fake.\n */\nexport const UI_HTTP_CLIENT_FACTORY_STORE_KEY = Symbol('UIHttpClientFactory');\n\nexport function registerUIHttpClientMiddleware(router: App, httpClientFactory: () => IClient) {\n router.use(defineCoreHandler((event) => {\n event.store[UI_HTTP_CLIENT_FACTORY_STORE_KEY] = httpClientFactory;\n return event.next();\n }));\n}\n"],"mappings":";;;;;;;;;;;;;;GAqBA,MAAaC,mCAAmCC,OAAO,qBAAA;AAEvD,SAAgBC,+BAA+BC,QAAaC,mBAAgC;CACxFD,OAAOE,IAAIN,mBAAmBO,UAAAA;EAC1BA,MAAMC,MAAMP,oCAAoCI;EAChD,OAAOE,MAAME,KAAI;CACrB,CAAA,CAAA;AACJ"}
@@ -7,6 +7,7 @@ import { ForceLoggedInMiddleware } from "./built-in/loggedin/module.mjs";
7
7
  import { ForceUserLoggedInMiddleware } from "./built-in/loggedin/user.mjs";
8
8
  import { RealmResolverMiddleware } from "./built-in/realm-resolver/module.mjs";
9
9
  import { createRealmResolverMiddleware } from "./built-in/realm-resolver/factory.mjs";
10
+ import { THEME_STORE_KEY, registerThemeMiddleware, useRequestTheme } from "./built-in/theme.mjs";
10
11
  import { VITE_SERVER_STORE_KEY, registerAssetsMiddleware } from "./built-in/assets.mjs";
11
12
  import { registerBasicMiddleware } from "./built-in/basic.mjs";
12
13
  import { registerCorsMiddleware } from "./built-in/cors.mjs";
@@ -17,4 +18,4 @@ import { registerRateLimitMiddleware } from "./built-in/rate-limit.mjs";
17
18
  import { createSwaggerMiddleware } from "./built-in/swagger.mjs";
18
19
  import { UI_HTTP_CLIENT_FACTORY_STORE_KEY, registerUIHttpClientMiddleware } from "./built-in/ui-http-client.mjs";
19
20
  import "./built-in/index.mjs";
20
- export { AuthorizationMiddleware, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, RealmResolverMiddleware, UI_HTTP_CLIENT_FACTORY_STORE_KEY, VITE_SERVER_STORE_KEY, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerUIHttpClientMiddleware };
21
+ export { AuthorizationMiddleware, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, RealmResolverMiddleware, THEME_STORE_KEY, UI_HTTP_CLIENT_FACTORY_STORE_KEY, VITE_SERVER_STORE_KEY, createAuthorizationMiddleware, createLoggerMiddleware, createRealmResolverMiddleware, createRouteTemplateNormalizePath, createSwaggerMiddleware, redactSensitiveURLParams, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, registerThemeMiddleware, registerUIHttpClientMiddleware, useRequestTheme };
@@ -8,7 +8,7 @@ import { base64ToArrayBuffer } from "@authup/kit";
8
8
  import { BadRequestError } from "@authup/errors";
9
9
  import { X509Certificate } from "@peculiar/x509";
10
10
  //#region src/adapters/http/request/client-certificate.ts
11
- const MAX_CERTIFICATE_HEADER_LENGTH = 128 * 1024;
11
+ const MAX_CERTIFICATE_HEADER_LENGTH = 131072;
12
12
  const MAX_CERTIFICATE_CHAIN_LENGTH = 10;
13
13
  const STRUCTURED_BINARY_PATTERN = /^:([A-Za-z0-9+/]*={0,2}):$/;
14
14
  async function extractClientCertificateEvidence(event, source) {
@@ -1 +1 @@
1
- {"version":3,"file":"client-certificate.mjs","names":["X509Certificate","BadRequestError","base64ToArrayBuffer","buildClientCertificateThumbprint","parseClientCertificateChain","MAX_CERTIFICATE_HEADER_LENGTH","MAX_CERTIFICATE_CHAIN_LENGTH","STRUCTURED_BINARY_PATTERN","extractClientCertificateEvidence","event","source","undefined","result","extractStandardEvidence","extractForwardedEvidence","thumbprint","certificate","leafHeader","headers","get","chainHeader","certificateHeaderError","assertHeaderLength","parseStructuredCertificate","chain","parseStructuredCertificateList","value","pem","includes","decodeURIComponent","replace","certificates","length","items","split","map","item","trim","some","match","exec","raw","byteLength","toString"],"sources":["../../../../src/adapters/http/request/client-certificate.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 '../../../core/client-certificate/reflect.ts';\nimport { X509Certificate } from '@peculiar/x509';\nimport { BadRequestError } from '@authup/errors';\nimport { base64ToArrayBuffer } from '@authup/kit';\nimport type { IAppEvent } from 'routup';\nimport type { ClientCertificateEvidence } from '../../../core/index.ts';\nimport {\n buildClientCertificateThumbprint,\n parseClientCertificateChain,\n} from '../../../core/index.ts';\nimport type { CertificateSource } from './types.ts';\n\nconst MAX_CERTIFICATE_HEADER_LENGTH = 128 * 1024;\nconst MAX_CERTIFICATE_CHAIN_LENGTH = 10;\nconst STRUCTURED_BINARY_PATTERN = /^:([A-Za-z0-9+/]*={0,2}):$/;\n\nexport async function extractClientCertificateEvidence(\n event: IAppEvent,\n source: CertificateSource,\n): Promise<ClientCertificateEvidence | undefined> {\n if (source === 'disabled') {\n return undefined;\n }\n\n let result: Omit<ClientCertificateEvidence, 'thumbprint'> | undefined;\n if (source === 'standard') {\n result = extractStandardEvidence(event);\n } else if (source === 'forwarded') {\n result = extractForwardedEvidence(event);\n } else {\n throw new BadRequestError('The client certificate source is not configured correctly.');\n }\n if (!result) {\n return undefined;\n }\n\n return {\n ...result,\n thumbprint: await buildClientCertificateThumbprint(result.certificate),\n };\n}\n\nfunction extractStandardEvidence(\n event: IAppEvent,\n): Omit<ClientCertificateEvidence, 'thumbprint'> | undefined {\n const leafHeader = event.headers.get('client-cert');\n const chainHeader = event.headers.get('client-cert-chain');\n\n if (!leafHeader) {\n if (chainHeader) {\n throw certificateHeaderError();\n }\n return undefined;\n }\n\n assertHeaderLength(leafHeader);\n const certificate = parseStructuredCertificate(leafHeader);\n const chain = chainHeader ? parseStructuredCertificateList(chainHeader) : [];\n\n return { certificate, chain };\n}\n\nfunction extractForwardedEvidence(\n event: IAppEvent,\n): Omit<ClientCertificateEvidence, 'thumbprint'> | undefined {\n const value = event.headers.get('x-forwarded-tls-client-cert');\n if (!value) {\n return undefined;\n }\n\n assertHeaderLength(value);\n\n let pem: string;\n try {\n // Native raw PEM is useful in tests and a few proxy integrations. The\n // NGINX/Traefik contract is escaped PEM: query-style `+` represents a\n // space, while literal base64 plus signs arrive as `%2B`.\n pem = value.includes('-----BEGIN CERTIFICATE-----') ?\n value :\n decodeURIComponent(value.replace(/\\+/g, '%20'));\n } catch {\n throw certificateHeaderError();\n }\n\n let certificates: X509Certificate[];\n try {\n certificates = parseClientCertificateChain(pem);\n } catch {\n throw certificateHeaderError();\n }\n\n if (certificates.length !== 1 || !certificates[0]) {\n throw certificateHeaderError();\n }\n\n return {\n certificate: certificates[0],\n chain: [],\n };\n}\n\nfunction parseStructuredCertificateList(value: string): X509Certificate[] {\n assertHeaderLength(value);\n const items = value.split(',').map((item) => item.trim());\n if (items.length > MAX_CERTIFICATE_CHAIN_LENGTH || items.some((item) => item.length === 0)) {\n throw certificateHeaderError();\n }\n\n return items.map(parseStructuredCertificate);\n}\n\nfunction parseStructuredCertificate(value: string): X509Certificate {\n const match = STRUCTURED_BINARY_PATTERN.exec(value.trim());\n if (!match?.[1]) {\n throw certificateHeaderError();\n }\n\n try {\n const raw = base64ToArrayBuffer(match[1]);\n if (raw.byteLength === 0) {\n throw certificateHeaderError();\n }\n\n const certificate = new X509Certificate(raw);\n if (\n certificate.toString('base64').replace(/=+$/, '') !==\n match[1].replace(/=+$/, '')\n ) {\n throw certificateHeaderError();\n }\n\n return certificate;\n } catch {\n throw certificateHeaderError();\n }\n}\n\nfunction assertHeaderLength(value: string): void {\n if (value.length > MAX_CERTIFICATE_HEADER_LENGTH) {\n throw certificateHeaderError();\n }\n}\n\nfunction certificateHeaderError(): BadRequestError {\n return new BadRequestError('The forwarded client certificate header is malformed.');\n}\n"],"mappings":";;;;;;;;;;AAmBA,MAAMK,gCAAgC,MAAM;AAC5C,MAAMC,+BAA+B;AACrC,MAAMC,4BAA4B;AAElC,eAAsBC,iCAClBC,OACAC,QAAyB;CAEzB,IAAIA,WAAW,YACX;CAGJ,IAAIE;CACJ,IAAIF,WAAW,YACXE,SAASC,wBAAwBJ,KAAAA;MAC9B,IAAIC,WAAW,aAClBE,SAASE,yBAAyBL,KAAAA;MAElC,MAAM,IAAIR,gBAAgB,4DAAA;CAE9B,IAAI,CAACW,QACD;CAGJ,OAAO;EACH,GAAGA;EACHG,YAAY,MAAMZ,iCAAiCS,OAAOI,WAAW;CACzE;AACJ;AAEA,SAASH,wBACLJ,OAAgB;CAEhB,MAAMQ,aAAaR,MAAMS,QAAQC,IAAI,aAAA;CACrC,MAAMC,cAAcX,MAAMS,QAAQC,IAAI,mBAAA;CAEtC,IAAI,CAACF,YAAY;EACb,IAAIG,aACA,MAAMC,uBAAAA;EAEV;CACJ;CAEAC,mBAAmBL,UAAAA;CAInB,OAAO;EAAED,aAHWO,2BAA2BN,UAGtCD;EAAaQ,OAFRJ,cAAcK,+BAA+BL,WAAAA,IAAe,CAAA;CAE9C;AAChC;AAEA,SAASN,yBACLL,OAAgB;CAEhB,MAAMiB,QAAQjB,MAAMS,QAAQC,IAAI,6BAAA;CAChC,IAAI,CAACO,OACD;CAGJJ,mBAAmBI,KAAAA;CAEnB,IAAIC;CACJ,IAAI;EAIAA,MAAMD,MAAME,SAAS,6BAAA,IACjBF,QACAG,mBAAmBH,MAAMI,QAAQ,OAAO,KAAA,CAAA;CAChD,QAAQ;EACJ,MAAMT,uBAAAA;CACV;CAEA,IAAIU;CACJ,IAAI;EACAA,eAAe3B,4BAA4BuB,GAAAA;CAC/C,QAAQ;EACJ,MAAMN,uBAAAA;CACV;CAEA,IAAIU,aAAaC,WAAW,KAAK,CAACD,aAAa,IAC3C,MAAMV,uBAAAA;CAGV,OAAO;EACHL,aAAae,aAAa;EAC1BP,OAAO,CAAA;CACX;AACJ;AAEA,SAASC,+BAA+BC,OAAa;CACjDJ,mBAAmBI,KAAAA;CACnB,MAAMO,QAAQP,MAAMQ,MAAM,GAAA,CAAA,CAAKC,KAAKC,SAASA,KAAKC,KAAI,CAAA;CACtD,IAAIJ,MAAMD,SAAS1B,gCAAgC2B,MAAMK,MAAMF,SAASA,KAAKJ,WAAW,CAAA,GACpF,MAAMX,uBAAAA;CAGV,OAAOY,MAAME,IAAIZ,0BAAAA;AACrB;AAEA,SAASA,2BAA2BG,OAAa;CAC7C,MAAMa,QAAQhC,0BAA0BiC,KAAKd,MAAMW,KAAI,CAAA;CACvD,IAAI,CAACE,QAAQ,IACT,MAAMlB,uBAAAA;CAGV,IAAI;EACA,MAAMoB,MAAMvC,oBAAoBqC,MAAM,EAAE;EACxC,IAAIE,IAAIC,eAAe,GACnB,MAAMrB,uBAAAA;EAGV,MAAML,cAAc,IAAIhB,gBAAgByC,GAAAA;EACxC,IACIzB,YAAY2B,SAAS,QAAA,CAAA,CAAUb,QAAQ,OAAO,EAAA,MAC9CS,MAAM,EAAE,CAACT,QAAQ,OAAO,EAAA,GAExB,MAAMT,uBAAAA;EAGV,OAAOL;CACX,QAAQ;EACJ,MAAMK,uBAAAA;CACV;AACJ;AAEA,SAASC,mBAAmBI,OAAa;CACrC,IAAIA,MAAMM,SAAS3B,+BACf,MAAMgB,uBAAAA;AAEd;AAEA,SAASA,yBAAAA;CACL,OAAO,IAAIpB,gBAAgB,uDAAA;AAC/B"}
1
+ {"version":3,"file":"client-certificate.mjs","names":["X509Certificate","BadRequestError","base64ToArrayBuffer","buildClientCertificateThumbprint","parseClientCertificateChain","MAX_CERTIFICATE_HEADER_LENGTH","MAX_CERTIFICATE_CHAIN_LENGTH","STRUCTURED_BINARY_PATTERN","extractClientCertificateEvidence","event","source","undefined","result","extractStandardEvidence","extractForwardedEvidence","thumbprint","certificate","leafHeader","headers","get","chainHeader","certificateHeaderError","assertHeaderLength","parseStructuredCertificate","chain","parseStructuredCertificateList","value","pem","includes","decodeURIComponent","replace","certificates","length","items","split","map","item","trim","some","match","exec","raw","byteLength","toString"],"sources":["../../../../src/adapters/http/request/client-certificate.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 '../../../core/client-certificate/reflect.ts';\nimport { X509Certificate } from '@peculiar/x509';\nimport { BadRequestError } from '@authup/errors';\nimport { base64ToArrayBuffer } from '@authup/kit';\nimport type { IAppEvent } from 'routup';\nimport type { ClientCertificateEvidence } from '../../../core/index.ts';\nimport {\n buildClientCertificateThumbprint,\n parseClientCertificateChain,\n} from '../../../core/index.ts';\nimport type { CertificateSource } from './types.ts';\n\nconst MAX_CERTIFICATE_HEADER_LENGTH = 128 * 1024;\nconst MAX_CERTIFICATE_CHAIN_LENGTH = 10;\nconst STRUCTURED_BINARY_PATTERN = /^:([A-Za-z0-9+/]*={0,2}):$/;\n\nexport async function extractClientCertificateEvidence(\n event: IAppEvent,\n source: CertificateSource,\n): Promise<ClientCertificateEvidence | undefined> {\n if (source === 'disabled') {\n return undefined;\n }\n\n let result: Omit<ClientCertificateEvidence, 'thumbprint'> | undefined;\n if (source === 'standard') {\n result = extractStandardEvidence(event);\n } else if (source === 'forwarded') {\n result = extractForwardedEvidence(event);\n } else {\n throw new BadRequestError('The client certificate source is not configured correctly.');\n }\n if (!result) {\n return undefined;\n }\n\n return {\n ...result,\n thumbprint: await buildClientCertificateThumbprint(result.certificate),\n };\n}\n\nfunction extractStandardEvidence(\n event: IAppEvent,\n): Omit<ClientCertificateEvidence, 'thumbprint'> | undefined {\n const leafHeader = event.headers.get('client-cert');\n const chainHeader = event.headers.get('client-cert-chain');\n\n if (!leafHeader) {\n if (chainHeader) {\n throw certificateHeaderError();\n }\n return undefined;\n }\n\n assertHeaderLength(leafHeader);\n const certificate = parseStructuredCertificate(leafHeader);\n const chain = chainHeader ? parseStructuredCertificateList(chainHeader) : [];\n\n return { certificate, chain };\n}\n\nfunction extractForwardedEvidence(\n event: IAppEvent,\n): Omit<ClientCertificateEvidence, 'thumbprint'> | undefined {\n const value = event.headers.get('x-forwarded-tls-client-cert');\n if (!value) {\n return undefined;\n }\n\n assertHeaderLength(value);\n\n let pem: string;\n try {\n // Native raw PEM is useful in tests and a few proxy integrations. The\n // NGINX/Traefik contract is escaped PEM: query-style `+` represents a\n // space, while literal base64 plus signs arrive as `%2B`.\n pem = value.includes('-----BEGIN CERTIFICATE-----') ?\n value :\n decodeURIComponent(value.replace(/\\+/g, '%20'));\n } catch {\n throw certificateHeaderError();\n }\n\n let certificates: X509Certificate[];\n try {\n certificates = parseClientCertificateChain(pem);\n } catch {\n throw certificateHeaderError();\n }\n\n if (certificates.length !== 1 || !certificates[0]) {\n throw certificateHeaderError();\n }\n\n return {\n certificate: certificates[0],\n chain: [],\n };\n}\n\nfunction parseStructuredCertificateList(value: string): X509Certificate[] {\n assertHeaderLength(value);\n const items = value.split(',').map((item) => item.trim());\n if (items.length > MAX_CERTIFICATE_CHAIN_LENGTH || items.some((item) => item.length === 0)) {\n throw certificateHeaderError();\n }\n\n return items.map(parseStructuredCertificate);\n}\n\nfunction parseStructuredCertificate(value: string): X509Certificate {\n const match = STRUCTURED_BINARY_PATTERN.exec(value.trim());\n if (!match?.[1]) {\n throw certificateHeaderError();\n }\n\n try {\n const raw = base64ToArrayBuffer(match[1]);\n if (raw.byteLength === 0) {\n throw certificateHeaderError();\n }\n\n const certificate = new X509Certificate(raw);\n if (\n certificate.toString('base64').replace(/=+$/, '') !==\n match[1].replace(/=+$/, '')\n ) {\n throw certificateHeaderError();\n }\n\n return certificate;\n } catch {\n throw certificateHeaderError();\n }\n}\n\nfunction assertHeaderLength(value: string): void {\n if (value.length > MAX_CERTIFICATE_HEADER_LENGTH) {\n throw certificateHeaderError();\n }\n}\n\nfunction certificateHeaderError(): BadRequestError {\n return new BadRequestError('The forwarded client certificate header is malformed.');\n}\n"],"mappings":";;;;;;;;;;AAmBA,MAAMK,gCAAgC;AACtC,MAAMC,+BAA+B;AACrC,MAAMC,4BAA4B;AAElC,eAAsBC,iCAClBC,OACAC,QAAyB;CAEzB,IAAIA,WAAW,YACX;CAGJ,IAAIE;CACJ,IAAIF,WAAW,YACXE,SAASC,wBAAwBJ,KAAAA;MAC9B,IAAIC,WAAW,aAClBE,SAASE,yBAAyBL,KAAAA;MAElC,MAAM,IAAIR,gBAAgB,4DAAA;CAE9B,IAAI,CAACW,QACD;CAGJ,OAAO;EACH,GAAGA;EACHG,YAAY,MAAMZ,iCAAiCS,OAAOI,WAAW;CACzE;AACJ;AAEA,SAASH,wBACLJ,OAAgB;CAEhB,MAAMQ,aAAaR,MAAMS,QAAQC,IAAI,aAAA;CACrC,MAAMC,cAAcX,MAAMS,QAAQC,IAAI,mBAAA;CAEtC,IAAI,CAACF,YAAY;EACb,IAAIG,aACA,MAAMC,uBAAAA;EAEV;CACJ;CAEAC,mBAAmBL,UAAAA;CAInB,OAAO;EAAED,aAHWO,2BAA2BN,UAGtCD;EAAaQ,OAFRJ,cAAcK,+BAA+BL,WAAAA,IAAe,CAAA;CAE9C;AAChC;AAEA,SAASN,yBACLL,OAAgB;CAEhB,MAAMiB,QAAQjB,MAAMS,QAAQC,IAAI,6BAAA;CAChC,IAAI,CAACO,OACD;CAGJJ,mBAAmBI,KAAAA;CAEnB,IAAIC;CACJ,IAAI;EAIAA,MAAMD,MAAME,SAAS,6BAAA,IACjBF,QACAG,mBAAmBH,MAAMI,QAAQ,OAAO,KAAA,CAAA;CAChD,QAAQ;EACJ,MAAMT,uBAAAA;CACV;CAEA,IAAIU;CACJ,IAAI;EACAA,eAAe3B,4BAA4BuB,GAAAA;CAC/C,QAAQ;EACJ,MAAMN,uBAAAA;CACV;CAEA,IAAIU,aAAaC,WAAW,KAAK,CAACD,aAAa,IAC3C,MAAMV,uBAAAA;CAGV,OAAO;EACHL,aAAae,aAAa;EAC1BP,OAAO,CAAA;CACX;AACJ;AAEA,SAASC,+BAA+BC,OAAa;CACjDJ,mBAAmBI,KAAAA;CACnB,MAAMO,QAAQP,MAAMQ,MAAM,GAAA,CAAA,CAAKC,KAAKC,SAASA,KAAKC,KAAI,CAAA;CACtD,IAAIJ,MAAMD,SAAS1B,gCAAgC2B,MAAMK,MAAMF,SAASA,KAAKJ,WAAW,CAAA,GACpF,MAAMX,uBAAAA;CAGV,OAAOY,MAAME,IAAIZ,0BAAAA;AACrB;AAEA,SAASA,2BAA2BG,OAAa;CAC7C,MAAMa,QAAQhC,0BAA0BiC,KAAKd,MAAMW,KAAI,CAAA;CACvD,IAAI,CAACE,QAAQ,IACT,MAAMlB,uBAAAA;CAGV,IAAI;EACA,MAAMoB,MAAMvC,oBAAoBqC,MAAM,EAAE;EACxC,IAAIE,IAAIC,eAAe,GACnB,MAAMrB,uBAAAA;EAGV,MAAML,cAAc,IAAIhB,gBAAgByC,GAAAA;EACxC,IACIzB,YAAY2B,SAAS,QAAA,CAAA,CAAUb,QAAQ,OAAO,EAAA,MAC9CS,MAAM,EAAE,CAACT,QAAQ,OAAO,EAAA,GAExB,MAAMT,uBAAAA;EAGV,OAAOL;CACX,QAAQ;EACJ,MAAMK,uBAAAA;CACV;AACJ;AAEA,SAASC,mBAAmBI,OAAa;CACrC,IAAIA,MAAMM,SAAS3B,+BACf,MAAMgB,uBAAAA;AAEd;AAEA,SAASA,yBAAAA;CACL,OAAO,IAAIpB,gBAAgB,uDAAA;AAC/B"}
@@ -19,9 +19,7 @@ async function readFromLocations(event, locations) {
19
19
  case "params":
20
20
  Object.assign(out, event.params);
21
21
  break;
22
- case "cookies":
23
- Object.assign(out, useRequestCookies(event));
24
- break;
22
+ case "cookies": Object.assign(out, useRequestCookies(event));
25
23
  }
26
24
  return out;
27
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"locations.mjs","names":["readRequestBody","useRequestCookies","useRequestQuery","readFromLocations","event","locations","out","loc","body","Object","assign","params"],"sources":["../../../../../src/adapters/http/request/helpers/locations.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 type { IAppEvent } from 'routup';\nimport { readRequestBody } from '@routup/basic/body';\nimport { useRequestCookies } from '@routup/basic/cookie';\nimport { useRequestQuery } from '@routup/basic/query';\n\nexport type RequestDataLocation = 'body' | 'query' | 'params' | 'cookies';\n\nexport async function readFromLocations(\n event: IAppEvent,\n locations: RequestDataLocation[],\n): Promise<Record<string, any>> {\n const out: Record<string, any> = {};\n for (const loc of locations) {\n switch (loc) {\n case 'body': {\n const body = await readRequestBody(event);\n if (body && typeof body === 'object') {\n Object.assign(out, body);\n }\n break;\n }\n case 'query': {\n Object.assign(out, useRequestQuery(event));\n break;\n }\n case 'params': {\n Object.assign(out, event.params);\n break;\n }\n case 'cookies': {\n Object.assign(out, useRequestCookies(event));\n break;\n }\n }\n }\n return out;\n}\n"],"mappings":";;;;;;;AAcA,eAAsBG,kBAClBC,OACAC,WAAgC;CAEhC,MAAMC,MAA2B,CAAC;CAClC,KAAK,MAAMC,OAAOF,WACd,QAAQE,KAAR;EACI,KAAK,QAAQ;GACT,MAAMC,OAAO,MAAMR,gBAAgBI,KAAAA;GACnC,IAAII,QAAQ,OAAOA,SAAS,UACxBC,OAAOC,OAAOJ,KAAKE,IAAAA;GAEvB;EACJ;EACA,KAAK;GACDC,OAAOC,OAAOJ,KAAKJ,gBAAgBE,KAAAA,CAAAA;GACnC;EAEJ,KAAK;GACDK,OAAOC,OAAOJ,KAAKF,MAAMO,MAAM;GAC/B;EAEJ,KAAK;GACDF,OAAOC,OAAOJ,KAAKL,kBAAkBG,KAAAA,CAAAA;GACrC;CAER;CAEJ,OAAOE;AACX"}
1
+ {"version":3,"file":"locations.mjs","names":["readRequestBody","useRequestCookies","useRequestQuery","readFromLocations","event","locations","out","loc","body","Object","assign","params"],"sources":["../../../../../src/adapters/http/request/helpers/locations.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 type { IAppEvent } from 'routup';\nimport { readRequestBody } from '@routup/basic/body';\nimport { useRequestCookies } from '@routup/basic/cookie';\nimport { useRequestQuery } from '@routup/basic/query';\n\nexport type RequestDataLocation = 'body' | 'query' | 'params' | 'cookies';\n\nexport async function readFromLocations(\n event: IAppEvent,\n locations: RequestDataLocation[],\n): Promise<Record<string, any>> {\n const out: Record<string, any> = {};\n for (const loc of locations) {\n switch (loc) {\n case 'body': {\n const body = await readRequestBody(event);\n if (body && typeof body === 'object') {\n Object.assign(out, body);\n }\n break;\n }\n case 'query': {\n Object.assign(out, useRequestQuery(event));\n break;\n }\n case 'params': {\n Object.assign(out, event.params);\n break;\n }\n case 'cookies': {\n Object.assign(out, useRequestCookies(event));\n break;\n }\n }\n }\n return out;\n}\n"],"mappings":";;;;;;;AAcA,eAAsBG,kBAClBC,OACAC,WAAgC;CAEhC,MAAMC,MAA2B,CAAC;CAClC,KAAK,MAAMC,OAAOF,WACd,QAAQE,KAAR;EACI,KAAK,QAAQ;GACT,MAAMC,OAAO,MAAMR,gBAAgBI,KAAAA;GACnC,IAAII,QAAQ,OAAOA,SAAS,UACxBC,OAAOC,OAAOJ,KAAKE,IAAAA;GAEvB;EACJ;EACA,KAAK;GACDC,OAAOC,OAAOJ,KAAKJ,gBAAgBE,KAAAA,CAAAA;GACnC;EAEJ,KAAK;GACDK,OAAOC,OAAOJ,KAAKF,MAAMO,MAAM;GAC/B;EAEJ,KAAK,WACDF,OAAOC,OAAOJ,KAAKL,kBAAkBG,KAAAA,CAAAA;CAG7C;CAEJ,OAAOE;AACX"}
@@ -0,0 +1,4 @@
1
+ export * from './module.ts';
2
+ export * from './ref.ts';
3
+ export * from './types.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/http/ui/account-console/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ import "node:path";
2
+ import "node:url";
3
+ import.meta.url;
4
+ import { ACCOUNT_CONSOLE_REF_MAX_LENGTH, resolveAccountConsoleRef } from "./ref.mjs";
5
+ import { resolveAccountConsoleDistPath, serveAccountConsolePage, setAccountConsolePackagePath } from "./module.mjs";
6
+ export { ACCOUNT_CONSOLE_REF_MAX_LENGTH, resolveAccountConsoleDistPath, resolveAccountConsoleRef, serveAccountConsolePage, setAccountConsolePackagePath };