@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/config.js CHANGED
@@ -10,6 +10,8 @@ const audit_severity_levels = ['emergency', 'alert', 'critical', 'error', 'warni
10
10
  const z_audit_severity = z.literal([...audit_severity_levels, ...audit_severity_levels.map(capitalize)]);
11
11
  export const ConfigSchema = z
12
12
  .looseObject({
13
+ /** Whether /api/admin is enabled */
14
+ admin_api: z.boolean(),
13
15
  allow_new_users: z.boolean(),
14
16
  apps: z
15
17
  .looseObject({
@@ -59,11 +61,10 @@ export const ConfigSchema = z
59
61
  console: z.boolean(),
60
62
  })
61
63
  .partial(),
64
+ request_size_limit: z.number().min(0).optional(),
62
65
  show_duplicate_state: z.boolean(),
63
66
  web: z
64
67
  .looseObject({
65
- assets: z.string(),
66
- build: z.string(),
67
68
  disable_cache: z.boolean(),
68
69
  port: z.number().min(1).max(65535),
69
70
  prefix: z.string(),
@@ -71,7 +72,6 @@ export const ConfigSchema = z
71
72
  secure: z.boolean(),
72
73
  ssl_key: z.string(),
73
74
  ssl_cert: z.string(),
74
- template: z.string(),
75
75
  })
76
76
  .partial(),
77
77
  })
@@ -80,18 +80,8 @@ export const configFiles = _unique('configFiles', new Map());
80
80
  export function plainConfig() {
81
81
  return omit(config, Object.keys(configShortcuts));
82
82
  }
83
- const configShortcuts = {
84
- findPath: findConfigPaths,
85
- load: loadConfig,
86
- loadDefaults: loadDefaultConfigs,
87
- plain: plainConfig,
88
- save: saveConfig,
89
- saveTo: saveConfigTo,
90
- set: setConfig,
91
- files: configFiles,
92
- };
93
- export const config = _unique('config', {
94
- ...configShortcuts,
83
+ export const defaultConfig = {
84
+ admin_api: true,
95
85
  allow_new_users: true,
96
86
  apps: {
97
87
  disabled: [],
@@ -131,9 +121,8 @@ export const config = _unique('config', {
131
121
  level: 'info',
132
122
  },
133
123
  show_duplicate_state: false,
124
+ request_size_limit: 0,
134
125
  web: {
135
- assets: '',
136
- build: '../build/handler.js',
137
126
  disable_cache: false,
138
127
  port: 443,
139
128
  prefix: '',
@@ -141,8 +130,22 @@ export const config = _unique('config', {
141
130
  secure: true,
142
131
  ssl_key: resolve(dirs[0], 'ssl_key.pem'),
143
132
  ssl_cert: resolve(dirs[0], 'ssl_cert.pem'),
144
- template: join(import.meta.dirname, '../web/template.html'),
145
133
  },
134
+ };
135
+ const configShortcuts = {
136
+ findPath: findConfigPaths,
137
+ load: loadConfig,
138
+ loadDefaults: loadDefaultConfigs,
139
+ plain: plainConfig,
140
+ save: saveConfig,
141
+ saveTo: saveConfigTo,
142
+ set: setConfig,
143
+ files: configFiles,
144
+ defaults: defaultConfig,
145
+ };
146
+ export const config = _unique('config', {
147
+ ...configShortcuts,
148
+ ...defaultConfig,
146
149
  });
147
150
  export default config;
148
151
  // config from file
@@ -153,14 +156,16 @@ export const FileSchema = z
153
156
  plugins: z.array(z.string()),
154
157
  })
155
158
  .partial();
156
- export function addConfigDefaults(other, _target = config) {
159
+ export function addConfigDefaults(other, _target = config, _noDefault = false) {
160
+ if (!_noDefault)
161
+ deepAssign(defaultConfig, other);
157
162
  for (const [key, value] of Object.entries(other)) {
158
163
  if (!(key in _target) || _target[key] === null || _target[key] === undefined || Number.isNaN(_target[key])) {
159
164
  _target[key] = value;
160
165
  continue;
161
166
  }
162
167
  if (typeof value == 'object' && value != null && typeof _target[key] == 'object') {
163
- addConfigDefaults(value, _target[key]);
168
+ addConfigDefaults(value, _target[key], true);
164
169
  }
165
170
  }
166
171
  }
@@ -175,6 +180,7 @@ export function setConfig(other) {
175
180
  _setDebugOutput(config.debug);
176
181
  _duplicateStateWarnings(config.show_duplicate_state);
177
182
  }
183
+ const kWasIncluded = Symbol.for('_wasIncluded');
178
184
  /**
179
185
  * Load the config from the provided path
180
186
  */
@@ -201,15 +207,15 @@ export async function loadConfig(path, options = {}) {
201
207
  output.debug(`Loading invalid config from ${path} (${e.message})`);
202
208
  file = json;
203
209
  }
204
- configFiles.set(path, file);
210
+ configFiles.set(path, { ...file, [kWasIncluded]: !!options._markIncluded });
205
211
  setConfig(file);
206
212
  output.debug('Loaded config: ' + path);
207
213
  for (const include of file.include ?? [])
208
- await loadConfig(resolve(dirname(path), include), { optional: true });
214
+ await loadConfig(resolve(dirname(path), include), { ...options, optional: true, _markIncluded: true });
209
215
  for (const plugin of file.plugins ?? [])
210
- await loadPlugin(plugin.startsWith('.') ? resolve(dirname(path), plugin) : plugin);
216
+ await loadPlugin(plugin, path, options.safe);
211
217
  }
212
- export async function loadDefaultConfigs() {
218
+ export async function loadDefaultConfigs(safe = false) {
213
219
  for (const path of findConfigPaths()) {
214
220
  if (!existsSync(path)) {
215
221
  try {
@@ -219,9 +225,20 @@ export async function loadDefaultConfigs() {
219
225
  continue;
220
226
  }
221
227
  }
222
- await loadConfig(path, { optional: true });
228
+ await loadConfig(path, { optional: true, safe });
223
229
  }
224
230
  }
231
+ export async function reloadConfigs(safe = false) {
232
+ const paths = Array.from(configFiles
233
+ .entries()
234
+ .filter(([, cfg]) => !cfg[kWasIncluded])
235
+ .map(([p]) => p));
236
+ configFiles.clear();
237
+ setConfig(defaultConfig);
238
+ for (const path of paths)
239
+ await loadConfig(path, { safe });
240
+ output.info('Reloaded configuration files');
241
+ }
225
242
  /**
226
243
  * Update the current config and write the updated config to the appropriate file
227
244
  */
@@ -1,9 +1,8 @@
1
- import type { Permission, Preferences } from '@axium/core';
1
+ import type { Permission, Preferences, Severity, UserInternal } from '@axium/core';
2
2
  import type { AuthenticatorTransportFuture, CredentialDeviceType } from '@simplewebauthn/server';
3
3
  import type * as kysely from 'kysely';
4
4
  import { Kysely } from 'kysely';
5
- import type { Severity } from './audit.js';
6
- import type { UserInternal, VerificationRole } from './auth.js';
5
+ import type { VerificationRole } from './auth.js';
7
6
  export interface DBAccessControl {
8
7
  itemId: string;
9
8
  userId: string;
@@ -43,7 +42,7 @@ export interface Schema {
43
42
  name: string | null;
44
43
  createdAt: kysely.GeneratedAlways<Date>;
45
44
  userId: string;
46
- publicKey: Uint8Array;
45
+ publicKey: Uint8Array<ArrayBuffer>;
47
46
  counter: number;
48
47
  deviceType: CredentialDeviceType;
49
48
  backedUp: boolean;
package/dist/database.js CHANGED
@@ -277,11 +277,11 @@ export async function init(opt) {
277
277
  .catch(maybeCheck('audit_log'));
278
278
  io.start('Creating schema acl');
279
279
  await database.schema.createSchema('acl').execute().then(io.done).catch(warnExists);
280
- for (const plugin of plugins) {
281
- if (!plugin.hooks.db_init)
280
+ for (const plugin of plugins.values()) {
281
+ if (!plugin._hooks?.db_init)
282
282
  continue;
283
283
  io.plugin(plugin.name);
284
- await plugin.hooks.db_init(opt);
284
+ await plugin._hooks?.db_init(opt);
285
285
  }
286
286
  }
287
287
  catch (e_1) {
@@ -432,22 +432,22 @@ export async function clean(opt) {
432
432
  await database.deleteFrom('sessions').where('sessions.expires', '<', now).execute().then(io.done);
433
433
  io.start('Removing expired verifications');
434
434
  await database.deleteFrom('verifications').where('verifications.expires', '<', now).execute().then(io.done);
435
- for (const plugin of plugins) {
436
- if (!plugin.hooks.clean)
435
+ for (const plugin of plugins.values()) {
436
+ if (!plugin._hooks?.clean)
437
437
  continue;
438
438
  io.plugin(plugin.name);
439
- await plugin.hooks.clean(opt);
439
+ await plugin._hooks?.clean(opt);
440
440
  }
441
441
  }
442
442
  /**
443
443
  * Completely remove Axium from the database.
444
444
  */
445
445
  export async function uninstall(opt) {
446
- for (const plugin of plugins) {
447
- if (!plugin.hooks.remove)
446
+ for (const plugin of plugins.values()) {
447
+ if (!plugin._hooks?.remove)
448
448
  continue;
449
449
  io.plugin(plugin.name);
450
- await plugin.hooks.remove(opt);
450
+ await plugin._hooks?.remove(opt);
451
451
  }
452
452
  await _sql('DROP DATABASE axium', 'Dropping database');
453
453
  await _sql('REVOKE ALL PRIVILEGES ON SCHEMA public FROM axium', 'Revoking schema privileges');
@@ -469,11 +469,11 @@ export async function uninstall(opt) {
469
469
  * Removes all data from tables.
470
470
  */
471
471
  export async function wipe(opt) {
472
- for (const plugin of plugins) {
473
- if (!plugin.hooks.db_wipe)
472
+ for (const plugin of plugins.values()) {
473
+ if (!plugin._hooks?.db_wipe)
474
474
  continue;
475
475
  io.plugin(plugin.name);
476
- await plugin.hooks.db_wipe(opt);
476
+ await plugin._hooks?.db_wipe(opt);
477
477
  }
478
478
  for (const table of ['users', 'passkeys', 'sessions', 'verifications']) {
479
479
  io.start(`Wiping ${table}`);
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ export declare function convertToRequest(req: IncomingMessage): Request;
3
+ export declare function convertFromResponse(res: ServerResponse, response: Response): Promise<void>;
@@ -0,0 +1,119 @@
1
+ import { config } from './config.js';
2
+ /* Credit to the SvelteKit team: https://github.com/sveltejs/kit/blob/8d1ba04825a540324bc003e85f36559a594aadc2/packages/kit/src/exports/node/index.js */
3
+ function get_raw_body(req) {
4
+ const h = req.headers;
5
+ if (!h['content-type'])
6
+ return null;
7
+ const content_length = Number(h['content-length']);
8
+ // check if no request body
9
+ if ((req.httpVersionMajor === 1 && isNaN(content_length) && h['transfer-encoding'] == null) || content_length === 0) {
10
+ return null;
11
+ }
12
+ let length = content_length;
13
+ if (config.request_size_limit) {
14
+ if (!length)
15
+ length = config.request_size_limit;
16
+ else if (length > config.request_size_limit)
17
+ throw 413;
18
+ }
19
+ if (req.destroyed) {
20
+ const readable = new ReadableStream();
21
+ void readable.cancel();
22
+ return readable;
23
+ }
24
+ let size = 0;
25
+ let cancelled = false;
26
+ return new ReadableStream({
27
+ start(controller) {
28
+ req.on('error', error => {
29
+ cancelled = true;
30
+ controller.error(error);
31
+ });
32
+ req.on('end', () => {
33
+ if (cancelled)
34
+ return;
35
+ controller.close();
36
+ });
37
+ req.on('data', chunk => {
38
+ if (cancelled)
39
+ return;
40
+ size += chunk.length;
41
+ if (size > length) {
42
+ cancelled = true;
43
+ controller.error(413);
44
+ return;
45
+ }
46
+ controller.enqueue(chunk);
47
+ if (controller.desiredSize === null || controller.desiredSize <= 0) {
48
+ req.pause();
49
+ }
50
+ });
51
+ },
52
+ pull() {
53
+ req.resume();
54
+ },
55
+ cancel(reason) {
56
+ cancelled = true;
57
+ req.destroy(reason);
58
+ },
59
+ });
60
+ }
61
+ export function convertToRequest(req) {
62
+ const headers = req.headers;
63
+ const request = new Request(config.auth.origin + req.url, {
64
+ // @ts-expect-error 2353
65
+ duplex: 'half',
66
+ method: req.method,
67
+ headers,
68
+ body: get_raw_body(req),
69
+ });
70
+ return request;
71
+ }
72
+ export async function convertFromResponse(res, response) {
73
+ res.writeHead(response.status, Object.fromEntries(response.headers));
74
+ if (!response.body) {
75
+ res.end();
76
+ return;
77
+ }
78
+ if (response.body.locked) {
79
+ res.write('Fatal error: Response body is locked. ' +
80
+ `This can happen when the response was already read (for example through 'response.json()' or 'response.text()').`);
81
+ res.end();
82
+ return;
83
+ }
84
+ const reader = response.body.getReader();
85
+ if (res.destroyed) {
86
+ await reader.cancel();
87
+ return;
88
+ }
89
+ const cancel = (error) => {
90
+ res.off('close', cancel);
91
+ res.off('error', cancel);
92
+ // If the reader has already been interrupted with an error earlier,
93
+ // then it will appear here, it is useless, but it needs to be catch.
94
+ reader.cancel(error).catch(() => { });
95
+ if (error)
96
+ res.destroy(error);
97
+ };
98
+ res.on('close', cancel);
99
+ res.on('error', cancel);
100
+ async function next() {
101
+ try {
102
+ for (;;) {
103
+ const { done, value } = await reader.read();
104
+ if (done)
105
+ break;
106
+ if (!res.write(value)) {
107
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
108
+ res.once('drain', next);
109
+ return;
110
+ }
111
+ }
112
+ res.end();
113
+ }
114
+ catch (error) {
115
+ cancel(error instanceof Error ? error : new Error(String(error)));
116
+ }
117
+ }
118
+ void next();
119
+ }
package/dist/io.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { Logger } from 'logzen';
2
2
  export declare const systemDir = "/etc/axium";
3
- export declare const userDir: string;
4
3
  export declare const dirs: string[];
5
4
  export declare const logger: Logger;
6
5
  /**
@@ -30,6 +29,7 @@ export interface Output {
30
29
  (tag: 'done'): void;
31
30
  (tag: Exclude<OutputTag, 'done'>, message: string): void;
32
31
  }
32
+ export declare let _debugOutput: boolean;
33
33
  /**
34
34
  * Enable or disable debug output.
35
35
  */
package/dist/io.js CHANGED
@@ -1,13 +1,11 @@
1
1
  import { Logger } from 'logzen';
2
2
  import { exec } from 'node:child_process';
3
3
  import * as fs from 'node:fs';
4
- import { homedir } from 'node:os';
5
4
  import { dirname, join, resolve } from 'node:path/posix';
6
5
  import { styleText } from 'node:util';
7
6
  import { _unique } from './state.js';
8
7
  export const systemDir = '/etc/axium';
9
- export const userDir = join(homedir(), '.axium');
10
- export const dirs = _unique('dirs', [systemDir, userDir]);
8
+ export const dirs = _unique('dirs', [systemDir]);
11
9
  for (let dir = resolve(process.cwd()); dir !== '/'; dir = dirname(dir)) {
12
10
  if (fs.existsSync(join(dir, '.axium')))
13
11
  dirs.push(join(dir, '.axium'));
@@ -20,7 +18,6 @@ try {
20
18
  catch {
21
19
  // Missing permissions
22
20
  }
23
- fs.mkdirSync(userDir, { recursive: true });
24
21
  export const logger = new Logger({
25
22
  hideWarningStack: true,
26
23
  noGlobalConsole: true,
@@ -92,7 +89,7 @@ export function handleError(e) {
92
89
  else
93
90
  exit(e);
94
91
  }
95
- let _debugOutput = false;
92
+ export let _debugOutput = false;
96
93
  /**
97
94
  * Enable or disable debug output.
98
95
  */
package/dist/linking.d.ts CHANGED
@@ -5,7 +5,6 @@ interface LinkInfo {
5
5
  text: string;
6
6
  }
7
7
  export interface LinkOptions {
8
- packagesDir?: string;
9
8
  only?: string[];
10
9
  }
11
10
  export declare function listRouteLinks(options?: LinkOptions): Generator<LinkInfo>;
package/dist/linking.js CHANGED
@@ -11,21 +11,18 @@ function info(id) {
11
11
  const link = join(config.web.routes, `(${id.startsWith('#') ? id.slice(1) : id.replaceAll('/', '__')})`);
12
12
  return [text, link];
13
13
  }
14
- const defaultPackagesDir = join(import.meta.dirname, '../../..');
15
14
  export function* listRouteLinks(options = {}) {
16
- const packagesDir = options.packagesDir || defaultPackagesDir;
17
- io.debug('Using packages from ' + packagesDir);
18
15
  if (!options.only) {
19
16
  const [text, link] = info('#builtin');
20
17
  yield { text, id: '#builtin', from: link, to: resolve(import.meta.dirname, '../routes') };
21
18
  }
22
- for (const plugin of plugins) {
19
+ for (const plugin of plugins.values()) {
23
20
  if (!plugin.routes)
24
21
  continue;
25
22
  if (options.only && !options.only.includes(plugin.name))
26
23
  continue;
27
24
  const [text, link] = info(plugin.name);
28
- const to = resolve(join(packagesDir, plugin.name, plugin.routes));
25
+ const to = resolve(join(plugin.dirname, plugin.routes));
29
26
  yield { text, id: plugin.name, from: link, to };
30
27
  }
31
28
  }
package/dist/plugins.d.ts CHANGED
@@ -1,38 +1,7 @@
1
- import * as z from 'zod';
1
+ import { type PluginInternal } from '@axium/core/plugins';
2
2
  import type { InitOptions, OpOptions } from './database.js';
3
- export declare const PluginMetadata: z.ZodObject<{
4
- name: z.ZodString;
5
- version: z.ZodString;
6
- description: z.ZodOptional<z.ZodString>;
7
- routes: z.ZodOptional<z.ZodString>;
8
- apps: z.ZodOptional<z.ZodArray<z.ZodObject<{
9
- id: z.ZodString;
10
- name: z.ZodOptional<z.ZodString>;
11
- image: z.ZodOptional<z.ZodString>;
12
- icon: z.ZodOptional<z.ZodString>;
13
- }, z.core.$strip>>>;
14
- }, z.core.$loose>;
15
- export declare const Plugin: z.ZodObject<{
16
- name: z.ZodString;
17
- version: z.ZodString;
18
- description: z.ZodOptional<z.ZodString>;
19
- routes: z.ZodOptional<z.ZodString>;
20
- apps: z.ZodOptional<z.ZodArray<z.ZodObject<{
21
- id: z.ZodString;
22
- name: z.ZodOptional<z.ZodString>;
23
- image: z.ZodOptional<z.ZodString>;
24
- icon: z.ZodOptional<z.ZodString>;
25
- }, z.core.$strip>>>;
26
- statusText: z.ZodCustom<z.core.$InferInnerFunctionTypeAsync<z.core.$ZodTuple<[], null>, z.ZodString>, z.core.$InferInnerFunctionTypeAsync<z.core.$ZodTuple<[], null>, z.ZodString>>;
27
- hooks: z.ZodOptional<z.ZodRecord<z.ZodLiteral<"remove" | "db_init" | "db_wipe" | "clean"> & z.core.$partial, z.ZodCustom<(...args: any[]) => any, (...args: any[]) => any>>>;
28
- }, z.core.$loose>;
29
- declare const kSpecifier: unique symbol;
30
- export type Plugin = z.infer<typeof Plugin>;
31
- interface PluginInternal extends Plugin {
32
- [kSpecifier]: string;
33
- hooks: Hooks;
34
- }
35
3
  export interface Hooks {
4
+ statusText?(): string | Promise<string>;
36
5
  db_init?: (opt: InitOptions) => void | Promise<void>;
37
6
  remove?: (opt: {
38
7
  force?: boolean;
@@ -40,10 +9,6 @@ export interface Hooks {
40
9
  db_wipe?: (opt: OpOptions) => void | Promise<void>;
41
10
  clean?: (opt: Partial<OpOptions>) => void | Promise<void>;
42
11
  }
43
- export declare const plugins: Set<PluginInternal>;
44
- export declare function resolvePlugin(search: string): PluginInternal | undefined;
12
+ export declare const plugins: Map<string, PluginInternal>;
45
13
  export declare function pluginText(plugin: PluginInternal): string;
46
- export declare function loadPlugin(specifier: string): Promise<void>;
47
- export declare function getSpecifier(plugin: PluginInternal): string;
48
- export declare function loadPlugins(dir: string): Promise<void>;
49
- export {};
14
+ export declare function loadPlugin(specifier: string, _loadedBy: string, safeMode?: boolean): Promise<void>;
package/dist/plugins.js CHANGED
@@ -1,54 +1,52 @@
1
- import { App } from '@axium/core';
2
- import { zAsyncFunction } from '@axium/core/schemas';
1
+ import { Plugin } from '@axium/core/plugins';
3
2
  import * as fs from 'node:fs';
4
- import { resolve } from 'node:path/posix';
3
+ import { dirname, join, resolve } from 'node:path/posix';
4
+ import { fileURLToPath } from 'node:url';
5
5
  import { styleText } from 'node:util';
6
6
  import * as z from 'zod';
7
7
  import { apps } from './apps.js';
8
8
  import { output } from './io.js';
9
9
  import { _unique } from './state.js';
10
- export const PluginMetadata = z.looseObject({
11
- name: z.string(),
12
- version: z.string(),
13
- description: z.string().optional(),
14
- routes: z.string().optional(),
15
- apps: z.array(App).optional(),
16
- });
17
- const hookNames = ['db_init', 'remove', 'db_wipe', 'clean'];
18
- const fn = z.custom(data => typeof data === 'function');
19
- export const Plugin = PluginMetadata.extend({
20
- statusText: zAsyncFunction(z.function({ input: [], output: z.string() })),
21
- hooks: z.partialRecord(z.literal(hookNames), fn).optional(),
22
- });
23
- const kSpecifier = Symbol('specifier');
24
- export const plugins = _unique('plugins', new Set());
25
- export function resolvePlugin(search) {
26
- for (const plugin of plugins) {
27
- if (plugin.name === search)
28
- return plugin;
29
- }
30
- }
10
+ export const plugins = _unique('plugins', new Map());
31
11
  export function pluginText(plugin) {
32
12
  return [
33
13
  styleText('whiteBright', plugin.name),
34
14
  `Version: ${plugin.version}`,
35
15
  `Description: ${plugin.description ?? styleText('dim', '(none)')}`,
36
- `Hooks: ${Object.keys(plugin.hooks).join(', ') || styleText('dim', '(none)')}`,
37
- // @todo list the routes when debug output is enabled
38
- `Routes: ${plugin.routes || styleText('dim', '(none)')}`,
16
+ `Hooks: ${plugin._hooks ? styleText(['dim', 'bold'], `(${Object.keys(plugin._hooks).length}) `) + Object.keys(plugin._hooks).join(', ') : plugin.hooks || styleText('dim', '(none)')}`,
17
+ `HTTP Handler: ${plugin.http_handler ?? styleText('dim', '(none)')}`,
39
18
  ].join('\n');
40
19
  }
41
- const _importedPlugins = _unique('imported_raw', new Set());
42
- export async function loadPlugin(specifier) {
20
+ function _locatePlugin(specifier, _loadedBy) {
21
+ if (specifier[0] == '/' || specifier.startsWith('./') || specifier.startsWith('../')) {
22
+ return resolve(dirname(_loadedBy), specifier);
23
+ }
24
+ let packageDir = dirname(fileURLToPath(import.meta.resolve(specifier)));
25
+ for (; !fs.existsSync(join(packageDir, 'package.json')); packageDir = dirname(packageDir))
26
+ ;
27
+ return join(packageDir, 'package.json');
28
+ }
29
+ export async function loadPlugin(specifier, _loadedBy, safeMode = false) {
43
30
  try {
44
- const imported = await import(/* @vite-ignore */ specifier);
45
- if (_importedPlugins.has(imported))
46
- return; // already loaded this exact module
47
- _importedPlugins.add(imported);
48
- const maybePlugin = 'default' in imported ? imported.default : imported;
49
- const plugin = Object.assign({ hooks: {}, [kSpecifier]: specifier }, await Plugin.parseAsync(maybePlugin).catch(e => {
31
+ const path = _locatePlugin(specifier, _loadedBy);
32
+ let imported;
33
+ try {
34
+ imported = JSON.parse(fs.readFileSync(path, 'utf8'));
35
+ }
36
+ catch (e) {
37
+ throw new Error('Invalid or missing metadata for ' + specifier);
38
+ }
39
+ if ('axium' in imported)
40
+ Object.assign(imported, imported.axium); // support axium field in package.json
41
+ const plugin = Object.assign(await Plugin.parseAsync(imported).catch(e => {
50
42
  throw e instanceof z.core.$ZodError ? z.prettifyError(e) : e;
51
- }));
43
+ }), { path, specifier, _loadedBy, dirname: dirname(path) });
44
+ if (!safeMode && plugin.hooks) {
45
+ Object.assign(plugin, { _hooks: await import(resolve(plugin.dirname, plugin.hooks)) });
46
+ }
47
+ Object.freeze(plugin);
48
+ if (plugins.has(plugin.name))
49
+ throw 'Plugin already loaded';
52
50
  if (plugin.name.startsWith('#') || plugin.name.includes(' ')) {
53
51
  throw 'Invalid plugin name. Plugin names can not start with a hash or contain spaces.';
54
52
  }
@@ -57,24 +55,10 @@ export async function loadPlugin(specifier) {
57
55
  throw new ReferenceError(`App with ID "${app.id}" already exists.`);
58
56
  apps.set(app.id, app);
59
57
  }
60
- plugins.add(plugin);
58
+ plugins.set(plugin.name, plugin);
61
59
  output.debug(`Loaded plugin: ${plugin.name} ${plugin.version}`);
62
60
  }
63
61
  catch (e) {
64
62
  output.debug(`Failed to load plugin from ${specifier}: ${e ? (e instanceof Error ? e.message : e.toString()) : e}`);
65
63
  }
66
64
  }
67
- export function getSpecifier(plugin) {
68
- return plugin[kSpecifier];
69
- }
70
- export async function loadPlugins(dir) {
71
- fs.mkdirSync(dir, { recursive: true });
72
- const files = fs.readdirSync(dir);
73
- for (const file of files) {
74
- const path = resolve(dir, file);
75
- const stats = fs.statSync(path);
76
- if (stats.isDirectory() || !['.js', '.mjs'].some(ext => path.endsWith(ext)))
77
- return;
78
- await loadPlugin(path);
79
- }
80
- }
@@ -1,12 +1,12 @@
1
- import { type User } from '@axium/core/user';
1
+ import type { User, UserInternal } from '@axium/core';
2
2
  import * as z from 'zod';
3
- import { type UserInternal } from './auth.js';
4
3
  import type { ServerRoute } from './routes.js';
5
4
  /**
6
5
  * @todo Add parsing for Node.js `IncomingMessage` -> standard `Request` and standard `Response` -> Node.js `ServerResponse`
7
6
  */
8
7
  /**
9
8
  * A `Request` with some commonly used stuff pre-parsed for convenience.
9
+ * @deprecated
10
10
  */
11
11
  export interface RequestEvent<Params extends Partial<Record<string, string>> = Partial<Record<string, string>>> {
12
12
  request: Request;
@@ -32,12 +32,12 @@ export declare function isRedirect(e: unknown): e is Redirect;
32
32
  */
33
33
  export declare function redirect(location: string, status?: number): never;
34
34
  export declare function json(data: object, init?: ResponseInit): Response;
35
- export declare function parseBody<const Schema extends z.ZodType, const Result extends z.infer<Schema> = z.infer<Schema>>(event: RequestEvent, schema: Schema): Promise<Result>;
36
- export declare function getToken(event: RequestEvent, sensitive?: boolean): string | undefined;
35
+ export declare function parseBody<const Schema extends z.ZodType, const Result extends z.infer<Schema> = z.infer<Schema>>(request: Request, schema: Schema): Promise<Result>;
36
+ export declare function getToken(request: Request, sensitive?: boolean): string | undefined;
37
37
  export declare function createSessionData(userId: string, elevated?: boolean): Promise<Response>;
38
38
  export declare function stripUser(user: UserInternal, includeProtected?: boolean): User;
39
39
  export declare function withError(text: string, code?: number): (e: Error | ResponseError) => never;
40
- export declare function handleAPIRequest(event: RequestEvent, route: ServerRoute): Promise<Response>;
40
+ export declare function handleAPIRequest(request: Request, params: Record<string, any>, route: ServerRoute): Promise<Response>;
41
41
  export declare function handleResponseError(e: Error | ResponseError | Redirect): Response;
42
42
  export declare const noCacheHeaders: {
43
43
  'Content-Type': string;