local-serverless-stack 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/client/index.d.ts +7 -0
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +6 -0
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/client/namespaces/apis.d.ts +48 -0
  7. package/dist/client/namespaces/apis.d.ts.map +1 -0
  8. package/dist/client/namespaces/apis.js +12 -0
  9. package/dist/client/namespaces/apis.js.map +1 -0
  10. package/dist/client/namespaces/lambdas.d.ts +61 -0
  11. package/dist/client/namespaces/lambdas.d.ts.map +1 -0
  12. package/dist/client/namespaces/lambdas.js +13 -0
  13. package/dist/client/namespaces/lambdas.js.map +1 -0
  14. package/dist/client/namespaces/services.d.ts +40 -0
  15. package/dist/client/namespaces/services.d.ts.map +1 -1
  16. package/dist/client/namespaces/services.js +3 -0
  17. package/dist/client/namespaces/services.js.map +1 -1
  18. package/dist/client/types.d.ts +2 -0
  19. package/dist/client/types.d.ts.map +1 -1
  20. package/dist/server/index.js +25 -2
  21. package/dist/server/index.js.map +1 -1
  22. package/dist/server/routes/apis.d.ts +3 -0
  23. package/dist/server/routes/apis.d.ts.map +1 -0
  24. package/dist/server/routes/apis.js +54 -0
  25. package/dist/server/routes/apis.js.map +1 -0
  26. package/dist/server/routes/lambdas.d.ts +3 -0
  27. package/dist/server/routes/lambdas.d.ts.map +1 -0
  28. package/dist/server/routes/lambdas.js +85 -0
  29. package/dist/server/routes/lambdas.js.map +1 -0
  30. package/dist/server/routes/services.d.ts.map +1 -1
  31. package/dist/server/routes/services.js +91 -78
  32. package/dist/server/routes/services.js.map +1 -1
  33. package/dist/server/runtime/runtime-worker.d.ts +2 -0
  34. package/dist/server/runtime/runtime-worker.d.ts.map +1 -0
  35. package/dist/server/runtime/runtime-worker.js +207 -0
  36. package/dist/server/runtime/runtime-worker.js.map +1 -0
  37. package/dist/server/services/api-gateway-events.d.ts +44 -0
  38. package/dist/server/services/api-gateway-events.d.ts.map +1 -0
  39. package/dist/server/services/api-gateway-events.js +299 -0
  40. package/dist/server/services/api-gateway-events.js.map +1 -0
  41. package/dist/server/services/authorizer-service.d.ts +25 -0
  42. package/dist/server/services/authorizer-service.d.ts.map +1 -0
  43. package/dist/server/services/authorizer-service.js +0 -0
  44. package/dist/server/services/authorizer-service.js.map +1 -0
  45. package/dist/server/services/cache-manager.d.ts +6 -0
  46. package/dist/server/services/cache-manager.d.ts.map +1 -1
  47. package/dist/server/services/cache-manager.js.map +1 -1
  48. package/dist/server/services/config-manager.d.ts +57 -0
  49. package/dist/server/services/config-manager.d.ts.map +1 -1
  50. package/dist/server/services/config-manager.js +78 -0
  51. package/dist/server/services/config-manager.js.map +1 -1
  52. package/dist/server/services/function-registry.d.ts +33 -0
  53. package/dist/server/services/function-registry.d.ts.map +1 -0
  54. package/dist/server/services/function-registry.js +100 -0
  55. package/dist/server/services/function-registry.js.map +1 -0
  56. package/dist/server/services/gateway-manager.d.ts +31 -0
  57. package/dist/server/services/gateway-manager.d.ts.map +1 -0
  58. package/dist/server/services/gateway-manager.js +292 -0
  59. package/dist/server/services/gateway-manager.js.map +1 -0
  60. package/dist/server/services/lambda-runtime-manager.d.ts +52 -0
  61. package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -0
  62. package/dist/server/services/lambda-runtime-manager.js +326 -0
  63. package/dist/server/services/lambda-runtime-manager.js.map +1 -0
  64. package/dist/server/services/localstack-manager.d.ts.map +1 -1
  65. package/dist/server/services/localstack-manager.js +9 -0
  66. package/dist/server/services/localstack-manager.js.map +1 -1
  67. package/dist/server/services/serverless-packager.d.ts +1 -0
  68. package/dist/server/services/serverless-packager.d.ts.map +1 -1
  69. package/dist/server/services/serverless-packager.js +12 -5
  70. package/dist/server/services/serverless-packager.js.map +1 -1
  71. package/dist/server/services/serverless-state-parser.d.ts +86 -0
  72. package/dist/server/services/serverless-state-parser.d.ts.map +1 -0
  73. package/dist/server/services/serverless-state-parser.js +245 -0
  74. package/dist/server/services/serverless-state-parser.js.map +1 -0
  75. package/dist/server/services/service-registrar.d.ts +34 -0
  76. package/dist/server/services/service-registrar.d.ts.map +1 -0
  77. package/dist/server/services/service-registrar.js +262 -0
  78. package/dist/server/services/service-registrar.js.map +1 -0
  79. package/dist/server/services/source-watcher.d.ts +24 -0
  80. package/dist/server/services/source-watcher.d.ts.map +1 -0
  81. package/dist/server/services/source-watcher.js +101 -0
  82. package/dist/server/services/source-watcher.js.map +1 -0
  83. package/dist/ui/assets/ApisPage-DdgKjEdS.js +1 -0
  84. package/dist/ui/assets/{BucketDetailPage-Hg4Gg3jC.js → BucketDetailPage-DZQGxm0y.js} +1 -1
  85. package/dist/ui/assets/{BucketsPage-BHkg7TQp.js → BucketsPage-xYXzxCvd.js} +1 -1
  86. package/dist/ui/assets/{DynamoPage-CH_TgPh_.js → DynamoPage-B1__Rjr2.js} +1 -1
  87. package/dist/ui/assets/{DynamoTablePage-BPvl5y6_.js → DynamoTablePage-BCoxPdXW.js} +1 -1
  88. package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +4 -0
  89. package/dist/ui/assets/LambdasPage-_TtxQMT_.js +1 -0
  90. package/dist/ui/assets/{OverviewPage-CwLnw4VW.css → OverviewPage-6jDXV1jr.css} +1 -1
  91. package/dist/ui/assets/OverviewPage-CqTKTY64.js +1 -0
  92. package/dist/ui/assets/{QueueDetailPage-DHDPgRDc.js → QueueDetailPage-BOr_sImA.js} +1 -1
  93. package/dist/ui/assets/{QueuesPage-D5YcEbUU.js → QueuesPage-DpByfcM5.js} +1 -1
  94. package/dist/ui/assets/{ServiceDetailPage-DxJ0t7HQ.js → ServiceDetailPage-DsWgV-ad.js} +1 -1
  95. package/dist/ui/assets/{ServicesPage-DWDaaOz9.js → ServicesPage-CGlpsj98.js} +1 -1
  96. package/dist/ui/assets/{index-D3WwZ4lY.js → index-BWlB542w.js} +11 -11
  97. package/dist/ui/index.html +1 -1
  98. package/package.json +2 -2
  99. package/packages/serverless-plugin/README.md +21 -3
  100. package/packages/serverless-plugin/dist/index.js +8 -3
  101. package/packages/serverless-plugin/dist/index.js.map +1 -1
  102. package/dist/ui/assets/OverviewPage-nhomNDqx.js +0 -1
