@axium/server 0.24.0 → 0.25.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 (353) hide show
  1. package/axiumd.service +1 -1
  2. package/build/client/_app/immutable/assets/account.dAAx7bby.css +1 -0
  3. package/build/client/_app/immutable/assets/account.dAAx7bby.css.br +0 -0
  4. package/build/client/_app/immutable/assets/account.dAAx7bby.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/list.DVGH0BeP.css +1 -0
  6. package/build/client/_app/immutable/assets/list.DVGH0BeP.css.br +0 -0
  7. package/build/client/_app/immutable/assets/list.DVGH0BeP.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css +1 -0
  9. package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css.br +2 -0
  10. package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css.gz +0 -0
  11. package/build/client/_app/immutable/chunks/1taVrT-y.js +1 -0
  12. package/build/client/_app/immutable/chunks/1taVrT-y.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/1taVrT-y.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/BSFUgC2l.js +23 -0
  15. package/build/client/_app/immutable/chunks/BSFUgC2l.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/BSFUgC2l.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/Bbzjahjl.js +2 -0
  18. package/build/client/_app/immutable/chunks/Bbzjahjl.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/Bbzjahjl.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/BxjargW5.js +1 -0
  21. package/build/client/_app/immutable/chunks/BxjargW5.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/BxjargW5.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/C2ewTgu8.js +1 -0
  24. package/build/client/_app/immutable/chunks/C2ewTgu8.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/C2ewTgu8.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/CFWAHLsq.js +1 -0
  27. package/build/client/_app/immutable/chunks/CFWAHLsq.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/CFWAHLsq.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/CPL43v-I.js +1 -0
  30. package/build/client/_app/immutable/chunks/CPL43v-I.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/CPL43v-I.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/CTKC36WM.js +1 -0
  33. package/build/client/_app/immutable/chunks/CTKC36WM.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/CTKC36WM.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/CekH6JMP.js +1 -0
  36. package/build/client/_app/immutable/chunks/CekH6JMP.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/CekH6JMP.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/Ch16TNvP.js +1 -0
  39. package/build/client/_app/immutable/chunks/Ch16TNvP.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/Ch16TNvP.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/CqfYW08-.js +1 -0
  42. package/build/client/_app/immutable/chunks/CqfYW08-.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/CqfYW08-.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/D1v6O410.js +1 -0
  45. package/build/client/_app/immutable/chunks/D1v6O410.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/D1v6O410.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/DY4fWHx_.js +1 -0
  48. package/build/client/_app/immutable/chunks/DY4fWHx_.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/DY4fWHx_.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/DdnE6dyJ.js +2 -0
  51. package/build/client/_app/immutable/chunks/DdnE6dyJ.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/DdnE6dyJ.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/DeieCYM0.js +22 -0
  54. package/build/client/_app/immutable/chunks/DeieCYM0.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/DeieCYM0.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/DfUzlYF5.js +1 -0
  57. package/build/client/_app/immutable/chunks/DfUzlYF5.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/DfUzlYF5.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/Dnk28BpG.js +1 -0
  60. package/build/client/_app/immutable/chunks/Dnk28BpG.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/Dnk28BpG.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/KNAS5R2A.js +3 -0
  63. package/build/client/_app/immutable/chunks/KNAS5R2A.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/KNAS5R2A.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/eyJgPND9.js +1 -0
  66. package/build/client/_app/immutable/chunks/eyJgPND9.js.br +1 -0
  67. package/build/client/_app/immutable/chunks/eyJgPND9.js.gz +0 -0
  68. package/build/client/_app/immutable/entry/app.CPF6A_DV.js +2 -0
  69. package/build/client/_app/immutable/entry/app.CPF6A_DV.js.br +0 -0
  70. package/build/client/_app/immutable/entry/app.CPF6A_DV.js.gz +0 -0
  71. package/build/client/_app/immutable/entry/start.Dos_Ttds.js +1 -0
  72. package/build/client/_app/immutable/entry/start.Dos_Ttds.js.br +2 -0
  73. package/build/client/_app/immutable/entry/start.Dos_Ttds.js.gz +0 -0
  74. package/build/client/_app/immutable/nodes/{0.DlE8ZTIF.js → 0.C5HgTRfT.js} +1 -1
  75. package/build/client/_app/immutable/nodes/0.C5HgTRfT.js.br +0 -0
  76. package/build/client/_app/immutable/nodes/0.C5HgTRfT.js.gz +0 -0
  77. package/build/client/_app/immutable/nodes/1.CGcgSoA9.js +1 -0
  78. package/build/client/_app/immutable/nodes/1.CGcgSoA9.js.br +0 -0
  79. package/build/client/_app/immutable/nodes/1.CGcgSoA9.js.gz +0 -0
  80. package/build/client/_app/immutable/nodes/10.ukScuXwz.js +1 -0
  81. package/build/client/_app/immutable/nodes/10.ukScuXwz.js.br +5 -0
  82. package/build/client/_app/immutable/nodes/10.ukScuXwz.js.gz +0 -0
  83. package/build/client/_app/immutable/nodes/11.D3RDNx7M.js +1 -0
  84. package/build/client/_app/immutable/nodes/11.D3RDNx7M.js.br +0 -0
  85. package/build/client/_app/immutable/nodes/11.D3RDNx7M.js.gz +0 -0
  86. package/build/client/_app/immutable/nodes/12._vvpCcSG.js +1 -0
  87. package/build/client/_app/immutable/nodes/12._vvpCcSG.js.br +0 -0
  88. package/build/client/_app/immutable/nodes/12._vvpCcSG.js.gz +0 -0
  89. package/build/client/_app/immutable/nodes/13.BWPzZMQ5.js +1 -0
  90. package/build/client/_app/immutable/nodes/13.BWPzZMQ5.js.br +0 -0
  91. package/build/client/_app/immutable/nodes/13.BWPzZMQ5.js.gz +0 -0
  92. package/build/client/_app/immutable/nodes/14.Cr843Lep.js +1 -0
  93. package/build/client/_app/immutable/nodes/14.Cr843Lep.js.br +0 -0
  94. package/build/client/_app/immutable/nodes/14.Cr843Lep.js.gz +0 -0
  95. package/build/client/_app/immutable/nodes/2.DUpwDjw8.js +1 -0
  96. package/build/client/_app/immutable/nodes/2.DUpwDjw8.js.br +0 -0
  97. package/build/client/_app/immutable/nodes/2.DUpwDjw8.js.gz +0 -0
  98. package/build/client/_app/immutable/nodes/{2.CvEpuMc7.js → 3.DPH7xl7M.js} +1 -1
  99. package/build/client/_app/immutable/nodes/3.DPH7xl7M.js.br +0 -0
  100. package/build/client/_app/immutable/nodes/3.DPH7xl7M.js.gz +0 -0
  101. package/build/client/_app/immutable/nodes/4.Bk0knTIK.js +1 -0
  102. package/build/client/_app/immutable/nodes/4.Bk0knTIK.js.br +0 -0
  103. package/build/client/_app/immutable/nodes/4.Bk0knTIK.js.gz +0 -0
  104. package/build/client/_app/immutable/nodes/5.DwnZ1Bh8.js +1 -0
  105. package/build/client/_app/immutable/nodes/5.DwnZ1Bh8.js.br +0 -0
  106. package/build/client/_app/immutable/nodes/5.DwnZ1Bh8.js.gz +0 -0
  107. package/build/client/_app/immutable/nodes/6.5U-KxFgt.js +2 -0
  108. package/build/client/_app/immutable/nodes/6.5U-KxFgt.js.br +0 -0
  109. package/build/client/_app/immutable/nodes/6.5U-KxFgt.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/7.DFc4sJix.js +1 -0
  111. package/build/client/_app/immutable/nodes/7.DFc4sJix.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/7.DFc4sJix.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/8.BG4bv5P5.js +1 -0
  114. package/build/client/_app/immutable/nodes/8.BG4bv5P5.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/8.BG4bv5P5.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/9.BKljyhOi.js +1 -0
  117. package/build/client/_app/immutable/nodes/9.BKljyhOi.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/9.BKljyhOi.js.gz +0 -0
  119. package/build/client/_app/version.json +1 -1
  120. package/build/client/_app/version.json.br +0 -0
  121. package/build/client/_app/version.json.gz +0 -0
  122. package/build/client/styles.css +7 -0
  123. package/build/client/styles.css.br +0 -0
  124. package/build/client/styles.css.gz +0 -0
  125. package/build/handler.js +20 -3
  126. package/build/server/chunks/0-CZBaNtSI.js +9 -0
  127. package/build/server/chunks/{0-DgHTujtC.js.map → 0-CZBaNtSI.js.map} +1 -1
  128. package/build/server/chunks/1-D_3BtEbe.js +9 -0
  129. package/build/server/chunks/{1-k30i-hic.js.map → 1-D_3BtEbe.js.map} +1 -1
  130. package/build/server/chunks/10-CLkNMKHU.js +13 -0
  131. package/build/server/chunks/10-CLkNMKHU.js.map +1 -0
  132. package/build/server/chunks/11-5xPYR_1w.js +13 -0
  133. package/build/server/chunks/11-5xPYR_1w.js.map +1 -0
  134. package/build/server/chunks/12-N7UaQj7u.js +9 -0
  135. package/build/server/chunks/12-N7UaQj7u.js.map +1 -0
  136. package/build/server/chunks/13-QYVLpXli.js +9 -0
  137. package/build/server/chunks/13-QYVLpXli.js.map +1 -0
  138. package/build/server/chunks/14-CPY578rT.js +9 -0
  139. package/build/server/chunks/14-CPY578rT.js.map +1 -0
  140. package/build/server/chunks/2-_1jFrcvz.js +13 -0
  141. package/build/server/chunks/2-_1jFrcvz.js.map +1 -0
  142. package/build/server/chunks/3-B1CwnVF_.js +9 -0
  143. package/build/server/chunks/{2-CXlrhpR6.js.map → 3-B1CwnVF_.js.map} +1 -1
  144. package/build/server/chunks/4-CcxCcH4F.js +13 -0
  145. package/build/server/chunks/4-CcxCcH4F.js.map +1 -0
  146. package/build/server/chunks/5-CrlH6VoB.js +13 -0
  147. package/build/server/chunks/5-CrlH6VoB.js.map +1 -0
  148. package/build/server/chunks/6-FkP678Uz.js +13 -0
  149. package/build/server/chunks/6-FkP678Uz.js.map +1 -0
  150. package/build/server/chunks/7-B1iCe7VA.js +13 -0
  151. package/build/server/chunks/7-B1iCe7VA.js.map +1 -0
  152. package/build/server/chunks/8-p6n9G-P_.js +13 -0
  153. package/build/server/chunks/8-p6n9G-P_.js.map +1 -0
  154. package/build/server/chunks/9-fc3lKB7X.js +13 -0
  155. package/build/server/chunks/9-fc3lKB7X.js.map +1 -0
  156. package/build/server/chunks/Icon-CG7XnWX5.js +30 -0
  157. package/build/server/chunks/Icon-CG7XnWX5.js.map +1 -0
  158. package/build/server/chunks/Logout-BwzK1P29.js +45 -0
  159. package/build/server/chunks/Logout-BwzK1P29.js.map +1 -0
  160. package/build/server/chunks/_layout.svelte-9KMUotip.js +31 -0
  161. package/build/server/chunks/_layout.svelte-9KMUotip.js.map +1 -0
  162. package/build/server/chunks/_page.svelte-BD3HmLo_.js +28 -0
  163. package/build/server/chunks/_page.svelte-BD3HmLo_.js.map +1 -0
  164. package/build/server/chunks/_page.svelte-BFzPdJ6z.js +105 -0
  165. package/build/server/chunks/_page.svelte-BFzPdJ6z.js.map +1 -0
  166. package/build/server/chunks/_page.svelte-BIxxuzff.js +64 -0
  167. package/build/server/chunks/_page.svelte-BIxxuzff.js.map +1 -0
  168. package/build/server/chunks/_page.svelte-Bou2_u6i.js +13 -0
  169. package/build/server/chunks/_page.svelte-Bou2_u6i.js.map +1 -0
  170. package/build/server/chunks/_page.svelte-C25oQ2NT.js +80 -0
  171. package/build/server/chunks/_page.svelte-C25oQ2NT.js.map +1 -0
  172. package/build/server/chunks/_page.svelte-CAzWL4aq.js +66 -0
  173. package/build/server/chunks/_page.svelte-CAzWL4aq.js.map +1 -0
  174. package/build/server/chunks/_page.svelte-Ci5V-DhL.js +72 -0
  175. package/build/server/chunks/_page.svelte-Ci5V-DhL.js.map +1 -0
  176. package/build/server/chunks/_page.svelte-CnfRSJsl.js +37 -0
  177. package/build/server/chunks/_page.svelte-CnfRSJsl.js.map +1 -0
  178. package/build/server/chunks/_page.svelte-DgyZKeaF.js +231 -0
  179. package/build/server/chunks/_page.svelte-DgyZKeaF.js.map +1 -0
  180. package/build/server/chunks/_page.svelte-VDBvShZ8.js +6 -0
  181. package/build/server/chunks/_page.svelte-VDBvShZ8.js.map +1 -0
  182. package/build/server/chunks/_page.svelte-cAsZlwLs.js +24 -0
  183. package/build/server/chunks/_page.svelte-cAsZlwLs.js.map +1 -0
  184. package/build/server/chunks/_page.svelte-rrN2zFNa.js +66 -0
  185. package/build/server/chunks/_page.svelte-rrN2zFNa.js.map +1 -0
  186. package/build/server/chunks/account-BZSP6KBP.js +445 -0
  187. package/build/server/chunks/account-BZSP6KBP.js.map +1 -0
  188. package/build/server/chunks/color-K_MR7m8s.js +14 -0
  189. package/build/server/chunks/color-K_MR7m8s.js.map +1 -0
  190. package/build/server/chunks/context-R2425nfV.js +64 -0
  191. package/build/server/chunks/context-R2425nfV.js.map +1 -0
  192. package/build/server/chunks/{error.svelte-DNQXZmIO.js → error.svelte-DTrQqomO.js} +8 -7
  193. package/build/server/chunks/error.svelte-DTrQqomO.js.map +1 -0
  194. package/build/server/chunks/index-DJrm8BZm.js +844 -0
  195. package/build/server/chunks/index-DJrm8BZm.js.map +1 -0
  196. package/build/server/chunks/{index-CvHf_GW2.js → index-eKiDBuyI.js} +826 -438
  197. package/build/server/chunks/index-eKiDBuyI.js.map +1 -0
  198. package/build/server/chunks/layout.svelte-UxsTmhKc.js +8 -0
  199. package/build/server/chunks/layout.svelte-UxsTmhKc.js.map +1 -0
  200. package/build/server/chunks/{string-DLbvtT1R.js → numbers-DL8C9q4W.js} +1 -71
  201. package/build/server/chunks/numbers-DL8C9q4W.js.map +1 -0
  202. package/build/server/chunks/{FormDialog-CB-2YGWi.js → user2-Coq3Frtw.js} +102 -203
  203. package/build/server/chunks/user2-Coq3Frtw.js.map +1 -0
  204. package/build/server/chunks/{utils-h74ns7K6.js → utils-DlBYhQz7.js} +2 -1
  205. package/build/server/chunks/utils-DlBYhQz7.js.map +1 -0
  206. package/build/server/index.js +1787 -994
  207. package/build/server/index.js.map +1 -1
  208. package/build/server/manifest.js +70 -13
  209. package/build/server/manifest.js.map +1 -1
  210. package/dist/acl.d.ts +1 -2
  211. package/dist/api/acl.js +4 -4
  212. package/dist/api/admin.d.ts +1 -0
  213. package/dist/api/admin.js +135 -0
  214. package/dist/api/index.d.ts +2 -0
  215. package/dist/api/index.js +2 -0
  216. package/dist/api/metadata.js +3 -3
  217. package/dist/api/passkeys.js +10 -10
  218. package/dist/api/register.js +4 -4
  219. package/dist/api/session.js +5 -5
  220. package/dist/api/users.js +48 -48
  221. package/dist/audit.d.ts +7 -39
  222. package/dist/audit.js +10 -13
  223. package/dist/auth.d.ts +4 -11
  224. package/dist/auth.js +4 -4
  225. package/dist/cli.js +40 -54
  226. package/dist/config.d.ts +24 -14
  227. package/dist/config.js +42 -25
  228. package/dist/database.d.ts +3 -4
  229. package/dist/database.js +12 -12
  230. package/dist/internal_requests.d.ts +3 -0
  231. package/dist/internal_requests.js +119 -0
  232. package/dist/io.d.ts +1 -1
  233. package/dist/io.js +2 -5
  234. package/dist/linking.d.ts +0 -1
  235. package/dist/linking.js +2 -5
  236. package/dist/plugins.d.ts +4 -39
  237. package/dist/plugins.js +35 -51
  238. package/dist/requests.d.ts +5 -5
  239. package/dist/requests.js +14 -14
  240. package/dist/routes.d.ts +6 -10
  241. package/dist/routes.js +4 -5
  242. package/dist/serve.d.ts +3 -2
  243. package/dist/serve.js +165 -13
  244. package/dist/state.js +2 -1
  245. package/package.json +6 -5
  246. package/routes/account/+page.svelte +5 -109
  247. package/routes/admin/+layout.svelte +56 -0
  248. package/routes/admin/+layout.ts +29 -0
  249. package/routes/admin/+page.svelte +39 -0
  250. package/routes/admin/+page.ts +7 -0
  251. package/routes/admin/audit/+page.svelte +137 -0
  252. package/routes/admin/audit/+page.ts +20 -0
  253. package/routes/admin/audit/[id]/+page.svelte +43 -0
  254. package/routes/admin/audit/[id]/+page.ts +9 -0
  255. package/routes/admin/audit/styles.css +31 -0
  256. package/routes/admin/config/+page.svelte +28 -0
  257. package/routes/admin/config/+page.ts +9 -0
  258. package/routes/admin/plugins/+page.svelte +23 -0
  259. package/routes/admin/plugins/+page.ts +7 -0
  260. package/routes/admin/users/+page.svelte +60 -0
  261. package/routes/admin/users/+page.ts +9 -0
  262. package/routes/admin/users/[id]/+page.svelte +108 -0
  263. package/routes/admin/users/[id]/+page.ts +17 -0
  264. package/routes/tsconfig.json +1 -1
  265. package/svelte.config.js +4 -10
  266. package/{web/template.html → template.html} +1 -1
  267. package/{web/tsconfig.json → web.tsconfig.json} +2 -2
  268. package/build/client/_app/immutable/chunks/B1E1cVbi.js +0 -1
  269. package/build/client/_app/immutable/chunks/B1E1cVbi.js.br +0 -0
  270. package/build/client/_app/immutable/chunks/B1E1cVbi.js.gz +0 -0
  271. package/build/client/_app/immutable/chunks/D3hk2v8y.js +0 -1
  272. package/build/client/_app/immutable/chunks/D3hk2v8y.js.br +0 -2
  273. package/build/client/_app/immutable/chunks/D3hk2v8y.js.gz +0 -0
  274. package/build/client/_app/immutable/chunks/D4Bce_hb.js +0 -1
  275. package/build/client/_app/immutable/chunks/D4Bce_hb.js.br +0 -0
  276. package/build/client/_app/immutable/chunks/D4Bce_hb.js.gz +0 -0
  277. package/build/client/_app/immutable/chunks/D9TfJrfD.js +0 -1
  278. package/build/client/_app/immutable/chunks/D9TfJrfD.js.br +0 -0
  279. package/build/client/_app/immutable/chunks/D9TfJrfD.js.gz +0 -0
  280. package/build/client/_app/immutable/chunks/DJeR1n-B.js +0 -51
  281. package/build/client/_app/immutable/chunks/DJeR1n-B.js.br +0 -0
  282. package/build/client/_app/immutable/chunks/DJeR1n-B.js.gz +0 -0
  283. package/build/client/_app/immutable/chunks/Dy1O3iBu.js +0 -2
  284. package/build/client/_app/immutable/chunks/Dy1O3iBu.js.br +0 -0
  285. package/build/client/_app/immutable/chunks/Dy1O3iBu.js.gz +0 -0
  286. package/build/client/_app/immutable/chunks/NhZR8nmR.js +0 -3
  287. package/build/client/_app/immutable/chunks/NhZR8nmR.js.br +0 -0
  288. package/build/client/_app/immutable/chunks/NhZR8nmR.js.gz +0 -0
  289. package/build/client/_app/immutable/chunks/pba7IodQ.js +0 -1
  290. package/build/client/_app/immutable/chunks/pba7IodQ.js.br +0 -0
  291. package/build/client/_app/immutable/chunks/pba7IodQ.js.gz +0 -0
  292. package/build/client/_app/immutable/entry/app.DJWgFLyv.js +0 -2
  293. package/build/client/_app/immutable/entry/app.DJWgFLyv.js.br +0 -0
  294. package/build/client/_app/immutable/entry/app.DJWgFLyv.js.gz +0 -0
  295. package/build/client/_app/immutable/entry/start.CM7y0WAo.js +0 -1
  296. package/build/client/_app/immutable/entry/start.CM7y0WAo.js.br +0 -2
  297. package/build/client/_app/immutable/entry/start.CM7y0WAo.js.gz +0 -0
  298. package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js.br +0 -0
  299. package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js.gz +0 -0
  300. package/build/client/_app/immutable/nodes/1.BER4lkmI.js +0 -1
  301. package/build/client/_app/immutable/nodes/1.BER4lkmI.js.br +0 -0
  302. package/build/client/_app/immutable/nodes/1.BER4lkmI.js.gz +0 -0
  303. package/build/client/_app/immutable/nodes/2.CvEpuMc7.js.br +0 -0
  304. package/build/client/_app/immutable/nodes/2.CvEpuMc7.js.gz +0 -0
  305. package/build/client/_app/immutable/nodes/3.CVudd8x2.js +0 -7
  306. package/build/client/_app/immutable/nodes/3.CVudd8x2.js.br +0 -0
  307. package/build/client/_app/immutable/nodes/3.CVudd8x2.js.gz +0 -0
  308. package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js +0 -1
  309. package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js.br +0 -0
  310. package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js.gz +0 -0
  311. package/build/client/_app/immutable/nodes/5.CGoBaVII.js +0 -1
  312. package/build/client/_app/immutable/nodes/5.CGoBaVII.js.br +0 -0
  313. package/build/client/_app/immutable/nodes/5.CGoBaVII.js.gz +0 -0
  314. package/build/client/_app/immutable/nodes/6.BtB2uWXy.js +0 -1
  315. package/build/client/_app/immutable/nodes/6.BtB2uWXy.js.br +0 -0
  316. package/build/client/_app/immutable/nodes/6.BtB2uWXy.js.gz +0 -0
  317. package/build/server/chunks/0-DgHTujtC.js +0 -9
  318. package/build/server/chunks/1-k30i-hic.js +0 -9
  319. package/build/server/chunks/2-CXlrhpR6.js +0 -9
  320. package/build/server/chunks/3-CGT4Ugys.js +0 -13
  321. package/build/server/chunks/3-CGT4Ugys.js.map +0 -1
  322. package/build/server/chunks/4-BscEiwUk.js +0 -9
  323. package/build/server/chunks/4-BscEiwUk.js.map +0 -1
  324. package/build/server/chunks/5-H0ePIJBE.js +0 -9
  325. package/build/server/chunks/5-H0ePIJBE.js.map +0 -1
  326. package/build/server/chunks/6-BrPpcagX.js +0 -9
  327. package/build/server/chunks/6-BrPpcagX.js.map +0 -1
  328. package/build/server/chunks/FormDialog-CB-2YGWi.js.map +0 -1
  329. package/build/server/chunks/Logout-LKOt-AST.js +0 -45
  330. package/build/server/chunks/Logout-LKOt-AST.js.map +0 -1
  331. package/build/server/chunks/_page.svelte-B1LK5J87.js +0 -11
  332. package/build/server/chunks/_page.svelte-B1LK5J87.js.map +0 -1
  333. package/build/server/chunks/_page.svelte-CMtkwvbP.js +0 -68
  334. package/build/server/chunks/_page.svelte-CMtkwvbP.js.map +0 -1
  335. package/build/server/chunks/_page.svelte-CbI2KxeA.js +0 -62
  336. package/build/server/chunks/_page.svelte-CbI2KxeA.js.map +0 -1
  337. package/build/server/chunks/_page.svelte-D1_WJoyP.js +0 -6
  338. package/build/server/chunks/_page.svelte-D1_WJoyP.js.map +0 -1
  339. package/build/server/chunks/_page.svelte-d01Hl2Ia.js +0 -639
  340. package/build/server/chunks/_page.svelte-d01Hl2Ia.js.map +0 -1
  341. package/build/server/chunks/error.svelte-DNQXZmIO.js.map +0 -1
  342. package/build/server/chunks/hooks.server-BQqilaHv.js +0 -17301
  343. package/build/server/chunks/hooks.server-BQqilaHv.js.map +0 -1
  344. package/build/server/chunks/index-CvHf_GW2.js.map +0 -1
  345. package/build/server/chunks/index-RTKpMYZ1.js +0 -397
  346. package/build/server/chunks/index-RTKpMYZ1.js.map +0 -1
  347. package/build/server/chunks/layout.svelte-BSvrn-4a.js +0 -8
  348. package/build/server/chunks/layout.svelte-BSvrn-4a.js.map +0 -1
  349. package/build/server/chunks/string-DLbvtT1R.js.map +0 -1
  350. package/build/server/chunks/utils-h74ns7K6.js.map +0 -1
  351. package/dist/sveltekit.d.ts +0 -8
  352. package/dist/sveltekit.js +0 -60
  353. package/web/hooks.server.ts +0 -4
