@edge-base/server 0.2.5 → 0.2.7

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 (135) hide show
  1. package/admin-build/_app/immutable/chunks/{DILS_-VJ.js → B3CvhH3c.js} +1 -1
  2. package/admin-build/_app/immutable/chunks/BDYewzou.js +1 -0
  3. package/admin-build/_app/immutable/chunks/{Cdm5zBRA.js → BEM1BeVF.js} +1 -1
  4. package/admin-build/_app/immutable/chunks/{Dt4vL4Df.js → BYL_uBga.js} +1 -1
  5. package/admin-build/_app/immutable/chunks/{B94PilAN.js → BYyykAbh.js} +1 -1
  6. package/admin-build/_app/immutable/chunks/BaUG2TJ-.js +1 -0
  7. package/admin-build/_app/immutable/chunks/{C72lTcG0.js → Bcs4KYNp.js} +1 -1
  8. package/admin-build/_app/immutable/chunks/{D2j3I1VQ.js → BfpUQYr3.js} +1 -1
  9. package/admin-build/_app/immutable/chunks/BhCO1Fpt.js +1 -0
  10. package/admin-build/_app/immutable/chunks/{B8s_s9QY.js → BkZCgsc3.js} +1 -1
  11. package/admin-build/_app/immutable/chunks/CIOC1v_q.js +128 -0
  12. package/admin-build/_app/immutable/chunks/CjcrXziO.js +2 -0
  13. package/admin-build/_app/immutable/chunks/CvczjTXx.js +1 -0
  14. package/admin-build/_app/immutable/chunks/D1u3u7xu.js +1 -0
  15. package/admin-build/_app/immutable/chunks/{B0HRJ657.js → DOOPbWwG.js} +1 -1
  16. package/admin-build/_app/immutable/chunks/{BqTb6Mxk.js → DaXO-sFP.js} +1 -1
  17. package/admin-build/_app/immutable/chunks/DnpbvAPi.js +1 -0
  18. package/admin-build/_app/immutable/chunks/{B6MschND.js → Dz9cUCuv.js} +1 -1
  19. package/admin-build/_app/immutable/chunks/{CaVKAiCe.js → Tea2dBJ8.js} +1 -1
  20. package/admin-build/_app/immutable/chunks/{Z41NK6i6.js → bguI1TeA.js} +1 -1
  21. package/admin-build/_app/immutable/chunks/{J2Gw0SMu.js → ejoEf2I5.js} +1 -1
  22. package/admin-build/_app/immutable/chunks/{B2TnDKF7.js → iEyeblJR.js} +1 -1
  23. package/admin-build/_app/immutable/chunks/{_teD5ji5.js → nlAMTi52.js} +1 -1
  24. package/admin-build/_app/immutable/chunks/qKdzaeX3.js +1 -0
  25. package/admin-build/_app/immutable/entry/{app.D3flihMw.js → app.DoUaxnew.js} +2 -2
  26. package/admin-build/_app/immutable/entry/start.MmZh8oBH.js +1 -0
  27. package/admin-build/_app/immutable/nodes/{0.CdczqZLK.js → 0.Dsxi8s7i.js} +1 -1
  28. package/admin-build/_app/immutable/nodes/1.Cp2l-hol.js +1 -0
  29. package/admin-build/_app/immutable/nodes/10.4oY6m8Nz.js +1 -0
  30. package/admin-build/_app/immutable/nodes/11.DfcozD4J.js +1 -0
  31. package/admin-build/_app/immutable/nodes/12.uJgZdCIA.js +1 -0
  32. package/admin-build/_app/immutable/nodes/13.CaN1kRev.js +110 -0
  33. package/admin-build/_app/immutable/nodes/14.DQ5xIi3s.js +3 -0
  34. package/admin-build/_app/immutable/nodes/15.B_EkebTJ.js +1 -0
  35. package/admin-build/_app/immutable/nodes/{16.BR7WwQrS.js → 16.Tko1ZX8-.js} +1 -1
  36. package/admin-build/_app/immutable/nodes/{17.Cm57KKXV.js → 17.BCmWMJX9.js} +1 -1
  37. package/admin-build/_app/immutable/nodes/18.hmGhl1O2.js +1 -0
  38. package/admin-build/_app/immutable/nodes/19.D-1infOo.js +2 -0
  39. package/admin-build/_app/immutable/nodes/{20.DnHeFlTv.js → 20.CY4KKcBL.js} +1 -1
  40. package/admin-build/_app/immutable/nodes/21.B9lbNUQr.js +1 -0
  41. package/admin-build/_app/immutable/nodes/22.14Vd7bnt.js +1 -0
  42. package/admin-build/_app/immutable/nodes/{23.CWSGMcKJ.js → 23.Be6jK77o.js} +2 -2
  43. package/admin-build/_app/immutable/nodes/24.CSTFkr6R.js +2 -0
  44. package/admin-build/_app/immutable/nodes/25.DRTg8fHc.js +2 -0
  45. package/admin-build/_app/immutable/nodes/26.DKt-9lwQ.js +1 -0
  46. package/admin-build/_app/immutable/nodes/27.D5caPu0F.js +1 -0
  47. package/admin-build/_app/immutable/nodes/28.hJhlnlyY.js +1 -0
  48. package/admin-build/_app/immutable/nodes/29.CDYBzFyT.js +1 -0
  49. package/admin-build/_app/immutable/nodes/{3.B6q-7qr8.js → 3.DMyKwkGn.js} +1 -1
  50. package/admin-build/_app/immutable/nodes/30.BaHNeEmc.js +1 -0
  51. package/admin-build/_app/immutable/nodes/31.C6PV5L-2.js +1 -0
  52. package/admin-build/_app/immutable/nodes/4.9E118Ftm.js +1 -0
  53. package/admin-build/_app/immutable/nodes/5.D8guAl3v.js +1 -0
  54. package/admin-build/_app/immutable/nodes/6.D1u__DtT.js +1 -0
  55. package/admin-build/_app/immutable/nodes/7.DWXHnRFf.js +1 -0
  56. package/admin-build/_app/immutable/nodes/8.Dojd8krc.js +1 -0
  57. package/admin-build/_app/immutable/nodes/9.CLtrr0K_.js +1 -0
  58. package/admin-build/_app/version.json +1 -1
  59. package/admin-build/index.html +7 -7
  60. package/openapi.json +6 -1941
  61. package/package.json +3 -3
  62. package/src/__tests__/openapi-coverage.test.ts +0 -6
  63. package/src/__tests__/push-handlers.test.ts +1 -1
  64. package/src/__tests__/room-auth-state-loss.test.ts +6 -0
  65. package/src/__tests__/room-handler-context.test.ts +0 -31
  66. package/src/__tests__/room-rate-limit-scopes.test.ts +1 -5
  67. package/src/__tests__/room-runtime-routing.test.ts +24 -111
  68. package/src/__tests__/route-parser.test.ts +6 -0
  69. package/src/__tests__/schema.test.ts +15 -6
  70. package/src/__tests__/smoke-skip-report.test.ts +1 -1
  71. package/src/durable-objects/database-do.ts +7 -1
  72. package/src/durable-objects/room-runtime-base.ts +290 -57
  73. package/src/durable-objects/rooms-do.ts +212 -1336
  74. package/src/index.ts +23 -9
  75. package/src/lib/d1-handler.ts +32 -17
  76. package/src/lib/openapi.ts +1 -4
  77. package/src/lib/postgres-handler.ts +24 -12
  78. package/src/lib/route-parser.ts +3 -0
  79. package/src/lib/schemas.ts +12 -2
  80. package/src/middleware/captcha-verify.ts +16 -3
  81. package/src/middleware/error-handler.ts +1 -1
  82. package/src/middleware/rules.ts +28 -9
  83. package/src/routes/admin-auth.ts +3 -3
  84. package/src/routes/admin.ts +13 -8
  85. package/src/routes/analytics-api.ts +3 -3
  86. package/src/routes/auth.ts +1 -1
  87. package/src/routes/backup.ts +1 -1
  88. package/src/routes/d1.ts +14 -7
  89. package/src/routes/database-live.ts +13 -6
  90. package/src/routes/kv.ts +21 -10
  91. package/src/routes/oauth.ts +1 -1
  92. package/src/routes/push.ts +119 -77
  93. package/src/routes/room.ts +203 -280
  94. package/src/routes/schema-endpoint.ts +2 -2
  95. package/src/routes/sql.ts +10 -6
  96. package/src/routes/storage.ts +4 -2
  97. package/src/routes/vectorize.ts +16 -4
  98. package/src/types.ts +1 -14
  99. package/admin-build/_app/immutable/chunks/6oMK_164.js +0 -1
  100. package/admin-build/_app/immutable/chunks/BEW7Ez_g.js +0 -1
  101. package/admin-build/_app/immutable/chunks/BoOooyH6.js +0 -1
  102. package/admin-build/_app/immutable/chunks/BvHnF5tV.js +0 -1
  103. package/admin-build/_app/immutable/chunks/CoI6jjbg.js +0 -2
  104. package/admin-build/_app/immutable/chunks/CrOZMmdF.js +0 -1
  105. package/admin-build/_app/immutable/chunks/Cw6OYcq-.js +0 -1
  106. package/admin-build/_app/immutable/chunks/DPdQ7z0T.js +0 -128
  107. package/admin-build/_app/immutable/chunks/pUxw8jfq.js +0 -1
  108. package/admin-build/_app/immutable/entry/start.Cl6sLxnz.js +0 -1
  109. package/admin-build/_app/immutable/nodes/1.DxcSsEqS.js +0 -1
  110. package/admin-build/_app/immutable/nodes/10.DuAd4aIm.js +0 -1
  111. package/admin-build/_app/immutable/nodes/11.0jgHQL92.js +0 -1
  112. package/admin-build/_app/immutable/nodes/12.CKNPqmyy.js +0 -1
  113. package/admin-build/_app/immutable/nodes/13.B1p2POXS.js +0 -110
  114. package/admin-build/_app/immutable/nodes/14.Bb-REBND.js +0 -3
  115. package/admin-build/_app/immutable/nodes/15.1uBFCX0X.js +0 -1
  116. package/admin-build/_app/immutable/nodes/18.CoiwfAuQ.js +0 -1
  117. package/admin-build/_app/immutable/nodes/19.B8ZdLlXj.js +0 -2
  118. package/admin-build/_app/immutable/nodes/21.CJFaf0Ia.js +0 -1
  119. package/admin-build/_app/immutable/nodes/22.CItETFzy.js +0 -1
  120. package/admin-build/_app/immutable/nodes/24.CWbEqNMB.js +0 -2
  121. package/admin-build/_app/immutable/nodes/25.DRkLEhKi.js +0 -2
  122. package/admin-build/_app/immutable/nodes/26.BRxO8AYH.js +0 -1
  123. package/admin-build/_app/immutable/nodes/27.BLs-nVHz.js +0 -1
  124. package/admin-build/_app/immutable/nodes/28.G79qkdBK.js +0 -1
  125. package/admin-build/_app/immutable/nodes/29.BOcI6g0N.js +0 -1
  126. package/admin-build/_app/immutable/nodes/30.DAIC7dKd.js +0 -1
  127. package/admin-build/_app/immutable/nodes/31.pl0XXjXF.js +0 -1
  128. package/admin-build/_app/immutable/nodes/4.DOdvVlZj.js +0 -1
  129. package/admin-build/_app/immutable/nodes/5.BW_zlgye.js +0 -1
  130. package/admin-build/_app/immutable/nodes/6.Dxy1CAI2.js +0 -1
  131. package/admin-build/_app/immutable/nodes/7.BG98w_o7.js +0 -1
  132. package/admin-build/_app/immutable/nodes/8.DoG5R2rG.js +0 -1
  133. package/admin-build/_app/immutable/nodes/9.Dmxf6zAC.js +0 -1
  134. package/src/__tests__/cloudflare-realtime.test.ts +0 -113
  135. package/src/lib/cloudflare-realtime.ts +0 -251
