@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.
- package/build/client/_app/immutable/assets/account.dAAx7bby.css +1 -0
- package/build/client/_app/immutable/assets/account.dAAx7bby.css.br +0 -0
- package/build/client/_app/immutable/assets/account.dAAx7bby.css.gz +0 -0
- package/build/client/_app/immutable/assets/list.DVGH0BeP.css +1 -0
- package/build/client/_app/immutable/assets/list.DVGH0BeP.css.br +0 -0
- package/build/client/_app/immutable/assets/list.DVGH0BeP.css.gz +0 -0
- package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css +1 -0
- package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css.br +2 -0
- package/build/client/_app/immutable/assets/styles.D8SZ-PeY.css.gz +0 -0
- package/build/client/_app/immutable/chunks/46qGscyh.js +2 -0
- package/build/client/_app/immutable/chunks/46qGscyh.js.br +0 -0
- package/build/client/_app/immutable/chunks/46qGscyh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B2Vkpbkw.js +2 -0
- package/build/client/_app/immutable/chunks/B2Vkpbkw.js.br +0 -0
- package/build/client/_app/immutable/chunks/B2Vkpbkw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BKixenYx.js +1 -0
- package/build/client/_app/immutable/chunks/BKixenYx.js.br +0 -0
- package/build/client/_app/immutable/chunks/BKixenYx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BLtAtlP3.js +1 -0
- package/build/client/_app/immutable/chunks/BLtAtlP3.js.br +2 -0
- package/build/client/_app/immutable/chunks/BLtAtlP3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BNTlty5m.js +1 -0
- package/build/client/_app/immutable/chunks/BNTlty5m.js.br +0 -0
- package/build/client/_app/immutable/chunks/BNTlty5m.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Beh6Ec8J.js +1 -0
- package/build/client/_app/immutable/chunks/Beh6Ec8J.js.br +0 -0
- package/build/client/_app/immutable/chunks/Beh6Ec8J.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BrUe-Qen.js +1 -0
- package/build/client/_app/immutable/chunks/BrUe-Qen.js.br +0 -0
- package/build/client/_app/immutable/chunks/BrUe-Qen.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bs4cD_pX.js +1 -0
- package/build/client/_app/immutable/chunks/Bs4cD_pX.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bs4cD_pX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C62F-tXu.js +1 -0
- package/build/client/_app/immutable/chunks/C62F-tXu.js.br +1 -0
- package/build/client/_app/immutable/chunks/C62F-tXu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUBtP2L9.js +23 -0
- package/build/client/_app/immutable/chunks/CUBtP2L9.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUBtP2L9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Ch16TNvP.js +1 -0
- package/build/client/_app/immutable/chunks/Ch16TNvP.js.br +0 -0
- package/build/client/_app/immutable/chunks/Ch16TNvP.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CoYD6HNm.js +1 -0
- package/build/client/_app/immutable/chunks/CoYD6HNm.js.br +0 -0
- package/build/client/_app/immutable/chunks/CoYD6HNm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D40Zn55h.js +1 -0
- package/build/client/_app/immutable/chunks/D40Zn55h.js.br +0 -0
- package/build/client/_app/immutable/chunks/D40Zn55h.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DW7-1esk.js +21 -0
- package/build/client/_app/immutable/chunks/DW7-1esk.js.br +0 -0
- package/build/client/_app/immutable/chunks/DW7-1esk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DY4fWHx_.js +1 -0
- package/build/client/_app/immutable/chunks/DY4fWHx_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DY4fWHx_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DvOBbqVY.js +1 -0
- package/build/client/_app/immutable/chunks/DvOBbqVY.js.br +0 -0
- package/build/client/_app/immutable/chunks/DvOBbqVY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DwZYWemd.js +1 -0
- package/build/client/_app/immutable/chunks/DwZYWemd.js.br +0 -0
- package/build/client/_app/immutable/chunks/DwZYWemd.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dy2Ho0cF.js +1 -0
- package/build/client/_app/immutable/chunks/Dy2Ho0cF.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dy2Ho0cF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/FTv0qR3w.js +1 -0
- package/build/client/_app/immutable/chunks/FTv0qR3w.js.br +0 -0
- package/build/client/_app/immutable/chunks/FTv0qR3w.js.gz +0 -0
- package/build/client/_app/immutable/chunks/NeK0YGoY.js +1 -0
- package/build/client/_app/immutable/chunks/NeK0YGoY.js.br +0 -0
- package/build/client/_app/immutable/chunks/NeK0YGoY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/aArGsq9c.js +1 -0
- package/build/client/_app/immutable/chunks/aArGsq9c.js.br +0 -0
- package/build/client/_app/immutable/chunks/aArGsq9c.js.gz +0 -0
- package/build/client/_app/immutable/chunks/lH47zGKU.js +1 -0
- package/build/client/_app/immutable/chunks/lH47zGKU.js.br +0 -0
- package/build/client/_app/immutable/chunks/lH47zGKU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/sMHjBQqw.js +1 -0
- package/build/client/_app/immutable/chunks/sMHjBQqw.js.br +0 -0
- package/build/client/_app/immutable/chunks/sMHjBQqw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/vQfHcJV6.js +2 -0
- package/build/client/_app/immutable/chunks/vQfHcJV6.js.br +0 -0
- package/build/client/_app/immutable/chunks/vQfHcJV6.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.pLVZKpSD.js +2 -0
- package/build/client/_app/immutable/entry/app.pLVZKpSD.js.br +0 -0
- package/build/client/_app/immutable/entry/app.pLVZKpSD.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CUaVsIrY.js +1 -0
- package/build/client/_app/immutable/entry/start.CUaVsIrY.js.br +2 -0
- package/build/client/_app/immutable/entry/start.CUaVsIrY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.D7hET-Bq.js +1 -0
- package/build/client/_app/immutable/nodes/0.D7hET-Bq.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.D7hET-Bq.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.BWU-JJm_.js +1 -0
- package/build/client/_app/immutable/nodes/1.BWU-JJm_.js.br +2 -0
- package/build/client/_app/immutable/nodes/1.BWU-JJm_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.C5N2XBee.js +1 -0
- package/build/client/_app/immutable/nodes/10.C5N2XBee.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.C5N2XBee.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.CerbuSAv.js +1 -0
- package/build/client/_app/immutable/nodes/11.CerbuSAv.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.CerbuSAv.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.Z4B9zS78.js +1 -0
- package/build/client/_app/immutable/nodes/12.Z4B9zS78.js.br +0 -0
- package/build/client/_app/immutable/nodes/12.Z4B9zS78.js.gz +0 -0
- package/build/client/_app/immutable/nodes/13.CuICShck.js +1 -0
- package/build/client/_app/immutable/nodes/13.CuICShck.js.br +0 -0
- package/build/client/_app/immutable/nodes/13.CuICShck.js.gz +0 -0
- package/build/client/_app/immutable/nodes/14.BSEF5oaF.js +1 -0
- package/build/client/_app/immutable/nodes/14.BSEF5oaF.js.br +0 -0
- package/build/client/_app/immutable/nodes/14.BSEF5oaF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/15.D1nsmo6j.js +1 -0
- package/build/client/_app/immutable/nodes/15.D1nsmo6j.js.br +0 -0
- package/build/client/_app/immutable/nodes/15.D1nsmo6j.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DQ1JcYgz.js +1 -0
- package/build/client/_app/immutable/nodes/2.DQ1JcYgz.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DQ1JcYgz.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BJp2JEtW.js +1 -0
- package/build/client/_app/immutable/nodes/3.BJp2JEtW.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BJp2JEtW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.Cvn_QsIx.js +1 -0
- package/build/client/_app/immutable/nodes/4.Cvn_QsIx.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.Cvn_QsIx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DgPP9GX3.js +1 -0
- package/build/client/_app/immutable/nodes/5.DgPP9GX3.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DgPP9GX3.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.DKIzms8i.js +2 -0
- package/build/client/_app/immutable/nodes/6.DKIzms8i.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.DKIzms8i.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.3UigVXV4.js +1 -0
- package/build/client/_app/immutable/nodes/7.3UigVXV4.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.3UigVXV4.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.B8s2TdNQ.js +1 -0
- package/build/client/_app/immutable/nodes/8.B8s2TdNQ.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.B8s2TdNQ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.LBMMe2kc.js +1 -0
- package/build/client/_app/immutable/nodes/9.LBMMe2kc.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.LBMMe2kc.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/styles.css +28 -0
- package/build/client/styles.css.br +0 -0
- package/build/client/styles.css.gz +0 -0
- package/build/handler.js +20 -3
- package/build/server/chunks/0-CNbALTKz.js +9 -0
- package/build/server/chunks/0-CNbALTKz.js.map +1 -0
- package/build/server/chunks/1-Dgxy393u.js +9 -0
- package/build/server/chunks/1-Dgxy393u.js.map +1 -0
- package/build/server/chunks/10-DovmbqKa.js +14 -0
- package/build/server/chunks/10-DovmbqKa.js.map +1 -0
- package/build/server/chunks/11-CRK_ubcl.js +14 -0
- package/build/server/chunks/11-CRK_ubcl.js.map +1 -0
- package/build/server/chunks/12-SbQlwMfe.js +9 -0
- package/build/server/chunks/12-SbQlwMfe.js.map +1 -0
- package/build/server/chunks/13-CbniIW7F.js +14 -0
- package/build/server/chunks/13-CbniIW7F.js.map +1 -0
- package/build/server/chunks/14-D9Vb_8Yx.js +9 -0
- package/build/server/chunks/14-D9Vb_8Yx.js.map +1 -0
- package/build/server/chunks/15-D-75Hdef.js +9 -0
- package/build/server/chunks/15-D-75Hdef.js.map +1 -0
- package/build/server/chunks/2-57exN8ae.js +14 -0
- package/build/server/chunks/2-57exN8ae.js.map +1 -0
- package/build/server/chunks/3-DNQft-pY.js +9 -0
- package/build/server/chunks/{2-CXlrhpR6.js.map → 3-DNQft-pY.js.map} +1 -1
- package/build/server/chunks/4-D9Bwp-f8.js +14 -0
- package/build/server/chunks/4-D9Bwp-f8.js.map +1 -0
- package/build/server/chunks/5-COEQwZNP.js +14 -0
- package/build/server/chunks/5-COEQwZNP.js.map +1 -0
- package/build/server/chunks/6-RT4yiDcP.js +14 -0
- package/build/server/chunks/6-RT4yiDcP.js.map +1 -0
- package/build/server/chunks/7-CVqF_r5D.js +14 -0
- package/build/server/chunks/7-CVqF_r5D.js.map +1 -0
- package/build/server/chunks/8-C5SO-sVH.js +14 -0
- package/build/server/chunks/8-C5SO-sVH.js.map +1 -0
- package/build/server/chunks/9-DoCOKtY-.js +14 -0
- package/build/server/chunks/9-DoCOKtY-.js.map +1 -0
- package/build/server/chunks/FormDialog-ZCY0chY1.js +102 -0
- package/build/server/chunks/FormDialog-ZCY0chY1.js.map +1 -0
- package/build/server/chunks/Icon-BVo9qbDf.js +30 -0
- package/build/server/chunks/Icon-BVo9qbDf.js.map +1 -0
- package/build/server/chunks/Logout-CmBZgu0j.js +46 -0
- package/build/server/chunks/Logout-CmBZgu0j.js.map +1 -0
- package/build/server/chunks/_layout.svelte-DuS006VZ.js +33 -0
- package/build/server/chunks/_layout.svelte-DuS006VZ.js.map +1 -0
- package/build/server/chunks/_page.svelte-BFVobcI7.js +14 -0
- package/build/server/chunks/_page.svelte-BFVobcI7.js.map +1 -0
- package/build/server/chunks/_page.svelte-B_cvhWJS.js +66 -0
- package/build/server/chunks/_page.svelte-B_cvhWJS.js.map +1 -0
- package/build/server/chunks/_page.svelte-BriaBR9l.js +28 -0
- package/build/server/chunks/_page.svelte-BriaBR9l.js.map +1 -0
- package/build/server/chunks/_page.svelte-BtQQzT7H.js +72 -0
- package/build/server/chunks/_page.svelte-BtQQzT7H.js.map +1 -0
- package/build/server/chunks/_page.svelte-C8D3c3yB.js +64 -0
- package/build/server/chunks/_page.svelte-C8D3c3yB.js.map +1 -0
- package/build/server/chunks/_page.svelte-CVSb9eHQ.js +24 -0
- package/build/server/chunks/_page.svelte-CVSb9eHQ.js.map +1 -0
- package/build/server/chunks/_page.svelte-CwRjZqL7.js +107 -0
- package/build/server/chunks/_page.svelte-CwRjZqL7.js.map +1 -0
- package/build/server/chunks/_page.svelte-D9A9RYjx.js +233 -0
- package/build/server/chunks/_page.svelte-D9A9RYjx.js.map +1 -0
- package/build/server/chunks/_page.svelte-DGhwqWMM.js +34 -0
- package/build/server/chunks/_page.svelte-DGhwqWMM.js.map +1 -0
- package/build/server/chunks/_page.svelte-DTvnX95_.js +75 -0
- package/build/server/chunks/_page.svelte-DTvnX95_.js.map +1 -0
- package/build/server/chunks/_page.svelte-DUfwpXfC.js +122 -0
- package/build/server/chunks/_page.svelte-DUfwpXfC.js.map +1 -0
- package/build/server/chunks/_page.svelte-DxDoD3rZ.js +37 -0
- package/build/server/chunks/_page.svelte-DxDoD3rZ.js.map +1 -0
- package/build/server/chunks/_page.svelte-VDBvShZ8.js +6 -0
- package/build/server/chunks/_page.svelte-VDBvShZ8.js.map +1 -0
- package/build/server/chunks/account-Bf_llRe2.js +446 -0
- package/build/server/chunks/account-Bf_llRe2.js.map +1 -0
- package/build/server/chunks/auth_redirect-olBYiIF2.js +24 -0
- package/build/server/chunks/auth_redirect-olBYiIF2.js.map +1 -0
- package/build/server/chunks/color-K_MR7m8s.js +14 -0
- package/build/server/chunks/color-K_MR7m8s.js.map +1 -0
- package/build/server/chunks/context-R2425nfV.js +64 -0
- package/build/server/chunks/context-R2425nfV.js.map +1 -0
- package/build/server/chunks/{error.svelte-DNQXZmIO.js → error.svelte-CkSCwrMJ.js} +7 -6
- package/build/server/chunks/error.svelte-CkSCwrMJ.js.map +1 -0
- package/build/server/chunks/index-CIEcmmdN.js +890 -0
- package/build/server/chunks/index-CIEcmmdN.js.map +1 -0
- package/build/server/chunks/{index-CvHf_GW2.js → index-Tt4zVDIZ.js} +843 -438
- package/build/server/chunks/index-Tt4zVDIZ.js.map +1 -0
- package/build/server/chunks/layout.svelte-UxsTmhKc.js +8 -0
- package/build/server/chunks/layout.svelte-UxsTmhKc.js.map +1 -0
- package/build/server/chunks/{string-DLbvtT1R.js → numbers-DL8C9q4W.js} +1 -71
- package/build/server/chunks/numbers-DL8C9q4W.js.map +1 -0
- package/build/server/chunks/{FormDialog-CB-2YGWi.js → user2-CRfK67II.js} +12 -206
- package/build/server/chunks/user2-CRfK67II.js.map +1 -0
- package/build/server/chunks/utils-h74ns7K6.js.map +1 -1
- package/build/server/index.js +2304 -1140
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +78 -13
- package/build/server/manifest.js.map +1 -1
- package/dist/acl.d.ts +1 -2
- package/dist/acl.js +1 -1
- package/dist/api/acl.js +4 -4
- package/dist/api/admin.d.ts +1 -0
- package/dist/api/admin.js +152 -0
- package/dist/api/index.d.ts +2 -0
- package/dist/api/index.js +2 -0
- package/dist/api/metadata.js +5 -5
- package/dist/api/passkeys.js +10 -10
- package/dist/api/register.js +4 -4
- package/dist/api/session.js +5 -5
- package/dist/api/users.js +52 -49
- package/dist/audit.d.ts +8 -39
- package/dist/audit.js +13 -16
- package/dist/auth.d.ts +4 -11
- package/dist/auth.js +4 -4
- package/dist/cli.js +515 -559
- package/dist/config.d.ts +26 -16
- package/dist/config.js +65 -36
- package/dist/database.d.ts +3 -4
- package/dist/database.js +19 -18
- package/dist/internal_requests.d.ts +3 -0
- package/dist/internal_requests.js +119 -0
- package/dist/io.d.ts +0 -49
- package/dist/io.js +23 -171
- package/dist/linking.d.ts +0 -1
- package/dist/linking.js +5 -8
- package/dist/requests.d.ts +10 -6
- package/dist/requests.js +17 -15
- package/dist/routes.d.ts +6 -10
- package/dist/routes.js +7 -8
- package/dist/serve.d.ts +7 -2
- package/dist/serve.js +170 -13
- package/dist/state.js +2 -1
- package/package.json +8 -7
- package/routes/account/+page.svelte +5 -109
- package/routes/admin/+layout.svelte +56 -0
- package/routes/admin/+layout.ts +31 -0
- package/routes/admin/+page.svelte +39 -0
- package/routes/admin/+page.ts +7 -0
- package/routes/admin/audit/+page.svelte +158 -0
- package/routes/admin/audit/+page.ts +22 -0
- package/routes/admin/audit/[id]/+page.svelte +43 -0
- package/routes/admin/audit/[id]/+page.ts +9 -0
- package/routes/admin/audit/styles.css +31 -0
- package/routes/admin/config/+page.svelte +28 -0
- package/routes/admin/config/+page.ts +9 -0
- package/routes/admin/plugins/+page.svelte +23 -0
- package/routes/admin/plugins/+page.ts +7 -0
- package/routes/admin/users/+page.svelte +60 -0
- package/routes/admin/users/+page.ts +9 -0
- package/routes/admin/users/[id]/+page.svelte +108 -0
- package/routes/admin/users/[id]/+page.ts +17 -0
- package/routes/login/client/+page.svelte +72 -0
- package/routes/login/client/+page.ts +27 -0
- package/routes/tsconfig.json +1 -1
- package/svelte.config.js +4 -10
- package/{web/template.html → template.html} +1 -1
- package/{web/tsconfig.json → web.tsconfig.json} +2 -2
- package/build/client/_app/immutable/chunks/B1E1cVbi.js +0 -1
- package/build/client/_app/immutable/chunks/B1E1cVbi.js.br +0 -0
- package/build/client/_app/immutable/chunks/B1E1cVbi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CIywFg5g.js +0 -3
- package/build/client/_app/immutable/chunks/CIywFg5g.js.br +0 -0
- package/build/client/_app/immutable/chunks/CIywFg5g.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D3hk2v8y.js +0 -1
- package/build/client/_app/immutable/chunks/D3hk2v8y.js.br +0 -2
- package/build/client/_app/immutable/chunks/D3hk2v8y.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D4Bce_hb.js +0 -1
- package/build/client/_app/immutable/chunks/D4Bce_hb.js.br +0 -0
- package/build/client/_app/immutable/chunks/D4Bce_hb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D9TfJrfD.js +0 -1
- package/build/client/_app/immutable/chunks/D9TfJrfD.js.br +0 -0
- package/build/client/_app/immutable/chunks/D9TfJrfD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJeR1n-B.js +0 -51
- package/build/client/_app/immutable/chunks/DJeR1n-B.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJeR1n-B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DsnmJJEf.js +0 -1
- package/build/client/_app/immutable/chunks/DsnmJJEf.js.br +0 -2
- package/build/client/_app/immutable/chunks/DsnmJJEf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dy1O3iBu.js +0 -2
- package/build/client/_app/immutable/chunks/Dy1O3iBu.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dy1O3iBu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pba7IodQ.js +0 -1
- package/build/client/_app/immutable/chunks/pba7IodQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/pba7IodQ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.ChtScU8h.js +0 -2
- package/build/client/_app/immutable/entry/app.ChtScU8h.js.br +0 -0
- package/build/client/_app/immutable/entry/app.ChtScU8h.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DdjgBKiR.js +0 -1
- package/build/client/_app/immutable/entry/start.DdjgBKiR.js.br +0 -2
- package/build/client/_app/immutable/entry/start.DdjgBKiR.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js +0 -1
- package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DlE8ZTIF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.DRjfV_5C.js +0 -1
- package/build/client/_app/immutable/nodes/1.DRjfV_5C.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.DRjfV_5C.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.CvEpuMc7.js +0 -1
- package/build/client/_app/immutable/nodes/2.CvEpuMc7.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CvEpuMc7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CVudd8x2.js +0 -7
- package/build/client/_app/immutable/nodes/3.CVudd8x2.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CVudd8x2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js +0 -1
- package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.Dhj0R0r7.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.CGoBaVII.js +0 -1
- package/build/client/_app/immutable/nodes/5.CGoBaVII.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.CGoBaVII.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BtB2uWXy.js +0 -1
- package/build/client/_app/immutable/nodes/6.BtB2uWXy.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BtB2uWXy.js.gz +0 -0
- package/build/server/chunks/0-DgHTujtC.js +0 -9
- package/build/server/chunks/0-DgHTujtC.js.map +0 -1
- package/build/server/chunks/1-B3zVLOO8.js +0 -9
- package/build/server/chunks/1-B3zVLOO8.js.map +0 -1
- package/build/server/chunks/2-CXlrhpR6.js +0 -9
- package/build/server/chunks/3-CGT4Ugys.js +0 -13
- package/build/server/chunks/3-CGT4Ugys.js.map +0 -1
- package/build/server/chunks/4-BscEiwUk.js +0 -9
- package/build/server/chunks/4-BscEiwUk.js.map +0 -1
- package/build/server/chunks/5-H0ePIJBE.js +0 -9
- package/build/server/chunks/5-H0ePIJBE.js.map +0 -1
- package/build/server/chunks/6-BrPpcagX.js +0 -9
- package/build/server/chunks/6-BrPpcagX.js.map +0 -1
- package/build/server/chunks/FormDialog-CB-2YGWi.js.map +0 -1
- package/build/server/chunks/Logout-LKOt-AST.js +0 -45
- package/build/server/chunks/Logout-LKOt-AST.js.map +0 -1
- package/build/server/chunks/_page.svelte-B1LK5J87.js +0 -11
- package/build/server/chunks/_page.svelte-B1LK5J87.js.map +0 -1
- package/build/server/chunks/_page.svelte-CMtkwvbP.js +0 -68
- package/build/server/chunks/_page.svelte-CMtkwvbP.js.map +0 -1
- package/build/server/chunks/_page.svelte-CbI2KxeA.js +0 -62
- package/build/server/chunks/_page.svelte-CbI2KxeA.js.map +0 -1
- package/build/server/chunks/_page.svelte-D1_WJoyP.js +0 -6
- package/build/server/chunks/_page.svelte-D1_WJoyP.js.map +0 -1
- package/build/server/chunks/_page.svelte-d01Hl2Ia.js +0 -639
- package/build/server/chunks/_page.svelte-d01Hl2Ia.js.map +0 -1
- package/build/server/chunks/error.svelte-DNQXZmIO.js.map +0 -1
- package/build/server/chunks/hooks.server-CQhG9POo.js +0 -17298
- package/build/server/chunks/hooks.server-CQhG9POo.js.map +0 -1
- package/build/server/chunks/index-CvHf_GW2.js.map +0 -1
- package/build/server/chunks/index-RTKpMYZ1.js +0 -397
- package/build/server/chunks/index-RTKpMYZ1.js.map +0 -1
- package/build/server/chunks/layout.svelte-BSvrn-4a.js +0 -8
- package/build/server/chunks/layout.svelte-BSvrn-4a.js.map +0 -1
- package/build/server/chunks/string-DLbvtT1R.js.map +0 -1
- package/dist/apps.d.ts +0 -6
- package/dist/apps.js +0 -6
- package/dist/plugins.d.ts +0 -49
- package/dist/plugins.js +0 -80
- package/dist/sveltekit.d.ts +0 -8
- package/dist/sveltekit.js +0 -60
- package/web/hooks.server.ts +0 -4
- /package/{axiumd.service → axium.service} +0 -0
package/dist/serve.js
CHANGED
|
@@ -1,19 +1,176 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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
|
|
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
|
-
|
|
13
|
-
|
|
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(
|
|
16
|
-
return createSecureServer({ key: readFileSync(opt.ssl_key || config.web.ssl_key), cert: readFileSync(opt.ssl_cert || config.web.ssl_cert) },
|
|
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
|
-
|
|
30
|
-
void
|
|
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
|
-
|
|
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.
|
|
4
|
-
"author": "James Prevett <axium@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
|
-
"
|
|
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.
|
|
49
|
-
"@axium/core": ">=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
|
-
"
|
|
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
|
-
|
|
4
|
-
|
|
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
|
-
{
|
|
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,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>
|