@lunora/studio 1.0.0-alpha.244 → 1.0.0-alpha.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/mount.mjs +1 -1
- package/dist/packem_chunks/ApiTab.mjs +1 -1
- package/dist/packem_chunks/SchemaViewer.mjs +1 -1
- package/dist/packem_chunks/architecture-panel.mjs +1 -0
- package/dist/packem_chunks/kv-browser.mjs +1 -1
- package/dist/packem_chunks/migrations-route.mjs +1 -1
- package/dist/packem_chunks/queues-panel.mjs +1 -1
- package/dist/packem_shared/ApiReferencePanel-nAf8tNRr.mjs +1 -0
- package/dist/packem_shared/OpenRpcReferencePanel-BxEr49D9.mjs +1 -0
- package/dist/packem_shared/{Studio-qyqfHiQ3.mjs → Studio-BboteWG5.mjs} +1 -1
- package/dist/packem_shared/{StudioApp-BwOFVJBy.mjs → StudioApp-DkjIpaM2.mjs} +1 -1
- package/dist/packem_shared/diagram-export-panel-D5CVNJkp.mjs +2 -0
- package/dist/packem_shared/reference-view-CIHyURU6.mjs +13 -0
- package/dist/packem_shared/schema-diagram-C5oilX7l.mjs +2 -0
- package/dist/packem_shared/studio-CrypdTyE.mjs +2 -0
- package/dist/packem_shared/use-admin-spec-Bir7V68L.mjs +1 -0
- package/dist/standalone/{chunk-VTMPJ7GE.js → chunk-2BHVS5B6.js} +1 -1
- package/dist/standalone/chunk-2T4EFQNZ.js +1 -0
- package/dist/standalone/{chunk-BKGZMIF3.js → chunk-2TRJ53XJ.js} +1 -1
- package/dist/standalone/{chunk-PQWCYQGZ.js → chunk-2ZNM4ZPA.js} +1 -1
- package/dist/standalone/{chunk-DKTDJOYC.js → chunk-3G24A35Q.js} +1 -1
- package/dist/standalone/chunk-3QXSLIE4.js +1 -0
- package/dist/standalone/{chunk-SI6U7NIE.js → chunk-3UA5CP3H.js} +1 -1
- package/dist/standalone/chunk-4HQZTO56.js +1 -0
- package/dist/standalone/{chunk-2M6HDLZL.js → chunk-4KSBB2YH.js} +1 -1
- package/dist/standalone/{chunk-AVRH4ZBT.js → chunk-5CFKIQLP.js} +1 -1
- package/dist/standalone/{chunk-435IWCIW.js → chunk-5YKKSHIB.js} +1 -1
- package/dist/standalone/chunk-6QA34EWC.js +3 -0
- package/dist/standalone/{chunk-WB5OMGYR.js → chunk-AHNZKXCL.js} +1 -1
- package/dist/standalone/chunk-AQR5KUL6.js +1 -0
- package/dist/standalone/chunk-ATGO7XFL.js +1 -0
- package/dist/standalone/{chunk-GZT3A3DF.js → chunk-BBM53HFU.js} +1 -1
- package/dist/standalone/{chunk-KQQVI6ZS.js → chunk-BKARD4NH.js} +1 -1
- package/dist/standalone/chunk-BRIYEPXI.js +1 -0
- package/dist/standalone/{chunk-TESQ5ZIA.js → chunk-CZXBYHCA.js} +1 -1
- package/dist/standalone/{chunk-XNRRHFOY.js → chunk-EDCFVXZF.js} +1 -1
- package/dist/standalone/chunk-EEEEYLT7.js +1 -0
- package/dist/standalone/{chunk-CAHTJYC5.js → chunk-EOXUWPOY.js} +1 -1
- package/dist/standalone/{chunk-QROMT56V.js → chunk-F6SM55KU.js} +1 -1
- package/dist/standalone/chunk-FW6WOY3S.js +1 -0
- package/dist/standalone/chunk-GPFBLWA7.js +1 -0
- package/dist/standalone/chunk-GX2YM7MB.js +1 -0
- package/dist/standalone/chunk-H44HW3WV.js +1 -0
- package/dist/standalone/chunk-H6LZ3QM4.js +1 -0
- package/dist/standalone/chunk-HKWL6IY3.js +2 -0
- package/dist/standalone/chunk-HLTKKVDQ.js +1 -0
- package/dist/standalone/{chunk-2URQKGWU.js → chunk-HPFN7S7N.js} +1 -1
- package/dist/standalone/{chunk-GMS77BZD.js → chunk-IFJOYAEZ.js} +1 -1
- package/dist/standalone/chunk-JDAWPJ7U.js +1 -0
- package/dist/standalone/chunk-JF7BK6MO.js +1 -0
- package/dist/standalone/{chunk-OGFQ4LUG.js → chunk-JJB2KGI2.js} +1 -1
- package/dist/standalone/{chunk-OSOMPF2M.js → chunk-JUSVEJIQ.js} +1 -1
- package/dist/standalone/chunk-KTHHXUCF.js +1 -0
- package/dist/standalone/chunk-L4DT5US3.js +1 -0
- package/dist/standalone/{chunk-N3DFLRGG.js → chunk-LDEGPYES.js} +1 -1
- package/dist/standalone/{chunk-EJSI4PMU.js → chunk-LIOUCOP2.js} +1 -1
- package/dist/standalone/{chunk-FBPF5WYL.js → chunk-LNDCZ3M2.js} +1 -1
- package/dist/standalone/{chunk-ZIE7D6ZS.js → chunk-M45TEYKZ.js} +1 -1
- package/dist/standalone/chunk-MDUETXVR.js +1 -0
- package/dist/standalone/{chunk-RFNGDE33.js → chunk-NESDGS7F.js} +1 -1
- package/dist/standalone/{chunk-DEDFT62S.js → chunk-NPRI4BCN.js} +1 -1
- package/dist/standalone/{chunk-WZI2ZAPQ.js → chunk-OCUJO2PM.js} +1 -1
- package/dist/standalone/chunk-OVPFGNR6.js +1 -0
- package/dist/standalone/{chunk-GUD3ZG3Z.js → chunk-PRHWNGXX.js} +2 -2
- package/dist/standalone/{chunk-ZDPY27UY.js → chunk-Q7GZKFBT.js} +1 -1
- package/dist/standalone/{chunk-AAXLEHDI.js → chunk-QA6CZASY.js} +1 -1
- package/dist/standalone/chunk-R65X5YQK.js +1 -0
- package/dist/standalone/chunk-RG6VUBGP.js +1 -0
- package/dist/standalone/chunk-RJJ5J24X.js +1 -0
- package/dist/standalone/{chunk-AANB526D.js → chunk-T6JDEFHN.js} +1 -1
- package/dist/standalone/chunk-TDXV3OT5.js +1 -0
- package/dist/standalone/{chunk-GMHY2XTC.js → chunk-TYT4DBMD.js} +1 -1
- package/dist/standalone/chunk-U4EW2BWO.js +1 -0
- package/dist/standalone/chunk-U7WLCN6P.js +1 -0
- package/dist/standalone/{chunk-MEV2FUUD.js → chunk-V5EINW4G.js} +1 -1
- package/dist/standalone/chunk-VIFOIB6M.js +1 -0
- package/dist/standalone/chunk-VMXD6LRC.js +14 -0
- package/dist/standalone/chunk-WA3ZZ65C.js +1 -0
- package/dist/standalone/chunk-WIIQAPHM.js +1 -0
- package/dist/standalone/chunk-WX4HPONC.js +1 -0
- package/dist/standalone/{chunk-KVSSLKGK.js → chunk-XB6LUZP2.js} +1 -1
- package/dist/standalone/chunk-XLAJX4GC.js +1 -0
- package/dist/standalone/chunk-XXTB46YA.js +1 -0
- package/dist/standalone/{chunk-V3CZW3JB.js → chunk-XXVOKVXV.js} +1 -1
- package/dist/standalone/{chunk-IVKVGV4Y.js → chunk-Y4N7CB4T.js} +1 -1
- package/dist/standalone/{chunk-NPT4MKTL.js → chunk-YSVZF4HX.js} +1 -1
- package/dist/standalone/chunk-YZ2QZG3W.js +1 -0
- package/dist/standalone/chunk-ZEYT2NT5.js +1 -0
- package/dist/standalone/chunk-ZMF7QLKI.js +8 -0
- package/dist/standalone/{chunk-5AAHUEQD.js → chunk-ZSM5GPHG.js} +1 -1
- package/dist/standalone/studio.js +1 -1
- package/dist/styles.css +1 -1
- package/package.json +5 -5
- package/dist/packem_shared/ApiReferencePanel-CHoHM5ME.mjs +0 -1
- package/dist/packem_shared/OpenRpcReferencePanel-C8ctFJVm.mjs +0 -1
- package/dist/packem_shared/reference-view-DSeKRrUU.mjs +0 -13
- package/dist/packem_shared/schema-diagram-CQ4vn0CN.mjs +0 -2
- package/dist/packem_shared/studio-CwC7cOyC.mjs +0 -2
- package/dist/standalone/chunk-2XPVONGN.js +0 -1
- package/dist/standalone/chunk-3FBLWUXD.js +0 -1
- package/dist/standalone/chunk-4E6W2IDP.js +0 -14
- package/dist/standalone/chunk-5MGCPNPF.js +0 -1
- package/dist/standalone/chunk-5XPSGVCH.js +0 -1
- package/dist/standalone/chunk-6QPTJCQA.js +0 -1
- package/dist/standalone/chunk-6XKPY5RJ.js +0 -1
- package/dist/standalone/chunk-AHV5ROA3.js +0 -1
- package/dist/standalone/chunk-ATOGOQKD.js +0 -1
- package/dist/standalone/chunk-B5NQHH5M.js +0 -1
- package/dist/standalone/chunk-C3M6CCOV.js +0 -1
- package/dist/standalone/chunk-EUEWGG46.js +0 -1
- package/dist/standalone/chunk-HHUH2AEG.js +0 -1
- package/dist/standalone/chunk-HW33JZQP.js +0 -2
- package/dist/standalone/chunk-IHMGCHAA.js +0 -1
- package/dist/standalone/chunk-IVQFP5JU.js +0 -1
- package/dist/standalone/chunk-JNAZOBTV.js +0 -1
- package/dist/standalone/chunk-JSPFPDQ6.js +0 -1
- package/dist/standalone/chunk-KMLJSWTP.js +0 -1
- package/dist/standalone/chunk-KU7LFBUD.js +0 -1
- package/dist/standalone/chunk-KZ7UVPF6.js +0 -1
- package/dist/standalone/chunk-LB4Y3C7N.js +0 -1
- package/dist/standalone/chunk-MLFPYQNL.js +0 -1
- package/dist/standalone/chunk-NSCZ3RJ3.js +0 -1
- package/dist/standalone/chunk-OD7E3QLZ.js +0 -1
- package/dist/standalone/chunk-PLHA3OWK.js +0 -3
- package/dist/standalone/chunk-TDD2TZCN.js +0 -1
- package/dist/standalone/chunk-WMD6QHHD.js +0 -8
- package/dist/standalone/chunk-XIL7BLJ5.js +0 -1
- package/dist/standalone/chunk-Y5KK6IM3.js +0 -1
- package/dist/standalone/chunk-YPRQLCKF.js +0 -1
- package/dist/standalone/chunk-ZZ24NI6P.js +0 -1
- package/dist/standalone/chunk-ZZJE2GV3.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as L}from"react/compiler-runtime";import{useState as F}from"react";import{B as K}from"../packem_shared/button-q0UYSmrn.mjs";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import D from"../packem_shared/ApiDocsPanel-fhDlZGE4.mjs";import M from"../packem_shared/ApiReferencePanel-
|
|
1
|
+
import{c as L}from"react/compiler-runtime";import{useState as F}from"react";import{B as K}from"../packem_shared/button-q0UYSmrn.mjs";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import D from"../packem_shared/ApiDocsPanel-fhDlZGE4.mjs";import M from"../packem_shared/ApiReferencePanel-nAf8tNRr.mjs";import W from"../packem_shared/OpenRpcReferencePanel-BxEr49D9.mjs";import{jsx as r,jsxs as E}from"react/jsx-runtime";const _=["reference","snippets"],q=["openapi","openrpc"],k=V=>{const e=L(51),{functions:R,initialShardKey:N,openApiSpec:T,openRpcSpec:I}=V,t=Y(),[i,$]=F("reference"),[a,j]=F("openapi");let s;e[0]!==t?(s=t("Reference"),e[0]=t,e[1]=s):s=e[1];let o;e[2]!==t?(o=t("Snippets"),e[2]=t,e[3]=o):o=e[3];let w;e[4]!==s||e[5]!==o?(w={reference:s,snippets:o},e[4]=s,e[5]=o,e[6]=w):w=e[6];const O=w;let n;e[7]!==t?(n=t("OpenAPI"),e[7]=t,e[8]=n):n=e[8];let c;e[9]!==t?(c=t("OpenRPC"),e[9]=t,e[10]=c):c=e[10];let g;e[11]!==n||e[12]!==c?(g={openapi:n,openrpc:c},e[11]=n,e[12]=c,e[13]=g):g=e[13];const C=g;let S;e[14]===Symbol.for("react.memo_cache_sentinel")?(S=l=>{$(l.currentTarget.dataset.view)},e[14]=S):S=e[14];const z=S;let A;e[15]===Symbol.for("react.memo_cache_sentinel")?(A=l=>{j(l.currentTarget.dataset.format)},e[15]=A):A=e[15];const B=A;let p;e[16]!==t?(p=t("API view"),e[16]=t,e[17]=p):p=e[17];let f;e[18]!==i||e[19]!==O?(f=_.map(l=>r(K,{"aria-selected":i===l,"data-testid":`api-view-${l}`,"data-view":l,onClick:z,role:"tab",size:"sm",type:"button",variant:i===l?"default":"outline",children:O[l]},l)),e[18]=i,e[19]=O,e[20]=f):f=e[20];let m;e[21]!==f||e[22]!==p?(m=r("div",{"aria-label":p,className:"flex gap-1.5","data-testid":"api-view-toggle",role:"tablist",children:f}),e[21]=f,e[22]=p,e[23]=m):m=e[23];let d;e[24]!==a||e[25]!==C||e[26]!==t||e[27]!==i?(d=i==="reference"&&r("div",{"aria-label":t("API spec format"),className:"flex gap-1.5","data-testid":"api-format-toggle",role:"tablist",children:q.map(l=>r(K,{"aria-selected":a===l,"data-format":l,"data-testid":`api-format-${l}`,onClick:B,role:"tab",size:"sm",type:"button",variant:a===l?"default":"outline",children:C[l]},l))}),e[24]=a,e[25]=C,e[26]=t,e[27]=i,e[28]=d):d=e[28];let b;e[29]!==m||e[30]!==d?(b=E("div",{className:"flex shrink-0 flex-wrap items-center gap-3 border-b border-border px-6 py-3",children:[m,d]}),e[29]=m,e[30]=d,e[31]=b):b=e[31];let v;e[32]!==R||e[33]!==N||e[34]!==i?(v=i==="snippets"&&r("div",{className:"min-h-0 flex-1 overflow-y-auto p-6",children:r(D,{functions:R,initialShardKey:N})}),e[32]=R,e[33]=N,e[34]=i,e[35]=v):v=e[35];let h;e[36]!==a||e[37]!==T||e[38]!==i?(h=i==="reference"&&a==="openapi"&&r(M,{spec:T}),e[36]=a,e[37]=T,e[38]=i,e[39]=h):h=e[39];let u;e[40]!==a||e[41]!==I||e[42]!==i?(u=i==="reference"&&a==="openrpc"&&r(W,{spec:I}),e[40]=a,e[41]=I,e[42]=i,e[43]=u):u=e[43];let x;e[44]!==v||e[45]!==h||e[46]!==u?(x=E("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",children:[v,h,u]}),e[44]=v,e[45]=h,e[46]=u,e[47]=x):x=e[47];let P;return e[48]!==b||e[49]!==x?(P=E("div",{className:"flex min-h-0 flex-1 flex-col","data-testid":"lunora-api-tab",children:[b,x]}),e[48]=b,e[49]=x,e[50]=P):P=e[50],P};export{k as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as we}from"react/compiler-runtime";import{ShardInput as Ze}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{S as Ke,T as Pe}from"../packem_shared/storage-tier-C2mKwYRj.mjs";import{B as Fe}from"../packem_shared/badge-r_5B4LHP.mjs";import{c as Ge,d as ze,b as Be,a as De,C as je}from"../packem_shared/card-By2O8ULa.mjs";import{E as et}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as ke}from"../packem_shared/input-CXhxesPC.mjs";import{useT as Le}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{c as Oe,d as Ae,b as $e,f as Ce}from"../packem_shared/internal-Df43vQI0.mjs";import{c as Qe}from"../packem_shared/utils-bhneXptQ.mjs";import{useLunora as tt}from"@lunora/react";import{useState as _,useRef as Ue,useEffect as qe}from"react";import{u as lt}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{ADMIN_FUNCTIONS as Me}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{r as st}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{S as at}from"../packem_shared/schema-diagram-CQ4vn0CN.mjs";import{useNavigate as nt}from"@tanstack/react-router";import{B as ye}from"../packem_shared/button-q0UYSmrn.mjs";import{L as Ee}from"../packem_shared/label-DKFzyHq6.mjs";import{jsx as l,jsxs as p,Fragment as Ve}from"react/jsx-runtime";const ot=Oe(Me.listTables),it=Oe(Me.listTableIndexes),rt=Oe(Me.readTablePage),dt=Oe(Me.describeTables),ct={},Ye=[],mt=n=>{const e=we(74),{initialShardKey:m,initialTable:a}=n,t=tt(),[s,c]=_("graph"),{queryShardKey:d,setShardKey:r,shardKey:g}=lt(m),[o,u]=_(""),[i,v]=_(null),[f,L]=_(null);let S;e[0]===Symbol.for("react.memo_cache_sentinel")?(S={},e[0]=S):S=e[0];const[G,y]=_(S);let O;e[1]===Symbol.for("react.memo_cache_sentinel")?(O={},e[1]=O):O=e[1];const[$,z]=_(O),[T,C]=_(null);let A;e[2]===Symbol.for("react.memo_cache_sentinel")?(A={},e[2]=A):A=e[2];const[F,pe]=_(A);let te;e[3]===Symbol.for("react.memo_cache_sentinel")?(te={},e[3]=te):te=e[3];const[E,M]=_(te),[w,ge]=_(null),[B,ce]=_(null);let le;e[4]===Symbol.for("react.memo_cache_sentinel")?(le={},e[4]=le):le=e[4];const[J,Ne]=_(le),[W,me]=_(null),be=Ue(0);let D;e[5]!==t?(D=async h=>{be.current=be.current+1;const x=be.current;L(null);try{const N=await t.query(ot,{},Ae(h));if(x!==be.current)return;st(h),v(N),y({}),z({}),C(null),pe(k=>Object.fromEntries(Object.entries(k).filter(I=>{const[he]=I;return he!==h}))),M(k=>Object.fromEntries(Object.entries(k).filter(I=>{const[he]=I;return he!==h})))}catch(N){const k=N;if(x!==be.current)return;v(null),L($e(k))}},e[5]=t,e[6]=D):D=e[6];const j=D;let se;e[7]!==t?(se=async()=>{ce(null);try{ge(await t.listGlobalTables())}catch(h){const x=h;ge(null),ce($e(x))}},e[7]=t,e[8]=se):se=e[8];const ue=se;let R,ae;e[9]!==d||e[10]!==j||e[11]!==ue?(R=()=>{Ce(j(d)),Ce(ue())},ae=[j,ue,d],e[9]=d,e[10]=j,e[11]=ue,e[12]=R,e[13]=ae):(R=e[12],ae=e[13]),qe(R,ae);let K;e[14]!==t||e[15]!==G||e[16]!==T||e[17]!==d?(K=async h=>{if(T===h){C(null);return}C(h);const x=`${d}:${h}`;if(G[x]!==void 0)return;const[N,k]=await Promise.allSettled([t.query(rt,{limit:1,offset:0,table:h},Ae(d)),t.query(it,{table:h},Ae(d))]);N.status==="fulfilled"?y(I=>({...I,[x]:N.value.columns})):L($e(N.reason)),k.status==="fulfilled"&&z(I=>({...I,[x]:k.value.indexes}))},e[14]=t,e[15]=G,e[16]=T,e[17]=d,e[18]=K):K=e[18];const ne=K;let oe;e[19]!==t||e[20]!==J||e[21]!==W?(oe=async h=>{if(W===h){me(null);return}if(me(h),J[h]===void 0)try{const x=await t.readGlobalTablePage({limit:1,offset:0,table:h});Ne(N=>({...N,[h]:x.columns}))}catch(x){ce($e(x))}},e[19]=t,e[20]=J,e[21]=W,e[22]=oe):oe=e[22];const fe=oe,X=Ue(void 0);let Q,U;e[23]!==a||e[24]!==i||e[25]!==ne?(Q=()=>{a===void 0||i===null||X.current===a||i.some(h=>h.name===a)&&(X.current=a,Ce(ne(a)))},U=[a,i,ne],e[23]=a,e[24]=i,e[25]=ne,e[26]=Q,e[27]=U):(Q=e[26],U=e[27]),qe(Q,U);let ie;e[28]!==t?(ie=async(h,x,N)=>{const[k,I]=await Promise.all([Promise.allSettled([t.query(dt,{tables:[...x,...N]},Ae(h))]),Promise.all(N.map(async H=>{const Se=await Promise.allSettled([t.readGlobalTablePage({limit:1,offset:0,table:H})]),Re=Se[0].status==="fulfilled"?Se[0].value:void 0;return{columns:Re?.columns??[],refs:Re?.refs??{},table:H}}))]),he=k[0].status==="fulfilled"?k[0].value?.columnsByTable??{}:{},_e=k[0].status==="rejected",Ie=new Map(I.map(ut)),q=[...x,...N].map(H=>{const Se=he[H]??[];return[H,Se.length>0?Se:Ie.get(H)??[]]});pe(H=>({...H,[h]:Object.fromEntries(q)})),M(H=>({...H,[h]:_e}))},e[28]=t,e[29]=ie):ie=e[29];const V=ie;let re,Y;e[30]!==B||e[31]!==w||e[32]!==V||e[33]!==d||e[34]!==F||e[35]!==i||e[36]!==s?(re=()=>{s!=="graph"||i===null||w===null&&B===null||F[d]!==void 0||Ce(V(d,i.map(ft),(w??[]).map(ht)))},Y=[s,i,w,B,d,F,V],e[30]=B,e[31]=w,e[32]=V,e[33]=d,e[34]=F,e[35]=i,e[36]=s,e[37]=re,e[38]=Y):(re=e[37],Y=e[38]),qe(re,Y);const P=F[d]??ct;let Z;if(e[39]!==P||e[40]!==w||e[41]!==i){let h;e[43]!==P?(h=I=>({columns:P[I.name]??Ye,name:I.name,tier:"shard"}),e[43]=P,e[44]=h):h=e[44];const x=(i??[]).map(h);let N;e[45]!==P?(N=I=>({columns:P[I.name]??Ye,name:I.name,tier:"global"}),e[45]=P,e[46]=N):N=e[46];const k=(w??[]).map(N);Z=[...x,...k],e[39]=P,e[40]=w,e[41]=i,e[42]=Z}else Z=e[42];const b=Z;let ee;if(e[47]!==o||e[48]!==i){const h=o.trim().toLowerCase();ee=(i??[]).filter(x=>x.name.toLowerCase().includes(h)),e[47]=o,e[48]=i,e[49]=ee}else ee=e[49];const de=ee;let xe;if(e[50]!==w||e[51]!==o){const h=o.trim().toLowerCase();xe=(w??[]).filter(x=>x.name.toLowerCase().includes(h)),e[50]=w,e[51]=o,e[52]=xe}else xe=e[52];const Te=xe;let ve;return e[53]!==G||e[54]!==b||e[55]!==f||e[56]!==T||e[57]!==Te||e[58]!==de||e[59]!==J||e[60]!==B||e[61]!==W||e[62]!==w||e[63]!==$||e[64]!==j||e[65]!==r||e[66]!==E||e[67]!==g||e[68]!==o||e[69]!==i||e[70]!==ne||e[71]!==fe||e[72]!==s?(ve={columns:G,diagramTables:b,error:f,expanded:T,filteredGlobalTables:Te,filteredTables:de,globalColumns:J,globalError:B,globalExpanded:W,globalTables:w,indexes:$,refresh:j,setShardKey:r,setTableFilter:u,setView:c,shardColumnsError:E,shardKey:g,tableFilter:o,tables:i,toggle:ne,toggleGlobal:fe,view:s},e[53]=G,e[54]=b,e[55]=f,e[56]=T,e[57]=Te,e[58]=de,e[59]=J,e[60]=B,e[61]=W,e[62]=w,e[63]=$,e[64]=j,e[65]=r,e[66]=E,e[67]=g,e[68]=o,e[69]=i,e[70]=ne,e[71]=fe,e[72]=s,e[73]=ve):ve=e[73],ve};function ut(n){const{columns:e,refs:m,table:a}=n;return[a,e.map(t=>{const s=m[t];return s===void 0?{name:t,optional:!1,type:""}:{name:t,optional:!1,ref:s,type:"id"}})]}function ft(n){return n.name}function ht(n){return n.name}const pt="/__lunora/schema-edit",gt=async n=>{const e=await fetch(pt,{body:JSON.stringify(n),headers:{"Content-Type":"application/json"},method:"POST"}),m=await e.json();return m.needsMigration===!0?{kind:"needs-migration",message:m.message??"This edit needs a migration."}:e.ok&&m.tables!==void 0?{diagnostics:m.diagnostics??[],kind:"ok",tables:m.tables}:{kind:"error",message:m.error??`schema edit failed (${String(e.status)})`}},bt=n=>{const e=we(32),{hasTables:m,mode:a,onAddColumn:t,onAddIndex:s,onAddTable:c,onDestructive:d}=n,r=Le(),g=a==="addTable"?"default":"outline";let o;e[0]!==r?(o=r("Add table"),e[0]=r,e[1]=o):o=e[1];let u;e[2]!==c||e[3]!==g||e[4]!==o?(u=l(ye,{"data-testid":"sc-editor-add-table",onClick:c,size:"xs",type:"button",variant:g,children:o}),e[2]=c,e[3]=g,e[4]=o,e[5]=u):u=e[5];const i=!m,v=a==="addColumn"?"default":"outline";let f;e[6]!==r?(f=r("Add column"),e[6]=r,e[7]=f):f=e[7];let L;e[8]!==t||e[9]!==i||e[10]!==v||e[11]!==f?(L=l(ye,{"data-testid":"sc-editor-add-column",disabled:i,onClick:t,size:"xs",type:"button",variant:v,children:f}),e[8]=t,e[9]=i,e[10]=v,e[11]=f,e[12]=L):L=e[12];const S=!m,G=a==="addIndex"?"default":"outline";let y;e[13]!==r?(y=r("Add index"),e[13]=r,e[14]=y):y=e[14];let O;e[15]!==s||e[16]!==y||e[17]!==S||e[18]!==G?(O=l(ye,{"data-testid":"sc-editor-add-index",disabled:S,onClick:s,size:"xs",type:"button",variant:G,children:y}),e[15]=s,e[16]=y,e[17]=S,e[18]=G,e[19]=O):O=e[19];const $=!m,z=a==="destructive"?"default":"ghost";let T;e[20]!==r?(T=r("Rename / drop / change type…"),e[20]=r,e[21]=T):T=e[21];let C;e[22]!==d||e[23]!==$||e[24]!==z||e[25]!==T?(C=l(ye,{"data-testid":"sc-editor-destructive",disabled:$,onClick:d,size:"xs",type:"button",variant:z,children:T}),e[22]=d,e[23]=$,e[24]=z,e[25]=T,e[26]=C):C=e[26];let A;return e[27]!==O||e[28]!==C||e[29]!==u||e[30]!==L?(A=p("div",{className:"flex flex-wrap gap-2",children:[u,L,O,C]}),e[27]=O,e[28]=C,e[29]=u,e[30]=L,e[31]=A):A=e[31],A},xt=n=>{const e=we(28),{onOpenMigrations:m,result:a}=n,t=Le();if(a===null){let o;return e[0]===Symbol.for("react.memo_cache_sentinel")?(o=l(Ve,{}),e[0]=o):o=e[0],o}if(a.kind==="error"){let o;return e[1]!==a.message?(o=l("p",{className:"mt-3 text-sm text-destructive","data-testid":"sc-editor-error",role:"alert",children:a.message}),e[1]=a.message,e[2]=o):o=e[2],o}if(a.kind==="needs-migration"){let o;e[3]!==a.message||e[4]!==t?(o=a.message===""?t("This edit changes stored data and must go through a migration. Review the migration before applying."):a.message,e[3]=a.message,e[4]=t,e[5]=o):o=e[5];let u;e[6]!==o?(u=l("p",{className:"text-sm text-warning",role:"alert",children:o}),e[6]=o,e[7]=u):u=e[7];let i;e[8]!==t?(i=t("Open Migrations"),e[8]=t,e[9]=i):i=e[9];let v;e[10]!==m||e[11]!==i?(v=l(ye,{className:"self-start","data-testid":"sc-editor-open-migrations",onClick:m,size:"xs",type:"button",variant:"outline",children:i}),e[10]=m,e[11]=i,e[12]=v):v=e[12];let f;return e[13]!==u||e[14]!==v?(f=p("div",{className:"mt-3 flex flex-col gap-2","data-testid":"sc-editor-needs-migration",children:[u,v]}),e[13]=u,e[14]=v,e[15]=f):f=e[15],f}if(a.diagnostics.length===0){let o;return e[16]===Symbol.for("react.memo_cache_sentinel")?(o=l(Ve,{}),e[16]=o):o=e[16],o}let s;e[17]!==t?(s=t("Codegen reported diagnostics:"),e[17]=t,e[18]=s):s=e[18];let c;e[19]!==s?(c=l("p",{className:"text-sm text-destructive",role:"alert",children:s}),e[19]=s,e[20]=c):c=e[20];let d;e[21]!==a.diagnostics?(d=a.diagnostics.map(vt),e[21]=a.diagnostics,e[22]=d):d=e[22];let r;e[23]!==d?(r=l("ul",{className:"flex flex-col gap-0.5",children:d}),e[23]=d,e[24]=r):r=e[24];let g;return e[25]!==c||e[26]!==r?(g=p("div",{className:"mt-3 flex flex-col gap-1","data-testid":"sc-editor-diagnostics",children:[c,r]}),e[25]=c,e[26]=r,e[27]=g):g=e[27],g};function vt(n){return l("li",{className:"font-mono text-[11px] text-destructive",children:n},n)}const yt=[{label:"string",validator:"v.string()"},{label:"number",validator:"v.number()"},{label:"boolean",validator:"v.boolean()"},{label:"bigint",validator:"v.bigint()"},{label:"bytes",validator:"v.bytes()"},{label:"any",validator:"v.any()"}],Ct="v.string()",Nt=n=>n.split(",").map(e=>e.trim()).filter(e=>e!==""),Tt=n=>{const e=we(83),{onApplied:m,tableNames:a}=n,t=Le(),s=nt(),[c,d]=_(null),[r,g]=_(!1),[o,u]=_(null),[i,v]=_(""),[f,L]=_(""),[S,G]=_(Ct),[y,O]=_(a[0]??""),[$,z]=_(""),[T,C]=_(""),[A,F]=_(!1);let pe;e[0]===Symbol.for("react.memo_cache_sentinel")?(pe=()=>{d(null),v(""),L(""),z(""),C(""),F(!1)},e[0]=pe):pe=e[0];const te=pe;let E;e[1]!==m?(E=async q=>{g(!0),u(null);try{const H=await gt(q);u(H),H.kind==="ok"&&(m(H.tables),te())}catch(H){const Se=H;u({kind:"error",message:Se instanceof Error?Se.message:String(Se)})}g(!1)},e[1]=m,e[2]=E):E=e[2];const M=E;let w;e[3]!==M||e[4]!==i?(w=()=>{Ce(M({kind:"addTable",table:i.trim()}))},e[3]=M,e[4]=i,e[5]=w):w=e[5];const ge=w;let B;e[6]!==f||e[7]!==M||e[8]!==y||e[9]!==S?(B=()=>{Ce(M({column:f.trim(),kind:"addOptionalColumn",table:y,validator:S}))},e[6]=f,e[7]=M,e[8]=y,e[9]=S,e[10]=B):B=e[10];const ce=B;let le;e[11]!==T||e[12]!==$||e[13]!==M||e[14]!==y||e[15]!==A?(le=()=>{Ce(M({fields:Nt(T),kind:"addIndex",name:$.trim(),table:y,unique:A}))},e[11]=T,e[12]=$,e[13]=M,e[14]=y,e[15]=A,e[16]=le):le=e[16];const J=le;let Ne;e[17]===Symbol.for("react.memo_cache_sentinel")?(Ne=()=>{u(null),d("addTable")},e[17]=Ne):Ne=e[17];const W=Ne;let me;e[18]===Symbol.for("react.memo_cache_sentinel")?(me=()=>{u(null),d("addColumn")},e[18]=me):me=e[18];const be=me;let D;e[19]===Symbol.for("react.memo_cache_sentinel")?(D=()=>{u(null),d("addIndex")},e[19]=D):D=e[19];const j=D;let se;e[20]!==t?(se=()=>{d("destructive"),u({kind:"needs-migration",message:t("This edit changes stored data and must go through a migration. Review the migration before applying.")})},e[20]=t,e[21]=se):se=e[21];const ue=se;let R;e[22]===Symbol.for("react.memo_cache_sentinel")?(R=q=>{v(q.target.value)},e[22]=R):R=e[22];const ae=R;let K;e[23]===Symbol.for("react.memo_cache_sentinel")?(K=q=>{L(q.target.value)},e[23]=K):K=e[23];const ne=K;let oe;e[24]===Symbol.for("react.memo_cache_sentinel")?(oe=q=>{G(q.target.value)},e[24]=oe):oe=e[24];const fe=oe;let X;e[25]===Symbol.for("react.memo_cache_sentinel")?(X=q=>{O(q.target.value)},e[25]=X):X=e[25];const Q=X;let U;e[26]===Symbol.for("react.memo_cache_sentinel")?(U=q=>{z(q.target.value)},e[26]=U):U=e[26];const ie=U;let V;e[27]===Symbol.for("react.memo_cache_sentinel")?(V=q=>{C(q.target.value)},e[27]=V):V=e[27];const re=V;let Y;e[28]===Symbol.for("react.memo_cache_sentinel")?(Y=q=>{F(q.target.checked)},e[28]=Y):Y=e[28];const P=Y;let Z;e[29]!==s?(Z=()=>{Ce(s({to:"/migrations"}))},e[29]=s,e[30]=Z):Z=e[30];const b=Z;let ee;e[31]!==t?(ee=t("Edit schema"),e[31]=t,e[32]=ee):ee=e[32];let de;e[33]!==ee?(de=l(Ge,{children:ee}),e[33]=ee,e[34]=de):de=e[34];let xe;e[35]!==t?(xe=t("Adds a table, column, or index to lunora/schema.ts and reruns codegen."),e[35]=t,e[36]=xe):xe=e[36];let Te;e[37]!==xe?(Te=l(ze,{children:xe}),e[37]=xe,e[38]=Te):Te=e[38];let ve;e[39]!==de||e[40]!==Te?(ve=p(Be,{children:[de,Te]}),e[39]=de,e[40]=Te,e[41]=ve):ve=e[41];const h=a.length>0;let x;e[42]!==c||e[43]!==ue||e[44]!==h?(x=l(bt,{hasTables:h,mode:c,onAddColumn:be,onAddIndex:j,onAddTable:W,onDestructive:ue}),e[42]=c,e[43]=ue,e[44]=h,e[45]=x):x=e[45];let N;e[46]!==r||e[47]!==c||e[48]!==ge||e[49]!==t||e[50]!==i?(N=c==="addTable"&&p("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"sc-editor-table-form",children:[p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-table-name",children:t("Table name")}),l(ke,{"data-testid":"sc-editor-table-name",id:"sc-editor-table-name",onChange:ae,value:i})]}),l(ye,{"data-testid":"sc-editor-table-apply",disabled:r||i.trim()==="",onClick:ge,size:"xs",type:"button",children:t(r?"Applying…":"Apply")}),l(ye,{onClick:te,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[46]=r,e[47]=c,e[48]=ge,e[49]=t,e[50]=i,e[51]=N):N=e[51];let k;e[52]!==r||e[53]!==f||e[54]!==c||e[55]!==ce||e[56]!==t||e[57]!==a||e[58]!==y||e[59]!==S?(k=c==="addColumn"&&p("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"sc-editor-column-form",children:[p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-column-table",children:t("Table name")}),l("select",{className:"h-8 rounded-md border border-input bg-transparent px-2 text-xs","data-testid":"sc-editor-column-table",id:"sc-editor-column-table",onChange:Q,value:y,children:a.map(St)})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-column-name",children:t("Column name")}),l(ke,{"data-testid":"sc-editor-column-name",id:"sc-editor-column-name",onChange:ne,value:f})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-column-type",children:t("Column type")}),l("select",{className:"h-8 rounded-md border border-input bg-transparent px-2 text-xs","data-testid":"sc-editor-column-type",id:"sc-editor-column-type",onChange:fe,value:S,children:yt.map(wt)})]}),l("span",{className:"text-[11px] text-muted-foreground",children:t("Optional")}),l(ye,{"data-testid":"sc-editor-column-apply",disabled:r||f.trim()===""||y==="",onClick:ce,size:"xs",type:"button",children:t(r?"Applying…":"Apply")}),l(ye,{onClick:te,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[52]=r,e[53]=f,e[54]=c,e[55]=ce,e[56]=t,e[57]=a,e[58]=y,e[59]=S,e[60]=k):k=e[60];let I;e[61]!==r||e[62]!==T||e[63]!==$||e[64]!==c||e[65]!==J||e[66]!==t||e[67]!==a||e[68]!==y||e[69]!==A?(I=c==="addIndex"&&p("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"sc-editor-index-form",children:[p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-index-table",children:t("Table name")}),l("select",{className:"h-8 rounded-md border border-input bg-transparent px-2 text-xs","data-testid":"sc-editor-index-table",id:"sc-editor-index-table",onChange:Q,value:y,children:a.map(_t)})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-index-name",children:t("Index name")}),l(ke,{"data-testid":"sc-editor-index-name",id:"sc-editor-index-name",onChange:ie,value:$})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-index-fields",children:t("Index fields (comma-separated)")}),l(ke,{"data-testid":"sc-editor-index-fields",id:"sc-editor-index-fields",onChange:re,value:T})]}),p(Ee,{className:"flex items-center gap-1 text-xs",htmlFor:"sc-editor-index-unique",children:[l("input",{checked:A,"data-testid":"sc-editor-index-unique",id:"sc-editor-index-unique",onChange:P,type:"checkbox"}),l("span",{className:"text-muted-foreground",children:t("Unique")})]}),l(ye,{"data-testid":"sc-editor-index-apply",disabled:r||$.trim()===""||T.trim()==="",onClick:J,size:"xs",type:"button",children:t(r?"Applying…":"Apply")}),l(ye,{onClick:te,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[61]=r,e[62]=T,e[63]=$,e[64]=c,e[65]=J,e[66]=t,e[67]=a,e[68]=y,e[69]=A,e[70]=I):I=e[70];let he;e[71]!==b||e[72]!==o?(he=l(xt,{onOpenMigrations:b,result:o}),e[71]=b,e[72]=o,e[73]=he):he=e[73];let _e;e[74]!==x||e[75]!==N||e[76]!==k||e[77]!==I||e[78]!==he?(_e=p(De,{children:[x,N,k,I,he]}),e[74]=x,e[75]=N,e[76]=k,e[77]=I,e[78]=he,e[79]=_e):_e=e[79];let Ie;return e[80]!==ve||e[81]!==_e?(Ie=p(je,{"data-testid":"sc-editor",size:"sm",children:[ve,_e]}),e[80]=ve,e[81]=_e,e[82]=Ie):Ie=e[82],Ie};function St(n){return l("option",{value:n,children:n},n)}function wt(n){return l("option",{value:n.validator,children:n.label},n.validator)}function _t(n){return l("option",{value:n,children:n},n)}const He=[],Et=n=>{const e=we(5),{open:m}=n,a=m&&"rotate-90";let t;e[0]!==a?(t=Qe("size-3.5 shrink-0 text-muted-foreground transition-transform duration-150",a),e[0]=a,e[1]=t):t=e[1];let s;e[2]===Symbol.for("react.memo_cache_sentinel")?(s=l("path",{d:"m9 6 6 6-6 6"}),e[2]=s):s=e[2];let c;return e[3]!==t?(c=l("svg",{"aria-hidden":"true",className:t,fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.8,viewBox:"0 0 24 24",children:s}),e[3]=t,e[4]=c):c=e[4],c},Je=n=>{const e=we(20),{children:m,expanded:a,name:t,onToggle:s,rowCount:c,rowTestId:d,toggleTestId:r}=n;let g;e[0]!==a?(g=l(Et,{open:a}),e[0]=a,e[1]=g):g=e[1];let o;e[2]!==t?(o=l("span",{className:"truncate font-mono text-xs text-foreground",title:t,children:t}),e[2]=t,e[3]=o):o=e[3];let u;e[4]!==c?(u=p("span",{className:"ms-auto shrink-0 text-xs text-muted-foreground tabular-nums",children:["(",c,")"]}),e[4]=c,e[5]=u):u=e[5];let i;e[6]!==a||e[7]!==s||e[8]!==g||e[9]!==o||e[10]!==u||e[11]!==r?(i=p("button",{"aria-expanded":a,className:"flex w-full items-center gap-2 px-3 py-2 text-start transition-colors hover:bg-muted/50 aria-expanded:bg-muted/40","data-testid":r,onClick:s,type:"button",children:[g,o," ",u]}),e[6]=a,e[7]=s,e[8]=g,e[9]=o,e[10]=u,e[11]=r,e[12]=i):i=e[12];let v;e[13]!==m||e[14]!==a?(v=a&&l("div",{className:"px-3 pb-3 ps-8",children:m}),e[13]=m,e[14]=a,e[15]=v):v=e[15];let f;return e[16]!==d||e[17]!==i||e[18]!==v?(f=p("li",{className:"border-t border-border/60 first:border-t-0","data-testid":d,children:[i,v]}),e[16]=d,e[17]=i,e[18]=v,e[19]=f):f=e[19],f},We=n=>{const e=we(5),{columns:m,testId:a}=n;let t;e[0]!==m?(t=m.map(kt),e[0]=m,e[1]=t):t=e[1];let s;return e[2]!==t||e[3]!==a?(s=l("ul",{className:"flex flex-wrap gap-1.5 pt-1","data-testid":a,children:t}),e[2]=t,e[3]=a,e[4]=s):s=e[4],s},It=n=>{const e=we(10),{heading:m,indexes:a,testId:t}=n;let s;e[0]!==m?(s=l("p",{className:"mb-1.5 font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:m}),e[0]=m,e[1]=s):s=e[1];let c;e[2]!==a?(c=a.map(At),e[2]=a,e[3]=c):c=e[3];let d;e[4]!==c||e[5]!==t?(d=l("ul",{className:"flex flex-col gap-1","data-testid":t,children:c}),e[4]=c,e[5]=t,e[6]=d):d=e[6];let r;return e[7]!==s||e[8]!==d?(r=p("div",{className:"pt-3",children:[s,d]}),e[7]=s,e[8]=d,e[9]=r):r=e[9],r},Xe=n=>Qe("border-b-2 px-3 py-2 font-mono text-[11px] tracking-widest uppercase outline-none transition-colors",n?"border-foreground text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),Qt=n=>{const e=we(85),{initialShardKey:m,initialTable:a,schemaEditable:t}=n,s=Le();let c;e[0]!==m||e[1]!==a?(c={initialShardKey:m,initialTable:a},e[0]=m,e[1]=a,e[2]=c):c=e[2];const{columns:d,diagramTables:r,error:g,expanded:o,filteredGlobalTables:u,filteredTables:i,globalColumns:v,globalError:f,globalExpanded:L,globalTables:S,indexes:G,refresh:y,setShardKey:O,setTableFilter:$,setView:z,shardColumnsError:T,shardKey:C,tableFilter:A,tables:F,toggle:pe,toggleGlobal:te,view:E}=mt(c);let M;e[3]!==z?(M=()=>{z("list")},e[3]=z,e[4]=M):M=e[4];const w=M;let ge;e[5]!==z?(ge=()=>{z("graph")},e[5]=z,e[6]=ge):ge=e[6];const B=ge;let ce;e[7]!==$?(ce=b=>{$(b.target.value)},e[7]=$,e[8]=ce):ce=e[8];const le=ce;let J;e[9]!==y||e[10]!==C?(J=b=>{Ce(y(C))},e[9]=y,e[10]=C,e[11]=J):J=e[11];const Ne=J;let W;e[12]!==F?(W=F??[],e[12]=F,e[13]=W):W=e[13];let me;e[14]!==W?(me=W.map($t),e[14]=W,e[15]=me):me=e[15];const be=me;let D;e[16]!==O||e[17]!==C?(D=l(Ze,{onChange:O,testId:"sc-shard-input",value:C}),e[16]=O,e[17]=C,e[18]=D):D=e[18];let j;e[19]!==s?(j=s("Schema view"),e[19]=s,e[20]=j):j=e[20];const se=E==="graph",ue=E==="graph";let R;e[21]!==ue?(R=Xe(ue),e[21]=ue,e[22]=R):R=e[22];let ae;e[23]!==s?(ae=s("Graph"),e[23]=s,e[24]=ae):ae=e[24];let K;e[25]!==B||e[26]!==se||e[27]!==R||e[28]!==ae?(K=l("button",{"aria-selected":se,className:R,"data-testid":"sc-view-graph",onClick:B,role:"tab",type:"button",children:ae}),e[25]=B,e[26]=se,e[27]=R,e[28]=ae,e[29]=K):K=e[29];const ne=E==="list",oe=E==="list";let fe;e[30]!==oe?(fe=Xe(oe),e[30]=oe,e[31]=fe):fe=e[31];let X;e[32]!==s?(X=s("Table list"),e[32]=s,e[33]=X):X=e[33];let Q;e[34]!==w||e[35]!==ne||e[36]!==fe||e[37]!==X?(Q=l("button",{"aria-selected":ne,className:fe,"data-testid":"sc-view-list",onClick:w,role:"tab",type:"button",children:X}),e[34]=w,e[35]=ne,e[36]=fe,e[37]=X,e[38]=Q):Q=e[38];let U;e[39]!==K||e[40]!==Q||e[41]!==j?(U=p("div",{"aria-label":j,className:"flex items-center gap-1","data-testid":"sc-view-toggle",role:"tablist",children:[K,Q]}),e[39]=K,e[40]=Q,e[41]=j,e[42]=U):U=e[42];let ie;e[43]!==U||e[44]!==D?(ie=p("div",{className:"flex flex-wrap items-center gap-3",children:[D,U]}),e[43]=U,e[44]=D,e[45]=ie):ie=e[45];let V;e[46]!==Ne||e[47]!==t||e[48]!==be?(V=t===!0&&l(Tt,{onApplied:Ne,tableNames:be}),e[46]=Ne,e[47]=t,e[48]=be,e[49]=V):V=e[49];let re;e[50]!==le||e[51]!==s||e[52]!==A||e[53]!==E?(re=E==="list"&&l(ke,{"aria-label":s("Filter tables"),className:"h-8 max-w-xs","data-testid":"sc-filter",onChange:le,placeholder:s("Filter tables"),value:A}),e[50]=le,e[51]=s,e[52]=A,e[53]=E,e[54]=re):re=e[54];let Y;e[55]!==r||e[56]!==g||e[57]!==f||e[58]!==T||e[59]!==C||e[60]!==E?(Y=E==="graph"&&p("div",{className:"flex flex-col gap-2","data-testid":"sc-graph-view",children:[g!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-error",role:"alert",children:g}),f!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-global-error",role:"alert",children:f}),l(at,{columnsError:T[C]===!0,tables:r,testIdPrefix:"sc-graph"})]}),e[55]=r,e[56]=g,e[57]=f,e[58]=T,e[59]=C,e[60]=E,e[61]=Y):Y=e[61];let P;e[62]!==d||e[63]!==g||e[64]!==o||e[65]!==u||e[66]!==i||e[67]!==v||e[68]!==f||e[69]!==L||e[70]!==S||e[71]!==G||e[72]!==C||e[73]!==s||e[74]!==F||e[75]!==pe||e[76]!==te||e[77]!==E?(P=E==="list"&&p("div",{className:"flex flex-col gap-4",children:[p(je,{"data-testid":"sc-shard-section",size:"sm",children:[p(Be,{children:[p("div",{className:"flex items-center gap-2",children:[l(Ke,{tier:"shard"}),l(Ge,{children:s("Shard tables")}),F!==null&&l(Fe,{className:"ms-auto tabular-nums",variant:"outline",children:i.length})]}),l(ze,{children:Pe.shard.hint})]}),p(De,{children:[g!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-error",role:"alert",children:g}),F!==null&&F.length===0&&l("p",{className:"text-sm text-muted-foreground","data-testid":"sc-empty",children:s("No tables in this shard.")}),F!==null&&F.length>0&&i.length===0&&l("p",{className:"text-sm text-muted-foreground","data-testid":"sc-no-match",children:s("No tables match your filter.")}),i.length>0&&l("ul",{className:"-mx-3 overflow-hidden border-t border-border","data-testid":"sc-table-list",children:i.map(b=>{const ee=`${C}:${b.name}`,de=G[ee]??[];return p(Je,{expanded:o===b.name,name:b.name,onToggle:()=>{Ce(pe(b.name))},rowCount:b.rowCount,rowTestId:`sc-table-${b.name}`,toggleTestId:`sc-toggle-${b.name}`,children:[l(We,{columns:d[ee]??He,testId:`sc-columns-${b.name}`}),de.length>0&&l(It,{heading:s("Indexes"),indexes:de,testId:`sc-indexes-${b.name}`})]},b.name)})})]})]}),p(je,{"data-testid":"sc-global-section",size:"sm",children:[p(Be,{children:[p("div",{className:"flex items-center gap-2",children:[l(Ke,{tier:"global"}),l(Ge,{children:s("Global tables (D1)")}),S!==null&&l(Fe,{className:"ms-auto tabular-nums",variant:"outline",children:u.length})]}),l(ze,{children:Pe.global.hint})]}),p(De,{children:[f!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-global-error",role:"alert",children:f}),S!==null&&S.length===0&&l(et,{description:Pe.global.hint,testId:"sc-global-empty",title:s("No global tables.")}),S!==null&&S.length>0&&u.length===0&&l("p",{className:"text-sm text-muted-foreground","data-testid":"sc-global-no-match",children:s("No tables match your filter.")}),u.length>0&&l("ul",{className:"-mx-3 overflow-hidden border-t border-border","data-testid":"sc-global-table-list",children:u.map(b=>l(Je,{expanded:L===b.name,name:b.name,onToggle:()=>{Ce(te(b.name))},rowCount:b.rowCount,rowTestId:`sc-global-table-${b.name}`,toggleTestId:`sc-global-toggle-${b.name}`,children:l(We,{columns:v[b.name]??He,testId:`sc-global-columns-${b.name}`})},b.name))})]})]})]}),e[62]=d,e[63]=g,e[64]=o,e[65]=u,e[66]=i,e[67]=v,e[68]=f,e[69]=L,e[70]=S,e[71]=G,e[72]=C,e[73]=s,e[74]=F,e[75]=pe,e[76]=te,e[77]=E,e[78]=P):P=e[78];let Z;return e[79]!==ie||e[80]!==V||e[81]!==re||e[82]!==Y||e[83]!==P?(Z=p("div",{className:"flex flex-col gap-4","data-testid":"lunora-schema",children:[ie,V,re,Y,P]}),e[79]=ie,e[80]=V,e[81]=re,e[82]=Y,e[83]=P,e[84]=Z):Z=e[84],Z};function kt(n){return l("li",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground",children:n},n)}function At(n){return p("li",{className:"flex flex-wrap items-center gap-1.5 text-xs",children:[l("span",{className:"font-mono",children:n.name}),l(Fe,{variant:"outline",children:n.type}),n.unique===!0&&l(Fe,{variant:"secondary",children:"unique"}),l("span",{className:"text-muted-foreground",children:n.fields.join(", ")})]},`${n.type}:${n.name}`)}function $t(n){return n.name}export{Qt as SchemaViewer};
|
|
1
|
+
import{c as we}from"react/compiler-runtime";import{ShardInput as Ze}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{S as Ke,T as Pe}from"../packem_shared/storage-tier-C2mKwYRj.mjs";import{B as Fe}from"../packem_shared/badge-r_5B4LHP.mjs";import{c as Ge,d as ze,b as Be,a as De,C as je}from"../packem_shared/card-By2O8ULa.mjs";import{E as et}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as ke}from"../packem_shared/input-CXhxesPC.mjs";import{useT as Le}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{c as Oe,d as Ae,b as $e,f as Ce}from"../packem_shared/internal-Df43vQI0.mjs";import{c as Qe}from"../packem_shared/utils-bhneXptQ.mjs";import{useLunora as tt}from"@lunora/react";import{useState as _,useRef as Ue,useEffect as qe}from"react";import{u as lt}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{ADMIN_FUNCTIONS as Me}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{r as st}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{S as at}from"../packem_shared/schema-diagram-C5oilX7l.mjs";import{useNavigate as nt}from"@tanstack/react-router";import{B as ye}from"../packem_shared/button-q0UYSmrn.mjs";import{L as Ee}from"../packem_shared/label-DKFzyHq6.mjs";import{jsx as l,jsxs as p,Fragment as Ve}from"react/jsx-runtime";const ot=Oe(Me.listTables),it=Oe(Me.listTableIndexes),rt=Oe(Me.readTablePage),dt=Oe(Me.describeTables),ct={},Ye=[],mt=n=>{const e=we(74),{initialShardKey:m,initialTable:a}=n,t=tt(),[s,c]=_("graph"),{queryShardKey:d,setShardKey:r,shardKey:g}=lt(m),[o,u]=_(""),[i,v]=_(null),[f,L]=_(null);let S;e[0]===Symbol.for("react.memo_cache_sentinel")?(S={},e[0]=S):S=e[0];const[G,y]=_(S);let O;e[1]===Symbol.for("react.memo_cache_sentinel")?(O={},e[1]=O):O=e[1];const[$,z]=_(O),[T,C]=_(null);let A;e[2]===Symbol.for("react.memo_cache_sentinel")?(A={},e[2]=A):A=e[2];const[F,pe]=_(A);let te;e[3]===Symbol.for("react.memo_cache_sentinel")?(te={},e[3]=te):te=e[3];const[E,M]=_(te),[w,ge]=_(null),[B,ce]=_(null);let le;e[4]===Symbol.for("react.memo_cache_sentinel")?(le={},e[4]=le):le=e[4];const[J,Ne]=_(le),[W,me]=_(null),be=Ue(0);let D;e[5]!==t?(D=async h=>{be.current=be.current+1;const x=be.current;L(null);try{const N=await t.query(ot,{},Ae(h));if(x!==be.current)return;st(h),v(N),y({}),z({}),C(null),pe(k=>Object.fromEntries(Object.entries(k).filter(I=>{const[he]=I;return he!==h}))),M(k=>Object.fromEntries(Object.entries(k).filter(I=>{const[he]=I;return he!==h})))}catch(N){const k=N;if(x!==be.current)return;v(null),L($e(k))}},e[5]=t,e[6]=D):D=e[6];const j=D;let se;e[7]!==t?(se=async()=>{ce(null);try{ge(await t.listGlobalTables())}catch(h){const x=h;ge(null),ce($e(x))}},e[7]=t,e[8]=se):se=e[8];const ue=se;let R,ae;e[9]!==d||e[10]!==j||e[11]!==ue?(R=()=>{Ce(j(d)),Ce(ue())},ae=[j,ue,d],e[9]=d,e[10]=j,e[11]=ue,e[12]=R,e[13]=ae):(R=e[12],ae=e[13]),qe(R,ae);let K;e[14]!==t||e[15]!==G||e[16]!==T||e[17]!==d?(K=async h=>{if(T===h){C(null);return}C(h);const x=`${d}:${h}`;if(G[x]!==void 0)return;const[N,k]=await Promise.allSettled([t.query(rt,{limit:1,offset:0,table:h},Ae(d)),t.query(it,{table:h},Ae(d))]);N.status==="fulfilled"?y(I=>({...I,[x]:N.value.columns})):L($e(N.reason)),k.status==="fulfilled"&&z(I=>({...I,[x]:k.value.indexes}))},e[14]=t,e[15]=G,e[16]=T,e[17]=d,e[18]=K):K=e[18];const ne=K;let oe;e[19]!==t||e[20]!==J||e[21]!==W?(oe=async h=>{if(W===h){me(null);return}if(me(h),J[h]===void 0)try{const x=await t.readGlobalTablePage({limit:1,offset:0,table:h});Ne(N=>({...N,[h]:x.columns}))}catch(x){ce($e(x))}},e[19]=t,e[20]=J,e[21]=W,e[22]=oe):oe=e[22];const fe=oe,X=Ue(void 0);let Q,U;e[23]!==a||e[24]!==i||e[25]!==ne?(Q=()=>{a===void 0||i===null||X.current===a||i.some(h=>h.name===a)&&(X.current=a,Ce(ne(a)))},U=[a,i,ne],e[23]=a,e[24]=i,e[25]=ne,e[26]=Q,e[27]=U):(Q=e[26],U=e[27]),qe(Q,U);let ie;e[28]!==t?(ie=async(h,x,N)=>{const[k,I]=await Promise.all([Promise.allSettled([t.query(dt,{tables:[...x,...N]},Ae(h))]),Promise.all(N.map(async H=>{const Se=await Promise.allSettled([t.readGlobalTablePage({limit:1,offset:0,table:H})]),Re=Se[0].status==="fulfilled"?Se[0].value:void 0;return{columns:Re?.columns??[],refs:Re?.refs??{},table:H}}))]),he=k[0].status==="fulfilled"?k[0].value?.columnsByTable??{}:{},_e=k[0].status==="rejected",Ie=new Map(I.map(ut)),q=[...x,...N].map(H=>{const Se=he[H]??[];return[H,Se.length>0?Se:Ie.get(H)??[]]});pe(H=>({...H,[h]:Object.fromEntries(q)})),M(H=>({...H,[h]:_e}))},e[28]=t,e[29]=ie):ie=e[29];const V=ie;let re,Y;e[30]!==B||e[31]!==w||e[32]!==V||e[33]!==d||e[34]!==F||e[35]!==i||e[36]!==s?(re=()=>{s!=="graph"||i===null||w===null&&B===null||F[d]!==void 0||Ce(V(d,i.map(ft),(w??[]).map(ht)))},Y=[s,i,w,B,d,F,V],e[30]=B,e[31]=w,e[32]=V,e[33]=d,e[34]=F,e[35]=i,e[36]=s,e[37]=re,e[38]=Y):(re=e[37],Y=e[38]),qe(re,Y);const P=F[d]??ct;let Z;if(e[39]!==P||e[40]!==w||e[41]!==i){let h;e[43]!==P?(h=I=>({columns:P[I.name]??Ye,name:I.name,tier:"shard"}),e[43]=P,e[44]=h):h=e[44];const x=(i??[]).map(h);let N;e[45]!==P?(N=I=>({columns:P[I.name]??Ye,name:I.name,tier:"global"}),e[45]=P,e[46]=N):N=e[46];const k=(w??[]).map(N);Z=[...x,...k],e[39]=P,e[40]=w,e[41]=i,e[42]=Z}else Z=e[42];const b=Z;let ee;if(e[47]!==o||e[48]!==i){const h=o.trim().toLowerCase();ee=(i??[]).filter(x=>x.name.toLowerCase().includes(h)),e[47]=o,e[48]=i,e[49]=ee}else ee=e[49];const de=ee;let xe;if(e[50]!==w||e[51]!==o){const h=o.trim().toLowerCase();xe=(w??[]).filter(x=>x.name.toLowerCase().includes(h)),e[50]=w,e[51]=o,e[52]=xe}else xe=e[52];const Te=xe;let ve;return e[53]!==G||e[54]!==b||e[55]!==f||e[56]!==T||e[57]!==Te||e[58]!==de||e[59]!==J||e[60]!==B||e[61]!==W||e[62]!==w||e[63]!==$||e[64]!==j||e[65]!==r||e[66]!==E||e[67]!==g||e[68]!==o||e[69]!==i||e[70]!==ne||e[71]!==fe||e[72]!==s?(ve={columns:G,diagramTables:b,error:f,expanded:T,filteredGlobalTables:Te,filteredTables:de,globalColumns:J,globalError:B,globalExpanded:W,globalTables:w,indexes:$,refresh:j,setShardKey:r,setTableFilter:u,setView:c,shardColumnsError:E,shardKey:g,tableFilter:o,tables:i,toggle:ne,toggleGlobal:fe,view:s},e[53]=G,e[54]=b,e[55]=f,e[56]=T,e[57]=Te,e[58]=de,e[59]=J,e[60]=B,e[61]=W,e[62]=w,e[63]=$,e[64]=j,e[65]=r,e[66]=E,e[67]=g,e[68]=o,e[69]=i,e[70]=ne,e[71]=fe,e[72]=s,e[73]=ve):ve=e[73],ve};function ut(n){const{columns:e,refs:m,table:a}=n;return[a,e.map(t=>{const s=m[t];return s===void 0?{name:t,optional:!1,type:""}:{name:t,optional:!1,ref:s,type:"id"}})]}function ft(n){return n.name}function ht(n){return n.name}const pt="/__lunora/schema-edit",gt=async n=>{const e=await fetch(pt,{body:JSON.stringify(n),headers:{"Content-Type":"application/json"},method:"POST"}),m=await e.json();return m.needsMigration===!0?{kind:"needs-migration",message:m.message??"This edit needs a migration."}:e.ok&&m.tables!==void 0?{diagnostics:m.diagnostics??[],kind:"ok",tables:m.tables}:{kind:"error",message:m.error??`schema edit failed (${String(e.status)})`}},bt=n=>{const e=we(32),{hasTables:m,mode:a,onAddColumn:t,onAddIndex:s,onAddTable:c,onDestructive:d}=n,r=Le(),g=a==="addTable"?"default":"outline";let o;e[0]!==r?(o=r("Add table"),e[0]=r,e[1]=o):o=e[1];let u;e[2]!==c||e[3]!==g||e[4]!==o?(u=l(ye,{"data-testid":"sc-editor-add-table",onClick:c,size:"xs",type:"button",variant:g,children:o}),e[2]=c,e[3]=g,e[4]=o,e[5]=u):u=e[5];const i=!m,v=a==="addColumn"?"default":"outline";let f;e[6]!==r?(f=r("Add column"),e[6]=r,e[7]=f):f=e[7];let L;e[8]!==t||e[9]!==i||e[10]!==v||e[11]!==f?(L=l(ye,{"data-testid":"sc-editor-add-column",disabled:i,onClick:t,size:"xs",type:"button",variant:v,children:f}),e[8]=t,e[9]=i,e[10]=v,e[11]=f,e[12]=L):L=e[12];const S=!m,G=a==="addIndex"?"default":"outline";let y;e[13]!==r?(y=r("Add index"),e[13]=r,e[14]=y):y=e[14];let O;e[15]!==s||e[16]!==y||e[17]!==S||e[18]!==G?(O=l(ye,{"data-testid":"sc-editor-add-index",disabled:S,onClick:s,size:"xs",type:"button",variant:G,children:y}),e[15]=s,e[16]=y,e[17]=S,e[18]=G,e[19]=O):O=e[19];const $=!m,z=a==="destructive"?"default":"ghost";let T;e[20]!==r?(T=r("Rename / drop / change type…"),e[20]=r,e[21]=T):T=e[21];let C;e[22]!==d||e[23]!==$||e[24]!==z||e[25]!==T?(C=l(ye,{"data-testid":"sc-editor-destructive",disabled:$,onClick:d,size:"xs",type:"button",variant:z,children:T}),e[22]=d,e[23]=$,e[24]=z,e[25]=T,e[26]=C):C=e[26];let A;return e[27]!==O||e[28]!==C||e[29]!==u||e[30]!==L?(A=p("div",{className:"flex flex-wrap gap-2",children:[u,L,O,C]}),e[27]=O,e[28]=C,e[29]=u,e[30]=L,e[31]=A):A=e[31],A},xt=n=>{const e=we(28),{onOpenMigrations:m,result:a}=n,t=Le();if(a===null){let o;return e[0]===Symbol.for("react.memo_cache_sentinel")?(o=l(Ve,{}),e[0]=o):o=e[0],o}if(a.kind==="error"){let o;return e[1]!==a.message?(o=l("p",{className:"mt-3 text-sm text-destructive","data-testid":"sc-editor-error",role:"alert",children:a.message}),e[1]=a.message,e[2]=o):o=e[2],o}if(a.kind==="needs-migration"){let o;e[3]!==a.message||e[4]!==t?(o=a.message===""?t("This edit changes stored data and must go through a migration. Review the migration before applying."):a.message,e[3]=a.message,e[4]=t,e[5]=o):o=e[5];let u;e[6]!==o?(u=l("p",{className:"text-sm text-warning",role:"alert",children:o}),e[6]=o,e[7]=u):u=e[7];let i;e[8]!==t?(i=t("Open Migrations"),e[8]=t,e[9]=i):i=e[9];let v;e[10]!==m||e[11]!==i?(v=l(ye,{className:"self-start","data-testid":"sc-editor-open-migrations",onClick:m,size:"xs",type:"button",variant:"outline",children:i}),e[10]=m,e[11]=i,e[12]=v):v=e[12];let f;return e[13]!==u||e[14]!==v?(f=p("div",{className:"mt-3 flex flex-col gap-2","data-testid":"sc-editor-needs-migration",children:[u,v]}),e[13]=u,e[14]=v,e[15]=f):f=e[15],f}if(a.diagnostics.length===0){let o;return e[16]===Symbol.for("react.memo_cache_sentinel")?(o=l(Ve,{}),e[16]=o):o=e[16],o}let s;e[17]!==t?(s=t("Codegen reported diagnostics:"),e[17]=t,e[18]=s):s=e[18];let c;e[19]!==s?(c=l("p",{className:"text-sm text-destructive",role:"alert",children:s}),e[19]=s,e[20]=c):c=e[20];let d;e[21]!==a.diagnostics?(d=a.diagnostics.map(vt),e[21]=a.diagnostics,e[22]=d):d=e[22];let r;e[23]!==d?(r=l("ul",{className:"flex flex-col gap-0.5",children:d}),e[23]=d,e[24]=r):r=e[24];let g;return e[25]!==c||e[26]!==r?(g=p("div",{className:"mt-3 flex flex-col gap-1","data-testid":"sc-editor-diagnostics",children:[c,r]}),e[25]=c,e[26]=r,e[27]=g):g=e[27],g};function vt(n){return l("li",{className:"font-mono text-[11px] text-destructive",children:n},n)}const yt=[{label:"string",validator:"v.string()"},{label:"number",validator:"v.number()"},{label:"boolean",validator:"v.boolean()"},{label:"bigint",validator:"v.bigint()"},{label:"bytes",validator:"v.bytes()"},{label:"any",validator:"v.any()"}],Ct="v.string()",Nt=n=>n.split(",").map(e=>e.trim()).filter(e=>e!==""),Tt=n=>{const e=we(83),{onApplied:m,tableNames:a}=n,t=Le(),s=nt(),[c,d]=_(null),[r,g]=_(!1),[o,u]=_(null),[i,v]=_(""),[f,L]=_(""),[S,G]=_(Ct),[y,O]=_(a[0]??""),[$,z]=_(""),[T,C]=_(""),[A,F]=_(!1);let pe;e[0]===Symbol.for("react.memo_cache_sentinel")?(pe=()=>{d(null),v(""),L(""),z(""),C(""),F(!1)},e[0]=pe):pe=e[0];const te=pe;let E;e[1]!==m?(E=async q=>{g(!0),u(null);try{const H=await gt(q);u(H),H.kind==="ok"&&(m(H.tables),te())}catch(H){const Se=H;u({kind:"error",message:Se instanceof Error?Se.message:String(Se)})}g(!1)},e[1]=m,e[2]=E):E=e[2];const M=E;let w;e[3]!==M||e[4]!==i?(w=()=>{Ce(M({kind:"addTable",table:i.trim()}))},e[3]=M,e[4]=i,e[5]=w):w=e[5];const ge=w;let B;e[6]!==f||e[7]!==M||e[8]!==y||e[9]!==S?(B=()=>{Ce(M({column:f.trim(),kind:"addOptionalColumn",table:y,validator:S}))},e[6]=f,e[7]=M,e[8]=y,e[9]=S,e[10]=B):B=e[10];const ce=B;let le;e[11]!==T||e[12]!==$||e[13]!==M||e[14]!==y||e[15]!==A?(le=()=>{Ce(M({fields:Nt(T),kind:"addIndex",name:$.trim(),table:y,unique:A}))},e[11]=T,e[12]=$,e[13]=M,e[14]=y,e[15]=A,e[16]=le):le=e[16];const J=le;let Ne;e[17]===Symbol.for("react.memo_cache_sentinel")?(Ne=()=>{u(null),d("addTable")},e[17]=Ne):Ne=e[17];const W=Ne;let me;e[18]===Symbol.for("react.memo_cache_sentinel")?(me=()=>{u(null),d("addColumn")},e[18]=me):me=e[18];const be=me;let D;e[19]===Symbol.for("react.memo_cache_sentinel")?(D=()=>{u(null),d("addIndex")},e[19]=D):D=e[19];const j=D;let se;e[20]!==t?(se=()=>{d("destructive"),u({kind:"needs-migration",message:t("This edit changes stored data and must go through a migration. Review the migration before applying.")})},e[20]=t,e[21]=se):se=e[21];const ue=se;let R;e[22]===Symbol.for("react.memo_cache_sentinel")?(R=q=>{v(q.target.value)},e[22]=R):R=e[22];const ae=R;let K;e[23]===Symbol.for("react.memo_cache_sentinel")?(K=q=>{L(q.target.value)},e[23]=K):K=e[23];const ne=K;let oe;e[24]===Symbol.for("react.memo_cache_sentinel")?(oe=q=>{G(q.target.value)},e[24]=oe):oe=e[24];const fe=oe;let X;e[25]===Symbol.for("react.memo_cache_sentinel")?(X=q=>{O(q.target.value)},e[25]=X):X=e[25];const Q=X;let U;e[26]===Symbol.for("react.memo_cache_sentinel")?(U=q=>{z(q.target.value)},e[26]=U):U=e[26];const ie=U;let V;e[27]===Symbol.for("react.memo_cache_sentinel")?(V=q=>{C(q.target.value)},e[27]=V):V=e[27];const re=V;let Y;e[28]===Symbol.for("react.memo_cache_sentinel")?(Y=q=>{F(q.target.checked)},e[28]=Y):Y=e[28];const P=Y;let Z;e[29]!==s?(Z=()=>{Ce(s({to:"/migrations"}))},e[29]=s,e[30]=Z):Z=e[30];const b=Z;let ee;e[31]!==t?(ee=t("Edit schema"),e[31]=t,e[32]=ee):ee=e[32];let de;e[33]!==ee?(de=l(Ge,{children:ee}),e[33]=ee,e[34]=de):de=e[34];let xe;e[35]!==t?(xe=t("Adds a table, column, or index to lunora/schema.ts and reruns codegen."),e[35]=t,e[36]=xe):xe=e[36];let Te;e[37]!==xe?(Te=l(ze,{children:xe}),e[37]=xe,e[38]=Te):Te=e[38];let ve;e[39]!==de||e[40]!==Te?(ve=p(Be,{children:[de,Te]}),e[39]=de,e[40]=Te,e[41]=ve):ve=e[41];const h=a.length>0;let x;e[42]!==c||e[43]!==ue||e[44]!==h?(x=l(bt,{hasTables:h,mode:c,onAddColumn:be,onAddIndex:j,onAddTable:W,onDestructive:ue}),e[42]=c,e[43]=ue,e[44]=h,e[45]=x):x=e[45];let N;e[46]!==r||e[47]!==c||e[48]!==ge||e[49]!==t||e[50]!==i?(N=c==="addTable"&&p("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"sc-editor-table-form",children:[p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-table-name",children:t("Table name")}),l(ke,{"data-testid":"sc-editor-table-name",id:"sc-editor-table-name",onChange:ae,value:i})]}),l(ye,{"data-testid":"sc-editor-table-apply",disabled:r||i.trim()==="",onClick:ge,size:"xs",type:"button",children:t(r?"Applying…":"Apply")}),l(ye,{onClick:te,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[46]=r,e[47]=c,e[48]=ge,e[49]=t,e[50]=i,e[51]=N):N=e[51];let k;e[52]!==r||e[53]!==f||e[54]!==c||e[55]!==ce||e[56]!==t||e[57]!==a||e[58]!==y||e[59]!==S?(k=c==="addColumn"&&p("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"sc-editor-column-form",children:[p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-column-table",children:t("Table name")}),l("select",{className:"h-8 rounded-md border border-input bg-transparent px-2 text-xs","data-testid":"sc-editor-column-table",id:"sc-editor-column-table",onChange:Q,value:y,children:a.map(St)})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-column-name",children:t("Column name")}),l(ke,{"data-testid":"sc-editor-column-name",id:"sc-editor-column-name",onChange:ne,value:f})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-column-type",children:t("Column type")}),l("select",{className:"h-8 rounded-md border border-input bg-transparent px-2 text-xs","data-testid":"sc-editor-column-type",id:"sc-editor-column-type",onChange:fe,value:S,children:yt.map(wt)})]}),l("span",{className:"text-[11px] text-muted-foreground",children:t("Optional")}),l(ye,{"data-testid":"sc-editor-column-apply",disabled:r||f.trim()===""||y==="",onClick:ce,size:"xs",type:"button",children:t(r?"Applying…":"Apply")}),l(ye,{onClick:te,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[52]=r,e[53]=f,e[54]=c,e[55]=ce,e[56]=t,e[57]=a,e[58]=y,e[59]=S,e[60]=k):k=e[60];let I;e[61]!==r||e[62]!==T||e[63]!==$||e[64]!==c||e[65]!==J||e[66]!==t||e[67]!==a||e[68]!==y||e[69]!==A?(I=c==="addIndex"&&p("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"sc-editor-index-form",children:[p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-index-table",children:t("Table name")}),l("select",{className:"h-8 rounded-md border border-input bg-transparent px-2 text-xs","data-testid":"sc-editor-index-table",id:"sc-editor-index-table",onChange:Q,value:y,children:a.map(_t)})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-index-name",children:t("Index name")}),l(ke,{"data-testid":"sc-editor-index-name",id:"sc-editor-index-name",onChange:ie,value:$})]}),p("div",{className:"flex flex-col gap-1 text-xs",children:[l(Ee,{htmlFor:"sc-editor-index-fields",children:t("Index fields (comma-separated)")}),l(ke,{"data-testid":"sc-editor-index-fields",id:"sc-editor-index-fields",onChange:re,value:T})]}),p(Ee,{className:"flex items-center gap-1 text-xs",htmlFor:"sc-editor-index-unique",children:[l("input",{checked:A,"data-testid":"sc-editor-index-unique",id:"sc-editor-index-unique",onChange:P,type:"checkbox"}),l("span",{className:"text-muted-foreground",children:t("Unique")})]}),l(ye,{"data-testid":"sc-editor-index-apply",disabled:r||$.trim()===""||T.trim()==="",onClick:J,size:"xs",type:"button",children:t(r?"Applying…":"Apply")}),l(ye,{onClick:te,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[61]=r,e[62]=T,e[63]=$,e[64]=c,e[65]=J,e[66]=t,e[67]=a,e[68]=y,e[69]=A,e[70]=I):I=e[70];let he;e[71]!==b||e[72]!==o?(he=l(xt,{onOpenMigrations:b,result:o}),e[71]=b,e[72]=o,e[73]=he):he=e[73];let _e;e[74]!==x||e[75]!==N||e[76]!==k||e[77]!==I||e[78]!==he?(_e=p(De,{children:[x,N,k,I,he]}),e[74]=x,e[75]=N,e[76]=k,e[77]=I,e[78]=he,e[79]=_e):_e=e[79];let Ie;return e[80]!==ve||e[81]!==_e?(Ie=p(je,{"data-testid":"sc-editor",size:"sm",children:[ve,_e]}),e[80]=ve,e[81]=_e,e[82]=Ie):Ie=e[82],Ie};function St(n){return l("option",{value:n,children:n},n)}function wt(n){return l("option",{value:n.validator,children:n.label},n.validator)}function _t(n){return l("option",{value:n,children:n},n)}const He=[],Et=n=>{const e=we(5),{open:m}=n,a=m&&"rotate-90";let t;e[0]!==a?(t=Qe("size-3.5 shrink-0 text-muted-foreground transition-transform duration-150",a),e[0]=a,e[1]=t):t=e[1];let s;e[2]===Symbol.for("react.memo_cache_sentinel")?(s=l("path",{d:"m9 6 6 6-6 6"}),e[2]=s):s=e[2];let c;return e[3]!==t?(c=l("svg",{"aria-hidden":"true",className:t,fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.8,viewBox:"0 0 24 24",children:s}),e[3]=t,e[4]=c):c=e[4],c},Je=n=>{const e=we(20),{children:m,expanded:a,name:t,onToggle:s,rowCount:c,rowTestId:d,toggleTestId:r}=n;let g;e[0]!==a?(g=l(Et,{open:a}),e[0]=a,e[1]=g):g=e[1];let o;e[2]!==t?(o=l("span",{className:"truncate font-mono text-xs text-foreground",title:t,children:t}),e[2]=t,e[3]=o):o=e[3];let u;e[4]!==c?(u=p("span",{className:"ms-auto shrink-0 text-xs text-muted-foreground tabular-nums",children:["(",c,")"]}),e[4]=c,e[5]=u):u=e[5];let i;e[6]!==a||e[7]!==s||e[8]!==g||e[9]!==o||e[10]!==u||e[11]!==r?(i=p("button",{"aria-expanded":a,className:"flex w-full items-center gap-2 px-3 py-2 text-start transition-colors hover:bg-muted/50 aria-expanded:bg-muted/40","data-testid":r,onClick:s,type:"button",children:[g,o," ",u]}),e[6]=a,e[7]=s,e[8]=g,e[9]=o,e[10]=u,e[11]=r,e[12]=i):i=e[12];let v;e[13]!==m||e[14]!==a?(v=a&&l("div",{className:"px-3 pb-3 ps-8",children:m}),e[13]=m,e[14]=a,e[15]=v):v=e[15];let f;return e[16]!==d||e[17]!==i||e[18]!==v?(f=p("li",{className:"border-t border-border/60 first:border-t-0","data-testid":d,children:[i,v]}),e[16]=d,e[17]=i,e[18]=v,e[19]=f):f=e[19],f},We=n=>{const e=we(5),{columns:m,testId:a}=n;let t;e[0]!==m?(t=m.map(kt),e[0]=m,e[1]=t):t=e[1];let s;return e[2]!==t||e[3]!==a?(s=l("ul",{className:"flex flex-wrap gap-1.5 pt-1","data-testid":a,children:t}),e[2]=t,e[3]=a,e[4]=s):s=e[4],s},It=n=>{const e=we(10),{heading:m,indexes:a,testId:t}=n;let s;e[0]!==m?(s=l("p",{className:"mb-1.5 font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:m}),e[0]=m,e[1]=s):s=e[1];let c;e[2]!==a?(c=a.map(At),e[2]=a,e[3]=c):c=e[3];let d;e[4]!==c||e[5]!==t?(d=l("ul",{className:"flex flex-col gap-1","data-testid":t,children:c}),e[4]=c,e[5]=t,e[6]=d):d=e[6];let r;return e[7]!==s||e[8]!==d?(r=p("div",{className:"pt-3",children:[s,d]}),e[7]=s,e[8]=d,e[9]=r):r=e[9],r},Xe=n=>Qe("border-b-2 px-3 py-2 font-mono text-[11px] tracking-widest uppercase outline-none transition-colors",n?"border-foreground text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),Qt=n=>{const e=we(85),{initialShardKey:m,initialTable:a,schemaEditable:t}=n,s=Le();let c;e[0]!==m||e[1]!==a?(c={initialShardKey:m,initialTable:a},e[0]=m,e[1]=a,e[2]=c):c=e[2];const{columns:d,diagramTables:r,error:g,expanded:o,filteredGlobalTables:u,filteredTables:i,globalColumns:v,globalError:f,globalExpanded:L,globalTables:S,indexes:G,refresh:y,setShardKey:O,setTableFilter:$,setView:z,shardColumnsError:T,shardKey:C,tableFilter:A,tables:F,toggle:pe,toggleGlobal:te,view:E}=mt(c);let M;e[3]!==z?(M=()=>{z("list")},e[3]=z,e[4]=M):M=e[4];const w=M;let ge;e[5]!==z?(ge=()=>{z("graph")},e[5]=z,e[6]=ge):ge=e[6];const B=ge;let ce;e[7]!==$?(ce=b=>{$(b.target.value)},e[7]=$,e[8]=ce):ce=e[8];const le=ce;let J;e[9]!==y||e[10]!==C?(J=b=>{Ce(y(C))},e[9]=y,e[10]=C,e[11]=J):J=e[11];const Ne=J;let W;e[12]!==F?(W=F??[],e[12]=F,e[13]=W):W=e[13];let me;e[14]!==W?(me=W.map($t),e[14]=W,e[15]=me):me=e[15];const be=me;let D;e[16]!==O||e[17]!==C?(D=l(Ze,{onChange:O,testId:"sc-shard-input",value:C}),e[16]=O,e[17]=C,e[18]=D):D=e[18];let j;e[19]!==s?(j=s("Schema view"),e[19]=s,e[20]=j):j=e[20];const se=E==="graph",ue=E==="graph";let R;e[21]!==ue?(R=Xe(ue),e[21]=ue,e[22]=R):R=e[22];let ae;e[23]!==s?(ae=s("Graph"),e[23]=s,e[24]=ae):ae=e[24];let K;e[25]!==B||e[26]!==se||e[27]!==R||e[28]!==ae?(K=l("button",{"aria-selected":se,className:R,"data-testid":"sc-view-graph",onClick:B,role:"tab",type:"button",children:ae}),e[25]=B,e[26]=se,e[27]=R,e[28]=ae,e[29]=K):K=e[29];const ne=E==="list",oe=E==="list";let fe;e[30]!==oe?(fe=Xe(oe),e[30]=oe,e[31]=fe):fe=e[31];let X;e[32]!==s?(X=s("Table list"),e[32]=s,e[33]=X):X=e[33];let Q;e[34]!==w||e[35]!==ne||e[36]!==fe||e[37]!==X?(Q=l("button",{"aria-selected":ne,className:fe,"data-testid":"sc-view-list",onClick:w,role:"tab",type:"button",children:X}),e[34]=w,e[35]=ne,e[36]=fe,e[37]=X,e[38]=Q):Q=e[38];let U;e[39]!==K||e[40]!==Q||e[41]!==j?(U=p("div",{"aria-label":j,className:"flex items-center gap-1","data-testid":"sc-view-toggle",role:"tablist",children:[K,Q]}),e[39]=K,e[40]=Q,e[41]=j,e[42]=U):U=e[42];let ie;e[43]!==U||e[44]!==D?(ie=p("div",{className:"flex flex-wrap items-center gap-3",children:[D,U]}),e[43]=U,e[44]=D,e[45]=ie):ie=e[45];let V;e[46]!==Ne||e[47]!==t||e[48]!==be?(V=t===!0&&l(Tt,{onApplied:Ne,tableNames:be}),e[46]=Ne,e[47]=t,e[48]=be,e[49]=V):V=e[49];let re;e[50]!==le||e[51]!==s||e[52]!==A||e[53]!==E?(re=E==="list"&&l(ke,{"aria-label":s("Filter tables"),className:"h-8 max-w-xs","data-testid":"sc-filter",onChange:le,placeholder:s("Filter tables"),value:A}),e[50]=le,e[51]=s,e[52]=A,e[53]=E,e[54]=re):re=e[54];let Y;e[55]!==r||e[56]!==g||e[57]!==f||e[58]!==T||e[59]!==C||e[60]!==E?(Y=E==="graph"&&p("div",{className:"flex flex-col gap-2","data-testid":"sc-graph-view",children:[g!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-error",role:"alert",children:g}),f!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-global-error",role:"alert",children:f}),l(at,{columnsError:T[C]===!0,tables:r,testIdPrefix:"sc-graph"})]}),e[55]=r,e[56]=g,e[57]=f,e[58]=T,e[59]=C,e[60]=E,e[61]=Y):Y=e[61];let P;e[62]!==d||e[63]!==g||e[64]!==o||e[65]!==u||e[66]!==i||e[67]!==v||e[68]!==f||e[69]!==L||e[70]!==S||e[71]!==G||e[72]!==C||e[73]!==s||e[74]!==F||e[75]!==pe||e[76]!==te||e[77]!==E?(P=E==="list"&&p("div",{className:"flex flex-col gap-4",children:[p(je,{"data-testid":"sc-shard-section",size:"sm",children:[p(Be,{children:[p("div",{className:"flex items-center gap-2",children:[l(Ke,{tier:"shard"}),l(Ge,{children:s("Shard tables")}),F!==null&&l(Fe,{className:"ms-auto tabular-nums",variant:"outline",children:i.length})]}),l(ze,{children:Pe.shard.hint})]}),p(De,{children:[g!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-error",role:"alert",children:g}),F!==null&&F.length===0&&l("p",{className:"text-sm text-muted-foreground","data-testid":"sc-empty",children:s("No tables in this shard.")}),F!==null&&F.length>0&&i.length===0&&l("p",{className:"text-sm text-muted-foreground","data-testid":"sc-no-match",children:s("No tables match your filter.")}),i.length>0&&l("ul",{className:"-mx-3 overflow-hidden border-t border-border","data-testid":"sc-table-list",children:i.map(b=>{const ee=`${C}:${b.name}`,de=G[ee]??[];return p(Je,{expanded:o===b.name,name:b.name,onToggle:()=>{Ce(pe(b.name))},rowCount:b.rowCount,rowTestId:`sc-table-${b.name}`,toggleTestId:`sc-toggle-${b.name}`,children:[l(We,{columns:d[ee]??He,testId:`sc-columns-${b.name}`}),de.length>0&&l(It,{heading:s("Indexes"),indexes:de,testId:`sc-indexes-${b.name}`})]},b.name)})})]})]}),p(je,{"data-testid":"sc-global-section",size:"sm",children:[p(Be,{children:[p("div",{className:"flex items-center gap-2",children:[l(Ke,{tier:"global"}),l(Ge,{children:s("Global tables (D1)")}),S!==null&&l(Fe,{className:"ms-auto tabular-nums",variant:"outline",children:u.length})]}),l(ze,{children:Pe.global.hint})]}),p(De,{children:[f!==null&&l("p",{className:"text-sm text-destructive","data-testid":"sc-global-error",role:"alert",children:f}),S!==null&&S.length===0&&l(et,{description:Pe.global.hint,testId:"sc-global-empty",title:s("No global tables.")}),S!==null&&S.length>0&&u.length===0&&l("p",{className:"text-sm text-muted-foreground","data-testid":"sc-global-no-match",children:s("No tables match your filter.")}),u.length>0&&l("ul",{className:"-mx-3 overflow-hidden border-t border-border","data-testid":"sc-global-table-list",children:u.map(b=>l(Je,{expanded:L===b.name,name:b.name,onToggle:()=>{Ce(te(b.name))},rowCount:b.rowCount,rowTestId:`sc-global-table-${b.name}`,toggleTestId:`sc-global-toggle-${b.name}`,children:l(We,{columns:v[b.name]??He,testId:`sc-global-columns-${b.name}`})},b.name))})]})]})]}),e[62]=d,e[63]=g,e[64]=o,e[65]=u,e[66]=i,e[67]=v,e[68]=f,e[69]=L,e[70]=S,e[71]=G,e[72]=C,e[73]=s,e[74]=F,e[75]=pe,e[76]=te,e[77]=E,e[78]=P):P=e[78];let Z;return e[79]!==ie||e[80]!==V||e[81]!==re||e[82]!==Y||e[83]!==P?(Z=p("div",{className:"flex flex-col gap-4","data-testid":"lunora-schema",children:[ie,V,re,Y,P]}),e[79]=ie,e[80]=V,e[81]=re,e[82]=Y,e[83]=P,e[84]=Z):Z=e[84],Z};function kt(n){return l("li",{className:"rounded bg-muted px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground",children:n},n)}function At(n){return p("li",{className:"flex flex-wrap items-center gap-1.5 text-xs",children:[l("span",{className:"font-mono",children:n.name}),l(Fe,{variant:"outline",children:n.type}),n.unique===!0&&l(Fe,{variant:"secondary",children:"unique"}),l("span",{className:"text-muted-foreground",children:n.fields.join(", ")})]},`${n.type}:${n.name}`)}function $t(n){return n.name}export{Qt as SchemaViewer};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as F}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useNavigate as ge}from"@tanstack/react-router";import{Background as be,Controls as xe,ReactFlow as Ne,Handle as le,Position as oe}from"@xyflow/react";import{useState as re,useRef as ve}from"react";import{D as Ee}from"../packem_shared/diagram-export-panel-D5CVNJkp.mjs";import{B as me}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as ke,a as we}from"../packem_shared/card-By2O8ULa.mjs";import{E as ae}from"../packem_shared/empty-state-D7jEML_T.mjs";import{S as ie}from"../packem_shared/skeleton-DX1gfixl.mjs";import{b as U,e as $,T as Se,c as V,a as Ae,d as _e}from"../packem_shared/table-D0SBiDu-.mjs";import{u as ye}from"../packem_shared/use-admin-spec-Bir7V68L.mjs";import{useT as ne}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{f as Le}from"../packem_shared/internal-Df43vQI0.mjs";import{c as De}from"../packem_shared/utils-bhneXptQ.mjs";import{jsxs as x,jsx as o,Fragment as Ce}from"react/jsx-runtime";const he=["call","schedule","read","write","enqueue","publish","subscribe","start","trigger"],$e=new Set(["enqueue","publish","schedule","start","subscribe","trigger"]),ce={cron:1,function:2,http:0,queue:4,table:6,topic:3,workflow:5},Ie={stroke:"var(--muted-foreground)"},Te={fill:"var(--muted-foreground)",fontSize:10},Oe={fill:"var(--background)"},W="",X=260,Be=120,de=44,ee=40,ue=12,te=16,Ge=n=>{if(typeof n!="object"||n===null)return;const e=n;return["edges","nodes","modules","unresolved"].every(a=>Array.isArray(e[a]))?e:void 0},He={cron:()=>({to:"/schedule"}),function:()=>({to:"/functions"}),http:()=>({to:"/api"}),queue:()=>({to:"/queues"}),table:n=>({search:{table:n.name},to:"/data"}),topic:()=>({to:"/queues"}),workflow:()=>({to:"/workflows"})},Me=n=>He[n.kind](n),R=n=>n.module??W,Pe=(n,e,a)=>{const t=new Set;for(const r of n.nodes)(e===void 0||R(r)===e)&&t.add(r.id);if(e===void 0)return t;const l=new Set(t);for(const r of n.edges)a.has(r.kind)&&(t.has(r.from)&&l.add(r.to),t.has(r.to)&&l.add(r.from));return l},Re=(n,e,a,t)=>{const l=`lane:${n}`;return[{data:{label:e},id:l,position:{x:a*(X+Be),y:0},selectable:!1,style:{height:de+t.length*(ee+ue)+te,width:X},type:"lane"},...t.map((r,u)=>({className:"flex cursor-pointer items-center truncate rounded-md border border-border bg-card px-2 text-xs text-foreground hover:border-ring",data:{label:`${r.detail??r.kind} · ${r.name}`,link:Me(r)},extent:"parent",id:r.id,parentId:l,position:{x:te,y:de+u*(ee+ue)},style:{height:ee,width:X-te*2},type:"member"}))]},Fe=(n,e)=>{const a=Pe(n,e.lane,e.kinds),t=new Map;for(const s of n.nodes)a.has(s.id)&&t.set(R(s),[...t.get(R(s))??[],s]);const l=[...n.modules.map(s=>({label:s.installed===!0?`${s.name} · ${e.componentLabel}`:s.name,lane:s.name})),{label:e.appLaneLabel,lane:W}],r=[];let u=0;for(const{label:s,lane:f}of l){const d=(t.get(f)??[]).toSorted((c,b)=>ce[c.kind]-ce[b.kind]||c.name.localeCompare(b.name));d.length>0&&(r.push(...Re(f,s,u,d)),u+=1)}const h=[];for(const s of n.edges)e.kinds.has(s.kind)&&a.has(s.from)&&a.has(s.to)&&h.push({animated:$e.has(s.kind),id:`${s.from}|${s.kind}|${s.to}`,label:s.kind,labelBgStyle:Oe,labelStyle:Te,source:s.from,style:Ie,target:s.to,type:"smoothstep"});return{edges:h,nodes:r}},se="*",qe=n=>{const e=F(2),{data:a}=n,t=String(a.label);let l;return e[0]!==t?(l=o("div",{className:"size-full rounded-lg border border-dashed border-border bg-background/60 px-3 py-2 text-xs font-medium text-muted-foreground",children:t}),e[0]=t,e[1]=l):l=e[1],l},fe={opacity:0},je=n=>{const e=F(10),{data:a}=n,t=ge(),{label:l,link:r}=a;let u;e[0]!==r||e[1]!==t?(u=()=>{Le(t(r))},e[0]=r,e[1]=t,e[2]=u):u=e[2];const h=u;let s;e[3]===Symbol.for("react.memo_cache_sentinel")?(s=o(le,{isConnectable:!1,position:oe.Left,style:fe,type:"target"}),e[3]=s):s=e[3];let f;e[4]!==l||e[5]!==h?(f=o("button",{className:"size-full cursor-pointer truncate rounded-md text-left outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",onClick:h,type:"button",children:l}),e[4]=l,e[5]=h,e[6]=f):f=e[6];let d;e[7]===Symbol.for("react.memo_cache_sentinel")?(d=o(le,{isConnectable:!1,position:oe.Right,style:fe,type:"source"}),e[7]=d):d=e[7];let c;return e[8]!==f?(c=x(Ce,{children:[s,f,d]}),e[8]=f,e[9]=c):c=e[9],c},Ke={lane:qe,member:je},ze=n=>{const e=Ge(n);return e===void 0?{kind:"error",message:"the response is not an architecture manifest"}:e.modules.length===0?{kind:"empty"}:{kind:"ready",spec:e}},Ye=n=>{const e=F(54),{manifest:a}=n,t=ne();let l,r,u,h,s,f,d,c,b,i;if(e[0]!==a.modules||e[1]!==a.nodes||e[2]!==t){const P=new Map;for(const g of a.nodes)g.kind==="function"&&P.set(R(g),(P.get(R(g))??0)+1);const I=g=>P.get(g)??0;s=I(W),h=ke,i="overflow-hidden py-0",u=we,b="px-0",r=Se,d="architecture-catalog";let y;e[13]!==t?(y=t("Module"),e[13]=t,e[14]=y):y=e[14];let L;e[15]!==y?(L=o(V,{children:y}),e[15]=y,e[16]=L):L=e[16];let D;e[17]!==t?(D=t("Description"),e[17]=t,e[18]=D):D=e[18];let C;e[19]!==D?(C=o(V,{children:D}),e[19]=D,e[20]=C):C=e[20];let N;e[21]!==t?(N=t("Owned tables"),e[21]=t,e[22]=N):N=e[22];let v;e[23]!==N?(v=o(V,{children:N}),e[23]=N,e[24]=v):v=e[24];let E;e[25]!==t?(E=t("Functions"),e[25]=t,e[26]=E):E=e[26];let k;e[27]!==E?(k=o(V,{children:E}),e[27]=E,e[28]=k):k=e[28],e[29]!==v||e[30]!==k||e[31]!==L||e[32]!==C?(c=o(Ae,{children:x(U,{children:[L,C,v,k]})}),e[29]=v,e[30]=k,e[31]=L,e[32]=C,e[33]=c):c=e[33],l=_e,f=a.modules.map(g=>x(U,{"data-testid":`architecture-module-${g.name}`,children:[x($,{className:"font-mono text-xs",children:[g.name,g.installed===!0&&o(me,{className:"ml-2","data-testid":`architecture-component-${g.name}`,variant:"outline",children:t("Component")})]}),o($,{className:"text-xs text-muted-foreground",children:g.description??(g.installed===!0?t("Installed component"):"—")}),o($,{className:"font-mono text-xs text-muted-foreground",children:g.tables.length===0?"—":g.tables.join(", ")}),o($,{className:"text-xs",children:I(g.name)})]},g.name)),e[0]=a.modules,e[1]=a.nodes,e[2]=t,e[3]=l,e[4]=r,e[5]=u,e[6]=h,e[7]=s,e[8]=f,e[9]=d,e[10]=c,e[11]=b,e[12]=i}else l=e[3],r=e[4],u=e[5],h=e[6],s=e[7],f=e[8],d=e[9],c=e[10],b=e[11],i=e[12];let m;e[34]!==s||e[35]!==t?(m=s>0&&x(U,{"data-testid":"architecture-module-app",children:[o($,{className:"text-xs italic text-muted-foreground",children:t("Outside any module")}),o($,{className:"text-xs text-muted-foreground",children:"—"}),o($,{className:"text-xs text-muted-foreground",children:"—"}),o($,{className:"text-xs",children:s})]}),e[34]=s,e[35]=t,e[36]=m):m=e[36];let p;e[37]!==l||e[38]!==f||e[39]!==m?(p=x(l,{children:[f,m]}),e[37]=l,e[38]=f,e[39]=m,e[40]=p):p=e[40];let S;e[41]!==r||e[42]!==d||e[43]!==c||e[44]!==p?(S=x(r,{"data-testid":d,children:[c,p]}),e[41]=r,e[42]=d,e[43]=c,e[44]=p,e[45]=S):S=e[45];let A;e[46]!==u||e[47]!==b||e[48]!==S?(A=o(u,{className:b,children:S}),e[46]=u,e[47]=b,e[48]=S,e[49]=A):A=e[49];let _;return e[50]!==h||e[51]!==i||e[52]!==A?(_=o(h,{className:i,children:A}),e[50]=h,e[51]=i,e[52]=A,e[53]=_):_=e[53],_},Ve=n=>{const e=F(52),{manifest:a}=n,t=ne(),[l,r]=re(se),[u,h]=re(We);let s;e[0]!==a.edges?(s=w=>a.edges.some(J=>J.kind===w),e[0]=a.edges,e[1]=s):s=e[1];const f=he.filter(s);let d;e[2]!==t?(d=t("Outside any module"),e[2]=t,e[3]=d):d=e[3];const c=d;let b;e[4]!==t?(b=t("Component"),e[4]=t,e[5]=b):b=e[5];const i=b;let m;e[6]!==c||e[7]!==i||e[8]!==u||e[9]!==l||e[10]!==a?(m=Fe(a,{appLaneLabel:c,componentLabel:i,kinds:u,...l===se?{}:{lane:l}}),e[6]=c,e[7]=i,e[8]=u,e[9]=l,e[10]=a,e[11]=m):m=e[11];const{edges:p,nodes:S}=m,A=ve(null);let _;e[12]===Symbol.for("react.memo_cache_sentinel")?(_=w=>{r(w.target.value)},e[12]=_):_=e[12];const P=_;let I;e[13]===Symbol.for("react.memo_cache_sentinel")?(I=w=>{h(J=>{const Q=new Set(J);return Q.delete(w)||Q.add(w),Q})},e[13]=I):I=e[13];const y=I,L="flex flex-col gap-2",D="architecture-diagram",C="flex flex-wrap items-center gap-2";let N;e[14]!==t?(N=t("Module"),e[14]=t,e[15]=N):N=e[15];let v;e[16]!==t?(v=t("All modules"),e[16]=t,e[17]=v):v=e[17];let E;e[18]!==v?(E=o("option",{value:se,children:v}),e[18]=v,e[19]=E):E=e[19];let k;e[20]!==a.modules?(k=a.modules.map(Ze),e[20]=a.modules,e[21]=k):k=e[21];let g;e[22]!==t?(g=t("Outside any module"),e[22]=t,e[23]=g):g=e[23];let T;e[24]!==g?(T=o("option",{value:W,children:g}),e[24]=g,e[25]=T):T=e[25];let O;e[26]!==l||e[27]!==N||e[28]!==E||e[29]!==k||e[30]!==T?(O=x("select",{"aria-label":N,className:"h-8 rounded-md border border-input bg-transparent px-2.5 py-1 text-xs outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50","data-testid":"architecture-module-filter",onChange:P,value:l,children:[E,k,T]}),e[26]=l,e[27]=N,e[28]=E,e[29]=k,e[30]=T,e[31]=O):O=e[31];let B;e[32]!==p.length||e[33]!==t?(B=t("{count} edges shown",{count:p.length}),e[32]=p.length,e[33]=t,e[34]=B):B=e[34];let G;e[35]!==B?(G=o("span",{className:"text-xs text-muted-foreground","data-testid":"architecture-edge-count",children:B}),e[35]=B,e[36]=G):G=e[36];let q;e[37]!==u?(q=w=>o("button",{"aria-pressed":u.has(w),className:De("rounded-full border border-border px-2.5 py-0.5 text-xs",u.has(w)?"bg-muted":"text-muted-foreground line-through"),"data-testid":`architecture-kind-${w}`,onClick:()=>{y(w)},type:"button",children:w},w),e[37]=u,e[38]=q):q=e[38];const Z=f.map(q);let H;e[39]!==O||e[40]!==G||e[41]!==Z?(H=x("div",{className:C,children:[O,G,Z]}),e[39]=O,e[40]=G,e[41]=Z,e[42]=H):H=e[42];let j,K,z;e[43]===Symbol.for("react.memo_cache_sentinel")?(j=o(be,{}),K=o(xe,{showInteractive:!1}),z=o(Ee,{containerRef:A,filenameBase:"architecture",testIdPrefix:"architecture"}),e[43]=j,e[44]=K,e[45]=z):(j=e[43],K=e[44],z=e[45]);let M;e[46]!==p||e[47]!==S?(M=o("div",{className:"h-[600px] w-full overflow-hidden border border-border bg-muted/20","data-testid":"architecture-canvas",ref:A,children:x(Ne,{edges:p,edgesFocusable:!1,fitView:!0,minZoom:.1,nodes:S,nodesConnectable:!1,nodesDraggable:!1,nodeTypes:Ke,children:[j,K,z]})}),e[46]=p,e[47]=S,e[48]=M):M=e[48];let Y;return e[49]!==H||e[50]!==M?(Y=x("section",{className:L,"data-testid":D,children:[H,M]}),e[49]=H,e[50]=M,e[51]=Y):Y=e[51],Y},mt=n=>{const e=F(28),{manifest:a}=n,t=ne(),l=pe();let r;e[0]!==l?(r=()=>l.fetchArchitecture(),e[0]=l,e[1]=r):r=e[1];const h=ye(a,r,ze);if(h.kind==="loading"){let i;return e[2]===Symbol.for("react.memo_cache_sentinel")?(i=x("div",{className:"flex flex-col gap-4","data-testid":"architecture-loading",children:[o(ie,{className:"h-8 w-48"}),o(ie,{className:"h-64 w-full"})]}),e[2]=i):i=e[2],i}if(h.kind==="error"){let i;e[3]!==h.message||e[4]!==t?(i=t("Couldn't load the architecture manifest: {message}",{message:h.message}),e[3]=h.message,e[4]=t,e[5]=i):i=e[5];let m;e[6]!==t?(m=t("Architecture unavailable"),e[6]=t,e[7]=m):m=e[7];let p;return e[8]!==i||e[9]!==m?(p=o(ae,{description:i,testId:"architecture-error",title:m}),e[8]=i,e[9]=m,e[10]=p):p=e[10],p}if(h.kind==="empty"){let i;e[11]!==t?(i=t("Add a lunora/<folder>/module.ts that default-exports defineModule(...) and run lunora codegen to map your modules here. Installed components join the map once you declare one."),e[11]=t,e[12]=i):i=e[12];let m;e[13]!==t?(m=t("No modules declared"),e[13]=t,e[14]=m):m=e[14];let p;return e[15]!==i||e[16]!==m?(p=o(ae,{description:i,testId:"architecture-empty",title:m}),e[15]=i,e[16]=m,e[17]=p):p=e[17],p}const{spec:s}=h;let f,d;e[18]!==s?(f=o(Ye,{manifest:s}),d=o(Ve,{manifest:s}),e[18]=s,e[19]=f,e[20]=d):(f=e[19],d=e[20]);let c;e[21]!==s.unresolved||e[22]!==t?(c=s.unresolved.length>0&&x("details",{className:"text-sm","data-testid":"architecture-unresolved",children:[x("summary",{className:"cursor-pointer text-muted-foreground",children:[t("{count} call sites could not be drawn",{count:s.unresolved.length})," ",o(me,{variant:"outline",children:s.unresolved.length})]}),o("ul",{className:"mt-2 flex flex-col gap-1 font-mono text-xs",children:s.unresolved.map(Je)})]}),e[21]=s.unresolved,e[22]=t,e[23]=c):c=e[23];let b;return e[24]!==f||e[25]!==d||e[26]!==c?(b=x("div",{className:"flex flex-col gap-6","data-testid":"architecture-panel",children:[f,d,c]}),e[24]=f,e[25]=d,e[26]=c,e[27]=b):b=e[27],b};function We(){return new Set(he)}function Ze(n){return o("option",{value:n.name,children:n.name},n.name)}function Je(n){return x("li",{children:[n.file,":",n.line," · ",n.kind," · ",n.reason]},`${n.file}:${String(n.line)}:${n.kind}:${n.reason}`)}export{mt as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useLunora as ee}from"@lunora/react";import{useState as Z,useReducer as le,useEffect as ae}from"react";import{C as ve,a as fe}from"../packem_shared/card-By2O8ULa.mjs";import{E as Ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as pe,a as he,b as X,c as q,d as ye,e as Q}from"../packem_shared/table-D0SBiDu-.mjs";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{f as H,b as R,m as Fe,g as se}from"../packem_shared/internal-Df43vQI0.mjs";import{B as P}from"../packem_shared/button-q0UYSmrn.mjs";import{C as ne}from"../packem_shared/checkbox-CnS9cyCz.mjs";import{I as re}from"../packem_shared/input-CXhxesPC.mjs";import{b as ie,c as de,d as oe,e as ce}from"../packem_shared/studio-CwC7cOyC.mjs";import{c as te}from"react/compiler-runtime";import{L as W}from"../packem_shared/label-DKFzyHq6.mjs";import{T as ke}from"../packem_shared/textarea--40GKAyz.mjs";import{c as Ke,S as Ve,a as Ie,b as _e,d as Me}from"../packem_shared/select-DPyS18Vy.mjs";import{jsx as r,jsxs as w,Fragment as be}from"react/jsx-runtime";import{B as Le}from"../packem_shared/badge-r_5B4LHP.mjs";const Be=l=>{const e=l.trim();if(e==="")return;const s=Number(e);return Number.isFinite(s)&&s>0?Math.floor(s):void 0},Oe=l=>l===void 0?"—":new Date(l*1e3).toISOString(),Ae=l=>new TextEncoder().encode(l).length,ge=l=>{if(l.trim()!=="")try{return JSON.stringify(JSON.parse(l),void 0,2)}catch{return}},xe=l=>{if(l.trim()==="")return!0;try{return JSON.parse(l),!0}catch{return!1}},Ne=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ue=(l,e)=>{const s=l.trim();if(s==="")return"";const c=Number(s),i=Ne.find(v=>v.key===e)?.seconds??1;return Number.isFinite(c)&&c>0?String(Math.round(c*i)):s},Ce=l=>{const e=l.trim();if(e==="")return!0;const s=Number(e);return Number.isInteger(s)&&s>=60},Se=(l,e,s,c)=>{const i=Be(l.ttl);return{expiration:i===void 0?c:void 0,expirationTtl:i,key:e,metadata:l.metadata.trim()===""?void 0:JSON.parse(l.metadata),namespace:s,value:l.value}},we=l=>{const e=te(60),{helper:s,id:c,invalid:i,onChange:v,testId:d}=l,t=G(),[a,f]=Z(""),[o,g]=Z("seconds");let k;e[0]!==v||e[1]!==o?(k=b=>{f(b.target.value),v(ue(b.target.value,o))},e[0]=v,e[1]=o,e[2]=k):k=e[2];const L=k;let K;e[3]!==a||e[4]!==v?(K=b=>{b!==null&&(g(b),v(ue(a,b)))},e[3]=a,e[4]=v,e[5]=K):K=e[5];const V=K;let p;e[6]!==t?(p=t("days"),e[6]=t,e[7]=p):p=e[7];let m;e[8]!==t?(m=t("hours"),e[8]=t,e[9]=m):m=e[9];let h;e[10]!==t?(h=t("minutes"),e[10]=t,e[11]=h):h=e[11];let x;e[12]!==t?(x=t("seconds"),e[12]=t,e[13]=x):x=e[13];let N;e[14]!==p||e[15]!==m||e[16]!==h||e[17]!==x?(N={days:p,hours:m,minutes:h,seconds:x},e[14]=p,e[15]=m,e[16]=h,e[17]=x,e[18]=N):N=e[18];const C=N;let y;e[19]!==t?(y=t("Expires after"),e[19]=t,e[20]=y):y=e[20];let S;e[21]!==c||e[22]!==y?(S=r(W,{className:"text-xs",htmlFor:c,children:y}),e[21]=c,e[22]=y,e[23]=S):S=e[23];let F;e[24]!==t?(F=t("No expiration"),e[24]=t,e[25]=F):F=e[25];let O;e[26]!==a||e[27]!==c||e[28]!==i||e[29]!==L||e[30]!==F||e[31]!==d?(O=r(re,{"aria-invalid":i,className:"flex-1","data-testid":d,id:c,inputMode:"numeric",onChange:L,placeholder:F,value:a}),e[26]=a,e[27]=c,e[28]=i,e[29]=L,e[30]=F,e[31]=d,e[32]=O):O=e[32];let I;e[33]!==t?(I=t("TTL unit"),e[33]=t,e[34]=I):I=e[34];const D=`${d}-unit`;let A;e[35]===Symbol.for("react.memo_cache_sentinel")?(A=r(Ve,{}),e[35]=A):A=e[35];let _;e[36]!==I||e[37]!==D?(_=r(Ie,{"aria-label":I,className:"w-[7.5rem]","data-testid":D,children:A}),e[36]=I,e[37]=D,e[38]=_):_=e[38];let n;e[39]!==C?(n=Ne.map(b=>r(Ke,{value:b.key,children:C[b.key]},b.key)),e[39]=C,e[40]=n):n=e[40];let u;e[41]!==n?(u=r(_e,{children:n}),e[41]=n,e[42]=u):u=e[42];let T;e[43]!==V||e[44]!==_||e[45]!==u||e[46]!==o?(T=w(Me,{onValueChange:V,value:o,children:[_,u]}),e[43]=V,e[44]=_,e[45]=u,e[46]=o,e[47]=T):T=e[47];let M;e[48]!==O||e[49]!==T?(M=w("div",{className:"flex gap-2",children:[O,T]}),e[48]=O,e[49]=T,e[50]=M):M=e[50];let E;e[51]!==s||e[52]!==i||e[53]!==t||e[54]!==d?(E=i?r("p",{className:"text-xs text-destructive","data-testid":`${d}-invalid`,children:t("TTL must be at least 60 seconds.")}):s!==void 0&&r("p",{className:"text-xs text-muted-foreground",children:s}),e[51]=s,e[52]=i,e[53]=t,e[54]=d,e[55]=E):E=e[55];let B;return e[56]!==M||e[57]!==E||e[58]!==S?(B=w("div",{className:"mb-3 grid gap-1",children:[S,M,E]}),e[56]=M,e[57]=E,e[58]=S,e[59]=B):B=e[59],B},Te=l=>{const e=te(36),{id:s,invalidTestId:c,onChange:i,testId:v,valid:d,value:t}=l,a=G();let f;e[0]!==t?(f=ge(t),e[0]=t,e[1]=f):f=e[1];const o=f;let g;e[2]!==a?(g=a("Metadata (JSON)"),e[2]=a,e[3]=g):g=e[3];let k;e[4]!==s||e[5]!==g?(k=r(W,{className:"text-xs",htmlFor:s,children:g}),e[4]=s,e[5]=g,e[6]=k):k=e[6];const L=`${v}-format`,K=o===void 0;let V;e[7]!==o||e[8]!==i?(V=()=>{o!==void 0&&i(o)},e[7]=o,e[8]=i,e[9]=V):V=e[9];let p;e[10]!==a?(p=a("Format JSON"),e[10]=a,e[11]=p):p=e[11];let m;e[12]!==L||e[13]!==K||e[14]!==V||e[15]!==p?(m=r(P,{"data-testid":L,disabled:K,onClick:V,size:"sm",variant:"outline",children:p}),e[12]=L,e[13]=K,e[14]=V,e[15]=p,e[16]=m):m=e[16];let h;e[17]!==k||e[18]!==m?(h=w("div",{className:"flex items-center justify-between gap-2",children:[k,m]}),e[17]=k,e[18]=m,e[19]=h):h=e[19];const x=!d;let N;e[20]!==i?(N=F=>{i(F.target.value)},e[20]=i,e[21]=N):N=e[21];let C;e[22]!==s||e[23]!==x||e[24]!==N||e[25]!==v||e[26]!==t?(C=r(ke,{"aria-invalid":x,className:"min-h-[4rem] font-mono text-xs","data-testid":v,id:s,onChange:N,value:t}),e[22]=s,e[23]=x,e[24]=N,e[25]=v,e[26]=t,e[27]=C):C=e[27];let y;e[28]!==c||e[29]!==a||e[30]!==d?(y=!d&&r("p",{className:"text-xs text-destructive","data-testid":c,children:a("Metadata must be valid JSON.")}),e[28]=c,e[29]=a,e[30]=d,e[31]=y):y=e[31];let S;return e[32]!==C||e[33]!==y||e[34]!==h?(S=w("div",{className:"mb-3 grid gap-1",children:[h,C,y]}),e[32]=C,e[33]=y,e[34]=h,e[35]=S):S=e[35],S},De={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Je=(l,e)=>{switch(e.type){case"setField":return{...l,[e.field]:e.value};case"submitFailed":return{...l,busy:!1,error:e.error};case"submitStart":return{...l,busy:!0,error:null};default:return l}},Pe=l=>{const e=te(73),{namespace:s,onCancel:c,onCreated:i}=l,v=ee(),d=G(),[t,a]=le(Je,De);let f;e[0]!==t.metadata?(f=xe(t.metadata),e[0]=t.metadata,e[1]=f):f=e[1];const o=f;let g;e[2]!==t.ttl?(g=Ce(t.ttl),e[2]=t.ttl,e[3]=g):g=e[3];const k=g;let L;e[4]!==o||e[5]!==t.busy||e[6]!==t.name||e[7]!==k?(L=t.name.trim()!==""&&o&&k&&!t.busy,e[4]=o,e[5]=t.busy,e[6]=t.name,e[7]=k,e[8]=L):L=e[8];const K=L;let V;e[9]!==K||e[10]!==v||e[11]!==s||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(V=()=>{K&&(a({type:"submitStart"}),H((async()=>{try{await v.putKvValue(Se({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,s)),i()}catch($){a({error:R($),type:"submitFailed"})}})()))},e[9]=K,e[10]=v,e[11]=s,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=V):V=e[17];const p=V;let m;e[18]!==d?(m=d("Key name"),e[18]=d,e[19]=m):m=e[19];let h;e[20]!==m?(h=r(W,{className:"text-xs",htmlFor:"kv-create-name",children:m}),e[20]=m,e[21]=h):h=e[21];let x;e[22]===Symbol.for("react.memo_cache_sentinel")?(x=$=>{a({field:"name",type:"setField",value:$.target.value})},e[22]=x):x=e[22];let N;e[23]!==d?(N=d("Key name"),e[23]=d,e[24]=N):N=e[24];let C;e[25]!==t.name||e[26]!==N?(C=r(re,{autoFocus:!0,"data-testid":"kv-create-name",id:"kv-create-name",onChange:x,placeholder:N,value:t.name}),e[25]=t.name,e[26]=N,e[27]=C):C=e[27];let y;e[28]!==h||e[29]!==C?(y=w("div",{className:"grid gap-1",children:[h,C]}),e[28]=h,e[29]=C,e[30]=y):y=e[30];let S;e[31]!==d?(S=d("Value"),e[31]=d,e[32]=S):S=e[32];let F;e[33]!==S?(F=r(W,{className:"text-xs",htmlFor:"kv-create-value",children:S}),e[33]=S,e[34]=F):F=e[34];let O;e[35]===Symbol.for("react.memo_cache_sentinel")?(O=$=>{a({field:"value",type:"setField",value:$.target.value})},e[35]=O):O=e[35];let I;e[36]!==t.value?(I=r(ke,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:O,value:t.value}),e[36]=t.value,e[37]=I):I=e[37];let D;e[38]!==F||e[39]!==I?(D=w("div",{className:"grid gap-1",children:[F,I]}),e[38]=F,e[39]=I,e[40]=D):D=e[40];const A=!k;let _;e[41]===Symbol.for("react.memo_cache_sentinel")?(_=$=>{a({field:"ttl",type:"setField",value:$})},e[41]=_):_=e[41];let n;e[42]!==A?(n=r(we,{id:"kv-create-ttl",invalid:A,onChange:_,testId:"kv-create-ttl"}),e[42]=A,e[43]=n):n=e[43];let u;e[44]===Symbol.for("react.memo_cache_sentinel")?(u=$=>{a({field:"metadata",type:"setField",value:$})},e[44]=u):u=e[44];let T;e[45]!==o||e[46]!==t.metadata?(T=r(Te,{id:"kv-create-metadata",invalidTestId:"kv-create-metadata-invalid",onChange:u,testId:"kv-create-metadata",valid:o,value:t.metadata}),e[45]=o,e[46]=t.metadata,e[47]=T):T=e[47];const M=!K;let E;e[48]!==t.busy||e[49]!==d?(E=t.busy?d("Creating…"):d("Create key"),e[48]=t.busy,e[49]=d,e[50]=E):E=e[50];let B;e[51]!==p||e[52]!==M||e[53]!==E?(B=r(P,{"data-testid":"kv-create-submit",disabled:M,onClick:p,children:E}),e[51]=p,e[52]=M,e[53]=E,e[54]=B):B=e[54];const b=t.busy;let J;e[55]!==d?(J=d("Cancel"),e[55]=d,e[56]=J):J=e[56];let j;e[57]!==c||e[58]!==t.busy||e[59]!==J?(j=r(P,{"data-testid":"kv-create-cancel",disabled:b,onClick:c,variant:"outline",children:J}),e[57]=c,e[58]=t.busy,e[59]=J,e[60]=j):j=e[60];let z;e[61]!==B||e[62]!==j?(z=w("div",{className:"flex flex-wrap gap-2",children:[B,j]}),e[61]=B,e[62]=j,e[63]=z):z=e[63];let U;e[64]!==t.error?(U=t.error!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-create-error",role:"alert",children:t.error}),e[64]=t.error,e[65]=U):U=e[65];let Y;return e[66]!==y||e[67]!==D||e[68]!==n||e[69]!==T||e[70]!==z||e[71]!==U?(Y=w("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[y,D,n,T,z,U]}),e[66]=y,e[67]=D,e[68]=n,e[69]=T,e[70]=z,e[71]=U,e[72]=Y):Y=e[72],Y},$e={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},je=(l,e)=>{switch(e.type){case"deleteStart":return{...l,busy:"deleting",writeError:null};case"editMetadata":return{...l,editedMetadata:e.value};case"editTtl":return{...l,editedTtl:e.value};case"editValue":return{...l,editedValue:e.value};case"loaded":return{...l,editedMetadata:e.metadata===null||e.metadata===void 0?"":JSON.stringify(e.metadata,null,2),editedValue:e.value??"",loading:!1,value:e.value};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"saveOk":return{...l,busy:"",value:l.editedValue};case"saveStart":return{...l,busy:"saving",writeError:null};case"writeFailed":return{...l,busy:"",writeError:e.error};default:return l}},He=l=>{const e=te(67),{expiration:s,keyName:c,namespace:i,onDeleted:v}=l,d=ee(),t=G(),[a,f]=le(je,$e);let o,g;e[0]!==d||e[1]!==c||e[2]!==i?(o=()=>{const b={cancelled:!1};return H((async()=>{try{const J=await d.getKvValue({key:c,namespace:i});b.cancelled||f({metadata:J.metadata,type:"loaded",value:J.value})}catch(J){const j=J;b.cancelled||f({error:R(j),type:"loadFailed"})}})()),()=>{b.cancelled=!0}},g=[d,i,c],e[0]=d,e[1]=c,e[2]=i,e[3]=o,e[4]=g):(o=e[3],g=e[4]),ae(o,g);let k;e[5]===Symbol.for("react.memo_cache_sentinel")?(k=b=>{f({type:"editValue",value:b.target.value})},e[5]=k):k=e[5];const L=k;let K;e[6]===Symbol.for("react.memo_cache_sentinel")?(K=b=>{f({type:"editMetadata",value:b})},e[6]=K):K=e[6];const V=K;let p;e[7]!==a.editedValue?(p=ge(a.editedValue),e[7]=a.editedValue,e[8]=p):p=e[8];const m=p;let h;e[9]!==a.editedMetadata?(h=xe(a.editedMetadata),e[9]=a.editedMetadata,e[10]=h):h=e[10];const x=h;let N;e[11]!==a.editedTtl?(N=Ce(a.editedTtl),e[11]=a.editedTtl,e[12]=N):N=e[12];const C=N;let y;e[13]!==m?(y=()=>{m!==void 0&&f({type:"editValue",value:m})},e[13]=m,e[14]=y):y=e[14];const S=y;let F;e[15]!==d||e[16]!==s||e[17]!==c||e[18]!==x||e[19]!==i||e[20]!==a.editedMetadata||e[21]!==a.editedTtl||e[22]!==a.editedValue||e[23]!==t?(F=()=>{if(!x){f({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}f({type:"saveStart"}),H((async()=>{try{await d.putKvValue(Se({metadata:a.editedMetadata,ttl:a.editedTtl,value:a.editedValue},c,i,s)),f({type:"saveOk"})}catch(b){f({error:R(b),type:"writeFailed"})}})())},e[15]=d,e[16]=s,e[17]=c,e[18]=x,e[19]=i,e[20]=a.editedMetadata,e[21]=a.editedTtl,e[22]=a.editedValue,e[23]=t,e[24]=F):F=e[24];const O=F;let I;e[25]!==d||e[26]!==c||e[27]!==i||e[28]!==v?(I=()=>{f({type:"deleteStart"}),H((async()=>{try{await d.deleteKvKey({key:c,namespace:i}),v(c)}catch(b){f({error:R(b),type:"writeFailed"})}})())},e[25]=d,e[26]=c,e[27]=i,e[28]=v,e[29]=I):I=e[29];const D=I;let A;e[30]!==c?(A=()=>{se(c)},e[30]=c,e[31]=A):A=e[31];let _;e[32]!==t?(_=t("Copy key"),e[32]=t,e[33]=_):_=e[33];let n;e[34]!==A||e[35]!==_?(n=r("div",{className:"mb-2 flex justify-end",children:r(P,{"data-testid":"kv-copy-key-btn",onClick:A,size:"sm",variant:"outline",children:_})}),e[34]=A,e[35]=_,e[36]=n):n=e[36];let u;e[37]!==a.loadError?(u=a.loadError!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:a.loadError}),e[37]=a.loadError,e[38]=u):u=e[38];let T;e[39]!==a.loading||e[40]!==t?(T=a.loading&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=a.loading,e[40]=t,e[41]=T):T=e[41];let M;e[42]!==m||e[43]!==x||e[44]!==D||e[45]!==S||e[46]!==O||e[47]!==a.busy||e[48]!==a.editedMetadata||e[49]!==a.editedValue||e[50]!==a.loading||e[51]!==a.value||e[52]!==a.writeError||e[53]!==t||e[54]!==C?(M=!a.loading&&a.value!==null&&w(be,{children:[w("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[r(W,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),m!==void 0&&r(Le,{variant:"secondary",children:t("JSON")}),r("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Fe(Ae(a.editedValue))})]}),r("textarea",{"aria-label":t("KV value"),className:"mb-2 min-h-[8rem] w-full rounded border border-border bg-muted/30 p-2 font-mono text-xs","data-testid":"kv-value-editor",id:"kv-value-editor",onChange:L,value:a.editedValue}),w("div",{className:"mb-3 flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-format-btn",disabled:m===void 0,onClick:S,size:"sm",variant:"outline",children:t("Format JSON")}),r(P,{"data-testid":"kv-copy-value-btn",onClick:()=>{se(a.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),r(we,{helper:t("Leave blank to keep the current expiration."),id:"kv-ttl-input",invalid:!C,onChange:b=>{f({type:"editTtl",value:b})},testId:"kv-ttl-input"}),r(Te,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:V,testId:"kv-metadata-editor",valid:x,value:a.editedMetadata}),w("div",{className:"flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-save-btn",disabled:a.busy!==""||!x||!C,onClick:O,children:a.busy==="saving"?t("Saving…"):t("Save")}),r(P,{"data-testid":"kv-delete-btn",disabled:a.busy!=="",onClick:D,variant:"destructive",children:a.busy==="deleting"?t("Deleting…"):t("Delete")})]}),a.writeError!==null&&r("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:a.writeError})]}),e[42]=m,e[43]=x,e[44]=D,e[45]=S,e[46]=O,e[47]=a.busy,e[48]=a.editedMetadata,e[49]=a.editedValue,e[50]=a.loading,e[51]=a.value,e[52]=a.writeError,e[53]=t,e[54]=C,e[55]=M):M=e[55];let E;e[56]!==a.loadError||e[57]!==a.loading||e[58]!==a.value||e[59]!==t?(E=!a.loading&&a.value===null&&a.loadError===null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-absent",children:t("Key is absent or has no value.")}),e[56]=a.loadError,e[57]=a.loading,e[58]=a.value,e[59]=t,e[60]=E):E=e[60];let B;return e[61]!==n||e[62]!==u||e[63]!==T||e[64]!==M||e[65]!==E?(B=w("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[n,u,T,M,E]}),e[61]=n,e[62]=u,e[63]=T,e[64]=M,e[65]=E,e[66]=B):B=e[66],B},me=100,Re={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},ze=(l,e)=>{switch(e.type){case"appendPage":return e.generation!==l.reloadNonce?l:{...l,cursor:e.cursor,keys:[...l.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...l,appliedPrefix:l.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,reloadNonce:l.reloadNonce+1,selectedKey:null};case"bulkDeleted":{const s=new Set(e.deleted);return{...l,bulk:l.bulk.filter(c=>!s.has(c)),bulkBusy:!1,bulkError:e.error,keys:l.keys===null?null:l.keys.filter(c=>!s.has(c.name)),selectedKey:l.selectedKey!==null&&s.has(l.selectedKey)?null:l.selectedKey}}case"bulkDeleteStart":return{...l,bulkBusy:!0,bulkError:null};case"firstPage":return{...l,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...l,bulk:l.bulk.filter(s=>s!==e.name),keys:l.keys===null?null:l.keys.filter(s=>s.name!==e.name),selectedKey:null};case"loadFailed":return e.generation!==void 0&&e.generation!==l.reloadNonce?l:{...l,loadError:e.error,loading:!1};case"loadStart":return{...l,loadError:null,loading:!0};case"prefixInput":return{...l,prefixInput:e.value};case"reload":return{...l,bulk:[],bulkError:null,reloadNonce:l.reloadNonce+1,selectedKey:null};case"selectKey":return{...l,selectedKey:e.name};case"toggleAllBulk":return{...l,bulk:e.names};case"toggleBulk":return{...l,bulk:l.bulk.includes(e.name)?l.bulk.filter(s=>s!==e.name):[...l.bulk,e.name]};default:return l}},Ue=({namespace:l})=>{const e=ee(),s=G(),[c,i]=le(ze,Re),{appliedPrefix:v,bulk:d,bulkBusy:t,bulkError:a,cursor:f,keys:o,listComplete:g,loadError:k,loading:L,prefixInput:K,reloadNonce:V,selectedKey:p}=c,[m,h]=Z(!1);ae(()=>{const n={cancelled:!1};return H((async()=>{i({type:"loadStart"});try{const u=await e.listKvKeys({limit:me,namespace:l,prefix:v===""?void 0:v});n.cancelled||i({cursor:u.cursor??null,keys:u.keys,listComplete:u.listComplete,type:"firstPage"})}catch(u){n.cancelled||i({error:R(u),type:"loadFailed"})}})()),()=>{n.cancelled=!0}},[e,l,v,V]);const x=n=>{i({type:"prefixInput",value:n.target.value})},N=()=>{i({type:"applyFilter"})},C=n=>{i({name:n.currentTarget.dataset.key??null,type:"selectKey"})},y=()=>{if(f===null)return;i({type:"loadStart"});const n=V;H((async()=>{try{const u=await e.listKvKeys({cursor:f,limit:me,namespace:l,prefix:v===""?void 0:v});i({cursor:u.cursor??null,generation:n,keys:u.keys,listComplete:u.listComplete,type:"appendPage"})}catch(u){i({error:R(u),generation:n,type:"loadFailed"})}})())},S=n=>{i({name:n,type:"keyDeleted"})},F=n=>{i({name:n,type:"toggleBulk"})},O=n=>{i({names:n&&o!==null?o.map(u=>u.name):[],type:"toggleAllBulk"})},I=()=>{if(d.length===0)return;const n=[...d];i({type:"bulkDeleteStart"}),H((async()=>{const u=await Promise.allSettled(n.map(E=>e.deleteKvKey({key:E,namespace:l}))),T=n.filter((E,B)=>u[B]?.status==="fulfilled"),M=n.length-T.length;i({deleted:T,error:M>0?s("Failed to delete {count} keys.",{count:M}):null,type:"bulkDeleted"})})())},D=()=>{h(!1),i({type:"reload"})},A=o!==null&&o.length>0&&d.length===o.length,_=new Set(d);return w(be,{children:[w("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[w("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[r(re,{"aria-label":s("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:x,placeholder:s("Filter by prefix…"),value:K}),r(P,{"data-testid":"kv-filter-btn",disabled:L,onClick:N,children:s("Filter")}),r(P,{"data-testid":"kv-new-key-btn",onClick:()=>{h(n=>!n)},variant:"outline",children:s("New key")}),d.length>0&&r(P,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:I,variant:"destructive",children:t?s("Deleting…"):s("Delete {count}",{count:d.length})})]}),a!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:a}),k!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:k}),o!==null&&o.length===0&&!L&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:s("No keys.")}),o!==null&&o.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-key-table",children:[r(he,{children:w(X,{children:[r(q,{className:"w-10",children:r(ne,{"aria-label":s("Select all"),checked:A,"data-testid":"kv-select-all",onCheckedChange:O})}),r(q,{children:s("Key")}),r(q,{children:s("Expiration")})]})}),r(ye,{children:o.map(n=>w(X,{className:n.name===p?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-key":n.name,"data-testid":`kv-key-row-${n.name}`,onClick:C,children:[r(Q,{onClick:u=>{u.stopPropagation()},children:r(ne,{"aria-label":s("Select {name}",{name:n.name}),checked:_.has(n.name),"data-testid":`kv-select-${n.name}`,onCheckedChange:()=>{F(n.name)}})}),r(Q,{className:"font-mono text-xs",children:n.name}),r(Q,{className:"tabular-nums text-xs",children:Oe(n.expiration)})]},n.name))})]})})}),!g&&f!==null&&r("div",{className:"mt-2",children:r(P,{"data-testid":"kv-load-more",disabled:L,onClick:y,variant:"outline",children:s(L?"Loading…":"Load more")})})]}),r(ie,{onOpenChange:n=>{n||h(!1)},open:m,children:w(de,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-create-sheet",side:"right",children:[r(oe,{children:r(ce,{children:s("New key")})}),r(Pe,{namespace:l,onCancel:()=>{h(!1)},onCreated:D})]})}),r(ie,{onOpenChange:n=>{n||i({name:null,type:"selectKey"})},open:p!==null,children:w(de,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-editor-sheet",side:"right",children:[r(oe,{children:r(ce,{className:"truncate font-mono text-xs",children:p})}),p!==null&&r(He,{expiration:o?.find(n=>n.name===p)?.expiration,keyName:p,namespace:l,onDeleted:S},`${l}:${p}`)]})})]})},ut=({loadNamespaces:l}={})=>{const e=ee(),s=G(),[c,i]=Z(null),[v,d]=Z(null),[t,a]=Z(null);ae(()=>{const o={cancelled:!1};return H((async()=>{try{const g=await(l??(()=>e.listKvNamespaces()))();o.cancelled||(i(g),d(null),a(k=>k??g[0]?.binding??null))}catch(g){o.cancelled||(i(null),d(R(g)))}})()),()=>{o.cancelled=!0}},[e,l]);const f=o=>{a(o.currentTarget.dataset.ns??null)};return w("div",{className:"flex flex-col gap-4","data-testid":"lunora-kv-browser",children:[v!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-ns-error",role:"alert",children:v}),c!==null&&c.length===0&&r(Ee,{description:s("Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed."),icon:r("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:r("path",{d:"M5 5h14v4H5V5Zm0 5h14v4H5v-4Zm0 5h14v4H5v-4Z"})}),testId:"kv-empty",title:s("No KV namespaces.")}),c!==null&&c.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-namespace-table",children:[r(he,{children:r(X,{children:r(q,{children:s("Namespace")})})}),r(ye,{children:c.map(o=>r(X,{className:o.binding===t?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-ns":o.binding,"data-testid":`kv-ns-row-${o.binding}`,onClick:f,children:r(Q,{className:"font-mono text-xs",children:o.binding})},o.binding))})]})})}),t!==null&&r(Ue,{namespace:t},t)]})};export{ut as KvBrowser};
|
|
1
|
+
import{useLunora as ee}from"@lunora/react";import{useState as Z,useReducer as le,useEffect as ae}from"react";import{C as ve,a as fe}from"../packem_shared/card-By2O8ULa.mjs";import{E as Ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as pe,a as he,b as X,c as q,d as ye,e as Q}from"../packem_shared/table-D0SBiDu-.mjs";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{f as H,b as R,m as Fe,g as se}from"../packem_shared/internal-Df43vQI0.mjs";import{B as P}from"../packem_shared/button-q0UYSmrn.mjs";import{C as ne}from"../packem_shared/checkbox-CnS9cyCz.mjs";import{I as re}from"../packem_shared/input-CXhxesPC.mjs";import{b as ie,c as de,d as oe,e as ce}from"../packem_shared/studio-CrypdTyE.mjs";import{c as te}from"react/compiler-runtime";import{L as W}from"../packem_shared/label-DKFzyHq6.mjs";import{T as ke}from"../packem_shared/textarea--40GKAyz.mjs";import{c as Ke,S as Ve,a as Ie,b as _e,d as Me}from"../packem_shared/select-DPyS18Vy.mjs";import{jsx as r,jsxs as w,Fragment as be}from"react/jsx-runtime";import{B as Le}from"../packem_shared/badge-r_5B4LHP.mjs";const Be=l=>{const e=l.trim();if(e==="")return;const s=Number(e);return Number.isFinite(s)&&s>0?Math.floor(s):void 0},Oe=l=>l===void 0?"—":new Date(l*1e3).toISOString(),Ae=l=>new TextEncoder().encode(l).length,ge=l=>{if(l.trim()!=="")try{return JSON.stringify(JSON.parse(l),void 0,2)}catch{return}},xe=l=>{if(l.trim()==="")return!0;try{return JSON.parse(l),!0}catch{return!1}},Ne=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ue=(l,e)=>{const s=l.trim();if(s==="")return"";const c=Number(s),i=Ne.find(v=>v.key===e)?.seconds??1;return Number.isFinite(c)&&c>0?String(Math.round(c*i)):s},Ce=l=>{const e=l.trim();if(e==="")return!0;const s=Number(e);return Number.isInteger(s)&&s>=60},Se=(l,e,s,c)=>{const i=Be(l.ttl);return{expiration:i===void 0?c:void 0,expirationTtl:i,key:e,metadata:l.metadata.trim()===""?void 0:JSON.parse(l.metadata),namespace:s,value:l.value}},we=l=>{const e=te(60),{helper:s,id:c,invalid:i,onChange:v,testId:d}=l,t=G(),[a,f]=Z(""),[o,g]=Z("seconds");let k;e[0]!==v||e[1]!==o?(k=b=>{f(b.target.value),v(ue(b.target.value,o))},e[0]=v,e[1]=o,e[2]=k):k=e[2];const L=k;let K;e[3]!==a||e[4]!==v?(K=b=>{b!==null&&(g(b),v(ue(a,b)))},e[3]=a,e[4]=v,e[5]=K):K=e[5];const V=K;let p;e[6]!==t?(p=t("days"),e[6]=t,e[7]=p):p=e[7];let m;e[8]!==t?(m=t("hours"),e[8]=t,e[9]=m):m=e[9];let h;e[10]!==t?(h=t("minutes"),e[10]=t,e[11]=h):h=e[11];let x;e[12]!==t?(x=t("seconds"),e[12]=t,e[13]=x):x=e[13];let N;e[14]!==p||e[15]!==m||e[16]!==h||e[17]!==x?(N={days:p,hours:m,minutes:h,seconds:x},e[14]=p,e[15]=m,e[16]=h,e[17]=x,e[18]=N):N=e[18];const C=N;let y;e[19]!==t?(y=t("Expires after"),e[19]=t,e[20]=y):y=e[20];let S;e[21]!==c||e[22]!==y?(S=r(W,{className:"text-xs",htmlFor:c,children:y}),e[21]=c,e[22]=y,e[23]=S):S=e[23];let F;e[24]!==t?(F=t("No expiration"),e[24]=t,e[25]=F):F=e[25];let O;e[26]!==a||e[27]!==c||e[28]!==i||e[29]!==L||e[30]!==F||e[31]!==d?(O=r(re,{"aria-invalid":i,className:"flex-1","data-testid":d,id:c,inputMode:"numeric",onChange:L,placeholder:F,value:a}),e[26]=a,e[27]=c,e[28]=i,e[29]=L,e[30]=F,e[31]=d,e[32]=O):O=e[32];let I;e[33]!==t?(I=t("TTL unit"),e[33]=t,e[34]=I):I=e[34];const D=`${d}-unit`;let A;e[35]===Symbol.for("react.memo_cache_sentinel")?(A=r(Ve,{}),e[35]=A):A=e[35];let _;e[36]!==I||e[37]!==D?(_=r(Ie,{"aria-label":I,className:"w-[7.5rem]","data-testid":D,children:A}),e[36]=I,e[37]=D,e[38]=_):_=e[38];let n;e[39]!==C?(n=Ne.map(b=>r(Ke,{value:b.key,children:C[b.key]},b.key)),e[39]=C,e[40]=n):n=e[40];let u;e[41]!==n?(u=r(_e,{children:n}),e[41]=n,e[42]=u):u=e[42];let T;e[43]!==V||e[44]!==_||e[45]!==u||e[46]!==o?(T=w(Me,{onValueChange:V,value:o,children:[_,u]}),e[43]=V,e[44]=_,e[45]=u,e[46]=o,e[47]=T):T=e[47];let M;e[48]!==O||e[49]!==T?(M=w("div",{className:"flex gap-2",children:[O,T]}),e[48]=O,e[49]=T,e[50]=M):M=e[50];let E;e[51]!==s||e[52]!==i||e[53]!==t||e[54]!==d?(E=i?r("p",{className:"text-xs text-destructive","data-testid":`${d}-invalid`,children:t("TTL must be at least 60 seconds.")}):s!==void 0&&r("p",{className:"text-xs text-muted-foreground",children:s}),e[51]=s,e[52]=i,e[53]=t,e[54]=d,e[55]=E):E=e[55];let B;return e[56]!==M||e[57]!==E||e[58]!==S?(B=w("div",{className:"mb-3 grid gap-1",children:[S,M,E]}),e[56]=M,e[57]=E,e[58]=S,e[59]=B):B=e[59],B},Te=l=>{const e=te(36),{id:s,invalidTestId:c,onChange:i,testId:v,valid:d,value:t}=l,a=G();let f;e[0]!==t?(f=ge(t),e[0]=t,e[1]=f):f=e[1];const o=f;let g;e[2]!==a?(g=a("Metadata (JSON)"),e[2]=a,e[3]=g):g=e[3];let k;e[4]!==s||e[5]!==g?(k=r(W,{className:"text-xs",htmlFor:s,children:g}),e[4]=s,e[5]=g,e[6]=k):k=e[6];const L=`${v}-format`,K=o===void 0;let V;e[7]!==o||e[8]!==i?(V=()=>{o!==void 0&&i(o)},e[7]=o,e[8]=i,e[9]=V):V=e[9];let p;e[10]!==a?(p=a("Format JSON"),e[10]=a,e[11]=p):p=e[11];let m;e[12]!==L||e[13]!==K||e[14]!==V||e[15]!==p?(m=r(P,{"data-testid":L,disabled:K,onClick:V,size:"sm",variant:"outline",children:p}),e[12]=L,e[13]=K,e[14]=V,e[15]=p,e[16]=m):m=e[16];let h;e[17]!==k||e[18]!==m?(h=w("div",{className:"flex items-center justify-between gap-2",children:[k,m]}),e[17]=k,e[18]=m,e[19]=h):h=e[19];const x=!d;let N;e[20]!==i?(N=F=>{i(F.target.value)},e[20]=i,e[21]=N):N=e[21];let C;e[22]!==s||e[23]!==x||e[24]!==N||e[25]!==v||e[26]!==t?(C=r(ke,{"aria-invalid":x,className:"min-h-[4rem] font-mono text-xs","data-testid":v,id:s,onChange:N,value:t}),e[22]=s,e[23]=x,e[24]=N,e[25]=v,e[26]=t,e[27]=C):C=e[27];let y;e[28]!==c||e[29]!==a||e[30]!==d?(y=!d&&r("p",{className:"text-xs text-destructive","data-testid":c,children:a("Metadata must be valid JSON.")}),e[28]=c,e[29]=a,e[30]=d,e[31]=y):y=e[31];let S;return e[32]!==C||e[33]!==y||e[34]!==h?(S=w("div",{className:"mb-3 grid gap-1",children:[h,C,y]}),e[32]=C,e[33]=y,e[34]=h,e[35]=S):S=e[35],S},De={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Je=(l,e)=>{switch(e.type){case"setField":return{...l,[e.field]:e.value};case"submitFailed":return{...l,busy:!1,error:e.error};case"submitStart":return{...l,busy:!0,error:null};default:return l}},Pe=l=>{const e=te(73),{namespace:s,onCancel:c,onCreated:i}=l,v=ee(),d=G(),[t,a]=le(Je,De);let f;e[0]!==t.metadata?(f=xe(t.metadata),e[0]=t.metadata,e[1]=f):f=e[1];const o=f;let g;e[2]!==t.ttl?(g=Ce(t.ttl),e[2]=t.ttl,e[3]=g):g=e[3];const k=g;let L;e[4]!==o||e[5]!==t.busy||e[6]!==t.name||e[7]!==k?(L=t.name.trim()!==""&&o&&k&&!t.busy,e[4]=o,e[5]=t.busy,e[6]=t.name,e[7]=k,e[8]=L):L=e[8];const K=L;let V;e[9]!==K||e[10]!==v||e[11]!==s||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(V=()=>{K&&(a({type:"submitStart"}),H((async()=>{try{await v.putKvValue(Se({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,s)),i()}catch($){a({error:R($),type:"submitFailed"})}})()))},e[9]=K,e[10]=v,e[11]=s,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=V):V=e[17];const p=V;let m;e[18]!==d?(m=d("Key name"),e[18]=d,e[19]=m):m=e[19];let h;e[20]!==m?(h=r(W,{className:"text-xs",htmlFor:"kv-create-name",children:m}),e[20]=m,e[21]=h):h=e[21];let x;e[22]===Symbol.for("react.memo_cache_sentinel")?(x=$=>{a({field:"name",type:"setField",value:$.target.value})},e[22]=x):x=e[22];let N;e[23]!==d?(N=d("Key name"),e[23]=d,e[24]=N):N=e[24];let C;e[25]!==t.name||e[26]!==N?(C=r(re,{autoFocus:!0,"data-testid":"kv-create-name",id:"kv-create-name",onChange:x,placeholder:N,value:t.name}),e[25]=t.name,e[26]=N,e[27]=C):C=e[27];let y;e[28]!==h||e[29]!==C?(y=w("div",{className:"grid gap-1",children:[h,C]}),e[28]=h,e[29]=C,e[30]=y):y=e[30];let S;e[31]!==d?(S=d("Value"),e[31]=d,e[32]=S):S=e[32];let F;e[33]!==S?(F=r(W,{className:"text-xs",htmlFor:"kv-create-value",children:S}),e[33]=S,e[34]=F):F=e[34];let O;e[35]===Symbol.for("react.memo_cache_sentinel")?(O=$=>{a({field:"value",type:"setField",value:$.target.value})},e[35]=O):O=e[35];let I;e[36]!==t.value?(I=r(ke,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:O,value:t.value}),e[36]=t.value,e[37]=I):I=e[37];let D;e[38]!==F||e[39]!==I?(D=w("div",{className:"grid gap-1",children:[F,I]}),e[38]=F,e[39]=I,e[40]=D):D=e[40];const A=!k;let _;e[41]===Symbol.for("react.memo_cache_sentinel")?(_=$=>{a({field:"ttl",type:"setField",value:$})},e[41]=_):_=e[41];let n;e[42]!==A?(n=r(we,{id:"kv-create-ttl",invalid:A,onChange:_,testId:"kv-create-ttl"}),e[42]=A,e[43]=n):n=e[43];let u;e[44]===Symbol.for("react.memo_cache_sentinel")?(u=$=>{a({field:"metadata",type:"setField",value:$})},e[44]=u):u=e[44];let T;e[45]!==o||e[46]!==t.metadata?(T=r(Te,{id:"kv-create-metadata",invalidTestId:"kv-create-metadata-invalid",onChange:u,testId:"kv-create-metadata",valid:o,value:t.metadata}),e[45]=o,e[46]=t.metadata,e[47]=T):T=e[47];const M=!K;let E;e[48]!==t.busy||e[49]!==d?(E=t.busy?d("Creating…"):d("Create key"),e[48]=t.busy,e[49]=d,e[50]=E):E=e[50];let B;e[51]!==p||e[52]!==M||e[53]!==E?(B=r(P,{"data-testid":"kv-create-submit",disabled:M,onClick:p,children:E}),e[51]=p,e[52]=M,e[53]=E,e[54]=B):B=e[54];const b=t.busy;let J;e[55]!==d?(J=d("Cancel"),e[55]=d,e[56]=J):J=e[56];let j;e[57]!==c||e[58]!==t.busy||e[59]!==J?(j=r(P,{"data-testid":"kv-create-cancel",disabled:b,onClick:c,variant:"outline",children:J}),e[57]=c,e[58]=t.busy,e[59]=J,e[60]=j):j=e[60];let z;e[61]!==B||e[62]!==j?(z=w("div",{className:"flex flex-wrap gap-2",children:[B,j]}),e[61]=B,e[62]=j,e[63]=z):z=e[63];let U;e[64]!==t.error?(U=t.error!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-create-error",role:"alert",children:t.error}),e[64]=t.error,e[65]=U):U=e[65];let Y;return e[66]!==y||e[67]!==D||e[68]!==n||e[69]!==T||e[70]!==z||e[71]!==U?(Y=w("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[y,D,n,T,z,U]}),e[66]=y,e[67]=D,e[68]=n,e[69]=T,e[70]=z,e[71]=U,e[72]=Y):Y=e[72],Y},$e={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},je=(l,e)=>{switch(e.type){case"deleteStart":return{...l,busy:"deleting",writeError:null};case"editMetadata":return{...l,editedMetadata:e.value};case"editTtl":return{...l,editedTtl:e.value};case"editValue":return{...l,editedValue:e.value};case"loaded":return{...l,editedMetadata:e.metadata===null||e.metadata===void 0?"":JSON.stringify(e.metadata,null,2),editedValue:e.value??"",loading:!1,value:e.value};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"saveOk":return{...l,busy:"",value:l.editedValue};case"saveStart":return{...l,busy:"saving",writeError:null};case"writeFailed":return{...l,busy:"",writeError:e.error};default:return l}},He=l=>{const e=te(67),{expiration:s,keyName:c,namespace:i,onDeleted:v}=l,d=ee(),t=G(),[a,f]=le(je,$e);let o,g;e[0]!==d||e[1]!==c||e[2]!==i?(o=()=>{const b={cancelled:!1};return H((async()=>{try{const J=await d.getKvValue({key:c,namespace:i});b.cancelled||f({metadata:J.metadata,type:"loaded",value:J.value})}catch(J){const j=J;b.cancelled||f({error:R(j),type:"loadFailed"})}})()),()=>{b.cancelled=!0}},g=[d,i,c],e[0]=d,e[1]=c,e[2]=i,e[3]=o,e[4]=g):(o=e[3],g=e[4]),ae(o,g);let k;e[5]===Symbol.for("react.memo_cache_sentinel")?(k=b=>{f({type:"editValue",value:b.target.value})},e[5]=k):k=e[5];const L=k;let K;e[6]===Symbol.for("react.memo_cache_sentinel")?(K=b=>{f({type:"editMetadata",value:b})},e[6]=K):K=e[6];const V=K;let p;e[7]!==a.editedValue?(p=ge(a.editedValue),e[7]=a.editedValue,e[8]=p):p=e[8];const m=p;let h;e[9]!==a.editedMetadata?(h=xe(a.editedMetadata),e[9]=a.editedMetadata,e[10]=h):h=e[10];const x=h;let N;e[11]!==a.editedTtl?(N=Ce(a.editedTtl),e[11]=a.editedTtl,e[12]=N):N=e[12];const C=N;let y;e[13]!==m?(y=()=>{m!==void 0&&f({type:"editValue",value:m})},e[13]=m,e[14]=y):y=e[14];const S=y;let F;e[15]!==d||e[16]!==s||e[17]!==c||e[18]!==x||e[19]!==i||e[20]!==a.editedMetadata||e[21]!==a.editedTtl||e[22]!==a.editedValue||e[23]!==t?(F=()=>{if(!x){f({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}f({type:"saveStart"}),H((async()=>{try{await d.putKvValue(Se({metadata:a.editedMetadata,ttl:a.editedTtl,value:a.editedValue},c,i,s)),f({type:"saveOk"})}catch(b){f({error:R(b),type:"writeFailed"})}})())},e[15]=d,e[16]=s,e[17]=c,e[18]=x,e[19]=i,e[20]=a.editedMetadata,e[21]=a.editedTtl,e[22]=a.editedValue,e[23]=t,e[24]=F):F=e[24];const O=F;let I;e[25]!==d||e[26]!==c||e[27]!==i||e[28]!==v?(I=()=>{f({type:"deleteStart"}),H((async()=>{try{await d.deleteKvKey({key:c,namespace:i}),v(c)}catch(b){f({error:R(b),type:"writeFailed"})}})())},e[25]=d,e[26]=c,e[27]=i,e[28]=v,e[29]=I):I=e[29];const D=I;let A;e[30]!==c?(A=()=>{se(c)},e[30]=c,e[31]=A):A=e[31];let _;e[32]!==t?(_=t("Copy key"),e[32]=t,e[33]=_):_=e[33];let n;e[34]!==A||e[35]!==_?(n=r("div",{className:"mb-2 flex justify-end",children:r(P,{"data-testid":"kv-copy-key-btn",onClick:A,size:"sm",variant:"outline",children:_})}),e[34]=A,e[35]=_,e[36]=n):n=e[36];let u;e[37]!==a.loadError?(u=a.loadError!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:a.loadError}),e[37]=a.loadError,e[38]=u):u=e[38];let T;e[39]!==a.loading||e[40]!==t?(T=a.loading&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=a.loading,e[40]=t,e[41]=T):T=e[41];let M;e[42]!==m||e[43]!==x||e[44]!==D||e[45]!==S||e[46]!==O||e[47]!==a.busy||e[48]!==a.editedMetadata||e[49]!==a.editedValue||e[50]!==a.loading||e[51]!==a.value||e[52]!==a.writeError||e[53]!==t||e[54]!==C?(M=!a.loading&&a.value!==null&&w(be,{children:[w("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[r(W,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),m!==void 0&&r(Le,{variant:"secondary",children:t("JSON")}),r("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Fe(Ae(a.editedValue))})]}),r("textarea",{"aria-label":t("KV value"),className:"mb-2 min-h-[8rem] w-full rounded border border-border bg-muted/30 p-2 font-mono text-xs","data-testid":"kv-value-editor",id:"kv-value-editor",onChange:L,value:a.editedValue}),w("div",{className:"mb-3 flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-format-btn",disabled:m===void 0,onClick:S,size:"sm",variant:"outline",children:t("Format JSON")}),r(P,{"data-testid":"kv-copy-value-btn",onClick:()=>{se(a.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),r(we,{helper:t("Leave blank to keep the current expiration."),id:"kv-ttl-input",invalid:!C,onChange:b=>{f({type:"editTtl",value:b})},testId:"kv-ttl-input"}),r(Te,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:V,testId:"kv-metadata-editor",valid:x,value:a.editedMetadata}),w("div",{className:"flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-save-btn",disabled:a.busy!==""||!x||!C,onClick:O,children:a.busy==="saving"?t("Saving…"):t("Save")}),r(P,{"data-testid":"kv-delete-btn",disabled:a.busy!=="",onClick:D,variant:"destructive",children:a.busy==="deleting"?t("Deleting…"):t("Delete")})]}),a.writeError!==null&&r("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:a.writeError})]}),e[42]=m,e[43]=x,e[44]=D,e[45]=S,e[46]=O,e[47]=a.busy,e[48]=a.editedMetadata,e[49]=a.editedValue,e[50]=a.loading,e[51]=a.value,e[52]=a.writeError,e[53]=t,e[54]=C,e[55]=M):M=e[55];let E;e[56]!==a.loadError||e[57]!==a.loading||e[58]!==a.value||e[59]!==t?(E=!a.loading&&a.value===null&&a.loadError===null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-absent",children:t("Key is absent or has no value.")}),e[56]=a.loadError,e[57]=a.loading,e[58]=a.value,e[59]=t,e[60]=E):E=e[60];let B;return e[61]!==n||e[62]!==u||e[63]!==T||e[64]!==M||e[65]!==E?(B=w("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[n,u,T,M,E]}),e[61]=n,e[62]=u,e[63]=T,e[64]=M,e[65]=E,e[66]=B):B=e[66],B},me=100,Re={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},ze=(l,e)=>{switch(e.type){case"appendPage":return e.generation!==l.reloadNonce?l:{...l,cursor:e.cursor,keys:[...l.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...l,appliedPrefix:l.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,reloadNonce:l.reloadNonce+1,selectedKey:null};case"bulkDeleted":{const s=new Set(e.deleted);return{...l,bulk:l.bulk.filter(c=>!s.has(c)),bulkBusy:!1,bulkError:e.error,keys:l.keys===null?null:l.keys.filter(c=>!s.has(c.name)),selectedKey:l.selectedKey!==null&&s.has(l.selectedKey)?null:l.selectedKey}}case"bulkDeleteStart":return{...l,bulkBusy:!0,bulkError:null};case"firstPage":return{...l,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...l,bulk:l.bulk.filter(s=>s!==e.name),keys:l.keys===null?null:l.keys.filter(s=>s.name!==e.name),selectedKey:null};case"loadFailed":return e.generation!==void 0&&e.generation!==l.reloadNonce?l:{...l,loadError:e.error,loading:!1};case"loadStart":return{...l,loadError:null,loading:!0};case"prefixInput":return{...l,prefixInput:e.value};case"reload":return{...l,bulk:[],bulkError:null,reloadNonce:l.reloadNonce+1,selectedKey:null};case"selectKey":return{...l,selectedKey:e.name};case"toggleAllBulk":return{...l,bulk:e.names};case"toggleBulk":return{...l,bulk:l.bulk.includes(e.name)?l.bulk.filter(s=>s!==e.name):[...l.bulk,e.name]};default:return l}},Ue=({namespace:l})=>{const e=ee(),s=G(),[c,i]=le(ze,Re),{appliedPrefix:v,bulk:d,bulkBusy:t,bulkError:a,cursor:f,keys:o,listComplete:g,loadError:k,loading:L,prefixInput:K,reloadNonce:V,selectedKey:p}=c,[m,h]=Z(!1);ae(()=>{const n={cancelled:!1};return H((async()=>{i({type:"loadStart"});try{const u=await e.listKvKeys({limit:me,namespace:l,prefix:v===""?void 0:v});n.cancelled||i({cursor:u.cursor??null,keys:u.keys,listComplete:u.listComplete,type:"firstPage"})}catch(u){n.cancelled||i({error:R(u),type:"loadFailed"})}})()),()=>{n.cancelled=!0}},[e,l,v,V]);const x=n=>{i({type:"prefixInput",value:n.target.value})},N=()=>{i({type:"applyFilter"})},C=n=>{i({name:n.currentTarget.dataset.key??null,type:"selectKey"})},y=()=>{if(f===null)return;i({type:"loadStart"});const n=V;H((async()=>{try{const u=await e.listKvKeys({cursor:f,limit:me,namespace:l,prefix:v===""?void 0:v});i({cursor:u.cursor??null,generation:n,keys:u.keys,listComplete:u.listComplete,type:"appendPage"})}catch(u){i({error:R(u),generation:n,type:"loadFailed"})}})())},S=n=>{i({name:n,type:"keyDeleted"})},F=n=>{i({name:n,type:"toggleBulk"})},O=n=>{i({names:n&&o!==null?o.map(u=>u.name):[],type:"toggleAllBulk"})},I=()=>{if(d.length===0)return;const n=[...d];i({type:"bulkDeleteStart"}),H((async()=>{const u=await Promise.allSettled(n.map(E=>e.deleteKvKey({key:E,namespace:l}))),T=n.filter((E,B)=>u[B]?.status==="fulfilled"),M=n.length-T.length;i({deleted:T,error:M>0?s("Failed to delete {count} keys.",{count:M}):null,type:"bulkDeleted"})})())},D=()=>{h(!1),i({type:"reload"})},A=o!==null&&o.length>0&&d.length===o.length,_=new Set(d);return w(be,{children:[w("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[w("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[r(re,{"aria-label":s("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:x,placeholder:s("Filter by prefix…"),value:K}),r(P,{"data-testid":"kv-filter-btn",disabled:L,onClick:N,children:s("Filter")}),r(P,{"data-testid":"kv-new-key-btn",onClick:()=>{h(n=>!n)},variant:"outline",children:s("New key")}),d.length>0&&r(P,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:I,variant:"destructive",children:t?s("Deleting…"):s("Delete {count}",{count:d.length})})]}),a!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:a}),k!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:k}),o!==null&&o.length===0&&!L&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:s("No keys.")}),o!==null&&o.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-key-table",children:[r(he,{children:w(X,{children:[r(q,{className:"w-10",children:r(ne,{"aria-label":s("Select all"),checked:A,"data-testid":"kv-select-all",onCheckedChange:O})}),r(q,{children:s("Key")}),r(q,{children:s("Expiration")})]})}),r(ye,{children:o.map(n=>w(X,{className:n.name===p?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-key":n.name,"data-testid":`kv-key-row-${n.name}`,onClick:C,children:[r(Q,{onClick:u=>{u.stopPropagation()},children:r(ne,{"aria-label":s("Select {name}",{name:n.name}),checked:_.has(n.name),"data-testid":`kv-select-${n.name}`,onCheckedChange:()=>{F(n.name)}})}),r(Q,{className:"font-mono text-xs",children:n.name}),r(Q,{className:"tabular-nums text-xs",children:Oe(n.expiration)})]},n.name))})]})})}),!g&&f!==null&&r("div",{className:"mt-2",children:r(P,{"data-testid":"kv-load-more",disabled:L,onClick:y,variant:"outline",children:s(L?"Loading…":"Load more")})})]}),r(ie,{onOpenChange:n=>{n||h(!1)},open:m,children:w(de,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-create-sheet",side:"right",children:[r(oe,{children:r(ce,{children:s("New key")})}),r(Pe,{namespace:l,onCancel:()=>{h(!1)},onCreated:D})]})}),r(ie,{onOpenChange:n=>{n||i({name:null,type:"selectKey"})},open:p!==null,children:w(de,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-editor-sheet",side:"right",children:[r(oe,{children:r(ce,{className:"truncate font-mono text-xs",children:p})}),p!==null&&r(He,{expiration:o?.find(n=>n.name===p)?.expiration,keyName:p,namespace:l,onDeleted:S},`${l}:${p}`)]})})]})},ut=({loadNamespaces:l}={})=>{const e=ee(),s=G(),[c,i]=Z(null),[v,d]=Z(null),[t,a]=Z(null);ae(()=>{const o={cancelled:!1};return H((async()=>{try{const g=await(l??(()=>e.listKvNamespaces()))();o.cancelled||(i(g),d(null),a(k=>k??g[0]?.binding??null))}catch(g){o.cancelled||(i(null),d(R(g)))}})()),()=>{o.cancelled=!0}},[e,l]);const f=o=>{a(o.currentTarget.dataset.ns??null)};return w("div",{className:"flex flex-col gap-4","data-testid":"lunora-kv-browser",children:[v!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-ns-error",role:"alert",children:v}),c!==null&&c.length===0&&r(Ee,{description:s("Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed."),icon:r("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:r("path",{d:"M5 5h14v4H5V5Zm0 5h14v4H5v-4Zm0 5h14v4H5v-4Z"})}),testId:"kv-empty",title:s("No KV namespaces.")}),c!==null&&c.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-namespace-table",children:[r(he,{children:r(X,{children:r(q,{children:s("Namespace")})})}),r(ye,{children:c.map(o=>r(X,{className:o.binding===t?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-ns":o.binding,"data-testid":`kv-ns-row-${o.binding}`,onClick:f,children:r(Q,{className:"font-mono text-xs",children:o.binding})},o.binding))})]})})}),t!==null&&r(Ue,{namespace:t},t)]})};export{ut as KvBrowser};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as C}from"react/compiler-runtime";import{useMemo as I,useState as Z}from"react";import{useT as L}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{c as j}from"../packem_shared/utils-bhneXptQ.mjs";import{MigrationsPanel as N}from"../packem_shared/MigrationsPanel-CkVIwAbK.mjs";import{useNavigate as ee,useSearch as te}from"@tanstack/react-router";import{E as ie}from"../packem_shared/error-alert-DueSEkt-.mjs";import{E as ne}from"../packem_shared/empty-state-D7jEML_T.mjs";import{u as R}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{ADMIN_FUNCTIONS as E}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as se,f as oe}from"../packem_shared/internal-Df43vQI0.mjs";import{S as ae}from"../packem_shared/schema-diagram-CQ4vn0CN.mjs";import{jsx as c,jsxs as y}from"react/jsx-runtime";const A=1;function re(t){const e={},i=Object.keys(t);i.sort();for(const n of i)e[n]=t[n];return e}const O=t=>typeof t=="object"&&t!==null,de=t=>O(t)&&O(t.fields)&&O(t.indexes)&&O(t.relations)&&typeof t.shardMode=="string",le=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(n){return{error:`baseline is not valid JSON: ${n instanceof Error?n.message:String(n)}`,status:"invalid"}}if(!O(e)||e.version!==A||!O(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(A)})`,status:"invalid"};for(const[n,s]of Object.entries(e.tables))if(!de(s))return{error:`baseline table "${n}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof e.jurisdiction=="string"?e.jurisdiction:void 0,migrationIds:Array.isArray(e.migrationIds)?e.migrationIds:[],tables:e.tables,version:A},status:"ok"}},ce=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((i,n)=>i===e.fields[n]),J=t=>t.unique!==void 0,D=({nullable:t,optional:e,refined:i,unique:n,...s})=>JSON.stringify(re(s)),H=t=>({form:JSON.stringify([D(t),t.optional===!0,t.nullable===!0]),refined:t.refined===!0}),V=t=>t.kind==="union"&&t.members?t.members.map(e=>H(e)):[H({...t,nullable:!1,optional:!1})],me=(t,e)=>{if(e.kind!=="union")return!1;const i=V(e);return V(t).every(n=>i.some(s=>s.form===n.form&&(n.refined||!s.refined)))},x=t=>{switch(t.kind){case"array":return`array(${t.of?x(t.of):"?"})`;case"id":return`id(${t.ref??"?"})`;case"literal":return`literal(${t.literal??"?"})`;case"object":return`object({ ${Object.keys(t.fields??{}).join(", ")} })`;case"record":return`record(${t.key?x(t.key):"?"}, ${t.of?x(t.of):"?"})`;case"union":return(t.members??[]).map(e=>x(e)).join(" | ");default:return t.kind}},T=(t,e,i)=>({remediation:"backfill",scope:"table",severity:"breaking",summary:i,table:t,type:e}),q=(t,e,i)=>({remediation:"none",scope:"table",severity:"safe",summary:i,table:t,type:e}),he=(t,e,i,n,s)=>{if(!(i.kind===n.kind&&(!s||D(i)===D(n))))return s&&me(i,n)?q(t,"widenedFieldShape",`field ${t}.${e} widened: ${x(i)} → ${x(n)} — every stored value stays valid`):i.kind!==n.kind?T(t,"changedFieldKind",`field ${t}.${e} changed type: ${i.kind} → ${n.kind} — add a data migration to convert existing values`):T(t,"changedFieldShape",`field ${t}.${e} changed shape: ${x(i)} → ${x(n)} — stored values were written against the old shape; add a data migration to convert them`)},fe=(t,e,i,n)=>{const s=[];return i.unique!==n.unique&&s.push(n.unique===!0?T(t,"addedFieldConstraint",`field ${t}.${e} became unique — existing duplicates would violate it; add a data migration to de-duplicate first`):q(t,"relaxedFieldConstraint",`field ${t}.${e} is no longer unique`)),i.nullable!==n.nullable&&s.push(n.nullable===!0?q(t,"relaxedFieldConstraint",`field ${t}.${e} became nullable`):T(t,"addedFieldConstraint",`field ${t}.${e} is no longer nullable — rows holding NULL would be invalid; add a data migration to backfill them`)),i.refined!==n.refined&&s.push(n.refined===!0?T(t,"addedFieldConstraint",`field ${t}.${e} gained a validation refinement — stored values were never checked against it; add a data migration if any could fail`):q(t,"relaxedFieldConstraint",`field ${t}.${e} dropped its validation refinement`)),s},Y=(t,e,i,n)=>{const s=[],a=J(i)&&J(n),o=he(t,e,i,n,a);return o&&s.push(o),a&&s.push(...fe(t,e,i,n)),i.optional&&!n.optional?s.push({remediation:"backfill",severity:"breaking",summary:`field ${t}.${e} became required — rows missing it would be invalid; add a data migration to backfill it`,table:t,scope:"table",type:"fieldOptionalToRequired"}):!i.optional&&n.optional&&s.push({remediation:"none",scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),s},ue=(t,e,i)=>i.optional?{remediation:"none",scope:"table",severity:"safe",summary:`added optional field ${t}.${e}`,table:t,type:"addedOptionalField"}:{remediation:"backfill",severity:"breaking",summary:`added required field ${t}.${e} — existing rows have no value; add a data migration to backfill it`,table:t,scope:"table",type:"addedRequiredField"},pe=(t,e,i,n)=>{for(const[s,a]of Object.entries(i.fields)){const o=e.fields[s];o===void 0?n.push(ue(t,s,a)):n.push(...Y(t,s,o,a))}for(const s of Object.keys(e.fields))i.fields[s]===void 0&&n.push({remediation:"backfill",severity:"breaking",summary:`removed field ${t}.${s} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},ge=(t,e,i,n)=>{for(const[s,a]of Object.entries(i.indexes)){const o=e.indexes[s];if(o===void 0){n.push(a.unique?{remediation:"backfill",scope:"table",severity:"breaking",summary:`added unique index ${s} on ${t} — existing duplicates would violate it; add a data migration to de-duplicate first`,table:t,type:"addedIndex"}:{remediation:"none",scope:"table",severity:"safe",summary:`added index ${s} on ${t}`,table:t,type:"addedIndex"});continue}ce(o,a)||n.push({remediation:"code",severity:"breaking",summary:`index ${s} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const s of Object.keys(e.indexes))i.indexes[s]===void 0&&n.push({remediation:"code",severity:"breaking",summary:`removed index ${s} on ${t} — a query that used \`.withIndex("${s}")\` would break`,table:t,scope:"table",type:"removedIndex"})},be=(t,e,i,n)=>{for(const s of Object.keys(i.relations))e.relations[s]===void 0&&n.push({remediation:"none",scope:"schema",severity:"safe",summary:`added relation ${t}.${s}`,table:t,type:"addedRelation"});for(const s of Object.keys(e.relations))i.relations[s]===void 0&&n.push({remediation:"code",scope:"schema",severity:"breaking",summary:`removed relation ${t}.${s}`,table:t,type:"removedRelation"})},G="shardBy:_unknown_",F="global",ye=(t,e)=>t===F&&e.startsWith(`${F}:`)||e===F&&t.startsWith(`${F}:`),ve=(t,e,i)=>{if(e===i)return i!==G?void 0:{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} declares a non-literal .shardBy(...) key, so codegen cannot read which column partitions it — every such key records as "${G}" and two DIFFERENT keys would compare equal. Pass the shard key as a string literal; until then this is reported on every run, because the alternative is a silent pass on a re-home that strands every row (export/import is the only way back).`,table:t,type:"changedShardMode"};if(!ye(e,i))return{remediation:"rehome",severity:"breaking",summary:`table ${t} changed shard mode: ${e} → ${i} — its physical storage moves, and existing rows do NOT follow the schema; re-home them with an export/import round trip (https://lunora.sh/docs/concepts/sharding#migrating-a-populated-table)`,table:t,scope:"table",type:"changedShardMode"}},Q=t=>t.memory!==void 0,W=t=>t.after??0,w=t=>t.after===void 0?`.ttl("${t.field}")`:`.ttl("${t.field}", { after: ${String(t.after)} })`,xe=(t,e,i)=>{if(e===void 0&&i===void 0)return;const n=r=>({remediation:"backfill",scope:"table",severity:"breaking",summary:r,table:t,type:"changedTtlPolicy"}),s=r=>({remediation:"none",scope:"table",severity:"safe",summary:r,table:t,type:"changedTtlPolicy"});if(i===void 0)return s(`table ${t} dropped its TTL policy — its rows are no longer swept`);if(e===void 0)return n(`table ${t} gained a TTL policy ${w(i)} — every row already past the cutoff is deleted on the next alarm sweep; add a data migration to refresh or clear "${i.field}" on the rows written before it`);if(e.field!==i.field)return n(`table ${t} moved its TTL to a different column: ${w(e)} → ${w(i)} — rows are now expired by a column they were never written against; add a data migration to populate "${i.field}"`);const a=W(e),o=W(i);return o<a?n(`table ${t} shortened its TTL: ${w(e)} → ${w(i)} — rows that were not expired under the old offset are deleted on the next alarm sweep; add a data migration to refresh "${i.field}" on the rows that must survive`):o>a?s(`table ${t} lengthened its TTL: ${w(e)} → ${w(i)}`):void 0},ke=(t,e,i)=>{const n=[];return e.memory!==i.memory&&n.push(i.memory===!0?{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} became a .memory() table — every row is deleted in every shard on the next Durable Object cold start, and no data migration survives that; export the rows first if they must be kept, or revert`,table:t,type:"changedMemoryMode"}:{remediation:"none",scope:"table",severity:"safe",summary:`table ${t} is no longer a .memory() table — its rows now survive a cold start`,table:t,type:"changedMemoryMode"}),e.commitOrdered!==i.commitOrdered&&n.push(i.commitOrdered===!0?{remediation:"backfill",scope:"table",severity:"breaking",summary:`table ${t} became .commitOrdered() — rows written before it carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed never offers them; add a data migration over the table to stamp them (the rewrite allocates a sequence)`,table:t,type:"changedCommitOrdering"}:{remediation:"code",scope:"table",severity:"breaking",summary:`table ${t} is no longer .commitOrdered() — new rows carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed stops advancing without erroring; update the consumers before deploying`,table:t,type:"changedCommitOrdering"}),n},$e=(t,e,i,n)=>{const s=ve(t,e.shardMode,i.shardMode);if(s&&n.push(s),Q(e)&&Q(i)){n.push(...ke(t,e,i));const a=xe(t,e.ttl,i.ttl);a&&n.push(a)}pe(t,e,i,n),ge(t,e,i,n),be(t,e,i,n)},we=(t,e)=>{const i=[],n=t?.tables??{};for(const[s,a]of Object.entries(e.tables)){const o=n[s];if(o===void 0){i.push({remediation:"none",scope:"table",severity:"safe",summary:`added table ${s}`,table:s,type:"addedTable"});continue}$e(s,o,a,i)}for(const s of Object.keys(n))e.tables[s]===void 0&&i.push({remediation:"rehome",scope:"table",severity:"breaking",summary:`removed table ${s} — its rows stay in each shard's SQLite, unreachable through the schema; export the shard first if the data must be kept`,table:s,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const s=t.jurisdiction??"(none)",a=e.jurisdiction??"(none)";i.push({remediation:"rehome",scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${s} to ${a} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:i}},B=t=>Object.entries(t.fields).map(([e,i])=>({name:e,optional:i.optional,ref:Object.values(t.relations).find(n=>n.field===e&&n.kind==="one")?.table,type:x(i)})),U=(t,e,i)=>{const n={},s=e?.fields??{},a=i?.fields??{};for(const[o,r]of Object.entries(a)){const d=s[o];d===void 0?n[o]=e===void 0?"unchanged":"added":n[o]=Y(t,o,d,r).length===0?"unchanged":"changed"}for(const o of Object.keys(s))a[o]===void 0&&(n[o]="removed");return n},Oe=(t,e)=>{const{changes:i}=we(t,e),n=new Set(i.filter(o=>o.scope==="table"&&o.table!==void 0).map(o=>o.table)),s=[],a=(o,r)=>o?"added":n.has(r)?"changed":"context";for(const[o,r]of Object.entries(e.tables)){const d=t?.tables[o],m=a(d===void 0,o);s.push({columns:B(r),fieldStatus:U(o,d,r),name:o,shardMode:r.shardMode,status:m})}for(const[o,r]of Object.entries(t?.tables??{}))e.tables[o]===void 0&&s.push({columns:B(r),fieldStatus:U(o,r,void 0),name:o,shardMode:r.shardMode,status:"removed"});return s.sort((o,r)=>o.name.localeCompare(r.name)),{breakingCount:i.filter(o=>o.severity==="breaking").length,changes:i,tables:s}},K=t=>{const e=le(t);return e.status==="ok"?e.snapshot:void 0},Se={added:"ring-2 ring-emerald-500/60",changed:"ring-2 ring-amber-500/70",context:"opacity-55",removed:"opacity-70 ring-2 ring-destructive/60"},Te=t=>t==="global"||t.startsWith("global:")?"global":"shard",je=t=>{const e=C(24),{appliedAt:i,hash:n,onSelect:s,selected:a,seq:o}=t,r=a?"border-s-primary bg-accent/60 text-foreground":"border-s-transparent text-muted-foreground hover:bg-accent/30 hover:text-foreground";let d;e[0]!==r?(d=j("flex w-full flex-col items-start gap-1 border-s-2 px-4 py-3 text-start outline-none transition-colors",r),e[0]=r,e[1]=d):d=e[1];const m=`sh-version-${n}`;let u;e[2]!==n||e[3]!==s?(u=()=>{s(n)},e[2]=n,e[3]=s,e[4]=u):u=e[4];let f;e[5]!==o?(f=y("span",{className:"font-mono text-[13px] tabular-nums",children:["v",o]}),e[5]=o,e[6]=f):f=e[6];let g;e[7]!==n?(g=n.slice(0,7),e[7]=n,e[8]=g):g=e[8];let p;e[9]!==g?(p=c("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:g}),e[9]=g,e[10]=p):p=e[10];let h;e[11]!==f||e[12]!==p?(h=y("span",{className:"flex w-full items-baseline gap-2",children:[f,p]}),e[11]=f,e[12]=p,e[13]=h):h=e[13];let b;e[14]!==i?(b=se(i),e[14]=i,e[15]=b):b=e[15];let v;e[16]!==b?(v=c("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:b}),e[16]=b,e[17]=v):v=e[17];let k;return e[18]!==v||e[19]!==d||e[20]!==m||e[21]!==u||e[22]!==h?(k=c("li",{children:y("button",{className:d,"data-testid":m,onClick:u,type:"button",children:[h,v]})}),e[18]=v,e[19]=d,e[20]=m,e[21]=u,e[22]=h,e[23]=k):k=e[23],k},Fe=t=>{const e=C(26),{breaking:i,count:n,first:s}=t,a=L();if(s){let p;e[0]!==n?(p=c("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:n}),e[0]=n,e[1]=p):p=e[1];let h;e[2]!==a?(h=a("tables"),e[2]=a,e[3]=h):h=e[3];let b;e[4]!==h?(b=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:h}),e[4]=h,e[5]=b):b=e[5];let v;return e[6]!==p||e[7]!==b?(v=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[p,b]}),e[6]=p,e[7]=b,e[8]=v):v=e[8],v}const o=i>0&&"text-destructive";let r;e[9]!==o?(r=j("text-3xl leading-none font-light tracking-tight tabular-nums",o),e[9]=o,e[10]=r):r=e[10];let d;e[11]!==n||e[12]!==r?(d=c("span",{className:r,children:n}),e[11]=n,e[12]=r,e[13]=d):d=e[13];let m;e[14]!==n||e[15]!==a?(m=a(n===1?"change":"changes"),e[14]=n,e[15]=a,e[16]=m):m=e[16];let u;e[17]!==m?(u=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:m}),e[17]=m,e[18]=u):u=e[18];let f;e[19]!==i||e[20]!==a?(f=i>0&&y("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",a("{count} breaking",{count:i})]}),e[19]=i,e[20]=a,e[21]=f):f=e[21];let g;return e[22]!==d||e[23]!==u||e[24]!==f?(g=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[d,u,f]}),e[22]=d,e[23]=u,e[24]=f,e[25]=g):g=e[25],g},z={addedFieldConstraint:{action:"added",kind:"constraint"},addedIndex:{action:"added",kind:"index"},addedOptionalField:{action:"added",kind:"field?"},addedRelation:{action:"added",kind:"relation"},addedRequiredField:{action:"added",kind:"field"},addedTable:{action:"added",kind:"table"},changedCommitOrdering:{action:"changed",kind:"commit ordering"},changedFieldKind:{action:"changed",kind:"field kind"},changedFieldShape:{action:"changed",kind:"field shape"},changedIndex:{action:"changed",kind:"index"},changedJurisdiction:{action:"changed",kind:"jurisdiction"},changedMemoryMode:{action:"changed",kind:"memory mode"},changedShardMode:{action:"changed",kind:"shard mode"},changedTtlPolicy:{action:"changed",kind:"TTL policy"},fieldOptionalToRequired:{action:"changed",kind:"field → required"},fieldRequiredToOptional:{action:"changed",kind:"field → optional"},relaxedFieldConstraint:{action:"removed",kind:"constraint"},removedField:{action:"removed",kind:"field"},removedIndex:{action:"removed",kind:"index"},removedRelation:{action:"removed",kind:"relation"},removedTable:{action:"removed",kind:"table"},widenedFieldShape:{action:"changed",kind:"field → wider"}},qe=(t,e)=>{const i=`${z[t.type].action} ${e} `;return t.summary.startsWith(i)?t.summary.slice(i.length):t.summary},Ce=t=>{const e=new Map;for(const n of t){const s=n.table??"",a=e.get(s);a===void 0?e.set(s,[n]):a.push(n)}const i=[...e].map(([n,s])=>({changes:s,table:n}));return[...i.filter(n=>n.table!==""),...i.filter(n=>n.table==="")]},Me=t=>{const e=C(2),{children:i}=t;let n;return e[0]!==i?(n=c("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:i}),e[0]=i,e[1]=n):n=e[1],n},Ie=({pane:t,shardKey:e=""})=>{const i=L(),n=ee(),a=te({strict:!1}).version,o=l=>{oe(n({search:{version:l},to:"/migrations"}))},r=R(E.schemaHistory,{},{shardKey:e}),d=r.data?.versions??[],m=a!==void 0&&d.some(l=>l.hash===a)?a:d[0]?.hash,u=d.findIndex(l=>l.hash===m),f=u===-1?void 0:d[u+1]?.hash,g=R(E.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),p=R(E.schemaVersion,{hash:f??""},{enabled:f!==void 0,shardKey:e}),h=I(()=>{const l=K(g.data?.version?.snapshotJson);if(l!==void 0)return Oe(K(p.data?.version?.snapshotJson),l)},[g.data,p.data]),b=I(()=>(h?.tables??[]).map(l=>({columns:l.columns,name:l.name,tier:Te(l.shardMode)})),[h]),v=I(()=>{const l={};for(const S of h?.tables??[])l[S.name]=Se[S.status];return l},[h]);if(r.error!==null)return c(ie,{error:r.errorSource,testId:"sh-error"});if(d.length===0)return c(ne,{description:i("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:i("No schema versions recorded yet.")});const k=h?.changes??[];return y("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[y("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[c(Me,{children:i("Schema versions")}),c("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:d.map(l=>c(je,{appliedAt:l.appliedAt,hash:l.hash,onSelect:o,selected:l.hash===m,seq:l.seq},l.hash))})]}),y("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[c(Fe,{breaking:h?.breakingCount??0,count:f===void 0?b.length:k.length,first:f===void 0}),t==="diagram"?c("div",{className:"flex min-h-0 flex-1 flex-col",children:c(ae,{fill:!0,nodeClasses:v,tables:b,testIdPrefix:"sh"})}):c("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:Ce(k).map(l=>{const S=(h?.tables??[]).find($=>$.name===l.table);return y("section",{className:"mb-6",children:[y("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[c("span",{className:"font-mono text-[13px] text-foreground",children:l.table===""?i("schema"):l.table}),S!==void 0&&c("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:i("{count} columns",{count:S.columns.length})}),l.changes.length>1&&c("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:l.changes.length})]}),c("ul",{children:l.changes.map($=>{const{action:X,kind:P}=z[$.type],M=$.severity==="breaking",_=qe($,P);return y("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[c("span",{"aria-hidden":"true",className:j("-ms-3 h-3 w-0.5 shrink-0 self-center",M?"bg-destructive":"bg-transparent")}),y("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[i(X)," ",P]}),_!==l.table&&c("span",{className:j("min-w-0 font-mono text-[13px]",M?"text-destructive":"text-foreground"),children:_}),M&&c("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:i("breaking")})]},`${$.type}-${$.summary}`)})})]},l.table)})})]})]})},Re=t=>j("-mb-px border-b-2 px-3 py-2.5 font-mono text-[11px] tracking-wider uppercase transition-colors outline-none","hover:bg-accent/40 focus-visible:bg-accent/40",t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),Ue=t=>{const e=C(11),{initialShardKey:i}=t,n=L(),[s,a]=Z("diagram");let o;e[0]!==s?(o=(f,g,p,h)=>y("button",{"aria-selected":s===f,className:Re(s===f),"data-testid":p,onClick:()=>{a(f)},role:"tab",type:"button",children:[g,h!==void 0&&c("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:h})]}),e[0]=s,e[1]=o):o=e[1];const r=o;let d;e[2]!==n||e[3]!==r?(d=y("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[r("diagram",n("Diagram"),"mg-pane-diagram"),r("changes",n("Changes"),"mg-pane-changes"),r("data",n("Data migrations"),"mg-pane-data")]}),e[2]=n,e[3]=r,e[4]=d):d=e[4];let m;e[5]!==i||e[6]!==s?(m=c("div",{className:"flex min-h-0 flex-1 flex-col",children:s==="data"?c("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:c(N,{initialShardKey:i})}):c(Ie,{pane:s,shardKey:i})}),e[5]=i,e[6]=s,e[7]=m):m=e[7];let u;return e[8]!==d||e[9]!==m?(u=y("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[d,m]}),e[8]=d,e[9]=m,e[10]=u):u=e[10],u};export{Ue as default};
|
|
1
|
+
import{c as C}from"react/compiler-runtime";import{useMemo as I,useState as Z}from"react";import{useT as L}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{c as j}from"../packem_shared/utils-bhneXptQ.mjs";import{MigrationsPanel as N}from"../packem_shared/MigrationsPanel-CkVIwAbK.mjs";import{useNavigate as ee,useSearch as te}from"@tanstack/react-router";import{E as ie}from"../packem_shared/error-alert-DueSEkt-.mjs";import{E as ne}from"../packem_shared/empty-state-D7jEML_T.mjs";import{u as R}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{ADMIN_FUNCTIONS as E}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as se,f as oe}from"../packem_shared/internal-Df43vQI0.mjs";import{S as ae}from"../packem_shared/schema-diagram-C5oilX7l.mjs";import{jsx as c,jsxs as y}from"react/jsx-runtime";const A=1;function re(t){const e={},i=Object.keys(t);i.sort();for(const n of i)e[n]=t[n];return e}const O=t=>typeof t=="object"&&t!==null,de=t=>O(t)&&O(t.fields)&&O(t.indexes)&&O(t.relations)&&typeof t.shardMode=="string",le=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(n){return{error:`baseline is not valid JSON: ${n instanceof Error?n.message:String(n)}`,status:"invalid"}}if(!O(e)||e.version!==A||!O(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(A)})`,status:"invalid"};for(const[n,s]of Object.entries(e.tables))if(!de(s))return{error:`baseline table "${n}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof e.jurisdiction=="string"?e.jurisdiction:void 0,migrationIds:Array.isArray(e.migrationIds)?e.migrationIds:[],tables:e.tables,version:A},status:"ok"}},ce=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((i,n)=>i===e.fields[n]),J=t=>t.unique!==void 0,D=({nullable:t,optional:e,refined:i,unique:n,...s})=>JSON.stringify(re(s)),H=t=>({form:JSON.stringify([D(t),t.optional===!0,t.nullable===!0]),refined:t.refined===!0}),V=t=>t.kind==="union"&&t.members?t.members.map(e=>H(e)):[H({...t,nullable:!1,optional:!1})],me=(t,e)=>{if(e.kind!=="union")return!1;const i=V(e);return V(t).every(n=>i.some(s=>s.form===n.form&&(n.refined||!s.refined)))},x=t=>{switch(t.kind){case"array":return`array(${t.of?x(t.of):"?"})`;case"id":return`id(${t.ref??"?"})`;case"literal":return`literal(${t.literal??"?"})`;case"object":return`object({ ${Object.keys(t.fields??{}).join(", ")} })`;case"record":return`record(${t.key?x(t.key):"?"}, ${t.of?x(t.of):"?"})`;case"union":return(t.members??[]).map(e=>x(e)).join(" | ");default:return t.kind}},T=(t,e,i)=>({remediation:"backfill",scope:"table",severity:"breaking",summary:i,table:t,type:e}),q=(t,e,i)=>({remediation:"none",scope:"table",severity:"safe",summary:i,table:t,type:e}),he=(t,e,i,n,s)=>{if(!(i.kind===n.kind&&(!s||D(i)===D(n))))return s&&me(i,n)?q(t,"widenedFieldShape",`field ${t}.${e} widened: ${x(i)} → ${x(n)} — every stored value stays valid`):i.kind!==n.kind?T(t,"changedFieldKind",`field ${t}.${e} changed type: ${i.kind} → ${n.kind} — add a data migration to convert existing values`):T(t,"changedFieldShape",`field ${t}.${e} changed shape: ${x(i)} → ${x(n)} — stored values were written against the old shape; add a data migration to convert them`)},fe=(t,e,i,n)=>{const s=[];return i.unique!==n.unique&&s.push(n.unique===!0?T(t,"addedFieldConstraint",`field ${t}.${e} became unique — existing duplicates would violate it; add a data migration to de-duplicate first`):q(t,"relaxedFieldConstraint",`field ${t}.${e} is no longer unique`)),i.nullable!==n.nullable&&s.push(n.nullable===!0?q(t,"relaxedFieldConstraint",`field ${t}.${e} became nullable`):T(t,"addedFieldConstraint",`field ${t}.${e} is no longer nullable — rows holding NULL would be invalid; add a data migration to backfill them`)),i.refined!==n.refined&&s.push(n.refined===!0?T(t,"addedFieldConstraint",`field ${t}.${e} gained a validation refinement — stored values were never checked against it; add a data migration if any could fail`):q(t,"relaxedFieldConstraint",`field ${t}.${e} dropped its validation refinement`)),s},Y=(t,e,i,n)=>{const s=[],a=J(i)&&J(n),o=he(t,e,i,n,a);return o&&s.push(o),a&&s.push(...fe(t,e,i,n)),i.optional&&!n.optional?s.push({remediation:"backfill",severity:"breaking",summary:`field ${t}.${e} became required — rows missing it would be invalid; add a data migration to backfill it`,table:t,scope:"table",type:"fieldOptionalToRequired"}):!i.optional&&n.optional&&s.push({remediation:"none",scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),s},ue=(t,e,i)=>i.optional?{remediation:"none",scope:"table",severity:"safe",summary:`added optional field ${t}.${e}`,table:t,type:"addedOptionalField"}:{remediation:"backfill",severity:"breaking",summary:`added required field ${t}.${e} — existing rows have no value; add a data migration to backfill it`,table:t,scope:"table",type:"addedRequiredField"},pe=(t,e,i,n)=>{for(const[s,a]of Object.entries(i.fields)){const o=e.fields[s];o===void 0?n.push(ue(t,s,a)):n.push(...Y(t,s,o,a))}for(const s of Object.keys(e.fields))i.fields[s]===void 0&&n.push({remediation:"backfill",severity:"breaking",summary:`removed field ${t}.${s} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},ge=(t,e,i,n)=>{for(const[s,a]of Object.entries(i.indexes)){const o=e.indexes[s];if(o===void 0){n.push(a.unique?{remediation:"backfill",scope:"table",severity:"breaking",summary:`added unique index ${s} on ${t} — existing duplicates would violate it; add a data migration to de-duplicate first`,table:t,type:"addedIndex"}:{remediation:"none",scope:"table",severity:"safe",summary:`added index ${s} on ${t}`,table:t,type:"addedIndex"});continue}ce(o,a)||n.push({remediation:"code",severity:"breaking",summary:`index ${s} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const s of Object.keys(e.indexes))i.indexes[s]===void 0&&n.push({remediation:"code",severity:"breaking",summary:`removed index ${s} on ${t} — a query that used \`.withIndex("${s}")\` would break`,table:t,scope:"table",type:"removedIndex"})},be=(t,e,i,n)=>{for(const s of Object.keys(i.relations))e.relations[s]===void 0&&n.push({remediation:"none",scope:"schema",severity:"safe",summary:`added relation ${t}.${s}`,table:t,type:"addedRelation"});for(const s of Object.keys(e.relations))i.relations[s]===void 0&&n.push({remediation:"code",scope:"schema",severity:"breaking",summary:`removed relation ${t}.${s}`,table:t,type:"removedRelation"})},G="shardBy:_unknown_",F="global",ye=(t,e)=>t===F&&e.startsWith(`${F}:`)||e===F&&t.startsWith(`${F}:`),ve=(t,e,i)=>{if(e===i)return i!==G?void 0:{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} declares a non-literal .shardBy(...) key, so codegen cannot read which column partitions it — every such key records as "${G}" and two DIFFERENT keys would compare equal. Pass the shard key as a string literal; until then this is reported on every run, because the alternative is a silent pass on a re-home that strands every row (export/import is the only way back).`,table:t,type:"changedShardMode"};if(!ye(e,i))return{remediation:"rehome",severity:"breaking",summary:`table ${t} changed shard mode: ${e} → ${i} — its physical storage moves, and existing rows do NOT follow the schema; re-home them with an export/import round trip (https://lunora.sh/docs/concepts/sharding#migrating-a-populated-table)`,table:t,scope:"table",type:"changedShardMode"}},Q=t=>t.memory!==void 0,W=t=>t.after??0,w=t=>t.after===void 0?`.ttl("${t.field}")`:`.ttl("${t.field}", { after: ${String(t.after)} })`,xe=(t,e,i)=>{if(e===void 0&&i===void 0)return;const n=r=>({remediation:"backfill",scope:"table",severity:"breaking",summary:r,table:t,type:"changedTtlPolicy"}),s=r=>({remediation:"none",scope:"table",severity:"safe",summary:r,table:t,type:"changedTtlPolicy"});if(i===void 0)return s(`table ${t} dropped its TTL policy — its rows are no longer swept`);if(e===void 0)return n(`table ${t} gained a TTL policy ${w(i)} — every row already past the cutoff is deleted on the next alarm sweep; add a data migration to refresh or clear "${i.field}" on the rows written before it`);if(e.field!==i.field)return n(`table ${t} moved its TTL to a different column: ${w(e)} → ${w(i)} — rows are now expired by a column they were never written against; add a data migration to populate "${i.field}"`);const a=W(e),o=W(i);return o<a?n(`table ${t} shortened its TTL: ${w(e)} → ${w(i)} — rows that were not expired under the old offset are deleted on the next alarm sweep; add a data migration to refresh "${i.field}" on the rows that must survive`):o>a?s(`table ${t} lengthened its TTL: ${w(e)} → ${w(i)}`):void 0},ke=(t,e,i)=>{const n=[];return e.memory!==i.memory&&n.push(i.memory===!0?{remediation:"rehome",scope:"table",severity:"breaking",summary:`table ${t} became a .memory() table — every row is deleted in every shard on the next Durable Object cold start, and no data migration survives that; export the rows first if they must be kept, or revert`,table:t,type:"changedMemoryMode"}:{remediation:"none",scope:"table",severity:"safe",summary:`table ${t} is no longer a .memory() table — its rows now survive a cold start`,table:t,type:"changedMemoryMode"}),e.commitOrdered!==i.commitOrdered&&n.push(i.commitOrdered===!0?{remediation:"backfill",scope:"table",severity:"breaking",summary:`table ${t} became .commitOrdered() — rows written before it carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed never offers them; add a data migration over the table to stamp them (the rewrite allocates a sequence)`,table:t,type:"changedCommitOrdering"}:{remediation:"code",scope:"table",severity:"breaking",summary:`table ${t} is no longer .commitOrdered() — new rows carry no _commitSeq, so a \`_commitSeq > cursor\` changefeed stops advancing without erroring; update the consumers before deploying`,table:t,type:"changedCommitOrdering"}),n},$e=(t,e,i,n)=>{const s=ve(t,e.shardMode,i.shardMode);if(s&&n.push(s),Q(e)&&Q(i)){n.push(...ke(t,e,i));const a=xe(t,e.ttl,i.ttl);a&&n.push(a)}pe(t,e,i,n),ge(t,e,i,n),be(t,e,i,n)},we=(t,e)=>{const i=[],n=t?.tables??{};for(const[s,a]of Object.entries(e.tables)){const o=n[s];if(o===void 0){i.push({remediation:"none",scope:"table",severity:"safe",summary:`added table ${s}`,table:s,type:"addedTable"});continue}$e(s,o,a,i)}for(const s of Object.keys(n))e.tables[s]===void 0&&i.push({remediation:"rehome",scope:"table",severity:"breaking",summary:`removed table ${s} — its rows stay in each shard's SQLite, unreachable through the schema; export the shard first if the data must be kept`,table:s,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const s=t.jurisdiction??"(none)",a=e.jurisdiction??"(none)";i.push({remediation:"rehome",scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${s} to ${a} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:i}},B=t=>Object.entries(t.fields).map(([e,i])=>({name:e,optional:i.optional,ref:Object.values(t.relations).find(n=>n.field===e&&n.kind==="one")?.table,type:x(i)})),U=(t,e,i)=>{const n={},s=e?.fields??{},a=i?.fields??{};for(const[o,r]of Object.entries(a)){const d=s[o];d===void 0?n[o]=e===void 0?"unchanged":"added":n[o]=Y(t,o,d,r).length===0?"unchanged":"changed"}for(const o of Object.keys(s))a[o]===void 0&&(n[o]="removed");return n},Oe=(t,e)=>{const{changes:i}=we(t,e),n=new Set(i.filter(o=>o.scope==="table"&&o.table!==void 0).map(o=>o.table)),s=[],a=(o,r)=>o?"added":n.has(r)?"changed":"context";for(const[o,r]of Object.entries(e.tables)){const d=t?.tables[o],m=a(d===void 0,o);s.push({columns:B(r),fieldStatus:U(o,d,r),name:o,shardMode:r.shardMode,status:m})}for(const[o,r]of Object.entries(t?.tables??{}))e.tables[o]===void 0&&s.push({columns:B(r),fieldStatus:U(o,r,void 0),name:o,shardMode:r.shardMode,status:"removed"});return s.sort((o,r)=>o.name.localeCompare(r.name)),{breakingCount:i.filter(o=>o.severity==="breaking").length,changes:i,tables:s}},K=t=>{const e=le(t);return e.status==="ok"?e.snapshot:void 0},Se={added:"ring-2 ring-emerald-500/60",changed:"ring-2 ring-amber-500/70",context:"opacity-55",removed:"opacity-70 ring-2 ring-destructive/60"},Te=t=>t==="global"||t.startsWith("global:")?"global":"shard",je=t=>{const e=C(24),{appliedAt:i,hash:n,onSelect:s,selected:a,seq:o}=t,r=a?"border-s-primary bg-accent/60 text-foreground":"border-s-transparent text-muted-foreground hover:bg-accent/30 hover:text-foreground";let d;e[0]!==r?(d=j("flex w-full flex-col items-start gap-1 border-s-2 px-4 py-3 text-start outline-none transition-colors",r),e[0]=r,e[1]=d):d=e[1];const m=`sh-version-${n}`;let u;e[2]!==n||e[3]!==s?(u=()=>{s(n)},e[2]=n,e[3]=s,e[4]=u):u=e[4];let f;e[5]!==o?(f=y("span",{className:"font-mono text-[13px] tabular-nums",children:["v",o]}),e[5]=o,e[6]=f):f=e[6];let g;e[7]!==n?(g=n.slice(0,7),e[7]=n,e[8]=g):g=e[8];let p;e[9]!==g?(p=c("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:g}),e[9]=g,e[10]=p):p=e[10];let h;e[11]!==f||e[12]!==p?(h=y("span",{className:"flex w-full items-baseline gap-2",children:[f,p]}),e[11]=f,e[12]=p,e[13]=h):h=e[13];let b;e[14]!==i?(b=se(i),e[14]=i,e[15]=b):b=e[15];let v;e[16]!==b?(v=c("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:b}),e[16]=b,e[17]=v):v=e[17];let k;return e[18]!==v||e[19]!==d||e[20]!==m||e[21]!==u||e[22]!==h?(k=c("li",{children:y("button",{className:d,"data-testid":m,onClick:u,type:"button",children:[h,v]})}),e[18]=v,e[19]=d,e[20]=m,e[21]=u,e[22]=h,e[23]=k):k=e[23],k},Fe=t=>{const e=C(26),{breaking:i,count:n,first:s}=t,a=L();if(s){let p;e[0]!==n?(p=c("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:n}),e[0]=n,e[1]=p):p=e[1];let h;e[2]!==a?(h=a("tables"),e[2]=a,e[3]=h):h=e[3];let b;e[4]!==h?(b=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:h}),e[4]=h,e[5]=b):b=e[5];let v;return e[6]!==p||e[7]!==b?(v=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[p,b]}),e[6]=p,e[7]=b,e[8]=v):v=e[8],v}const o=i>0&&"text-destructive";let r;e[9]!==o?(r=j("text-3xl leading-none font-light tracking-tight tabular-nums",o),e[9]=o,e[10]=r):r=e[10];let d;e[11]!==n||e[12]!==r?(d=c("span",{className:r,children:n}),e[11]=n,e[12]=r,e[13]=d):d=e[13];let m;e[14]!==n||e[15]!==a?(m=a(n===1?"change":"changes"),e[14]=n,e[15]=a,e[16]=m):m=e[16];let u;e[17]!==m?(u=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:m}),e[17]=m,e[18]=u):u=e[18];let f;e[19]!==i||e[20]!==a?(f=i>0&&y("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",a("{count} breaking",{count:i})]}),e[19]=i,e[20]=a,e[21]=f):f=e[21];let g;return e[22]!==d||e[23]!==u||e[24]!==f?(g=y("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[d,u,f]}),e[22]=d,e[23]=u,e[24]=f,e[25]=g):g=e[25],g},z={addedFieldConstraint:{action:"added",kind:"constraint"},addedIndex:{action:"added",kind:"index"},addedOptionalField:{action:"added",kind:"field?"},addedRelation:{action:"added",kind:"relation"},addedRequiredField:{action:"added",kind:"field"},addedTable:{action:"added",kind:"table"},changedCommitOrdering:{action:"changed",kind:"commit ordering"},changedFieldKind:{action:"changed",kind:"field kind"},changedFieldShape:{action:"changed",kind:"field shape"},changedIndex:{action:"changed",kind:"index"},changedJurisdiction:{action:"changed",kind:"jurisdiction"},changedMemoryMode:{action:"changed",kind:"memory mode"},changedShardMode:{action:"changed",kind:"shard mode"},changedTtlPolicy:{action:"changed",kind:"TTL policy"},fieldOptionalToRequired:{action:"changed",kind:"field → required"},fieldRequiredToOptional:{action:"changed",kind:"field → optional"},relaxedFieldConstraint:{action:"removed",kind:"constraint"},removedField:{action:"removed",kind:"field"},removedIndex:{action:"removed",kind:"index"},removedRelation:{action:"removed",kind:"relation"},removedTable:{action:"removed",kind:"table"},widenedFieldShape:{action:"changed",kind:"field → wider"}},qe=(t,e)=>{const i=`${z[t.type].action} ${e} `;return t.summary.startsWith(i)?t.summary.slice(i.length):t.summary},Ce=t=>{const e=new Map;for(const n of t){const s=n.table??"",a=e.get(s);a===void 0?e.set(s,[n]):a.push(n)}const i=[...e].map(([n,s])=>({changes:s,table:n}));return[...i.filter(n=>n.table!==""),...i.filter(n=>n.table==="")]},Me=t=>{const e=C(2),{children:i}=t;let n;return e[0]!==i?(n=c("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:i}),e[0]=i,e[1]=n):n=e[1],n},Ie=({pane:t,shardKey:e=""})=>{const i=L(),n=ee(),a=te({strict:!1}).version,o=l=>{oe(n({search:{version:l},to:"/migrations"}))},r=R(E.schemaHistory,{},{shardKey:e}),d=r.data?.versions??[],m=a!==void 0&&d.some(l=>l.hash===a)?a:d[0]?.hash,u=d.findIndex(l=>l.hash===m),f=u===-1?void 0:d[u+1]?.hash,g=R(E.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),p=R(E.schemaVersion,{hash:f??""},{enabled:f!==void 0,shardKey:e}),h=I(()=>{const l=K(g.data?.version?.snapshotJson);if(l!==void 0)return Oe(K(p.data?.version?.snapshotJson),l)},[g.data,p.data]),b=I(()=>(h?.tables??[]).map(l=>({columns:l.columns,name:l.name,tier:Te(l.shardMode)})),[h]),v=I(()=>{const l={};for(const S of h?.tables??[])l[S.name]=Se[S.status];return l},[h]);if(r.error!==null)return c(ie,{error:r.errorSource,testId:"sh-error"});if(d.length===0)return c(ne,{description:i("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:i("No schema versions recorded yet.")});const k=h?.changes??[];return y("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[y("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[c(Me,{children:i("Schema versions")}),c("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:d.map(l=>c(je,{appliedAt:l.appliedAt,hash:l.hash,onSelect:o,selected:l.hash===m,seq:l.seq},l.hash))})]}),y("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[c(Fe,{breaking:h?.breakingCount??0,count:f===void 0?b.length:k.length,first:f===void 0}),t==="diagram"?c("div",{className:"flex min-h-0 flex-1 flex-col",children:c(ae,{fill:!0,nodeClasses:v,tables:b,testIdPrefix:"sh"})}):c("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:Ce(k).map(l=>{const S=(h?.tables??[]).find($=>$.name===l.table);return y("section",{className:"mb-6",children:[y("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[c("span",{className:"font-mono text-[13px] text-foreground",children:l.table===""?i("schema"):l.table}),S!==void 0&&c("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:i("{count} columns",{count:S.columns.length})}),l.changes.length>1&&c("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:l.changes.length})]}),c("ul",{children:l.changes.map($=>{const{action:X,kind:P}=z[$.type],M=$.severity==="breaking",_=qe($,P);return y("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[c("span",{"aria-hidden":"true",className:j("-ms-3 h-3 w-0.5 shrink-0 self-center",M?"bg-destructive":"bg-transparent")}),y("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[i(X)," ",P]}),_!==l.table&&c("span",{className:j("min-w-0 font-mono text-[13px]",M?"text-destructive":"text-foreground"),children:_}),M&&c("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:i("breaking")})]},`${$.type}-${$.summary}`)})})]},l.table)})})]})]})},Re=t=>j("-mb-px border-b-2 px-3 py-2.5 font-mono text-[11px] tracking-wider uppercase transition-colors outline-none","hover:bg-accent/40 focus-visible:bg-accent/40",t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),Ue=t=>{const e=C(11),{initialShardKey:i}=t,n=L(),[s,a]=Z("diagram");let o;e[0]!==s?(o=(f,g,p,h)=>y("button",{"aria-selected":s===f,className:Re(s===f),"data-testid":p,onClick:()=>{a(f)},role:"tab",type:"button",children:[g,h!==void 0&&c("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:h})]}),e[0]=s,e[1]=o):o=e[1];const r=o;let d;e[2]!==n||e[3]!==r?(d=y("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[r("diagram",n("Diagram"),"mg-pane-diagram"),r("changes",n("Changes"),"mg-pane-changes"),r("data",n("Data migrations"),"mg-pane-data")]}),e[2]=n,e[3]=r,e[4]=d):d=e[4];let m;e[5]!==i||e[6]!==s?(m=c("div",{className:"flex min-h-0 flex-1 flex-col",children:s==="data"?c("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:c(N,{initialShardKey:i})}):c(Ie,{pane:s,shardKey:i})}),e[5]=i,e[6]=s,e[7]=m):m=e[7];let u;return e[8]!==d||e[9]!==m?(u=y("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[d,m]}),e[8]=d,e[9]=m,e[10]=u):u=e[10],u};export{Ue as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as G}from"react/compiler-runtime";import{useLunora as Ve}from"@lunora/react";import{useState as M}from"react";import{ConfirmButton as Ye}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{E as Xe}from"../packem_shared/error-alert-DueSEkt-.mjs";import{A as Ke}from"../packem_shared/alert-PB5W11MM.mjs";import{B as ve}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as we}from"../packem_shared/button-q0UYSmrn.mjs";import{C as $e,a as Oe}from"../packem_shared/card-By2O8ULa.mjs";import{E as Qe}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as Ze}from"../packem_shared/input-CXhxesPC.mjs";import{S as et}from"../packem_shared/scroll-area-CXCQH7VT.mjs";import{T as ke,a as Ue,b as oe,c as _,d as Je,e as T}from"../packem_shared/table-D0SBiDu-.mjs";import{T as tt}from"../packem_shared/textarea--40GKAyz.mjs";import{u as Be}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useAutoRefresh as st}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{useT as P}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as W}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{d as _e,b as Te,c as Ae,f as Ce,h as at,j as rt}from"../packem_shared/internal-Df43vQI0.mjs";import{jsx as s,jsxs as q,Fragment as Fe}from"react/jsx-runtime";const nt=(n,e)=>{const t=new Set(n.map(a=>a.deadLetterQueue).filter(a=>typeof a=="string"&&a!=="")),i=n.filter(a=>(a.deadLetterQueue===void 0||a.deadLetterQueue==="")&&!t.has(a.name)),l=e.filter(a=>a.deadLettered).length;return{deadLetteredCount:l,queuesWithoutDlq:i,showReliabilityWarning:i.length>0||l>0}},ot=200,lt=Ae(W.sendQueueMessage),dt=Ae(W.replayQueueMessage),it=Ae(W.clearQueueMessages),Re=96,ct=n=>{if(n===void 0)return"—";try{return JSON.stringify(n,rt)}catch{return"[unserializable]"}},ut=n=>n.length>Re?`${n.slice(0,Re)}…`:n,mt=n=>n==="error"?"destructive":n==="retry"?"outline":"secondary",ft=(n,e)=>e(n==="messages"?"Messages":n==="send"?"Send":"Declared"),ht=n=>{const e=G(11),{loaded:t,queues:i}=n,l=P();let a;e[0]!==l?(a=l("Queues are declared in code with defineQueue. Enqueue from a mutation or action with ctx.queues.<name>.send(...); push consumers process batches in the worker."),e[0]=l,e[1]=a):a=e[1];let o;e[2]!==a?(o=s("p",{className:"text-sm text-muted-foreground",children:a}),e[2]=a,e[3]=o):o=e[3];let r;e[4]!==t||e[5]!==i||e[6]!==l?(r=t&&i.length===0?s(Qe,{description:l("No defineQueue is declared in lunora/queues.ts in this deployment. Add one to offload async work to a Cloudflare Queue."),testId:"queues-empty",title:l("No queues defined")}):s($e,{className:"overflow-hidden py-0",children:s(Oe,{className:"px-0",children:q(ke,{"data-testid":"queues-table",children:[s(Ue,{children:q(oe,{children:[s(_,{children:l("Export")}),s(_,{children:l("Queue")}),s(_,{children:l("Mode")}),s(_,{children:l("Binding")}),s(_,{children:l("Dead-letter")})]})}),s(Je,{children:i.map(yt)})]})})}),e[4]=t,e[5]=i,e[6]=l,e[7]=r):r=e[7];let f;return e[8]!==o||e[9]!==r?(f=q("div",{className:"flex flex-col gap-4","data-testid":"queues-declared",children:[o,r]}),e[8]=o,e[9]=r,e[10]=f):f=e[10],f},pt=n=>{const e=G(67),{message:t,onReplay:i,replayingId:l}=n,a=P();let o,r,f,u,g,y,x,d,m,p;if(e[0]!==t.attempts||e[1]!==t.body||e[2]!==t.deadLettered||e[3]!==t.exportName||e[4]!==t.id||e[5]!==t.messageId||e[6]!==t.outcome||e[7]!==t.queue||e[8]!==a){const U=ct(t.body);r=oe,y=`queues-message-${t.id}`;const J=t.exportName??t.queue;e[19]!==J?(x=s(T,{className:"font-mono text-xs",children:J}),e[19]=J,e[20]=x):x=e[20],e[21]!==t.messageId?(d=s(T,{className:"max-w-[16ch] truncate font-mono text-xs text-muted-foreground",title:t.messageId,children:t.messageId}),e[21]=t.messageId,e[22]=d):d=e[22],e[23]!==t.attempts?(m=s(T,{className:"font-mono text-xs tabular-nums",children:t.attempts}),e[23]=t.attempts,e[24]=m):m=e[24];const A=`queues-outcome-${t.id}`;let I;e[25]!==t.outcome?(I=mt(t.outcome),e[25]=t.outcome,e[26]=I):I=e[26];let C;e[27]!==t.outcome||e[28]!==A||e[29]!==I?(C=s(ve,{"data-testid":A,variant:I,children:t.outcome}),e[27]=t.outcome,e[28]=A,e[29]=I,e[30]=C):C=e[30];let L;e[31]!==t.deadLettered||e[32]!==t.id||e[33]!==a?(L=t.deadLettered&&s(ve,{"data-testid":`queues-dlq-${t.id}`,variant:"destructive",children:a("DLQ")}),e[31]=t.deadLettered,e[32]=t.id,e[33]=a,e[34]=L):L=e[34],e[35]!==C||e[36]!==L?(p=s(T,{children:q("span",{className:"inline-flex items-center gap-1",children:[C,L]})}),e[35]=C,e[36]=L,e[37]=p):p=e[37],o=T,f="max-w-[32ch] truncate font-mono text-xs text-muted-foreground",u=U,g=ut(U),e[0]=t.attempts,e[1]=t.body,e[2]=t.deadLettered,e[3]=t.exportName,e[4]=t.id,e[5]=t.messageId,e[6]=t.outcome,e[7]=t.queue,e[8]=a,e[9]=o,e[10]=r,e[11]=f,e[12]=u,e[13]=g,e[14]=y,e[15]=x,e[16]=d,e[17]=m,e[18]=p}else o=e[9],r=e[10],f=e[11],u=e[12],g=e[13],y=e[14],x=e[15],d=e[16],m=e[17],p=e[18];let h;e[38]!==o||e[39]!==f||e[40]!==u||e[41]!==g?(h=s(o,{className:f,title:u,children:g}),e[38]=o,e[39]=f,e[40]=u,e[41]=g,e[42]=h):h=e[42];let N;e[43]!==t.capturedAt?(N=at(t.capturedAt,"—"),e[43]=t.capturedAt,e[44]=N):N=e[44];let b;e[45]!==N?(b=s(T,{className:"text-xs text-muted-foreground tabular-nums",children:N}),e[45]=N,e[46]=b):b=e[46];const E=`queues-replay-${t.id}`,Q=l!==null;let v;e[47]!==t.id||e[48]!==l||e[49]!==a?(v=l===t.id?a("Replaying…"):a("Replay"),e[47]=t.id,e[48]=l,e[49]=a,e[50]=v):v=e[50];let w;e[51]!==t.id||e[52]!==i||e[53]!==E||e[54]!==Q||e[55]!==v?(w=s(T,{children:s(we,{"data-id":t.id,"data-testid":E,disabled:Q,onClick:i,size:"xs",type:"button",variant:"outline",children:v})}),e[51]=t.id,e[52]=i,e[53]=E,e[54]=Q,e[55]=v,e[56]=w):w=e[56];let D;return e[57]!==r||e[58]!==b||e[59]!==w||e[60]!==y||e[61]!==x||e[62]!==d||e[63]!==m||e[64]!==p||e[65]!==h?(D=q(r,{"data-testid":y,children:[x,d,m,p,h,b,w]}),e[57]=r,e[58]=b,e[59]=w,e[60]=y,e[61]=x,e[62]=d,e[63]=m,e[64]=p,e[65]=h,e[66]=D):D=e[66],D},gt=n=>{const e=G(29),{hasError:t,messages:i,onClear:l,onReplay:a,replayingId:o}=n,r=P();let f;e[0]!==r?(f=r("Cloudflare Queues have no peek API, so this is what push consumers actually processed — not pending depth."),e[0]=r,e[1]=f):f=e[1];let u;e[2]!==f?(u=s("p",{className:"text-sm text-muted-foreground",children:f}),e[2]=f,e[3]=u):u=e[3];let g;e[4]!==r?(g=r("Clear the whole message log?"),e[4]=r,e[5]=g):g=e[5];const y=i.length===0;let x;e[6]!==r?(x=r("Clear log"),e[6]=r,e[7]=x):x=e[7];let d;e[8]!==l||e[9]!==g||e[10]!==y||e[11]!==x?(d=s("div",{className:"ml-auto",children:s(Ye,{confirmLabel:g,disabled:y,onConfirm:l,testId:"queues-clear",children:x})}),e[8]=l,e[9]=g,e[10]=y,e[11]=x,e[12]=d):d=e[12];let m;e[13]!==i.length||e[14]!==r?(m=i.length>0&&s(ve,{"data-testid":"queues-count",variant:"secondary",children:r("{count} messages",{count:i.length})}),e[13]=i.length,e[14]=r,e[15]=m):m=e[15];let p;e[16]!==u||e[17]!==d||e[18]!==m?(p=q("div",{className:"flex flex-wrap items-center gap-2",children:[u,d,m]}),e[16]=u,e[17]=d,e[18]=m,e[19]=p):p=e[19];let h;e[20]!==t||e[21]!==i||e[22]!==a||e[23]!==o||e[24]!==r?(h=!t&&i.length===0?s(Qe,{description:r("Consumed messages appear here once a push consumer processes a batch in dev. Send one from the Send tab to see it captured."),testId:"queues-messages-empty",title:r("No consumed messages yet.")}):s($e,{className:"overflow-hidden py-0",children:s(Oe,{className:"px-0",children:s(et,{className:"max-h-[32rem]","data-testid":"queues-messages-scroll",children:q(ke,{"data-testid":"queues-messages-table",children:[s(Ue,{children:q(oe,{children:[s(_,{children:r("Export")}),s(_,{children:r("Message")}),s(_,{children:r("Attempts")}),s(_,{children:r("Outcome")}),s(_,{children:r("Body")}),s(_,{children:r("Captured")}),s(_,{})]})}),s(Je,{children:i.map(b=>s(pt,{message:b,onReplay:a,replayingId:o},b.id))})]})})})}),e[20]=t,e[21]=i,e[22]=a,e[23]=o,e[24]=r,e[25]=h):h=e[25];let N;return e[26]!==p||e[27]!==h?(N=q("div",{className:"flex flex-col gap-4","data-testid":"queues-messages",children:[p,h]}),e[26]=p,e[27]=h,e[28]=N):N=e[28],N},xt=n=>{const e=G(20),{batchMode:t,bodyText:i,delayText:l,onBatchModeChange:a,onBodyChange:o,onDelayChange:r,onSelectExport:f,onSend:u,queues:g,selectedExportName:y,sending:x}=n,d=P();let m;e[0]!==d?(m=d("Enqueue a JSON message to a declared producer to exercise its consumer. Nothing is captured until the consumer processes it."),e[0]=d,e[1]=m):m=e[1];let p;e[2]!==m?(p=s("p",{className:"text-sm text-muted-foreground",children:m}),e[2]=m,e[3]=p):p=e[3];let h;e[4]!==t||e[5]!==i||e[6]!==l||e[7]!==a||e[8]!==o||e[9]!==r||e[10]!==f||e[11]!==u||e[12]!==g||e[13]!==y||e[14]!==x||e[15]!==d?(h=g.length===0?s(Qe,{description:d("Declare a queue with defineQueue in lunora/queues.ts to enqueue a test message."),testId:"queues-send-empty",title:d("No queues to send to")}):q(Fe,{children:[q("div",{className:"flex flex-wrap items-center gap-2",children:[s("select",{"aria-label":d("Queue"),className:"h-8 rounded-md border border-input bg-transparent px-2.5 py-1 text-xs outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50","data-testid":"queues-send-select",onChange:f,value:y,children:g.map(bt)}),s(Ze,{"aria-label":d("Delay (seconds)"),className:"max-w-36","data-testid":"queues-send-delay",min:0,onChange:r,placeholder:d("Delay (s)"),type:"number",value:l}),q("label",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"queues-send-batch",children:[s("input",{checked:t,"data-testid":"queues-send-batch",id:"queues-send-batch",onChange:a,type:"checkbox"}),d("Send as batch (JSON array)")]}),s(we,{className:"ml-auto","data-testid":"queues-send-button",disabled:x||y==="",onClick:u,type:"button",children:d(x?"Sending…":"Send message")})]}),s(tt,{"aria-label":d("Message body (JSON)"),className:"font-mono","data-testid":"queues-send-body",onChange:o,placeholder:t?'[ { "hello": "world" } ]':'{ "hello": "world" }',value:i})]}),e[4]=t,e[5]=i,e[6]=l,e[7]=a,e[8]=o,e[9]=r,e[10]=f,e[11]=u,e[12]=g,e[13]=y,e[14]=x,e[15]=d,e[16]=h):h=e[16];let N;return e[17]!==p||e[18]!==h?(N=q("div",{className:"flex flex-col gap-3","data-testid":"queues-send",children:[p,h]}),e[17]=p,e[18]=h,e[19]=N):N=e[19],N},jt=n=>{const e=G(59),{limit:t}=n,i=t??ot,l=Ve(),a=P(),[o,r]=M("declared"),[f,u]=M(null);let g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g={},e[0]=g):g=e[0];const{data:y,error:x,errorSource:d}=Be(W.listQueues,g);let m;e[1]!==i?(m={limit:i},e[1]=i,e[2]=m):m=e[2];const{data:p,error:h,errorSource:N,refetch:b}=Be(W.getQueueMessages,m),E=Array.isArray(y?.queues)?[...y.queues].toSorted(Nt):[],Q=p?.entries??[],{deadLetteredCount:v,queuesWithoutDlq:w,showReliabilityWarning:D}=nt(E,Q),[U,J]=M(""),[A,I]=M(""),[C,L]=M(""),[F,je]=M(!1),[le,Ie]=M(!1),[de,Le]=M(null),z=E.some(c=>c.exportName===U)?U:E[0]?.exportName??"",Me=o==="messages"?h:x,We=o==="messages"?N:d,ie=Me??f,ce=Me===null?f:We;let H;e[3]!==b?(H=()=>{b()},e[3]=b,e[4]=H):H=e[4],st(H,o==="messages");const ue=async()=>{u(null);const c=z;if(c==="")return;let S=null;const Se=A.trim();if(Se!=="")try{S=JSON.parse(Se)}catch{u(a("Body must be valid JSON."));return}let Ee;const De=C.trim();if(De!==""){const j=Number(De);if(!Number.isFinite(j)||j<0){u(a("Delay must be a non-negative number of seconds."));return}Ee=j}if(F&&!Array.isArray(S)){u(a("Batch mode needs a JSON array body — each element is enqueued as one message."));return}Ie(!0);const He=F?{batch:S,delaySeconds:Ee,exportName:c}:{body:S,delaySeconds:Ee,exportName:c};try{await l.query(lt,He,_e("")),b()}catch(j){u(Te(j))}Ie(!1)};let V;e[5]!==l||e[6]!==b?(V=async c=>{u(null),Le(c);try{await l.query(dt,{id:c},_e("")),b()}catch(S){u(Te(S))}Le(null)},e[5]=l,e[6]=b,e[7]=V):V=e[7];const me=V;let Y;e[8]!==l||e[9]!==b?(Y=async()=>{u(null);try{await l.query(it,{},_e("")),b()}catch(c){u(Te(c))}},e[8]=l,e[9]=b,e[10]=Y):Y=e[10];const fe=Y;let X;e[11]===Symbol.for("react.memo_cache_sentinel")?(X=c=>{const S=c.currentTarget.dataset.tab;(S==="declared"||S==="messages"||S==="send")&&r(S)},e[11]=X):X=e[11];const Ge=X;let K;e[12]===Symbol.for("react.memo_cache_sentinel")?(K=c=>{J(c.currentTarget.value)},e[12]=K):K=e[12];const he=K;let Z;e[13]===Symbol.for("react.memo_cache_sentinel")?(Z=c=>{I(c.currentTarget.value)},e[13]=Z):Z=e[13];const pe=Z;let ee;e[14]===Symbol.for("react.memo_cache_sentinel")?(ee=c=>{L(c.currentTarget.value)},e[14]=ee):ee=e[14];const ge=ee;let te;e[15]===Symbol.for("react.memo_cache_sentinel")?(te=c=>{je(c.currentTarget.checked)},e[15]=te):te=e[15];const xe=te;let se;e[16]!==ue?(se=()=>{Ce(ue())},e[16]=ue,e[17]=se):se=e[17];const ye=se;let ae;e[18]!==me?(ae=c=>{const{id:S}=c.currentTarget.dataset;S!==void 0&&Ce(me(S))},e[18]=me,e[19]=ae):ae=e[19];const be=ae;let re;e[20]!==fe?(re=()=>{Ce(fe())},e[20]=fe,e[21]=re):re=e[21];const Ne=re,Pe="flex flex-col gap-6",ze="lunora-queues-panel";let B;e[22]!==a||e[23]!==o?(B=s("div",{className:"flex items-center gap-1","data-testid":"queues-tabs",role:"tablist",children:["declared","messages","send"].map(c=>s(we,{"aria-selected":o===c,"data-tab":c,"data-testid":`queues-tab-${c}`,onClick:Ge,role:"tab",size:"sm",type:"button",variant:o===c?"secondary":"ghost",children:ft(c,a)},c))}),e[22]=a,e[23]=o,e[24]=B):B=e[24];let R;e[25]!==ie||e[26]!==ce?(R=ie!==null&&s(Xe,{error:ce,testId:"queues-error"}),e[25]=ie,e[26]=ce,e[27]=R):R=e[27];const qe=D&&s(Ke,{icon:s("span",{"aria-hidden":"true",className:"text-base leading-none",children:"⚠"}),testId:"queues-dlq-warning",variant:"warning",children:q("div",{className:"flex flex-col gap-1",children:[w.length>0&&q(Fe,{children:[s("p",{className:"font-medium",children:a("No dead-letter queue on {queues}.",{queues:w.map(qt).join(", ")})}),s("p",{className:"text-muted-foreground",children:a("Exhausted messages are dropped after retries. Add a deadLetterQueue to capture them.")})]}),v>0&&s("p",{className:w.length>0?"text-muted-foreground":"font-medium",children:v===1?a("1 message was recently dead-lettered."):a("{count} messages were recently dead-lettered.",{count:v})})]})});let $;e[28]!==E||e[29]!==y||e[30]!==o?($=o==="declared"&&s(ht,{loaded:y!==void 0,queues:E}),e[28]=E,e[29]=y,e[30]=o,e[31]=$):$=e[31];let O;e[32]!==Q||e[33]!==h||e[34]!==Ne||e[35]!==be||e[36]!==de||e[37]!==o?(O=o==="messages"&&s(gt,{hasError:h!==null,messages:Q,onClear:Ne,onReplay:be,replayingId:de}),e[32]=Q,e[33]=h,e[34]=Ne,e[35]=be,e[36]=de,e[37]=o,e[38]=O):O=e[38];let k;e[39]!==F||e[40]!==A||e[41]!==C||e[42]!==xe||e[43]!==pe||e[44]!==ge||e[45]!==he||e[46]!==ye||e[47]!==E||e[48]!==z||e[49]!==le||e[50]!==o?(k=o==="send"&&s(xt,{batchMode:F,bodyText:A,delayText:C,onBatchModeChange:xe,onBodyChange:pe,onDelayChange:ge,onSelectExport:he,onSend:ye,queues:E,selectedExportName:z,sending:le}),e[39]=F,e[40]=A,e[41]=C,e[42]=xe,e[43]=pe,e[44]=ge,e[45]=he,e[46]=ye,e[47]=E,e[48]=z,e[49]=le,e[50]=o,e[51]=k):k=e[51];let ne;return e[52]!==B||e[53]!==R||e[54]!==qe||e[55]!==$||e[56]!==O||e[57]!==k?(ne=q("div",{className:Pe,"data-testid":ze,children:[B,R,qe,$,O,k]}),e[52]=B,e[53]=R,e[54]=qe,e[55]=$,e[56]=O,e[57]=k,e[58]=ne):ne=e[58],ne};function yt(n){return q(oe,{"data-testid":`queues-row-${n.exportName}`,children:[s(T,{className:"font-mono text-xs",children:n.exportName}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.name}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.mode}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.binding}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.deadLetterQueue??"—"})]},n.exportName)}function bt(n){return s("option",{value:n.exportName,children:n.exportName},n.exportName)}function Nt(n,e){return n.exportName.localeCompare(e.exportName)}function qt(n){return n.name}export{jt as default};
|
|
1
|
+
import{c as U}from"react/compiler-runtime";import{useLunora as et}from"@lunora/react";import{useState as R,Fragment as tt}from"react";import{ConfirmButton as st}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{E as at}from"../packem_shared/error-alert-DueSEkt-.mjs";import{A as rt}from"../packem_shared/alert-PB5W11MM.mjs";import{B as Te}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as ve}from"../packem_shared/button-q0UYSmrn.mjs";import{C as ke,a as Fe}from"../packem_shared/card-By2O8ULa.mjs";import{E as we}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as nt}from"../packem_shared/input-CXhxesPC.mjs";import{S as ot}from"../packem_shared/scroll-area-CXCQH7VT.mjs";import{T as Ue,a as je,b as W,c as _,d as Je,e as T}from"../packem_shared/table-D0SBiDu-.mjs";import{T as lt}from"../packem_shared/textarea--40GKAyz.mjs";import{u as $e}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useAutoRefresh as it}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{useT as z}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as G}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{f as Ee,b as oe,d as _e,c as Qe,h as ct,j as dt}from"../packem_shared/internal-Df43vQI0.mjs";import{jsx as s,jsxs as N,Fragment as Pe}from"react/jsx-runtime";const ut=(a,e)=>{const t=new Set(a.map(r=>r.deadLetterQueue).filter(r=>typeof r=="string"&&r!=="")),i=a.filter(r=>(r.deadLetterQueue===void 0||r.deadLetterQueue==="")&&!t.has(r.name)),o=e.filter(r=>r.deadLettered).length;return{deadLetteredCount:o,queuesWithoutDlq:i,showReliabilityWarning:i.length>0||o>0}},Ce="topic:",Ae=a=>{const e=[],t=new Map;for(const i of a)i.topic===void 0?e.push(i):t.set(i.topic,[...t.get(i.topic)??[],i]);return{plain:e,topics:t}},We=a=>`${Ce}${a}`,mt=(a,e)=>a.startsWith(Ce)?(e.get(a.slice(Ce.length))??[]).map(t=>t.exportName):[a],pt=200,ft=Qe(G.sendQueueMessage),ht=async(a,e,t)=>{const o=(await Promise.allSettled(e.map(async n=>a.query(ft,n,_e(""))))).flatMap((n,l)=>n.status==="rejected"?[{exportName:e[l]?.exportName??"",message:oe(n.reason)}]:[]),[r]=o;return r===void 0?null:e.length===1?r.message:t("Not sent to {failed}",{failed:o.map(n=>`${n.exportName}: ${n.message}`).join("; ")})},gt=Qe(G.replayQueueMessage),xt=Qe(G.clearQueueMessages),Oe=96,yt=a=>{if(a===void 0)return"—";try{return JSON.stringify(a,dt)}catch{return"[unserializable]"}},bt=a=>a.length>Oe?`${a.slice(0,Oe)}…`:a,Nt=a=>a==="error"?"destructive":a==="retry"?"outline":"secondary",qt=(a,e)=>e(a==="messages"?"Messages":a==="send"?"Send":"Declared"),Ge=a=>{const e=U(17),{queue:t}=a,i=`queues-row-${t.exportName}`;let o;e[0]!==t.exportName?(o=s(T,{className:"font-mono text-xs",children:t.exportName}),e[0]=t.exportName,e[1]=o):o=e[1];let r;e[2]!==t.name?(r=s(T,{className:"font-mono text-xs text-muted-foreground",children:t.name}),e[2]=t.name,e[3]=r):r=e[3];let n;e[4]!==t.mode?(n=s(T,{className:"font-mono text-xs text-muted-foreground",children:t.mode}),e[4]=t.mode,e[5]=n):n=e[5];let l;e[6]!==t.binding?(l=s(T,{className:"font-mono text-xs text-muted-foreground",children:t.binding}),e[6]=t.binding,e[7]=l):l=e[7];const u=t.deadLetterQueue??"—";let c;e[8]!==u?(c=s(T,{className:"font-mono text-xs text-muted-foreground",children:u}),e[8]=u,e[9]=c):c=e[9];let m;return e[10]!==i||e[11]!==o||e[12]!==r||e[13]!==n||e[14]!==l||e[15]!==c?(m=N(W,{"data-testid":i,children:[o,r,n,l,c]}),e[10]=i,e[11]=o,e[12]=r,e[13]=n,e[14]=l,e[15]=c,e[16]=m):m=e[16],m},St=a=>{const e=U(8),{loaded:t,queues:i}=a,o=z();let r;if(e[0]!==t||e[1]!==i||e[2]!==o){const{plain:n,topics:l}=Ae(i);let u;e[4]!==o?(u=o("Queues are declared in code with defineQueue. Enqueue from a mutation or action with ctx.queues.<name>.send(...); push consumers process batches in the worker."),e[4]=o,e[5]=u):u=e[5];let c;e[6]!==u?(c=s("p",{className:"text-sm text-muted-foreground",children:u}),e[6]=u,e[7]=c):c=e[7],r=N("div",{className:"flex flex-col gap-4","data-testid":"queues-declared",children:[c,t&&i.length===0?s(we,{description:o("No defineQueue is declared in lunora/queues.ts in this deployment. Add one to offload async work to a Cloudflare Queue."),testId:"queues-empty",title:o("No queues defined")}):s(ke,{className:"overflow-hidden py-0",children:s(Fe,{className:"px-0",children:N(Ue,{"data-testid":"queues-table",children:[s(je,{children:N(W,{children:[s(_,{children:o("Export")}),s(_,{children:o("Queue")}),s(_,{children:o("Mode")}),s(_,{children:o("Binding")}),s(_,{children:o("Dead-letter")})]})}),N(Je,{children:[n.map(Ct),[...l].map(m=>{const[h,g]=m;return N(tt,{children:[s(W,{className:"bg-muted/40","data-testid":`queues-topic-${h}`,children:s(T,{className:"text-xs font-medium",colSpan:5,children:o("Topic {topic} · {count} subscriptions",{count:g.length,topic:h})})}),g.map(vt)]},h)})]})]})})})]}),e[0]=t,e[1]=i,e[2]=o,e[3]=r}else r=e[3];return r},Et=a=>{const e=U(67),{message:t,onReplay:i,replayingId:o}=a,r=z();let n,l,u,c,m,h,g,d,p,y;if(e[0]!==t.attempts||e[1]!==t.body||e[2]!==t.deadLettered||e[3]!==t.exportName||e[4]!==t.id||e[5]!==t.messageId||e[6]!==t.outcome||e[7]!==t.queue||e[8]!==r){const j=yt(t.body);l=W,h=`queues-message-${t.id}`;const J=t.exportName??t.queue;e[19]!==J?(g=s(T,{className:"font-mono text-xs",children:J}),e[19]=J,e[20]=g):g=e[20],e[21]!==t.messageId?(d=s(T,{className:"max-w-[16ch] truncate font-mono text-xs text-muted-foreground",title:t.messageId,children:t.messageId}),e[21]=t.messageId,e[22]=d):d=e[22],e[23]!==t.attempts?(p=s(T,{className:"font-mono text-xs tabular-nums",children:t.attempts}),e[23]=t.attempts,e[24]=p):p=e[24];const A=`queues-outcome-${t.id}`;let I;e[25]!==t.outcome?(I=Nt(t.outcome),e[25]=t.outcome,e[26]=I):I=e[26];let C;e[27]!==t.outcome||e[28]!==A||e[29]!==I?(C=s(Te,{"data-testid":A,variant:I,children:t.outcome}),e[27]=t.outcome,e[28]=A,e[29]=I,e[30]=C):C=e[30];let M;e[31]!==t.deadLettered||e[32]!==t.id||e[33]!==r?(M=t.deadLettered&&s(Te,{"data-testid":`queues-dlq-${t.id}`,variant:"destructive",children:r("DLQ")}),e[31]=t.deadLettered,e[32]=t.id,e[33]=r,e[34]=M):M=e[34],e[35]!==C||e[36]!==M?(y=s(T,{children:N("span",{className:"inline-flex items-center gap-1",children:[C,M]})}),e[35]=C,e[36]=M,e[37]=y):y=e[37],n=T,u="max-w-[32ch] truncate font-mono text-xs text-muted-foreground",c=j,m=bt(j),e[0]=t.attempts,e[1]=t.body,e[2]=t.deadLettered,e[3]=t.exportName,e[4]=t.id,e[5]=t.messageId,e[6]=t.outcome,e[7]=t.queue,e[8]=r,e[9]=n,e[10]=l,e[11]=u,e[12]=c,e[13]=m,e[14]=h,e[15]=g,e[16]=d,e[17]=p,e[18]=y}else n=e[9],l=e[10],u=e[11],c=e[12],m=e[13],h=e[14],g=e[15],d=e[16],p=e[17],y=e[18];let x;e[38]!==n||e[39]!==u||e[40]!==c||e[41]!==m?(x=s(n,{className:u,title:c,children:m}),e[38]=n,e[39]=u,e[40]=c,e[41]=m,e[42]=x):x=e[42];let q;e[43]!==t.capturedAt?(q=ct(t.capturedAt,"—"),e[43]=t.capturedAt,e[44]=q):q=e[44];let b;e[45]!==q?(b=s(T,{className:"text-xs text-muted-foreground tabular-nums",children:q}),e[45]=q,e[46]=b):b=e[46];const S=`queues-replay-${t.id}`,v=o!==null;let w;e[47]!==t.id||e[48]!==o||e[49]!==r?(w=o===t.id?r("Replaying…"):r("Replay"),e[47]=t.id,e[48]=o,e[49]=r,e[50]=w):w=e[50];let Q;e[51]!==t.id||e[52]!==i||e[53]!==S||e[54]!==v||e[55]!==w?(Q=s(T,{children:s(ve,{"data-id":t.id,"data-testid":S,disabled:v,onClick:i,size:"xs",type:"button",variant:"outline",children:w})}),e[51]=t.id,e[52]=i,e[53]=S,e[54]=v,e[55]=w,e[56]=Q):Q=e[56];let B;return e[57]!==l||e[58]!==b||e[59]!==Q||e[60]!==h||e[61]!==g||e[62]!==d||e[63]!==p||e[64]!==y||e[65]!==x?(B=N(l,{"data-testid":h,children:[g,d,p,y,x,b,Q]}),e[57]=l,e[58]=b,e[59]=Q,e[60]=h,e[61]=g,e[62]=d,e[63]=p,e[64]=y,e[65]=x,e[66]=B):B=e[66],B},Tt=a=>{const e=U(29),{hasError:t,messages:i,onClear:o,onReplay:r,replayingId:n}=a,l=z();let u;e[0]!==l?(u=l("Cloudflare Queues have no peek API, so this is what push consumers actually processed — not pending depth."),e[0]=l,e[1]=u):u=e[1];let c;e[2]!==u?(c=s("p",{className:"text-sm text-muted-foreground",children:u}),e[2]=u,e[3]=c):c=e[3];let m;e[4]!==l?(m=l("Clear the whole message log?"),e[4]=l,e[5]=m):m=e[5];const h=i.length===0;let g;e[6]!==l?(g=l("Clear log"),e[6]=l,e[7]=g):g=e[7];let d;e[8]!==o||e[9]!==m||e[10]!==h||e[11]!==g?(d=s("div",{className:"ml-auto",children:s(st,{confirmLabel:m,disabled:h,onConfirm:o,testId:"queues-clear",children:g})}),e[8]=o,e[9]=m,e[10]=h,e[11]=g,e[12]=d):d=e[12];let p;e[13]!==i.length||e[14]!==l?(p=i.length>0&&s(Te,{"data-testid":"queues-count",variant:"secondary",children:l("{count} messages",{count:i.length})}),e[13]=i.length,e[14]=l,e[15]=p):p=e[15];let y;e[16]!==c||e[17]!==d||e[18]!==p?(y=N("div",{className:"flex flex-wrap items-center gap-2",children:[c,d,p]}),e[16]=c,e[17]=d,e[18]=p,e[19]=y):y=e[19];let x;e[20]!==t||e[21]!==i||e[22]!==r||e[23]!==n||e[24]!==l?(x=!t&&i.length===0?s(we,{description:l("Consumed messages appear here once a push consumer processes a batch in dev. Send one from the Send tab to see it captured."),testId:"queues-messages-empty",title:l("No consumed messages yet.")}):s(ke,{className:"overflow-hidden py-0",children:s(Fe,{className:"px-0",children:s(ot,{className:"max-h-[32rem]","data-testid":"queues-messages-scroll",children:N(Ue,{"data-testid":"queues-messages-table",children:[s(je,{children:N(W,{children:[s(_,{children:l("Export")}),s(_,{children:l("Message")}),s(_,{children:l("Attempts")}),s(_,{children:l("Outcome")}),s(_,{children:l("Body")}),s(_,{children:l("Captured")}),s(_,{})]})}),s(Je,{children:i.map(b=>s(Et,{message:b,onReplay:r,replayingId:n},b.id))})]})})})}),e[20]=t,e[21]=i,e[22]=r,e[23]=n,e[24]=l,e[25]=x):x=e[25];let q;return e[26]!==y||e[27]!==x?(q=N("div",{className:"flex flex-col gap-4","data-testid":"queues-messages",children:[y,x]}),e[26]=y,e[27]=x,e[28]=q):q=e[28],q},_t=a=>{const e=U(20),{batchMode:t,bodyText:i,delayText:o,onBatchModeChange:r,onBodyChange:n,onDelayChange:l,onSelectExport:u,onSend:c,queues:m,selectedExportName:h,sending:g}=a,d=z();let p;e[0]!==d?(p=d("Enqueue a JSON message to a declared producer to exercise its consumer. Nothing is captured until the consumer processes it."),e[0]=d,e[1]=p):p=e[1];let y;e[2]!==p?(y=s("p",{className:"text-sm text-muted-foreground",children:p}),e[2]=p,e[3]=y):y=e[3];let x;e[4]!==t||e[5]!==i||e[6]!==o||e[7]!==r||e[8]!==n||e[9]!==l||e[10]!==u||e[11]!==c||e[12]!==m||e[13]!==h||e[14]!==g||e[15]!==d?(x=m.length===0?s(we,{description:d("Declare a queue with defineQueue in lunora/queues.ts to enqueue a test message."),testId:"queues-send-empty",title:d("No queues to send to")}):N(Pe,{children:[N("div",{className:"flex flex-wrap items-center gap-2",children:[N("select",{"aria-label":d("Queue"),className:"h-8 rounded-md border border-input bg-transparent px-2.5 py-1 text-xs outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50","data-testid":"queues-send-select",onChange:u,value:h,children:[m.map(wt),[...Ae(m).topics].map(b=>{const[S,v]=b;return s("option",{value:We(S),children:d("{topic} (topic → {count} subscriptions)",{count:v.length,topic:S})},S)})]}),s(nt,{"aria-label":d("Delay (seconds)"),className:"max-w-36","data-testid":"queues-send-delay",min:0,onChange:l,placeholder:d("Delay (s)"),type:"number",value:o}),N("label",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"queues-send-batch",children:[s("input",{checked:t,"data-testid":"queues-send-batch",id:"queues-send-batch",onChange:r,type:"checkbox"}),d("Send as batch (JSON array)")]}),s(ve,{className:"ml-auto","data-testid":"queues-send-button",disabled:g||h==="",onClick:c,type:"button",children:d(g?"Sending…":"Send message")})]}),s(lt,{"aria-label":d("Message body (JSON)"),className:"font-mono","data-testid":"queues-send-body",onChange:n,placeholder:t?'[ { "hello": "world" } ]':'{ "hello": "world" }',value:i})]}),e[4]=t,e[5]=i,e[6]=o,e[7]=r,e[8]=n,e[9]=l,e[10]=u,e[11]=c,e[12]=m,e[13]=h,e[14]=g,e[15]=d,e[16]=x):x=e[16];let q;return e[17]!==y||e[18]!==x?(q=N("div",{className:"flex flex-col gap-3","data-testid":"queues-send",children:[y,x]}),e[17]=y,e[18]=x,e[19]=q):q=e[19],q},es=a=>{const e=U(57),{limit:t}=a,i=t??pt,o=et(),r=z(),[n,l]=R("declared"),[u,c]=R(null);let m;e[0]===Symbol.for("react.memo_cache_sentinel")?(m={},e[0]=m):m=e[0];const{data:h,error:g,errorSource:d}=$e(G.listQueues,m);let p;e[1]!==i?(p={limit:i},e[1]=i,e[2]=p):p=e[2];const{data:y,error:x,errorSource:q,refetch:b}=$e(G.getQueueMessages,p),S=Array.isArray(h?.queues)?[...h.queues].toSorted(Qt):[],v=y?.entries??[],{deadLetteredCount:w,queuesWithoutDlq:Q,showReliabilityWarning:B}=ut(S,v),[j,J]=R(""),[A,I]=R(""),[C,M]=R(""),[P,ze]=R(!1),[le,Ie]=R(!1),[ie,Me]=R(null),{topics:Le}=Ae(S),Re=[...S.map(At),...[...Le.keys()].map(It)],H=Re.includes(j)?j:Re[0]??"",Be=n==="messages"?x:g,He=n==="messages"?q:d,ce=Be??u,de=Be===null?u:He;let V;e[3]!==b?(V=()=>{b()},e[3]=b,e[4]=V):V=e[4],it(V,n==="messages");const Ve=async()=>{c(null);const f=H;if(f==="")return;let E=null;const qe=A.trim();if(qe!=="")try{E=JSON.parse(qe)}catch{c(r("Body must be valid JSON."));return}let Se;const De=C.trim();if(De!==""){const L=Number(De);if(!Number.isFinite(L)||L<0){c(r("Delay must be a non-negative number of seconds."));return}Se=L}if(P&&!Array.isArray(E)){c(r("Batch mode needs a JSON array body — each element is enqueued as one message."));return}Ie(!0);const Ze=mt(f,Le).map(L=>P?{batch:E,delaySeconds:Se,exportName:L}:{body:E,delaySeconds:Se,exportName:L});try{c(await ht(o,Ze,r)),b()}catch(L){c(oe(L))}Ie(!1)};let X;e[5]!==o||e[6]!==b?(X=async f=>{c(null),Me(f);try{await o.query(gt,{id:f},_e("")),b()}catch(E){c(oe(E))}Me(null)},e[5]=o,e[6]=b,e[7]=X):X=e[7];const ue=X;let Y;e[8]!==o||e[9]!==b?(Y=async()=>{c(null);try{await o.query(xt,{},_e("")),b()}catch(f){c(oe(f))}},e[8]=o,e[9]=b,e[10]=Y):Y=e[10];const me=Y;let K;e[11]===Symbol.for("react.memo_cache_sentinel")?(K=f=>{const E=f.currentTarget.dataset.tab;(E==="declared"||E==="messages"||E==="send")&&l(E)},e[11]=K):K=e[11];const Xe=K;let Z;e[12]===Symbol.for("react.memo_cache_sentinel")?(Z=f=>{J(f.currentTarget.value)},e[12]=Z):Z=e[12];const pe=Z;let ee;e[13]===Symbol.for("react.memo_cache_sentinel")?(ee=f=>{I(f.currentTarget.value)},e[13]=ee):ee=e[13];const fe=ee;let te;e[14]===Symbol.for("react.memo_cache_sentinel")?(te=f=>{M(f.currentTarget.value)},e[14]=te):te=e[14];const he=te;let se;e[15]===Symbol.for("react.memo_cache_sentinel")?(se=f=>{ze(f.currentTarget.checked)},e[15]=se):se=e[15];const ge=se,xe=()=>{Ee(Ve())};let ae;e[16]!==ue?(ae=f=>{const{id:E}=f.currentTarget.dataset;E!==void 0&&Ee(ue(E))},e[16]=ue,e[17]=ae):ae=e[17];const ye=ae;let re;e[18]!==me?(re=()=>{Ee(me())},e[18]=me,e[19]=re):re=e[19];const be=re,Ye="flex flex-col gap-6",Ke="lunora-queues-panel";let D;e[20]!==r||e[21]!==n?(D=s("div",{className:"flex items-center gap-1","data-testid":"queues-tabs",role:"tablist",children:["declared","messages","send"].map(f=>s(ve,{"aria-selected":n===f,"data-tab":f,"data-testid":`queues-tab-${f}`,onClick:Xe,role:"tab",size:"sm",type:"button",variant:n===f?"secondary":"ghost",children:qt(f,r)},f))}),e[20]=r,e[21]=n,e[22]=D):D=e[22];let $;e[23]!==ce||e[24]!==de?($=ce!==null&&s(at,{error:de,testId:"queues-error"}),e[23]=ce,e[24]=de,e[25]=$):$=e[25];const Ne=B&&s(rt,{icon:s("span",{"aria-hidden":"true",className:"text-base leading-none",children:"⚠"}),testId:"queues-dlq-warning",variant:"warning",children:N("div",{className:"flex flex-col gap-1",children:[Q.length>0&&N(Pe,{children:[s("p",{className:"font-medium",children:r("No dead-letter queue on {queues}.",{queues:Q.map(Mt).join(", ")})}),s("p",{className:"text-muted-foreground",children:r("Exhausted messages are dropped after retries. Add a deadLetterQueue to capture them.")})]}),w>0&&s("p",{className:Q.length>0?"text-muted-foreground":"font-medium",children:w===1?r("1 message was recently dead-lettered."):r("{count} messages were recently dead-lettered.",{count:w})})]})});let O;e[26]!==S||e[27]!==h||e[28]!==n?(O=n==="declared"&&s(St,{loaded:h!==void 0,queues:S}),e[26]=S,e[27]=h,e[28]=n,e[29]=O):O=e[29];let k;e[30]!==v||e[31]!==x||e[32]!==be||e[33]!==ye||e[34]!==ie||e[35]!==n?(k=n==="messages"&&s(Tt,{hasError:x!==null,messages:v,onClear:be,onReplay:ye,replayingId:ie}),e[30]=v,e[31]=x,e[32]=be,e[33]=ye,e[34]=ie,e[35]=n,e[36]=k):k=e[36];let F;e[37]!==P||e[38]!==A||e[39]!==C||e[40]!==ge||e[41]!==fe||e[42]!==he||e[43]!==pe||e[44]!==xe||e[45]!==S||e[46]!==H||e[47]!==le||e[48]!==n?(F=n==="send"&&s(_t,{batchMode:P,bodyText:A,delayText:C,onBatchModeChange:ge,onBodyChange:fe,onDelayChange:he,onSelectExport:pe,onSend:xe,queues:S,selectedExportName:H,sending:le}),e[37]=P,e[38]=A,e[39]=C,e[40]=ge,e[41]=fe,e[42]=he,e[43]=pe,e[44]=xe,e[45]=S,e[46]=H,e[47]=le,e[48]=n,e[49]=F):F=e[49];let ne;return e[50]!==D||e[51]!==$||e[52]!==Ne||e[53]!==O||e[54]!==k||e[55]!==F?(ne=N("div",{className:Ye,"data-testid":Ke,children:[D,$,Ne,O,k,F]}),e[50]=D,e[51]=$,e[52]=Ne,e[53]=O,e[54]=k,e[55]=F,e[56]=ne):ne=e[56],ne};function Ct(a){return s(Ge,{queue:a},a.exportName)}function vt(a){return s(Ge,{queue:a},a.exportName)}function wt(a){return s("option",{value:a.exportName,children:a.exportName},a.exportName)}function Qt(a,e){return a.exportName.localeCompare(e.exportName)}function At(a){return a.exportName}function It(a){return We(a)}function Mt(a){return a.name}export{es as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as k}from"react/compiler-runtime";import{useLunora as v}from"@lunora/react";import{E as h}from"./empty-state-D7jEML_T.mjs";import{S as g}from"./skeleton-DX1gfixl.mjs";import{u as O}from"./use-admin-spec-Bir7V68L.mjs";import{useT as S}from"./DEFAULT_LOCALE-A1Yg5ORA.mjs";import{R as A}from"./reference-view-CIHyURU6.mjs";import{jsxs as I,jsx as m}from"react/jsx-runtime";const P=["get","post","put","patch","delete","head","options","trace"],y=r=>r?.content?.["application/json"]?.schema,j=(r,e)=>Object.entries(r.responses??{}).map(([i,s])=>{const c=s.$ref?.replace("#/components/responses/",""),n=c===void 0?s:e.components?.responses?.[c]??s;return{description:n.description,schema:y(n),status:i}}),b=(r,e,i,s,c)=>{const n=y(s.requestBody),l=n?.properties?.functionPath?.const,t=typeof l=="string"?l:void 0,f=t===void 0?n:n?.properties?.args,a=s.operationId??`${i} ${e}`;return{argsSchema:f,description:s.description,functionPath:t,httpPath:e,key:r,kind:s["x-lunora-function-kind"],method:i.toUpperCase(),operationId:a,requestSchema:n,responses:j(s,c),summary:s.summary??a,tags:s.tags??[],title:s.summary??a}},x=r=>{const e=[];for(const[i,s]of Object.entries(r.paths??{})){const c=i.includes("#")?i.slice(0,i.indexOf("#")):i;for(const n of P){const l=s[n];l!==void 0&&e.push(b(i,c,n,l,r))}}return e},w=r=>{const e=r??{},i=x(e),s=new Map((e.tags??[]).map(t=>[t.name,t.description])),c=new Set,n=[],l=t=>{if(c.has(t))return;c.add(t);const f=i.filter(a=>(a.tags[0]??"")===t);f.length>0&&n.push({description:s.get(t),name:t,operations:f})};for(const t of e.tags??[])l(t.name);for(const t of i)l(t.tags[0]??"");return{groups:n,operationByKey:new Map(i.map(t=>[t.key,t])),server:e.servers?.[0]?.url,title:e.info?.title??"API reference",version:e.info?.version}},R=r=>{const{paths:e}=r;return e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0},T=r=>{const e=r;return R(e)?{kind:"empty"}:{kind:"ready",spec:e}},H=r=>{const e=k(23),{spec:i}=r,s=S(),c=v();let n;e[0]!==c?(n=()=>c.fetchOpenApi(),e[0]=c,e[1]=n):n=e[1];const t=O(i,n,T);let f;e[2]!==t.kind||e[3]!==t.spec?(f=t.kind==="ready"?w(t.spec):void 0,e[2]=t.kind,e[3]=t.spec,e[4]=f):f=e[4];const a=f;if(t.kind==="loading"){let o;return e[5]===Symbol.for("react.memo_cache_sentinel")?(o=I("div",{className:"flex flex-col gap-4","data-testid":"api-reference-loading",children:[m(g,{className:"h-8 w-48"}),m(g,{className:"h-64 w-full"})]}),e[5]=o):o=e[5],o}if(t.kind==="error"){let o;e[6]!==t.message||e[7]!==s?(o=s("Couldn't load the OpenAPI spec: {message}",{message:t.message}),e[6]=t.message,e[7]=s,e[8]=o):o=e[8];let p;e[9]!==s?(p=s("API reference unavailable"),e[9]=s,e[10]=p):p=e[10];let d;return e[11]!==o||e[12]!==p?(d=m(h,{description:o,testId:"api-reference-error",title:p}),e[11]=o,e[12]=p,e[13]=d):d=e[13],d}if(t.kind==="empty"||a===void 0){let o;e[14]!==s?(o=s("Run `lunora codegen` and wire `_generated/openapi.json` to the worker to render the API reference here."),e[14]=s,e[15]=o):o=e[15];let p;e[16]!==s?(p=s("No OpenAPI spec configured"),e[16]=s,e[17]=p):p=e[17];let d;return e[18]!==o||e[19]!==p?(d=m(h,{description:o,testId:"api-reference-empty",title:p}),e[18]=o,e[19]=p,e[20]=d):d=e[20],d}let u;return e[21]!==a?(u=m(A,{model:a}),e[21]=a,e[22]=u):u=e[22],u};export{H as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as k}from"react/compiler-runtime";import{useLunora as O}from"@lunora/react";import{E as g}from"./empty-state-D7jEML_T.mjs";import{S as y}from"./skeleton-DX1gfixl.mjs";import{u as R}from"./use-admin-spec-Bir7V68L.mjs";import{useT as S}from"./DEFAULT_LOCALE-A1Yg5ORA.mjs";import{R as P}from"./reference-view-CIHyURU6.mjs";import{jsxs as h,jsx as l}from"react/jsx-runtime";const x=n=>(n.params??[]).find(e=>e.name==="args")??(n.params??[])[0],v=n=>n["x-tags"]?.[0]?.name??(n.name.includes(":")?n.name.slice(0,n.name.indexOf(":")):""),w=n=>{const e=x(n)?.schema;return{argsSchema:e,description:n.description,functionPath:n.name,httpPath:"/_lunora/rpc",key:n.name,kind:n["x-lunora-function-kind"],method:"POST",operationId:n.name,requestSchema:e,responses:[{description:n.result?.name,schema:n.result?.schema,status:"200"}],summary:n.summary??n.name,tags:[v(n)],title:n.summary??n.name}},I=n=>{const e=n??{},m=(e.methods??[]).map(a=>w(a)),r=new Map;for(const a of m){const i=a.tags[0]??"",s=r.get(i)??[];s.push(a),r.set(i,s)}return{groups:[...r.entries()].map(([a,i])=>({name:a,operations:i.toSorted((s,p)=>s.operationId.localeCompare(p.operationId))})).toSorted((a,i)=>a.name.localeCompare(i.name)),operationByKey:new Map(m.map(a=>[a.key,a])),title:e.info?.title??"API reference",version:e.info?.version}},C=n=>n.methods===void 0||n.methods.length===0,N=n=>{const e=n;return C(e)?{kind:"empty"}:{kind:"ready",spec:e}},q=n=>{const e=k(23),{spec:m}=n,r=S(),f=O();let a;e[0]!==f?(a=()=>f.fetchOpenRpc(),e[0]=f,e[1]=a):a=e[1];const s=R(m,a,N);let p;e[2]!==s.kind||e[3]!==s.spec?(p=s.kind==="ready"?I(s.spec):void 0,e[2]=s.kind,e[3]=s.spec,e[4]=p):p=e[4];const u=p;if(s.kind==="loading"){let t;return e[5]===Symbol.for("react.memo_cache_sentinel")?(t=h("div",{className:"flex flex-col gap-4","data-testid":"openrpc-reference-loading",children:[l(y,{className:"h-8 w-48"}),l(y,{className:"h-64 w-full"})]}),e[5]=t):t=e[5],t}if(s.kind==="error"){let t;e[6]!==s.message||e[7]!==r?(t=r("Couldn't load the OpenRPC spec: {message}",{message:s.message}),e[6]=s.message,e[7]=r,e[8]=t):t=e[8];let o;e[9]!==r?(o=r("API reference unavailable"),e[9]=r,e[10]=o):o=e[10];let c;return e[11]!==t||e[12]!==o?(c=l(g,{description:t,testId:"openrpc-reference-error",title:o}),e[11]=t,e[12]=o,e[13]=c):c=e[13],c}if(s.kind==="empty"||u===void 0){let t;e[14]!==r?(t=r("Run `lunora codegen --api-spec openrpc` and wire `_generated/openrpc.json` to the worker to render the OpenRPC reference here."),e[14]=r,e[15]=t):t=e[15];let o;e[16]!==r?(o=r("No OpenRPC spec configured"),e[16]=r,e[17]=o):o=e[17];let c;return e[18]!==t||e[19]!==o?(c=l(g,{description:t,testId:"openrpc-reference-empty",title:o}),e[18]=t,e[19]=o,e[20]=c):c=e[20],c}let d;return e[21]!==u?(d=l(P,{model:u}),e[21]=u,e[22]=d):d=e[22],d};export{q as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as b}from"./studio-
|
|
1
|
+
import{S as b}from"./studio-CrypdTyE.mjs";import"./ErrorBoundary-BWNF98VF.mjs";import"./operation-console-provider-DoloEvon.mjs";import"./badge-r_5B4LHP.mjs";import"./input-CXhxesPC.mjs";import"./skeleton-DX1gfixl.mjs";import"./home-panel-DIaVZra4.mjs";import"./DEFAULT_LOCALE-A1Yg5ORA.mjs";import"./StudioI18nProvider-fVsCSs5L.mjs";import"./data-view-params-DhYmAkcj.mjs";import"./internal-Df43vQI0.mjs";import"./utils-bhneXptQ.mjs";import"./CommandPalette-D9ZY-qQd.mjs";export{b as Studio};
|