@axium/server 0.24.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/build/client/_app/immutable/assets/account.dAAx7bby.css +1 -0
  2. package/build/client/_app/immutable/assets/account.dAAx7bby.css.br +0 -0
  3. package/build/client/_app/immutable/assets/account.dAAx7bby.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/list.DVGH0BeP.css +1 -0
  5. package/build/client/_app/immutable/assets/list.DVGH0BeP.css.br +0 -0
  6. package/build/client/_app/immutable/assets/list.DVGH0BeP.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css +1 -0
  8. package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css.br +2 -0
  9. package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css.gz +0 -0
  10. package/build/client/_app/immutable/chunks/46qGscyh.js +2 -0
  11. package/build/client/_app/immutable/chunks/46qGscyh.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/46qGscyh.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/B2Vkpbkw.js +2 -0
  14. package/build/client/_app/immutable/chunks/B2Vkpbkw.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/B2Vkpbkw.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/BKixenYx.js +1 -0
  17. package/build/client/_app/immutable/chunks/BKixenYx.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BKixenYx.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/BLtAtlP3.js +1 -0
  20. package/build/client/_app/immutable/chunks/BLtAtlP3.js.br +2 -0
  21. package/build/client/_app/immutable/chunks/BLtAtlP3.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/BNTlty5m.js +1 -0
  23. package/build/client/_app/immutable/chunks/BNTlty5m.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BNTlty5m.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/Beh6Ec8J.js +1 -0
  26. package/build/client/_app/immutable/chunks/Beh6Ec8J.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/Beh6Ec8J.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/BrUe-Qen.js +1 -0
  29. package/build/client/_app/immutable/chunks/BrUe-Qen.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BrUe-Qen.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/Bs4cD_pX.js +1 -0
  32. package/build/client/_app/immutable/chunks/Bs4cD_pX.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/Bs4cD_pX.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/C62F-tXu.js +1 -0
  35. package/build/client/_app/immutable/chunks/C62F-tXu.js.br +1 -0
  36. package/build/client/_app/immutable/chunks/C62F-tXu.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/CUBtP2L9.js +23 -0
  38. package/build/client/_app/immutable/chunks/CUBtP2L9.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/CUBtP2L9.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/Ch16TNvP.js +1 -0
  41. package/build/client/_app/immutable/chunks/Ch16TNvP.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/Ch16TNvP.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/CoYD6HNm.js +1 -0
  44. package/build/client/_app/immutable/chunks/CoYD6HNm.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/CoYD6HNm.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/D40Zn55h.js +1 -0
  47. package/build/client/_app/immutable/chunks/D40Zn55h.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/D40Zn55h.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/DW7-1esk.js +21 -0
  50. package/build/client/_app/immutable/chunks/DW7-1esk.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/DW7-1esk.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/DY4fWHx_.js +1 -0
  53. package/build/client/_app/immutable/chunks/DY4fWHx_.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/DY4fWHx_.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/DvOBbqVY.js +1 -0
  56. package/build/client/_app/immutable/chunks/DvOBbqVY.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/DvOBbqVY.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/DwZYWemd.js +1 -0
  59. package/build/client/_app/immutable/chunks/DwZYWemd.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/DwZYWemd.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/Dy2Ho0cF.js +1 -0
  62. package/build/client/_app/immutable/chunks/Dy2Ho0cF.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/Dy2Ho0cF.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/FTv0qR3w.js +1 -0
  65. package/build/client/_app/immutable/chunks/FTv0qR3w.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/FTv0qR3w.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/NeK0YGoY.js +1 -0
  68. package/build/client/_app/immutable/chunks/NeK0YGoY.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/NeK0YGoY.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/aArGsq9c.js +1 -0
  71. package/build/client/_app/immutable/chunks/aArGsq9c.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/aArGsq9c.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/lH47zGKU.js +1 -0
  74. package/build/client/_app/immutable/chunks/lH47zGKU.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/lH47zGKU.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/sMHjBQqw.js +1 -0
  77. package/build/client/_app/immutable/chunks/sMHjBQqw.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/sMHjBQqw.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/vQfHcJV6.js +2 -0
  80. package/build/client/_app/immutable/chunks/vQfHcJV6.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/vQfHcJV6.js.gz +0 -0
  82. package/build/client/_app/immutable/entry/app.pLVZKpSD.js +2 -0
  83. package/build/client/_app/immutable/entry/app.pLVZKpSD.js.br +0 -0
  84. package/build/client/_app/immutable/entry/app.pLVZKpSD.js.gz +0 -0
  85. package/build/client/_app/immutable/entry/start.CUaVsIrY.js +1 -0
  86. package/build/client/_app/immutable/entry/start.CUaVsIrY.js.br +2 -0
  87. package/build/client/_app/immutable/entry/start.CUaVsIrY.js.gz +0 -0
  88. package/build/client/_app/immutable/nodes/0.D7hET-Bq.js +1 -0
  89. package/build/client/_app/immutable/nodes/0.D7hET-Bq.js.br +0 -0
  90. package/build/client/_app/immutable/nodes/0.D7hET-Bq.js.gz +0 -0
  91. package/build/client/_app/immutable/nodes/1.BWU-JJm_.js +1 -0
  92. package/build/client/_app/immutable/nodes/1.BWU-JJm_.js.br +2 -0
  93. package/build/client/_app/immutable/nodes/1.BWU-JJm_.js.gz +0 -0
  94. package/build/client/_app/immutable/nodes/10.C5N2XBee.js +1 -0
  95. package/build/client/_app/immutable/nodes/10.C5N2XBee.js.br +0 -0
  96. package/build/client/_app/immutable/nodes/10.C5N2XBee.js.gz +0 -0
  97. package/build/client/_app/immutable/nodes/11.CerbuSAv.js +1 -0
  98. package/build/client/_app/immutable/nodes/11.CerbuSAv.js.br +0 -0
  99. package/build/client/_app/immutable/nodes/11.CerbuSAv.js.gz +0 -0
  100. package/build/client/_app/immutable/nodes/12.Z4B9zS78.js +1 -0
  101. package/build/client/_app/immutable/nodes/12.Z4B9zS78.js.br +0 -0
  102. package/build/client/_app/immutable/nodes/12.Z4B9zS78.js.gz +0 -0
  103. package/build/client/_app/immutable/nodes/13.CuICShck.js +1 -0
  104. package/build/client/_app/immutable/nodes/13.CuICShck.js.br +0 -0
  105. package/build/client/_app/immutable/nodes/13.CuICShck.js.gz +0 -0
  106. package/build/client/_app/immutable/nodes/14.BSEF5oaF.js +1 -0
  107. package/build/client/_app/immutable/nodes/14.BSEF5oaF.js.br +0 -0
  108. package/build/client/_app/immutable/nodes/14.BSEF5oaF.js.gz +0 -0
  109. package/build/client/_app/immutable/nodes/15.D1nsmo6j.js +1 -0
  110. package/build/client/_app/immutable/nodes/15.D1nsmo6j.js.br +0 -0
  111. package/build/client/_app/immutable/nodes/15.D1nsmo6j.js.gz +0 -0
  112. package/build/client/_app/immutable/nodes/2.DQ1JcYgz.js +1 -0
  113. package/build/client/_app/immutable/nodes/2.DQ1JcYgz.js.br +0 -0
  114. package/build/client/_app/immutable/nodes/2.DQ1JcYgz.js.gz +0 -0
  115. package/build/client/_app/immutable/nodes/3.BJp2JEtW.js +1 -0
  116. package/build/client/_app/immutable/nodes/3.BJp2JEtW.js.br +0 -0
  117. package/build/client/_app/immutable/nodes/3.BJp2JEtW.js.gz +0 -0
  118. package/build/client/_app/immutable/nodes/4.Cvn_QsIx.js +1 -0
  119. package/build/client/_app/immutable/nodes/4.Cvn_QsIx.js.br +0 -0
  120. package/build/client/_app/immutable/nodes/4.Cvn_QsIx.js.gz +0 -0
  121. package/build/client/_app/immutable/nodes/5.DgPP9GX3.js +1 -0
  122. package/build/client/_app/immutable/nodes/5.DgPP9GX3.js.br +0 -0
  123. package/build/client/_app/immutable/nodes/5.DgPP9GX3.js.gz +0 -0
  124. package/build/client/_app/immutable/nodes/6.DKIzms8i.js +2 -0
  125. package/build/client/_app/immutable/nodes/6.DKIzms8i.js.br +0 -0
  126. package/build/client/_app/immutable/nodes/6.DKIzms8i.js.gz +0 -0
  127. package/build/client/_app/immutable/nodes/7.3UigVXV4.js +1 -0
  128. package/build/client/_app/immutable/nodes/7.3UigVXV4.js.br +0 -0
  129. package/build/client/_app/immutable/nodes/7.3UigVXV4.js.gz +0 -0
  130. package/build/client/_app/immutable/nodes/8.B8s2TdNQ.js +1 -0
  131. package/build/client/_app/immutable/nodes/8.B8s2TdNQ.js.br +0 -0
  132. package/build/client/_app/immutable/nodes/8.B8s2TdNQ.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/9.LBMMe2kc.js +1 -0
  134. package/build/client/_app/immutable/nodes/9.LBMMe2kc.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/9.LBMMe2kc.js.gz +0 -0
  136. package/build/client/_app/version.json +1 -1
  137. package/build/client/_app/version.json.br +0 -0
  138. package/build/client/_app/version.json.gz +0 -0
  139. package/build/client/styles.css +28 -0
  140. package/build/client/styles.css.br +0 -0
  141. package/build/client/styles.css.gz +0 -0
  142. package/build/handler.js +20 -3
  143. package/build/server/chunks/0-CNbALTKz.js +9 -0
  144. package/build/server/chunks/0-CNbALTKz.js.map +1 -0
  145. package/build/server/chunks/1-Dgxy393u.js +9 -0
  146. package/build/server/chunks/1-Dgxy393u.js.map +1 -0
  147. package/build/server/chunks/10-DovmbqKa.js +14 -0
  148. package/build/server/chunks/10-DovmbqKa.js.map +1 -0
  149. package/build/server/chunks/11-CRK_ubcl.js +14 -0
  150. package/build/server/chunks/11-CRK_ubcl.js.map +1 -0
  151. package/build/server/chunks/12-SbQlwMfe.js +9 -0
  152. package/build/server/chunks/12-SbQlwMfe.js.map +1 -0
  153. package/build/server/chunks/13-CbniIW7F.js +14 -0
  154. package/build/server/chunks/13-CbniIW7F.js.map +1 -0
  155. package/build/server/chunks/14-D9Vb_8Yx.js +9 -0
  156. package/build/server/chunks/14-D9Vb_8Yx.js.map +1 -0
  157. package/build/server/chunks/15-D-75Hdef.js +9 -0
  158. package/build/server/chunks/15-D-75Hdef.js.map +1 -0
  159. package/build/server/chunks/2-57exN8ae.js +14 -0
  160. package/build/server/chunks/2-57exN8ae.js.map +1 -0
  161. package/build/server/chunks/3-DNQft-pY.js +9 -0
  162. package/build/server/chunks/{2-CXlrhpR6.js.map → 3-DNQft-pY.js.map} +1 -1
  163. package/build/server/chunks/4-D9Bwp-f8.js +14 -0
  164. package/build/server/chunks/4-D9Bwp-f8.js.map +1 -0
  165. package/build/server/chunks/5-COEQwZNP.js +14 -0
  166. package/build/server/chunks/5-COEQwZNP.js.map +1 -0
  167. package/build/server/chunks/6-RT4yiDcP.js +14 -0
  168. package/build/server/chunks/6-RT4yiDcP.js.map +1 -0
  169. package/build/server/chunks/7-CVqF_r5D.js +14 -0
  170. package/build/server/chunks/7-CVqF_r5D.js.map +1 -0
  171. package/build/server/chunks/8-C5SO-sVH.js +14 -0
  172. package/build/server/chunks/8-C5SO-sVH.js.map +1 -0
  173. package/build/server/chunks/9-DoCOKtY-.js +14 -0
  174. package/build/server/chunks/9-DoCOKtY-.js.map +1 -0
  175. package/build/server/chunks/FormDialog-ZCY0chY1.js +102 -0
  176. package/build/server/chunks/FormDialog-ZCY0chY1.js.map +1 -0
  177. package/build/server/chunks/Icon-BVo9qbDf.js +30 -0
  178. package/build/server/chunks/Icon-BVo9qbDf.js.map +1 -0
  179. package/build/server/chunks/Logout-CmBZgu0j.js +46 -0
  180. package/build/server/chunks/Logout-CmBZgu0j.js.map +1 -0
  181. package/build/server/chunks/_layout.svelte-DuS006VZ.js +33 -0
  182. package/build/server/chunks/_layout.svelte-DuS006VZ.js.map +1 -0
  183. package/build/server/chunks/_page.svelte-BFVobcI7.js +14 -0
  184. package/build/server/chunks/_page.svelte-BFVobcI7.js.map +1 -0
  185. package/build/server/chunks/_page.svelte-B_cvhWJS.js +66 -0
  186. package/build/server/chunks/_page.svelte-B_cvhWJS.js.map +1 -0
  187. package/build/server/chunks/_page.svelte-BriaBR9l.js +28 -0
  188. package/build/server/chunks/_page.svelte-BriaBR9l.js.map +1 -0
  189. package/build/server/chunks/_page.svelte-BtQQzT7H.js +72 -0
  190. package/build/server/chunks/_page.svelte-BtQQzT7H.js.map +1 -0
  191. package/build/server/chunks/_page.svelte-C8D3c3yB.js +64 -0
  192. package/build/server/chunks/_page.svelte-C8D3c3yB.js.map +1 -0
  193. package/build/server/chunks/_page.svelte-CVSb9eHQ.js +24 -0
  194. package/build/server/chunks/_page.svelte-CVSb9eHQ.js.map +1 -0
  195. package/build/server/chunks/_page.svelte-CwRjZqL7.js +107 -0
  196. package/build/server/chunks/_page.svelte-CwRjZqL7.js.map +1 -0
  197. package/build/server/chunks/_page.svelte-D9A9RYjx.js +233 -0
  198. package/build/server/chunks/_page.svelte-D9A9RYjx.js.map +1 -0
  199. package/build/server/chunks/_page.svelte-DGhwqWMM.js +34 -0
  200. package/build/server/chunks/_page.svelte-DGhwqWMM.js.map +1 -0
  201. package/build/server/chunks/_page.svelte-DTvnX95_.js +75 -0
  202. package/build/server/chunks/_page.svelte-DTvnX95_.js.map +1 -0
  203. package/build/server/chunks/_page.svelte-DUfwpXfC.js +122 -0
  204. package/build/server/chunks/_page.svelte-DUfwpXfC.js.map +1 -0
  205. package/build/server/chunks/_page.svelte-DxDoD3rZ.js +37 -0
  206. package/build/server/chunks/_page.svelte-DxDoD3rZ.js.map +1 -0
  207. package/build/server/chunks/_page.svelte-VDBvShZ8.js +6 -0
  208. package/build/server/chunks/_page.svelte-VDBvShZ8.js.map +1 -0
  209. package/build/server/chunks/account-Bf_llRe2.js +446 -0
  210. package/build/server/chunks/account-Bf_llRe2.js.map +1 -0
  211. package/build/server/chunks/auth_redirect-olBYiIF2.js +24 -0
  212. package/build/server/chunks/auth_redirect-olBYiIF2.js.map +1 -0
  213. package/build/server/chunks/color-K_MR7m8s.js +14 -0
  214. package/build/server/chunks/color-K_MR7m8s.js.map +1 -0
  215. package/build/server/chunks/context-R2425nfV.js +64 -0
  216. package/build/server/chunks/context-R2425nfV.js.map +1 -0
  217. package/build/server/chunks/{error.svelte-DNQXZmIO.js → error.svelte-CkSCwrMJ.js} +7 -6
  218. package/build/server/chunks/error.svelte-CkSCwrMJ.js.map +1 -0
  219. package/build/server/chunks/index-CIEcmmdN.js +890 -0
  220. package/build/server/chunks/index-CIEcmmdN.js.map +1 -0
  221. package/build/server/chunks/{index-CvHf_GW2.js → index-Tt4zVDIZ.js} +843 -438
  222. package/build/server/chunks/index-Tt4zVDIZ.js.map +1 -0
  223. package/build/server/chunks/layout.svelte-UxsTmhKc.js +8 -0
  224. package/build/server/chunks/layout.svelte-UxsTmhKc.js.map +1 -0
  225. package/build/server/chunks/{string-DLbvtT1R.js → numbers-DL8C9q4W.js} +1 -71
  226. package/build/server/chunks/numbers-DL8C9q4W.js.map +1 -0
  227. package/build/server/chunks/{FormDialog-CB-2YGWi.js → user2-CRfK67II.js} +12 -206
  228. package/build/server/chunks/user2-CRfK67II.js.map +1 -0
  229. package/build/server/chunks/utils-h74ns7K6.js.map +1 -1
  230. package/build/server/index.js +2304 -1140
  231. package/build/server/index.js.map +1 -1
  232. package/build/server/manifest.js +78 -13
  233. package/build/server/manifest.js.map +1 -1
  234. package/dist/acl.d.ts +1 -2
  235. package/dist/acl.js +1 -1
  236. package/dist/api/acl.js +4 -4
  237. package/dist/api/admin.d.ts +1 -0
  238. package/dist/api/admin.js +152 -0
  239. package/dist/api/index.d.ts +2 -0
  240. package/dist/api/index.js +2 -0
  241. package/dist/api/metadata.js +5 -5
  242. package/dist/api/passkeys.js +10 -10
  243. package/dist/api/register.js +4 -4
  244. package/dist/api/session.js +5 -5
  245. package/dist/api/users.js +52 -49
  246. package/dist/audit.d.ts +8 -39
  247. package/dist/audit.js +13 -16
  248. package/dist/auth.d.ts +4 -11
  249. package/dist/auth.js +4 -4
  250. package/dist/cli.js +515 -559
  251. package/dist/config.d.ts +26 -16
  252. package/dist/config.js +65 -36
  253. package/dist/database.d.ts +3 -4
  254. package/dist/database.js +19 -18
  255. package/dist/internal_requests.d.ts +3 -0
  256. package/dist/internal_requests.js +119 -0
  257. package/dist/io.d.ts +0 -49
  258. package/dist/io.js +23 -171
  259. package/dist/linking.d.ts +0 -1
  260. package/dist/linking.js +5 -8
  261. package/dist/requests.d.ts +10 -6
  262. package/dist/requests.js +17 -15
  263. package/dist/routes.d.ts +6 -10
  264. package/dist/routes.js +7 -8
  265. package/dist/serve.d.ts +7 -2
  266. package/dist/serve.js +170 -13
  267. package/dist/state.js +2 -1
  268. package/package.json +8 -7
  269. package/routes/account/+page.svelte +5 -109
  270. package/routes/admin/+layout.svelte +56 -0
  271. package/routes/admin/+layout.ts +31 -0
  272. package/routes/admin/+page.svelte +39 -0
  273. package/routes/admin/+page.ts +7 -0
  274. package/routes/admin/audit/+page.svelte +158 -0
  275. package/routes/admin/audit/+page.ts +22 -0
  276. package/routes/admin/audit/[id]/+page.svelte +43 -0
  277. package/routes/admin/audit/[id]/+page.ts +9 -0
  278. package/routes/admin/audit/styles.css +31 -0
  279. package/routes/admin/config/+page.svelte +28 -0
  280. package/routes/admin/config/+page.ts +9 -0
  281. package/routes/admin/plugins/+page.svelte +23 -0
  282. package/routes/admin/plugins/+page.ts +7 -0
  283. package/routes/admin/users/+page.svelte +60 -0
  284. package/routes/admin/users/+page.ts +9 -0
  285. package/routes/admin/users/[id]/+page.svelte +108 -0
  286. package/routes/admin/users/[id]/+page.ts +17 -0
  287. package/routes/login/client/+page.svelte +72 -0
  288. package/routes/login/client/+page.ts +27 -0
  289. package/routes/tsconfig.json +1 -1
  290. package/svelte.config.js +4 -10
  291. package/{web/template.html → template.html} +1 -1
  292. package/{web/tsconfig.json → web.tsconfig.json} +2 -2
  293. package/build/client/_app/immutable/chunks/B1E1cVbi.js +0 -1
  294. package/build/client/_app/immutable/chunks/B1E1cVbi.js.br +0 -0
  295. package/build/client/_app/immutable/chunks/B1E1cVbi.js.gz +0 -0
  296. package/build/client/_app/immutable/chunks/CIywFg5g.js +0 -3
  297. package/build/client/_app/immutable/chunks/CIywFg5g.js.br +0 -0
  298. package/build/client/_app/immutable/chunks/CIywFg5g.js.gz +0 -0
  299. package/build/client/_app/immutable/chunks/D3hk2v8y.js +0 -1
  300. package/build/client/_app/immutable/chunks/D3hk2v8y.js.br +0 -2
  301. package/build/client/_app/immutable/chunks/D3hk2v8y.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/D4Bce_hb.js +0 -1
  303. package/build/client/_app/immutable/chunks/D4Bce_hb.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/D4Bce_hb.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/D9TfJrfD.js +0 -1
  306. package/build/client/_app/immutable/chunks/D9TfJrfD.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/D9TfJrfD.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/DJeR1n-B.js +0 -51
  309. package/build/client/_app/immutable/chunks/DJeR1n-B.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/DJeR1n-B.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/DsnmJJEf.js +0 -1
  312. package/build/client/_app/immutable/chunks/DsnmJJEf.js.br +0 -2
  313. package/build/client/_app/immutable/chunks/DsnmJJEf.js.gz +0 -0
  314. package/build/client/_app/immutable/chunks/Dy1O3iBu.js +0 -2
  315. package/build/client/_app/immutable/chunks/Dy1O3iBu.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/Dy1O3iBu.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/pba7IodQ.js +0 -1
  318. package/build/client/_app/immutable/chunks/pba7IodQ.js.br +0 -0
  319. package/build/client/_app/immutable/chunks/pba7IodQ.js.gz +0 -0
  320. package/build/client/_app/immutable/entry/app.ChtScU8h.js +0 -2
  321. package/build/client/_app/immutable/entry/app.ChtScU8h.js.br +0 -0
  322. package/build/client/_app/immutable/entry/app.ChtScU8h.js.gz +0 -0
  323. package/build/client/_app/immutable/entry/start.DdjgBKiR.js +0 -1
  324. package/build/client/_app/immutable/entry/start.DdjgBKiR.js.br +0 -2
  325. package/build/client/_app/immutable/entry/start.DdjgBKiR.js.gz +0 -0
  326. package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js +0 -1
  327. package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js.br +0 -0
  328. package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js.gz +0 -0
  329. package/build/client/_app/immutable/nodes/1.DRjfV_5C.js +0 -1
  330. package/build/client/_app/immutable/nodes/1.DRjfV_5C.js.br +0 -0
  331. package/build/client/_app/immutable/nodes/1.DRjfV_5C.js.gz +0 -0
  332. package/build/client/_app/immutable/nodes/2.CvEpuMc7.js +0 -1
  333. package/build/client/_app/immutable/nodes/2.CvEpuMc7.js.br +0 -0
  334. package/build/client/_app/immutable/nodes/2.CvEpuMc7.js.gz +0 -0
  335. package/build/client/_app/immutable/nodes/3.CVudd8x2.js +0 -7
  336. package/build/client/_app/immutable/nodes/3.CVudd8x2.js.br +0 -0
  337. package/build/client/_app/immutable/nodes/3.CVudd8x2.js.gz +0 -0
  338. package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js +0 -1
  339. package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js.br +0 -0
  340. package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js.gz +0 -0
  341. package/build/client/_app/immutable/nodes/5.CGoBaVII.js +0 -1
  342. package/build/client/_app/immutable/nodes/5.CGoBaVII.js.br +0 -0
  343. package/build/client/_app/immutable/nodes/5.CGoBaVII.js.gz +0 -0
  344. package/build/client/_app/immutable/nodes/6.BtB2uWXy.js +0 -1
  345. package/build/client/_app/immutable/nodes/6.BtB2uWXy.js.br +0 -0
  346. package/build/client/_app/immutable/nodes/6.BtB2uWXy.js.gz +0 -0
  347. package/build/server/chunks/0-DgHTujtC.js +0 -9
  348. package/build/server/chunks/0-DgHTujtC.js.map +0 -1
  349. package/build/server/chunks/1-B3zVLOO8.js +0 -9
  350. package/build/server/chunks/1-B3zVLOO8.js.map +0 -1
  351. package/build/server/chunks/2-CXlrhpR6.js +0 -9
  352. package/build/server/chunks/3-CGT4Ugys.js +0 -13
  353. package/build/server/chunks/3-CGT4Ugys.js.map +0 -1
  354. package/build/server/chunks/4-BscEiwUk.js +0 -9
  355. package/build/server/chunks/4-BscEiwUk.js.map +0 -1
  356. package/build/server/chunks/5-H0ePIJBE.js +0 -9
  357. package/build/server/chunks/5-H0ePIJBE.js.map +0 -1
  358. package/build/server/chunks/6-BrPpcagX.js +0 -9
  359. package/build/server/chunks/6-BrPpcagX.js.map +0 -1
  360. package/build/server/chunks/FormDialog-CB-2YGWi.js.map +0 -1
  361. package/build/server/chunks/Logout-LKOt-AST.js +0 -45
  362. package/build/server/chunks/Logout-LKOt-AST.js.map +0 -1
  363. package/build/server/chunks/_page.svelte-B1LK5J87.js +0 -11
  364. package/build/server/chunks/_page.svelte-B1LK5J87.js.map +0 -1
  365. package/build/server/chunks/_page.svelte-CMtkwvbP.js +0 -68
  366. package/build/server/chunks/_page.svelte-CMtkwvbP.js.map +0 -1
  367. package/build/server/chunks/_page.svelte-CbI2KxeA.js +0 -62
  368. package/build/server/chunks/_page.svelte-CbI2KxeA.js.map +0 -1
  369. package/build/server/chunks/_page.svelte-D1_WJoyP.js +0 -6
  370. package/build/server/chunks/_page.svelte-D1_WJoyP.js.map +0 -1
  371. package/build/server/chunks/_page.svelte-d01Hl2Ia.js +0 -639
  372. package/build/server/chunks/_page.svelte-d01Hl2Ia.js.map +0 -1
  373. package/build/server/chunks/error.svelte-DNQXZmIO.js.map +0 -1
  374. package/build/server/chunks/hooks.server-CQhG9POo.js +0 -17298
  375. package/build/server/chunks/hooks.server-CQhG9POo.js.map +0 -1
  376. package/build/server/chunks/index-CvHf_GW2.js.map +0 -1
  377. package/build/server/chunks/index-RTKpMYZ1.js +0 -397
  378. package/build/server/chunks/index-RTKpMYZ1.js.map +0 -1
  379. package/build/server/chunks/layout.svelte-BSvrn-4a.js +0 -8
  380. package/build/server/chunks/layout.svelte-BSvrn-4a.js.map +0 -1
  381. package/build/server/chunks/string-DLbvtT1R.js.map +0 -1
  382. package/dist/apps.d.ts +0 -6
  383. package/dist/apps.js +0 -6
  384. package/dist/plugins.d.ts +0 -49
  385. package/dist/plugins.js +0 -80
  386. package/dist/sveltekit.d.ts +0 -8
  387. package/dist/sveltekit.js +0 -60
  388. package/web/hooks.server.ts +0 -4
  389. /package/{axiumd.service → axium.service} +0 -0
