@edge-base/server 0.2.1 → 0.2.3
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/admin-build/_app/immutable/chunks/{DjOEv9M9.js → A_3UuvCe.js} +1 -1
- package/admin-build/_app/immutable/chunks/{Dqk2TGNU.js → B-_-hJ9o.js} +1 -1
- package/admin-build/_app/immutable/chunks/{BFs_qStz.js → B5Nwfelm.js} +1 -1
- package/admin-build/_app/immutable/chunks/{B0QyxC2M.js → BxoNtYHK.js} +3 -3
- package/admin-build/_app/immutable/chunks/{BsFiK_FJ.js → CZ0TVkCa.js} +1 -1
- package/admin-build/_app/immutable/chunks/{k0CIJkw4.js → CzSAxmuj.js} +1 -1
- package/admin-build/_app/immutable/chunks/{D-x55wdW.js → DCKcAiQH.js} +1 -1
- package/admin-build/_app/immutable/chunks/{CSGrwS7E.js → DCvwWZrm.js} +1 -1
- package/admin-build/_app/immutable/chunks/{BTJcQFEp.js → DRqPU3wD.js} +1 -1
- package/admin-build/_app/immutable/chunks/{CqUxCvs_.js → Dc1-6Po6.js} +1 -1
- package/admin-build/_app/immutable/chunks/{D755Tqat.js → DiyBpamp.js} +1 -1
- package/admin-build/_app/immutable/chunks/{BcIUK2sk.js → Dlty5069.js} +1 -1
- package/admin-build/_app/immutable/chunks/{BY07qVPA.js → DpVAayDG.js} +1 -1
- package/admin-build/_app/immutable/chunks/{BCKr7yKd.js → Du5vWVa2.js} +1 -1
- package/admin-build/_app/immutable/chunks/{m9QZTyVV.js → byv2rTy8.js} +1 -1
- package/admin-build/_app/immutable/chunks/{DnLqc9L1.js → nZvorU8i.js} +1 -1
- package/admin-build/_app/immutable/entry/{app.BTsq3_xq.js → app.CfrmEXPD.js} +2 -2
- package/admin-build/_app/immutable/entry/start.l1WvHznQ.js +1 -0
- package/admin-build/_app/immutable/nodes/{0.BZ00WDYH.js → 0.Cn2BZ4da.js} +1 -1
- package/admin-build/_app/immutable/nodes/{1.RzSJ3yyr.js → 1.Dv4LX_Co.js} +1 -1
- package/admin-build/_app/immutable/nodes/{10.D-rsiquF.js → 10.DPVv3kat.js} +1 -1
- package/admin-build/_app/immutable/nodes/{11.l7-bgtFD.js → 11.CiCb6Ayu.js} +1 -1
- package/admin-build/_app/immutable/nodes/{12.Dkq0H7B5.js → 12.CIPyeekF.js} +1 -1
- package/admin-build/_app/immutable/nodes/{13.DtK_4oRz.js → 13.Z15Lt36e.js} +1 -1
- package/admin-build/_app/immutable/nodes/{14.BKo7-AMx.js → 14.s0l5bAq3.js} +1 -1
- package/admin-build/_app/immutable/nodes/{15.CQAj_6lq.js → 15.UwSSNO76.js} +1 -1
- package/admin-build/_app/immutable/nodes/{16.XVIG-Ffr.js → 16.qiD8i883.js} +1 -1
- package/admin-build/_app/immutable/nodes/{17.g6raZLCM.js → 17.Dy3dcSvu.js} +1 -1
- package/admin-build/_app/immutable/nodes/{18.IQz6a3T6.js → 18.DeXyPYsO.js} +1 -1
- package/admin-build/_app/immutable/nodes/{19.CAAZ8i8h.js → 19.CAbuyS6w.js} +1 -1
- package/admin-build/_app/immutable/nodes/{20.BPcX3KPj.js → 20.Bec0T7un.js} +1 -1
- package/admin-build/_app/immutable/nodes/21.DuDYelMY.js +1 -0
- package/admin-build/_app/immutable/nodes/{22.Br5AG_5Z.js → 22.CdVprrv2.js} +1 -1
- package/admin-build/_app/immutable/nodes/{23.KjbrdXoE.js → 23.Y8RzVLoF.js} +1 -1
- package/admin-build/_app/immutable/nodes/{24.C3n2-hgw.js → 24.CWhHYFBx.js} +1 -1
- package/admin-build/_app/immutable/nodes/{25.SFDSBzHd.js → 25.wCBplOVt.js} +1 -1
- package/admin-build/_app/immutable/nodes/{26.D95vui6E.js → 26.Cod_JRFK.js} +1 -1
- package/admin-build/_app/immutable/nodes/{27.FgLgdjwB.js → 27.BO2HVMu9.js} +1 -1
- package/admin-build/_app/immutable/nodes/{28.B9sYYm1F.js → 28.DxG-FBVQ.js} +1 -1
- package/admin-build/_app/immutable/nodes/{29.DyqZ_wbN.js → 29.CjGqWGvE.js} +1 -1
- package/admin-build/_app/immutable/nodes/{3.Bzo2yVIO.js → 3.By3_OmdZ.js} +1 -1
- package/admin-build/_app/immutable/nodes/{30.c1CiNwiS.js → 30.M_H7Htpq.js} +1 -1
- package/admin-build/_app/immutable/nodes/{31.CXty66Vh.js → 31.DEU18izM.js} +1 -1
- package/admin-build/_app/immutable/nodes/{4.BgQaXZ27.js → 4.DeYhKtzJ.js} +1 -1
- package/admin-build/_app/immutable/nodes/{5.BuJrHvxH.js → 5.9WLgxhrD.js} +1 -1
- package/admin-build/_app/immutable/nodes/{6.CkBBC94k.js → 6.BdT2i_dd.js} +1 -1
- package/admin-build/_app/immutable/nodes/{7.D2YBvNFM.js → 7.CHq0s4K6.js} +1 -1
- package/admin-build/_app/immutable/nodes/{8.D8qQWo_z.js → 8.DuvRw-XZ.js} +1 -1
- package/admin-build/_app/immutable/nodes/{9.BLDLX5hV.js → 9.C2Ub82wn.js} +1 -1
- package/admin-build/_app/version.json +1 -1
- package/admin-build/index.html +7 -7
- package/package.json +3 -2
- package/src/__tests__/d1-live-broadcast-verification.test.ts +271 -0
- package/src/__tests__/database-live-do.test.ts +50 -0
- package/src/__tests__/database-live-emitter.test.ts +116 -1
- package/src/__tests__/error-format.test.ts +63 -0
- package/src/__tests__/functions-context.test.ts +592 -35
- package/src/__tests__/meta-export-coverage.test.ts +1 -0
- package/src/__tests__/postgres-field-ops-compat.test.ts +110 -0
- package/src/__tests__/provider-aware-sql.test.ts +157 -0
- package/src/__tests__/room-auth-state-loss.test.ts +124 -0
- package/src/__tests__/runtime-surface-accounting.test.ts +0 -4
- package/src/__tests__/sql-route.test.ts +187 -76
- package/src/durable-objects/database-live-do.ts +46 -1
- package/src/durable-objects/room-runtime-base.ts +26 -2
- package/src/durable-objects/rooms-do.ts +1 -1
- package/src/lib/admin-db-target.ts +30 -74
- package/src/lib/d1-handler.ts +45 -14
- package/src/lib/database-live-emitter.ts +57 -16
- package/src/lib/functions.ts +332 -454
- package/src/lib/internal-transport.ts +316 -0
- package/src/lib/plugin-migrations.ts +39 -39
- package/src/lib/postgres-handler.ts +39 -11
- package/src/lib/provider-aware-sql.ts +827 -0
- package/src/routes/admin.ts +7 -1
- package/src/routes/auth.ts +11 -12
- package/src/routes/sql.ts +51 -76
- package/src/routes/storage.ts +11 -12
- package/src/types.ts +2 -0
- package/admin-build/_app/immutable/entry/start.zXCirpgY.js +0 -1
- package/admin-build/_app/immutable/nodes/21.DoPabrY_.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../chunks/CWj6FrbW.js";import{o as ht}from"../chunks/Bn2NtlTj.js";import{p as Ge,a as He,c as r,b as t,g as e,s as l,ae as N,r as a,t as le,f as fe,d,M as Re,w as mt,u as E}from"../chunks/BdTBlfLy.js";import{e as pt,s as W,d as bt,a as _e}from"../chunks/DtZk82gG.js";import{i as ne}from"../chunks/Y22E1hJM.js";import{a as be,b as Ze,t as Ce,e as qe,i as gt}from"../chunks/CqUxCvs_.js";import{a as i,t as X,f as $}from"../chunks/DEELgv7K.js";import{r as Le,e as Ne,a as pe,s as $t}from"../chunks/CoI6jjbg.js";import{g as zt}from"../chunks/m9QZTyVV.js";import{b as Oe}from"../chunks/D755Tqat.js";import{P as yt}from"../chunks/B8s_s9QY.js";import{c as xt}from"../chunks/Q2nPFxS6.js";import{B as Y}from"../chunks/C72lTcG0.js";import{I as ge}from"../chunks/_teD5ji5.js";import{B as Ve}from"../chunks/B0HRJ657.js";import{C as wt}from"../chunks/DILS_-VJ.js";import{E as St}from"../chunks/m9eWh0Cd.js";import{p as je}from"../chunks/F9_4wRrd.js";import{M as kt}from"../chunks/Dt4vL4Df.js";import{S as Ae}from"../chunks/BCKr7yKd.js";import{S as re}from"../chunks/DnLqc9L1.js";var Pt=$("<!> <!>",1),Ut=$('<p class="form__error svelte-17zxii7"> </p>'),Ct=$('<form class="form svelte-17zxii7"><!> <!> <!> <!> <!> <button class="form__submit svelte-17zxii7" type="submit" aria-hidden="true" tabindex="-1">Create User</button></form>');function At($e,oe){Ge(oe,!0);let O=je(oe,"open",15,!1),ze=je(oe,"onCreated",3,()=>{}),P=d(""),U=d(""),C=d(""),T=d("user"),M=d(!1),b=d("");const ie=[{value:"user",label:"User"},{value:"admin",label:"Admin"}];function V(){t(P,""),t(U,""),t(C,""),t(T,"user"),t(b,"")}async function A(){if(t(b,""),!e(P).trim()){t(b,"Email is required.");return}if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e(P).trim())){t(b,"Invalid email format.");return}if(!e(U)){t(b,"Password is required.");return}if(e(U).length<8){t(b,"Password must be at least 8 characters.");return}t(M,!0);try{await be.fetch("data/users",{method:"POST",body:{email:e(P).trim(),password:e(U),displayName:e(C).trim()||void 0,role:e(T)}}),Ze("User created successfully"),O(!1),V(),ze()()}catch(w){t(b,w instanceof Error?w.message:"Failed to create user",!0),Ce(e(b))}finally{t(M,!1)}}kt($e,{title:"Create User",onclose:V,get open(){return O()},set open(Z){O(Z)},footer:Z=>{var de=Pt(),h=fe(de);Y(h,{variant:"secondary",onclick:()=>{O(!1),V()},children:(u,B)=>{N();var I=X("Cancel");i(u,I)},$$slots:{default:!0}});var n=l(h,2);Y(n,{variant:"primary",onclick:A,get loading(){return e(M)},children:(u,B)=>{N();var I=X("Create User");i(u,I)},$$slots:{default:!0}}),i(Z,de)},children:(Z,de)=>{var h=Ct(),n=r(h);ge(n,{label:"Email",type:"email",placeholder:"user@example.com",required:!0,get value(){return e(P)},set value(m){t(P,m,!0)}});var u=l(n,2);ge(u,{label:"Password",type:"password",placeholder:"Minimum 8 characters",required:!0,get value(){return e(U)},set value(m){t(U,m,!0)}});var B=l(u,2);ge(B,{label:"Display Name",placeholder:"(optional)",get value(){return e(C)},set value(m){t(C,m,!0)}});var I=l(B,2);Ae(I,{label:"Role",get options(){return ie},get value(){return e(T)},set value(m){t(T,m,!0)}});var he=l(I,2);{var ye=m=>{var ue=Ut(),xe=r(ue,!0);a(ue),le(()=>W(xe,e(b))),i(m,ue)};ne(he,m=>{e(b)&&m(ye)})}N(2),a(h),pt("submit",h,m=>{m.preventDefault(),A()}),i(Z,h)},$$slots:{footer:!0,default:!0}}),He()}var Dt=$("<!> <a><!></a>",1),Et=$('<div class="bulk-bar svelte-1s728sz"><span class="bulk-bar__count svelte-1s728sz"> </span> <div class="bulk-bar__actions svelte-1s728sz"><!> <!></div> <button class="bulk-bar__clear svelte-1s728sz">Clear</button></div>'),Tt=$('<tr class="table__row svelte-1s728sz"><td class="table__td svelte-1s728sz" style="width:40px"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td></tr>'),Mt=$('<div class="table-wrapper svelte-1s728sz"><table class="table svelte-1s728sz"><thead><tr><th class="table__th table__th--checkbox svelte-1s728sz" style="width:40px"></th><th class="table__th svelte-1s728sz">ID</th><th class="table__th svelte-1s728sz">Email</th><th class="table__th svelte-1s728sz">Status</th><th class="table__th svelte-1s728sz">Role</th><th class="table__th svelte-1s728sz">Created</th></tr></thead><tbody></tbody></table></div>'),Bt=$('<tr role="button"><td class="table__td table__td--checkbox svelte-1s728sz"><input type="checkbox" class="svelte-1s728sz"/></td><td class="table__td table__td--mono svelte-1s728sz"> </td><td class="table__td svelte-1s728sz"> </td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td table__td--secondary svelte-1s728sz"> </td><td class="table__td table__td--secondary svelte-1s728sz"> </td></tr>'),It=$('<span class="pagination__info svelte-1s728sz"> </span>'),Ft=$('<div class="pagination svelte-1s728sz"><!> <!></div>'),Rt=$('<div class="table-wrapper svelte-1s728sz"><table class="table svelte-1s728sz"><thead><tr><th class="table__th table__th--checkbox svelte-1s728sz"><input type="checkbox" aria-label="Select all users" class="svelte-1s728sz"/></th><th class="table__th svelte-1s728sz">ID</th><th class="table__th svelte-1s728sz">Email</th><th class="table__th svelte-1s728sz">Status</th><th class="table__th svelte-1s728sz">Role</th><th class="table__th svelte-1s728sz">Created</th><th class="table__th svelte-1s728sz">Last Sign-in</th></tr></thead><tbody></tbody></table></div> <!>',1),qt=$('<div class="toolbar svelte-1s728sz"><div class="toolbar__search svelte-1s728sz"><!></div> <div class="toolbar__filters svelte-1s728sz"><!> <!></div></div> <!> <!>',1),Lt=$("<!> <!> <!>",1);function ia($e,oe){Ge(oe,!0);let O=d(!1);const ze=20;let P=d(!0),U=d(Re([])),C=d(null),T=d(null),M=d(""),b=null,ie=d(!1),V=0,A=d("all"),w=d("all");const Z=[{value:"all",label:"All Status"},{value:"active",label:"Active"},{value:"suspended",label:"Suspended"},{value:"banned",label:"Banned"},{value:"disabled",label:"Disabled"}],de=[{value:"all",label:"All Roles"},{value:"user",label:"User"},{value:"admin",label:"Admin"}],h=E(()=>e(U).filter(s=>!(e(A)!=="all"&&s.status!==e(A)||e(w)!=="all"&&s.role!==e(w))));let n=d(Re(new Set)),u=d(null),B=d(!1),I=d("all"),he=d("all");mt(()=>{(e(A)!==e(I)||e(w)!==e(he))&&(t(n,new Set,!0),t(I,e(A),!0),t(he,e(w),!0))});function ye(s){const f=new Set(e(n));f.has(s)?f.delete(s):f.add(s),t(n,f,!0)}function m(){e(n).size===e(h).length?t(n,new Set,!0):t(n,new Set(e(h).map(s=>s.id)),!0)}function ue(){t(n,new Set,!0)}function xe(){return e(u)?`${e(u)==="delete"?"Delete":"Ban"} ${e(n).size} user${e(n).size!==1?"s":""}?`:"Confirm"}function Je(){return e(u)?e(u)==="delete"?"This will permanently delete the selected users and all associated data. This action cannot be undone.":"This will ban the selected users, preventing them from signing in.":"Are you sure?"}async function Ke(){const s=e(u);if(!s||e(n).size===0)return;t(u,null),t(B,!0);const f=[...e(n)],z=await Promise.allSettled(f.map(async y=>{s==="delete"?await be.fetch(`data/users/${y}`,{method:"DELETE"}):s==="ban"&&await be.fetch(`data/users/${y}`,{method:"PUT",body:{status:"banned"}})})),_=z.filter(y=>y.status==="fulfilled").length,v=z.filter(y=>y.status==="rejected").length;v===0?Ze(`${s==="delete"?"Deleted":"Banned"} ${_} user${_!==1?"s":""}`):Ce(`${_} succeeded, ${v} failed`),t(n,new Set,!0),t(B,!1),ce()}async function ce(s=0,f=!1){const z=++V;f?t(ie,!0):t(P,!0);try{let _=`data/users?limit=${ze}&cursor=${s}`;e(M).trim()&&(_+=`&email=${encodeURIComponent(e(M).trim())}`);const v=await be.fetch(_);if(z!==V)return;t(U,f?[...e(U),...v.users]:v.users,!0),t(C,v.cursor,!0),v.total!=null&&t(T,v.total,!0)}catch(_){if(z!==V)return;Ce(_ instanceof Error?_.message:"Failed to load users")}finally{z===V&&(t(P,!1),t(ie,!1))}}ht(()=>{ce()});function Qe(){t(n,new Set,!0),b&&clearTimeout(b),b=setTimeout(()=>{ce()},300)}function We(){e(C)&&ce(e(C),!0)}function De(s){zt(`${Oe}/auth/${s}`)}function Xe(s){return s.length<=12?s:s.slice(0,8)+"..."}function Ye(s){switch(s){case"active":return"success";case"suspended":return"warning";case"banned":return"danger";case"disabled":return"danger";default:return"default"}}function et(s){return s==="admin"?"primary":"default"}function Ee(s){return s?new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"-"}var Te=Lt(),Me=fe(Te);yt(Me,{title:"Users",description:"Manage user accounts",get docsHref(){return xt},actions:f=>{var z=Dt(),_=fe(z);Y(_,{variant:"primary",size:"sm",onclick:()=>t(O,!0),children:(ve,me)=>{N();var ee=X("+ Create User");i(ve,ee)},$$slots:{default:!0}});var v=l(_,2),y=r(v);Y(y,{variant:"secondary",size:"sm",children:(ve,me)=>{N();var ee=X("Auth Settings");i(ve,ee)},$$slots:{default:!0}}),a(v),le(()=>pe(v,"href",`${Oe??""}/auth/settings`)),i(f,z)},children:(f,z)=>{var _=qt(),v=fe(_),y=r(v),ve=r(y);ge(ve,{placeholder:"Search by email...",oninput:Qe,get value(){return e(M)},set value(c){t(M,c,!0)}}),a(y);var me=l(y,2),ee=r(me);Ae(ee,{get options(){return Z},get value(){return e(A)},set value(c){t(A,c,!0)}});var at=l(ee,2);Ae(at,{get options(){return de},get value(){return e(w)},set value(c){t(w,c,!0)}}),a(me),a(v);var Ie=l(v,2);{var st=c=>{var x=Et(),D=r(x),J=r(D);a(D);var F=l(D,2),te=r(F);Y(te,{variant:"secondary",size:"sm",onclick:()=>t(u,"ban"),get disabled(){return e(B)},children:(G,K)=>{N();var Q=X("Ban Selected");i(G,Q)},$$slots:{default:!0}});var j=l(te,2);Y(j,{variant:"danger",size:"sm",onclick:()=>t(u,"delete"),get disabled(){return e(B)},children:(G,K)=>{N();var Q=X("Delete Selected");i(G,Q)},$$slots:{default:!0}}),a(F);var R=l(F,2);a(x),le(()=>W(J,`${e(n).size??""} selected`)),_e("click",R,ue),i(c,x)};ne(Ie,c=>{e(n).size>0&&c(st)})}var rt=l(Ie,2);{var lt=c=>{var x=Mt(),D=r(x),J=l(r(D));qe(J,20,()=>Array(8),gt,(F,te)=>{var j=Tt(),R=r(j),G=r(R);re(G,{width:"16px",height:"16px"}),a(R);var K=l(R),Q=r(K);re(Q,{width:"70px",height:"14px"}),a(K);var S=l(K),o=r(S);re(o,{width:"160px",height:"14px"}),a(S);var g=l(S),ae=r(g);re(ae,{width:"60px",height:"20px"}),a(g);var q=l(g),H=r(q);re(H,{width:"50px",height:"14px"}),a(q);var p=l(q),L=r(p);re(L,{width:"80px",height:"14px"}),a(p),a(j),i(F,j)}),a(J),a(D),a(x),i(c,x)},nt=c=>{{let x=E(()=>e(M)||e(A)!=="all"||e(w)!=="all"?"Try adjusting your search or filters.":"No users have been created yet.");St(c,{title:"No users found",get description(){return e(x)}})}},ot=c=>{var x=Rt(),D=fe(x),J=r(D),F=r(J),te=r(F),j=r(te),R=r(j);Le(R),a(j),N(6),a(te),a(F);var G=l(F);qe(G,21,()=>e(h),S=>S.id,(S,o)=>{var g=Bt();let ae;pe(g,"tabindex",0);var q=r(g),H=r(q);Le(H),a(q);var p=l(q),L=r(p,!0);a(p);var se=l(p),we=r(se,!0);a(se);var Se=l(se),it=r(Se);{let k=E(()=>Ye(e(o).status||"active")),Ue=E(()=>e(o).status||"active");Ve(it,{get variant(){return e(k)},get text(){return e(Ue)}})}a(Se);var ke=l(Se),dt=r(ke);{let k=E(()=>et(e(o).role));Ve(dt,{get variant(){return e(k)},get text(){return e(o).role}})}a(ke);var Pe=l(ke),ut=r(Pe,!0);a(Pe);var Fe=l(Pe),ct=r(Fe,!0);a(Fe),a(g),le((k,Ue,vt,_t,ft)=>{ae=$t(g,1,"table__row table__row--clickable svelte-1s728sz",null,ae,k),Ne(H,Ue),pe(H,"aria-label",`Select user ${e(o).email??""}`),pe(p,"title",e(o).id),W(L,vt),W(we,e(o).email),W(ut,_t),W(ct,ft)},[()=>({"table__row--selected":e(n).has(e(o).id)}),()=>e(n).has(e(o).id),()=>Xe(e(o).id),()=>Ee(e(o).createdAt),()=>Ee(e(o).lastSignedInAt)]),_e("click",g,()=>De(e(o).id)),_e("keydown",g,k=>{(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),De(e(o).id))}),_e("change",H,k=>{k.stopPropagation(),ye(e(o).id)}),i(S,g)}),a(G),a(J),a(D);var K=l(D,2);{var Q=S=>{var o=Ft(),g=r(o);{var ae=p=>{var L=It(),se=r(L);a(L),le(()=>W(se,`Showing ${e(h).length??""} of ${e(T)??""} users`)),i(p,L)};ne(g,p=>{e(T)!=null&&p(ae)})}var q=l(g,2);{var H=p=>{Y(p,{variant:"secondary",onclick:We,get loading(){return e(ie)},children:(L,se)=>{N();var we=X("Load More");i(L,we)},$$slots:{default:!0}})};ne(q,p=>{e(C)&&p(H)})}a(o),i(S,o)};ne(K,S=>{(e(C)||e(T)!=null)&&S(Q)})}le(()=>Ne(R,e(h).length>0&&e(n).size===e(h).length)),_e("change",R,m),i(c,x)};ne(rt,c=>{e(P)?c(lt):e(h).length===0?c(nt,1):c(ot,!1)})}i(f,_)}});var Be=l(Me,2);{let s=E(()=>e(u)!==null),f=E(xe),z=E(Je),_=E(()=>e(u)==="delete"?"Delete":"Ban"),v=E(()=>e(u)==="delete"?"danger":"primary");wt(Be,{get open(){return e(s)},get title(){return e(f)},get message(){return e(z)},get confirmLabel(){return e(_)},get confirmVariant(){return e(v)},oncancel:()=>t(u,null),onconfirm:Ke})}var tt=l(Be,2);At(tt,{onCreated:()=>ce(),get open(){return e(O)},set open(s){t(O,s,!0)}}),i($e,Te),He()}bt(["click","change","keydown"]);export{ia as component};
|
|
1
|
+
import"../chunks/CWj6FrbW.js";import{o as ht}from"../chunks/Bn2NtlTj.js";import{p as Ge,a as He,c as r,b as t,g as e,s as l,ae as N,r as a,t as le,f as fe,d,M as Re,w as mt,u as E}from"../chunks/BdTBlfLy.js";import{e as pt,s as W,d as bt,a as _e}from"../chunks/DtZk82gG.js";import{i as ne}from"../chunks/Y22E1hJM.js";import{a as be,b as Ze,t as Ce,e as qe,i as gt}from"../chunks/Dc1-6Po6.js";import{a as i,t as X,f as $}from"../chunks/DEELgv7K.js";import{r as Le,e as Ne,a as pe,s as $t}from"../chunks/CoI6jjbg.js";import{g as zt}from"../chunks/byv2rTy8.js";import{b as Oe}from"../chunks/DiyBpamp.js";import{P as yt}from"../chunks/B8s_s9QY.js";import{c as xt}from"../chunks/Q2nPFxS6.js";import{B as Y}from"../chunks/C72lTcG0.js";import{I as ge}from"../chunks/_teD5ji5.js";import{B as Ve}from"../chunks/B0HRJ657.js";import{C as wt}from"../chunks/DILS_-VJ.js";import{E as St}from"../chunks/m9eWh0Cd.js";import{p as je}from"../chunks/F9_4wRrd.js";import{M as kt}from"../chunks/Dt4vL4Df.js";import{S as Ae}from"../chunks/Du5vWVa2.js";import{S as re}from"../chunks/nZvorU8i.js";var Pt=$("<!> <!>",1),Ut=$('<p class="form__error svelte-17zxii7"> </p>'),Ct=$('<form class="form svelte-17zxii7"><!> <!> <!> <!> <!> <button class="form__submit svelte-17zxii7" type="submit" aria-hidden="true" tabindex="-1">Create User</button></form>');function At($e,oe){Ge(oe,!0);let O=je(oe,"open",15,!1),ze=je(oe,"onCreated",3,()=>{}),P=d(""),U=d(""),C=d(""),T=d("user"),M=d(!1),b=d("");const ie=[{value:"user",label:"User"},{value:"admin",label:"Admin"}];function V(){t(P,""),t(U,""),t(C,""),t(T,"user"),t(b,"")}async function A(){if(t(b,""),!e(P).trim()){t(b,"Email is required.");return}if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e(P).trim())){t(b,"Invalid email format.");return}if(!e(U)){t(b,"Password is required.");return}if(e(U).length<8){t(b,"Password must be at least 8 characters.");return}t(M,!0);try{await be.fetch("data/users",{method:"POST",body:{email:e(P).trim(),password:e(U),displayName:e(C).trim()||void 0,role:e(T)}}),Ze("User created successfully"),O(!1),V(),ze()()}catch(w){t(b,w instanceof Error?w.message:"Failed to create user",!0),Ce(e(b))}finally{t(M,!1)}}kt($e,{title:"Create User",onclose:V,get open(){return O()},set open(Z){O(Z)},footer:Z=>{var de=Pt(),h=fe(de);Y(h,{variant:"secondary",onclick:()=>{O(!1),V()},children:(u,B)=>{N();var I=X("Cancel");i(u,I)},$$slots:{default:!0}});var n=l(h,2);Y(n,{variant:"primary",onclick:A,get loading(){return e(M)},children:(u,B)=>{N();var I=X("Create User");i(u,I)},$$slots:{default:!0}}),i(Z,de)},children:(Z,de)=>{var h=Ct(),n=r(h);ge(n,{label:"Email",type:"email",placeholder:"user@example.com",required:!0,get value(){return e(P)},set value(m){t(P,m,!0)}});var u=l(n,2);ge(u,{label:"Password",type:"password",placeholder:"Minimum 8 characters",required:!0,get value(){return e(U)},set value(m){t(U,m,!0)}});var B=l(u,2);ge(B,{label:"Display Name",placeholder:"(optional)",get value(){return e(C)},set value(m){t(C,m,!0)}});var I=l(B,2);Ae(I,{label:"Role",get options(){return ie},get value(){return e(T)},set value(m){t(T,m,!0)}});var he=l(I,2);{var ye=m=>{var ue=Ut(),xe=r(ue,!0);a(ue),le(()=>W(xe,e(b))),i(m,ue)};ne(he,m=>{e(b)&&m(ye)})}N(2),a(h),pt("submit",h,m=>{m.preventDefault(),A()}),i(Z,h)},$$slots:{footer:!0,default:!0}}),He()}var Dt=$("<!> <a><!></a>",1),Et=$('<div class="bulk-bar svelte-1s728sz"><span class="bulk-bar__count svelte-1s728sz"> </span> <div class="bulk-bar__actions svelte-1s728sz"><!> <!></div> <button class="bulk-bar__clear svelte-1s728sz">Clear</button></div>'),Tt=$('<tr class="table__row svelte-1s728sz"><td class="table__td svelte-1s728sz" style="width:40px"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td></tr>'),Mt=$('<div class="table-wrapper svelte-1s728sz"><table class="table svelte-1s728sz"><thead><tr><th class="table__th table__th--checkbox svelte-1s728sz" style="width:40px"></th><th class="table__th svelte-1s728sz">ID</th><th class="table__th svelte-1s728sz">Email</th><th class="table__th svelte-1s728sz">Status</th><th class="table__th svelte-1s728sz">Role</th><th class="table__th svelte-1s728sz">Created</th></tr></thead><tbody></tbody></table></div>'),Bt=$('<tr role="button"><td class="table__td table__td--checkbox svelte-1s728sz"><input type="checkbox" class="svelte-1s728sz"/></td><td class="table__td table__td--mono svelte-1s728sz"> </td><td class="table__td svelte-1s728sz"> </td><td class="table__td svelte-1s728sz"><!></td><td class="table__td svelte-1s728sz"><!></td><td class="table__td table__td--secondary svelte-1s728sz"> </td><td class="table__td table__td--secondary svelte-1s728sz"> </td></tr>'),It=$('<span class="pagination__info svelte-1s728sz"> </span>'),Ft=$('<div class="pagination svelte-1s728sz"><!> <!></div>'),Rt=$('<div class="table-wrapper svelte-1s728sz"><table class="table svelte-1s728sz"><thead><tr><th class="table__th table__th--checkbox svelte-1s728sz"><input type="checkbox" aria-label="Select all users" class="svelte-1s728sz"/></th><th class="table__th svelte-1s728sz">ID</th><th class="table__th svelte-1s728sz">Email</th><th class="table__th svelte-1s728sz">Status</th><th class="table__th svelte-1s728sz">Role</th><th class="table__th svelte-1s728sz">Created</th><th class="table__th svelte-1s728sz">Last Sign-in</th></tr></thead><tbody></tbody></table></div> <!>',1),qt=$('<div class="toolbar svelte-1s728sz"><div class="toolbar__search svelte-1s728sz"><!></div> <div class="toolbar__filters svelte-1s728sz"><!> <!></div></div> <!> <!>',1),Lt=$("<!> <!> <!>",1);function ia($e,oe){Ge(oe,!0);let O=d(!1);const ze=20;let P=d(!0),U=d(Re([])),C=d(null),T=d(null),M=d(""),b=null,ie=d(!1),V=0,A=d("all"),w=d("all");const Z=[{value:"all",label:"All Status"},{value:"active",label:"Active"},{value:"suspended",label:"Suspended"},{value:"banned",label:"Banned"},{value:"disabled",label:"Disabled"}],de=[{value:"all",label:"All Roles"},{value:"user",label:"User"},{value:"admin",label:"Admin"}],h=E(()=>e(U).filter(s=>!(e(A)!=="all"&&s.status!==e(A)||e(w)!=="all"&&s.role!==e(w))));let n=d(Re(new Set)),u=d(null),B=d(!1),I=d("all"),he=d("all");mt(()=>{(e(A)!==e(I)||e(w)!==e(he))&&(t(n,new Set,!0),t(I,e(A),!0),t(he,e(w),!0))});function ye(s){const f=new Set(e(n));f.has(s)?f.delete(s):f.add(s),t(n,f,!0)}function m(){e(n).size===e(h).length?t(n,new Set,!0):t(n,new Set(e(h).map(s=>s.id)),!0)}function ue(){t(n,new Set,!0)}function xe(){return e(u)?`${e(u)==="delete"?"Delete":"Ban"} ${e(n).size} user${e(n).size!==1?"s":""}?`:"Confirm"}function Je(){return e(u)?e(u)==="delete"?"This will permanently delete the selected users and all associated data. This action cannot be undone.":"This will ban the selected users, preventing them from signing in.":"Are you sure?"}async function Ke(){const s=e(u);if(!s||e(n).size===0)return;t(u,null),t(B,!0);const f=[...e(n)],z=await Promise.allSettled(f.map(async y=>{s==="delete"?await be.fetch(`data/users/${y}`,{method:"DELETE"}):s==="ban"&&await be.fetch(`data/users/${y}`,{method:"PUT",body:{status:"banned"}})})),_=z.filter(y=>y.status==="fulfilled").length,v=z.filter(y=>y.status==="rejected").length;v===0?Ze(`${s==="delete"?"Deleted":"Banned"} ${_} user${_!==1?"s":""}`):Ce(`${_} succeeded, ${v} failed`),t(n,new Set,!0),t(B,!1),ce()}async function ce(s=0,f=!1){const z=++V;f?t(ie,!0):t(P,!0);try{let _=`data/users?limit=${ze}&cursor=${s}`;e(M).trim()&&(_+=`&email=${encodeURIComponent(e(M).trim())}`);const v=await be.fetch(_);if(z!==V)return;t(U,f?[...e(U),...v.users]:v.users,!0),t(C,v.cursor,!0),v.total!=null&&t(T,v.total,!0)}catch(_){if(z!==V)return;Ce(_ instanceof Error?_.message:"Failed to load users")}finally{z===V&&(t(P,!1),t(ie,!1))}}ht(()=>{ce()});function Qe(){t(n,new Set,!0),b&&clearTimeout(b),b=setTimeout(()=>{ce()},300)}function We(){e(C)&&ce(e(C),!0)}function De(s){zt(`${Oe}/auth/${s}`)}function Xe(s){return s.length<=12?s:s.slice(0,8)+"..."}function Ye(s){switch(s){case"active":return"success";case"suspended":return"warning";case"banned":return"danger";case"disabled":return"danger";default:return"default"}}function et(s){return s==="admin"?"primary":"default"}function Ee(s){return s?new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"-"}var Te=Lt(),Me=fe(Te);yt(Me,{title:"Users",description:"Manage user accounts",get docsHref(){return xt},actions:f=>{var z=Dt(),_=fe(z);Y(_,{variant:"primary",size:"sm",onclick:()=>t(O,!0),children:(ve,me)=>{N();var ee=X("+ Create User");i(ve,ee)},$$slots:{default:!0}});var v=l(_,2),y=r(v);Y(y,{variant:"secondary",size:"sm",children:(ve,me)=>{N();var ee=X("Auth Settings");i(ve,ee)},$$slots:{default:!0}}),a(v),le(()=>pe(v,"href",`${Oe??""}/auth/settings`)),i(f,z)},children:(f,z)=>{var _=qt(),v=fe(_),y=r(v),ve=r(y);ge(ve,{placeholder:"Search by email...",oninput:Qe,get value(){return e(M)},set value(c){t(M,c,!0)}}),a(y);var me=l(y,2),ee=r(me);Ae(ee,{get options(){return Z},get value(){return e(A)},set value(c){t(A,c,!0)}});var at=l(ee,2);Ae(at,{get options(){return de},get value(){return e(w)},set value(c){t(w,c,!0)}}),a(me),a(v);var Ie=l(v,2);{var st=c=>{var x=Et(),D=r(x),J=r(D);a(D);var F=l(D,2),te=r(F);Y(te,{variant:"secondary",size:"sm",onclick:()=>t(u,"ban"),get disabled(){return e(B)},children:(G,K)=>{N();var Q=X("Ban Selected");i(G,Q)},$$slots:{default:!0}});var j=l(te,2);Y(j,{variant:"danger",size:"sm",onclick:()=>t(u,"delete"),get disabled(){return e(B)},children:(G,K)=>{N();var Q=X("Delete Selected");i(G,Q)},$$slots:{default:!0}}),a(F);var R=l(F,2);a(x),le(()=>W(J,`${e(n).size??""} selected`)),_e("click",R,ue),i(c,x)};ne(Ie,c=>{e(n).size>0&&c(st)})}var rt=l(Ie,2);{var lt=c=>{var x=Mt(),D=r(x),J=l(r(D));qe(J,20,()=>Array(8),gt,(F,te)=>{var j=Tt(),R=r(j),G=r(R);re(G,{width:"16px",height:"16px"}),a(R);var K=l(R),Q=r(K);re(Q,{width:"70px",height:"14px"}),a(K);var S=l(K),o=r(S);re(o,{width:"160px",height:"14px"}),a(S);var g=l(S),ae=r(g);re(ae,{width:"60px",height:"20px"}),a(g);var q=l(g),H=r(q);re(H,{width:"50px",height:"14px"}),a(q);var p=l(q),L=r(p);re(L,{width:"80px",height:"14px"}),a(p),a(j),i(F,j)}),a(J),a(D),a(x),i(c,x)},nt=c=>{{let x=E(()=>e(M)||e(A)!=="all"||e(w)!=="all"?"Try adjusting your search or filters.":"No users have been created yet.");St(c,{title:"No users found",get description(){return e(x)}})}},ot=c=>{var x=Rt(),D=fe(x),J=r(D),F=r(J),te=r(F),j=r(te),R=r(j);Le(R),a(j),N(6),a(te),a(F);var G=l(F);qe(G,21,()=>e(h),S=>S.id,(S,o)=>{var g=Bt();let ae;pe(g,"tabindex",0);var q=r(g),H=r(q);Le(H),a(q);var p=l(q),L=r(p,!0);a(p);var se=l(p),we=r(se,!0);a(se);var Se=l(se),it=r(Se);{let k=E(()=>Ye(e(o).status||"active")),Ue=E(()=>e(o).status||"active");Ve(it,{get variant(){return e(k)},get text(){return e(Ue)}})}a(Se);var ke=l(Se),dt=r(ke);{let k=E(()=>et(e(o).role));Ve(dt,{get variant(){return e(k)},get text(){return e(o).role}})}a(ke);var Pe=l(ke),ut=r(Pe,!0);a(Pe);var Fe=l(Pe),ct=r(Fe,!0);a(Fe),a(g),le((k,Ue,vt,_t,ft)=>{ae=$t(g,1,"table__row table__row--clickable svelte-1s728sz",null,ae,k),Ne(H,Ue),pe(H,"aria-label",`Select user ${e(o).email??""}`),pe(p,"title",e(o).id),W(L,vt),W(we,e(o).email),W(ut,_t),W(ct,ft)},[()=>({"table__row--selected":e(n).has(e(o).id)}),()=>e(n).has(e(o).id),()=>Xe(e(o).id),()=>Ee(e(o).createdAt),()=>Ee(e(o).lastSignedInAt)]),_e("click",g,()=>De(e(o).id)),_e("keydown",g,k=>{(k.key==="Enter"||k.key===" ")&&(k.preventDefault(),De(e(o).id))}),_e("change",H,k=>{k.stopPropagation(),ye(e(o).id)}),i(S,g)}),a(G),a(J),a(D);var K=l(D,2);{var Q=S=>{var o=Ft(),g=r(o);{var ae=p=>{var L=It(),se=r(L);a(L),le(()=>W(se,`Showing ${e(h).length??""} of ${e(T)??""} users`)),i(p,L)};ne(g,p=>{e(T)!=null&&p(ae)})}var q=l(g,2);{var H=p=>{Y(p,{variant:"secondary",onclick:We,get loading(){return e(ie)},children:(L,se)=>{N();var we=X("Load More");i(L,we)},$$slots:{default:!0}})};ne(q,p=>{e(C)&&p(H)})}a(o),i(S,o)};ne(K,S=>{(e(C)||e(T)!=null)&&S(Q)})}le(()=>Ne(R,e(h).length>0&&e(n).size===e(h).length)),_e("change",R,m),i(c,x)};ne(rt,c=>{e(P)?c(lt):e(h).length===0?c(nt,1):c(ot,!1)})}i(f,_)}});var Be=l(Me,2);{let s=E(()=>e(u)!==null),f=E(xe),z=E(Je),_=E(()=>e(u)==="delete"?"Delete":"Ban"),v=E(()=>e(u)==="delete"?"danger":"primary");wt(Be,{get open(){return e(s)},get title(){return e(f)},get message(){return e(z)},get confirmLabel(){return e(_)},get confirmVariant(){return e(v)},oncancel:()=>t(u,null),onconfirm:Ke})}var tt=l(Be,2);At(tt,{onCreated:()=>ce(),get open(){return e(O)},set open(s){t(O,s,!0)}}),i($e,Te),He()}bt(["click","change","keydown"]);export{ia as component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../chunks/CWj6FrbW.js";import{o as ya}from"../chunks/Bn2NtlTj.js";import{p as $a,d as v,M as wa,f as Fe,a as Sa,b as l,g as e,s as r,u as g,c as t,ae as x,r as a,t as C,af as Da}from"../chunks/BdTBlfLy.js";import{s as A}from"../chunks/DtZk82gG.js";import{i as Me}from"../chunks/Y22E1hJM.js";import{a as h,b as E,t as P,e as ka}from"../chunks/CqUxCvs_.js";import{a as o,f as p,c as Aa,t as b}from"../chunks/DEELgv7K.js";import{a as Te}from"../chunks/CoI6jjbg.js";import{s as Ea,a as Pa}from"../chunks/Cp8V0Xy2.js";import{p as Ua}from"../chunks/CSGrwS7E.js";import{g as Ra}from"../chunks/m9QZTyVV.js";import{b as ie}from"../chunks/D755Tqat.js";import{P as Fa}from"../chunks/B8s_s9QY.js";import{c as Ma}from"../chunks/Q2nPFxS6.js";import{B as y}from"../chunks/C72lTcG0.js";import{B as Le}from"../chunks/B0HRJ657.js";import{S as Oe}from"../chunks/BCKr7yKd.js";import{C as ne}from"../chunks/DILS_-VJ.js";var Ta=p("<a><!></a>"),La=p('<div class="loading-state svelte-1579lxm"><span class="spinner svelte-1579lxm"></span> Loading user...</div>'),Oa=p('<div class="error-state svelte-1579lxm"><p>User not found.</p> <a><!></a></div>'),Ba=p('<p class="no-data svelte-1579lxm">No profile data available.</p>'),Ia=p('<div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm"> </span> <span class="info-value svelte-1579lxm"> </span></div>'),za=p('<div class="info-grid svelte-1579lxm"></div>'),Ca=p(`<div class="user-layout svelte-1579lxm"><div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Account Info</h3></div> <div class="card__body svelte-1579lxm"><div class="info-grid svelte-1579lxm"><div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">ID</span> <span class="info-value info-value--mono svelte-1579lxm"> </span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Email</span> <span class="info-value svelte-1579lxm"> </span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Status</span> <span class="info-value svelte-1579lxm"><!></span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Role</span> <span class="info-value svelte-1579lxm"><!></span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Created</span> <span class="info-value svelte-1579lxm"> </span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Last Sign-in</span> <span class="info-value svelte-1579lxm"> </span></div></div></div></div> <div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Manage User</h3></div> <div class="card__body svelte-1579lxm"><div class="form-fields svelte-1579lxm"><!> <!></div> <div class="card__actions svelte-1579lxm"><!></div></div></div> <div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Profile</h3></div> <div class="card__body svelte-1579lxm"><!></div></div> <div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Actions</h3></div> <div class="card__body svelte-1579lxm"><div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Send Password Reset Email</p> <p class="danger-desc svelte-1579lxm">Send a password reset link to the user's email address.</p></div> <!></div></div></div> <div class="card card--danger svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title card__title--danger svelte-1579lxm">Danger Zone</h3></div> <div class="card__body svelte-1579lxm"><div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Revoke All Sessions</p> <p class="danger-desc svelte-1579lxm">Force sign-out from all devices. The user will need to sign in again.</p></div> <!></div> <hr class="danger-divider svelte-1579lxm"/> <div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Disable MFA</p> <p class="danger-desc svelte-1579lxm">Remove all multi-factor authentication methods. The user can re-enroll later.</p></div> <!></div> <hr class="danger-divider svelte-1579lxm"/> <div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Delete User</p> <p class="danger-desc svelte-1579lxm">Permanently delete this user and all associated data. This cannot be undone.</p></div> <!></div></div></div></div>`),Va=p("<!> <!> <!> <!>",1);function is(Be,Ie){$a(Ie,!0);const ze=()=>Pa(Ua,"$page",Ce),[Ce,Ve]=Ea();let f=g(()=>ze().params.userId??""),U=v(!1),n=v(null),R=v(wa({})),$=v(""),w=v(""),V=v(!1),F=v(!1),j=v(!1),M=v(!1),N=v(!1),T=v(!1),H=v(!1),J=v(!1);const je=[{value:"active",label:"Active"},{value:"suspended",label:"Suspended"},{value:"banned",label:"Banned"},{value:"disabled",label:"Disabled"}],Ne=[{value:"user",label:"User"},{value:"admin",label:"Admin"}];let He=g(()=>e(n)!==null&&(e($)!==e(n).status||e(w)!==e(n).role));async function Je(){l(n,null),l(U,!1),l(R,{},!0);try{const s=await h.fetch(`data/users/${e(f)}`);l(n,s.user,!0),l($,s.user.status??"active",!0),l(w,s.user.role??"user",!0);try{const S=await h.fetch(`data/users/${e(f)}/profile`),{id:D,...k}=S;l(R,k,!0)}catch{l(R,{},!0)}}catch{l(U,!0)}}ya(()=>{Je()});async function Ze(){l(V,!0);try{await h.fetch(`data/users/${e(f)}`,{method:"PUT",body:{status:e($),role:e(w)}}),e(n)&&l(n,{...e(n),status:e($),role:e(w)},!0),E("User updated successfully")}catch(s){P(s instanceof Error?s.message:"Failed to update user")}finally{l(V,!1)}}async function qe(){l(F,!1),l(j,!0);try{await h.fetch(`data/users/${e(f)}/sessions`,{method:"DELETE"}),E("All sessions revoked")}catch(s){P(s instanceof Error?s.message:"Failed to revoke sessions")}finally{l(j,!1)}}function Ge(s){switch(s){case"active":return"success";case"suspended":return"warning";case"banned":return"danger";case"disabled":return"danger";default:return"default"}}function oe(s){return s?new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"-"}async function Ke(){l(M,!1),l(N,!0);try{await h.fetch(`data/users/${e(f)}`,{method:"DELETE"}),E("User deleted"),Ra(`${ie}/auth`)}catch(s){P(s instanceof Error?s.message:"Failed to delete user")}finally{l(N,!1)}}async function Qe(){l(J,!0);try{await h.fetch(`data/users/${e(f)}/send-password-reset`,{method:"POST"}),E("Password reset email sent")}catch(s){P(s instanceof Error?s.message:"Failed to send password reset email")}finally{l(J,!1)}}async function We(){l(T,!1),l(H,!0);try{await h.fetch(`data/users/${e(f)}/mfa`,{method:"DELETE"}),E("MFA disabled")}catch(s){P(s instanceof Error?s.message:"Failed to disable MFA")}finally{l(H,!1)}}function Xe(s){return s==null?"-":typeof s=="object"?JSON.stringify(s):String(s)}let de=g(()=>Object.entries(e(R)));var ve=Va(),ce=Fe(ve);Fa(ce,{title:"User Detail",get description(){return`User ID: ${e(f)??""}`},get docsHref(){return Ma},actions:S=>{var D=Ta(),k=t(D);y(k,{variant:"ghost",size:"sm",children:(Z,fe)=>{x();var q=b("Back to Users");o(Z,q)},$$slots:{default:!0}}),a(D),C(()=>Te(D,"href",`${ie??""}/auth`)),o(S,D)},children:(S,D)=>{var k=Aa(),Z=Fe(k);{var fe=u=>{var m=La();o(u,m)},q=u=>{var m=Oa(),_=r(t(m),2),L=t(_);y(L,{variant:"secondary",children:(O,B)=>{x();var I=b("Back to Users");o(O,I)},$$slots:{default:!0}}),a(_),a(m),C(()=>Te(_,"href",`${ie??""}/auth`)),o(u,m)},ea=u=>{var m=Ca(),_=t(m),L=r(t(_),2),O=t(L),B=t(O),I=r(t(B),2),aa=t(I,!0);a(I),a(B);var G=r(B,2),pe=r(t(G),2),sa=t(pe,!0);a(pe),a(G);var K=r(G,2),_e=r(t(K),2),ta=t(_e);{let i=g(()=>Ge(e(n).status));Le(ta,{get variant(){return e(i)},get text(){return e(n).status}})}a(_e),a(K);var Q=r(K,2),ge=r(t(Q),2),ra=t(ge);{let i=g(()=>e(n).role==="admin"?"primary":"default");Le(ra,{get variant(){return e(i)},get text(){return e(n).role}})}a(ge),a(Q);var W=r(Q,2),xe=r(t(W),2),la=t(xe,!0);a(xe),a(W);var he=r(W,2),be=r(t(he),2),ia=t(be,!0);a(be),a(he),a(O),a(L),a(_);var X=r(_,2),ye=r(t(X),2),Y=t(ye),$e=t(Y);Oe($e,{label:"Status",get options(){return je},get value(){return e($)},set value(i){l($,i,!0)}});var na=r($e,2);Oe(na,{label:"Role",get options(){return Ne},get value(){return e(w)},set value(i){l(w,i,!0)}}),a(Y);var we=r(Y,2),oa=t(we);{let i=g(()=>!e(He));y(oa,{variant:"primary",onclick:Ze,get disabled(){return e(i)},get loading(){return e(V)},children:(d,c)=>{x();var z=b("Save Changes");o(d,z)},$$slots:{default:!0}})}a(we),a(ye),a(X);var ee=r(X,2),Se=r(t(ee),2),da=t(Se);{var va=i=>{var d=Ba();o(i,d)},ca=i=>{var d=za();ka(d,21,()=>e(de),([c,z])=>c,(c,z)=>{var Ue=g(()=>Da(e(z),2));let _a=()=>e(Ue)[0],ga=()=>e(Ue)[1];var re=Ia(),le=t(re),xa=t(le,!0);a(le);var Re=r(le,2),ha=t(Re,!0);a(Re),a(re),C(ba=>{A(xa,_a()),A(ha,ba)},[()=>Xe(ga())]),o(c,re)}),a(d),o(i,d)};Me(da,i=>{e(de).length===0?i(va):i(ca,!1)})}a(Se),a(ee);var ae=r(ee,2),De=r(t(ae),2),ke=t(De),ua=r(t(ke),2);y(ua,{variant:"secondary",size:"sm",onclick:Qe,get loading(){return e(J)},children:(i,d)=>{x();var c=b("Send Reset Email");o(i,c)},$$slots:{default:!0}}),a(ke),a(De),a(ae);var Ae=r(ae,2),Ee=r(t(Ae),2),se=t(Ee),ma=r(t(se),2);y(ma,{variant:"danger",size:"sm",onclick:()=>l(F,!0),get loading(){return e(j)},children:(i,d)=>{x();var c=b("Revoke Sessions");o(i,c)},$$slots:{default:!0}}),a(se);var te=r(se,4),fa=r(t(te),2);y(fa,{variant:"danger",size:"sm",onclick:()=>l(T,!0),get loading(){return e(H)},children:(i,d)=>{x();var c=b("Disable MFA");o(i,c)},$$slots:{default:!0}}),a(te);var Pe=r(te,4),pa=r(t(Pe),2);y(pa,{variant:"danger",size:"sm",onclick:()=>l(M,!0),get loading(){return e(N)},children:(i,d)=>{x();var c=b("Delete User");o(i,c)},$$slots:{default:!0}}),a(Pe),a(Ee),a(Ae),a(m),C((i,d)=>{A(aa,e(n).id),A(sa,e(n).email),A(la,i),A(ia,d)},[()=>oe(e(n).createdAt),()=>oe(e(n).lastSignedInAt)]),o(u,m)};Me(Z,u=>{!e(n)&&!e(U)?u(fe):e(U)?u(q,1):e(n)&&u(ea,2)})}o(S,k)}});var ue=r(ce,2);ne(ue,{title:"Revoke All Sessions",message:"Are you sure you want to revoke all sessions for this user? They will be signed out from all devices immediately.",confirmLabel:"Revoke",confirmVariant:"danger",onconfirm:qe,get open(){return e(F)},set open(s){l(F,s,!0)}});var me=r(ue,2);ne(me,{title:"Disable MFA",message:"Are you sure you want to disable all multi-factor authentication methods for this user?",confirmLabel:"Disable MFA",confirmVariant:"danger",onconfirm:We,get open(){return e(T)},set open(s){l(T,s,!0)}});var Ye=r(me,2);ne(Ye,{title:"Delete User",message:"Are you sure you want to permanently delete this user? All associated data (auth indexes, sessions, push tokens) will be removed. This action cannot be undone.",confirmLabel:"Delete User",confirmVariant:"danger",onconfirm:Ke,get open(){return e(M)},set open(s){l(M,s,!0)}}),o(Be,ve),Sa(),Ve()}export{is as component};
|
|
1
|
+
import"../chunks/CWj6FrbW.js";import{o as ya}from"../chunks/Bn2NtlTj.js";import{p as $a,d as v,M as wa,f as Fe,a as Sa,b as l,g as e,s as r,u as g,c as t,ae as x,r as a,t as C,af as Da}from"../chunks/BdTBlfLy.js";import{s as A}from"../chunks/DtZk82gG.js";import{i as Me}from"../chunks/Y22E1hJM.js";import{a as h,b as E,t as P,e as ka}from"../chunks/Dc1-6Po6.js";import{a as o,f as p,c as Aa,t as b}from"../chunks/DEELgv7K.js";import{a as Te}from"../chunks/CoI6jjbg.js";import{s as Ea,a as Pa}from"../chunks/Cp8V0Xy2.js";import{p as Ua}from"../chunks/DCvwWZrm.js";import{g as Ra}from"../chunks/byv2rTy8.js";import{b as ie}from"../chunks/DiyBpamp.js";import{P as Fa}from"../chunks/B8s_s9QY.js";import{c as Ma}from"../chunks/Q2nPFxS6.js";import{B as y}from"../chunks/C72lTcG0.js";import{B as Le}from"../chunks/B0HRJ657.js";import{S as Oe}from"../chunks/Du5vWVa2.js";import{C as ne}from"../chunks/DILS_-VJ.js";var Ta=p("<a><!></a>"),La=p('<div class="loading-state svelte-1579lxm"><span class="spinner svelte-1579lxm"></span> Loading user...</div>'),Oa=p('<div class="error-state svelte-1579lxm"><p>User not found.</p> <a><!></a></div>'),Ba=p('<p class="no-data svelte-1579lxm">No profile data available.</p>'),Ia=p('<div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm"> </span> <span class="info-value svelte-1579lxm"> </span></div>'),za=p('<div class="info-grid svelte-1579lxm"></div>'),Ca=p(`<div class="user-layout svelte-1579lxm"><div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Account Info</h3></div> <div class="card__body svelte-1579lxm"><div class="info-grid svelte-1579lxm"><div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">ID</span> <span class="info-value info-value--mono svelte-1579lxm"> </span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Email</span> <span class="info-value svelte-1579lxm"> </span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Status</span> <span class="info-value svelte-1579lxm"><!></span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Role</span> <span class="info-value svelte-1579lxm"><!></span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Created</span> <span class="info-value svelte-1579lxm"> </span></div> <div class="info-row svelte-1579lxm"><span class="info-label svelte-1579lxm">Last Sign-in</span> <span class="info-value svelte-1579lxm"> </span></div></div></div></div> <div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Manage User</h3></div> <div class="card__body svelte-1579lxm"><div class="form-fields svelte-1579lxm"><!> <!></div> <div class="card__actions svelte-1579lxm"><!></div></div></div> <div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Profile</h3></div> <div class="card__body svelte-1579lxm"><!></div></div> <div class="card svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title svelte-1579lxm">Actions</h3></div> <div class="card__body svelte-1579lxm"><div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Send Password Reset Email</p> <p class="danger-desc svelte-1579lxm">Send a password reset link to the user's email address.</p></div> <!></div></div></div> <div class="card card--danger svelte-1579lxm"><div class="card__header svelte-1579lxm"><h3 class="card__title card__title--danger svelte-1579lxm">Danger Zone</h3></div> <div class="card__body svelte-1579lxm"><div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Revoke All Sessions</p> <p class="danger-desc svelte-1579lxm">Force sign-out from all devices. The user will need to sign in again.</p></div> <!></div> <hr class="danger-divider svelte-1579lxm"/> <div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Disable MFA</p> <p class="danger-desc svelte-1579lxm">Remove all multi-factor authentication methods. The user can re-enroll later.</p></div> <!></div> <hr class="danger-divider svelte-1579lxm"/> <div class="danger-row svelte-1579lxm"><div class="danger-info svelte-1579lxm"><p class="danger-title svelte-1579lxm">Delete User</p> <p class="danger-desc svelte-1579lxm">Permanently delete this user and all associated data. This cannot be undone.</p></div> <!></div></div></div></div>`),Va=p("<!> <!> <!> <!>",1);function is(Be,Ie){$a(Ie,!0);const ze=()=>Pa(Ua,"$page",Ce),[Ce,Ve]=Ea();let f=g(()=>ze().params.userId??""),U=v(!1),n=v(null),R=v(wa({})),$=v(""),w=v(""),V=v(!1),F=v(!1),j=v(!1),M=v(!1),N=v(!1),T=v(!1),H=v(!1),J=v(!1);const je=[{value:"active",label:"Active"},{value:"suspended",label:"Suspended"},{value:"banned",label:"Banned"},{value:"disabled",label:"Disabled"}],Ne=[{value:"user",label:"User"},{value:"admin",label:"Admin"}];let He=g(()=>e(n)!==null&&(e($)!==e(n).status||e(w)!==e(n).role));async function Je(){l(n,null),l(U,!1),l(R,{},!0);try{const s=await h.fetch(`data/users/${e(f)}`);l(n,s.user,!0),l($,s.user.status??"active",!0),l(w,s.user.role??"user",!0);try{const S=await h.fetch(`data/users/${e(f)}/profile`),{id:D,...k}=S;l(R,k,!0)}catch{l(R,{},!0)}}catch{l(U,!0)}}ya(()=>{Je()});async function Ze(){l(V,!0);try{await h.fetch(`data/users/${e(f)}`,{method:"PUT",body:{status:e($),role:e(w)}}),e(n)&&l(n,{...e(n),status:e($),role:e(w)},!0),E("User updated successfully")}catch(s){P(s instanceof Error?s.message:"Failed to update user")}finally{l(V,!1)}}async function qe(){l(F,!1),l(j,!0);try{await h.fetch(`data/users/${e(f)}/sessions`,{method:"DELETE"}),E("All sessions revoked")}catch(s){P(s instanceof Error?s.message:"Failed to revoke sessions")}finally{l(j,!1)}}function Ge(s){switch(s){case"active":return"success";case"suspended":return"warning";case"banned":return"danger";case"disabled":return"danger";default:return"default"}}function oe(s){return s?new Date(s).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}):"-"}async function Ke(){l(M,!1),l(N,!0);try{await h.fetch(`data/users/${e(f)}`,{method:"DELETE"}),E("User deleted"),Ra(`${ie}/auth`)}catch(s){P(s instanceof Error?s.message:"Failed to delete user")}finally{l(N,!1)}}async function Qe(){l(J,!0);try{await h.fetch(`data/users/${e(f)}/send-password-reset`,{method:"POST"}),E("Password reset email sent")}catch(s){P(s instanceof Error?s.message:"Failed to send password reset email")}finally{l(J,!1)}}async function We(){l(T,!1),l(H,!0);try{await h.fetch(`data/users/${e(f)}/mfa`,{method:"DELETE"}),E("MFA disabled")}catch(s){P(s instanceof Error?s.message:"Failed to disable MFA")}finally{l(H,!1)}}function Xe(s){return s==null?"-":typeof s=="object"?JSON.stringify(s):String(s)}let de=g(()=>Object.entries(e(R)));var ve=Va(),ce=Fe(ve);Fa(ce,{title:"User Detail",get description(){return`User ID: ${e(f)??""}`},get docsHref(){return Ma},actions:S=>{var D=Ta(),k=t(D);y(k,{variant:"ghost",size:"sm",children:(Z,fe)=>{x();var q=b("Back to Users");o(Z,q)},$$slots:{default:!0}}),a(D),C(()=>Te(D,"href",`${ie??""}/auth`)),o(S,D)},children:(S,D)=>{var k=Aa(),Z=Fe(k);{var fe=u=>{var m=La();o(u,m)},q=u=>{var m=Oa(),_=r(t(m),2),L=t(_);y(L,{variant:"secondary",children:(O,B)=>{x();var I=b("Back to Users");o(O,I)},$$slots:{default:!0}}),a(_),a(m),C(()=>Te(_,"href",`${ie??""}/auth`)),o(u,m)},ea=u=>{var m=Ca(),_=t(m),L=r(t(_),2),O=t(L),B=t(O),I=r(t(B),2),aa=t(I,!0);a(I),a(B);var G=r(B,2),pe=r(t(G),2),sa=t(pe,!0);a(pe),a(G);var K=r(G,2),_e=r(t(K),2),ta=t(_e);{let i=g(()=>Ge(e(n).status));Le(ta,{get variant(){return e(i)},get text(){return e(n).status}})}a(_e),a(K);var Q=r(K,2),ge=r(t(Q),2),ra=t(ge);{let i=g(()=>e(n).role==="admin"?"primary":"default");Le(ra,{get variant(){return e(i)},get text(){return e(n).role}})}a(ge),a(Q);var W=r(Q,2),xe=r(t(W),2),la=t(xe,!0);a(xe),a(W);var he=r(W,2),be=r(t(he),2),ia=t(be,!0);a(be),a(he),a(O),a(L),a(_);var X=r(_,2),ye=r(t(X),2),Y=t(ye),$e=t(Y);Oe($e,{label:"Status",get options(){return je},get value(){return e($)},set value(i){l($,i,!0)}});var na=r($e,2);Oe(na,{label:"Role",get options(){return Ne},get value(){return e(w)},set value(i){l(w,i,!0)}}),a(Y);var we=r(Y,2),oa=t(we);{let i=g(()=>!e(He));y(oa,{variant:"primary",onclick:Ze,get disabled(){return e(i)},get loading(){return e(V)},children:(d,c)=>{x();var z=b("Save Changes");o(d,z)},$$slots:{default:!0}})}a(we),a(ye),a(X);var ee=r(X,2),Se=r(t(ee),2),da=t(Se);{var va=i=>{var d=Ba();o(i,d)},ca=i=>{var d=za();ka(d,21,()=>e(de),([c,z])=>c,(c,z)=>{var Ue=g(()=>Da(e(z),2));let _a=()=>e(Ue)[0],ga=()=>e(Ue)[1];var re=Ia(),le=t(re),xa=t(le,!0);a(le);var Re=r(le,2),ha=t(Re,!0);a(Re),a(re),C(ba=>{A(xa,_a()),A(ha,ba)},[()=>Xe(ga())]),o(c,re)}),a(d),o(i,d)};Me(da,i=>{e(de).length===0?i(va):i(ca,!1)})}a(Se),a(ee);var ae=r(ee,2),De=r(t(ae),2),ke=t(De),ua=r(t(ke),2);y(ua,{variant:"secondary",size:"sm",onclick:Qe,get loading(){return e(J)},children:(i,d)=>{x();var c=b("Send Reset Email");o(i,c)},$$slots:{default:!0}}),a(ke),a(De),a(ae);var Ae=r(ae,2),Ee=r(t(Ae),2),se=t(Ee),ma=r(t(se),2);y(ma,{variant:"danger",size:"sm",onclick:()=>l(F,!0),get loading(){return e(j)},children:(i,d)=>{x();var c=b("Revoke Sessions");o(i,c)},$$slots:{default:!0}}),a(se);var te=r(se,4),fa=r(t(te),2);y(fa,{variant:"danger",size:"sm",onclick:()=>l(T,!0),get loading(){return e(H)},children:(i,d)=>{x();var c=b("Disable MFA");o(i,c)},$$slots:{default:!0}}),a(te);var Pe=r(te,4),pa=r(t(Pe),2);y(pa,{variant:"danger",size:"sm",onclick:()=>l(M,!0),get loading(){return e(N)},children:(i,d)=>{x();var c=b("Delete User");o(i,c)},$$slots:{default:!0}}),a(Pe),a(Ee),a(Ae),a(m),C((i,d)=>{A(aa,e(n).id),A(sa,e(n).email),A(la,i),A(ia,d)},[()=>oe(e(n).createdAt),()=>oe(e(n).lastSignedInAt)]),o(u,m)};Me(Z,u=>{!e(n)&&!e(U)?u(fe):e(U)?u(q,1):e(n)&&u(ea,2)})}o(S,k)}});var ue=r(ce,2);ne(ue,{title:"Revoke All Sessions",message:"Are you sure you want to revoke all sessions for this user? They will be signed out from all devices immediately.",confirmLabel:"Revoke",confirmVariant:"danger",onconfirm:qe,get open(){return e(F)},set open(s){l(F,s,!0)}});var me=r(ue,2);ne(me,{title:"Disable MFA",message:"Are you sure you want to disable all multi-factor authentication methods for this user?",confirmLabel:"Disable MFA",confirmVariant:"danger",onconfirm:We,get open(){return e(T)},set open(s){l(T,s,!0)}});var Ye=r(me,2);ne(Ye,{title:"Delete User",message:"Are you sure you want to permanently delete this user? All associated data (auth indexes, sessions, push tokens) will be removed. This action cannot be undone.",confirmLabel:"Delete User",confirmVariant:"danger",onconfirm:Ke,get open(){return e(M)},set open(s){l(M,s,!0)}}),o(Be,ve),Sa(),Ve()}export{is as component};
|