package/dist/requests.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { userProtectedFields, userPublicFields } from '@axium/core/user';
2
- import { serialize as serializeCookie } from 'cookie';
2
+ import * as cookie from 'cookie';
3
3
  import { pick } from 'utilium';
4
4
  import * as z from 'zod';
5
5
  import { createSession } from './auth.js';
@@ -29,11 +29,11 @@ export function json(data, init) {
29
29
  }
30
30
  return response;
31
31
  }
32
- export async function parseBody(event, schema) {
33
- const contentType = event.request.headers.get('content-type');
32
+ export async function parseBody(request, schema) {
33
+ const contentType = request.headers.get('content-type');
34
34
  if (!contentType || !contentType.includes('application/json'))
35
35
  error(415, 'Invalid content type');
36
- const body = await event.request.json().catch(() => error(415, 'Invalid JSON'));
36
+ const body = await request.json().catch(() => error(415, 'Invalid JSON'));
37
37
  try {
38
38
  return schema.parse(body);
39
39
  }
@@ -41,18 +41,18 @@ export async function parseBody(event, schema) {
41
41
  error(400, e instanceof z.core.$ZodError ? z.prettifyError(e) : 'invalid body');
42
42
  }
43
43
  }
44
- export function getToken(event, sensitive = false) {
45
- const header_token = event.request.headers.get('Authorization')?.replace('Bearer ', '');
44
+ export function getToken(request, sensitive = false) {
45
+ const header_token = request.headers.get('Authorization')?.replace('Bearer ', '');
46
46
  if (header_token)
47
47
  return header_token;
48
48
  if (config.debug || !config.auth.header_only) {
49
- return event.cookies.get(sensitive ? 'elevated_token' : 'session_token');
49
+ return cookie.parse(request.headers.get('cookie') || '')[sensitive ? 'elevated_token' : 'session_token'];
50
50
  }
51
51
  }
52
52
  export async function createSessionData(userId, elevated = false) {
53
53
  const { token, expires } = await createSession(userId, elevated);
54
54
  const response = json({ userId, token: elevated ? '[[redacted:elevated]]' : token }, { status: 201 });
55
- const cookies = serializeCookie(elevated ? 'elevated_token' : 'session_token', token, {
55
+ const cookies = cookie.serialize(elevated ? 'elevated_token' : 'session_token', token, {
56
56
  httpOnly: true,
57
57
  path: '/',
58
58
  expires,
@@ -72,18 +72,18 @@ export function withError(text, code = 500) {
72
72
  error(code, text + (config.debug && e.message ? `: ${e.message}` : ''));
73
73
  };
74
74
  }
75
- export async function handleAPIRequest(event, route) {
76
- const method = event.request.method;
75
+ export async function handleAPIRequest(request, params, route) {
76
+ const method = request.method;
77
77
  const _warnings = [];
78
- if (route.api && !event.request.headers.get('Accept')?.includes('application/json')) {
78
+ if (route.api && !request.headers.get('Accept')?.includes('application/json')) {
79
79
  _warnings.push('Only application/json is supported');
80
- event.request.headers.set('Accept', 'application/json');
80
+ request.headers.set('Accept', 'application/json');
81
81
  }
82
82
  for (const [key, type] of Object.entries(route.params || {})) {
83
83
  if (!type)
84
84
  continue;
85
85
  try {
86
- event.params[key] = type.parse(event.params[key]);
86
+ params[key] = type.parse(params[key]);
87
87
  }
88
88
  catch (e) {
89
89
  error(400, `Invalid parameter: ${e instanceof z.core.$ZodError ? z.prettifyError(e) : '<unknown error>'}`);
@@ -91,7 +91,7 @@ export async function handleAPIRequest(event, route) {
91
91
  }
92
92
  if (typeof route[method] != 'function')
93
93
  error(405, `Method ${method} not allowed for ${route.path}`);
94
- const result = await route[method](event);
94
+ const result = await route[method].call(route, request, params);
95
95
  if (result instanceof Response)
96
96
  return result;
97
97
  if (typeof result == 'object' || typeof result == 'function') {
package/dist/routes.d.ts CHANGED
@@ -1,10 +1,9 @@
1
1
  import type { RequestMethod } from '@axium/core/requests';
2
2
  import type { Component } from 'svelte';
3
3
  import type z from 'zod';
4
- import type { RequestEvent } from './requests.js';
5
4
  type _Params = Partial<Record<string, string>>;
6
- type MaybePromise<T> = T | Promise<T>;
7
- export type EndpointHandlers<Params extends _Params = _Params> = Partial<Record<RequestMethod, (event: RequestEvent<Params>) => MaybePromise<object | Response>>>;
5
+ export type MaybePromise<T> = T | Promise<T>;
6
+ export type EndpointHandlers<Params extends _Params = _Params, This = unknown> = Partial<Record<RequestMethod, (this: This, request: Request, params: Params) => MaybePromise<object | Response>>>;
8
7
  export type RouteParamOptions = z.ZodType;
9
8
  export interface CommonRouteOptions<Params extends _Params = _Params> {
10
9
  path: string;
@@ -15,11 +14,11 @@ export interface CommonRouteOptions<Params extends _Params = _Params> {
15
14
  /**
16
15
  * A route with server-side handlers for different HTTP methods.
17
16
  */
18
- export interface ServerRouteOptions<Params extends _Params = _Params> extends CommonRouteOptions<Params>, EndpointHandlers<Params> {
17
+ export interface ServerRouteOptions<Params extends _Params = _Params> extends CommonRouteOptions<Params>, EndpointHandlers<Params, RouteCommon> {
19
18
  api?: boolean;
20
19
  }
21
20
  export interface WebRouteOptions extends CommonRouteOptions {
22
- load?(event: RequestEvent): object | Promise<object>;
21
+ load?(request: Request): object | Promise<object>;
23
22
  /** the Svelte page */
24
23
  page?: Component;
25
24
  }
@@ -34,7 +33,7 @@ export interface ServerRoute extends RouteCommon, EndpointHandlers {
34
33
  }
35
34
  export interface WebRoute extends RouteCommon {
36
35
  server: false;
37
- load?(event: RequestEvent): object | Promise<object>;
36
+ load?(request: Request): object | Promise<object>;
38
37
  page: Component;
39
38
  }
40
39
  export type Route = ServerRoute | WebRoute;
@@ -50,8 +49,5 @@ export declare function addRoute(opt: RouteOptions): void;
50
49
  * Resolve a request URL into a route.
51
50
  * This handles parsing of parameters in the URL.
52
51
  */
53
- export declare function resolveRoute(event: {
54
- url: URL;
55
- params?: object;
56
- }): Route | undefined;
52
+ export declare function resolveRoute(url: URL): [Route, params: object] | void;
57
53
  export {};
package/dist/routes.js CHANGED
@@ -25,10 +25,10 @@ export function addRoute(opt) {
25
25
  * Resolve a request URL into a route.
26
26
  * This handles parsing of parameters in the URL.
27
27
  */
28
- export function resolveRoute(event) {
29
- const { pathname } = event.url;
28
+ export function resolveRoute(url) {
29
+ const { pathname } = url;
30
30
  if (routes.has(pathname) && !pathname.split('/').some(p => p.startsWith(':')))
31
- return routes.get(pathname);
31
+ return [routes.get(pathname), {}];
32
32
  // Otherwise we must have a parameterized route
33
33
  _routes: for (const route of routes.values()) {
34
34
  const params = {};
@@ -50,7 +50,6 @@ export function resolveRoute(event) {
50
50
  // we didn't find a match, since an exact match would have been found already
51
51
  if (pathParts.length || !Object.keys(params).length)
52
52
  continue;
53
- event.params = params;
54
- return route;
53
+ return [route, params];
55
54
  }
56
55
  }
package/dist/serve.d.ts CHANGED
@@ -1,12 +1,13 @@
1
- import type { Server } from 'node:http';
2
1
  import '@axium/server/api/index';
2
+ import type { Server } from 'node:http';
3
3
  export interface ServeOptions {
4
4
  secure: boolean;
5
5
  ssl_key: string;
6
6
  ssl_cert: string;
7
7
  build: string;
8
+ multiBuild: boolean;
8
9
  }
9
- export declare function serveSvelteKit(opt: Partial<ServeOptions>): Promise<Server>;
10
+ export declare function serve(opt: Partial<ServeOptions>): Promise<Server>;
10
11
  /**
11
12
  * Perform initial setup for when the server is serving web pages.
12
13
  */
package/dist/serve.js CHANGED
@@ -1,19 +1,171 @@
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';
5
1
  import '@axium/server/api/index';
6
- import { loadDefaultConfigs } from '@axium/server/config';
2
+ import { loadDefaultConfigs, reloadConfigs } from '@axium/server/config';
7
3
  import { clean, connect, database } from '@axium/server/database';
8
- import { dirs, logger, output } from '@axium/server/io';
4
+ import { _debugOutput, dirs, logger, output } from '@axium/server/io';
9
5
  import { allLogLevels } from 'logzen';
10
- import { createWriteStream } from 'node:fs';
6
+ import { createWriteStream, readFileSync } from 'node:fs';
7
+ import { createServer, ServerResponse } from 'node:http';
8
+ import { createServer as createSecureServer } from 'node:https';
11
9
  import { join } from 'node:path/posix';
12
- export async function serveSvelteKit(opt) {
13
- const { handler } = await import(opt.build || config.web.build);
10
+ import { styleText } from 'node:util';
11
+ import { appDisabledContent, apps } from './apps.js';
12
+ import config from './config.js';
13
+ import { convertFromResponse, convertToRequest } from './internal_requests.js';
14
+ import { plugins } from './plugins.js';
15
+ import { error, handleAPIRequest, handleResponseError, json, noCacheHeaders } from './requests.js';
16
+ import { resolveRoute } from './routes.js';
17
+ const template = readFileSync(join(import.meta.dirname, '../template.html'), 'utf-8');
18
+ function fillSvelteKitTemplate({ head, body }, env = {}, nonce = '') {
19
+ return (template
20
+ .replaceAll('%sveltekit.head%', head)
21
+ .replaceAll('%sveltekit.body%', body)
22
+ .replaceAll('%sveltekit.assets%', '')
23
+ // Unused for now.
24
+ .replaceAll('%sveltekit.nonce%', nonce)
25
+ .replace(/%sveltekit\.env\.([^%]+)%/g, (_match, key) => env[key] ?? ''));
26
+ }
27
+ async function handleRequestDefault(req) {
28
+ const url = new URL(req.url);
29
+ const [route, params] = resolveRoute(url) ?? [];
30
+ if (!route && url.pathname === '/' && config.debug_home)
31
+ return new Response(null, { status: 303, headers: { Location: '/_axium/default' } });
32
+ if (config.debug)
33
+ console.log(styleText('blueBright', req.method.padEnd(7)), route ? route.path : url.pathname);
34
+ if (!route) {
35
+ // Check to see if this is for an app that is disabled.
36
+ const maybeApp = url.pathname.split('/')[1];
37
+ if (apps.has(maybeApp) && config.apps.disabled.includes(maybeApp)) {
38
+ const body = fillSvelteKitTemplate(appDisabledContent);
39
+ return new Response(body, { headers: noCacheHeaders, status: 503 });
40
+ }
41
+ return new Response('Not Found', { status: 404 });
42
+ }
43
+ if (route.server == true) {
44
+ if (route.api)
45
+ return await handleAPIRequest(req, params, route).catch(handleResponseError);
46
+ const run = route[req.method];
47
+ if (typeof run !== 'function') {
48
+ error(405, `Method ${req.method} not allowed for ${route.path}`);
49
+ }
50
+ try {
51
+ const result = await run(req, params);
52
+ if (result instanceof Response)
53
+ return result;
54
+ return json(result);
55
+ }
56
+ catch (e) {
57
+ return handleResponseError(e);
58
+ }
59
+ }
60
+ /* const data = await route.load?.(req);
61
+
62
+ const body = fillSvelteKitTemplate(render(route.page, { props: { data } }));
63
+
64
+ return new Response(body, {
65
+ headers: config.web.disable_cache ? noCacheHeaders : {},
66
+ status: 200,
67
+ }); */
68
+ return json({ message: 'Not Implemented' }, { status: 501 });
69
+ }
70
+ const kNext = Symbol('next');
71
+ function __next(error) {
72
+ throw { [kNext]: error };
73
+ }
74
+ async function _getMultiBuildHandler() {
75
+ const handlers = [];
76
+ for (const plugin of plugins.values()) {
77
+ if (!plugin.http_handler)
78
+ continue;
79
+ try {
80
+ const { handler } = await import(join(plugin.dirname, plugin.http_handler));
81
+ handlers.push(handler);
82
+ output.debug(`Loaded plugin handler: ${plugin.name}`);
83
+ }
84
+ catch (e) {
85
+ output.warn(`Failed to load plugin HTTP handler for ${plugin.name} ${_debugOutput ? ': ' + (e instanceof Error ? e.message : e) : ''}`);
86
+ }
87
+ }
88
+ // @ts-expect-error 7016 - it is plain JS
89
+ const { handler: handleFrontendRequest } = await import('../build/handler.js');
90
+ handlers.push(handleFrontendRequest);
91
+ function handle(incoming, response) {
92
+ for (const handler of handlers) {
93
+ const maybeResponse = new ServerResponse(incoming);
94
+ try {
95
+ handler(incoming, maybeResponse, __next);
96
+ }
97
+ catch (e) {
98
+ if (!e || !(kNext in e)) {
99
+ response.statusCode = 500;
100
+ response.end('Internal Server Error');
101
+ console.error(e);
102
+ return;
103
+ }
104
+ console.debug(`next@${handler.name} (${e[kNext]})`);
105
+ }
106
+ if (maybeResponse.statusCode != 404) {
107
+ response.setHeaders(new Map(Object.entries(maybeResponse.getHeaders())));
108
+ }
109
+ }
110
+ const req = convertToRequest(incoming);
111
+ void handleRequestDefault(req).then(res => convertFromResponse(response, res));
112
+ }
113
+ return handle;
114
+ }
115
+ async function _runRoute(run, request, params) {
116
+ try {
117
+ const result = await run(request, params);
118
+ if (result instanceof Response)
119
+ return result;
120
+ return json(result);
121
+ }
122
+ catch (e) {
123
+ return handleResponseError(e);
124
+ }
125
+ }
126
+ async function _getLinkedBuildHandler(buildPath = '../build/handler.js') {
127
+ const { handler: handleFrontendRequest } = await import(buildPath);
128
+ return function handle(req, res) {
129
+ const url = new URL(req.url, config.auth.origin);
130
+ const [route, params = {}] = resolveRoute(url) ?? [];
131
+ if (!route && url.pathname === '/' && config.debug_home) {
132
+ res.writeHead(303, { Location: '/_axium/default' }).end();
133
+ return;
134
+ }
135
+ if (config.debug)
136
+ console.log(styleText('blueBright', req.method.padEnd(7)), route ? route.path : url.pathname);
137
+ if (route && route.server == true) {
138
+ const request = convertToRequest(req);
139
+ if (route.api) {
140
+ void handleAPIRequest(request, params, route)
141
+ .catch(handleResponseError)
142
+ .then(response => convertFromResponse(res, response));
143
+ return;
144
+ }
145
+ const run = route[request.method]?.bind(route);
146
+ if (typeof run !== 'function') {
147
+ res.writeHead(405).end(`Method ${request.method} not allowed for ${route.path}`);
148
+ return;
149
+ }
150
+ void _runRoute(run, request, params).then(response => convertFromResponse(res, response));
151
+ return;
152
+ }
153
+ // Check to see if this is for an app that is disabled.
154
+ const maybeApp = url.pathname.split('/')[1];
155
+ if (apps.has(maybeApp) && config.apps.disabled.includes(maybeApp)) {
156
+ const body = fillSvelteKitTemplate(appDisabledContent);
157
+ res.writeHead(503, noCacheHeaders).end(body);
158
+ return;
159
+ }
160
+ handleFrontendRequest(req, res);
161
+ return;
162
+ };
163
+ }
164
+ export async function serve(opt) {
165
+ const handle = await _getLinkedBuildHandler(opt.build);
14
166
  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);
167
+ return createServer(handle);
168
+ return createSecureServer({ key: readFileSync(opt.ssl_key || config.web.ssl_key), cert: readFileSync(opt.ssl_cert || config.web.ssl_cert) }, handle);
17
169
  }
18
170
  /**
19
171
  * Perform initial setup for when the server is serving web pages.
@@ -26,7 +178,7 @@ export async function init() {
26
178
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
27
179
  process.on('beforeExit', () => database.destroy());
28
180
  process.on('SIGHUP', () => {
29
- output.info('Reloading configuration.');
30
- void loadDefaultConfigs();
181
+ output.info('Reloading configuration due to SIGHUP.');
182
+ void reloadConfigs();
31
183
  });
32
184
  }
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.0",
4
- "author": "James Prevett <axium@jamespre.dev> (https://jamespre.dev)",
3
+ "version": "0.25.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,7 +33,8 @@
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
39
  "axiumd.service"
39
40
  ],
@@ -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.5.0",
50
+ "@axium/core": ">=0.8.0",
50
51
  "kysely": "^0.28.0",
51
52
  "utilium": "^2.3.8",
52
53
  "zod": "^4.0.5"
@@ -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,29 @@
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
+ return { session, tabs };
29
+ }
@@ -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
+ }