package/dist/serve.js CHANGED
@@ -1,19 +1,176 @@
1
- import { readFileSync } from 'node:fs';
2
- import { createServer } from 'node:http';
3
- import { createServer as createSecureServer } from 'node:https';
4
- import config from './config.js';
1
+ import { apps } from '@axium/core';
2
+ import { _debugOutput, debug, warn, info } from '@axium/core/node/io';
3
+ import { plugins } from '@axium/core/plugins';
5
4
  import '@axium/server/api/index';
6
- import { loadDefaultConfigs } from '@axium/server/config';
5
+ import { loadDefaultConfigs, reloadConfigs } from '@axium/server/config';
7
6
  import { clean, connect, database } from '@axium/server/database';
8
- import { dirs, logger, output } from '@axium/server/io';
7
+ import { dirs, logger } from '@axium/server/io';
9
8
  import { allLogLevels } from 'logzen';
10
- import { createWriteStream } from 'node:fs';
9
+ import { createWriteStream, readFileSync } from 'node:fs';
10
+ import { createServer, ServerResponse } from 'node:http';
11
+ import { createServer as createSecureServer } from 'node:https';
11
12
  import { join } from 'node:path/posix';
12
- export async function serveSvelteKit(opt) {
13
- const { handler } = await import(opt.build || config.web.build);
13
+ import { styleText } from 'node:util';
14
+ import config from './config.js';
15
+ import { convertFromResponse, convertToRequest } from './internal_requests.js';
16
+ import { error, handleAPIRequest, handleResponseError, json, noCacheHeaders } from './requests.js';
17
+ import { resolveRoute } from './routes.js';
18
+ const template = readFileSync(join(import.meta.dirname, '../template.html'), 'utf-8');
19
+ function fillSvelteKitTemplate({ head, body }, env = {}, nonce = '') {
20
+ return (template
21
+ .replaceAll('%sveltekit.head%', head)
22
+ .replaceAll('%sveltekit.body%', body)
23
+ .replaceAll('%sveltekit.assets%', '')
24
+ // Unused for now.
25
+ .replaceAll('%sveltekit.nonce%', nonce)
26
+ .replace(/%sveltekit\.env\.([^%]+)%/g, (_match, key) => env[key] ?? ''));
27
+ }
28
+ export const appDisabledContent = {
29
+ head: '<title>App Disabled</title>',
30
+ body: '<h1>App Disabled</h1><p>This app is currently disabled.</p>',
31
+ };
32
+ async function handleRequestDefault(req) {
33
+ const url = new URL(req.url);
34
+ const [route, params] = resolveRoute(url) ?? [];
35
+ if (!route && url.pathname === '/' && config.debug_home)
36
+ return new Response(null, { status: 303, headers: { Location: '/_axium/default' } });
37
+ if (config.debug)
38
+ console.log(styleText('blueBright', req.method.padEnd(7)), route ? route.path : url.pathname);
39
+ if (!route) {
40
+ // Check to see if this is for an app that is disabled.
41
+ const maybeApp = url.pathname.split('/')[1];
42
+ if (apps.has(maybeApp) && config.apps.disabled.includes(maybeApp)) {
43
+ const body = fillSvelteKitTemplate(appDisabledContent);
44
+ return new Response(body, { headers: noCacheHeaders, status: 503 });
45
+ }
46
+ return new Response('Not Found', { status: 404 });
47
+ }
48
+ if (route.server == true) {
49
+ if (route.api)
50
+ return await handleAPIRequest(req, params, route).catch(handleResponseError);
51
+ const run = route[req.method];
52
+ if (typeof run !== 'function') {
53
+ error(405, `Method ${req.method} not allowed for ${route.path}`);
54
+ }
55
+ try {
56
+ const result = await run(req, params);
57
+ if (result instanceof Response)
58
+ return result;
59
+ return json(result);
60
+ }
61
+ catch (e) {
62
+ return handleResponseError(e);
63
+ }
64
+ }
65
+ /* const data = await route.load?.(req);
66
+
67
+ const body = fillSvelteKitTemplate(render(route.page, { props: { data } }));
68
+
69
+ return new Response(body, {
70
+ headers: config.web.disable_cache ? noCacheHeaders : {},
71
+ status: 200,
72
+ }); */
73
+ return json({ message: 'Not Implemented' }, { status: 501 });
74
+ }
75
+ const kNext = Symbol('next');
76
+ function __next(error) {
77
+ throw { [kNext]: error };
78
+ }
79
+ async function _getMultiBuildHandler() {
80
+ const handlers = [];
81
+ for (const plugin of plugins.values()) {
82
+ if (!plugin.server?.http_handler)
83
+ continue;
84
+ try {
85
+ const { handler } = await import(join(plugin.dirname, plugin.server.http_handler));
86
+ handlers.push(handler);
87
+ debug(`Loaded plugin handler: ${plugin.name}`);
88
+ }
89
+ catch (e) {
90
+ warn(`Failed to load plugin HTTP handler for ${plugin.name} ${_debugOutput ? ': ' + (e instanceof Error ? e.message : e) : ''}`);
91
+ }
92
+ }
93
+ // @ts-expect-error 7016 - it is plain JS
94
+ const { handler: handleFrontendRequest } = await import('../build/handler.js');
95
+ handlers.push(handleFrontendRequest);
96
+ function handle(incoming, response) {
97
+ for (const handler of handlers) {
98
+ const maybeResponse = new ServerResponse(incoming);
99
+ try {
100
+ handler(incoming, maybeResponse, __next);
101
+ }
102
+ catch (e) {
103
+ if (!e || !(kNext in e)) {
104
+ response.statusCode = 500;
105
+ response.end('Internal Server Error');
106
+ console.error(e);
107
+ return;
108
+ }
109
+ console.debug(`next@${handler.name} (${e[kNext]})`);
110
+ }
111
+ if (maybeResponse.statusCode != 404) {
112
+ response.setHeaders(new Map(Object.entries(maybeResponse.getHeaders())));
113
+ }
114
+ }
115
+ const req = convertToRequest(incoming);
116
+ void handleRequestDefault(req).then(res => convertFromResponse(response, res));
117
+ }
118
+ return handle;
119
+ }
120
+ async function _runRoute(run, request, params) {
121
+ try {
122
+ const result = await run(request, params);
123
+ if (result instanceof Response)
124
+ return result;
125
+ return json(result);
126
+ }
127
+ catch (e) {
128
+ return handleResponseError(e);
129
+ }
130
+ }
131
+ async function _getLinkedBuildHandler(buildPath = '../build/handler.js') {
132
+ const { handler: handleFrontendRequest } = await import(buildPath);
133
+ return function handle(req, res) {
134
+ const url = new URL(req.url, config.auth.origin);
135
+ const [route, params = {}] = resolveRoute(url) ?? [];
136
+ if (!route && url.pathname === '/' && config.debug_home) {
137
+ res.writeHead(303, { Location: '/_axium/default' }).end();
138
+ return;
139
+ }
140
+ if (config.debug)
141
+ console.log(styleText('blueBright', req.method.padEnd(7)), route ? route.path : url.pathname);
142
+ if (route && route.server == true) {
143
+ const request = convertToRequest(req);
144
+ if (route.api) {
145
+ void handleAPIRequest(request, params, route)
146
+ .catch(handleResponseError)
147
+ .then(response => convertFromResponse(res, response));
148
+ return;
149
+ }
150
+ const run = route[request.method]?.bind(route);
151
+ if (typeof run !== 'function') {
152
+ res.writeHead(405).end(`Method ${request.method} not allowed for ${route.path}`);
153
+ return;
154
+ }
155
+ void _runRoute(run, request, params).then(response => convertFromResponse(res, response));
156
+ return;
157
+ }
158
+ // Check to see if this is for an app that is disabled.
159
+ const maybeApp = url.pathname.split('/')[1];
160
+ if (apps.has(maybeApp) && config.apps.disabled.includes(maybeApp)) {
161
+ const body = fillSvelteKitTemplate(appDisabledContent);
162
+ res.writeHead(503, noCacheHeaders).end(body);
163
+ return;
164
+ }
165
+ handleFrontendRequest(req, res);
166
+ return;
167
+ };
168
+ }
169
+ export async function serve(opt) {
170
+ const handle = await _getLinkedBuildHandler(opt.build);
14
171
  if (!opt.secure && !config.web.secure)
15
- return createServer(handler);
16
- return createSecureServer({ key: readFileSync(opt.ssl_key || config.web.ssl_key), cert: readFileSync(opt.ssl_cert || config.web.ssl_cert) }, handler);
172
+ return createServer(handle);
173
+ return createSecureServer({ key: readFileSync(opt.ssl_key || config.web.ssl_key), cert: readFileSync(opt.ssl_cert || config.web.ssl_cert) }, handle);
17
174
  }
18
175
  /**
19
176
  * Perform initial setup for when the server is serving web pages.
@@ -26,7 +183,7 @@ export async function init() {
26
183
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
27
184
  process.on('beforeExit', () => database.destroy());
28
185
  process.on('SIGHUP', () => {
29
- output.info('Reloading configuration.');
30
- void loadDefaultConfigs();
186
+ info('Reloading configuration due to SIGHUP.');
187
+ void reloadConfigs();
31
188
  });
32
189
  }
package/dist/state.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { styleText } from 'node:util';
2
2
  const sym = Symbol.for('Axium:state');
3
3
  globalThis[sym] ||= Object.create({ _errored: false });
4
- let _doWarnings = false;
4
+ const { SHOW_DUPLICATE_STATE } = process.env;
5
+ let _doWarnings = SHOW_DUPLICATE_STATE ? ['1', 'true', 'y', 'yes'].includes(SHOW_DUPLICATE_STATE.toLowerCase()) : false;
5
6
  export function _duplicateStateWarnings(value) {
6
7
  _doWarnings = value;
7
8
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@axium/server",
3
- "version": "0.24.1",
4
- "author": "James Prevett <axium@jamespre.dev> (https://jamespre.dev)",
3
+ "version": "0.26.0",
4
+ "author": "James Prevett <axium@jamespre.dev>",
5
5
  "funding": {
6
6
  "type": "individual",
7
7
  "url": "https://github.com/sponsors/james-pre"
@@ -33,9 +33,10 @@
33
33
  "dist",
34
34
  "routes",
35
35
  "svelte.config.js",
36
- "web",
36
+ "web.tsconfig.json",
37
+ "template.html",
37
38
  "vite.config.js",
38
- "axiumd.service"
39
+ "axium.service"
39
40
  ],
40
41
  "bin": {
41
42
  "axium": "dist/cli.js"
@@ -45,8 +46,8 @@
45
46
  "clean": "rm -rf build .svelte-kit node_modules/{.vite,.vite-temp}"
46
47
  },
47
48
  "peerDependencies": {
48
- "@axium/client": ">=0.4.0",
49
- "@axium/core": ">=0.7.0",
49
+ "@axium/client": ">=0.6.0",
50
+ "@axium/core": ">=0.9.0",
50
51
  "kysely": "^0.28.0",
51
52
  "utilium": "^2.3.8",
52
53
  "zod": "^4.0.5"
@@ -56,7 +57,7 @@
56
57
  "@sveltejs/kit": "^2.23.0",
57
58
  "@types/pg": "^8.11.11",
58
59
  "commander": "^14.0.0",
59
- "cookie": "^1.0.2",
60
+ "cookie_v1": "npm:cookie@^1.0.2",
60
61
  "logzen": "^0.7.0",
61
62
  "pg": "^8.14.1",
62
63
  "svelte": "^5.36.0"
@@ -1,16 +1,8 @@
1
1
  <script lang="ts">
2
- import {
3
- createPasskey,
4
- deletePasskey,
5
- deleteUser,
6
- logout,
7
- logoutAll,
8
- sendVerificationEmail,
9
- updatePasskey,
10
- updateUser,
11
- } from '@axium/client/user';
2
+ import { ClipboardCopy, FormDialog, Icon, Logout, Preferences, SessionList } from '@axium/client/components';
3
+ import '@axium/client/styles/account';
4
+ import { createPasskey, deletePasskey, deleteUser, sendVerificationEmail, updatePasskey, updateUser } from '@axium/client/user';
12
5
  import { getUserImage } from '@axium/core/user';
13
- import { ClipboardCopy, FormDialog, Icon, Logout, Preferences } from '@axium/client/components';
14
6
  import type { PageProps } from './$types';
15
7
 
16
8
  const { data }: PageProps = $props();
@@ -31,7 +23,7 @@
31
23
  </script>
32
24
 
33
25
  <svelte:head>
34
- <title>Account</title>
26
+ <title>Your Account</title>
35
27
  </svelte:head>
36
28
 
37
29
  {#snippet action(name: string, i: string = 'pen')}
@@ -159,45 +151,7 @@
159
151
 
160
152
  <div class="section main">
161
153
  <h3>Sessions</h3>
162
- {#each sessions as session}
163
- <div class="item session">
164
- <p>
165
- {session.id.slice(0, 4)}...{session.id.slice(-4)}
166
- {#if session.id == currentSession.id}
167
- <span class="current">Current</span>
168
- {/if}
169
- {#if session.elevated}
170
- <span class="elevated">Elevated</span>
171
- {/if}
172
- </p>
173
- <p>Created {session.created.toLocaleString()}</p>
174
- <p>Expires {session.expires.toLocaleString()}</p>
175
- {@render action('logout#' + session.id, 'right-from-bracket')}
176
- </div>
177
- <FormDialog
178
- bind:dialog={dialogs['logout#' + session.id]}
179
- submit={async () => {
180
- await logout(user.id, session.id);
181
- dialogs['logout#' + session.id].remove();
182
- sessions.splice(sessions.indexOf(session), 1);
183
- if (session.id == currentSession.id) window.location.href = '/';
184
- }}
185
- submitText="Logout"
186
- >
187
- <p>Are you sure you want to log out this session?</p>
188
- </FormDialog>
189
- {/each}
190
- <span>
191
- <button onclick={() => dialogs.logout_all.showModal()} class="danger">Logout All</button>
192
- </span>
193
- <FormDialog
194
- bind:dialog={dialogs['logout_all']}
195
- submit={() => logoutAll(user.id).then(() => (window.location.href = '/'))}
196
- submitText="Logout All Sessions"
197
- submitDanger
198
- >
199
- <p>Are you sure you want to log out all sessions?</p>
200
- </FormDialog>
154
+ <SessionList {sessions} {currentSession} {user} redirectAfterLogoutAll />
201
155
  </div>
202
156
 
203
157
  <div class="section main">
@@ -233,62 +187,4 @@
233
187
  .signout {
234
188
  margin-top: 2em;
235
189
  }
236
-
237
- .section {
238
- width: 50%;
239
- padding-top: 4em;
240
-
241
- /* This is causing duplicate separators when removing sessions/passkeys
242
- > div:has(+ div) {
243
- border-bottom: 1px solid #8888;
244
- }
245
- */
246
- }
247
-
248
- .section .item {
249
- display: grid;
250
- align-items: center;
251
- width: 100%;
252
- gap: 1em;
253
- text-wrap: nowrap;
254
- border-top: 1px solid #8888;
255
- padding-bottom: 1em;
256
- }
257
-
258
- .info {
259
- grid-template-columns: 10em 1fr 2em;
260
-
261
- > :first-child {
262
- margin-left: 1em;
263
- }
264
-
265
- > :nth-child(2) {
266
- text-overflow: ellipsis;
267
- overflow: hidden;
268
- }
269
- }
270
-
271
- .passkey {
272
- grid-template-columns: 1em 1em 1fr 1fr 1em 1em;
273
-
274
- dfn:not(.disabled) {
275
- cursor: help;
276
- }
277
- }
278
-
279
- .session {
280
- grid-template-columns: 1fr 1fr 1fr 1em;
281
-
282
- .current {
283
- border-radius: 2em;
284
- padding: 0 0.5em;
285
- background-color: #337;
286
- }
287
-
288
- .elevated {
289
- border-radius: 2em;
290
- padding: 0 0.5em;
291
- background-color: #733;
292
- }
293
- }
294
190
  </style>
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ import { Icon } from '@axium/client/components';
3
+ import { capitalize } from 'utilium';
4
+
5
+ let { children, data } = $props();
6
+ </script>
7
+
8
+ <div id="admin-container">
9
+ <div class="sidebar">
10
+ {#each data.tabs as { href, name, icon: i, active }}
11
+ <a {href} class={['item', 'icon-text', active && 'active']}><Icon {i} /> {capitalize(name)}</a>
12
+ {/each}
13
+ </div>
14
+
15
+ <div id="admin-content">
16
+ {@render children()}
17
+ </div>
18
+ </div>
19
+
20
+ <style>
21
+ #admin-container {
22
+ display: grid;
23
+ grid-template-columns: 15em 1fr;
24
+ height: 100%;
25
+ }
26
+
27
+ .sidebar {
28
+ grid-column: 1;
29
+ width: 100%;
30
+ display: inline-flex;
31
+ flex-direction: column;
32
+ gap: 0.5em;
33
+ padding-left: 1em;
34
+ }
35
+
36
+ .item {
37
+ padding: 0.3em 0.5em;
38
+ border-radius: 0.25em 1em 1em 0.25em;
39
+ }
40
+
41
+ .item:hover {
42
+ background-color: var(--bg-accent);
43
+ cursor: pointer;
44
+ }
45
+
46
+ .item.active {
47
+ background-color: var(--bg-accent);
48
+ }
49
+
50
+ #admin-content {
51
+ grid-column: 2;
52
+ padding: 1em;
53
+ overflow-x: hidden;
54
+ overflow-y: scroll;
55
+ }
56
+ </style>
@@ -0,0 +1,31 @@
1
+ import { getCurrentSession } from '@axium/client/user';
2
+ import type { Session, User } from '@axium/core';
3
+ import type { LayoutLoadEvent, LayoutRouteId } from './$types';
4
+
5
+ export const ssr = false;
6
+
7
+ export async function load({
8
+ parent,
9
+ route,
10
+ }: Omit<LayoutLoadEvent, 'parent'> & { parent?(): Promise<{ session?: Session & { user: User } }> }) {
11
+ let { session } = (await parent?.()) ?? { session: null };
12
+
13
+ const tabs = [
14
+ { name: 'dashboard', href: '/admin', icon: 'gauge', active: route.id.endsWith('/admin') },
15
+ {
16
+ name: 'users',
17
+ href: '/admin/users',
18
+ icon: 'user-group',
19
+ active: route.id.endsWith('/admin/users') || route.id.endsWith('/admin/users/[id]'),
20
+ },
21
+ { name: 'configuration', href: '/admin/config', icon: 'sliders', active: route.id.endsWith('/admin/config') },
22
+ { name: 'plugins', href: '/admin/plugins', icon: 'puzzle-piece-simple', active: route.id.endsWith('/admin/plugins') },
23
+ { name: 'audit log', href: '/admin/audit', icon: 'file-shield', active: route.id.endsWith('/admin/audit') },
24
+ ] satisfies { name: string; href: LayoutRouteId; icon: string; active: boolean }[];
25
+
26
+ session ||= await getCurrentSession().catch(() => null);
27
+
28
+ if (!session) location.href = '/login?after=' + encodeURIComponent(location.pathname + location.search);
29
+
30
+ return { session, tabs };
31
+ }
@@ -0,0 +1,39 @@
1
+ <script>
2
+ import { Severity } from '@axium/core';
3
+
4
+ const { data } = $props();
5
+ </script>
6
+
7
+ <svelte:head>
8
+ <title>Admin — Dashboard</title>
9
+ </svelte:head>
10
+
11
+ <h2>Administration</h2>
12
+
13
+ <p>Axium Server version {data.version}</p>
14
+
15
+ <h3><a href="/admin/users">Users</a></h3>
16
+
17
+ <p>{data.users} users, {data.sessions} sessions, {data.passkeys} passkeys.</p>
18
+
19
+ <h3><a href="/admin/config">Configuration</a></h3>
20
+
21
+ <p>{data.configFiles} files loaded.</p>
22
+
23
+ <h3><a href="/admin/plugins">Plugins</a></h3>
24
+
25
+ <p>{data.plugins} plugins loaded.</p>
26
+
27
+ <h3><a href="/admin/audit">Audit Log</a></h3>
28
+
29
+ <p>
30
+ {Object.entries(data.auditEvents)
31
+ .map(([severity, count]) => `${count} ${Severity[severity].toUpperCase()} events`)
32
+ .join(', ')}.
33
+ </p>
34
+
35
+ <style>
36
+ h3 {
37
+ text-decoration: underline;
38
+ }
39
+ </style>
@@ -0,0 +1,7 @@
1
+ import { fetchAPI } from '@axium/client/requests';
2
+
3
+ export const ssr = false;
4
+
5
+ export async function load() {
6
+ return await fetchAPI('GET', 'admin/summary');
7
+ }
@@ -0,0 +1,158 @@
1
+ <script lang="ts">
2
+ import { Icon } from '@axium/client/components';
3
+ import '@axium/client/styles/list';
4
+ import './styles.css';
5
+ import { Severity, severityNames } from '@axium/core';
6
+ import { capitalize } from 'utilium';
7
+
8
+ const { data } = $props();
9
+ </script>
10
+
11
+ <svelte:head>
12
+ <title>Admin — Audit Log</title>
13
+ </svelte:head>
14
+
15
+ <h2>Audit Log</h2>
16
+
17
+ {#if data.filterError}
18
+ <div class="error">
19
+ <strong>Invalid Filter:</strong>
20
+ {#each data.filterError.split('\n') as line}
21
+ <p>{line}</p>
22
+ {/each}
23
+ </div>
24
+ {/if}
25
+
26
+ <form id="filter" method="dialog">
27
+ <h4>Filters</h4>
28
+ <span>Minimum Severity:</span>
29
+ <select name="severity" value={data.filter.severity}>
30
+ {#each severityNames as value}
31
+ <option {value} selected={value == 'info'}>{capitalize(value)}</option>
32
+ {/each}
33
+ </select>
34
+ <span>Since:</span>
35
+ <input type="date" name="since" value={data.filter.since} />
36
+
37
+ <span>Until:</span>
38
+ <input type="date" name="until" value={data.filter.until} />
39
+
40
+ <span>Tags:</span>
41
+ <input type="text" name="tags" value={data.filter.tags} />
42
+
43
+ <span>Event Name:</span>
44
+ {#if data.configured}
45
+ <select name="event">
46
+ <option value="">Any</option>
47
+ {#each data.configured.name as name}
48
+ <option value={name} selected={data.filter.event == name}>{name}</option>
49
+ {/each}
50
+ </select>
51
+ {:else}
52
+ <input type="text" name="event" value={data.filter.event} />
53
+ {/if}
54
+
55
+ <span>Source:</span>
56
+ {#if data.configured}
57
+ <select name="source">
58
+ <option value="">Any</option>
59
+ {#each data.configured.source as source}
60
+ <option value={source} selected={data.filter.source == source}>{source}</option>
61
+ {/each}
62
+ </select>
63
+ {:else}
64
+ <input type="text" name="source" value={data.filter.source} />
65
+ {/if}
66
+
67
+ <span>User UUID:</span>
68
+ <input type="text" name="user" size="36" value={data.filter.user} />
69
+ <button
70
+ onclick={e => {
71
+ e.preventDefault();
72
+ const fd = new FormData(e.currentTarget.form!);
73
+ const params = new URLSearchParams();
74
+ for (let [key, value] of fd.entries()) {
75
+ if (!value) continue;
76
+ switch (key) {
77
+ case 'severity':
78
+ if (value != 'info') params.set(key, value as string);
79
+ break;
80
+ case 'since':
81
+ case 'until':
82
+ params.set(key, new Date(value as string).toISOString());
83
+ break;
84
+ case 'tags':
85
+ for (const tag of value
86
+ .toString()
87
+ .split(',')
88
+ .map(t => t.trim()))
89
+ params.append(key, tag);
90
+ break;
91
+ default:
92
+ params.set(key, value as string);
93
+ }
94
+ }
95
+ location.search = params ? '?' + params.toString() : '';
96
+ }}>Apply</button
97
+ >
98
+ <button
99
+ onclick={e => {
100
+ e.preventDefault();
101
+ location.search = '';
102
+ }}>Reset</button
103
+ >
104
+ </form>
105
+
106
+ <div class="list-container">
107
+ <div class="list">
108
+ <div class="list-item list-header">
109
+ <span>Timestamp</span>
110
+ <span>Severity</span>
111
+ <span>Source</span>
112
+ <span>Name</span>
113
+ <span>Tags</span>
114
+ <span>User</span>
115
+ </div>
116
+
117
+ {#each data.events as event}
118
+ <div class="list-item" onclick={e => e.currentTarget === e.target && (location.href = '/admin/audit/' + event.id)}>
119
+ <span>{new Date(event.timestamp).toLocaleString()}</span>
120
+ <span class="severity--{Severity[event.severity].toLowerCase()}">{Severity[event.severity]}</span>
121
+ <span>{event.source}</span>
122
+ <span>{event.name}</span>
123
+ <span>{event.tags.join(', ')}</span>
124
+ {#if event.user}
125
+ <a href="/admin/users/{event.userId}">
126
+ {event.user.name}
127
+ {#if event.userId === data.session?.userId}<span class="subtle">(You)</span>{/if}
128
+ </a>
129
+ {:else}
130
+ <i>Unknown</i>
131
+ {/if}
132
+ <a href="/admin/audit/{event.id}"><Icon i="chevron-right" /></a>
133
+ </div>
134
+ {:else}
135
+ <p class="list-empty">No audit log events found</p>
136
+ {/each}
137
+ </div>
138
+ </div>
139
+
140
+ <style>
141
+ .list-item {
142
+ grid-template-columns: 15em 10em 10em 1fr 1fr 10em repeat(1, 2em);
143
+ }
144
+
145
+ #filter {
146
+ background-color: var(--bg-menu);
147
+ padding: 1em;
148
+ border-radius: 0.5em;
149
+ display: grid;
150
+ grid-template-columns: repeat(2, 1fr);
151
+ gap: 0.25em;
152
+ width: fit-content;
153
+
154
+ h4 {
155
+ grid-column: 1 / span 2;
156
+ }
157
+ }
158
+ </style>