@@ -1,3 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as xt,g as $t}from"../chunks/Bn2NtlTj.js";import{p as Lt,a as Rt,b,g as e,f as X,c as o,s as r,r as n,ag as Qe,t as F,d as x,ae as q,u as d}from"../chunks/BdTBlfLy.js";import{d as Ot,s as We,a as Et}from"../chunks/DtZk82gG.js";import{i as Q}from"../chunks/Y22E1hJM.js";import{a as J,A as St,c as Ye,t as be,e as Ze}from"../chunks/BEW7Ez_g.js";import{c as Dt,a as h,t as W,f as A}from"../chunks/DEELgv7K.js";import{a as et,s as It}from"../chunks/CoI6jjbg.js";import{b as tt}from"../chunks/CYatlt7w.js";import{b as Pt}from"../chunks/Cw6OYcq-.js";import{l as Ct,d as Mt}from"../chunks/CaVKAiCe.js";import{P as Nt}from"../chunks/B8s_s9QY.js";import{c as Ut}from"../chunks/Q2nPFxS6.js";import{B as he}from"../chunks/C72lTcG0.js";import{B as N}from"../chunks/B0HRJ657.js";import{I as O}from"../chunks/_teD5ji5.js";import{T as E}from"../chunks/Z41NK6i6.js";var Bt=A("<!> <!>",1),zt=A("<a><!></a> <!>",1),Ht=A('<div class="loading-state svelte-wg73a1"><span class="spinner svelte-wg73a1"></span> Loading settings...</div>'),qt=A('<div class="error-state svelte-wg73a1">Failed to load authentication settings.</div>'),Gt=A('<button type="button" role="tab"> </button>'),jt=A('<div class="target-switch svelte-wg73a1" role="tablist" aria-label="OAuth environment target"></div>'),Jt=A('<div class="provider-card svelte-wg73a1"><div class="provider-card__header svelte-wg73a1"><div><h4 class="provider-card__title svelte-wg73a1"> </h4> <p class="provider-card__hint svelte-wg73a1">Toggle the provider and set its OAuth credentials.</p></div> <div class="provider-card__status svelte-wg73a1"><!> <!></div></div> <div class="provider-card__fields svelte-wg73a1"><!> <!></div></div>'),Vt=A("Core auth behavior is written to <code>edgebase.config.ts</code> and shared across environments. OAuth provider enablement and secrets follow the selected target: <code>Development</code> writes to <code>.env.development</code> and syncs <code>.dev.vars</code>, while <code>Release</code> writes to <code>.env.release</code>, which the deploy pipeline syncs to Cloudflare secrets.",1),Kt=A("The dashboard detected an older dev sidecar that does not support auth editing yet. Restart <code>pnpm dev</code> to enable edits.",1),Xt=A('<div class="settings-grid svelte-wg73a1"><div class="card svelte-wg73a1"><div class="card__header svelte-wg73a1"><div><h3 class="card__title svelte-wg73a1">Core Methods</h3> <p class="card__subtitle svelte-wg73a1">Shared across Development and Release.</p></div> <!></div> <div class="card__body card__body--stack svelte-wg73a1"><div class="toggle-row svelte-wg73a1"><!> <!></div> <div class="toggle-row svelte-wg73a1"><!> <!></div> <div class="subsection svelte-wg73a1"><div class="subsection__row svelte-wg73a1"><!> <!></div> <!></div> <div class="subsection svelte-wg73a1"><div class="subsection__row svelte-wg73a1"><!> <!></div></div></div></div> <div class="card svelte-wg73a1"><div class="card__header svelte-wg73a1"><h3 class="card__title svelte-wg73a1">Session</h3></div> <div class="card__body card__body--stack svelte-wg73a1"><!> <!> <!></div></div> <div class="card svelte-wg73a1"><div class="card__header svelte-wg73a1"><div><h3 class="card__title svelte-wg73a1">Passkeys</h3> <p class="card__subtitle svelte-wg73a1">Shared across Development and Release.</p></div> <!></div> <div class="card__body card__body--stack svelte-wg73a1"><!> <!> <!> <label class="textarea-field svelte-wg73a1"><span class="textarea-field__label svelte-wg73a1">Allowed Origins</span> <textarea class="textarea-field__input svelte-wg73a1" rows="4" placeholder="https://example.com"></textarea></label></div></div> <div class="card card--wide svelte-wg73a1"><div class="card__header svelte-wg73a1"><div><h3 class="card__title svelte-wg73a1">Allowed Redirect URLs</h3> <p class="card__subtitle svelte-wg73a1">Shared across Development and Release.</p></div> <!></div> <div class="card__body svelte-wg73a1"><label class="textarea-field svelte-wg73a1"><span class="textarea-field__label svelte-wg73a1">One URL or wildcard per line</span> <textarea class="textarea-field__input svelte-wg73a1" rows="5" placeholder="https://app.example.com/auth/*"></textarea></label></div></div> <div class="card card--wide svelte-wg73a1"><div class="card__header card__header--wrap svelte-wg73a1"><div><h3 class="card__title svelte-wg73a1">OAuth Providers</h3> <p class="card__subtitle svelte-wg73a1">Provider allowlists and credentials are stored per target environment.</p></div> <div class="oauth-header-controls svelte-wg73a1"><!> <!></div></div> <div class="card__body provider-grid svelte-wg73a1"></div></div></div> <div class="notice svelte-wg73a1"><!></div>',1);function ua(at,st){Lt(st,!0);const S=[{id:"google",label:"Google"},{id:"github",label:"GitHub"},{id:"apple",label:"Apple"},{id:"discord",label:"Discord"},{id:"microsoft",label:"Microsoft"},{id:"facebook",label:"Facebook"},{id:"kakao",label:"Kakao"},{id:"naver",label:"Naver"},{id:"x",label:"X"},{id:"reddit",label:"Reddit"},{id:"line",label:"Line"},{id:"slack",label:"Slack"},{id:"spotify",label:"Spotify"},{id:"twitch",label:"Twitch"}],lt=[{id:"development",label:"Development"},{id:"release",label:"Release"}];let fe=x(!0),V=x(!1),u=x(!1),ke=x(!1),p=x("development"),l=x(null),U=x(null),m=x(null),$=x(null);function Y(t){return t.split(/\r?\n/).map(i=>i.trim()).filter(Boolean)}function D(t){const i=t.trim();return i||null}function we(t){const i=t.trim();if(!i)return null;const c=Number(i);return Number.isFinite(c)?c:null}function K(t){return{...t}}function it(t){var i,c,v,g,B,z,k,_,f,L,w,T;return{emailAuth:t.emailAuth!==!1,anonymousAuth:!!t.anonymousAuth,allowedRedirectUrlsText:(t.allowedRedirectUrls??[]).join(`
2
- `),sessionAccessTokenTTL:((i=t.session)==null?void 0:i.accessTokenTTL)??"",sessionRefreshTokenTTL:((c=t.session)==null?void 0:c.refreshTokenTTL)??"",sessionMaxActiveSessions:typeof((v=t.session)==null?void 0:v.maxActiveSessions)=="number"?String(t.session.maxActiveSessions):"",magicLinkEnabled:!!((g=t.magicLink)!=null&&g.enabled),magicLinkAutoCreate:((B=t.magicLink)==null?void 0:B.autoCreate)!==!1,magicLinkTokenTTL:((z=t.magicLink)==null?void 0:z.tokenTTL)??"",emailOtpEnabled:!!((k=t.emailOtp)!=null&&k.enabled),emailOtpAutoCreate:((_=t.emailOtp)==null?void 0:_.autoCreate)!==!1,passkeysEnabled:!!((f=t.passkeys)!=null&&f.enabled),passkeysRpName:((L=t.passkeys)==null?void 0:L.rpName)??"",passkeysRpID:((w=t.passkeys)==null?void 0:w.rpID)??"",passkeysOriginText:(((T=t.passkeys)==null?void 0:T.origin)??[]).join(`
3
- `)}}function Te(t){var c;const i={};for(const v of S){const g=(c=t.oauth)==null?void 0:c[v.id];i[v.id]={enabled:t.providers.includes(v.id),clientId:(g==null?void 0:g.clientId)??"",clientSecret:(g==null?void 0:g.clientSecret)??""}}return i}function I(t){const i={};for(const c of S)i[c.id]={...t[c.id]};return i}function Z(t){return`auth/settings?target=${t}`}function ee(t,i){const c=S.filter(g=>i[g.id].enabled).map(g=>g.id),v={};for(const g of S)v[g.id]={clientId:D(i[g.id].clientId),clientSecret:D(i[g.id].clientSecret)};return{emailAuth:t.emailAuth,anonymousAuth:t.anonymousAuth,allowedOAuthProviders:c,allowedRedirectUrls:Y(t.allowedRedirectUrlsText),session:{accessTokenTTL:D(t.sessionAccessTokenTTL),refreshTokenTTL:D(t.sessionRefreshTokenTTL),maxActiveSessions:we(t.sessionMaxActiveSessions)},magicLink:{enabled:t.magicLinkEnabled,autoCreate:t.magicLinkAutoCreate,tokenTTL:D(t.magicLinkTokenTTL)},emailOtp:{enabled:t.emailOtpEnabled,autoCreate:t.emailOtpAutoCreate},passkeys:{enabled:t.passkeysEnabled,rpName:D(t.passkeysRpName),rpID:D(t.passkeysRpID),origin:Y(t.passkeysOriginText)},oauth:v}}function te(){return e(m)?e(m)[e(p)]:null}function rt(t,i){for(const c of S){const v=i[c.id];if(v.enabled&&(!v.clientId.trim()||!v.clientSecret.trim()))return`${c.label} requires both a client ID and client secret.`}if(t.passkeysEnabled){if(!t.passkeysRpName.trim()||!t.passkeysRpID.trim())return"Passkeys require both RP Name and RP ID.";if(Y(t.passkeysOriginText).length===0)return"Passkeys require at least one allowed origin."}return t.sessionMaxActiveSessions.trim()&&we(t.sessionMaxActiveSessions)===null?"Max active sessions must be a valid number.":null}function ae(t,i){const c=it(t),v={development:Te(t),release:Te(i??t)};b(U,K(c),!0),b(l,K(c),!0),b($,{development:I(v.development),release:I(v.release)},!0),b(m,{development:I(v.development),release:I(v.release)},!0)}function nt(){!e(U)||!e($)||!e(m)||(b(l,K(e(U)),!0),b(m,{...e(m),[e(p)]:I(e($)[e(p)])},!0))}const ye=d(()=>(()=>{const t=te();return!e(l)||!e(U)||!t||!e($)?!1:JSON.stringify(ee(e(l),t))!==JSON.stringify(ee(e(U),e($)[e(p)]))})()),Ae=d(()=>(()=>{const t=te();return t?S.filter(i=>{var c;return(c=t[i.id])==null?void 0:c.enabled}).length:0})());async function dt(){const t=te();if(!e(u)||!e(l)||!t||!e($))return;const i=rt(e(l),t);if(i){be(i);return}b(V,!0);try{const c=ee(e(l),t);await J.schemaMutation(Z(e(p)),{method:"PUT",body:c}),b(U,K(e(l)),!0),b($,{...e($),[e(p)]:I(t)},!0),b(m,{...e(m),[e(p)]:I(t)},!0),Ye({type:"success",message:e(p)==="release"?"Release auth settings saved to edgebase.config.ts and .env.release.":"Development auth settings saved to edgebase.config.ts and local env files."})}catch(c){be(c instanceof Error?c.message:"Failed to save auth settings")}finally{b(V,!1)}}xt(async()=>{try{if(await Ct(),b(u,$t(Mt).devMode,!0),e(u))try{const t=await J.schemaMutation(Z("development")),i=await J.schemaMutation(Z("release"));ae(t,i)}catch(t){if(t instanceof St&&t.status===404){b(ke,!0),b(u,!1),Ye({type:"warning",message:"Dev sidecar is outdated. Showing read-only auth settings until you restart `pnpm dev`."});const i=await J.fetch("data/auth/settings");ae(i)}else throw t}else{const t=await J.fetch("data/auth/settings");ae(t)}}catch(t){be(t instanceof Error?t.message:"Failed to load auth settings")}finally{b(fe,!1)}}),Nt(at,{title:"Auth Settings",description:"Manage authentication methods and OAuth providers",get docsHref(){return Ut},actions:i=>{var c=zt(),v=X(c),g=o(v);he(g,{variant:"ghost",size:"sm",children:(k,_)=>{q();var f=W("Back to Users");h(k,f)},$$slots:{default:!0}}),n(v);var B=r(v,2);{var z=k=>{var _=Bt(),f=X(_);{let w=d(()=>!e(ye)||e(V));he(f,{variant:"secondary",size:"sm",onclick:nt,get disabled(){return e(w)},children:(T,se)=>{q();var H=W("Reset");h(T,H)},$$slots:{default:!0}})}var L=r(f,2);{let w=d(()=>!e(ye));he(L,{size:"sm",onclick:dt,get disabled(){return e(w)},get loading(){return e(V)},children:(T,se)=>{q();var H=W("Save Changes");h(T,H)},$$slots:{default:!0}})}h(k,_)};Q(B,k=>{e(u)&&e(l)&&k(z)})}F(()=>et(v,"href",`${Pt??""}/auth`)),h(i,c)},children:(i,c)=>{var v=Dt(),g=X(v);{var B=_=>{var f=Ht();h(_,f)},z=_=>{var f=qt();h(_,f)},k=_=>{var f=Xt(),L=X(f),w=o(L),T=o(w),se=r(o(T),2);N(se,{variant:"default",text:"Shared Config"}),n(T);var H=r(T,2),le=o(H),xe=o(le);{let s=d(()=>!e(u));E(xe,{label:"Email / Password",get disabled(){return e(s)},get checked(){return e(l).emailAuth},set checked(a){e(l).emailAuth=a}})}var ot=r(xe,2);{let s=d(()=>e(l).emailAuth?"success":"default"),a=d(()=>e(l).emailAuth?"Enabled":"Disabled");N(ot,{get variant(){return e(s)},get text(){return e(a)}})}n(le);var ie=r(le,2),$e=o(ie);{let s=d(()=>!e(u));E($e,{label:"Anonymous Sign-In",get disabled(){return e(s)},get checked(){return e(l).anonymousAuth},set checked(a){e(l).anonymousAuth=a}})}var ct=r($e,2);{let s=d(()=>e(l).anonymousAuth?"success":"default"),a=d(()=>e(l).anonymousAuth?"Enabled":"Disabled");N(ct,{get variant(){return e(s)},get text(){return e(a)}})}n(ie);var re=r(ie,2),ne=o(re),Le=o(ne);{let s=d(()=>!e(u));E(Le,{label:"Magic Link",get disabled(){return e(s)},get checked(){return e(l).magicLinkEnabled},set checked(a){e(l).magicLinkEnabled=a}})}var vt=r(Le,2);{let s=d(()=>!e(u));E(vt,{label:"Auto-create User",get disabled(){return e(s)},get checked(){return e(l).magicLinkAutoCreate},set checked(a){e(l).magicLinkAutoCreate=a}})}n(ne);var ut=r(ne,2);{let s=d(()=>!e(u));O(ut,{label:"Magic Link Token TTL",placeholder:"15m",get disabled(){return e(s)},get value(){return e(l).magicLinkTokenTTL},set value(a){e(l).magicLinkTokenTTL=a}})}n(re);var Re=r(re,2),Oe=o(Re),Ee=o(Oe);{let s=d(()=>!e(u));E(Ee,{label:"Email OTP",get disabled(){return e(s)},get checked(){return e(l).emailOtpEnabled},set checked(a){e(l).emailOtpEnabled=a}})}var gt=r(Ee,2);{let s=d(()=>!e(u));E(gt,{label:"Auto-create User",get disabled(){return e(s)},get checked(){return e(l).emailOtpAutoCreate},set checked(a){e(l).emailOtpAutoCreate=a}})}n(Oe),n(Re),n(H),n(w);var de=r(w,2),Se=r(o(de),2),De=o(Se);{let s=d(()=>!e(u));O(De,{label:"Access Token TTL",placeholder:"15m",get disabled(){return e(s)},get value(){return e(l).sessionAccessTokenTTL},set value(a){e(l).sessionAccessTokenTTL=a}})}var Ie=r(De,2);{let s=d(()=>!e(u));O(Ie,{label:"Refresh Token TTL",placeholder:"7d",get disabled(){return e(s)},get value(){return e(l).sessionRefreshTokenTTL},set value(a){e(l).sessionRefreshTokenTTL=a}})}var pt=r(Ie,2);{let s=d(()=>!e(u));O(pt,{label:"Max Active Sessions",type:"number",placeholder:"Blank = unlimited",get disabled(){return e(s)},get value(){return e(l).sessionMaxActiveSessions},set value(a){e(l).sessionMaxActiveSessions=a}})}n(Se),n(de);var oe=r(de,2),ce=o(oe),mt=r(o(ce),2);{let s=d(()=>e(l).passkeysEnabled?"success":"default"),a=d(()=>e(l).passkeysEnabled?"Enabled":"Disabled");N(mt,{get variant(){return e(s)},get text(){return e(a)}})}n(ce);var Pe=r(ce,2),Ce=o(Pe);{let s=d(()=>!e(u));E(Ce,{label:"Enable Passkeys",get disabled(){return e(s)},get checked(){return e(l).passkeysEnabled},set checked(a){e(l).passkeysEnabled=a}})}var Me=r(Ce,2);{let s=d(()=>!e(u));O(Me,{label:"RP Name",placeholder:"My App",get disabled(){return e(s)},get value(){return e(l).passkeysRpName},set value(a){e(l).passkeysRpName=a}})}var Ne=r(Me,2);{let s=d(()=>!e(u));O(Ne,{label:"RP ID",placeholder:"example.com",get disabled(){return e(s)},get value(){return e(l).passkeysRpID},set value(a){e(l).passkeysRpID=a}})}var Ue=r(Ne,2),ve=r(o(Ue),2);Qe(ve),n(Ue),n(Pe),n(oe);var ue=r(oe,2),ge=o(ue),_t=r(o(ge),2);N(_t,{variant:"default",text:"Shared Config"}),n(ge);var Be=r(ge,2),ze=o(Be),pe=r(o(ze),2);Qe(pe),n(ze),n(Be),n(ue);var He=r(ue,2),me=o(He),qe=r(o(me),2),Ge=o(qe);{let s=d(()=>e(Ae)>0?"primary":"default"),a=d(()=>`${e(Ae)} enabled`);N(Ge,{get variant(){return e(s)},get text(){return e(a)}})}var bt=r(Ge,2);{var ht=s=>{var a=jt();Ze(a,21,()=>lt,P=>P.id,(P,R)=>{var y=Gt();let G;var _e=o(y,!0);n(y),F(()=>{G=It(y,1,"target-switch__button svelte-wg73a1",null,G,{"target-switch__button--active":e(p)===e(R).id}),et(y,"aria-selected",e(p)===e(R).id),We(_e,e(R).label)}),Et("click",y,()=>{b(p,e(R).id,!0)}),h(P,y)}),n(a),h(s,a)};Q(bt,s=>{e(u)&&s(ht)})}n(qe),n(me);var je=r(me,2);Ze(je,21,()=>S,s=>s.id,(s,a)=>{var P=Jt(),R=o(P),y=o(R),G=o(y),_e=o(G,!0);n(G),q(2),n(y);var Ve=r(y,2),Ke=o(Ve);{let C=d(()=>e(m)[e(p)][e(a).id].enabled?"success":"default"),M=d(()=>e(m)[e(p)][e(a).id].enabled?"Enabled":"Disabled");N(Ke,{get variant(){return e(C)},get text(){return e(M)}})}var yt=r(Ke,2);{let C=d(()=>`Enable ${e(a).label}`),M=d(()=>!e(u));E(yt,{get label(){return e(C)},get disabled(){return e(M)},get checked(){return e(m)[e(p)][e(a).id].enabled},set checked(j){e(m)[e(p)][e(a).id].enabled=j}})}n(Ve),n(R);var Xe=r(R,2),Fe=o(Xe);{let C=d(()=>`${e(a).label} client ID`),M=d(()=>!e(u));O(Fe,{label:"Client ID",get placeholder(){return e(C)},get disabled(){return e(M)},get value(){return e(m)[e(p)][e(a).id].clientId},set value(j){e(m)[e(p)][e(a).id].clientId=j}})}var At=r(Fe,2);{let C=d(()=>`${e(a).label} client secret`),M=d(()=>!e(u));O(At,{label:"Client Secret",type:"password",get placeholder(){return e(C)},get disabled(){return e(M)},get value(){return e(m)[e(p)][e(a).id].clientSecret},set value(j){e(m)[e(p)][e(a).id].clientSecret=j}})}n(Xe),n(P),F(()=>We(_e,e(a).label)),h(s,P)}),n(je),n(He),n(L);var Je=r(L,2),ft=o(Je);{var kt=s=>{var a=Vt();q(12),h(s,a)},wt=s=>{var a=Kt();q(2),h(s,a)},Tt=s=>{var a=W("This dashboard is showing runtime auth configuration only. Editing remains disabled outside local dev mode.");h(s,a)};Q(ft,s=>{e(u)?s(kt):e(ke)?s(wt,1):s(Tt,!1)})}n(Je),F(()=>{ve.disabled=!e(u),pe.disabled=!e(u)}),tt(ve,()=>e(l).passkeysOriginText,s=>e(l).passkeysOriginText=s),tt(pe,()=>e(l).allowedRedirectUrlsText,s=>e(l).allowedRedirectUrlsText=s),h(_,f)};Q(g,_=>{e(fe)?_(B):!e(l)||!e(m)?_(z,1):_(k,!1)})}h(i,v)}}),Rt()}Ot(["click"]);export{ua as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as ce}from"../chunks/Bn2NtlTj.js";import{p as pe,d as m,M as ve,f as I,a as ue,b as t,g as a,s as l,c as o,r,ae as J,t as A,u as fe}from"../chunks/BdTBlfLy.js";import{d as me,a as be,s as $}from"../chunks/DtZk82gG.js";import{i as Q}from"../chunks/Y22E1hJM.js";import{a as y,b as L,t as S,e as _e,d as ge}from"../chunks/BEW7Ez_g.js";import{a as f,f as k,t as M}from"../chunks/DEELgv7K.js";import{d as W}from"../chunks/wJsUhbfZ.js";import{P as he}from"../chunks/B8s_s9QY.js";import{b as ye}from"../chunks/Q2nPFxS6.js";import{B as U}from"../chunks/C72lTcG0.js";import{B as ke}from"../chunks/B0HRJ657.js";import{C as we}from"../chunks/DILS_-VJ.js";var De=k('<p class="card__loading svelte-lb9q8r">Loading DO list...</p>'),qe=k('<div class="do-item svelte-lb9q8r"><!> <span class="do-item__name svelte-lb9q8r"> </span></div>'),Oe=k('<div class="do-list svelte-lb9q8r"></div> <div class="card__actions svelte-lb9q8r"><!> <!></div>',1),$e=k('<div class="restore-preview svelte-lb9q8r"><p class="restore-preview__label svelte-lb9q8r">Backup Contents:</p> <ul class="restore-preview__list svelte-lb9q8r"><li> </li> <li> </li> <li> </li></ul></div> <div class="card__actions svelte-lb9q8r"><!></div>',1),Se=k('<div class="backup-layout svelte-lb9q8r"><div class="card svelte-lb9q8r"><div class="card__header svelte-lb9q8r"><h3 class="card__title svelte-lb9q8r">Create Backup</h3></div> <div class="card__body svelte-lb9q8r"><p class="card__desc svelte-lb9q8r">Download a full backup of all Durable Objects and Auth data.</p> <!></div></div> <div class="card svelte-lb9q8r"><div class="card__header svelte-lb9q8r"><h3 class="card__title svelte-lb9q8r">Restore from Backup</h3></div> <div class="card__body svelte-lb9q8r"><p class="card__desc svelte-lb9q8r">Upload a backup JSON file to restore. This will <strong>overwrite existing data</strong>.</p> <div class="restore-upload svelte-lb9q8r"><input type="file" accept=".json" class="restore-input svelte-lb9q8r"/></div> <!></div></div></div>'),Be=k("<!> <!>",1);function Ue(X,Y){pe(Y,!0);let H=m(!0),B=m(ve([])),P=m(!1),T=m(!1),w=m(null),u=m(null),R=m(!1),x=m(!1);ce(async()=>{try{const e=await y.fetch("data/backup/list-dos",{method:"POST"});t(B,e.dos,!0)}catch(e){S(e instanceof Error?e.message:"Failed to load DO list")}finally{t(H,!1)}});async function Z(){t(P,!0);try{const e={version:1,timestamp:new Date().toISOString(),dos:[]},i=[];for(const s of a(B))try{const C=await y.fetch("data/backup/dump-do",{method:"POST",body:{doName:s.doName,type:s.type}});i.push(C)}catch{i.push({doName:s.doName,type:s.type,error:"Failed to dump"})}let n={};try{n=await y.fetch("data/backup/dump-d1",{method:"POST"})}catch(s){console.warn("[EdgeBase] D1 dump failed:",s)}e.dos=i,e.d1=n;const d=new Blob([JSON.stringify(e,null,2)],{type:"application/json"});W(d,`edgebase-backup-${new Date().toISOString().slice(0,10)}.json`),L("Backup downloaded")}catch(e){S(e instanceof Error?e.message:"Backup failed")}finally{t(P,!1)}}async function ee(){t(T,!0);try{const e=await y.fetch("data/backup/dump-d1",{method:"POST"}),i=new Blob([JSON.stringify(e,null,2)],{type:"application/json"});W(i,`edgebase-d1-backup-${new Date().toISOString().slice(0,10)}.json`),L("D1 backup downloaded")}catch(e){S(e instanceof Error?e.message:"D1 backup failed")}finally{t(T,!1)}}async function ae(e){var n;const i=e.target;if((n=i.files)!=null&&n[0]){t(w,i.files[0],!0);try{const d=await a(w).text();t(u,JSON.parse(d),!0),ge(`Backup loaded: ${a(w).name}`)}catch{S("Invalid backup file. Please select a valid EdgeBase JSON backup file."),t(w,null),t(u,null)}}}async function te(){if(t(x,!1),!!a(u)){t(R,!0);try{const e=a(u);let i=0;const n=e.dos??[];for(const s of n)if(!(s.error||!s.tables))try{await y.fetch("data/backup/restore-do",{method:"POST",body:{doName:s.doName,type:s.type,tables:s.tables}}),i++}catch{}const d=e.d1;if(d!=null&&d.tables)try{await y.fetch("data/backup/restore-d1",{method:"POST",body:{tables:d.tables}}),i++}catch{}L(`Restored ${i} components`),t(w,null),t(u,null)}catch(e){S(e instanceof Error?e.message:"Restore failed")}finally{t(R,!1)}}}var V=Be(),z=I(V);he(z,{title:"Backup & Restore",description:"Create backups and restore data",get docsHref(){return ye},children:(e,i)=>{var n=Se(),d=o(n),s=l(o(d),2),C=l(o(s),2);{var se=v=>{var b=De();f(v,b)},oe=v=>{var b=Oe(),_=I(b);_e(_,21,()=>a(B),c=>c.doName,(c,g)=>{var p=qe(),N=o(p);{let O=fe(()=>a(g).type==="auth"?"warning":"primary");ke(N,{get variant(){return a(O)},get text(){return a(g).type}})}var q=l(N,2),F=o(q,!0);r(q),r(p),A(()=>$(F,a(g).doName)),f(c,p)}),r(_);var D=l(_,2),h=o(D);U(h,{variant:"primary",onclick:Z,get loading(){return a(P)},children:(c,g)=>{J();var p=M();A(()=>$(p,`Download Full Backup (${a(B).length??""} DOs + D1)`)),f(c,p)},$$slots:{default:!0}});var j=l(h,2);U(j,{variant:"secondary",onclick:ee,get loading(){return a(T)},children:(c,g)=>{J();var p=M("D1 Only");f(c,p)},$$slots:{default:!0}}),r(D),f(v,b)};Q(C,v=>{a(H)?v(se):v(oe,!1)})}r(s),r(d);var G=l(d,2),K=l(o(G),2),E=l(o(K),2),le=o(E);r(E);var ie=l(E,2);{var de=v=>{var b=$e(),_=I(b),D=l(o(_),2),h=o(D),j=o(h);r(h);var c=l(h,2),g=o(c);r(c);var p=l(c,2),N=o(p);r(p),r(D),r(_);var q=l(_,2),F=o(q);U(F,{variant:"danger",onclick:()=>t(x,!0),get loading(){return a(R)},children:(O,xe)=>{J();var ne=M("Restore Backup");f(O,ne)},$$slots:{default:!0}}),r(q),A(O=>{$(j,`DOs: ${(a(u).dos??[]).length??""} components`),$(g,`D1: ${a(u).d1?"Included":"Not included"}`),$(N,`Timestamp: ${O??""}`)},[()=>String(a(u).timestamp??"Unknown")]),f(v,b)};Q(ie,v=>{a(u)&&v(de)})}r(K),r(G),r(n),be("change",le,ae),f(e,n)}});var re=l(z,2);we(re,{title:"Confirm Restore",message:"This will overwrite existing data with the backup contents. This action cannot be undone. Are you sure?",confirmLabel:"Restore",confirmVariant:"danger",onconfirm:te,get open(){return a(x)},set open(e){t(x,e,!0)}}),f(X,V),ue()}me(["change"]);export{Ue as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{p as bt,d as p,M as yt,w as pe,g as e,b as t,a as Nt,u as T,c as l,s as o,r as n,ae as B,t as P,f as G}from"../chunks/BdTBlfLy.js";import{s as C}from"../chunks/DtZk82gG.js";import{t as D,a as d,f,c as Pt}from"../chunks/DEELgv7K.js";import{i as E}from"../chunks/Y22E1hJM.js";import{a as ge,t as V,b as ze,e as $t}from"../chunks/BEW7Ez_g.js";import{a as wt,b as ue}from"../chunks/CoI6jjbg.js";import{s as kt,a as xt}from"../chunks/Cp8V0Xy2.js";import{g as Le}from"../chunks/CrOZMmdF.js";import{b as me}from"../chunks/Cw6OYcq-.js";import{P as Ct}from"../chunks/B8s_s9QY.js";import{d as Dt}from"../chunks/Q2nPFxS6.js";import{B as z}from"../chunks/C72lTcG0.js";import{I as L}from"../chunks/_teD5ji5.js";import{d as Et}from"../chunks/CaVKAiCe.js";import{s as Re}from"../chunks/BvHnF5tV.js";var St=f('<div class="create-error svelte-gjmjph"> </div>'),It=f('<div class="readonly-banner svelte-gjmjph">Creating database blocks requires dev mode. Start <code class="svelte-gjmjph">pnpm dev</code> to enable schema edits and Neon helpers.</div>'),Bt=f('<!> <p class="field-help svelte-gjmjph">Only change this if you already use a specific env key name.</p>',1),Ot=f("<option> </option>"),Kt=f("<option> </option>"),Tt=f('<p class="field-help field-help--error svelte-gjmjph"> </p>'),zt=f('<p class="field-help svelte-gjmjph">No existing Neon projects were found.</p>'),Lt=f('<p class="field-help svelte-gjmjph">EdgeBase will use the selected project and write the env key above.</p>'),Rt=f('<div class="field-group field-group--helper svelte-gjmjph"><label class="field-label svelte-gjmjph" for="recommended-postgres-env-key">Automatic Postgres Env Key</label> <div id="recommended-postgres-env-key" class="field-static-display svelte-gjmjph"><code class="svelte-gjmjph"> </code></div> <p class="field-help svelte-gjmjph">EdgeBase will write this key into config automatically. Only override it if you already use a specific env key name.</p> <div class="helper-actions svelte-gjmjph"><!></div> <!></div> <div class="field-group field-group--helper neon-helper svelte-gjmjph"><div class="neon-helper__intro svelte-gjmjph"><div class="field-label svelte-gjmjph">Neon Setup (Optional)</div> <p class="field-help svelte-gjmjph">Need Neon right now? Pick one shortcut below. If you already have a connection string, skip this section and use <strong>Create Database</strong>.</p></div> <div class="neon-helper__grid svelte-gjmjph"><section class="neon-helper__option svelte-gjmjph"><div class="neon-helper__option-header svelte-gjmjph"><div class="neon-helper__eyebrow svelte-gjmjph">Existing project</div> <h3 class="neon-helper__option-title svelte-gjmjph">1. Connect an existing Neon project</h3> <p class="field-help svelte-gjmjph">Best when the Neon project already exists in your account.</p></div> <label class="field-label svelte-gjmjph" for="existing-neon-project">Existing Neon Project</label> <select id="existing-neon-project" class="field-select svelte-gjmjph"><!></select> <div class="helper-actions helper-actions--compact svelte-gjmjph"><!></div> <!> <div class="helper-actions neon-helper__primary-actions svelte-gjmjph"><!></div></section> <section class="neon-helper__option svelte-gjmjph"><div class="neon-helper__option-header svelte-gjmjph"><div class="neon-helper__eyebrow svelte-gjmjph">Provision new project</div> <h3 class="neon-helper__option-title svelte-gjmjph">2. Create a new Neon project</h3> <p class="field-help svelte-gjmjph">Best when you want EdgeBase to provision Neon for this block.</p></div> <!> <p class="field-help svelte-gjmjph">EdgeBase will try this name first, then append a suffix if Neon already has one.</p> <div class="helper-actions neon-helper__primary-actions svelte-gjmjph"><!></div></section></div></div>',1),Mt=f('<div class="field-group svelte-gjmjph"><label class="field-label svelte-gjmjph" for="db-provider">Provider</label> <select id="db-provider" class="field-select svelte-gjmjph"><option>D1 (default)</option><option>Durable Object</option><option>Postgres</option></select></div> <!>',1),At=f('<div class="field-group svelte-gjmjph"><label class="field-label svelte-gjmjph" for="dynamic-provider">Provider</label> <input id="dynamic-provider" class="field-static svelte-gjmjph" value="Durable Object" disabled=""/> <p class="field-help svelte-gjmjph">Per-tenant DB blocks always use Durable Objects for physical isolation.</p></div> <!> <!> <!>',1),qt=f('<div class="create-page svelte-gjmjph"><!> <!> <div class="create-card svelte-gjmjph"><!> <div class="field-group svelte-gjmjph"><label class="field-label svelte-gjmjph" for="db-topology">Type</label> <select id="db-topology" class="field-select svelte-gjmjph"><option>Single DB</option><option>Per-tenant DB</option></select> <p class="field-help svelte-gjmjph"><!></p></div> <!></div> <div class="create-actions svelte-gjmjph"><a><!></a> <!></div></div>');function sa(Me,Ae){bt(Ae,!0);const qe=()=>xt(Et,"$devInfoStore",Fe),[Fe,Ue]=kt();let c=p(""),m=p("single"),h=p("d1"),R=p(""),X=p(""),Y=p(""),ee=p(""),te=p(!1),S=p(null),g=p(""),$=p(!1),H=p(""),I=p(yt([])),b=p(!1),ae=p(!1),M=p(""),O=p(""),w=T(()=>qe().devMode);function Z(i){const y=i.trim().toUpperCase().replace(/[^A-Z0-9_]+/g,"_");return y?`DB_POSTGRES_${y}_URL`:"DB_POSTGRES_APP_URL"}function he(i){return i.trim().toLowerCase().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-")||"edgebase-db"}function W(){return e($)?e(R).trim()||Z(e(c)):Z(e(c))}function re(){return e(H).trim()||he(e(c))}function fe(){const i=e(c).trim();return i?/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(i)?e(m)==="single"&&e(h)==="postgres"&&!W()?(t(g,"Connection string env key is required for postgres."),!1):(e(m)==="single"&&e(h)==="postgres"&&e(S)==="create"&&re(),t(g,""),!0):(t(g,"Database block name must start with a letter or underscore."),!1):(t(g,"Database block name is required."),!1)}async function _e(i=!1){var y;if(e(w)&&!(!i&&(e(ae)||e(b)||e(h)!=="postgres"))){t(b,!0),t(M,"");try{const k=await ge.schemaMutation(i?"integrations/neon/projects?refresh=1":"integrations/neon/projects",{method:"GET"});t(I,k.items??[],!0),t(O,((y=e(I)[0])==null?void 0:y.projectId)??"",!0),t(ae,!0)}catch(k){t(M,k instanceof Error?k.message:"Failed to load Neon projects.",!0)}finally{t(b,!1)}}}pe(()=>{e(w)&&e(m)==="single"&&e(h)==="postgres"&&!e(ae)&&!e(b)&&_e()}),pe(()=>{(e(m)!=="single"||e(h)!=="postgres")&&t($,!1)}),pe(()=>{(e(h)!=="postgres"||e(m)!=="single")&&t(H,"")});function Ge(){t($,!e($)),e($)&&!e(R).trim()&&t(R,Z(e(c)),!0)}async function He(){if(!e(w)){t(g,"Creating database blocks requires dev mode with the schema sidecar. Start `pnpm dev` and try again."),V(e(g));return}if(fe()){t(te,!0);try{await ge.schemaMutation("schema/databases",{method:"POST",body:{name:e(c).trim(),topology:e(m),provider:e(m)==="single"?e(h):"do",connectionString:e(m)==="single"&&e(h)==="postgres"?W():void 0,targetLabel:e(X).trim()||void 0,placeholder:e(Y).trim()||void 0,helperText:e(ee).trim()||void 0}}),await Re.waitForNamespaceReady(e(c).trim(),{timeoutMessage:`Database block "${e(c).trim()}" is still syncing. Please try again in a moment.`}),ze(`Database block "${e(c).trim()}" created`),Le(`${me}/database/tables/new?dbKey=${encodeURIComponent(e(c).trim())}`)}catch(i){t(g,i instanceof Error?i.message:"Failed to create database block.",!0),V(e(g))}finally{t(te,!1)}}}async function je(i){if(!e(w)){t(g,"Neon helpers require dev mode with the schema sidecar. Start `pnpm dev` and try again."),V(e(g));return}if(e(m)!=="single"){t(g,"Neon helper only supports single database blocks.");return}if(e(h)!=="postgres"&&t(h,"postgres"),i==="create"&&re(),!!fe()){if(i==="reuse"&&!e(O)){t(g,e(M)||"Choose an existing Neon project first, or create a new one.",!0);return}t(S,i,!0);try{await ge.schemaMutation("integrations/neon/databases",{method:"POST",body:{name:e(c).trim(),topology:"single",projectId:i==="reuse"?e(O):void 0,projectName:i==="create"?re():void 0,mode:i,...e($)?{envKey:W()}:{}}}),await Re.waitForNamespaceReady(e(c).trim(),{timeoutMessage:`Database block "${e(c).trim()}" is still syncing. Please try again in a moment.`}),ze(`Database block "${e(c).trim()}" connected to Neon`),Le(`${me}/database/tables/new?dbKey=${encodeURIComponent(e(c).trim())}`)}catch(y){t(g,y instanceof Error?y.message:"Failed to connect with Neon.",!0),V(e(g))}finally{t(S,null)}}}function Ze(){return!e(b)&&e(I).length>0&&!!e(O)}Ct(Me,{title:"Create Database",description:"Add a new DB block to edgebase.config.ts",get docsHref(){return Dt},children:(i,y)=>{var k=qt(),be=l(k);{var We=r=>{var v=St(),_=l(v,!0);n(v),P(()=>C(_,e(g))),d(r,v)};E(be,r=>{e(g)&&r(We)})}var ye=o(be,2);{var Je=r=>{var v=It();d(r,v)};E(ye,r=>{e(w)||r(Je)})}var oe=o(ye,2),Ne=l(oe);L(Ne,{label:"Database Block Name",placeholder:"app",get value(){return e(c)},set value(r){t(c,r,!0)}});var se=o(Ne,2),J=o(l(se),2),le=l(J);le.value=le.__value="single";var Pe=o(le);Pe.value=Pe.__value="dynamic",n(J);var $e=o(J,2),Qe=l($e);{var Ve=r=>{var v=D("One database shared by the whole app.");d(r,v)},Xe=r=>{var v=D("One isolated database per target ID.");d(r,v)};E(Qe,r=>{e(m)==="single"?r(Ve):r(Xe,!1)})}n($e),n(se);var Ye=o(se,2);{var et=r=>{var v=Mt(),_=G(v),x=o(l(_),2),A=l(x);A.value=A.__value="d1";var N=o(A);N.value=N.__value="do";var ke=o(N);ke.value=ke.__value="postgres",n(x),n(_);var ot=o(_,2);{var st=q=>{var xe=Rt(),ne=G(xe),ie=o(l(ne),2),Ce=l(ie),lt=l(Ce,!0);n(Ce),n(ie);var de=o(ie,4),nt=l(de);z(nt,{variant:"ghost",onclick:Ge,children:(a,s)=>{B();var u=D();P(()=>C(u,e($)?"Hide Env Key Override":"Customize Env Key")),d(a,u)},$$slots:{default:!0}}),n(de);var it=o(de,2);{var dt=a=>{var s=Bt(),u=G(s);{let j=T(()=>Z(e(c)));L(u,{label:"Custom Connection String Env Key",get placeholder(){return e(j)},get value(){return e(R)},set value(K){t(R,K,!0)}})}B(2),d(a,s)};E(it,a=>{e($)&&a(dt)})}n(ne);var De=o(ne,2),Ee=o(l(De),2),ce=l(Ee),F=o(l(ce),4),ct=l(F);{var vt=a=>{var s=Ot(),u=l(s,!0);n(s),s.value=s.__value="",P(()=>C(u,e(b)?"Loading Neon projects...":"No Neon projects found")),d(a,s)},pt=a=>{var s=Pt(),u=G(s);$t(u,17,()=>e(I),j=>j.projectId,(j,K)=>{var U=Kt(),jt=l(U);n(U);var Te={};P(()=>{C(jt,`${e(K).projectName??""} (${e(K).orgName??""})`),Te!==(Te=e(K).projectId)&&(U.value=(U.__value=e(K).projectId)??"")}),d(j,U)}),d(a,s)};E(ct,a=>{e(I).length===0?a(vt):a(pt,!1)})}n(F);var ve=o(F,2),gt=l(ve);z(gt,{variant:"ghost",onclick:()=>_e(!0),get loading(){return e(b)},children:(a,s)=>{B();var u=D("Refresh Projects");d(a,u)},$$slots:{default:!0}}),n(ve);var Se=o(ve,2);{var ut=a=>{var s=Tt(),u=l(s,!0);n(s),P(()=>C(u,e(M))),d(a,s)},mt=a=>{var s=zt();d(a,s)},ht=a=>{var s=Lt();d(a,s)};E(Se,a=>{e(M)?a(ut):!e(b)&&e(I).length===0?a(mt,1):e(b)||a(ht,2)})}var Ie=o(Se,2),ft=l(Ie);{let a=T(()=>!e(w)||!Ze()||e(S)!==null);z(ft,{variant:"secondary",get disabled(){return e(a)},onclick:()=>je("reuse"),children:(s,u)=>{B();var j=D();P(()=>C(j,e(S)==="reuse"?"Connecting Existing Neon...":"Connect Existing Neon")),d(s,j)},$$slots:{default:!0}})}n(Ie),n(ce);var Be=o(ce,2),Oe=o(l(Be),2);{let a=T(()=>he(e(c)));L(Oe,{label:"New Neon Project Name",get placeholder(){return e(a)},get value(){return e(H)},set value(s){t(H,s,!0)}})}var Ke=o(Oe,4),_t=l(Ke);{let a=T(()=>!e(w)||e(S)!==null);z(_t,{variant:"secondary",get disabled(){return e(a)},onclick:()=>je("create"),children:(s,u)=>{B();var j=D();P(()=>C(j,e(S)==="create"?"Creating Neon Project...":"Create New Neon Project")),d(s,j)},$$slots:{default:!0}})}n(Ke),n(Be),n(Ee),n(De),P(a=>{C(lt,a),F.disabled=e(b)||e(I).length===0},[W]),ue(F,()=>e(O),a=>t(O,a)),d(q,xe)};E(ot,q=>{e(h)==="postgres"&&q(st)})}ue(x,()=>e(h),q=>t(h,q)),d(r,v)},tt=r=>{var v=At(),_=o(G(v),2);L(_,{label:"Target Label",placeholder:"Workspace",get value(){return e(X)},set value(N){t(X,N,!0)}});var x=o(_,2);L(x,{label:"Target ID Placeholder",placeholder:"Enter workspace ID",get value(){return e(Y)},set value(N){t(Y,N,!0)}});var A=o(x,2);L(A,{label:"Helper Text",placeholder:"Pick a workspace or enter an ID.",get value(){return e(ee)},set value(N){t(ee,N,!0)}}),d(r,v)};E(Ye,r=>{e(m)==="single"?r(et):r(tt,!1)})}n(oe);var we=o(oe,2),Q=l(we),at=l(Q);z(at,{variant:"secondary",children:(r,v)=>{B();var _=D("Cancel");d(r,_)},$$slots:{default:!0}}),n(Q);var rt=o(Q,2);{let r=T(()=>!e(w));z(rt,{variant:"primary",get loading(){return e(te)},get disabled(){return e(r)},onclick:He,children:(v,_)=>{B();var x=D("Create Database");d(v,x)},$$slots:{default:!0}})}n(we),n(k),P(()=>wt(Q,"href",`${me??""}/database/tables`)),ue(J,()=>e(m),r=>t(m,r)),d(i,k)}}),Nt(),Ue()}export{sa as component};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/lSpxLU5p.js","../chunks/CWj6FrbW.js","../chunks/Bn2NtlTj.js","../chunks/BdTBlfLy.js","../chunks/DEELgv7K.js","../chunks/CGgVJi7f.js","../chunks/F9_4wRrd.js","../chunks/Cp8V0Xy2.js","../chunks/gtu8uwJD.js","../assets/SqlEditor.Bbp1RIk0.css"])))=>i.map(i=>d[i]);
2
- import{_ as $e,c as Se}from"../chunks/B2bEC_Hm.js";import"../chunks/CWj6FrbW.js";import{o as Ce}from"../chunks/Bn2NtlTj.js";import{p as De,d as E,M as Le,w as Me,g as e,b as v,a as Oe,u as P,c as n,s as u,r,ae as Pe,t as h,f as Y,ag as Te}from"../chunks/BdTBlfLy.js";import{d as ke,s as w,a as Ie}from"../chunks/DtZk82gG.js";import{i as M}from"../chunks/Y22E1hJM.js";import{e as O,i as T,t as Z,a as Ne}from"../chunks/BEW7Ez_g.js";import{t as Qe,a as i,c as ee,f as c}from"../chunks/DEELgv7K.js";import{b as Re}from"../chunks/CoI6jjbg.js";import{b as Be}from"../chunks/CYatlt7w.js";import{s as Fe,a as W}from"../chunks/Cp8V0Xy2.js";import{s as ae,n as Ke,a as je}from"../chunks/BvHnF5tV.js";import{P as He}from"../chunks/B8s_s9QY.js";import{B as Ae}from"../chunks/C72lTcG0.js";import{e as Ue}from"../chunks/Q2nPFxS6.js";var Ve=c("<option> </option>"),We=c('<span class="sql-page__dynamic-warn svelte-1wdt0zf">Dynamic namespace — use table Query tab</span>'),Ge=c('<span class="sql-page__shortcut svelte-1wdt0zf"></span>'),Je=c('<textarea class="sql-page__textarea svelte-1wdt0zf" placeholder="SELECT * FROM table_name LIMIT 100;" rows="6"></textarea>'),Xe=c('<span class="sql-page__result-error svelte-1wdt0zf"> </span>'),Ye=c('<span class="sql-page__result-meta svelte-1wdt0zf"> </span>'),Ze=c('<th class="svelte-1wdt0zf"> </th>'),ea=c('<td class="svelte-1wdt0zf"> </td>'),aa=c('<tr class="svelte-1wdt0zf"></tr>'),ta=c('<div class="sql-page__table-wrap svelte-1wdt0zf"><table class="sql-page__table svelte-1wdt0zf"><thead><tr></tr></thead><tbody></tbody></table></div>'),sa=c('<div class="sql-page__result svelte-1wdt0zf"><div class="sql-page__result-header svelte-1wdt0zf"><code class="sql-page__result-sql svelte-1wdt0zf"> </code> <!></div> <!></div>'),ra=c('<div class="sql-page svelte-1wdt0zf"><div class="sql-page__toolbar svelte-1wdt0zf"><div class="sql-page__ns svelte-1wdt0zf"><label for="ns-select" class="svelte-1wdt0zf">Database</label> <select id="ns-select" class="svelte-1wdt0zf"></select></div> <!> <!></div> <div class="sql-page__editor svelte-1wdt0zf"><!></div> <!></div>');function ba(te,se){De(se,!0);const re=()=>W(Ke,"$namespaceNames",k),oe=()=>W(je,"$namespaceDefs",k),le=()=>W(ae,"$schemaStore",k),[k,ne]=Fe();let p=E("SELECT name FROM sqlite_master WHERE type='table';"),$=E(!1),b=E(Le([])),y=E(0),S=P(re),q=E("shared");Me(()=>{e(S).length>0&&!e(S).includes(e(q))&&v(q,e(S).includes("shared")?"shared":e(S)[0],!0)});let I=P(()=>{var f;return!!((f=oe()[e(q)])!=null&&f.dynamic)}),N=E(null),ie=P(()=>(()=>{const s={},f=le().schema;for(const[C,D]of Object.entries(f)){const x=D.fields;s[C]=x?Object.keys(x):[]}return s})());Ce(async()=>{ae.loadSchema({silent:!0});try{const s=await $e(()=>import("../chunks/lSpxLU5p.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url);v(N,s.default,!0)}catch{}});async function Q(){if(e(p).trim()){if(e(I)){Z("Dynamic namespaces require a target instance. Use the Query tab on a specific table instead.");return}v($,!0);try{const s=await Ne.fetch("data/sql",{method:"POST",body:{namespace:e(q),sql:e(p).trim()}});v(y,e(y)+1),v(b,[{id:e(y),sql:e(p).trim(),columns:s.columns??[],rows:s.rows??[],rowCount:s.rowCount??0,time:s.time??0},...e(b)],!0)}catch(s){const f=s instanceof Error?s.message:"Query failed";Z(f),v(y,e(y)+1),v(b,[{id:e(y),sql:e(p).trim(),columns:[],rows:[],rowCount:0,time:0,error:f},...e(b)],!0)}finally{v($,!1)}}}function ce(s){(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&(s.preventDefault(),Q())}He(te,{title:"SQL Console",description:"Execute SQL queries against your databases",get docsHref(){return Ue},children:(s,f)=>{var C=ra(),D=n(C),x=n(D),R=u(n(x),2);O(R,21,()=>e(S),T,(a,t)=>{var o=Ve(),m=n(o,!0);r(o);var l={};h(()=>{w(m,e(t)),l!==(l=e(t))&&(o.value=(o.__value=e(t))??"")}),i(a,o)}),r(R),r(x);var G=u(x,2);{let a=P(()=>e($)||!e(p).trim()||e(I));Ae(G,{variant:"primary",size:"sm",onclick:Q,get loading(){return e($)},get disabled(){return e(a)},children:(t,o)=>{Pe();var m=Qe();h(()=>w(m,e($)?"Executing...":"Execute")),i(t,m)},$$slots:{default:!0}})}var de=u(G,2);{var ve=a=>{var t=We();i(a,t)},me=a=>{var o;var t=Ge();t.textContent=`${typeof navigator<"u"&&((o=navigator.platform)!=null&&o.includes("Mac"))?"⌘":"Ctrl"}+Enter`,i(a,t)};M(de,a=>{e(I)?a(ve):a(me,!1)})}r(D);var B=u(D,2),_e=n(B);{var pe=a=>{var t=ee(),o=Y(t);Se(o,()=>e(N),(m,l)=>{l(m,{get value(){return e(p)},onchange:L=>v(p,L,!0),onExecute:Q,placeholder:"SELECT * FROM table_name LIMIT 100;",get schema(){return e(ie)}})}),i(a,t)},fe=a=>{var t=Je();Te(t),Ie("keydown",t,ce),Be(t,()=>e(p),o=>v(p,o)),i(a,t)};M(_e,a=>{e(N)?a(pe):a(fe,!1)})}r(B);var ue=u(B,2);{var ge=a=>{var t=ee(),o=Y(t);O(o,17,()=>e(b),m=>m.id,(m,l)=>{var L=sa(),F=n(L),K=n(F),he=n(K,!0);r(K);var we=u(K,2);{var be=_=>{var d=Xe(),z=n(d,!0);r(d),h(()=>w(z,e(l).error)),i(_,d)},ye=_=>{var d=Ye(),z=n(d);r(d),h(()=>w(z,`${e(l).rowCount??""} rows · ${e(l).time??""}ms`)),i(_,d)};M(we,_=>{e(l).error?_(be):_(ye,!1)})}r(F);var qe=u(F,2);{var xe=_=>{var d=ta(),z=n(d),j=n(z),J=n(j);O(J,21,()=>e(l).columns,T,(H,A)=>{var g=Ze(),U=n(g,!0);r(g),h(()=>w(U,e(A))),i(H,g)}),r(J),r(j);var X=u(j);O(X,21,()=>e(l).rows,T,(H,A)=>{var g=aa();O(g,21,()=>e(l).columns,T,(U,ze)=>{var V=ea(),Ee=n(V,!0);r(V),h(()=>w(Ee,e(A)[e(ze)]??"null")),i(U,V)}),r(g),i(H,g)}),r(X),r(z),r(d),i(_,d)};M(qe,_=>{!e(l).error&&e(l).columns.length>0&&_(xe)})}r(L),h(()=>w(he,e(l).sql)),i(m,L)}),i(a,t)};M(ue,a=>{e(b).length>0&&a(ge)})}r(C),Re(R,()=>e(q),a=>v(q,a)),i(s,C)}}),Oe(),ne()}ke(["keydown"]);export{ba as component};
@@ -1 +0,0 @@
1
- import{_ as m}from"../chunks/DPdQ7z0T.js";export{m as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as Ae,g as U}from"../chunks/Bn2NtlTj.js";import{p as Me,d as c,M as G,t as y,g as a,a as Ne,c as o,b as r,s as i,r as l,ae as H,u as p}from"../chunks/BdTBlfLy.js";import{s as E}from"../chunks/DtZk82gG.js";import{i as k}from"../chunks/Y22E1hJM.js";import{e as we,i as Ie,t as J,a as Ee,b as ke}from"../chunks/BEW7Ez_g.js";import{a as m,f,t as Q}from"../chunks/DEELgv7K.js";import{b as Fe,a as F}from"../chunks/CoI6jjbg.js";import{s as De,a as V}from"../chunks/Cp8V0Xy2.js";import{g as Le}from"../chunks/CrOZMmdF.js";import{b as W}from"../chunks/Cw6OYcq-.js";import{p as qe}from"../chunks/B6MschND.js";import{s as Y,n as ee}from"../chunks/BvHnF5tV.js";import{d as Be}from"../chunks/CaVKAiCe.js";import{C as Ke,S as Pe,L as ae}from"../chunks/Cdm5zBRA.js";import{B as te}from"../chunks/C72lTcG0.js";import{I as re}from"../chunks/_teD5ji5.js";var Oe=f('<div class="create-error svelte-10791bh"> </div>'),ze=f('<div class="readonly-banner svelte-10791bh">Creating tables requires dev mode. Start <code class="svelte-10791bh">pnpm dev</code> to enable schema edits.</div>'),Re=f("<option> </option>"),Xe=f("<option> </option>"),Ze=f('<div class="create-page svelte-10791bh"><h2 class="create-title svelte-10791bh">Create Table</h2> <p class="create-desc svelte-10791bh">Define a new database table</p> <div class="create-form svelte-10791bh"><!> <!> <div class="create-section svelte-10791bh"><div class="create-row svelte-10791bh"><div class="create-field svelte-10791bh"><label class="create-label svelte-10791bh">Database</label> <div class="ns-select svelte-10791bh"><select class="ns-dropdown svelte-10791bh"><!><!></select> <!></div></div> <div class="create-field svelte-10791bh"><!></div></div></div> <div class="create-section svelte-10791bh"><div class="auto-fields-info svelte-10791bh">Auto-managed fields (id, createdAt, updatedAt) are automatically included.</div> <!></div> <div class="create-actions svelte-10791bh"><a><!></a> <!></div></div> <!></div>');function na(se,oe){Me(oe,!0);const le=()=>V(Be,"$devInfoStore",D),ie=()=>V(ee,"$namespaceNames",D),[D,ne]=De();let n=c(""),h=c(""),v=c(G({})),x=c(!1),d=c(""),_=p(()=>le().devMode),g=c(!1),S=c("create"),T=c(""),C=c(G({type:"string"}));const L=`create-table-namespace-${Math.random().toString(36).slice(2,9)}`;let q=p(ie);Ae(async()=>{var s;await Y.loadSchema();const e=(s=U(qe).url.searchParams.get("dbKey"))==null?void 0:s.trim(),t=U(ee);r(n,e||(t.includes("shared")?"shared":t[0]??"shared"),!0)});function de(){r(S,"create"),r(T,""),r(C,{type:"string"},!0),r(g,!0)}function ce(e,t){r(S,"edit"),r(T,e,!0),r(C,{...t},!0),r(g,!0)}function ve(e,t){r(v,{...a(v),[e]:t},!0)}function me(e){const{[e]:t,...s}=a(v);r(v,s,!0)}function ue(){const e=a(h).trim();return e?e.length>ae.TABLE_NAME_MAX?(r(d,`Table name must be ${ae.TABLE_NAME_MAX} chars or less.`),!1):/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e)?!0:(r(d,"Table name must start with a letter or underscore."),!1):(r(d,"Table name is required."),!1)}async function pe(){if(!a(_)){r(d,"Creating tables requires dev mode with the schema sidecar. Start `pnpm dev` and try again."),J(a(d));return}if(!ue())return;r(x,!0),r(d,"");const e=a(n).trim()||"shared",t=a(h).trim();try{await Ee.schemaMutation("schema/tables",{method:"POST",body:{dbKey:e,name:t,schema:a(v)}}),ke(`Table "${t}" created`),await Y.waitForTableReady(t,{namespace:e}),Le(`${W}/database/tables/${encodeURIComponent(t)}`)}catch(s){r(d,s instanceof Error?s.message:"Failed to create table.",!0),J(a(d))}finally{r(x,!1)}}var A=Ze(),M=i(o(A),4),B=o(M);{var be=e=>{var t=Oe(),s=o(t,!0);l(t),y(()=>E(s,a(d))),m(e,t)};k(B,e=>{a(d)&&e(be)})}var K=i(B,2);{var fe=e=>{var t=ze();m(e,t)};k(K,e=>{a(_)||e(fe)})}var N=i(K,2),P=o(N),w=o(P),O=o(w),z=i(O,2),b=o(z),R=o(b);we(R,17,()=>a(q),Ie,(e,t)=>{var s=Re(),u=o(s,!0);l(s);var j={};y(()=>{E(u,a(t)),j!==(j=a(t))&&(s.value=(s.__value=a(t))??"")}),m(e,s)});var he=i(R);{var _e=e=>{var t=Xe(),s=o(t);l(t);var u={};y(()=>{E(s,`${a(n)??""} (new)`),u!==(u=a(n))&&(t.value=(t.__value=a(n))??"")}),m(e,t)},ge=p(()=>!a(q).includes(a(n))&&a(n)!=="default");k(he,e=>{a(ge)&&e(_e)})}l(b);var $e=i(b,2);re($e,{label:"Choose or create a database",placeholder:"Type a new database name...",get value(){return a(n)},set value(e){r(n,e,!0)}}),l(z),l(w);var X=i(w,2),ye=o(X);re(ye,{label:"Table Name",placeholder:"my_table",get value(){return a(h)},set value(e){r(h,e,!0)}}),l(X),l(P),l(N);var I=i(N,2),xe=i(o(I),2);{let e=p(()=>!a(_));Ke(xe,{get fields(){return a(v)},get readonly(){return a(e)},onaddclick:de,oneditclick:ce,ondeleteclick:me})}l(I);var Z=i(I,2),$=o(Z),Se=o($);te(Se,{variant:"secondary",children:(e,t)=>{H();var s=Q("Cancel");m(e,s)},$$slots:{default:!0}}),l($);var Te=i($,2);{let e=p(()=>!a(_));te(Te,{variant:"primary",get loading(){return a(x)},get disabled(){return a(e)},onclick:pe,children:(t,s)=>{H();var u=Q("Create Table");m(t,u)},$$slots:{default:!0}})}l(Z),l(M);var Ce=i(M,2);{let e=p(()=>Object.keys(a(v)));Pe(Ce,{get mode(){return a(S)},get columnName(){return a(T)},get field(){return a(C)},get existingColumns(){return a(e)},onsave:ve,get open(){return a(g)},set open(t){r(g,t,!0)}})}l(A),y(()=>{F(O,"for",L),F(b,"id",L),F($,"href",`${W??""}/database/tables`)}),Fe(b,()=>a(n),e=>r(n,e)),m(se,A),Ne(),ne()}export{na as component};
@@ -1,2 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as He}from"../chunks/Bn2NtlTj.js";import{p as Oe,d as y,M as he,a as De,b as n,c as s,s as r,r as t,g as e,t as w,f as ge,ae as Fe,ag as xe}from"../chunks/BdTBlfLy.js";import{d as Ie,s as d,a as Ne}from"../chunks/DtZk82gG.js";import{i as z}from"../chunks/Y22E1hJM.js";import{a as Pe,t as ve,e as te,i as se}from"../chunks/BEW7Ez_g.js";import{a as f,c as Be,t as je,f as _}from"../chunks/DEELgv7K.js";import{a as ae,b as Ce,s as ce}from"../chunks/CoI6jjbg.js";import{b as ye}from"../chunks/CYatlt7w.js";import{P as Je}from"../chunks/B8s_s9QY.js";import{f as Me}from"../chunks/Q2nPFxS6.js";import{B as Ae}from"../chunks/C72lTcG0.js";import{E as Ge}from"../chunks/m9eWh0Cd.js";var Re=_('<div class="fn-empty svelte-1gs6rhm">Loading...</div>'),Ke=_('<div class="fn-empty svelte-1gs6rhm">No functions registered</div>'),Ve=_('<span class="fn-method-badge svelte-1gs6rhm"> </span>'),ze=_('<button><span class="fn-item__path svelte-1gs6rhm"> </span> <div class="fn-item__meta svelte-1gs6rhm"><!> <span class="fn-type-badge svelte-1gs6rhm"> </span></div></button>'),Le=_("<option> </option>"),Ue=_('<div class="fn-field svelte-1gs6rhm"><label class="fn-label svelte-1gs6rhm">Request Body (JSON)</label> <textarea class="fn-textarea svelte-1gs6rhm" rows="6" spellcheck="false"></textarea></div>'),Xe=_('<div class="fn-response svelte-1gs6rhm"><div class="fn-response__header svelte-1gs6rhm"><span> </span> <span class="fn-time svelte-1gs6rhm"> </span></div> <pre class="fn-response__body svelte-1gs6rhm"> </pre></div>'),Qe=_('<div class="fn-history__item svelte-1gs6rhm"><span class="fn-history__method svelte-1gs6rhm"> </span> <span class="fn-history__path svelte-1gs6rhm"> </span> <span> </span> <span class="fn-history__time svelte-1gs6rhm"> </span></div>'),We=_('<div class="fn-history svelte-1gs6rhm"><span class="fn-history__title svelte-1gs6rhm">Recent Executions</span> <!></div>'),Ye=_('<div class="fn-exec svelte-1gs6rhm"><div class="fn-exec__header svelte-1gs6rhm"><code class="fn-path svelte-1gs6rhm"> </code></div> <div class="fn-exec__controls svelte-1gs6rhm"><select class="fn-select svelte-1gs6rhm"></select> <!></div> <!> <div class="fn-field svelte-1gs6rhm"><label class="fn-label svelte-1gs6rhm">Custom Headers (one per line: Key: Value)</label> <textarea class="fn-textarea fn-textarea--sm svelte-1gs6rhm" rows="3" spellcheck="false" placeholder="X-Custom: value"></textarea></div></div> <!> <!>',1),Ze=_('<div class="fn-layout svelte-1gs6rhm"><div class="fn-sidebar svelte-1gs6rhm"><div class="fn-sidebar__header svelte-1gs6rhm"><span class="fn-sidebar__title svelte-1gs6rhm">Functions</span> <span class="fn-sidebar__count svelte-1gs6rhm"> </span></div> <!></div> <div class="fn-main svelte-1gs6rhm"><!></div></div>');function mt(be,Ee){Oe(Ee,!0);let P=y(he([])),de=y(!0),b=y(null),h=y("POST"),H=y("{}"),L=y(""),B=y(!1);const fe=`function-request-body-${Math.random().toString(36).slice(2,9)}`,me=`function-request-headers-${Math.random().toString(36).slice(2,9)}`;let c=y(null),U=y(he([]));He(async()=>{try{const m=await Pe.fetch("data/functions");n(P,m.functions??[],!0)}catch(m){ve(m instanceof Error?m.message:"Failed to load functions"),n(P,[],!0)}finally{n(de,!1)}});function Se(m){n(b,m,!0),n(h,m.methods[0]||"POST",!0),n(H,e(h)==="GET"?"":"{}",!0),n(c,null)}async function $e(){if(!e(b))return;n(B,!0),n(c,null);const m=Date.now();try{const j=`/api/functions/${e(b).path}`,E={"Content-Type":"application/json"};if(e(L).trim())for(const T of e(L).split(`
2
- `)){const g=T.trim();if(!g)continue;const D=g.indexOf(":");if(D===-1){ve(`Invalid header format: "${g}". Use "Key: Value" format.`),n(B,!1);return}const Q=g.slice(0,D).trim(),re=g.slice(D+1).trim();Q&&(E[Q]=re)}const O={method:e(h),headers:E};if(e(h)!=="GET"&&e(h)!=="HEAD"&&e(H).trim()){try{JSON.parse(e(H))}catch{ve('Invalid JSON in request body. Example: {"key": "value"}'),n(B,!1);return}O.body=e(H)}const p=await fetch(j,O),C=Date.now()-m;let J;if((p.headers.get("content-type")||"").includes("json")){const T=await p.json();J=JSON.stringify(T,null,2)}else J=await p.text();const X={};p.headers.forEach((T,g)=>{X[g]=T}),n(c,{status:p.status,statusText:p.statusText,body:J,time:C,headers:X},!0),n(U,[{fn:e(b).path,method:e(h),status:p.status,time:C,timestamp:new Date().toISOString()},...e(U).slice(0,19)],!0)}catch(j){const E=Date.now()-m;n(c,{status:0,statusText:"Network Error",body:j instanceof Error?j.message:"Request failed",time:E,headers:{}},!0)}finally{n(B,!1)}}Je(be,{title:"Functions",description:"Execute and test your App Functions",get docsHref(){return Me},children:(m,j)=>{var E=Ze(),O=s(E),p=s(O),C=r(s(p),2),J=s(C,!0);t(C),t(p);var ue=r(p,2);{var X=o=>{var x=Re();f(o,x)},T=o=>{var x=Ke();f(o,x)},g=o=>{var x=Be(),M=ge(x);te(M,17,()=>e(P),se,(A,S)=>{var q=ze();let F;var $=s(q),ne=s($);t($);var G=r($,2),W=s(G);te(W,17,()=>e(S).methods,se,(k,Z)=>{var K=Ve(),oe=s(K,!0);t(K),w(()=>d(oe,e(Z))),f(k,K)});var R=r(W,2),Y=s(R,!0);t(R),t(G),t(q),w(()=>{var k;F=ce(q,1,"fn-item svelte-1gs6rhm",null,F,{"fn-item--active":((k=e(b))==null?void 0:k.path)===e(S).path}),d(ne,`/${e(S).path??""}`),d(Y,e(S).type)}),Ne("click",q,()=>Se(e(S))),f(A,q)}),f(o,x)};z(ue,o=>{e(de)?o(X):e(P).length===0?o(T,1):o(g,!1)})}t(O);var D=r(O,2),Q=s(D);{var re=o=>{Ge(o,{title:"Select a function",description:"Choose a function from the list to execute it."})},ke=o=>{var x=Ye(),M=ge(x),A=s(M),S=s(A),q=s(S);t(S),t(A);var F=r(A,2),$=s(F);te($,21,()=>e(b).methods,se,(a,l)=>{var i=Le(),u=s(i,!0);t(i);var v={};w(()=>{d(u,e(l)),v!==(v=e(l))&&(i.value=(i.__value=e(l))??"")}),f(a,i)}),t($);var ne=r($,2);Ae(ne,{variant:"primary",size:"sm",onclick:$e,get loading(){return e(B)},children:(a,l)=>{Fe();var i=je("Execute");f(a,i)},$$slots:{default:!0}}),t(F);var G=r(F,2);{var W=a=>{var l=Ue(),i=s(l),u=r(i,2);xe(u),t(l),w(()=>{ae(i,"for",fe),ae(u,"id",fe)}),ye(u,()=>e(H),v=>n(H,v)),f(a,l)};z(G,a=>{e(h)!=="GET"&&e(h)!=="HEAD"&&a(W)})}var R=r(G,2),Y=s(R),k=r(Y,2);xe(k),t(R),t(M);var Z=r(M,2);{var K=a=>{var l=Xe(),i=s(l),u=s(i);let v;var V=s(u);t(u);var I=r(u,2),le=s(I);t(I),t(i);var N=r(i,2),ie=s(N,!0);t(N),t(l),w(()=>{v=ce(u,1,"fn-status svelte-1gs6rhm",null,v,{"fn-status--ok":e(c).status>=200&&e(c).status<300,"fn-status--err":e(c).status>=400||e(c).status===0}),d(V,`${e(c).status??""} ${e(c).statusText??""}`),d(le,`${e(c).time??""}ms`),d(ie,e(c).body)}),f(a,l)};z(Z,a=>{e(c)&&a(K)})}var oe=r(Z,2);{var we=a=>{var l=We(),i=r(s(l),2);te(i,17,()=>e(U),se,(u,v)=>{var V=Qe(),I=s(V),le=s(I,!0);t(I);var N=r(I,2),ie=s(N);t(N);var ee=r(N,2);let pe;var Te=s(ee,!0);t(ee);var _e=r(ee,2),qe=s(_e);t(_e),t(V),w(()=>{d(le,e(v).method),d(ie,`/${e(v).fn??""}`),pe=ce(ee,1,"fn-history__status svelte-1gs6rhm",null,pe,{"fn-status--ok":e(v).status>=200&&e(v).status<300,"fn-status--err":e(v).status>=400}),d(Te,e(v).status),d(qe,`${e(v).time??""}ms`)}),f(u,V)}),t(l),f(a,l)};z(oe,a=>{e(U).length>0&&a(we)})}w(()=>{d(q,`/api/functions/${e(b).path??""}`),ae(Y,"for",me),ae(k,"id",me)}),Ce($,()=>e(h),a=>n(h,a)),ye(k,()=>e(L),a=>n(L,a)),f(o,x)};z(Q,o=>{e(b)?o(ke,!1):o(re)})}t(D),t(E),w(()=>d(J,e(P).length)),f(m,E)}}),De()}Ie(["click"]);export{mt as component};
@@ -1,2 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{p as je,w as le,g as e,b as v,t as m,a as De,d as g,u as h,c as r,s as i,r as s,f as D,ae as M}from"../chunks/BdTBlfLy.js";import{s as p,e as Me}from"../chunks/DtZk82gG.js";import{a as l,f as _,t as w,c as Ue}from"../chunks/DEELgv7K.js";import{i as x}from"../chunks/Y22E1hJM.js";import{a as qe}from"../chunks/CoI6jjbg.js";import{a as ne,s as Fe}from"../chunks/Cp8V0Xy2.js";import{g as He}from"../chunks/CrOZMmdF.js";import{p as Ke}from"../chunks/B6MschND.js";import{b as Ne}from"../chunks/Cw6OYcq-.js";import{a as X}from"../chunks/BoOooyH6.js";import{f as Oe,g as We}from"../chunks/pUxw8jfq.js";import{B as ve}from"../chunks/C72lTcG0.js";import{I as de}from"../chunks/_teD5ji5.js";var Ge=_('<div class="login-error svelte-1x05zx6"><p class="login-error__msg svelte-1x05zx6"> </p> <p class="login-error__hint svelte-1x05zx6">If this should be a fresh setup, the UI is not currently connected to the new server instance.</p></div> <!>',1),Je=_('<div class="setup-notice svelte-1x05zx6"><div class="setup-notice__icon svelte-1x05zx6">🛡️</div> <div class="setup-notice__text svelte-1x05zx6"><strong class="svelte-1x05zx6">Admin setup moved to the CLI.</strong> </div></div> <div class="login-recovery svelte-1x05zx6"><p class="login-recovery__title svelte-1x05zx6">Run this once from your project folder</p> <code class="login-recovery__code svelte-1x05zx6"> </code> <p class="login-recovery__hint svelte-1x05zx6">Use the same bootstrap admin email you deployed with. The command only creates the first admin when none exist.</p></div>',1),Qe=_(`<div class="setup-notice svelte-1x05zx6"><div class="setup-notice__icon svelte-1x05zx6">🚀</div> <div class="setup-notice__text svelte-1x05zx6"><strong class="svelte-1x05zx6">Welcome!</strong> This is your first time setting up EdgeBase.
2
- Enter your email and a password below to create the admin account.</div></div>`),Ve=_('<p class="login-error__hint svelte-1x05zx6">Admin password recovery is handled through the CLI. Use the recovery command shown below instead of email reset.</p>'),Xe=_('<div class="login-error svelte-1x05zx6"><p class="login-error__msg svelte-1x05zx6"> </p> <!></div>'),Ye=_('<span class="login-hint svelte-1x05zx6">This will be your admin login password.</span>'),Ze=_('<div class="login-recovery svelte-1x05zx6"><p class="login-recovery__title svelte-1x05zx6">Forgot password?</p> <code class="login-recovery__code svelte-1x05zx6"> </code> <p class="login-recovery__hint svelte-1x05zx6"><!></p></div>'),et=_('<!> <form class="login-form svelte-1x05zx6"><!> <div class="login-field svelte-1x05zx6"><label class="login-label svelte-1x05zx6" for="email"> </label> <!></div> <div class="login-field svelte-1x05zx6"><label class="login-label svelte-1x05zx6" for="password"> </label> <!> <!></div> <!> <!></form>',1),tt=_('<div class="login-page svelte-1x05zx6"><div class="login-card svelte-1x05zx6"><div class="login-header svelte-1x05zx6"><img class="login-logo svelte-1x05zx6" alt="EdgeBase logo"/> <h1 class="login-title svelte-1x05zx6">EdgeBase</h1> <p class="login-subtitle svelte-1x05zx6"><!></p></div> <!></div></div>');function _t(ce,ue){je(ue,!0);const U=()=>ne(Ke,"$page",Y),pe=()=>ne(X,"$authStore",Y),[Y,me]=Fe();let $=g(""),z=g(""),u=g(""),q=g(!1),o=g(null),B=g(!1),C=g(""),Z=g("");function xe(t){return t.hostname==="localhost"||t.hostname==="127.0.0.1"}const _e=h(()=>We(U().url)),ee=h(()=>xe(U().url)),fe=h(()=>e(ee)?"npx edgebase admin reset-password --local":"npx edgebase admin reset-password"),ge=h(()=>`npx edgebase admin bootstrap --url ${U().url.origin} --service-key <service-key>`),he=h(()=>(e(u).toLowerCase().includes("invalid")||e(u).toLowerCase().includes("credentials"))&&e(o)===!1),ye=h(()=>e(o)===!0&&!e(B));le(()=>{pe().accessToken&&He(e(_e),{replaceState:!0})}),le(()=>{te()});async function te(){v(C,""),v(o,null);try{const t=await Oe();v(o,t.needsSetup,!0),v(B,t.publicSetupAllowed??!1,!0),v(Z,t.message??"",!0)}catch{v(C,"Could not reach the admin server. Make sure the fresh dev server is still running, then retry.")}}async function be(t){if(t.preventDefault(),e(o)===null){v(u,e(C)||"Setup status is still loading.",!0);return}if(!e($)||!e(z)){v(u,"Email and password are required.");return}if(e(o)&&!e(B)){v(u,"This deployment requires CLI bootstrap before the admin dashboard can be used.");return}if(e(o)&&e(z).length<8){v(u,"Password must be at least 8 characters.");return}v(u,""),v(q,!0);try{e(o)?await X.setup(e($),e(z)):await X.login(e($),e(z))}catch(n){v(u,n instanceof Error?n.message:"Authentication failed.",!0)}finally{v(q,!1)}}var F=tt(),ae=r(F),H=r(ae),re=r(H),se=i(re,4),we=r(se);{var ze=t=>{var n=w();m(()=>p(n,e(C)?"Admin server unavailable":"Loading...")),l(t,n)},Ce=t=>{var n=w();m(()=>p(n,e(B)?"Create your admin account":"Finish admin bootstrap from the CLI")),l(t,n)},Se=t=>{var n=w("Sign in to Admin Dashboard");l(t,n)};x(we,t=>{e(o)===null?t(ze):e(o)?t(Ce,1):t(Se,!1)})}s(se),s(H);var Le=i(H,2);{var $e=t=>{var n=Ge(),I=D(n),T=r(I),K=r(T,!0);s(T),M(2),s(I);var f=i(I,2);ve(f,{type:"button",variant:"secondary",onclick:()=>void te(),children:(y,b)=>{M();var S=w("Retry Connection");l(y,S)},$$slots:{default:!0}}),m(()=>p(K,e(C))),l(t,n)},Ie=t=>{var n=Ue(),I=D(n);{var T=f=>{var y=Je(),b=D(y),S=i(r(b),2),A=i(r(S));s(S),s(b);var E=i(b,2),R=i(r(E),2),P=r(R,!0);s(R),M(2),s(E),m(()=>{p(A,` ${(e(Z)||"Create the first admin from your project directory so production deployments never expose a public setup form.")??""}`),p(P,e(ge))}),l(f,y)},K=f=>{var y=et(),b=D(y);{var S=a=>{var d=Qe();l(a,d)};x(b,a=>{e(o)&&a(S)})}var A=i(b,2),E=r(A);{var R=a=>{var d=Xe(),c=r(d),G=r(c,!0);s(c);var j=i(c,2);{var J=k=>{var Q=Ve();l(k,Q)};x(j,k=>{e(he)&&k(J)})}s(d),m(()=>p(G,e(u))),l(a,d)};x(E,a=>{e(u)&&a(R)})}var P=i(E,2),N=r(P),Ae=r(N,!0);s(N);var Ee=i(N,2);de(Ee,{id:"email",type:"email",placeholder:"admin@example.com",autocomplete:"email",get value(){return e($)},set value(a){v($,a,!0)}}),s(P);var O=i(P,2),W=r(O),Pe=r(W,!0);s(W);var oe=i(W,2);{let a=h(()=>e(o)?"Min 8 characters":"Enter your password"),d=h(()=>e(o)?"new-password":"current-password");de(oe,{id:"password",type:"password",get placeholder(){return e(a)},get autocomplete(){return e(d)},get value(){return e(z)},set value(c){v(z,c,!0)}})}var ke=i(oe,2);{var Be=a=>{var d=Ye();l(a,d)};x(ke,a=>{e(o)&&a(Be)})}s(O);var ie=i(O,2);ve(ie,{type:"submit",variant:"primary",get loading(){return e(q)},children:(a,d)=>{M();var c=w();m(()=>p(c,e(o)?"Create Admin Account":"Sign In")),l(a,c)},$$slots:{default:!0}});var Te=i(ie,2);{var Re=a=>{var d=Ze(),c=i(r(d),2),G=r(c,!0);s(c);var j=i(c,2),J=r(j);{var k=L=>{var V=w("Run this in your project folder. `--local` updates the local D1 admin account used by the dev server.");l(L,V)},Q=L=>{var V=w("Run this in your project folder. The CLI will use your configured Service Key or Cloudflare access for recovery.");l(L,V)};x(J,L=>{e(ee)?L(k):L(Q,!1)})}s(j),s(d),m(()=>p(G,e(fe))),l(a,d)};x(Te,a=>{e(o)||a(Re)})}s(A),m(()=>{p(Ae,e(o)?"Admin Email":"Email"),p(Pe,e(o)?"Choose Password":"Password")}),Me("submit",A,be),l(f,y)};x(I,f=>{e(ye)?f(T):f(K,!1)})}l(t,n)};x(Le,t=>{e(C)?t($e):e(o)!==null&&t(Ie,1)})}s(ae),s(F),m(()=>qe(re,"src",`${Ne}/favicon.svg`)),l(ce,F),De(),me()}export{_t as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as Ye}from"../chunks/Bn2NtlTj.js";import{p as Ze,d as f,M as ye,a as et,g as e,f as ce,c as u,b as l,s as o,r as n,ae as G,t as O,u as X}from"../chunks/BdTBlfLy.js";import{d as tt,s as C,a as Le}from"../chunks/DtZk82gG.js";import{i as y}from"../chunks/Y22E1hJM.js";import{e as ke,i as Ce,a as rt,t as at,b as Ie}from"../chunks/BEW7Ez_g.js";import{t as Y,a as i,f as d}from"../chunks/DEELgv7K.js";import{s as Z}from"../chunks/CoI6jjbg.js";import{d as Ne}from"../chunks/wJsUhbfZ.js";import{g as st}from"../chunks/Ce-ngf4p.js";import{P as lt}from"../chunks/B8s_s9QY.js";import{a as ot}from"../chunks/Q2nPFxS6.js";import{B as ee}from"../chunks/C72lTcG0.js";import{I as Oe}from"../chunks/_teD5ji5.js";import{S as pe}from"../chunks/B94PilAN.js";import{E as nt}from"../chunks/m9eWh0Cd.js";import{S as fe}from"../chunks/J2Gw0SMu.js";var it=d('<span class="log-counter log-counter--error svelte-1lsf4ps"> </span>'),vt=d("<!> <!>",1),ut=d('<span class="live-dot svelte-1lsf4ps"></span>'),ct=d('<div class="log-actions svelte-1lsf4ps"><div class="log-counters svelte-1lsf4ps"><span class="log-counter svelte-1lsf4ps"> </span> <!></div> <!> <button><!> </button></div>'),pt=d('<div class="log-skeleton__row svelte-1lsf4ps"><!> <!> <!></div>'),ft=d('<div class="log-skeleton svelte-1lsf4ps"></div>'),dt=d("<span> </span>"),gt=d('<span class="log-entry__service svelte-1lsf4ps"> </span>'),mt=d('<span class="log-entry__time svelte-1lsf4ps"> </span>'),_t=d('<pre class="log-entry__detail svelte-1lsf4ps"> </pre>'),ht=d('<button type="button"><div class="log-entry__header svelte-1lsf4ps"><span><svg width="12" height="12" viewBox="0 0 12 12" fill="none" class="svelte-1lsf4ps"><path d="M4.5 3L7.5 6L4.5 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-1lsf4ps"></path></svg></span> <!> <!> <!> <span class="log-entry__summary svelte-1lsf4ps"> </span></div> <!></button>'),bt=d('<div class="pagination svelte-1lsf4ps"><!></div>'),St=d('<div class="log-list svelte-1lsf4ps"></div> <!>',1),xt=d('<div class="controls svelte-1lsf4ps"><div class="controls__fields svelte-1lsf4ps"><!> <!> <!> <!> <!></div> <div class="controls__actions svelte-1lsf4ps"><!></div></div> <!>',1);function jt(Pe,De){Ze(De,!0);let te=f(!0),g=f(ye([])),E=f(null),re=f(!1),B=f("log:"),ae=f("50"),F=f("all"),J=f("all"),z=f(""),q=f(ye(new Set)),I=f(!1),P=f(null),de=f(0),se=f(0);const Ue=[{value:"20",label:"20"},{value:"50",label:"50"},{value:"100",label:"100"}],Ee=[{value:"all",label:"All Levels"},{value:"info",label:"Info"},{value:"warn",label:"Warning (3xx/4xx)"},{value:"error",label:"Error (5xx)"},{value:"debug",label:"Debug"}],Ve=[{value:"all",label:"All Services"},{value:"auth",label:"Auth"},{value:"db",label:"Database"},{value:"storage",label:"Storage"},{value:"databaseLive",label:"Live"},{value:"push",label:"Push"},{value:"room",label:"Rooms"},{value:"function",label:"Functions"},{value:"kv",label:"KV"},{value:"sql",label:"SQL"},{value:"d1",label:"D1"},{value:"vectorize",label:"Vectorize"},{value:"users",label:"Users API"},{value:"admin",label:"Admin"},{value:"health",label:"Health"}];async function V(t=!1){t?l(re,!0):(l(te,!0),l(q,new Set,!0));try{let r=`data/logs?limit=${encodeURIComponent(e(ae))}`;e(B).trim()&&(r+=`&prefix=${encodeURIComponent(e(B).trim())}`),e(F)!=="all"&&(r+=`&level=${encodeURIComponent(e(F))}`),e(J)!=="all"&&(r+=`&category=${encodeURIComponent(e(J))}`),e(z).trim()&&(r+=`&path=${encodeURIComponent(e(z).trim())}`),t&&e(E)&&(r+=`&cursor=${encodeURIComponent(e(E))}`);const s=await rt.fetch(r);t?l(g,[...e(g),...s.logs],!0):l(g,s.logs,!0),l(E,s.cursor,!0),l(de,e(g).length,!0),l(se,e(g).filter(h=>{const p=ge(h);return p==="error"||p==="fatal"||p==="critical"}).length,!0)}catch(r){at(r instanceof Error?r.message:"Failed to load logs")}finally{l(te,!1),l(re,!1)}}function Ae(){l(E,null),V()}function Me(t){const r=new Set(e(q));r.has(t)?r.delete(t):r.add(t),l(q,r,!0)}function Re(){l(I,!e(I)),e(I)?(V(),l(P,setInterval(()=>{V()},2e3),!0)):e(P)&&(clearInterval(e(P)),l(P,null))}function je(t){const r=String(t.method??""),s=String(t.path??t.url??""),h=me(t),p=typeof t.duration=="number"?t.duration:Number(t.duration??0);if(r&&s){const L=[`${r.toUpperCase()} ${s}`];return h>0&&L.push(String(h)),p>0&&L.push(`${Math.round(p)}ms`),L.join(" · ")}if(typeof t.message=="string")return t.message;if(typeof t.msg=="string")return t.msg;if(typeof t.level=="string"&&typeof t.timestamp=="string")return`[${t.level}] ${t.timestamp}`;const x=Object.keys(t);return x.length===0?"(empty)":x.slice(0,3).join(", ")+(x.length>3?"...":"")}function ge(t){const r=t.level??t.severity??"";if(r)return String(r).toLowerCase();const s=me(t);return s>=500?"error":s>=400?"warn":s===304?"info":s>=300?"warn":s>=200?"info":s>0?"debug":""}function me(t){if(typeof t.status=="number")return t.status;if(typeof t.status=="string"){const r=Number.parseInt(t.status,10);return Number.isFinite(r)?r:0}return 0}function Be(t){const r=t.timestamp??t.time??t.ts??t.date??"";if(!r)return"";try{const s=typeof r=="number"?new Date(r):/^\d+$/.test(String(r))?new Date(Number(r)):new Date(String(r));return Number.isNaN(s.getTime())?"":s.toLocaleString()}catch{return String(r)}}function Fe(t){try{return JSON.stringify(t,null,2)}catch{return String(t)}}function Je(t){switch(t){case"error":case"fatal":case"critical":return"level--error";case"warn":case"warning":return"level--warn";case"info":return"level--info";case"debug":case"trace":return"level--debug";default:return""}}function ze(){if(e(g).length===0)return;const t=Object.keys(e(g)[0]),r=st(t,e(g)),s=new Blob([r],{type:"text/csv"});Ne(s,`logs-${new Date().toISOString().slice(0,10)}.csv`),Ie("Logs exported as CSV")}function qe(){if(e(g).length===0)return;const t=new Blob([JSON.stringify(e(g),null,2)],{type:"application/json"});Ne(t,`logs-${new Date().toISOString().slice(0,10)}.json`),Ie("Logs exported as JSON")}Ye(()=>(V(),()=>{e(P)&&clearInterval(e(P))})),lt(Pe,{title:"Logs",description:"View request logs and analytics",get docsHref(){return ot},actions:r=>{var s=ct(),h=u(s),p=u(h),x=u(p);n(p);var L=o(p,2);{var H=m=>{var S=it(),a=u(S);n(S),O(()=>C(a,`${e(se)??""} server errors`)),i(m,S)};y(L,m=>{e(se)>0&&m(H)})}n(h);var A=o(h,2);{var T=m=>{var S=vt(),a=ce(S);ee(a,{variant:"secondary",size:"sm",onclick:ze,children:(b,Q)=>{G();var w=Y("Export CSV");i(b,w)},$$slots:{default:!0}});var $=o(a,2);ee($,{variant:"secondary",size:"sm",onclick:qe,children:(b,Q)=>{G();var w=Y("Export JSON");i(b,w)},$$slots:{default:!0}}),i(m,S)};y(A,m=>{e(g).length>0&&m(T)})}var D=o(A,2);let M;var K=u(D);{var le=m=>{var S=ut();i(m,S)};y(K,m=>{e(I)&&m(le)})}var oe=o(K);n(D),n(s),O(()=>{C(x,`${e(de)??""} total`),M=Z(D,1,"live-btn svelte-1lsf4ps",null,M,{"live-btn--active":e(I)}),C(oe,` ${e(I)?"Live":"Paused"}`)}),Le("click",D,Re),i(r,s)},children:(r,s)=>{var h=xt(),p=ce(h),x=u(p),L=u(x);Oe(L,{label:"Prefix filter",placeholder:"log:",get value(){return e(B)},set value(a){l(B,a,!0)}});var H=o(L,2);pe(H,{label:"Level",get options(){return Ee},get value(){return e(F)},set value(a){l(F,a,!0)}});var A=o(H,2);pe(A,{label:"Service",get options(){return Ve},get value(){return e(J)},set value(a){l(J,a,!0)}});var T=o(A,2);Oe(T,{label:"Search logs",placeholder:"/api/...",get value(){return e(z)},set value(a){l(z,a,!0)}});var D=o(T,2);pe(D,{label:"Limit",get options(){return Ue},get value(){return e(ae)},set value(a){l(ae,a,!0)}}),n(x);var M=o(x,2),K=u(M);ee(K,{variant:"primary",onclick:Ae,children:(a,$)=>{G();var b=Y("Search");i(a,b)},$$slots:{default:!0}}),n(M),n(p);var le=o(p,2);{var oe=a=>{var $=ft();ke($,20,()=>Array(10),Ce,(b,Q)=>{var w=pt(),k=u(w);fe(k,{width:"60px",height:"20px"});var _=o(k,2);fe(_,{width:"120px",height:"14px"});var U=o(_,2);fe(U,{height:"14px"}),n(w),i(b,w)}),n($),i(a,$)},m=a=>{nt(a,{title:"No logs found",description:"No log entries match the current filter."})},S=a=>{var $=St(),b=ce($);ke(b,21,()=>e(g),Ce,(k,_,U)=>{const R=X(()=>ge(e(_))),ne=X(()=>Be(e(_))),W=X(()=>String(e(_).category??"")),ie=X(()=>e(q).has(U));var j=ht();let _e;var ve=u(j),he=u(ve);let be;var Se=o(he,2);{var He=v=>{var c=dt(),N=u(c,!0);n(c),O((ue,Xe)=>{Z(c,1,`log-entry__level ${ue??""}`,"svelte-1lsf4ps"),C(N,Xe)},[()=>Je(e(R)),()=>e(R).toUpperCase()]),i(v,c)};y(Se,v=>{e(R)&&v(He)})}var xe=o(Se,2);{var Te=v=>{var c=gt(),N=u(c,!0);n(c),O(()=>C(N,e(W))),i(v,c)};y(xe,v=>{e(W)&&v(Te)})}var $e=o(xe,2);{var Ke=v=>{var c=mt(),N=u(c,!0);n(c),O(()=>C(N,e(ne))),i(v,c)};y($e,v=>{e(ne)&&v(Ke)})}var we=o($e,2),Qe=u(we,!0);n(we),n(ve);var We=o(ve,2);{var Ge=v=>{var c=_t(),N=u(c,!0);n(c),O(ue=>C(N,ue),[()=>Fe(e(_))]),i(v,c)};y(We,v=>{e(ie)&&v(Ge)})}n(j),O(v=>{_e=Z(j,1,"log-entry svelte-1lsf4ps",null,_e,{"log-entry--expanded":e(ie)}),be=Z(he,1,"log-entry__chevron svelte-1lsf4ps",null,be,{"log-entry__chevron--open":e(ie)}),C(Qe,v)},[()=>je(e(_))]),Le("click",j,()=>Me(U)),i(k,j)}),n(b);var Q=o(b,2);{var w=k=>{var _=bt(),U=u(_);ee(U,{variant:"secondary",get loading(){return e(re)},onclick:()=>V(!0),children:(R,ne)=>{G();var W=Y("Load More");i(R,W)},$$slots:{default:!0}}),n(_),i(k,_)};y(Q,k=>{e(E)&&!e(I)&&k(w)})}i(a,$)};y(le,a=>{e(te)?a(oe):e(g).length===0?a(m,1):a(S,!1)})}i(r,h)}}),et()}tt(["click"]);export{jt as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as Z}from"../chunks/Bn2NtlTj.js";import{p as $,a as ee,g as e,f as z,r as t,s as c,b as j,d as B,c as a,t as R,u as te}from"../chunks/BdTBlfLy.js";import{d as ae,s as g,a as se}from"../chunks/DtZk82gG.js";import{i as E}from"../chunks/Y22E1hJM.js";import{e as G,a as le,t as re}from"../chunks/BEW7Ez_g.js";import{c as oe,a as r,f as v,d as T}from"../chunks/DEELgv7K.js";import{s as ne,a as ie}from"../chunks/CoI6jjbg.js";import{P as ve}from"../chunks/B8s_s9QY.js";import{a as ce}from"../chunks/Q2nPFxS6.js";/* empty css */var pe=v('<span class="last-updated svelte-l9pwpf"> </span>'),de=v('<div class="refresh-controls svelte-l9pwpf"><!> <button type="button"><span class="auto-refresh-dot svelte-l9pwpf"></span> </button></div>'),he=v('<div class="loading-state svelte-l9pwpf">Loading monitoring data...</div>'),fe=T('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-l9pwpf"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" class="svelte-l9pwpf"></path><circle cx="9" cy="7" r="4" class="svelte-l9pwpf"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87" class="svelte-l9pwpf"></path><path d="M16 3.13a4 4 0 0 1 0 7.75" class="svelte-l9pwpf"></path></svg>'),ue=T('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-l9pwpf"><rect x="3" y="11" width="18" height="11" rx="2" ry="2" class="svelte-l9pwpf"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4" class="svelte-l9pwpf"></path></svg>'),we=T('<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="svelte-l9pwpf"><path d="M4 11a9 9 0 0 1 9 9" class="svelte-l9pwpf"></path><path d="M4 4a16 16 0 0 1 16 16" class="svelte-l9pwpf"></path><circle cx="5" cy="19" r="1" class="svelte-l9pwpf"></circle></svg>'),_e=v('<div class="stat-card svelte-l9pwpf"><div class="stat-card__icon svelte-l9pwpf" aria-hidden="true"><!></div> <div class="stat-card__value svelte-l9pwpf"> </div> <div class="stat-card__label svelte-l9pwpf"> </div></div>'),ge=v('<tr class="channel-row svelte-l9pwpf"><td class="channel-td svelte-l9pwpf"><code class="channel-name svelte-l9pwpf"> </code></td><td class="channel-td channel-td--right svelte-l9pwpf"><span class="subscriber-count svelte-l9pwpf"> </span></td></tr>'),me=v('<div class="channel-section svelte-l9pwpf"><h3 class="section-title svelte-l9pwpf">Active Channels</h3> <div class="channel-table-wrap svelte-l9pwpf"><table class="channel-table svelte-l9pwpf"><thead class="svelte-l9pwpf"><tr class="svelte-l9pwpf"><th class="channel-th svelte-l9pwpf">Channel</th><th class="channel-th channel-th--right svelte-l9pwpf">Subscribers</th></tr></thead><tbody class="svelte-l9pwpf"></tbody></table></div></div>'),be=v('<div class="channel-empty svelte-l9pwpf">No active channel subscriptions.</div>'),ke=v('<div class="stat-grid svelte-l9pwpf"></div> <!>',1),ye=v('<div class="loading-state svelte-l9pwpf">No monitoring data available.</div>');function Ee(J,K){$(K,!0);let V=B(!0),h=B(null),H=B(""),f=B(!0);async function q(){try{const p=await le.fetch("data/monitoring");j(h,p,!0),j(H,new Date().toLocaleTimeString(),!0)}catch(p){re(p instanceof Error?p.message:"Failed to load monitoring data")}finally{j(V,!1)}}function O(){j(f,!e(f))}const Q=[{key:"activeConnections",label:"Active Connections",icon:"connections"},{key:"authenticatedConnections",label:"Authenticated",icon:"auth"},{key:"channels",label:"Active Channels",icon:"channels"}];Z(()=>{q();const p=setInterval(()=>{e(f)&&q()},5e3);return()=>{clearInterval(p)}}),ve(J,{title:"Live Monitoring",description:"Active connections and channels",get docsHref(){return ce},actions:I=>{var D=de(),m=a(D);{var N=s=>{var n=pe(),b=a(n);t(n),R(()=>g(b,`Updated ${e(H)??""}`)),r(s,n)};E(m,s=>{e(H)&&s(N)})}var d=c(m,2);let L;var U=c(a(d));t(d),t(D),R(()=>{L=ne(d,1,"auto-refresh-toggle svelte-l9pwpf",null,L,{"auto-refresh-toggle--active":e(f)}),ie(d,"title",e(f)?"Pause auto-refresh":"Resume auto-refresh"),g(U,` ${e(f)?"Live":"Paused"}`)}),se("click",d,O),r(I,D)},children:(I,D)=>{var m=oe(),N=z(m);{var d=s=>{var n=he();r(s,n)},L=s=>{var n=ke(),b=z(n);G(b,21,()=>Q,i=>i.key,(i,o)=>{const k=te(()=>e(h)[e(o).key]);var u=_e(),w=a(u),y=a(w);{var P=l=>{var A=fe();r(l,A)},x=l=>{var A=ue();r(l,A)},C=l=>{var A=we();r(l,A)};E(y,l=>{e(o).icon==="connections"?l(P):e(o).icon==="auth"?l(x,1):e(o).icon==="channels"&&l(C,2)})}t(w);var _=c(w,2),F=a(_,!0);t(_);var M=c(_,2),S=a(M,!0);t(M),t(u),R(l=>{g(F,l),g(S,e(o).label)},[()=>typeof e(k)=="number"?e(k).toLocaleString():"--"]),r(i,u)}),t(b);var W=c(b,2);{var X=i=>{var o=me(),k=c(a(o),2),u=a(k),w=c(a(u));G(w,21,()=>e(h).channelDetails,y=>y.channel,(y,P)=>{var x=ge(),C=a(x),_=a(C),F=a(_,!0);t(_),t(C);var M=c(C),S=a(M),l=a(S,!0);t(S),t(M),t(x),R(()=>{g(F,e(P).channel),g(l,e(P).subscribers)}),r(y,x)}),t(w),t(u),t(k),t(o),r(i,o)},Y=i=>{var o=be();r(i,o)};E(W,i=>{e(h).channelDetails&&e(h).channelDetails.length>0?i(X):i(Y,!1)})}r(s,n)},U=s=>{var n=ye();r(s,n)};E(N,s=>{e(V)?s(d):e(h)?s(L,1):s(U,!1)})}r(I,m)}}),ee()}ae(["click"]);export{Ee as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as we}from"../chunks/Bn2NtlTj.js";import{p as Pe,d as v,M as pe,a as Ee,f as re,b as l,g as e,s as o,c as r,r as s,ae as le,ag as Ue,t as z,u as G}from"../chunks/BdTBlfLy.js";import{s as I}from"../chunks/DtZk82gG.js";import{i as K}from"../chunks/Y22E1hJM.js";import{a as oe,t as Q,b as Fe,e as he}from"../chunks/BEW7Ez_g.js";import{a as c,t as ne,f as b}from"../chunks/DEELgv7K.js";import{a as V}from"../chunks/CoI6jjbg.js";import{b as Be}from"../chunks/CYatlt7w.js";import{P as Me}from"../chunks/B8s_s9QY.js";import{p as Le}from"../chunks/Q2nPFxS6.js";import{T as Oe}from"../chunks/B2TnDKF7.js";import{I as R}from"../chunks/_teD5ji5.js";import{B as ie}from"../chunks/C72lTcG0.js";import{B as de}from"../chunks/B0HRJ657.js";import{E as _e}from"../chunks/m9eWh0Cd.js";var Re=b('<tr class="svelte-8uesg1"><td class="mono svelte-8uesg1"> </td><td class="svelte-8uesg1"><!></td><td class="mono svelte-8uesg1"> </td><td class="secondary svelte-8uesg1"> </td></tr>'),Je=b('<div class="table-wrapper svelte-8uesg1"><table class="data-table svelte-8uesg1"><thead class="svelte-8uesg1"><tr><th class="svelte-8uesg1">Device ID</th><th class="svelte-8uesg1">Platform</th><th class="svelte-8uesg1">Token</th><th class="svelte-8uesg1">Registered</th></tr></thead><tbody class="svelte-8uesg1"></tbody></table></div>'),Ae=b('<div class="search-bar svelte-8uesg1"><!> <!></div> <!>',1),Ce=b('<div class="send-result svelte-8uesg1"><!> <span> </span></div>'),qe=b('<div class="send-form svelte-8uesg1"><!> <!> <!> <div class="form-field svelte-8uesg1"><label class="form-label svelte-8uesg1">Custom Data (JSON)</label> <textarea class="form-textarea svelte-8uesg1" rows="3"></textarea></div> <!> <!></div>'),He=b('<tr class="svelte-8uesg1"><td class="secondary svelte-8uesg1"> </td><td class="mono svelte-8uesg1"> </td><td class="svelte-8uesg1"><!></td><td class="svelte-8uesg1"> </td><td class="secondary svelte-8uesg1"> </td></tr>'),je=b('<div class="table-wrapper svelte-8uesg1"><table class="data-table svelte-8uesg1"><thead class="svelte-8uesg1"><tr><th class="svelte-8uesg1">Time</th><th class="svelte-8uesg1">User</th><th class="svelte-8uesg1">Status</th><th class="svelte-8uesg1">Sent/Failed</th><th class="svelte-8uesg1">Payload</th></tr></thead><tbody class="svelte-8uesg1"></tbody></table></div>'),ze=b('<div class="search-bar svelte-8uesg1"><!> <!></div> <!>',1),Ge=b('<!> <div class="tab-content svelte-8uesg1"><!></div>',1);function dt(be,ye){Pe(ye,!0);let U=v("tokens");const Se=[{id:"tokens",label:"Tokens"},{id:"send",label:"Test Send"},{id:"logs",label:"Logs"}];let J=v(""),F=v(pe([])),W=v(!1);async function ke(){if(!e(J).trim()){l(F,[],!0);return}l(W,!0);try{const t=await oe.fetch(`data/push/tokens?userId=${encodeURIComponent(e(J).trim())}`);l(F,t.items,!0)}catch(t){Q(t instanceof Error?t.message:"Failed to load tokens"),l(F,[],!0)}finally{l(W,!1)}}let B=v(""),M=v(""),X=v(""),A=v(""),C=v(!1),D=v(null);const ve=`push-send-data-${Math.random().toString(36).slice(2,9)}`;async function xe(){if(!(!e(B).trim()||!e(M).trim())){l(C,!0),l(D,null);try{const t={userId:e(B).trim(),title:e(M).trim(),body:e(X).trim()};if(e(A).trim())try{t.data=JSON.parse(e(A).trim())}catch{Q('Invalid JSON in data field. Example: {"key": "value"}'),l(C,!1);return}const y=await oe.fetch("data/push/test-send",{method:"POST",body:t});l(D,y,!0),Fe(`Sent to ${y.sent??0} device(s)`)}catch(t){Q(t instanceof Error?t.message:"Failed to send")}finally{l(C,!1)}}}let q=v(""),H=v(pe([])),Y=v(!1);async function ue(){l(Y,!0);try{let t="data/push/logs?limit=50";e(q).trim()&&(t+=`&userId=${encodeURIComponent(e(q).trim())}`);const y=await oe.fetch(t);l(H,y.items,!0)}catch(t){Q(t instanceof Error?t.message:"Failed to load logs"),l(H,[],!0)}finally{l(Y,!1)}}we(()=>{ue()});function ce(t){if(!t)return"-";try{return new Date(t).toLocaleString()}catch{return String(t)}}function j(t,y=24){return t.length>y?t.slice(0,y)+"...":t}Me(be,{title:"Push Notifications",description:"Manage push tokens, test sends, and view logs",get docsHref(){return Le},children:(t,y)=>{var ge=Ge(),fe=re(ge);Oe(fe,{get tabs(){return Se},get activeTab(){return e(U)},set activeTab(g){l(U,g,!0)}});var me=o(fe,2),Ie=r(me);{var $e=g=>{var h=Ae(),p=re(h),S=r(p);R(S,{placeholder:"Enter User ID...",get value(){return e(J)},set value(a){l(J,a,!0)}});var N=o(S,2);ie(N,{variant:"primary",onclick:ke,get loading(){return e(W)},children:(a,f)=>{le();var m=ne("Search");c(a,m)},$$slots:{default:!0}}),s(p);var $=o(p,2);{var w=a=>{_e(a,{title:"No tokens",description:"Enter a user ID to search for registered push tokens."})},k=a=>{var f=Je(),m=r(f),n=o(r(m));he(n,21,()=>e(F),d=>d.deviceId??Math.random(),(d,i)=>{var u=Re(),_=r(u),Z=r(_,!0);s(_);var T=o(_),ee=r(T);{let E=G(()=>String(e(i).platform??"unknown"));de(ee,{variant:"primary",get text(){return e(E)}})}s(T);var x=o(T),te=r(x,!0);s(x);var P=o(x),ae=r(P,!0);s(P),s(u),z((E,se,L,O)=>{I(Z,E),V(x,"title",se),I(te,L),I(ae,O)},[()=>j(String(e(i).deviceId??""),16),()=>String(e(i).token??""),()=>j(String(e(i).token??""),30),()=>ce(e(i).registeredAt)]),c(d,u)}),s(n),s(m),s(f),c(a,f)};K($,a=>{e(F).length===0?a(w):a(k,!1)})}c(g,h)},Te=g=>{var h=qe(),p=r(h);R(p,{label:"User ID",placeholder:"Target user ID",required:!0,get value(){return e(B)},set value(n){l(B,n,!0)}});var S=o(p,2);R(S,{label:"Title",placeholder:"Notification title",required:!0,get value(){return e(M)},set value(n){l(M,n,!0)}});var N=o(S,2);R(N,{label:"Body",placeholder:"Notification body (optional)",get value(){return e(X)},set value(n){l(X,n,!0)}});var $=o(N,2),w=r($),k=o(w,2);Ue(k),V(k,"placeholder",'{"key": "value"}'),s($);var a=o($,2);{let n=G(()=>!e(B).trim()||!e(M).trim());ie(a,{variant:"primary",onclick:xe,get loading(){return e(C)},get disabled(){return e(n)},children:(d,i)=>{le();var u=ne("Send Test Notification");c(d,u)},$$slots:{default:!0}})}var f=o(a,2);{var m=n=>{var d=Ce(),i=r(d);de(i,{variant:"success",text:"Sent"});var u=o(i,2),_=r(u);s(u),s(d),z(()=>I(_,`Sent: ${e(D).sent??""}, Failed: ${e(D).failed??""}, Total: ${e(D).total??""}`)),c(n,d)};K(f,n=>{e(D)&&n(m)})}s(h),z(()=>{V(w,"for",ve),V(k,"id",ve)}),Be(k,()=>e(A),n=>l(A,n)),c(g,h)},De=g=>{var h=ze(),p=re(h),S=r(p);R(S,{placeholder:"Filter by User ID (optional)...",get value(){return e(q)},set value(a){l(q,a,!0)}});var N=o(S,2);ie(N,{variant:"primary",onclick:ue,get loading(){return e(Y)},children:(a,f)=>{le();var m=ne("Refresh");c(a,m)},$$slots:{default:!0}}),s(p);var $=o(p,2);{var w=a=>{_e(a,{title:"No logs",description:"No push notification logs found."})},k=a=>{var f=je(),m=r(f),n=o(r(m));he(n,21,()=>e(H),d=>d.sentAt??Math.random(),(d,i)=>{var u=He(),_=r(u),Z=r(_,!0);s(_);var T=o(_),ee=r(T,!0);s(T);var x=o(T),te=r(x);{let L=G(()=>e(i).status==="success"?"success":e(i).status==="partial"?"warning":"danger"),O=G(()=>String(e(i).status??"-"));de(te,{get variant(){return e(L)},get text(){return e(O)}})}s(x);var P=o(x),ae=r(P);s(P);var E=o(P),se=r(E,!0);s(E),s(u),z((L,O,Ne)=>{I(Z,L),I(ee,O),I(ae,`${e(i).tokensSent??0??""} / ${e(i).tokensFailed??0??""}`),I(se,Ne)},[()=>ce(e(i).sentAt),()=>j(String(e(i).userId??""),16),()=>j(JSON.stringify(e(i).payload??{}),40)]),c(d,u)}),s(n),s(m),s(f),c(a,f)};K($,a=>{e(H).length===0?a(w):a(k,!1)})}c(g,h)};K(Ie,g=>{e(U)==="tokens"?g($e):e(U)==="send"?g(Te,1):e(U)==="logs"&&g(De,2)})}s(me),c(t,ge)}}),Ee()}export{dt as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as gs}from"../chunks/Bn2NtlTj.js";import{p as _s,d as A,M as ps,f as te,a as fs,b as o,g as e,r as t,c as s,s as a,ae as D,t as C,u as Y}from"../chunks/BdTBlfLy.js";import{d as ms,s as g,a as hs,e as yt}from"../chunks/DtZk82gG.js";import{i as P}from"../chunks/Y22E1hJM.js";import{a as se,e as U,i as Z,b as ve,t as ae}from"../chunks/BEW7Ez_g.js";import{a as n,f as p,c as ge,t as w}from"../chunks/DEELgv7K.js";import{s as ys}from"../chunks/CoI6jjbg.js";import{d as ws}from"../chunks/wJsUhbfZ.js";import"../chunks/CaVKAiCe.js";import{P as $s}from"../chunks/B8s_s9QY.js";import{b as xs}from"../chunks/Q2nPFxS6.js";import{B as _e}from"../chunks/B0HRJ657.js";import{B as V}from"../chunks/C72lTcG0.js";import{M as Ie}from"../chunks/Dt4vL4Df.js";import{I as $e}from"../chunks/_teD5ji5.js";import{C as wt}from"../chunks/DILS_-VJ.js";import{S as pe}from"../chunks/J2Gw0SMu.js";var bs=p('<div class="settings-row svelte-1i19ct2"><!> <!></div>'),ks=p('<div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2"><!></h3> <div class="settings-rows svelte-1i19ct2"></div></div>'),As=p('<div class="settings-grid svelte-1i19ct2"></div>'),Ds=p('<div class="settings-error svelte-1i19ct2">Failed to load configuration.</div>'),Ps=p('<div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2"></span> <span class="settings-value settings-value--key svelte-1i19ct2"><code class="key-preview svelte-1i19ct2"> </code> <button class="copy-btn svelte-1i19ct2" title="Copy masked key"><svg width="12" height="12" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="5" y="5" width="8" height="8" rx="1"></rect><path d="M3 11V3h8" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></span></div>'),Es=p('<div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2"> </span> <span class="settings-value svelte-1i19ct2"> <!></span></div>'),Cs=p('<div class="settings-empty svelte-1i19ct2">No databases configured</div>'),Ss=p('<div class="settings-row settings-row--top svelte-1i19ct2"><span class="settings-key settings-key--stack svelte-1i19ct2"><code class="settings-code svelte-1i19ct2"> </code> <!></span> <span class="settings-value settings-value--stack settings-value--rate svelte-1i19ct2"><span><span class="settings-inline-label svelte-1i19ct2">Soft</span> </span> <span class="settings-subvalue svelte-1i19ct2"> </span></span></div>'),zs=p('<div class="settings-empty svelte-1i19ct2">No rate limit settings found</div>'),Ls=p('<div class="settings-row svelte-1i19ct2"><!> <!></div>'),Bs=p('<div class="settings-empty svelte-1i19ct2">No admin accounts found</div>'),Ts=p('<div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2"> </span> <span class="settings-value settings-value--actions svelte-1i19ct2"><span class="settings-date svelte-1i19ct2"> </span> <!> <!></span></div>'),Ns=p('<li class="svelte-1i19ct2"> </li>'),Rs=p('<div class="danger-zone__result-section svelte-1i19ct2"><strong>Deleted:</strong> <ul class="svelte-1i19ct2"></ul></div>'),Ks=p('<li class="svelte-1i19ct2"> </li>'),js=p('<div class="danger-zone__result-section danger-zone__result-section--error svelte-1i19ct2"><strong>Failed:</strong> <ul class="svelte-1i19ct2"></ul></div>'),Vs=p('<div class="danger-zone__result svelte-1i19ct2"><p> </p> <!> <!></div>'),Ms=p('<div class="danger-zone__content svelte-1i19ct2"><div class="danger-zone__item svelte-1i19ct2"><div><p class="danger-zone__item-title svelte-1i19ct2">Delete this app</p> <p class="danger-zone__item-desc svelte-1i19ct2">Permanently delete all Cloudflare resources including databases, storage, KV namespaces, and the Worker itself. This action cannot be undone.</p></div> <!></div></div>'),Os=p('<div class="danger-zone svelte-1i19ct2"><div class="danger-zone__header svelte-1i19ct2"><h3 class="danger-zone__title svelte-1i19ct2">Danger Zone</h3></div> <!></div>'),Fs=p('<div class="settings-grid svelte-1i19ct2"><div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Environment</h3> <div class="settings-rows svelte-1i19ct2"><div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Mode</span> <!></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Release</span> <!></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Service Keys</span> <span class="settings-value svelte-1i19ct2"> </span></div> <!></div></div> <div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Databases</h3> <div class="settings-rows svelte-1i19ct2"><!> <!></div></div> <div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Bindings</h3> <div class="settings-rows svelte-1i19ct2"><div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">KV Namespaces</span> <span class="settings-value svelte-1i19ct2"> </span></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">D1 Databases</span> <span class="settings-value svelte-1i19ct2"> </span></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Vectorize Indexes</span> <span class="settings-value svelte-1i19ct2"> </span></div></div></div> <div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Auth</h3> <div class="settings-rows svelte-1i19ct2"><div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Anonymous Auth</span> <!></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">OAuth Providers</span> <span class="settings-value svelte-1i19ct2"><!></span></div></div></div> <div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Storage</h3> <div class="settings-rows svelte-1i19ct2"><div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Buckets</span> <span class="settings-value svelte-1i19ct2"><!></span></div></div></div> <div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Rate Limiting</h3> <div class="settings-rows svelte-1i19ct2"><!></div> <div class="settings-note svelte-1i19ct2">Defined in <code>edgebase.config.ts</code> or <code>config/rate-limits.ts</code>.</div></div> <div class="settings-card svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Native Resources</h3> <div class="settings-rows svelte-1i19ct2"><div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">KV Namespaces</span> <span class="settings-value svelte-1i19ct2"> </span></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">D1 Databases</span> <span class="settings-value svelte-1i19ct2"> </span></div> <div class="settings-row svelte-1i19ct2"><span class="settings-key svelte-1i19ct2">Vectorize Indexes</span> <span class="settings-value svelte-1i19ct2"> </span></div></div></div></div> <div class="settings-card settings-card--full svelte-1i19ct2"><h3 class="settings-card__title svelte-1i19ct2">Admin Accounts <!></h3> <div class="settings-rows svelte-1i19ct2"><!></div></div> <!>',1),Is=p('<div class="delete-confirm svelte-1i19ct2"><p class="delete-confirm__warning svelte-1i19ct2">This is your final confirmation. All data will be permanently lost.</p> <p class="delete-confirm__instruction svelte-1i19ct2">Type <strong>DELETE_ALL_RESOURCES</strong> to confirm:</p> <!> <div class="modal-actions svelte-1i19ct2"><!> <!></div></div>'),Us=p('<form><div class="modal-fields svelte-1i19ct2"><!> <!></div> <div class="modal-actions svelte-1i19ct2"><!> <!></div></form>'),qs=p('<form><p class="modal-info svelte-1i19ct2">Changing password for <strong> </strong></p> <div class="modal-fields svelte-1i19ct2"><!></div> <div class="modal-actions svelte-1i19ct2"><!> <!></div></form>'),Ws=p("<!> <!> <!> <!> <!> <!>",1);function ca($t,xt){_s(xt,!0);let Ue=A(!0),v=A(null);function bt(r,$){return`${r.toLocaleString()} / ${$}`}function kt(r){if(!r)return"No binding";if(!r.enabled)return"Binding disabled";if(r.limit==null||r.period==null)return"Binding configured";const $=`${r.limit.toLocaleString()} / ${r.period}s`;return r.source==="override"||r.source==="custom"?`Binding ${$}`:`Binding ${$} (default)`}function xe(r){return r.length>0?r.join(", "):"None configured"}function At(r){return r?r.enabled?r.source==="override"?"primary":r.source==="custom"?"warning":"default":"danger":"default"}function Dt(r){return r?r.enabled?r.source==="override"?"Binding override":r.source==="custom"?"Custom group":"Default binding":"Binding off":"Soft only"}async function Pt(r){try{await navigator.clipboard.writeText(r),ve("Copied to clipboard (masked)")}catch{ae("Failed to copy")}}gs(async()=>{try{o(v,await se.fetch("data/config-info"),!0)}catch{o(v,null)}finally{o(Ue,!1)}Ae()});let de=A(ps([])),qe=A(!0),ce=A(!1),re=A(""),ie=A(""),be=A(!1),G=A(null),q=A(null),Q=A(""),ke=A(!1);async function Ae(){try{const r=await se.fetch("data/admins");o(de,r.admins,!0)}catch{o(de,[],!0)}finally{o(qe,!1)}}async function Et(){if(!(!e(re).trim()||!e(ie).trim())){o(be,!0);try{await se.fetch("data/admins",{method:"POST",body:{email:e(re),password:e(ie)}}),ve("Admin account created"),o(ce,!1),o(re,""),o(ie,""),await Ae()}catch(r){ae(r instanceof Error?r.message:"Failed to create admin")}finally{o(be,!1)}}}async function Ct(){if(!e(G))return;const r=e(G);o(G,null);try{await se.fetch(`data/admins/${r.id}`,{method:"DELETE"}),ve("Admin account deleted"),await Ae()}catch($){ae($ instanceof Error?$.message:"Failed to delete admin")}}async function St(){if(!(!e(q)||!e(Q).trim())){o(ke,!0);try{await se.fetch(`data/admins/${e(q).id}/password`,{method:"PUT",body:{password:e(Q)}}),ve("Password updated"),o(q,null),o(Q,"")}catch(r){ae(r instanceof Error?r.message:"Failed to change password")}finally{o(ke,!1)}}}async function zt(){try{const r=await se.fetch("data/backup/config"),$=new Blob([JSON.stringify(r,null,2)],{type:"application/json"});ws($,`edgebase-config-snapshot-${new Date().toISOString().slice(0,10)}.json`),ve("Config snapshot downloaded")}catch(r){ae(r instanceof Error?r.message:"Failed to download config")}}let fe=A(!1),me=A(!1),ne=A(""),De=A(!1),W=A(null);function Lt(){o(fe,!0)}function Bt(){o(fe,!1),o(me,!0),o(ne,"")}function Pe(){o(fe,!1),o(me,!1),o(ne,"")}async function Tt(){o(De,!0);try{const r=await se.fetch("data/destroy-app",{method:"POST",body:{confirm:"DELETE_ALL_RESOURCES"}});o(W,r,!0),o(me,!1),r.success?ve("All resources destroyed. This app has been deleted."):ae(`Partial destruction: ${r.failed.length} resource(s) failed to delete.`)}catch(r){ae(r instanceof Error?r.message:"Failed to destroy app")}finally{o(De,!1),o(ne,"")}}var We=Ws(),He=te(We);$s(He,{title:"Project Info",description:"Environment and resource overview with admin account controls",get docsHref(){return xs},actions:$=>{V($,{variant:"secondary",size:"sm",onclick:zt,children:(ue,x)=>{D();var S=w("Download Config Snapshot");n(ue,S)},$$slots:{default:!0}})},children:($,ue)=>{var x=ge(),S=te(x);{var M=h=>{var E=As();U(E,20,()=>Array(5),Z,(f,K)=>{var b=ks(),T=s(b),le=s(T);pe(le,{width:"120px",height:"13px"}),t(T);var J=a(T,2);U(J,20,()=>Array(3),Z,(Ee,he)=>{var oe=bs(),ye=s(oe);pe(ye,{width:"80px",height:"12px"});var Ce=a(ye,2);pe(Ce,{width:"100px",height:"12px"}),t(oe),n(Ee,oe)}),t(J),t(b),n(f,b)}),t(E),n(h,E)},H=h=>{var E=Ds();n(h,E)},O=h=>{var E=Fs(),f=te(E),K=s(f),b=a(s(K),2),T=s(b),le=a(s(T),2);{let i=Y(()=>e(v).devMode?"warning":"success");_e(le,{get variant(){return e(i)},children:(l,_)=>{D();var d=w();C(()=>g(d,e(v).devMode?"Development":"Production")),n(l,d)},$$slots:{default:!0}})}t(T);var J=a(T,2),Ee=a(s(J),2);{let i=Y(()=>e(v).release?"success":"default");_e(Ee,{get variant(){return e(i)},children:(l,_)=>{D();var d=w();C(()=>g(d,e(v).release?"Enabled (deny-by-default)":"Disabled (dev permissive)")),n(l,d)},$$slots:{default:!0}})}t(J);var he=a(J,2),oe=a(s(he),2),ye=s(oe);t(oe),t(he);var Ce=a(he,2);{var Ot=i=>{var l=ge(),_=te(l);U(_,17,()=>e(v).serviceKeys,Z,(d,m,c)=>{var u=Ps(),y=s(u);y.textContent=`Key ${c+1}`;var z=a(y,2),k=s(z),N=s(k,!0);t(k);var B=a(k,2);t(z),t(u),C(()=>g(N,e(m))),hs("click",B,()=>Pt(e(m))),n(d,u)}),n(i,l)};P(Ce,i=>{e(v).serviceKeys&&e(v).serviceKeys.length>0&&i(Ot)})}t(b),t(K);var Se=a(K,2),Qe=a(s(Se),2),Xe=s(Qe);U(Xe,17,()=>e(v).databases,Z,(i,l)=>{var _=Es(),d=s(_),m=s(d,!0);t(d);var c=a(d,2),u=s(c),y=a(u);{var z=k=>{_e(k,{variant:"primary",children:(N,B)=>{D();var X=w("access rule");n(N,X)},$$slots:{default:!0}})};P(y,k=>{e(l).hasAccess&&k(z)})}t(c),t(_),C(()=>{g(m,e(l).name),g(u,`${e(l).tableCount??""} table${e(l).tableCount!==1?"s":""} `)}),n(i,_)});var Ft=a(Xe,2);{var It=i=>{var l=Cs();n(i,l)};P(Ft,i=>{e(v).databases.length===0&&i(It)})}t(Qe),t(Se);var ze=a(Se,2),et=a(s(ze),2),Le=s(et),tt=a(s(Le),2),Ut=s(tt,!0);t(tt),t(Le);var Be=a(Le,2),st=a(s(Be),2),qt=s(st,!0);t(st),t(Be);var at=a(Be,2),rt=a(s(at),2),Wt=s(rt,!0);t(rt),t(at),t(et),t(ze);var Te=a(ze,2),it=a(s(Te),2),Ne=s(it),Ht=a(s(Ne),2);{let i=Y(()=>e(v).auth.anonymousAuth?"success":"default");_e(Ht,{get variant(){return e(i)},children:(l,_)=>{D();var d=w();C(()=>g(d,e(v).auth.anonymousAuth?"Enabled":"Disabled")),n(l,d)},$$slots:{default:!0}})}t(Ne);var nt=a(Ne,2),lt=a(s(nt),2),Jt=s(lt);{var Yt=i=>{var l=w();C(_=>g(l,_),[()=>e(v).auth.providers.join(", ")]),n(i,l)},Zt=i=>{var l=w("None configured");n(i,l)};P(Jt,i=>{e(v).auth.providers.length>0?i(Yt):i(Zt,!1)})}t(lt),t(nt),t(it),t(Te);var Re=a(Te,2),ot=a(s(Re),2),vt=s(ot),dt=a(s(vt),2),Gt=s(dt);{var Qt=i=>{var l=w();C(_=>g(l,_),[()=>e(v).storageBuckets.join(", ")]),n(i,l)},Xt=i=>{var l=w("None configured");n(i,l)};P(Gt,i=>{e(v).storageBuckets.length>0?i(Qt):i(Xt,!1)})}t(dt),t(vt),t(ot),t(Re);var Ke=a(Re,2),ct=a(s(Ke),2),es=s(ct);{var ts=i=>{var l=ge(),_=te(l);U(_,17,()=>e(v).rateLimiting,Z,(d,m)=>{var c=Ss(),u=s(c),y=s(u),z=s(y,!0);t(y);var k=a(y,2);{let L=Y(()=>At(e(m).binding));_e(k,{get variant(){return e(L)},children:(j,we)=>{D();var ee=w();C(I=>g(ee,I),[()=>Dt(e(m).binding)]),n(j,ee)},$$slots:{default:!0}})}t(u);var N=a(u,2),B=s(N),X=a(s(B),1,!0);t(B);var F=a(B,2),R=s(F,!0);t(F),t(N),t(c),C((L,j)=>{g(z,e(m).group),g(X,L),g(R,j)},[()=>bt(e(m).requests,e(m).window),()=>kt(e(m).binding)]),n(d,c)}),n(i,l)},ss=i=>{var l=zs();n(i,l)};P(es,i=>{e(v).rateLimiting.length>0?i(ts):i(ss,!1)})}t(ct),D(2),t(Ke);var ut=a(Ke,2),gt=a(s(ut),2),je=s(gt),_t=a(s(je),2),as=s(_t,!0);t(_t),t(je);var Ve=a(je,2),pt=a(s(Ve),2),rs=s(pt,!0);t(pt),t(Ve);var ft=a(Ve,2),mt=a(s(ft),2),is=s(mt,!0);t(mt),t(ft),t(gt),t(ut),t(f);var Me=a(f,2),Oe=s(Me),ns=a(s(Oe));V(ns,{variant:"primary",size:"sm",onclick:()=>o(ce,!0),children:(i,l)=>{D();var _=w("+ Add Admin");n(i,_)},$$slots:{default:!0}}),t(Oe);var ht=a(Oe,2),ls=s(ht);{var os=i=>{var l=ge(),_=te(l);U(_,16,()=>Array(2),Z,(d,m)=>{var c=Ls(),u=s(c);pe(u,{width:"150px",height:"12px"});var y=a(u,2);pe(y,{width:"80px",height:"12px"}),t(c),n(d,c)}),n(i,l)},vs=i=>{var l=Bs();n(i,l)},ds=i=>{var l=ge(),_=te(l);U(_,17,()=>e(de),d=>d.id,(d,m)=>{var c=Ts(),u=s(c),y=s(u,!0);t(u);var z=a(u,2),k=s(z),N=s(k,!0);t(k);var B=a(k,2);V(B,{variant:"secondary",size:"sm",onclick:()=>{o(q,e(m),!0),o(Q,"")},children:(F,R)=>{D();var L=w("Change Password");n(F,L)},$$slots:{default:!0}});var X=a(B,2);{let F=Y(()=>e(de).length<=1);V(X,{variant:"danger",size:"sm",onclick:()=>o(G,e(m),!0),get disabled(){return e(F)},children:(R,L)=>{D();var j=w("Delete");n(R,j)},$$slots:{default:!0}})}t(z),t(c),C(F=>{g(y,e(m).email),g(N,F)},[()=>new Date(e(m).createdAt).toLocaleDateString()]),n(d,c)}),n(i,l)};P(ls,i=>{e(qe)?i(os):e(de).length===0?i(vs,1):i(ds,!1)})}t(ht),t(Me);var cs=a(Me,2);{var us=i=>{var l=Os(),_=a(s(l),2);{var d=c=>{var u=Vs(),y=s(u);let z;var k=s(y,!0);t(y);var N=a(y,2);{var B=R=>{var L=Rs(),j=a(s(L),2);U(j,21,()=>e(W).deleted,Z,(we,ee)=>{var I=Ns(),Fe=s(I,!0);t(I),C(()=>g(Fe,e(ee))),n(we,I)}),t(j),t(L),n(R,L)};P(N,R=>{e(W).deleted.length>0&&R(B)})}var X=a(N,2);{var F=R=>{var L=js(),j=a(s(L),2);U(j,21,()=>e(W).failed,Z,(we,ee)=>{var I=Ks(),Fe=s(I);t(I),C(()=>g(Fe,`${e(ee).resource??""}: ${e(ee).error??""}`)),n(we,I)}),t(j),t(L),n(R,L)};P(X,R=>{e(W).failed.length>0&&R(F)})}t(u),C(()=>{z=ys(y,1,"danger-zone__result-message svelte-1i19ct2",null,z,{"danger-zone__result-message--success":e(W).success}),g(k,e(W).message)}),n(c,u)},m=c=>{var u=Ms(),y=s(u),z=a(s(y),2);V(z,{variant:"danger",size:"sm",onclick:Lt,children:(k,N)=>{D();var B=w("Delete App");n(k,B)},$$slots:{default:!0}}),t(y),t(u),n(c,u)};P(_,c=>{e(W)?c(d):c(m,!1)})}t(l),n(i,l)};P(cs,i=>{e(v).devMode||i(us)})}C((i,l,_,d,m,c)=>{g(ye,`${e(v).serviceKeyCount??""} configured`),g(Ut,i),g(qt,l),g(Wt,_),g(as,d),g(rs,m),g(is,c)},[()=>xe(e(v).bindings.kv),()=>xe(e(v).bindings.d1),()=>xe(e(v).bindings.vectorize),()=>e(v).bindings.kv.length>0?e(v).bindings.kv.join(", "):"None",()=>e(v).bindings.d1.length>0?e(v).bindings.d1.join(", "):"None",()=>e(v).bindings.vectorize.length>0?e(v).bindings.vectorize.join(", "):"None"]),n(h,E)};P(S,h=>{e(Ue)?h(M):e(v)?h(O,!1):h(H,1)})}n($,x)}});var Je=a(He,2);{var Nt=r=>{wt(r,{open:!0,title:"Delete App",message:"This will permanently delete ALL Cloudflare resources (databases, storage, KV, vectorize indexes, and the Worker). This action cannot be undone. Do you want to proceed?",confirmLabel:"Yes, delete everything",confirmVariant:"danger",onconfirm:Bt,oncancel:Pe})};P(Je,r=>{e(fe)&&r(Nt)})}var Ye=a(Je,2);{var Rt=r=>{Ie(r,{open:!0,title:"Confirm App Deletion",onclose:Pe,children:($,ue)=>{var x=Is(),S=a(s(x),4);$e(S,{placeholder:"DELETE_ALL_RESOURCES",get value(){return e(ne)},set value(h){o(ne,h,!0)}});var M=a(S,2),H=s(M);V(H,{variant:"secondary",onclick:Pe,children:(h,E)=>{D();var f=w("Cancel");n(h,f)},$$slots:{default:!0}});var O=a(H,2);{let h=Y(()=>e(ne)!=="DELETE_ALL_RESOURCES");V(O,{variant:"danger",get loading(){return e(De)},get disabled(){return e(h)},onclick:Tt,children:(E,f)=>{D();var K=w("Permanently Delete App");n(E,K)},$$slots:{default:!0}})}t(M),t(x),n($,x)},$$slots:{default:!0}})};P(Ye,r=>{e(me)&&r(Rt)})}var Ze=a(Ye,2);{var Kt=r=>{Ie(r,{open:!0,title:"Add Admin Account",onclose:()=>o(ce,!1),children:($,ue)=>{var x=Us(),S=s(x),M=s(S);$e(M,{label:"Email",type:"email",get value(){return e(re)},set value(f){o(re,f,!0)}});var H=a(M,2);$e(H,{label:"Password",type:"password",get value(){return e(ie)},set value(f){o(ie,f,!0)}}),t(S);var O=a(S,2),h=s(O);V(h,{variant:"secondary",onclick:()=>o(ce,!1),children:(f,K)=>{D();var b=w("Cancel");n(f,b)},$$slots:{default:!0}});var E=a(h,2);{let f=Y(()=>!e(re).trim()||e(ie).length<8);V(E,{variant:"primary",type:"submit",get loading(){return e(be)},get disabled(){return e(f)},children:(K,b)=>{D();var T=w("Create Admin");n(K,T)},$$slots:{default:!0}})}t(O),t(x),yt("submit",x,f=>{f.preventDefault(),Et()}),n($,x)},$$slots:{default:!0}})};P(Ze,r=>{e(ce)&&r(Kt)})}var Ge=a(Ze,2);{var jt=r=>{Ie(r,{open:!0,title:"Change Password",onclose:()=>o(q,null),children:($,ue)=>{var x=qs(),S=s(x),M=a(s(S)),H=s(M,!0);t(M),t(S);var O=a(S,2),h=s(O);$e(h,{label:"New Password",type:"password",get value(){return e(Q)},set value(b){o(Q,b,!0)}}),t(O);var E=a(O,2),f=s(E);V(f,{variant:"secondary",onclick:()=>o(q,null),children:(b,T)=>{D();var le=w("Cancel");n(b,le)},$$slots:{default:!0}});var K=a(f,2);{let b=Y(()=>e(Q).length<8);V(K,{variant:"primary",type:"submit",get loading(){return e(ke)},get disabled(){return e(b)},children:(T,le)=>{D();var J=w("Update Password");n(T,J)},$$slots:{default:!0}})}t(E),t(x),C(()=>g(H,e(q).email)),yt("submit",x,b=>{b.preventDefault(),St()}),n($,x)},$$slots:{default:!0}})};P(Ge,r=>{e(q)&&r(jt)})}var Vt=a(Ge,2);{var Mt=r=>{wt(r,{open:!0,title:"Delete Admin Account",get message(){return`Are you sure you want to delete the admin account ${e(G).email??""}? This cannot be undone.`},confirmLabel:"Delete",confirmVariant:"danger",onconfirm:Ct,oncancel:()=>o(G,null)})};P(Vt,r=>{e(G)&&r(Mt)})}n($t,We),fs()}ms(["click"]);export{ca as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as vt}from"../chunks/Bn2NtlTj.js";import{p as pt,d as f,M as K,f as S,a as mt,b as a,g as r,s as B,u as L,c as b,r as v,ae as q,t as U}from"../chunks/BdTBlfLy.js";import{s as j}from"../chunks/DtZk82gG.js";import{i as z}from"../chunks/Y22E1hJM.js";import{a as F,b as _t,t as W,e as bt}from"../chunks/BEW7Ez_g.js";import{a as n,f as u,t as N,c as A}from"../chunks/DEELgv7K.js";import{a as gt}from"../chunks/CoI6jjbg.js";import{s as ht,a as kt}from"../chunks/Cp8V0Xy2.js";import{b as $t}from"../chunks/Cw6OYcq-.js";import{d as Bt}from"../chunks/CaVKAiCe.js";import{P as yt}from"../chunks/B8s_s9QY.js";import{s as wt}from"../chunks/Q2nPFxS6.js";import{E as xt}from"../chunks/m9eWh0Cd.js";import{B as T}from"../chunks/C72lTcG0.js";import{I as Mt}from"../chunks/_teD5ji5.js";import{M as St}from"../chunks/Dt4vL4Df.js";var qt=u('<div class="loading-state svelte-b46l0q"><div class="loading-spinner svelte-b46l0q"></div> <span>Loading storage buckets...</span></div>'),Ct=u('<div class="bucket-card__stats svelte-b46l0q"><span> </span> <span class="bucket-card__dot svelte-b46l0q">&middot;</span> <span> </span></div>'),Pt=u('<div class="bucket-card__hint svelte-b46l0q">Browse files</div>'),Et=u('<a class="bucket-card svelte-b46l0q"><div class="bucket-card__icon svelte-b46l0q" aria-hidden="true"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"></ellipse><path d="M3 5V19C3 20.66 7.03 22 12 22C16.97 22 21 20.66 21 19V5"></path><path d="M3 12C3 13.66 7.03 15 12 15C16.97 15 21 13.66 21 12"></path></svg></div> <div class="bucket-card__name svelte-b46l0q"> </div> <!></a>'),It=u('<div class="bucket-grid svelte-b46l0q"></div>'),Ot=u('<div class="create-modal svelte-b46l0q"><!> <p class="create-modal__hint svelte-b46l0q">This adds a new bucket entry to <code>edgebase.config.ts</code> for local development.</p></div>'),jt=u("<!> <!>",1),zt=u("<!> <!>",1);function Zt(J,Q){pt(Q,!0);const X=()=>kt(Bt,"$devInfoStore",Y),[Y,Z]=ht();let V=f(!0),p=f(K([])),g=f(K({})),h=f(!1),y=f(""),m=f(""),C=f(!1);function tt(t){return new Promise(s=>setTimeout(s,t))}async function R(){const t=await F.fetch("data/storage/buckets");return a(p,t.buckets,!0),t.buckets.length>0?await rt(t.buckets):a(g,{},!0),t.buckets}async function et(t,s=20,o=300){for(let e=0;e<s;e+=1){try{if((await R()).includes(t))return!0}catch{}e<s-1&&await tt(o)}return!1}function at(t){if(t===0)return"0 B";const s=["B","KB","MB","GB","TB"],o=Math.floor(Math.log(t)/Math.log(1024)),e=t/Math.pow(1024,o);return`${e<10?e.toFixed(1):Math.round(e)} ${s[o]}`}async function rt(t){const s=await Promise.allSettled(t.map(async e=>{const l=await F.fetch(`data/storage/buckets/${encodeURIComponent(e)}/stats`);return{bucket:e,stats:l}})),o={};for(const e of s)e.status==="fulfilled"&&(o[e.value.bucket]=e.value.stats);a(g,o,!0)}vt(async()=>{try{await R()}catch(t){W(t instanceof Error?t.message:"Failed to load storage buckets. Check your connection and configuration.")}finally{a(V,!1)}});async function st(){const t=r(y).trim();if(!t){a(m,"Bucket name is required.");return}a(C,!0),a(m,"");try{await F.schemaMutation("schema/storage/buckets",{method:"POST",body:{name:t}}),!await et(t)&&!r(p).includes(t)&&(a(p,[...r(p),t],!0),a(g,{...r(g),[t]:{totalObjects:0,totalSize:0}},!0)),a(h,!1),a(y,""),_t(`Bucket "${t}" created`)}catch(s){a(m,s instanceof Error?s.message:"Failed to create bucket.",!0),W(r(m))}finally{a(C,!1)}}var D=zt(),G=S(D);yt(G,{title:"Storage",description:"Manage file storage buckets",get docsHref(){return wt},actions:s=>{var o=A(),e=S(o);{var l=c=>{T(c,{variant:"primary",size:"sm",onclick:()=>{a(m,""),a(h,!0)},children:(d,w)=>{q();var i=N("+ Create Bucket");n(d,i)},$$slots:{default:!0}})};z(e,c=>{X().devMode&&c(l)})}n(s,o)},children:(s,o)=>{var e=A(),l=S(e);{var c=i=>{var k=qt();n(i,k)},d=i=>{xt(i,{title:"No buckets",description:"No storage buckets found. Buckets are defined in your EdgeBase configuration."})},w=i=>{var k=It();bt(k,20,()=>r(p),P=>P,(P,E)=>{const x=L(()=>r(g)[E]);var M=Et(),I=B(b(M),2),it=b(I,!0);v(I);var nt=B(I,2);{var lt=_=>{var $=Ct(),O=b($),dt=b(O);v(O);var H=B(O,4),ut=b(H,!0);v(H),v($),U(ft=>{j(dt,`${r(x).totalObjects??""} ${r(x).totalObjects===1?"file":"files"}`),j(ut,ft)},[()=>at(r(x).totalSize)]),n(_,$)},ct=_=>{var $=Pt();n(_,$)};z(nt,_=>{r(x)?_(lt):_(ct,!1)})}v(M),U(()=>{gt(M,"href",`${$t??""}/storage/${E??""}`),j(it,E)}),n(P,M)}),v(k),n(i,k)};z(l,i=>{r(V)?i(c):r(p).length===0?i(d,1):i(w,!1)})}n(s,e)}});var ot=B(G,2);St(ot,{title:"Create Bucket",maxWidth:"420px",get open(){return r(h)},set open(o){a(h,o,!0)},children:o=>{var e=Ot(),l=b(e);{let c=L(()=>r(m)||void 0);Mt(l,{label:"Bucket Name",placeholder:"uploads",get error(){return r(c)},get value(){return r(y)},set value(d){a(y,d,!0)}})}q(2),v(e),n(o,e)},footer:o=>{var e=jt(),l=S(e);T(l,{variant:"secondary",onclick:()=>a(h,!1),children:(d,w)=>{q();var i=N("Cancel");n(d,i)},$$slots:{default:!0}});var c=B(l,2);T(c,{variant:"primary",get loading(){return r(C)},onclick:st,children:(d,w)=>{q();var i=N("Create Bucket");n(d,i)},$$slots:{default:!0}}),n(o,e)},$$slots:{default:!0,footer:!0}}),n(J,D),mt(),Z()}export{Zt as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{g as jt,o as Nt}from"../chunks/Bn2NtlTj.js";import{p as tt,d as u,M as Je,a as at,f as me,t as k,s,g as e,b as t,c as l,u as x,ae as j,r,w as St}from"../chunks/BdTBlfLy.js";import{d as ut,e as vt,a as W,s as M}from"../chunks/DtZk82gG.js";import{i as ie}from"../chunks/Y22E1hJM.js";import{t as Pe,b as Ye,e as Qe,i as Pt,a as Xe}from"../chunks/BEW7Ez_g.js";import{a as n,t as ne,f as h,c as Mt}from"../chunks/DEELgv7K.js";import{s as Me,a as q,f as Gt,r as et,g as $t,e as xt}from"../chunks/CoI6jjbg.js";import{s as Tt,a as dt}from"../chunks/Cp8V0Xy2.js";import{p as Zt}from"../chunks/B6MschND.js";import{g as Bt,a as ft,c as qt,d as Jt}from"../chunks/BoOooyH6.js";import{d as Qt}from"../chunks/wJsUhbfZ.js";import{P as Xt}from"../chunks/B8s_s9QY.js";import{s as Yt}from"../chunks/Q2nPFxS6.js";import{B as ce}from"../chunks/C72lTcG0.js";import{E as ea}from"../chunks/m9eWh0Cd.js";import{C as zt}from"../chunks/DILS_-VJ.js";import{p as Oe}from"../chunks/F9_4wRrd.js";import{M as pt}from"../chunks/Dt4vL4Df.js";import{I as ta}from"../chunks/_teD5ji5.js";import{S as aa}from"../chunks/B94PilAN.js";var ra=h("<!> <!>",1),la=h('<div class="key-input svelte-1myht9e"><!></div>'),sa=h('<img class="file-item__thumb svelte-1myht9e"/>'),oa=h('<div class="file-item__icon svelte-1myht9e"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline></svg></div>'),ia=h('<div class="file-item svelte-1myht9e"><!> <div class="file-item__info svelte-1myht9e"><span class="file-item__name svelte-1myht9e"> </span> <span class="file-item__meta svelte-1myht9e"> </span></div> <button class="file-item__remove svelte-1myht9e" aria-label="Remove"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></button></div>'),na=h('<div class="file-list svelte-1myht9e"></div>'),ca=h('<label><svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg> <p class="dropzone__text svelte-1myht9e">Drag & drop files here</p> <p class="dropzone__hint svelte-1myht9e">or click to browse</p> <input type="file" multiple="" class="dropzone__input svelte-1myht9e"/></label> <!> <!>',1);function va(ke,m){tt(m,!0);const J=()=>dt(ft,"$authStore",Q),[Q,B]=Tt();let L=Oe(m,"open",15,!1),D=Oe(m,"onUploaded",3,()=>{}),_=u(Je([])),A=u(""),ve=u(!1),z=u(!1);const w=`file-upload-${Math.random().toString(36).slice(2,9)}`;let o=x(()=>e(_).map(v=>({name:v.name,size:K(v.size),type:v.type,isImage:v.type.startsWith("image/"),url:v.type.startsWith("image/")?URL.createObjectURL(v):""})));function F(){t(_,[],!0),t(A,""),t(z,!1)}function I(v){var f;v.preventDefault(),t(z,!1),(f=v.dataTransfer)!=null&&f.files&&t(_,[...e(_),...Array.from(v.dataTransfer.files)],!0)}function R(v){const f=v.target;f.files&&t(_,[...e(_),...Array.from(f.files)],!0),f.value=""}function y(v){t(_,e(_).filter((f,d)=>d!==v),!0)}async function de(){if(e(_).length===0)return;t(ve,!0);let v=0;for(const f of e(_))try{const d=new FormData;d.append("file",f),e(_).length===1&&e(A).trim()&&d.append("key",e(A).trim());const c=await fetch(Bt(`data/storage/buckets/${m.bucket}/upload`),{method:"POST",headers:{Authorization:`Bearer ${J().accessToken}`},body:d});if(!c.ok){const b=await c.json().catch(()=>({message:"Upload failed"}));throw new Error(b.message||"Upload failed")}v++}catch(d){Pe(`Failed to upload ${f.name}: ${d instanceof Error?d.message:"Unknown error"}`)}t(ve,!1),v>0&&(Ye(`Uploaded ${v} file${v>1?"s":""}`),L(!1),F(),D()())}function K(v){if(v===0)return"0 B";const f=["B","KB","MB","GB"],d=Math.floor(Math.log(v)/Math.log(1024));return`${(v/Math.pow(1024,d)).toFixed(d===0?0:1)} ${f[d]}`}pt(ke,{title:"Upload Files",onclose:F,get open(){return L()},set open(f){L(f)},footer:f=>{var d=ra(),c=me(d);ce(c,{variant:"secondary",onclick:()=>{L(!1),F()},children:(N,ue)=>{j();var fe=ne("Cancel");n(N,fe)},$$slots:{default:!0}});var b=s(c,2);{let N=x(()=>e(_).length===0);ce(b,{variant:"primary",onclick:de,get loading(){return e(ve)},get disabled(){return e(N)},children:(ue,fe)=>{j();var U=ne();k(()=>M(U,`Upload ${e(_).length>0?`(${e(_).length})`:""}`)),n(ue,U)},$$slots:{default:!0}})}n(f,d)},children:(f,d)=>{var c=ca(),b=me(c);let N;var ue=s(l(b),6);r(b);var fe=s(b,2);{var U=T=>{var O=la(),Y=l(O);ta(Y,{label:"Custom key (optional)",get placeholder(){return e(_)[0].name},get value(){return e(A)},set value(H){t(A,H,!0)}}),r(O),n(T,O)};ie(fe,T=>{e(_).length===1&&T(U)})}var re=s(fe,2);{var X=T=>{var O=na();Qe(O,21,()=>e(o),Pt,(Y,H,Te)=>{var De=ia(),He=l(De);{var rt=pe=>{var ge=sa();k(()=>{q(ge,"src",e(H).url),q(ge,"alt",e(H).name)}),n(pe,ge)},Ce=pe=>{var ge=oa();n(pe,ge)};ie(He,pe=>{e(H).isImage?pe(rt):pe(Ce,!1)})}var Le=s(He,2),Be=l(Le),Ve=l(Be,!0);r(Be);var ee=s(Be,2),We=l(ee);r(ee),r(Le);var je=s(Le,2);r(De),k(()=>{M(Ve,e(H).name),M(We,`${e(H).size??""} · ${(e(H).type||"unknown")??""}`)}),W("click",je,()=>y(Te)),n(Y,De)}),r(O),n(T,O)};ie(re,T=>{e(o).length>0&&T(X)})}k(()=>{N=Me(b,1,"dropzone svelte-1myht9e",null,N,{"dropzone--active":e(z)}),q(b,"for",w),q(ue,"id",w)}),vt("dragover",b,T=>{T.preventDefault(),t(z,!0)}),vt("dragleave",b,()=>{t(z,!1)}),vt("drop",b,I),W("change",ue,R),n(f,c)},$$slots:{footer:!0,default:!0}}),at(),B()}ut(["change","click"]);var da=h("<img/>"),ua=h('<span><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" class="svelte-zoylhi"><rect x="2" y="2" width="12" height="12" rx="1.5" class="svelte-zoylhi"></rect><circle cx="5.5" cy="5.5" r="1" class="svelte-zoylhi"></circle><path d="M2 11l3-3 2 2 3-3 4 4" class="svelte-zoylhi"></path></svg></span>'),fa=h("<span></span>");function Ut(ke,m){tt(m,!0);let J=Oe(m,"alt",3,""),Q=Oe(m,"class",3,""),B=u(null),L=u(!1);St(()=>{const w=m.src;let o=!1,F=null;t(B,null),t(L,!1);const I=jt(ft);return fetch(w,{headers:I.accessToken?{Authorization:`Bearer ${I.accessToken}`}:{}}).then(R=>o||!R.ok?(o||t(L,!0),null):R.blob()).then(R=>{o||!R||(F=URL.createObjectURL(R),t(B,F,!0))}).catch(()=>{o||t(L,!0)}),()=>{o=!0,F&&URL.revokeObjectURL(F)}});var D=Mt(),_=me(D);{var A=w=>{var o=da();k(()=>{q(o,"src",e(B)),q(o,"alt",J()),Me(o,1,Gt(Q()),"svelte-zoylhi")}),n(w,o)},ve=w=>{var o=ua();k(()=>{Me(o,1,`auth-img-fallback ${Q()??""}`,"svelte-zoylhi"),q(o,"aria-label",J())}),n(w,o)},z=w=>{var o=fa();k(()=>Me(o,1,`auth-img-loading ${Q()??""}`,"svelte-zoylhi")),n(w,o)};ie(_,w=>{e(B)?w(A):e(L)?w(ve,1):w(z,!1)})}n(ke,D),at()}var pa=h('<div class="share__url-row svelte-vlp39"><input class="share__url-input svelte-vlp39" type="text" readonly=""/> <!></div>'),ha=h('<div class="share svelte-vlp39"><p class="share__filename svelte-vlp39"> </p> <div class="share__section svelte-vlp39"><div class="share__label svelte-vlp39"><span class="share__label-text svelte-vlp39">Public URL</span> <span class="share__hint svelte-vlp39">Works if bucket read rule allows public access</span></div> <div class="share__url-row svelte-vlp39"><input class="share__url-input svelte-vlp39" type="text" readonly=""/> <!></div></div> <div class="share__section svelte-vlp39"><div class="share__label svelte-vlp39"><span class="share__label-text svelte-vlp39">Signed URL</span> <span class="share__hint svelte-vlp39">Time-limited access, no auth required</span></div> <div class="share__signed-row svelte-vlp39"><!> <!></div> <!></div> <div class="share__usage svelte-vlp39"><p class="share__usage-title svelte-vlp39">Usage in HTML</p> <code class="share__code svelte-vlp39">&lt;img src="<span class="share__code-url svelte-vlp39">…copied URL…</span>" /&gt;</code></div></div>');function _a(ke,m){tt(m,!0);let J=Oe(m,"open",15,!1),Q=u("1h"),B=u(""),L=u(!1),D=u(null);const _=[{value:"1h",label:"1 hour"},{value:"1d",label:"1 day"},{value:"7d",label:"7 days"},{value:"30d",label:"30 days"}];let A=x(()=>qt(`/api/storage/${m.bucket}/${m.fileKey}`)),ve=x(()=>m.fileKey.includes("/")?m.fileKey.split("/").pop()??m.fileKey:m.fileKey);async function z(){t(L,!0),t(B,"");try{const o=await Xe.fetch(`data/storage/buckets/${m.bucket}/signed-url`,{method:"POST",body:{key:m.fileKey,expiresIn:e(Q)}});t(B,o.url,!0)}catch(o){Pe(o instanceof Error?o.message:"Failed to create signed URL")}finally{t(L,!1)}}async function w(o,F){try{await navigator.clipboard.writeText(o),t(D,F,!0),Ye("URL copied to clipboard"),setTimeout(()=>{t(D,null)},2e3)}catch{Pe("Failed to copy URL")}}St(()=>{J()&&(t(B,""),t(D,null))}),pt(ke,{title:"Share File",get open(){return J()},set open(o){J(o)},children:(o,F)=>{var I=ha(),R=l(I),y=l(R,!0);r(R);var de=s(R,2),K=s(l(de),2),v=l(K);et(v);var f=s(v,2);{let U=x(()=>e(D)==="public"?"primary":"secondary");ce(f,{get variant(){return e(U)},size:"sm",onclick:()=>w(e(A),"public"),children:(re,X)=>{j();var T=ne();k(()=>M(T,e(D)==="public"?"Copied!":"Copy")),n(re,T)},$$slots:{default:!0}})}r(K),r(de);var d=s(de,2),c=s(l(d),2),b=l(c);aa(b,{get options(){return _},get value(){return e(Q)},set value(U){t(Q,U,!0)}});var N=s(b,2);ce(N,{variant:"primary",size:"sm",get loading(){return e(L)},onclick:z,children:(U,re)=>{j();var X=ne("Generate");n(U,X)},$$slots:{default:!0}}),r(c);var ue=s(c,2);{var fe=U=>{var re=pa(),X=l(re);et(X);var T=s(X,2);{let O=x(()=>e(D)==="signed"?"primary":"secondary");ce(T,{get variant(){return e(O)},size:"sm",onclick:()=>w(e(B),"signed"),children:(Y,H)=>{j();var Te=ne();k(()=>M(Te,e(D)==="signed"?"Copied!":"Copy")),n(Y,Te)},$$slots:{default:!0}})}r(re),k(()=>$t(X,e(B))),W("click",X,O=>O.currentTarget.select()),n(U,re)};ie(ue,U=>{e(B)&&U(fe)})}r(d),j(2),r(I),k(()=>{M(y,e(ve)),$t(v,e(A))}),W("click",v,U=>U.currentTarget.select()),n(o,I)},$$slots:{default:!0}}),at()}ut(["click"]);var ma=h("<!> <a><!></a>",1),ga=h('<span class="breadcrumb__sep svelte-f2o7w5">/</span> <button> </button>',1),wa=h('<div class="bulk-bar svelte-f2o7w5"><span class="bulk-bar__count svelte-f2o7w5"> </span> <div class="bulk-bar__actions svelte-f2o7w5"><!></div> <button class="bulk-bar__clear svelte-f2o7w5">Clear</button></div>'),ya=h('<div class="loading-state svelte-f2o7w5">Loading files...</div>'),ba=h('<tr class="folder-row svelte-f2o7w5"><td class="col-checkbox svelte-f2o7w5"></td><td class="col-preview svelte-f2o7w5"><span class="folder-icon svelte-f2o7w5"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M2 4V13H14V5H8L6.5 3H2V4Z" stroke-linejoin="round"></path></svg></span></td><td class="col-key svelte-f2o7w5" colspan="4"><button class="folder-btn svelte-f2o7w5"> </button></td><td class="col-actions svelte-f2o7w5"></td></tr>'),ka=h('<button type="button" class="thumb-button svelte-f2o7w5"><!></button>'),$a=h('<span class="file-icon svelte-f2o7w5"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M4 2H10L13 5V14H4V2Z" stroke-linejoin="round"></path><path d="M10 2V5H13"></path></svg></span>'),xa=h('<tr><td class="col-checkbox svelte-f2o7w5"><input type="checkbox" class="svelte-f2o7w5"/></td><td class="col-preview svelte-f2o7w5"><!></td><td class="col-key svelte-f2o7w5"><span class="file-key svelte-f2o7w5"> </span></td><td class="col-size svelte-f2o7w5"> </td><td class="col-type svelte-f2o7w5"><span class="mime-type svelte-f2o7w5"> </span></td><td class="col-date svelte-f2o7w5"> </td><td class="col-actions svelte-f2o7w5"><div class="action-btns svelte-f2o7w5"><button class="icon-btn svelte-f2o7w5" title="Download"><svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><path d="M8 2v9M4 8l4 4 4-4" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2 13h12" stroke-linecap="round"></path></svg></button> <button class="icon-btn svelte-f2o7w5" title="Share"><svg width="14" height="14" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="4" cy="8" r="2"></circle><circle cx="12" cy="4" r="2"></circle><circle cx="12" cy="12" r="2"></circle><path d="M5.7 7l4.6-2M5.7 9l4.6 2"></path></svg></button> <!></div></td></tr>'),za=h('<div class="pagination svelte-f2o7w5"><!></div>'),Ua=h('<div class="table-wrapper svelte-f2o7w5"><table class="file-table svelte-f2o7w5"><thead class="svelte-f2o7w5"><tr><th class="col-checkbox svelte-f2o7w5"><input type="checkbox" aria-label="Select all files" class="svelte-f2o7w5"/></th><th class="col-preview svelte-f2o7w5"></th><th class="col-key svelte-f2o7w5">Name</th><th class="col-size svelte-f2o7w5">Size</th><th class="col-type svelte-f2o7w5">Type</th><th class="col-date svelte-f2o7w5">Uploaded</th><th class="col-actions svelte-f2o7w5"></th></tr></thead><tbody class="svelte-f2o7w5"><!><!></tbody></table></div> <!>',1),Sa=h('<nav class="breadcrumb svelte-f2o7w5"><button> </button> <!></nav> <!> <!>',1),Pa=h('<div class="image-preview svelte-f2o7w5"><div class="image-preview__frame svelte-f2o7w5"><!></div> <dl class="image-preview__meta svelte-f2o7w5"><div class="image-preview__meta-row svelte-f2o7w5"><dt class="svelte-f2o7w5">Path</dt> <dd class="svelte-f2o7w5"> </dd></div> <div class="image-preview__meta-row svelte-f2o7w5"><dt class="svelte-f2o7w5">Type</dt> <dd class="svelte-f2o7w5"> </dd></div> <div class="image-preview__meta-row svelte-f2o7w5"><dt class="svelte-f2o7w5">Size</dt> <dd class="svelte-f2o7w5"> </dd></div> <div class="image-preview__meta-row svelte-f2o7w5"><dt class="svelte-f2o7w5">Uploaded</dt> <dd class="svelte-f2o7w5"> </dd></div></dl></div>'),Ma=h("<!> <!> <!> <!> <!> <!>",1);function Qa(ke,m){tt(m,!0);const J=()=>dt(Zt,"$page",B),Q=()=>dt(ft,"$authStore",B),[B,L]=Tt();let D=u(!1),_=u(!1),A=u("");function ve(a){return!!a&&a.startsWith("image/")}let z=x(()=>J().params.bucket??""),w=u(!0),o=u(Je([])),F=u(Je([])),I=u(null),R=u(!1),y=u(""),de=u(!1),K=u(null),v=u(!1),f=u(!1),d=u(null),c=u(Je(new Set)),b=u(!1),N=u(!1);function ue(a){const i=new Set(e(c));i.has(a)?i.delete(a):i.add(a),t(c,i,!0)}function fe(){e(c).size===e(o).length?t(c,new Set,!0):t(c,new Set(e(o).map(a=>a.key)),!0)}function U(){t(c,new Set,!0)}async function re(){t(b,!1),t(N,!0);const a=[...e(c)],i=await Promise.allSettled(a.map(async S=>{await Xe.fetch(`data/storage/buckets/${e(z)}/objects/${encodeURIComponent(S)}`,{method:"DELETE"})})),g=i.filter(S=>S.status==="fulfilled").length,$=i.filter(S=>S.status==="rejected").length;$===0?Ye(`Deleted ${g} file${g!==1?"s":""}`):Pe(`${g} succeeded, ${$} failed`),t(c,new Set,!0),t(N,!1),Y()}let X=x(()=>(()=>{if(!e(y))return[];const a=e(y).replace(/\/$/,"").split("/");return a.map((i,g)=>({label:i,prefix:a.slice(0,g+1).join("/")+"/"}))})());function T(a){return a?a.endsWith("/")?a:`${a}/`:""}function O(a){const i=new URL(window.location.href);a?i.searchParams.set("prefix",a):i.searchParams.delete("prefix"),history.replaceState(history.state,"",i.toString())}async function Y(a=!1){a?t(R,!0):t(w,!0);try{let i=`data/storage/buckets/${e(z)}/objects?limit=50&delimiter=/`;e(y)&&(i+=`&prefix=${encodeURIComponent(e(y))}`),a&&e(I)&&(i+=`&cursor=${encodeURIComponent(e(I))}`);const g=await Xe.fetch(i),$=(g.objects||[]).filter(S=>(e(y)?S.key.replace(e(y),""):S.key).length>0);a?t(o,[...e(o),...$],!0):(t(o,$,!0),t(F,g.folders||[],!0)),t(I,g.cursor,!0)}catch(i){Pe(i instanceof Error?i.message:"Failed to load objects")}finally{t(w,!1),t(R,!1)}}function H(a){t(y,T(a),!0),O(e(y)),t(I,null),t(c,new Set,!0),Y()}function Te(a){t(K,a,!0),t(de,!0)}function De(a){t(d,a,!0),t(f,!0)}function He(){t(f,!1),t(d,null)}async function rt(){if(e(K)){t(v,!0);try{await Xe.fetch(`data/storage/buckets/${e(z)}/objects/${encodeURIComponent(e(K))}`,{method:"DELETE"}),t(o,e(o).filter(a=>a.key!==e(K)),!0),e(c).delete(e(K)),t(c,new Set(e(c)),!0),Ye(`Deleted ${e(K)}`)}catch(a){Pe(a instanceof Error?a.message:"Failed to delete object")}finally{t(v,!1),t(K,null)}}}function Ce(a){return Bt(`data/storage/buckets/${e(z)}/objects/${encodeURIComponent(a)}`)}async function Le(a){try{const i=await fetch(Ce(a),{headers:{Authorization:`Bearer ${Q().accessToken}`}});if(!i.ok){const $=await i.json().catch(()=>({message:"Download failed"}));throw new Error($.message||"Download failed")}const g=await i.blob();Qt(g,ee(a))}catch(i){Pe(i instanceof Error?i.message:"Failed to download file")}}function Be(a){if(a===0)return"0 B";const i=["B","KB","MB","GB","TB"],g=Math.floor(Math.log(a)/Math.log(1024));return`${(a/Math.pow(1024,g)).toFixed(g===0?0:1)} ${i[g]}`}function Ve(a){try{return new Date(a).toLocaleString()}catch{return a}}function ee(a){return e(y)&&a.startsWith(e(y))?a.slice(e(y).length):a}Nt(()=>{t(y,T(J().url.searchParams.get("prefix")??""),!0),Y()});var We=Ma(),je=me(We);Xt(je,{get title(){return e(z)},description:"Browse files in this bucket",get docsHref(){return Yt},actions:i=>{var g=ma(),$=me(g);ce($,{variant:"primary",size:"sm",onclick:()=>t(D,!0),children:(se,$e)=>{j();var he=ne("Upload Files");n(se,he)},$$slots:{default:!0}});var S=s($,2),le=l(S);ce(le,{variant:"secondary",size:"sm",children:(se,$e)=>{j();var he=ne("Back to Buckets");n(se,he)},$$slots:{default:!0}}),r(S),k(()=>q(S,"href",`${Jt}/storage`)),n(i,g)},children:(i,g)=>{var $=Sa(),S=me($),le=l(S);let se;var $e=l(le,!0);r(le);var he=s(le,2);Qe(he,17,()=>e(X),Pt,(P,C)=>{var E=ga(),G=s(me(E),2);let Z;var _e=l(G,!0);r(G),k(()=>{Z=Me(G,1,"breadcrumb__item svelte-f2o7w5",null,Z,{"breadcrumb__item--active":e(C).prefix===e(y)}),M(_e,e(C).label)}),W("click",G,()=>H(e(C).prefix)),n(P,E)}),r(S);var Ne=s(S,2);{var Ge=P=>{var C=wa(),E=l(C),G=l(E);r(E);var Z=s(E,2),_e=l(Z);ce(_e,{variant:"danger",size:"sm",onclick:()=>t(b,!0),get disabled(){return e(N)},children:(ze,Ue)=>{j();var we=ne("Delete Selected");n(ze,we)},$$slots:{default:!0}}),r(Z);var xe=s(Z,2);r(C),k(()=>M(G,`${e(c).size??""} selected`)),W("click",xe,U),n(P,C)};ie(Ne,P=>{e(c).size>0&&P(Ge)})}var Fe=s(Ne,2);{var Ze=P=>{var C=ya();n(P,C)},lt=P=>{{let C=x(()=>e(y)?"This folder is empty.":"This bucket is empty.");ea(P,{title:"No files",get description(){return e(C)}})}},Re=P=>{var C=Ua(),E=me(C),G=l(E),Z=l(G),_e=l(Z),xe=l(_e),ze=l(xe);et(ze),r(xe),j(6),r(_e),r(Z);var Ue=s(Z),we=l(Ue);Qe(we,16,()=>e(F),te=>te,(te,p)=>{var oe=ba(),Se=s(l(oe),2),ye=l(Se),be=l(ye);r(ye),r(Se),j(),r(oe),k(Ie=>M(be,`${Ie??""}/`),[()=>p.replace(e(y),"").replace(/\/$/,"")]),W("click",ye,()=>H(p)),n(te,oe)});var qe=s(we);Qe(qe,17,()=>e(o),te=>te.key,(te,p)=>{var oe=xa();let Se;var ye=l(oe),be=l(ye);et(be),r(ye);var Ie=s(ye),Ft=l(Ie);{var Rt=V=>{var ae=ka(),Ee=l(ae);{let Ae=x(()=>Ce(e(p).key)),Ke=x(()=>ee(e(p).key));Ut(Ee,{class:"file-thumb",get src(){return e(Ae)},get alt(){return e(Ke)}})}r(ae),k((Ae,Ke)=>{q(ae,"aria-label",Ae),q(ae,"title",Ke)},[()=>`Preview ${ee(e(p).key)}`,()=>`Preview ${ee(e(p).key)}`]),W("click",ae,()=>De(e(p))),n(V,ae)},It=x(()=>{var V;return ve((V=e(p).httpMetadata)==null?void 0:V.contentType)}),Et=V=>{var ae=$a();n(V,ae)};ie(Ft,V=>{e(It)?V(Rt):V(Et,!1)})}r(Ie);var st=s(Ie),ot=l(st),At=l(ot,!0);r(ot),r(st);var it=s(st),Kt=l(it,!0);r(it);var nt=s(it),mt=l(nt),Ot=l(mt,!0);r(mt),r(nt);var ct=s(nt),Ht=l(ct,!0);r(ct);var gt=s(ct),wt=l(gt),yt=l(wt),bt=s(yt,2),Vt=s(bt,2);ce(Vt,{variant:"danger",size:"sm",onclick:()=>Te(e(p).key),children:(V,ae)=>{j();var Ee=ne("Delete");n(V,Ee)},$$slots:{default:!0}}),r(wt),r(gt),r(oe),k((V,ae,Ee,Ae,Ke,Wt)=>{var kt;Se=Me(oe,1,"svelte-f2o7w5",null,Se,V),xt(be,ae),q(be,"aria-label",`Select ${Ee??""}`),q(ot,"title",e(p).key),M(At,Ae),M(Kt,Ke),M(Ot,((kt=e(p).httpMetadata)==null?void 0:kt.contentType)??"--"),M(Ht,Wt)},[()=>({"row--selected":e(c).has(e(p).key)}),()=>e(c).has(e(p).key),()=>ee(e(p).key),()=>ee(e(p).key),()=>Be(e(p).size),()=>Ve(e(p).uploaded)]),W("change",be,()=>ue(e(p).key)),W("click",yt,()=>Le(e(p).key)),W("click",bt,()=>{t(A,e(p).key,!0),t(_,!0)}),n(te,oe)}),r(Ue),r(G),r(E);var Ct=s(E,2);{var Lt=te=>{var p=za(),oe=l(p);ce(oe,{variant:"secondary",get loading(){return e(R)},onclick:()=>Y(!0),children:(Se,ye)=>{j();var be=ne("Load More");n(Se,be)},$$slots:{default:!0}}),r(p),n(te,p)};ie(Ct,te=>{e(I)&&te(Lt)})}k(()=>xt(ze,e(o).length>0&&e(c).size===e(o).length)),W("change",ze,fe),n(P,C)};ie(Fe,P=>{e(w)?P(Ze):e(o).length===0&&e(F).length===0?P(lt,1):P(Re,!1)})}k(()=>{se=Me(le,1,"breadcrumb__item svelte-f2o7w5",null,se,{"breadcrumb__item--active":!e(y)}),M($e,e(z))}),W("click",le,()=>H("")),n(i,$)}});var pe=s(je,2);{let a=x(()=>`Are you sure you want to delete "${e(K)??""}"? This action cannot be undone.`);zt(pe,{title:"Delete File",get message(){return e(a)},confirmLabel:"Delete",confirmVariant:"danger",onconfirm:rt,get open(){return e(de)},set open(i){t(de,i,!0)}})}var ge=s(pe,2);{let a=x(()=>e(c).size),i=x(()=>e(c).size!==1?"s":""),g=x(()=>`Are you sure you want to delete ${e(c).size} selected file${e(c).size!==1?"s":""}? This action cannot be undone.`);zt(ge,{get title(){return`Delete ${e(a)??""} File${e(i)??""}`},get message(){return e(g)},confirmLabel:"Delete All",confirmVariant:"danger",onconfirm:re,get open(){return e(b)},set open($){t(b,$,!0)}})}var ht=s(ge,2);va(ht,{get bucket(){return e(z)},onUploaded:()=>Y(),get open(){return e(D)},set open(a){t(D,a,!0)}});var _t=s(ht,2);{let a=x(()=>e(d)?ee(e(d).key):"Image Preview");pt(_t,{get title(){return e(a)},maxWidth:"min(92vw, 960px)",onclose:He,get open(){return e(f)},set open(i){t(f,i,!0)},children:(i,g)=>{var $=Mt(),S=me($);{var le=se=>{var $e=Pa(),he=l($e),Ne=l(he);{let Ue=x(()=>Ce(e(d).key)),we=x(()=>`Preview of ${ee(e(d).key)}`);Ut(Ne,{class:"image-preview__image",get src(){return e(Ue)},get alt(){return e(we)}})}r(he);var Ge=s(he,2),Fe=l(Ge),Ze=s(l(Fe),2),lt=l(Ze,!0);r(Ze),r(Fe);var Re=s(Fe,2),P=s(l(Re),2),C=l(P,!0);r(P),r(Re);var E=s(Re,2),G=s(l(E),2),Z=l(G,!0);r(G),r(E);var _e=s(E,2),xe=s(l(_e),2),ze=l(xe,!0);r(xe),r(_e),r(Ge),r($e),k((Ue,we)=>{var qe;M(lt,e(d).key),M(C,((qe=e(d).httpMetadata)==null?void 0:qe.contentType)??"--"),M(Z,Ue),M(ze,we)},[()=>Be(e(d).size),()=>Ve(e(d).uploaded)]),n(se,$e)};ie(S,se=>{e(d)&&se(le)})}n(i,$)},$$slots:{default:!0}})}var Dt=s(_t,2);_a(Dt,{get bucket(){return e(z)},get fileKey(){return e(A)},get open(){return e(_)},set open(a){t(_,a,!0)}}),n(ke,We),at(),L()}ut(["click","change"]);export{Qa as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as $e}from"../chunks/Bn2NtlTj.js";import{p as Me,f as Y,a as ye,b as D,g as e,d as q,c as n,s as l,r as s,ae as je,t as H,u as v}from"../chunks/BdTBlfLy.js";import{s as m}from"../chunks/DtZk82gG.js";import{i as B}from"../chunks/Y22E1hJM.js";import{a as He,t as Be,e as ee,i as te}from"../chunks/BEW7Ez_g.js";import{h as Ve}from"../chunks/DHWOQ9Ui.js";import{c as Te,a as h,f as p}from"../chunks/DEELgv7K.js";import{a as F,s as re}from"../chunks/CoI6jjbg.js";import{s as Re,a as Se}from"../chunks/Cp8V0Xy2.js";import{b as L}from"../chunks/Cw6OYcq-.js";import{a as Pe}from"../chunks/BoOooyH6.js";import{g as Ae}from"../chunks/R6arueIl.js";import{P as De}from"../chunks/B8s_s9QY.js";import{M as V,T as qe}from"../chunks/BqTb6Mxk.js";import{b as ae}from"../chunks/Q2nPFxS6.js";var Fe=p('<div class="overview-panel__loading svelte-1uha8ag">Loading...</div>'),Ee=p('<div class="overview-service svelte-1uha8ag"><span></span> <span class="overview-service__name svelte-1uha8ag"> </span> <span class="overview-service__detail svelte-1uha8ag"> </span></div>'),Ue=p('<div class="overview-services svelte-1uha8ag"></div>'),Oe=p('<div class="overview-info__row svelte-1uha8ag"><span class="overview-info__label svelte-1uha8ag">Auth</span> <span class="overview-info__value svelte-1uha8ag"> </span></div>'),Ze=p('<div class="overview-info__row svelte-1uha8ag"><span class="overview-info__label svelte-1uha8ag">Buckets</span> <span class="overview-info__value svelte-1uha8ag"> </span></div>'),Ke=p('<div class="overview-info svelte-1uha8ag"><!> <!> <div class="overview-info__row svelte-1uha8ag"><span class="overview-info__label svelte-1uha8ag">Service Keys</span> <span class="overview-info__value svelte-1uha8ag"> </span></div> <div class="overview-info__row svelte-1uha8ag"><span class="overview-info__label svelte-1uha8ag">Mode</span> <span> </span></div></div>'),Qe=p('<a class="overview-action svelte-1uha8ag"><span class="overview-action__icon svelte-1uha8ag"><!></span> <span class="overview-action__label svelte-1uha8ag"> </span> <span class="overview-action__arrow svelte-1uha8ag"><svg width="14" height="14" viewBox="0 0 16 16" fill="none"><path d="M6 4L10 8L6 12" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></a>'),ze=p('<div class="overview-metrics svelte-1uha8ag"><!> <!> <!> <!> <!></div> <div class="overview-chart svelte-1uha8ag"><!></div> <div class="overview-panels svelte-1uha8ag"><div class="overview-panel svelte-1uha8ag"><h3 class="overview-panel__title svelte-1uha8ag">Services</h3> <!> <!></div> <div class="overview-panel svelte-1uha8ag"><h3 class="overview-panel__title svelte-1uha8ag">Quick Actions</h3> <div class="overview-actions svelte-1uha8ag"></div></div></div>',1);function vt(oe,se){Me(se,!0);const ie=()=>Se(Pe,"$authStore",ne),[ne,le]=Re();let E=q(!1),u=q(!0),i=q(null);const ve={"1h":{cardLabel:"1H",chartLabel:"Last 1 hour"},"6h":{cardLabel:"6H",chartLabel:"Last 6 hours"},"24h":{cardLabel:"24H",chartLabel:"Last 24 hours"}};async function ce(){try{const r=await He.fetch("data/overview");D(i,r,!0)}catch(r){Be(r instanceof Error?r.message:"Failed to load dashboard overview. Check your server connection and try reloading.")}finally{D(u,!1)}}const de=v(()=>()=>{var _,$;if(!(($=(_=e(i))==null?void 0:_.traffic)!=null&&$.summary))return 0;const{totalRequests:r,totalErrors:b}=e(i).traffic.summary;return r>0?b/r*100:0}),he=v(()=>()=>{var r,b;return(b=(r=e(i))==null?void 0:r.traffic)!=null&&b.timeSeries?e(i).traffic.timeSeries.map(_=>({timestamp:_.timestamp,value:_.requests??_.value??0})):[]}),U=v(()=>{var r;return((r=e(i))==null?void 0:r.traffic.appliedRange)??"24h"}),O=v(()=>ve[e(U)]),ue=v(()=>Ae(e(U)));$e(()=>{ie().accessToken&&(D(E,!0),ce())});const ge=[{label:"Users",href:`${L}/auth`,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="5" r="2.5" stroke="currentColor" stroke-width="1.5"/><path d="M3 14C3 11.2386 5.23858 9 8 9C10.7614 9 13 11.2386 13 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'},{label:"Schema",href:`${L}/database/tables`,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><rect x="2" y="2" width="5" height="5" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="9" y="9" width="5" height="5" rx="1" stroke="currentColor" stroke-width="1.5"/><path d="M7 4.5H9.5V9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>'},{label:"ERD",href:`${L}/database/erd`,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><rect x="1" y="2" width="5" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="10" y="10" width="5" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><path d="M6 4H8.5V12H10" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>'},{label:"Files",href:`${L}/storage`,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><path d="M2 4L8 2L14 4V12L8 14L2 12V4Z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M2 4L8 6L14 4" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M8 6V14" stroke="currentColor" stroke-width="1.5"/></svg>'},{label:"Analytics",href:`${L}/analytics`,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><rect x="2" y="9" width="3" height="5" rx="0.5" stroke="currentColor" stroke-width="1.5"/><rect x="6.5" y="5" width="3" height="9" rx="0.5" stroke="currentColor" stroke-width="1.5"/><rect x="11" y="2" width="3" height="12" rx="0.5" stroke="currentColor" stroke-width="1.5"/></svg>'},{label:"Logs",href:`${L}/logs`,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><path d="M4 4H12M4 7H10M4 10H12M4 13H8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'},{label:"Docs",href:ae,external:!0,icon:'<svg width="18" height="18" viewBox="0 0 16 16" fill="none"><path d="M3 2H10L13 5V14H3V2Z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M10 2V5H13" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 8H10M6 10.5H9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'}],pe=v(()=>()=>{if(!e(i))return[];const r=e(i).project;return[{name:"Auth",active:!0,detail:`${r.authProviders.length} provider${r.authProviders.length!==1?"s":""}`},{name:"Database",active:r.totalTables>0,detail:`${r.totalTables} table${r.totalTables!==1?"s":""}`},{name:"Storage",active:r.storageBuckets.length>0,detail:`${r.storageBuckets.length} bucket${r.storageBuckets.length!==1?"s":""}`},{name:"Live",active:!0,detail:`${r.liveConnections} conn${r.liveConnections!==1?"s":""}`}]});var Z=Te(),_e=Y(Z);{var we=r=>{De(r,{title:"Overview",description:"Project dashboard",get docsHref(){return ae},children:(b,_)=>{var $=ze(),T=Y($),K=n(T);{let a=v(()=>{var t,o;return((o=(t=e(i))==null?void 0:t.project)==null?void 0:o.totalUsers)??0});V(K,{label:"Total Users",get value(){return e(a)},get loading(){return e(u)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="5" r="2.5" stroke="currentColor" stroke-width="1.5"/><path d="M3 14C3 11.2386 5.23858 9 8 9C10.7614 9 13 11.2386 13 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'})}var Q=l(K,2);{let a=v(()=>{var t,o;return((o=(t=e(i))==null?void 0:t.project)==null?void 0:o.totalTables)??0});V(Q,{label:"Tables",get value(){return e(a)},get loading(){return e(u)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="2" width="5" height="5" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="9" y="9" width="5" height="5" rx="1" stroke="currentColor" stroke-width="1.5"/><path d="M7 4.5H9.5V9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>'})}var z=l(Q,2);{let a=v(()=>`Requests (${e(O).cardLabel})`),t=v(()=>{var o,c,d;return((d=(c=(o=e(i))==null?void 0:o.traffic)==null?void 0:c.summary)==null?void 0:d.totalRequests)??0});V(z,{get label(){return e(a)},get value(){return e(t)},get loading(){return e(u)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14V8L5 4L8 7L11 2L14 6V14H2Z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>'})}var G=l(z,2);{let a=v(()=>e(de)().toFixed(1));V(G,{label:"5xx Rate",get value(){return e(a)},unit:"%",get loading(){return e(u)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 5V9M8 11V11.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'})}var fe=l(G,2);{let a=v(()=>{var t,o;return((o=(t=e(i))==null?void 0:t.project)==null?void 0:o.liveConnections)??0});V(fe,{label:"Live",get value(){return e(a)},unit:"conns",get loading(){return e(u)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M1 8H3L5 3L8 13L11 6L13 8H15" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>'})}s(T);var R=l(T,2),ke=n(R);{let a=v(()=>e(he)()),t=v(()=>`Requests — ${e(O).chartLabel}`);qe(ke,{get data(){return e(a)},type:"line",height:240,get label(){return e(t)},get formatTime(){return e(ue)},get loading(){return e(u)}})}s(R);var I=l(R,2),S=n(I),J=l(n(S),2);{var me=a=>{var t=Fe();h(a,t)},be=a=>{var t=Ue();ee(t,21,()=>e(pe)(),te,(o,c)=>{var d=Ee(),w=n(d);let g;var x=l(w,2),P=n(x,!0);s(x);var M=l(x,2),y=n(M,!0);s(M),s(d),H(()=>{g=re(w,1,"overview-service__dot svelte-1uha8ag",null,g,{"overview-service__dot--active":e(c).active}),m(P,e(c).name),m(y,e(c).detail)}),h(o,d)}),s(t),h(a,t)};B(J,a=>{e(u)?a(me):a(be,!1)})}var xe=l(J,2);{var Ce=a=>{var t=Ke(),o=n(t);{var c=f=>{var k=Oe(),j=l(n(k),2),A=n(j,!0);s(j),s(k),H(C=>m(A,C),[()=>e(i).project.authProviders.map(C=>C.charAt(0).toUpperCase()+C.slice(1)).join(", ")]),h(f,k)};B(o,f=>{e(i).project.authProviders.length>0&&f(c)})}var d=l(o,2);{var w=f=>{var k=Ze(),j=l(n(k),2),A=n(j,!0);s(j),s(k),H(C=>m(A,C),[()=>e(i).project.storageBuckets.join(", ")]),h(f,k)};B(d,f=>{e(i).project.storageBuckets.length>0&&f(w)})}var g=l(d,2),x=l(n(g),2),P=n(x,!0);s(x),s(g);var M=l(g,2),y=l(n(M),2);let X;var Le=n(y,!0);s(y),s(M),s(t),H(()=>{m(P,e(i).project.serviceKeyCount),X=re(y,1,"overview-info__value overview-info__badge svelte-1uha8ag",null,X,{"overview-info__badge--dev":e(i).project.devMode}),m(Le,e(i).project.devMode?"Development":"Production")}),h(a,t)};B(xe,a=>{var t;(t=e(i))!=null&&t.project&&a(Ce)})}s(S);var N=l(S,2),W=l(n(N),2);ee(W,21,()=>ge,te,(a,t)=>{var o=Qe(),c=n(o),d=n(c);Ve(d,()=>e(t).icon),s(c);var w=l(c,2),g=n(w,!0);s(w),je(2),s(o),H(()=>{F(o,"href",e(t).href),F(o,"target",e(t).external?"_blank":void 0),F(o,"rel",e(t).external?"noreferrer":void 0),m(g,e(t).label)}),h(a,o)}),s(W),s(N),s(I),h(b,$)}})};B(_e,r=>{e(E)&&r(we)})}h(oe,Z),ye(),le()}export{vt as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as nt}from"../chunks/Bn2NtlTj.js";import{p as it,a as lt,g as t,f as ct,c as f,s as c,r as d,u as l,t as S,b as m,d as y,ae as ut}from"../chunks/BdTBlfLy.js";import{d as vt,s as j,a as U}from"../chunks/DtZk82gG.js";import{i as B}from"../chunks/Y22E1hJM.js";import{a as dt,t as z,e as mt,i as gt}from"../chunks/BEW7Ez_g.js";import{a as x,f as C}from"../chunks/DEELgv7K.js";import{s as Z,a as pt,r as G}from"../chunks/CoI6jjbg.js";import{b as J}from"../chunks/CYatlt7w.js";import{g as ft}from"../chunks/R6arueIl.js";import{P as ht}from"../chunks/B8s_s9QY.js";import{a as _t}from"../chunks/Q2nPFxS6.js";import{M as H,T as bt}from"../chunks/BqTb6Mxk.js";import{D as yt,T as kt}from"../chunks/D2j3I1VQ.js";var wt=C("<button> </button>"),xt=C('<div class="analytics-actions__custom svelte-1m0gshv"><input type="datetime-local" class="custom-date-input svelte-1m0gshv"/> <span class="custom-date-sep svelte-1m0gshv">→</span> <input type="datetime-local" class="custom-date-input svelte-1m0gshv"/> <button class="custom-date-apply svelte-1m0gshv">Apply</button></div>'),Ct=C('<span class="analytics-actions__updated svelte-1m0gshv"> </span>'),Tt=C('<span class="analytics-actions__dot svelte-1m0gshv"></span>'),Dt=C('<div class="analytics-actions svelte-1m0gshv"><div class="analytics-actions__ranges svelte-1m0gshv"></div> <button type="button">Exclude admin traffic</button> <!> <div class="analytics-actions__status svelte-1m0gshv"><!> <button><!> ⟳</button></div></div>'),$t=C('<p class="analytics-custom-error svelte-1m0gshv"> </p>'),Mt=C('<div class="analytics-grid svelte-1m0gshv"><!> <!> <!> <!></div> <div class="analytics-chart svelte-1m0gshv"><!></div> <!> <div class="analytics-bottom svelte-1m0gshv"><!> <!></div>',1);function Ot(K,Q){it(Q,!0);let v=y(!0),u=y(null),h=y("24h"),T=y(!0),P=y(""),E=y(!1);const W=[{value:"1h",label:"1H"},{value:"6h",label:"6H"},{value:"24h",label:"24H"},{value:"7d",label:"7D"},{value:"30d",label:"30D"},{value:"custom",label:"Custom"}];let g=y(""),p=y("");const D=l(()=>()=>{if(t(h)!=="custom"||!t(g)||!t(p))return"";const e=new Date(t(g)).getTime(),r=new Date(t(p)).getTime();return Number.isNaN(e)||Number.isNaN(r)?"Enter a valid start and end time.":r<e?"End time must be after the start time.":""});async function A(){try{const e=new URLSearchParams({metric:"overview"});t(h)==="custom"&&t(g)&&t(p)?(e.set("start",new Date(t(g)).toISOString()),e.set("end",new Date(t(p)).toISOString())):e.set("range",t(h)),t(E)&&e.set("excludeCategory","admin");const r=`data/analytics?${e.toString()}`,_=await dt.fetch(r);m(u,_,!0),m(P,new Date().toLocaleTimeString(),!0)}catch(e){z(e instanceof Error?e.message:"Failed to load analytics data")}finally{m(v,!1)}}function X(e){m(h,e,!0),e!=="custom"&&(m(v,!0),A())}function Y(){m(E,!t(E)),(t(h)!=="custom"||t(g)&&t(p)&&!t(D)())&&(m(v,!0),A())}function tt(){if(!(!t(g)||!t(p))){if(t(D)()){z(t(D)());return}m(v,!0),A()}}nt(()=>{A();const e=setInterval(()=>{t(T)&&A()},3e4);return()=>clearInterval(e)});const et=l(()=>()=>{var _;if(!((_=t(u))!=null&&_.summary))return 0;const{totalRequests:e,totalErrors:r}=t(u).summary;return e>0?r/e*100:0}),at=l(()=>()=>{var e;return(e=t(u))!=null&&e.timeSeries?t(u).timeSeries.map(r=>({timestamp:r.timestamp,value:r.requests??r.value??0})):[]}),rt=l(()=>ft(t(h),t(g),t(p))),st=l(()=>()=>{var e;return(e=t(u))!=null&&e.breakdown?t(u).breakdown.map(r=>({label:r.label||"other",value:r.count})):[]}),ot=l(()=>()=>{var e;return(e=t(u))!=null&&e.topItems?t(u).topItems.map(r=>({label:r.label,count:r.count,secondary:`${Math.round(r.avgLatency)}ms avg · ${r.errorRate.toFixed(1)}% 5xx`})):[]});ht(K,{title:"Analytics",description:"API traffic and performance overview",get docsHref(){return _t},actions:r=>{var _=Dt(),$=f(_);mt($,21,()=>W,gt,(o,n)=>{var a=wt();let s;var i=f(a,!0);d(a),S(()=>{s=Z(a,1,"analytics-actions__range-btn svelte-1m0gshv",null,s,{"analytics-actions__range-btn--active":t(h)===t(n).value}),j(i,t(n).label)}),U("click",a,()=>X(t(n).value)),x(o,a)}),d($);var k=c($,2);let L;var R=c(k,2);{var I=o=>{var n=xt(),a=f(n);G(a);var s=c(a,4);G(s);var i=c(s,2);d(n),S(w=>i.disabled=w,[()=>!t(g)||!t(p)||!!t(D)()]),J(a,()=>t(g),w=>m(g,w)),J(s,()=>t(p),w=>m(p,w)),U("click",i,tt),x(o,n)};B(R,o=>{t(h)==="custom"&&o(I)})}var q=c(R,2),M=f(q);{var V=o=>{var n=Ct(),a=f(n);d(n),S(()=>j(a,`Updated ${t(P)??""}`)),x(o,n)};B(M,o=>{t(P)&&o(V)})}var b=c(M,2);let F;var O=f(b);{var N=o=>{var n=Tt();x(o,n)};B(O,o=>{t(T)&&o(N)})}ut(),d(b),d(q),d(_),S(()=>{L=Z(k,1,"analytics-actions__filter-btn svelte-1m0gshv",null,L,{"analytics-actions__filter-btn--active":t(E)}),F=Z(b,1,"analytics-actions__refresh-btn svelte-1m0gshv",null,F,{"analytics-actions__refresh-btn--active":t(T)}),pt(b,"title",t(T)?"Auto-refresh ON (30s)":"Auto-refresh OFF")}),U("click",k,Y),U("click",b,()=>m(T,!t(T))),x(r,_)},children:(r,_)=>{var $=Mt(),k=ct($),L=f(k);{let a=l(()=>{var s,i;return((i=(s=t(u))==null?void 0:s.summary)==null?void 0:i.totalRequests)??0});H(L,{label:"Total Requests",get value(){return t(a)},get loading(){return t(v)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M2 14V8L5 4L8 7L11 2L14 6V14H2Z" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>'})}var R=c(L,2);{let a=l(()=>{var s,i;return((i=(s=t(u))==null?void 0:s.summary)==null?void 0:i.uniqueUsers)??0});H(R,{label:"Unique Users",get value(){return t(a)},get loading(){return t(v)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="5" r="2.5" stroke="currentColor" stroke-width="1.5"/><path d="M3 14C3 11.2386 5.23858 9 8 9C10.7614 9 13 11.2386 13 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'})}var I=c(R,2);{let a=l(()=>t(et)().toFixed(1));H(I,{label:"5xx Rate",get value(){return t(a)},unit:"%",get loading(){return t(v)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 5V9M8 11V11.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>'})}var q=c(I,2);{let a=l(()=>{var s,i;return Math.round(((i=(s=t(u))==null?void 0:s.summary)==null?void 0:i.avgLatency)??0)});H(q,{label:"Avg Latency",get value(){return t(a)},unit:"ms",get loading(){return t(v)},icon:'<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 4V8L10.5 10.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>'})}d(k);var M=c(k,2),V=f(M);{let a=l(()=>t(at)());bt(V,{get data(){return t(a)},type:"line",height:260,label:"Requests over time",get formatTime(){return t(rt)},get loading(){return t(v)}})}d(M);var b=c(M,2);{var F=a=>{var s=$t(),i=f(s,!0);d(s),S(w=>j(i,w),[()=>t(D)()]),x(a,s)},O=l(()=>t(h)==="custom"&&t(D)());B(b,a=>{t(O)&&a(F)})}var N=c(b,2),o=f(N);{let a=l(()=>t(st)());yt(o,{get items(){return t(a)},title:"Category Distribution",get loading(){return t(v)}})}var n=c(o,2);{let a=l(()=>t(ot)());kt(n,{get items(){return t(a)},title:"Top Endpoints",get loading(){return t(v)}})}d(N),x(r,$)}}),lt()}vt(["click"]);export{Ot as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as z}from"../chunks/Bn2NtlTj.js";import{p as B,a as O,f as j,c as b,g as t,s as d,r as g,u as s,b as y,d as x,t as G}from"../chunks/BdTBlfLy.js";import{d as J,s as K,a as N}from"../chunks/DtZk82gG.js";import{a as Q,t as V,e as W,i as X}from"../chunks/BEW7Ez_g.js";import{a as D,f as T}from"../chunks/DEELgv7K.js";import{s as Y}from"../chunks/CoI6jjbg.js";import{g as Z}from"../chunks/R6arueIl.js";import{P as tt}from"../chunks/B8s_s9QY.js";import{a as et}from"../chunks/Q2nPFxS6.js";import{M as _,T as at}from"../chunks/BqTb6Mxk.js";import{D as rt,T as st}from"../chunks/D2j3I1VQ.js";var ot=T("<button> </button>"),nt=T('<div class="range-selector"></div>'),it=T('<div class="analytics-grid"><!> <!> <!> <!></div> <div class="analytics-chart"><!></div> <div class="analytics-bottom"><!> <!></div>',1);function _t(F,I){B(I,!0);let o=x(!0),n=x(null),h=x("24h");const M=[{value:"1h",label:"1H"},{value:"6h",label:"6H"},{value:"24h",label:"24H"},{value:"7d",label:"7D"},{value:"30d",label:"30D"}];async function $(){try{const e=await Q.fetch(`data/analytics?range=${t(h)}&category=auth&metric=overview`);y(n,e,!0)}catch(e){V(e instanceof Error?e.message:"Failed to load auth analytics")}finally{y(o,!1)}}function k(e){y(h,e,!0),y(o,!0),$()}z(()=>{$();const e=setInterval(()=>void $(),3e4);return()=>clearInterval(e)});const w=s(()=>()=>{var c;if(!((c=t(n))!=null&&c.summary))return 0;const{totalRequests:e,totalErrors:a}=t(n).summary;return e>0?a/e*100:0}),H=s(()=>()=>{var e;return(((e=t(n))==null?void 0:e.timeSeries)||[]).map(a=>({timestamp:a.timestamp,value:a.requests??a.value??0}))}),L=s(()=>Z(t(h))),C=s(()=>()=>{var e;return(((e=t(n))==null?void 0:e.breakdown)||[]).map(a=>({label:a.label||"other",value:a.count}))}),E=s(()=>()=>{var e;return(((e=t(n))==null?void 0:e.topItems)||[]).map(a=>({label:a.label,count:a.count,secondary:`${Math.round(a.avgLatency)}ms · ${a.errorRate.toFixed(1)}% 5xx`}))});tt(F,{title:"Auth Analytics",description:"Authentication and authorization metrics",get docsHref(){return et},actions:a=>{var c=nt();W(c,21,()=>M,X,(p,m)=>{var i=ot();let v;var f=b(i,!0);g(i),G(()=>{v=Y(i,1,"range-btn",null,v,{"range-btn--active":t(h)===t(m).value}),K(f,t(m).label)}),N("click",i,()=>k(t(m).value)),D(p,i)}),g(c),D(a,c)},children:(a,c)=>{var p=it(),m=j(p),i=b(m);{let r=s(()=>{var l,u;return((u=(l=t(n))==null?void 0:l.summary)==null?void 0:u.totalRequests)??0});_(i,{label:"Auth Requests",get value(){return t(r)},get loading(){return t(o)}})}var v=d(i,2);{let r=s(()=>{var l,u;return((u=(l=t(n))==null?void 0:l.summary)==null?void 0:u.uniqueUsers)??0});_(v,{label:"Unique Users",get value(){return t(r)},get loading(){return t(o)}})}var f=d(v,2);{let r=s(()=>t(w)().toFixed(1));_(f,{label:"5xx Rate",get value(){return t(r)},unit:"%",get loading(){return t(o)}})}var P=d(f,2);{let r=s(()=>{var l,u;return Math.round(((u=(l=t(n))==null?void 0:l.summary)==null?void 0:u.avgLatency)??0)});_(P,{label:"Avg Latency",get value(){return t(r)},unit:"ms",get loading(){return t(o)}})}g(m);var A=d(m,2),U=b(A);{let r=s(()=>t(H)());at(U,{get data(){return t(r)},type:"line",height:240,label:"Auth requests over time",get formatTime(){return t(L)},get loading(){return t(o)},color:"#7c3aed"})}g(A);var q=d(A,2),R=b(q);{let r=s(()=>t(C)());rt(R,{get items(){return t(r)},title:"Action Distribution (signup, signin, oauth...)",get loading(){return t(o)}})}var S=d(R,2);{let r=s(()=>t(E)());st(S,{get items(){return t(r)},title:"Top Auth Operations",get loading(){return t(o)}})}g(q),D(a,p)}}),O()}J(["click"]);export{_t as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as S}from"../chunks/Bn2NtlTj.js";import{p as O,a as Q,f as j,c as h,g as e,s as m,r as g,u as s,b as y,d as x,t as z}from"../chunks/BdTBlfLy.js";import{d as G,s as J,a as K}from"../chunks/DtZk82gG.js";import{a as N,t as V,e as W,i as X}from"../chunks/BEW7Ez_g.js";import{a as R,f as T}from"../chunks/DEELgv7K.js";import{s as Y}from"../chunks/CoI6jjbg.js";import{g as Z}from"../chunks/R6arueIl.js";import{P as ee}from"../chunks/B8s_s9QY.js";import{a as te}from"../chunks/Q2nPFxS6.js";import{M as _,T as ae}from"../chunks/BqTb6Mxk.js";import{D as re,T as se}from"../chunks/D2j3I1VQ.js";var oe=T("<button> </button>"),le=T('<div class="range-selector"></div>'),ne=T('<div class="analytics-grid"><!> <!> <!> <!></div> <div class="analytics-chart"><!></div> <div class="analytics-bottom"><!> <!></div>',1);function _e(C,F){O(F,!0);let o=x(!0),l=x(null),p=x("24h");const I=[{value:"1h",label:"1H"},{value:"6h",label:"6H"},{value:"24h",label:"24H"},{value:"7d",label:"7D"},{value:"30d",label:"30D"}];async function D(){try{const t=await N.fetch(`data/analytics?range=${e(p)}&category=db&metric=overview`);y(l,t,!0)}catch(t){V(t instanceof Error?t.message:"Failed to load database analytics")}finally{y(o,!1)}}function k(t){y(p,t,!0),y(o,!0),D()}S(()=>{D();const t=setInterval(()=>void D(),3e4);return()=>clearInterval(t)});const q=s(()=>()=>{var c;if(!((c=e(l))!=null&&c.summary))return 0;const{totalRequests:t,totalErrors:a}=e(l).summary;return t>0?a/t*100:0}),w=s(()=>()=>{var t;return(((t=e(l))==null?void 0:t.timeSeries)||[]).map(a=>({timestamp:a.timestamp,value:a.requests??a.value??0}))}),H=s(()=>Z(e(p))),L=s(()=>()=>{var t;return(((t=e(l))==null?void 0:t.breakdown)||[]).map(a=>({label:a.label||"other",value:a.count}))}),U=s(()=>()=>{var t;return(((t=e(l))==null?void 0:t.topItems)||[]).map(a=>({label:a.label,count:a.count,secondary:`${Math.round(a.avgLatency)}ms · ${a.errorRate.toFixed(1)}% 5xx`}))});ee(C,{title:"Database Analytics",description:"CRUD operations and table usage metrics",get docsHref(){return te},actions:a=>{var c=le();W(c,21,()=>I,X,(b,d)=>{var n=oe();let v;var f=h(n,!0);g(n),z(()=>{v=Y(n,1,"range-btn",null,v,{"range-btn--active":e(p)===e(d).value}),J(f,e(d).label)}),K("click",n,()=>k(e(d).value)),R(b,n)}),g(c),R(a,c)},children:(a,c)=>{var b=ne(),d=j(b),n=h(d);{let r=s(()=>{var i,u;return((u=(i=e(l))==null?void 0:i.summary)==null?void 0:u.totalRequests)??0});_(n,{label:"DB Queries",get value(){return e(r)},get loading(){return e(o)}})}var v=m(n,2);{let r=s(()=>{var i,u;return((u=(i=e(l))==null?void 0:i.summary)==null?void 0:u.uniqueUsers)??0});_(v,{label:"Active Users",get value(){return e(r)},get loading(){return e(o)}})}var f=m(v,2);{let r=s(()=>e(q)().toFixed(1));_(f,{label:"5xx Rate",get value(){return e(r)},unit:"%",get loading(){return e(o)}})}var E=m(f,2);{let r=s(()=>{var i,u;return Math.round(((u=(i=e(l))==null?void 0:i.summary)==null?void 0:u.avgLatency)??0)});_(E,{label:"Avg Latency",get value(){return e(r)},unit:"ms",get loading(){return e(o)}})}g(d);var $=m(d,2),P=h($);{let r=s(()=>e(w)());ae(P,{get data(){return e(r)},type:"bar",height:240,label:"Database operations over time",get formatTime(){return e(H)},get loading(){return e(o)},color:"#16a34a"})}g($);var A=m($,2),M=h(A);{let r=s(()=>e(L)());re(M,{get items(){return e(r)},title:"Operation Distribution (CRUD)",get loading(){return e(o)}})}var B=m(M,2);{let r=s(()=>e(U)());se(B,{get items(){return e(r)},title:"Most Accessed Tables",get loading(){return e(o)}})}g(A),R(a,b)}}),Q()}G(["click"]);export{_e as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as be}from"../chunks/Bn2NtlTj.js";import{p as Se,d as g,M as q,a as we,f as De,c as o,b as c,g as e,s as d,r as i,ae as z,t as h,u as G}from"../chunks/BdTBlfLy.js";import{d as Ee,s as p,a as Ie}from"../chunks/DtZk82gG.js";import{i as E}from"../chunks/Y22E1hJM.js";import{e as $e,a as Be,t as Le}from"../chunks/BEW7Ez_g.js";import{t as K,a as u,f as m}from"../chunks/DEELgv7K.js";import{s as Te,a as Oe}from"../chunks/CoI6jjbg.js";import{P as Pe}from"../chunks/B8s_s9QY.js";import{a as Me}from"../chunks/Q2nPFxS6.js";import{B as ke}from"../chunks/C72lTcG0.js";import{S as Q}from"../chunks/B94PilAN.js";import{I as Ce}from"../chunks/_teD5ji5.js";import{E as He}from"../chunks/m9eWh0Cd.js";import{B as Ne}from"../chunks/B0HRJ657.js";var Re=m('<div class="loading-state svelte-1tn2f4x">Loading events...</div>'),Ae=m('<span class="timeline-item__line svelte-1tn2f4x"></span>'),Fe=m('<span class="timeline-item__user svelte-1tn2f4x"> </span>'),Ue=m('<span class="timeline-item__user svelte-1tn2f4x"> </span>'),Je=m('<pre class="timeline-item__detail svelte-1tn2f4x"> </pre>'),je=m('<pre class="timeline-item__detail svelte-1tn2f4x"> </pre>'),Ve=m('<button type="button"><div class="timeline-item__connector svelte-1tn2f4x"><span class="timeline-item__icon svelte-1tn2f4x"> </span> <!></div> <div class="timeline-item__content svelte-1tn2f4x"><div class="timeline-item__header svelte-1tn2f4x"><!> <!> <span class="timeline-item__time svelte-1tn2f4x"> </span></div> <!></div></button>'),qe=m('<div class="timeline svelte-1tn2f4x"></div>'),ze=m('<div class="controls svelte-1tn2f4x"><div class="controls__fields svelte-1tn2f4x"><!> <!> <!></div> <div class="controls__actions svelte-1tn2f4x"><!></div></div> <!>',1);function ot(W,X){Se(X,!0);let I=g(!0),x=g(q([])),S=g("all"),$=g("24h"),w=g(""),D=g(q(new Set));const Y=[{value:"all",label:"All Events"},{value:"signup",label:"Signup"},{value:"signin",label:"Sign In"},{value:"signout",label:"Sign Out"},{value:"password_reset",label:"Password Reset"},{value:"oauth",label:"OAuth"},{value:"custom",label:"Custom"}],Z=[{value:"1h",label:"Last 1 Hour"},{value:"6h",label:"Last 6 Hours"},{value:"24h",label:"Last 24 Hours"},{value:"7d",label:"Last 7 Days"},{value:"30d",label:"Last 30 Days"}];async function H(){c(I,!0);try{let t=`data/analytics/events?range=${e($)}&limit=100`;e(S)!=="all"&&(t+=`&type=${encodeURIComponent(e(S))}`),e(w).trim()&&(t+=`&userId=${encodeURIComponent(e(w).trim())}`);const n=await Be.fetch(t);c(x,n.events??n.data??[],!0)}catch(t){Le(t instanceof Error?t.message:"Failed to load events"),c(x,[],!0)}finally{c(I,!1)}}function ee(){c(D,new Set,!0),H()}function te(t){const n=new Set(e(D));n.has(t)?n.delete(t):n.add(t),c(D,n,!0)}be(()=>{H()});function ae(t){try{return new Date(t).toLocaleString()}catch{return String(t)}}function re(t){try{const n=Date.now()-new Date(t).getTime();return n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:`${Math.floor(n/864e5)}d ago`}catch{return""}}function se(t){switch(t){case"signup":return"success";case"signin":return"primary";case"signout":return"default";case"password_reset":return"warning";case"oauth":return"primary";case"error":case"failed":return"danger";default:return"default"}}function ne(t){switch(t){case"signup":return"➕";case"signin":return"→";case"signout":return"←";case"password_reset":return"🔑";case"oauth":return"🔗";default:return"○"}}Pe(W,{title:"Event Timeline",description:"Browse auth and custom events chronologically",get docsHref(){return Me},children:(t,n)=>{var N=ze(),B=De(N),L=o(B),R=o(L);Q(R,{label:"Event Type",get options(){return Y},get value(){return e(S)},set value(s){c(S,s,!0)}});var A=d(R,2);Q(A,{label:"Time Range",get options(){return Z},get value(){return e($)},set value(s){c($,s,!0)}});var le=d(A,2);Ce(le,{label:"User ID",placeholder:"Filter by user...",get value(){return e(w)},set value(s){c(w,s,!0)}}),i(L);var F=d(L,2),ie=o(F);ke(ie,{variant:"primary",onclick:ee,children:(s,f)=>{z();var y=K("Search");u(s,y)},$$slots:{default:!0}}),i(F),i(B);var oe=d(B,2);{var ue=s=>{var f=Re();u(s,f)},ve=s=>{He(s,{title:"No events found",description:"No events match the current filters."})},ce=s=>{var f=qe();$e(f,23,()=>e(x),(y,l)=>y.id??l,(y,l,T)=>{const O=G(()=>e(D).has(e(T)));var b=Ve();let U;var P=o(b),M=o(P),de=o(M,!0);i(M);var me=d(M,2);{var pe=a=>{var r=Ae();u(a,r)};E(me,a=>{e(T)<e(x).length-1&&a(pe)})}i(P);var J=d(P,2),k=o(J),j=o(k);{let a=G(()=>se(e(l).type));Ne(j,{get variant(){return e(a)},children:(r,v)=>{z();var _=K();h(()=>p(_,e(l).type)),u(r,_)},$$slots:{default:!0}})}var V=d(j,2);{var fe=a=>{var r=Fe(),v=o(r,!0);i(r),h(()=>p(v,e(l).userEmail)),u(a,r)},_e=a=>{var r=Ue(),v=o(r,!0);i(r),h(()=>p(v,e(l).userId)),u(a,r)};E(V,a=>{e(l).userEmail?a(fe):e(l).userId&&a(_e,1)})}var C=d(V,2),ge=o(C,!0);i(C),i(k);var he=d(k,2);{var xe=a=>{var r=Je(),v=o(r,!0);i(r),h(_=>p(v,_),[()=>JSON.stringify(e(l).metadata,null,2)]),u(a,r)},ye=a=>{var r=je(),v=o(r,!0);i(r),h(_=>p(v,_),[()=>JSON.stringify(e(l),null,2)]),u(a,r)};E(he,a=>{e(O)&&e(l).metadata?a(xe):e(O)&&a(ye,1)})}i(J),i(b),h((a,r,v)=>{U=Te(b,1,"timeline-item svelte-1tn2f4x",null,U,{"timeline-item--expanded":e(O)}),p(de,a),Oe(C,"title",r),p(ge,v)},[()=>ne(e(l).type),()=>ae(e(l).timestamp),()=>re(e(l).timestamp)]),Ie("click",b,()=>te(e(T))),u(y,b)}),i(f),u(s,f)};E(oe,s=>{e(I)?s(ue):e(x).length===0?s(ve,1):s(ce,!1)})}u(t,N)}}),we()}Ee(["click"]);export{ot as component};
@@ -1 +0,0 @@
1
- import"../chunks/CWj6FrbW.js";import{o as U}from"../chunks/Bn2NtlTj.js";import{p as j,a as z,f as G,c as b,g as t,s as m,r as g,u as n,b as y,d as D,t as J}from"../chunks/BdTBlfLy.js";import{d as K,s as N,a as O}from"../chunks/DtZk82gG.js";import{a as Q,t as V,e as W,i as X}from"../chunks/BEW7Ez_g.js";import{a as F,f as I}from"../chunks/DEELgv7K.js";import{s as Y}from"../chunks/CoI6jjbg.js";import{P as Z}from"../chunks/B8s_s9QY.js";import{a as tt}from"../chunks/Q2nPFxS6.js";import{M as _,T as et}from"../chunks/BqTb6Mxk.js";import{D as at,T as rt}from"../chunks/D2j3I1VQ.js";var nt=I("<button> </button>"),st=I('<div class="range-selector"></div>'),ot=I('<div class="analytics-grid"><!> <!> <!> <!></div> <div class="analytics-chart"><!></div> <div class="analytics-bottom"><!> <!></div>',1);function bt(w,M){j(M,!0);let s=D(!0),o=D(null),p=D("24h");const T=[{value:"1h",label:"1H"},{value:"6h",label:"6H"},{value:"24h",label:"24H"},{value:"7d",label:"7D"},{value:"30d",label:"30D"}],k=n(()=>()=>{switch(t(p)){case"1h":return"minute";case"6h":case"24h":return"hour";default:return"day"}});async function $(){try{const e=await Q.fetch(`data/analytics?range=${t(p)}&category=function&metric=overview&groupBy=${t(k)()}`);y(o,e,!0)}catch(e){V(e instanceof Error?e.message:"Failed to load functions analytics")}finally{y(s,!1)}}function A(e){y(p,e,!0),y(s,!0),$()}U(()=>{$();const e=setInterval($,3e4);return()=>clearInterval(e)});const H=n(()=>()=>{var c;if(!((c=t(o))!=null&&c.summary))return 0;const{totalRequests:e,totalErrors:a}=t(o).summary;return e>0?a/e*100:0}),B=n(()=>()=>{var e;return(((e=t(o))==null?void 0:e.timeSeries)||[]).map(a=>({timestamp:a.timestamp,value:a.requests??a.value??0}))}),C=n(()=>()=>{var e;return(((e=t(o))==null?void 0:e.breakdown)||[]).map(a=>({label:a.label||"other",value:a.count}))}),E=n(()=>()=>{var e;return(((e=t(o))==null?void 0:e.topItems)||[]).map(a=>({label:a.label,count:a.count,secondary:`${Math.round(a.avgLatency)}ms · ${a.errorRate.toFixed(1)}% 5xx`}))});Z(w,{title:"Functions Analytics",description:"Serverless function execution and performance metrics",get docsHref(){return tt},actions:a=>{var c=st();W(c,21,()=>T,X,(f,d)=>{var l=nt();let v;var h=b(l,!0);g(l),J(()=>{v=Y(l,1,"range-btn",null,v,{"range-btn--active":t(p)===t(d).value}),N(h,t(d).label)}),O("click",l,()=>A(t(d).value)),F(f,l)}),g(c),F(a,c)},children:(a,c)=>{var f=ot(),d=G(f),l=b(d);{let r=n(()=>{var i,u;return((u=(i=t(o))==null?void 0:i.summary)==null?void 0:u.totalRequests)??0});_(l,{label:"Invocations",get value(){return t(r)},get loading(){return t(s)}})}var v=m(l,2);{let r=n(()=>{var i,u;return((u=(i=t(o))==null?void 0:i.summary)==null?void 0:u.uniqueUsers)??0});_(v,{label:"Unique Users",get value(){return t(r)},get loading(){return t(s)}})}var h=m(v,2);{let r=n(()=>t(H)().toFixed(1));_(h,{label:"5xx Rate",get value(){return t(r)},unit:"%",get loading(){return t(s)}})}var L=m(h,2);{let r=n(()=>{var i,u;return Math.round(((u=(i=t(o))==null?void 0:i.summary)==null?void 0:u.avgLatency)??0)});_(L,{label:"Avg Duration",get value(){return t(r)},unit:"ms",get loading(){return t(s)}})}g(d);var x=m(d,2),P=b(x);{let r=n(()=>t(B)());et(P,{get data(){return t(r)},type:"bar",height:240,label:"Function invocations over time",get loading(){return t(s)},color:"#dc2626"})}g(x);var R=m(x,2),q=b(R);{let r=n(()=>t(C)());at(q,{get items(){return t(r)},title:"Functions by invocation count",get loading(){return t(s)}})}var S=m(q,2);{let r=n(()=>t(E)());rt(S,{get items(){return t(r)},title:"Top Functions",get loading(){return t(s)}})}g(R),F(a,f)}}),z()}K(["click"]);export{bt as component};