@@ -1 +1 @@
1
- import{o as z,L as $,v as P,u as j,w as i,i as d,G as t,f as m,S as a,n as s,D as q,s as _,b as D,m as r,E as u,j as A,K as T,k,R as U,J as E,V as J,_ as g,A as K,F as M,z as O,B as N,a as G,h as y,X,y as b,g as Q,d as x}from"./index-D3WwZ4lY.js";const H={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},W=["onClick"],Y={class:"muted mono",style:{"font-size":"0.75rem"}},Z={key:1,class:"muted",style:{"font-size":"0.75rem"}},ee=z({__name:"QueuesView",setup(B){const F=$(),c=b([]),S=b({}),v=b(!0),f=b(null);let h=null;const R=[{key:"name",label:"Queue"},{key:"service",label:"Service"},{key:"available",label:"Available",align:"right"},{key:"inFlight",label:"In flight",align:"right"},{key:"processed",label:"Processed",align:"right"},{key:"consumers",label:"Consumers"},{key:"actions",label:"",align:"right"}],I=Q(()=>c.value.map(n=>({...n,consumersCount:n.consumers.length,service:S.value[n.name]||""}))),p=Q(()=>({queues:c.value.length,available:c.value.reduce((n,l)=>n+l.available,0),inFlight:c.value.reduce((n,l)=>n+l.inFlight,0),processed:c.value.reduce((n,l)=>n+l.processed,0)}));async function w(){try{const[n,l]=await Promise.all([x.listQueues(),x.listResourceOwners().catch(()=>({tables:[],queues:[],topics:[],buckets:[]}))]);c.value=n;const e={};for(const o of l.queues)e[o.name]=o.service;S.value=e,f.value=null}catch(n){f.value=n.message||"Failed to load queues"}finally{v.value=!1}}function C(n){F.push(`/queues/${encodeURIComponent(n)}`)}function L(n){return n.available>0?"warning":n.inFlight>0?"info":n.consumers.some(l=>l.enabled)?"success":"neutral"}function V(n){return n.available>0?"Backlog":n.inFlight>0?"Processing":n.consumers.length?"Idle":"No consumers"}return P(()=>{w(),h=window.setInterval(w,4e3)}),j(()=>{h&&window.clearInterval(h)}),(n,l)=>(i(),d(t(m),{direction:"vertical",gap:"1.25rem"},{default:a(()=>[s(t(q),{columns:4,gap:"1rem"},{default:a(()=>[s(t(_),{label:"Queues",value:p.value.queues,tone:"info",loading:v.value},null,8,["value","loading"]),s(t(_),{label:"Available messages",value:p.value.available,tone:"warning",loading:v.value},null,8,["value","loading"]),s(t(_),{label:"In flight",value:p.value.inFlight,tone:"info",loading:v.value},null,8,["value","loading"]),s(t(_),{label:"Processed",value:p.value.processed,tone:"success",loading:v.value},null,8,["value","loading"])]),_:1}),f.value?(i(),d(t(D),{key:0,variant:"danger",dismissible:"",onDismiss:l[0]||(l[0]=e=>f.value=null)},{default:a(()=>[r(u(f.value),1)]),_:1})):A("",!0),s(t(T),{variant:"outline"},{header:a(()=>[s(t(m),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:a(()=>[...l[1]||(l[1]=[y("strong",null,"SQS Queues",-1),y("span",{class:"muted"},"Live · refreshes every 4s",-1)])]),_:1})]),default:a(()=>[v.value?(i(),k("div",H,[s(t(U),{label:"Loading queues..."})])):c.value.length?(i(),d(t(J),{key:2,columns:R,rows:I.value},{"cell-name":a(({row:e})=>[s(t(m),{direction:"vertical",gap:"0.125rem"},{default:a(()=>[y("a",{href:"#",style:{"text-decoration":"none","font-weight":"600"},onClick:X(o=>C(String(e.name)),["prevent"])},u(e.name),9,W),y("span",Y,u(String(e.arn||e.url||"")),1)]),_:2},1024)]),"cell-service":a(({row:e})=>[e.service?(i(),d(t(G),{key:0,to:`/services/${encodeURIComponent(String(e.service))}`,style:{"text-decoration":"none"}},{default:a(()=>[s(t(N),{size:"sm",variant:"soft",clickable:""},{default:a(()=>[r(u(e.service),1)]),_:2},1024)]),_:2},1032,["to"])):(i(),k("span",Z,"unmanaged"))]),"cell-available":a(({row:e})=>[s(t(g),{tone:Number(e.available)>0?"warning":"neutral",variant:"soft"},{default:a(()=>[r(u(e.available),1)]),_:2},1032,["tone"])]),"cell-inFlight":a(({row:e})=>[s(t(g),{tone:Number(e.inFlight)>0?"info":"neutral",variant:"soft"},{default:a(()=>[r(u(e.inFlight),1)]),_:2},1032,["tone"])]),"cell-processed":a(({row:e})=>[s(t(g),{tone:"success",variant:"soft"},{default:a(()=>[r(u(e.processed),1)]),_:2},1024)]),"cell-consumers":a(({row:e})=>[s(t(m),{direction:"horizontal",gap:"0.25rem",wrap:""},{default:a(()=>[e.consumers.length?(i(!0),k(M,{key:0},O(e.consumers,o=>(i(),d(t(N),{key:o.uuid||o.functionName,size:"sm",variant:o.enabled?"solid":"outline"},{default:a(()=>[r(u(o.functionName),1)]),_:2},1032,["variant"]))),128)):(i(),d(t(g),{key:1,tone:"neutral",variant:"soft"},{default:a(()=>[...l[2]||(l[2]=[r("No consumers",-1)])]),_:1}))]),_:2},1024)]),"cell-actions":a(({row:e})=>[s(t(m),{direction:"horizontal",gap:"0.375rem",justify:"flex-end"},{default:a(()=>[s(t(g),{tone:L(e),variant:"solid"},{default:a(()=>[r(u(V(e)),1)]),_:2},1032,["tone"]),s(t(K),{size:"sm",variant:"ghost",onClick:o=>C(String(e.name))},{default:a(()=>[...l[3]||(l[3]=[r(" Open ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1},8,["rows"])):(i(),d(t(E),{key:1,title:"No queues found",description:"Register a microservice that defines SQS resources or create queues directly in LocalStack."}))]),_:1})]),_:1}))}}),ne=z({__name:"QueuesPage",setup(B){return(F,c)=>(i(),d(ee))}});export{ne as default};
1
+ import{o as z,L as $,v as P,u as j,w as i,i as d,G as t,f as m,S as a,n as s,D as q,s as _,b as D,m as r,E as u,j as A,K as T,k,R as U,J as E,V as J,_ as g,A as K,F as M,z as O,B as N,a as G,h as y,X,y as b,g as Q,d as x}from"./index-BWlB542w.js";const H={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},W=["onClick"],Y={class:"muted mono",style:{"font-size":"0.75rem"}},Z={key:1,class:"muted",style:{"font-size":"0.75rem"}},ee=z({__name:"QueuesView",setup(B){const F=$(),c=b([]),S=b({}),v=b(!0),f=b(null);let h=null;const R=[{key:"name",label:"Queue"},{key:"service",label:"Service"},{key:"available",label:"Available",align:"right"},{key:"inFlight",label:"In flight",align:"right"},{key:"processed",label:"Processed",align:"right"},{key:"consumers",label:"Consumers"},{key:"actions",label:"",align:"right"}],I=Q(()=>c.value.map(n=>({...n,consumersCount:n.consumers.length,service:S.value[n.name]||""}))),p=Q(()=>({queues:c.value.length,available:c.value.reduce((n,l)=>n+l.available,0),inFlight:c.value.reduce((n,l)=>n+l.inFlight,0),processed:c.value.reduce((n,l)=>n+l.processed,0)}));async function w(){try{const[n,l]=await Promise.all([x.listQueues(),x.listResourceOwners().catch(()=>({tables:[],queues:[],topics:[],buckets:[]}))]);c.value=n;const e={};for(const o of l.queues)e[o.name]=o.service;S.value=e,f.value=null}catch(n){f.value=n.message||"Failed to load queues"}finally{v.value=!1}}function C(n){F.push(`/queues/${encodeURIComponent(n)}`)}function L(n){return n.available>0?"warning":n.inFlight>0?"info":n.consumers.some(l=>l.enabled)?"success":"neutral"}function V(n){return n.available>0?"Backlog":n.inFlight>0?"Processing":n.consumers.length?"Idle":"No consumers"}return P(()=>{w(),h=window.setInterval(w,4e3)}),j(()=>{h&&window.clearInterval(h)}),(n,l)=>(i(),d(t(m),{direction:"vertical",gap:"1.25rem"},{default:a(()=>[s(t(q),{columns:4,gap:"1rem"},{default:a(()=>[s(t(_),{label:"Queues",value:p.value.queues,tone:"info",loading:v.value},null,8,["value","loading"]),s(t(_),{label:"Available messages",value:p.value.available,tone:"warning",loading:v.value},null,8,["value","loading"]),s(t(_),{label:"In flight",value:p.value.inFlight,tone:"info",loading:v.value},null,8,["value","loading"]),s(t(_),{label:"Processed",value:p.value.processed,tone:"success",loading:v.value},null,8,["value","loading"])]),_:1}),f.value?(i(),d(t(D),{key:0,variant:"danger",dismissible:"",onDismiss:l[0]||(l[0]=e=>f.value=null)},{default:a(()=>[r(u(f.value),1)]),_:1})):A("",!0),s(t(T),{variant:"outline"},{header:a(()=>[s(t(m),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:a(()=>[...l[1]||(l[1]=[y("strong",null,"SQS Queues",-1),y("span",{class:"muted"},"Live · refreshes every 4s",-1)])]),_:1})]),default:a(()=>[v.value?(i(),k("div",H,[s(t(U),{label:"Loading queues..."})])):c.value.length?(i(),d(t(J),{key:2,columns:R,rows:I.value},{"cell-name":a(({row:e})=>[s(t(m),{direction:"vertical",gap:"0.125rem"},{default:a(()=>[y("a",{href:"#",style:{"text-decoration":"none","font-weight":"600"},onClick:X(o=>C(String(e.name)),["prevent"])},u(e.name),9,W),y("span",Y,u(String(e.arn||e.url||"")),1)]),_:2},1024)]),"cell-service":a(({row:e})=>[e.service?(i(),d(t(G),{key:0,to:`/services/${encodeURIComponent(String(e.service))}`,style:{"text-decoration":"none"}},{default:a(()=>[s(t(N),{size:"sm",variant:"soft",clickable:""},{default:a(()=>[r(u(e.service),1)]),_:2},1024)]),_:2},1032,["to"])):(i(),k("span",Z,"unmanaged"))]),"cell-available":a(({row:e})=>[s(t(g),{tone:Number(e.available)>0?"warning":"neutral",variant:"soft"},{default:a(()=>[r(u(e.available),1)]),_:2},1032,["tone"])]),"cell-inFlight":a(({row:e})=>[s(t(g),{tone:Number(e.inFlight)>0?"info":"neutral",variant:"soft"},{default:a(()=>[r(u(e.inFlight),1)]),_:2},1032,["tone"])]),"cell-processed":a(({row:e})=>[s(t(g),{tone:"success",variant:"soft"},{default:a(()=>[r(u(e.processed),1)]),_:2},1024)]),"cell-consumers":a(({row:e})=>[s(t(m),{direction:"horizontal",gap:"0.25rem",wrap:""},{default:a(()=>[e.consumers.length?(i(!0),k(M,{key:0},O(e.consumers,o=>(i(),d(t(N),{key:o.uuid||o.functionName,size:"sm",variant:o.enabled?"solid":"outline"},{default:a(()=>[r(u(o.functionName),1)]),_:2},1032,["variant"]))),128)):(i(),d(t(g),{key:1,tone:"neutral",variant:"soft"},{default:a(()=>[...l[2]||(l[2]=[r("No consumers",-1)])]),_:1}))]),_:2},1024)]),"cell-actions":a(({row:e})=>[s(t(m),{direction:"horizontal",gap:"0.375rem",justify:"flex-end"},{default:a(()=>[s(t(g),{tone:L(e),variant:"solid"},{default:a(()=>[r(u(V(e)),1)]),_:2},1032,["tone"]),s(t(K),{size:"sm",variant:"ghost",onClick:o=>C(String(e.name))},{default:a(()=>[...l[3]||(l[3]=[r(" Open ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1},8,["rows"])):(i(),d(t(E),{key:1,title:"No queues found",description:"Register a microservice that defines SQS resources or create queues directly in LocalStack."}))]),_:1})]),_:1}))}}),ne=z({__name:"QueuesPage",setup(B){return(F,c)=>(i(),d(ee))}});export{ne as default};
@@ -1,2 +1,2 @@
1
- import{o as ne,v as le,u as se,Q as oe,i as m,S as t,G as e,f as l,d as q,y as g,w as o,n,a as P,A as L,m as d,h as v,E as u,_,j as y,b as re,k,R as ie,s as x,D as ue,K as A,J as de,F as z,z as D,B as $,a0 as ve,q as ce,g as fe,O as me,L as pe}from"./index-D3WwZ4lY.js";const ge={style:{"font-size":"1.1rem"}},ye={key:1,style:{display:"flex","justify-content":"center",padding:"2rem"}},be={class:"mono"},we={class:"mono"},_e={class:"mono"},ke={class:"mono"},ze={class:"muted"},he={class:"muted"},Se={class:"muted"},Ne={class:"muted"},Le={class:"muted"},De={class:"muted"},$e={class:"logs-pre"},je=ne({__name:"ServiceDetailPage",props:{serviceName:{}},setup(B){const p=B,G=pe(),h=me(),f=g(null),R=g(!0),C=g(null),T=g(!1),F=g(!1),U=g(!1),E=g([]),Q=g("stopped");let b=null,V=null;const O=g(!1),r=fe(()=>{var a;const i={lambda:[],dynamodb:[],sqs:[],sns:[],s3:[],"event-source":[]};for(const s of((a=f.value)==null?void 0:a.resources)||[])i[s.type]||(i[s.type]=[]),i[s.type].push(s);return i});async function S(){R.value=!0;try{f.value=await q.getService(p.serviceName),C.value=null}catch(i){C.value=i.message||"Service not found",f.value=null}finally{R.value=!1}}async function H(){if(!T.value){T.value=!0;try{await q.startService(p.serviceName),h.add({title:"Service started",description:p.serviceName,variant:"success"}),await S()}catch(i){h.add({title:"Failed to start",description:i.message,variant:"danger"})}finally{T.value=!1}}}async function W(){if(!F.value){F.value=!0;try{await q.stopService(p.serviceName),h.add({title:"Service stopped",description:p.serviceName,variant:"info"}),await S()}catch(i){h.add({title:"Failed to stop",description:i.message,variant:"danger"})}finally{F.value=!1}}}async function J(){try{const i=await q.getServiceLogs(p.serviceName);E.value=i.logs||[],Q.value=i.status||"stopped"}catch(i){console.error("Failed to fetch logs:",i)}}function X(){U.value=!0,J(),b&&window.clearInterval(b),b=window.setInterval(J,2e3)}function Y(){U.value=!1,b&&window.clearInterval(b),b=null}async function Z(){try{await q.deleteService(p.serviceName),h.add({title:"Service deleted",description:p.serviceName,variant:"info"}),G.push("/services")}catch(i){h.add({title:"Failed to delete",description:i.message,variant:"danger"})}finally{O.value=!1}}function ee(i){switch(i){case"running":return"success";case"registered":return"warning";case"stopped":return"neutral";default:return"danger"}}function te(i){return i?new Date(i).toLocaleString():"—"}return le(()=>{S(),V=window.setInterval(S,1e4)}),se(()=>{V&&window.clearInterval(V),b&&window.clearInterval(b)}),oe(()=>p.serviceName,S),(i,a)=>(o(),m(e(l),{direction:"vertical",gap:"1.25rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>{var s;return[n(e(P),{to:"/services",style:{"text-decoration":"none"}},{default:t(()=>[n(e(L),{size:"sm",variant:"ghost"},{default:t(()=>[...a[5]||(a[5]=[d("← Services",-1)])]),_:1})]),_:1}),v("strong",ge,u(B.serviceName),1),(s=f.value)!=null&&s.status?(o(),m(e(_),{key:0,tone:ee(f.value.status),variant:"soft"},{default:t(()=>[d(u(f.value.status),1)]),_:1},8,["tone"])):y("",!0)]}),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem"},{default:t(()=>{var s,w;return[n(e(L),{size:"sm",variant:"soft",disabled:((s=f.value)==null?void 0:s.status)==="running",loading:T.value,onClick:H},{default:t(()=>[...a[6]||(a[6]=[d(" Start ",-1)])]),_:1},8,["disabled","loading"]),n(e(L),{size:"sm",variant:"soft",disabled:((w=f.value)==null?void 0:w.status)!=="running",loading:F.value,onClick:W},{default:t(()=>[...a[7]||(a[7]=[d(" Stop ",-1)])]),_:1},8,["disabled","loading"]),n(e(L),{size:"sm",variant:"ghost",onClick:X},{default:t(()=>[...a[8]||(a[8]=[d("Logs",-1)])]),_:1}),n(e(L),{size:"sm",variant:"ghost",loading:R.value,onClick:S},{default:t(()=>[...a[9]||(a[9]=[d("Refresh",-1)])]),_:1},8,["loading"]),n(e(L),{size:"sm",variant:"danger",onClick:a[0]||(a[0]=N=>O.value=!0)},{default:t(()=>[...a[10]||(a[10]=[d("Delete",-1)])]),_:1})]}),_:1})]),_:1}),C.value?(o(),m(e(re),{key:0,variant:"danger",dismissible:"",onDismiss:a[1]||(a[1]=s=>C.value=null)},{default:t(()=>[d(u(C.value),1)]),_:1})):y("",!0),R.value&&!f.value?(o(),k("div",ye,[n(e(ie),{label:"Loading service..."})])):f.value?(o(),k(z,{key:2},[n(e(ue),{columns:5,gap:"1rem"},{default:t(()=>{var s,w,N,j,I;return[n(e(x),{label:"Lambdas",value:((s=r.value.lambda)==null?void 0:s.length)||0,tone:"info"},null,8,["value"]),n(e(x),{label:"Tables",value:((w=r.value.dynamodb)==null?void 0:w.length)||0,tone:"info"},null,8,["value"]),n(e(x),{label:"Queues",value:((N=r.value.sqs)==null?void 0:N.length)||0,tone:"warning"},null,8,["value"]),n(e(x),{label:"Topics",value:((j=r.value.sns)==null?void 0:j.length)||0,tone:"info"},null,8,["value"]),n(e(x),{label:"Buckets",value:((I=r.value.s3)==null?void 0:I.length)||0,tone:"neutral"},null,8,["value"])]}),_:1}),n(e(A),{variant:"outline"},{header:t(()=>[...a[11]||(a[11]=[v("strong",null,"Metadata",-1)])]),default:t(()=>[n(e(l),{direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[12]||(a[12]=v("span",{class:"muted"},"Path",-1)),v("span",be,u(f.value.root),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[13]||(a[13]=v("span",{class:"muted"},"Region",-1)),v("span",we,u(f.value.region||"—"),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[14]||(a[14]=v("span",{class:"muted"},"Invoke port",-1)),v("span",_e,u(f.value.invokePort??"—"),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[15]||(a[15]=v("span",{class:"muted"},"PID",-1)),v("span",ke,u(f.value.pid??"—"),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[16]||(a[16]=v("span",{class:"muted"},"Last updated",-1)),v("span",null,u(te(f.value.lastUpdated)),1)]),_:1})]),_:1})]),_:1}),n(e(A),{variant:"outline"},{header:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:t(()=>[a[17]||(a[17]=v("strong",null,"Declared resources",-1)),n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>{var s;return[d(u(((s=f.value.resources)==null?void 0:s.length)||0)+" total ",1)]}),_:1})]),_:1})]),default:t(()=>{var s;return[(s=f.value.resources)!=null&&s.length?(o(),m(e(l),{key:1,direction:"vertical",gap:"1rem"},{default:t(()=>{var w,N,j,I,K,M;return[(w=r.value.dynamodb)!=null&&w.length?(o(),m(e(l),{key:0,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"info",variant:"soft"},{default:t(()=>[...a[18]||(a[18]=[d("DynamoDB tables",-1)])]),_:1}),v("span",ze,u(r.value.dynamodb.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.dynamodb,c=>(o(),m(e(P),{key:`db-${c.name}`,to:`/dynamo/${encodeURIComponent(c.name)}`,style:{"text-decoration":"none"}},{default:t(()=>[n(e($),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[d(u(c.name),1)]),_:2},1024)]),_:2},1032,["to"]))),128))]),_:1})]),_:1})):y("",!0),(N=r.value.sqs)!=null&&N.length?(o(),m(e(l),{key:1,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"warning",variant:"soft"},{default:t(()=>[...a[19]||(a[19]=[d("SQS queues",-1)])]),_:1}),v("span",he,u(r.value.sqs.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.sqs,c=>(o(),m(e(P),{key:`q-${c.name}`,to:"/queues",style:{"text-decoration":"none"}},{default:t(()=>[n(e($),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[d(u(c.name),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0),(j=r.value.sns)!=null&&j.length?(o(),m(e(l),{key:2,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"info",variant:"soft"},{default:t(()=>[...a[20]||(a[20]=[d("SNS topics",-1)])]),_:1}),v("span",Se,u(r.value.sns.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.sns,c=>(o(),m(e($),{key:`t-${c.name}`,size:"sm",variant:"soft"},{default:t(()=>[d(u(c.name),1)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0),(I=r.value.s3)!=null&&I.length?(o(),m(e(l),{key:3,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>[...a[21]||(a[21]=[d("S3 buckets",-1)])]),_:1}),v("span",Ne,u(r.value.s3.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.s3,c=>(o(),m(e(P),{key:`b-${c.name}`,to:`/buckets/${encodeURIComponent(c.name)}`,style:{"text-decoration":"none"}},{default:t(()=>[n(e($),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[d(u(c.name),1)]),_:2},1024)]),_:2},1032,["to"]))),128))]),_:1})]),_:1})):y("",!0),(K=r.value.lambda)!=null&&K.length?(o(),m(e(l),{key:4,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>[...a[22]||(a[22]=[d("Lambda functions",-1)])]),_:1}),v("span",Le,u(r.value.lambda.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.lambda,c=>(o(),m(e($),{key:`l-${c.name}`,size:"sm",variant:"soft"},{default:t(()=>[d(" λ "+u(c.name),1)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0),(M=r.value["event-source"])!=null&&M.length?(o(),m(e(l),{key:5,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>[...a[23]||(a[23]=[d("Event-source mappings",-1)])]),_:1}),v("span",De,u(r.value["event-source"].length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value["event-source"],(c,ae)=>(o(),m(e($),{key:`es-${ae}-${c.name}`,size:"sm",variant:"outline"},{default:t(()=>[d(u(c.name),1)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0)]}),_:1})):(o(),m(e(de),{key:0,title:"No resources declared",description:"This service's CloudFormation template has no resources LSS understands yet."}))]}),_:1})],64)):y("",!0),n(e(ve),{open:U.value,"onUpdate:open":[a[2]||(a[2]=s=>U.value=s),a[3]||(a[3]=s=>{s||Y()})],title:`Logs — ${B.serviceName}`,description:`Status: ${Q.value}`,size:"lg"},{default:t(()=>[v("pre",$e,u(E.value.join(`
1
+ import{o as ne,v as le,u as se,Q as oe,i as m,S as t,G as e,f as l,d as q,y as g,w as o,n,a as P,A as L,m as d,h as v,E as u,_,j as y,b as re,k,R as ie,s as x,D as ue,K as A,J as de,F as z,z as D,B as $,a0 as ve,q as ce,g as fe,O as me,L as pe}from"./index-BWlB542w.js";const ge={style:{"font-size":"1.1rem"}},ye={key:1,style:{display:"flex","justify-content":"center",padding:"2rem"}},be={class:"mono"},we={class:"mono"},_e={class:"mono"},ke={class:"mono"},ze={class:"muted"},he={class:"muted"},Se={class:"muted"},Ne={class:"muted"},Le={class:"muted"},De={class:"muted"},$e={class:"logs-pre"},je=ne({__name:"ServiceDetailPage",props:{serviceName:{}},setup(B){const p=B,G=pe(),h=me(),f=g(null),R=g(!0),C=g(null),T=g(!1),F=g(!1),U=g(!1),E=g([]),Q=g("stopped");let b=null,V=null;const O=g(!1),r=fe(()=>{var a;const i={lambda:[],dynamodb:[],sqs:[],sns:[],s3:[],"event-source":[]};for(const s of((a=f.value)==null?void 0:a.resources)||[])i[s.type]||(i[s.type]=[]),i[s.type].push(s);return i});async function S(){R.value=!0;try{f.value=await q.getService(p.serviceName),C.value=null}catch(i){C.value=i.message||"Service not found",f.value=null}finally{R.value=!1}}async function H(){if(!T.value){T.value=!0;try{await q.startService(p.serviceName),h.add({title:"Service started",description:p.serviceName,variant:"success"}),await S()}catch(i){h.add({title:"Failed to start",description:i.message,variant:"danger"})}finally{T.value=!1}}}async function W(){if(!F.value){F.value=!0;try{await q.stopService(p.serviceName),h.add({title:"Service stopped",description:p.serviceName,variant:"info"}),await S()}catch(i){h.add({title:"Failed to stop",description:i.message,variant:"danger"})}finally{F.value=!1}}}async function J(){try{const i=await q.getServiceLogs(p.serviceName);E.value=i.logs||[],Q.value=i.status||"stopped"}catch(i){console.error("Failed to fetch logs:",i)}}function X(){U.value=!0,J(),b&&window.clearInterval(b),b=window.setInterval(J,2e3)}function Y(){U.value=!1,b&&window.clearInterval(b),b=null}async function Z(){try{await q.deleteService(p.serviceName),h.add({title:"Service deleted",description:p.serviceName,variant:"info"}),G.push("/services")}catch(i){h.add({title:"Failed to delete",description:i.message,variant:"danger"})}finally{O.value=!1}}function ee(i){switch(i){case"running":return"success";case"registered":return"warning";case"stopped":return"neutral";default:return"danger"}}function te(i){return i?new Date(i).toLocaleString():"—"}return le(()=>{S(),V=window.setInterval(S,1e4)}),se(()=>{V&&window.clearInterval(V),b&&window.clearInterval(b)}),oe(()=>p.serviceName,S),(i,a)=>(o(),m(e(l),{direction:"vertical",gap:"1.25rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>{var s;return[n(e(P),{to:"/services",style:{"text-decoration":"none"}},{default:t(()=>[n(e(L),{size:"sm",variant:"ghost"},{default:t(()=>[...a[5]||(a[5]=[d("← Services",-1)])]),_:1})]),_:1}),v("strong",ge,u(B.serviceName),1),(s=f.value)!=null&&s.status?(o(),m(e(_),{key:0,tone:ee(f.value.status),variant:"soft"},{default:t(()=>[d(u(f.value.status),1)]),_:1},8,["tone"])):y("",!0)]}),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem"},{default:t(()=>{var s,w;return[n(e(L),{size:"sm",variant:"soft",disabled:((s=f.value)==null?void 0:s.status)==="running",loading:T.value,onClick:H},{default:t(()=>[...a[6]||(a[6]=[d(" Start ",-1)])]),_:1},8,["disabled","loading"]),n(e(L),{size:"sm",variant:"soft",disabled:((w=f.value)==null?void 0:w.status)!=="running",loading:F.value,onClick:W},{default:t(()=>[...a[7]||(a[7]=[d(" Stop ",-1)])]),_:1},8,["disabled","loading"]),n(e(L),{size:"sm",variant:"ghost",onClick:X},{default:t(()=>[...a[8]||(a[8]=[d("Logs",-1)])]),_:1}),n(e(L),{size:"sm",variant:"ghost",loading:R.value,onClick:S},{default:t(()=>[...a[9]||(a[9]=[d("Refresh",-1)])]),_:1},8,["loading"]),n(e(L),{size:"sm",variant:"danger",onClick:a[0]||(a[0]=N=>O.value=!0)},{default:t(()=>[...a[10]||(a[10]=[d("Delete",-1)])]),_:1})]}),_:1})]),_:1}),C.value?(o(),m(e(re),{key:0,variant:"danger",dismissible:"",onDismiss:a[1]||(a[1]=s=>C.value=null)},{default:t(()=>[d(u(C.value),1)]),_:1})):y("",!0),R.value&&!f.value?(o(),k("div",ye,[n(e(ie),{label:"Loading service..."})])):f.value?(o(),k(z,{key:2},[n(e(ue),{columns:5,gap:"1rem"},{default:t(()=>{var s,w,N,j,I;return[n(e(x),{label:"Lambdas",value:((s=r.value.lambda)==null?void 0:s.length)||0,tone:"info"},null,8,["value"]),n(e(x),{label:"Tables",value:((w=r.value.dynamodb)==null?void 0:w.length)||0,tone:"info"},null,8,["value"]),n(e(x),{label:"Queues",value:((N=r.value.sqs)==null?void 0:N.length)||0,tone:"warning"},null,8,["value"]),n(e(x),{label:"Topics",value:((j=r.value.sns)==null?void 0:j.length)||0,tone:"info"},null,8,["value"]),n(e(x),{label:"Buckets",value:((I=r.value.s3)==null?void 0:I.length)||0,tone:"neutral"},null,8,["value"])]}),_:1}),n(e(A),{variant:"outline"},{header:t(()=>[...a[11]||(a[11]=[v("strong",null,"Metadata",-1)])]),default:t(()=>[n(e(l),{direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[12]||(a[12]=v("span",{class:"muted"},"Path",-1)),v("span",be,u(f.value.root),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[13]||(a[13]=v("span",{class:"muted"},"Region",-1)),v("span",we,u(f.value.region||"—"),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[14]||(a[14]=v("span",{class:"muted"},"Invoke port",-1)),v("span",_e,u(f.value.invokePort??"—"),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[15]||(a[15]=v("span",{class:"muted"},"PID",-1)),v("span",ke,u(f.value.pid??"—"),1)]),_:1}),n(e(l),{direction:"horizontal",justify:"space-between"},{default:t(()=>[a[16]||(a[16]=v("span",{class:"muted"},"Last updated",-1)),v("span",null,u(te(f.value.lastUpdated)),1)]),_:1})]),_:1})]),_:1}),n(e(A),{variant:"outline"},{header:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:t(()=>[a[17]||(a[17]=v("strong",null,"Declared resources",-1)),n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>{var s;return[d(u(((s=f.value.resources)==null?void 0:s.length)||0)+" total ",1)]}),_:1})]),_:1})]),default:t(()=>{var s;return[(s=f.value.resources)!=null&&s.length?(o(),m(e(l),{key:1,direction:"vertical",gap:"1rem"},{default:t(()=>{var w,N,j,I,K,M;return[(w=r.value.dynamodb)!=null&&w.length?(o(),m(e(l),{key:0,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"info",variant:"soft"},{default:t(()=>[...a[18]||(a[18]=[d("DynamoDB tables",-1)])]),_:1}),v("span",ze,u(r.value.dynamodb.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.dynamodb,c=>(o(),m(e(P),{key:`db-${c.name}`,to:`/dynamo/${encodeURIComponent(c.name)}`,style:{"text-decoration":"none"}},{default:t(()=>[n(e($),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[d(u(c.name),1)]),_:2},1024)]),_:2},1032,["to"]))),128))]),_:1})]),_:1})):y("",!0),(N=r.value.sqs)!=null&&N.length?(o(),m(e(l),{key:1,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"warning",variant:"soft"},{default:t(()=>[...a[19]||(a[19]=[d("SQS queues",-1)])]),_:1}),v("span",he,u(r.value.sqs.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.sqs,c=>(o(),m(e(P),{key:`q-${c.name}`,to:"/queues",style:{"text-decoration":"none"}},{default:t(()=>[n(e($),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[d(u(c.name),1)]),_:2},1024)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0),(j=r.value.sns)!=null&&j.length?(o(),m(e(l),{key:2,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"info",variant:"soft"},{default:t(()=>[...a[20]||(a[20]=[d("SNS topics",-1)])]),_:1}),v("span",Se,u(r.value.sns.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.sns,c=>(o(),m(e($),{key:`t-${c.name}`,size:"sm",variant:"soft"},{default:t(()=>[d(u(c.name),1)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0),(I=r.value.s3)!=null&&I.length?(o(),m(e(l),{key:3,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>[...a[21]||(a[21]=[d("S3 buckets",-1)])]),_:1}),v("span",Ne,u(r.value.s3.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.s3,c=>(o(),m(e(P),{key:`b-${c.name}`,to:`/buckets/${encodeURIComponent(c.name)}`,style:{"text-decoration":"none"}},{default:t(()=>[n(e($),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[d(u(c.name),1)]),_:2},1024)]),_:2},1032,["to"]))),128))]),_:1})]),_:1})):y("",!0),(K=r.value.lambda)!=null&&K.length?(o(),m(e(l),{key:4,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>[...a[22]||(a[22]=[d("Lambda functions",-1)])]),_:1}),v("span",Le,u(r.value.lambda.length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value.lambda,c=>(o(),m(e($),{key:`l-${c.name}`,size:"sm",variant:"soft"},{default:t(()=>[d(" λ "+u(c.name),1)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0),(M=r.value["event-source"])!=null&&M.length?(o(),m(e(l),{key:5,direction:"vertical",gap:"0.5rem"},{default:t(()=>[n(e(l),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:t(()=>[n(e(_),{tone:"neutral",variant:"soft"},{default:t(()=>[...a[23]||(a[23]=[d("Event-source mappings",-1)])]),_:1}),v("span",De,u(r.value["event-source"].length),1)]),_:1}),n(e(l),{direction:"horizontal",gap:"0.375rem",wrap:""},{default:t(()=>[(o(!0),k(z,null,D(r.value["event-source"],(c,ae)=>(o(),m(e($),{key:`es-${ae}-${c.name}`,size:"sm",variant:"outline"},{default:t(()=>[d(u(c.name),1)]),_:2},1024))),128))]),_:1})]),_:1})):y("",!0)]}),_:1})):(o(),m(e(de),{key:0,title:"No resources declared",description:"This service's CloudFormation template has no resources LSS understands yet."}))]}),_:1})],64)):y("",!0),n(e(ve),{open:U.value,"onUpdate:open":[a[2]||(a[2]=s=>U.value=s),a[3]||(a[3]=s=>{s||Y()})],title:`Logs — ${B.serviceName}`,description:`Status: ${Q.value}`,size:"lg"},{default:t(()=>[v("pre",$e,u(E.value.join(`
2
2
  `)||"— no output yet —"),1)]),_:1},8,["open","title","description"]),n(e(ce),{open:O.value,"onUpdate:open":a[4]||(a[4]=s=>O.value=s),title:`Delete service “${B.serviceName}”?`,description:"This removes the service from the cache and cleans up its provisioned resources in LocalStack.","confirm-label":"Delete","cancel-label":"Cancel","confirm-variant":"danger",onConfirm:Z},null,8,["open","title"])]),_:1}))}});export{je as default};
@@ -1,2 +1,2 @@
1
- import{o as A,v as ee,u as te,w as o,i as c,G as n,K as ae,S as s,k as K,n as r,R as se,J as ne,V as re,f as L,A as w,m as l,E as u,B as h,j as _,h as x,_ as le,a as ie,a0 as oe,q as ue,Z as de,p as ce,W as ve,y as i,g as O,d as b,O as fe}from"./index-D3WwZ4lY.js";const ge={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},pe={style:{"text-decoration":"underline","text-decoration-style":"dotted","text-underline-offset":"3px"}},me={class:"mono"},ye={key:5,class:"muted",style:{"font-size":"0.75rem"}},ke={class:"logs-pre"},Se=A({__name:"ServicesList",setup(M){const d=fe(),B=i([]),V=i(!0),C=i(!1),f=i(""),m=i(null),$=i([]),U=i("stopped"),v=i(null),g=i({}),p=i({}),y=i(null),z=i(!1);let D=null;const P=[{key:"name",label:"Name"},{key:"status",label:"Status"},{key:"root",label:"Path"},{key:"resourceBreakdown",label:"Resources"},{key:"lastUpdated",label:"Last updated"},{key:"actions",label:"Actions",align:"right"}],E=O(()=>B.value.map(t=>({...t}))),j=O({get:()=>m.value!==null,set:t=>{t||Z()}});async function k(){try{B.value=await b.listServices()}catch(t){console.error("Failed to load services:",t)}finally{V.value=!1}}async function J(t){if(!g.value[t]){g.value={...g.value,[t]:!0};try{await b.startService(t),d.add({title:"Service started",description:t,variant:"success"}),await k()}catch(a){d.add({title:"Failed to start service",description:a.message,variant:"danger"})}finally{g.value={...g.value,[t]:!1}}}}async function G(t){if(!p.value[t]){p.value={...p.value,[t]:!0};try{await b.stopService(t),d.add({title:"Service stopped",description:t,variant:"info"}),await k()}catch(a){d.add({title:"Failed to stop service",description:a.message,variant:"danger"})}finally{p.value={...p.value,[t]:!1}}}}async function F(t){try{const a=await b.getServiceLogs(t);$.value=a.logs||[],U.value=a.status||"stopped"}catch(a){console.error("Failed to fetch logs:",a)}}function W(t){m.value=t,F(t),v.value&&window.clearInterval(v.value),v.value=window.setInterval(()=>F(t),2e3)}function Z(){m.value=null,$.value=[],v.value&&window.clearInterval(v.value),v.value=null}async function I(){if(f.value.trim()){C.value=!0;try{await b.registerService(f.value),d.add({title:"Service registered",description:f.value,variant:"success"}),f.value="",await k()}catch(t){d.add({title:"Failed to register service",description:t.message,variant:"danger"})}finally{C.value=!1}}}function H(t){y.value=t,z.value=!0}async function Q(){if(!y.value)return;const t=y.value;try{await b.deleteService(t),d.add({title:"Service deleted",description:t,variant:"info"}),await k()}catch(a){d.add({title:"Failed to delete service",description:a.message,variant:"danger"})}finally{y.value=null,z.value=!1}}function X(t){return new Date(t).toLocaleString()}function Y(t){switch(t){case"running":return"success";case"registered":return"warning";case"stopped":return"neutral";default:return"danger"}}return ee(()=>{k(),D=window.setInterval(k,1e4)}),te(()=>{D&&window.clearInterval(D),v.value&&window.clearInterval(v.value)}),(t,a)=>(o(),c(n(ae),{variant:"outline"},{header:s(()=>[r(n(L),{direction:"horizontal",gap:"0.75rem",align:"center",justify:"space-between"},{default:s(()=>[a[4]||(a[4]=x("strong",null,"Microservices",-1)),r(n(L),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:s(()=>[r(n(de),{hint:"Absolute path to a Serverless project",htmlFor:"register-path"},{default:s(()=>[r(n(ce),{modelValue:f.value,"onUpdate:modelValue":a[0]||(a[0]=e=>f.value=e),placeholder:"/path/to/microservice",disabled:C.value,onKeyup:ve(I,["enter"])},null,8,["modelValue","disabled"])]),_:1}),r(n(w),{variant:"solid",loading:C.value,disabled:!f.value.trim(),onClick:I},{default:s(()=>[...a[3]||(a[3]=[l(" Register ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),_:1})]),default:s(()=>[V.value?(o(),K("div",ge,[r(n(se),{label:"Loading services..."})])):B.value.length?(o(),c(n(re),{key:2,columns:P,rows:E.value},{"cell-name":s(({row:e})=>[r(n(ie),{to:`/services/${encodeURIComponent(String(e.name))}`,style:{color:"inherit","text-decoration":"none"}},{default:s(()=>[x("strong",pe,u(e.name),1)]),_:2},1032,["to"])]),"cell-status":s(({row:e})=>[r(n(le),{tone:Y(String(e.status)),variant:"soft"},{default:s(()=>[l(u(e.status),1)]),_:2},1032,["tone"])]),"cell-root":s(({row:e})=>[x("span",me,u(e.root),1)]),"cell-resourceBreakdown":s(({row:e})=>[r(n(L),{direction:"horizontal",gap:"0.25rem",wrap:""},{default:s(()=>{var S,N,R,T,q;return[(S=e.resourceBreakdown)!=null&&S.lambdas?(o(),c(n(h),{key:0,size:"sm",variant:"soft"},{default:s(()=>[l(" λ "+u(e.resourceBreakdown.lambdas),1)]),_:2},1024)):_("",!0),(N=e.resourceBreakdown)!=null&&N.tables?(o(),c(n(h),{key:1,size:"sm",variant:"soft"},{default:s(()=>[l(" 🗄 "+u(e.resourceBreakdown.tables),1)]),_:2},1024)):_("",!0),(R=e.resourceBreakdown)!=null&&R.queues?(o(),c(n(h),{key:2,size:"sm",variant:"soft"},{default:s(()=>[l(" 📨 "+u(e.resourceBreakdown.queues),1)]),_:2},1024)):_("",!0),(T=e.resourceBreakdown)!=null&&T.topics?(o(),c(n(h),{key:3,size:"sm",variant:"soft"},{default:s(()=>[l(" 📣 "+u(e.resourceBreakdown.topics),1)]),_:2},1024)):_("",!0),(q=e.resourceBreakdown)!=null&&q.buckets?(o(),c(n(h),{key:4,size:"sm",variant:"soft"},{default:s(()=>[l(" 🪣 "+u(e.resourceBreakdown.buckets),1)]),_:2},1024)):_("",!0),e.resourcesCount?_("",!0):(o(),K("span",ye," none "))]}),_:2},1024)]),"cell-lastUpdated":s(({row:e})=>[l(u(X(Number(e.lastUpdated))),1)]),"cell-actions":s(({row:e})=>[r(n(L),{direction:"horizontal",gap:"0.375rem",justify:"flex-end",wrap:""},{default:s(()=>[r(n(w),{size:"sm",variant:"soft",disabled:e.status==="running"||g.value[String(e.name)],loading:g.value[String(e.name)],onClick:S=>J(String(e.name))},{default:s(()=>[...a[5]||(a[5]=[l(" Start ",-1)])]),_:1},8,["disabled","loading","onClick"]),r(n(w),{size:"sm",variant:"soft",disabled:e.status!=="running"||p.value[String(e.name)],loading:p.value[String(e.name)],onClick:S=>G(String(e.name))},{default:s(()=>[...a[6]||(a[6]=[l(" Stop ",-1)])]),_:1},8,["disabled","loading","onClick"]),r(n(w),{size:"sm",variant:"ghost",onClick:S=>W(String(e.name))},{default:s(()=>[...a[7]||(a[7]=[l(" Logs ",-1)])]),_:1},8,["onClick"]),r(n(w),{size:"sm",variant:"danger",onClick:S=>H(String(e.name))},{default:s(()=>[...a[8]||(a[8]=[l(" Delete ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1},8,["rows"])):(o(),c(n(ne),{key:1,title:"No services registered",description:"Register your first microservice using the form above."})),r(n(oe),{open:j.value,"onUpdate:open":a[1]||(a[1]=e=>j.value=e),title:m.value?`Logs — ${m.value}`:"Logs",description:m.value?`Status: ${U.value}`:"",size:"lg"},{default:s(()=>[x("pre",ke,u($.value.join(`
1
+ import{o as A,v as ee,u as te,w as o,i as c,G as n,K as ae,S as s,k as K,n as r,R as se,J as ne,V as re,f as L,A as w,m as l,E as u,B as h,j as _,h as x,_ as le,a as ie,a0 as oe,q as ue,Z as de,p as ce,W as ve,y as i,g as O,d as b,O as fe}from"./index-BWlB542w.js";const ge={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},pe={style:{"text-decoration":"underline","text-decoration-style":"dotted","text-underline-offset":"3px"}},me={class:"mono"},ye={key:5,class:"muted",style:{"font-size":"0.75rem"}},ke={class:"logs-pre"},Se=A({__name:"ServicesList",setup(M){const d=fe(),B=i([]),V=i(!0),C=i(!1),f=i(""),m=i(null),$=i([]),U=i("stopped"),v=i(null),g=i({}),p=i({}),y=i(null),z=i(!1);let D=null;const P=[{key:"name",label:"Name"},{key:"status",label:"Status"},{key:"root",label:"Path"},{key:"resourceBreakdown",label:"Resources"},{key:"lastUpdated",label:"Last updated"},{key:"actions",label:"Actions",align:"right"}],E=O(()=>B.value.map(t=>({...t}))),j=O({get:()=>m.value!==null,set:t=>{t||Z()}});async function k(){try{B.value=await b.listServices()}catch(t){console.error("Failed to load services:",t)}finally{V.value=!1}}async function J(t){if(!g.value[t]){g.value={...g.value,[t]:!0};try{await b.startService(t),d.add({title:"Service started",description:t,variant:"success"}),await k()}catch(a){d.add({title:"Failed to start service",description:a.message,variant:"danger"})}finally{g.value={...g.value,[t]:!1}}}}async function G(t){if(!p.value[t]){p.value={...p.value,[t]:!0};try{await b.stopService(t),d.add({title:"Service stopped",description:t,variant:"info"}),await k()}catch(a){d.add({title:"Failed to stop service",description:a.message,variant:"danger"})}finally{p.value={...p.value,[t]:!1}}}}async function F(t){try{const a=await b.getServiceLogs(t);$.value=a.logs||[],U.value=a.status||"stopped"}catch(a){console.error("Failed to fetch logs:",a)}}function W(t){m.value=t,F(t),v.value&&window.clearInterval(v.value),v.value=window.setInterval(()=>F(t),2e3)}function Z(){m.value=null,$.value=[],v.value&&window.clearInterval(v.value),v.value=null}async function I(){if(f.value.trim()){C.value=!0;try{await b.registerService(f.value),d.add({title:"Service registered",description:f.value,variant:"success"}),f.value="",await k()}catch(t){d.add({title:"Failed to register service",description:t.message,variant:"danger"})}finally{C.value=!1}}}function H(t){y.value=t,z.value=!0}async function Q(){if(!y.value)return;const t=y.value;try{await b.deleteService(t),d.add({title:"Service deleted",description:t,variant:"info"}),await k()}catch(a){d.add({title:"Failed to delete service",description:a.message,variant:"danger"})}finally{y.value=null,z.value=!1}}function X(t){return new Date(t).toLocaleString()}function Y(t){switch(t){case"running":return"success";case"registered":return"warning";case"stopped":return"neutral";default:return"danger"}}return ee(()=>{k(),D=window.setInterval(k,1e4)}),te(()=>{D&&window.clearInterval(D),v.value&&window.clearInterval(v.value)}),(t,a)=>(o(),c(n(ae),{variant:"outline"},{header:s(()=>[r(n(L),{direction:"horizontal",gap:"0.75rem",align:"center",justify:"space-between"},{default:s(()=>[a[4]||(a[4]=x("strong",null,"Microservices",-1)),r(n(L),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:s(()=>[r(n(de),{hint:"Absolute path to a Serverless project",htmlFor:"register-path"},{default:s(()=>[r(n(ce),{modelValue:f.value,"onUpdate:modelValue":a[0]||(a[0]=e=>f.value=e),placeholder:"/path/to/microservice",disabled:C.value,onKeyup:ve(I,["enter"])},null,8,["modelValue","disabled"])]),_:1}),r(n(w),{variant:"solid",loading:C.value,disabled:!f.value.trim(),onClick:I},{default:s(()=>[...a[3]||(a[3]=[l(" Register ",-1)])]),_:1},8,["loading","disabled"])]),_:1})]),_:1})]),default:s(()=>[V.value?(o(),K("div",ge,[r(n(se),{label:"Loading services..."})])):B.value.length?(o(),c(n(re),{key:2,columns:P,rows:E.value},{"cell-name":s(({row:e})=>[r(n(ie),{to:`/services/${encodeURIComponent(String(e.name))}`,style:{color:"inherit","text-decoration":"none"}},{default:s(()=>[x("strong",pe,u(e.name),1)]),_:2},1032,["to"])]),"cell-status":s(({row:e})=>[r(n(le),{tone:Y(String(e.status)),variant:"soft"},{default:s(()=>[l(u(e.status),1)]),_:2},1032,["tone"])]),"cell-root":s(({row:e})=>[x("span",me,u(e.root),1)]),"cell-resourceBreakdown":s(({row:e})=>[r(n(L),{direction:"horizontal",gap:"0.25rem",wrap:""},{default:s(()=>{var S,N,R,T,q;return[(S=e.resourceBreakdown)!=null&&S.lambdas?(o(),c(n(h),{key:0,size:"sm",variant:"soft"},{default:s(()=>[l(" λ "+u(e.resourceBreakdown.lambdas),1)]),_:2},1024)):_("",!0),(N=e.resourceBreakdown)!=null&&N.tables?(o(),c(n(h),{key:1,size:"sm",variant:"soft"},{default:s(()=>[l(" 🗄 "+u(e.resourceBreakdown.tables),1)]),_:2},1024)):_("",!0),(R=e.resourceBreakdown)!=null&&R.queues?(o(),c(n(h),{key:2,size:"sm",variant:"soft"},{default:s(()=>[l(" 📨 "+u(e.resourceBreakdown.queues),1)]),_:2},1024)):_("",!0),(T=e.resourceBreakdown)!=null&&T.topics?(o(),c(n(h),{key:3,size:"sm",variant:"soft"},{default:s(()=>[l(" 📣 "+u(e.resourceBreakdown.topics),1)]),_:2},1024)):_("",!0),(q=e.resourceBreakdown)!=null&&q.buckets?(o(),c(n(h),{key:4,size:"sm",variant:"soft"},{default:s(()=>[l(" 🪣 "+u(e.resourceBreakdown.buckets),1)]),_:2},1024)):_("",!0),e.resourcesCount?_("",!0):(o(),K("span",ye," none "))]}),_:2},1024)]),"cell-lastUpdated":s(({row:e})=>[l(u(X(Number(e.lastUpdated))),1)]),"cell-actions":s(({row:e})=>[r(n(L),{direction:"horizontal",gap:"0.375rem",justify:"flex-end",wrap:""},{default:s(()=>[r(n(w),{size:"sm",variant:"soft",disabled:e.status==="running"||g.value[String(e.name)],loading:g.value[String(e.name)],onClick:S=>J(String(e.name))},{default:s(()=>[...a[5]||(a[5]=[l(" Start ",-1)])]),_:1},8,["disabled","loading","onClick"]),r(n(w),{size:"sm",variant:"soft",disabled:e.status!=="running"||p.value[String(e.name)],loading:p.value[String(e.name)],onClick:S=>G(String(e.name))},{default:s(()=>[...a[6]||(a[6]=[l(" Stop ",-1)])]),_:1},8,["disabled","loading","onClick"]),r(n(w),{size:"sm",variant:"ghost",onClick:S=>W(String(e.name))},{default:s(()=>[...a[7]||(a[7]=[l(" Logs ",-1)])]),_:1},8,["onClick"]),r(n(w),{size:"sm",variant:"danger",onClick:S=>H(String(e.name))},{default:s(()=>[...a[8]||(a[8]=[l(" Delete ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1},8,["rows"])):(o(),c(n(ne),{key:1,title:"No services registered",description:"Register your first microservice using the form above."})),r(n(oe),{open:j.value,"onUpdate:open":a[1]||(a[1]=e=>j.value=e),title:m.value?`Logs — ${m.value}`:"Logs",description:m.value?`Status: ${U.value}`:"",size:"lg"},{default:s(()=>[x("pre",ke,u($.value.join(`
2
2
  `)||"— no output yet —"),1)]),_:1},8,["open","title","description"]),r(n(ue),{open:z.value,"onUpdate:open":a[2]||(a[2]=e=>z.value=e),title:`Delete service${y.value?` “${y.value}”`:""}?`,description:"This removes the service from the cache and cleans up its provisioned resources in LocalStack.","confirm-label":"Delete","cancel-label":"Cancel","confirm-variant":"danger",onConfirm:Q},null,8,["open","title"])]),_:1}))}}),be=A({__name:"ServicesPage",setup(M){return(d,B)=>(o(),c(Se))}});export{be as default};