lula2 0.5.0-nightly.3 → 0.5.0-nightly.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lula2",
3
- "version": "0.5.0-nightly.3",
3
+ "version": "0.5.0-nightly.4",
4
4
  "description": "A tool for managing compliance as code in your GitHub repositories.",
5
5
  "bin": {
6
6
  "lula2": "./dist/lula2"
@@ -66,7 +66,7 @@
66
66
  "@types/cors": "^2.8.19",
67
67
  "@types/express": "^5.0.3",
68
68
  "@types/js-yaml": "^4.0.9",
69
- "@types/jsdom": "^21.1.7",
69
+ "@types/jsdom": "^27.0.0",
70
70
  "@types/multer": "^2.0.0",
71
71
  "@types/node": "^24.4.0",
72
72
  "@typescript-eslint/eslint-plugin": "^8.42.0",
@@ -127,108 +127,138 @@ class WebSocketClient {
127
127
 
128
128
  switch (message.type) {
129
129
  case 'connected':
130
- console.log('WebSocket connection confirmed');
131
- appState.update((state) => ({ ...state, isConnected: true }));
130
+ this.handleConnected();
132
131
  break;
133
-
134
132
  case 'state-update':
135
- console.log('State update received');
136
- // Update the entire app state with the payload
137
- if (message.payload) {
138
- appState.set({
139
- ...message.payload,
140
- isConnected: true,
141
- isSwitchingControlSet: false // Clear switching flag after state update
142
- });
143
- }
133
+ this.handleStateUpdate(message.payload);
144
134
  break;
145
-
146
135
  case 'metadata-update':
147
- console.log('Metadata update received');
148
- // Update metadata and control set info
149
- if (message.payload) {
150
- appState.update((state) => ({
151
- ...state,
152
- ...message.payload,
153
- isConnected: true,
154
- isSwitchingControlSet: false // Clear switching flag
155
- }));
156
- }
136
+ this.handleMetadataUpdate(message.payload);
157
137
  break;
158
-
159
138
  case 'controls-update':
160
- console.log('Controls update received');
161
- // Update just the controls array
162
- if (message.payload) {
163
- appState.update((state) => ({
164
- ...state,
165
- controls: message.payload
166
- }));
167
- }
139
+ this.handleControlsUpdate(message.payload);
168
140
  break;
169
-
170
141
  case 'mappings-update':
171
- console.log('Mappings update received');
172
- // Update just the mappings array
173
- if (message.payload) {
174
- appState.update((state) => ({
175
- ...state,
176
- mappings: message.payload
177
- }));
178
- }
142
+ this.handleMappingsUpdate(message.payload);
179
143
  break;
180
-
181
144
  case 'control-details':
182
- console.log('Control details received:', message.payload);
183
- // Emit a custom event for control details
184
- if (message.payload) {
185
- window.dispatchEvent(
186
- new CustomEvent('control-details', {
187
- detail: message.payload
188
- })
189
- );
190
- }
145
+ this.handleControlDetails(message.payload);
191
146
  break;
192
-
193
147
  case 'control-sets-list':
194
- console.log('Control sets list received');
195
- // Emit a custom event for control sets list
196
- if (message.payload) {
197
- window.dispatchEvent(
198
- new CustomEvent('control-sets-list', {
199
- detail: message.payload
200
- })
201
- );
202
- }
148
+ this.handleControlSetsList(message.payload);
203
149
  break;
204
-
205
150
  case 'control-updated':
206
- console.log('Control updated successfully:', message.payload);
207
- // Don't trigger any state updates - the component already has the updated data
208
- // This just confirms the save was successful
151
+ this.handleControlUpdated(message.payload);
209
152
  break;
210
-
211
153
  case 'mapping-created':
212
154
  case 'mapping-updated':
213
155
  case 'mapping-deleted':
214
- console.log(`Mapping operation successful: ${message.type}`, message.payload);
215
- // Emit an event so the control details panel can refresh its mappings
216
- window.dispatchEvent(
217
- new CustomEvent('mappings-changed', {
218
- detail: message.payload
219
- })
220
- );
156
+ this.handleMappingOperation(message.type, message.payload);
221
157
  break;
222
-
223
158
  case 'error':
224
- console.error('WebSocket error:', message.payload);
159
+ this.handleError(message.payload);
225
160
  break;
226
-
227
161
  default:
228
162
  console.warn('Unknown WebSocket message type:', message.type);
229
163
  }
230
164
  }
231
165
 
166
+ handleConnected() {
167
+ console.log('WebSocket connection confirmed');
168
+ appState.update((state) => ({ ...state, isConnected: true }));
169
+ }
170
+
171
+ handleStateUpdate(payload: any) {
172
+ console.log('State update received');
173
+ // Update the entire app state with the payload
174
+ if (payload) {
175
+ appState.set({
176
+ ...payload,
177
+ isConnected: true,
178
+ isSwitchingControlSet: false // Clear switching flag after state update
179
+ });
180
+ }
181
+ }
182
+
183
+ handleMetadataUpdate(payload: any) {
184
+ console.log('Metadata update received');
185
+ // Update metadata and control set info
186
+ if (payload) {
187
+ appState.update((state) => ({
188
+ ...state,
189
+ ...payload,
190
+ isConnected: true,
191
+ isSwitchingControlSet: false // Clear switching flag
192
+ }));
193
+ }
194
+ }
195
+
196
+ handleControlsUpdate(payload: any) {
197
+ console.log('Controls update received');
198
+ // Update just the controls array
199
+ if (payload) {
200
+ appState.update((state) => ({
201
+ ...state,
202
+ controls: payload
203
+ }));
204
+ }
205
+ }
206
+
207
+ handleMappingsUpdate(payload: any) {
208
+ console.log('Mappings update received');
209
+ // Update just the mappings array
210
+ if (payload) {
211
+ appState.update((state) => ({
212
+ ...state,
213
+ mappings: payload
214
+ }));
215
+ }
216
+ }
217
+
218
+ handleControlDetails(payload: any) {
219
+ console.log('Control details received:', payload);
220
+ // Emit a custom event for control details
221
+ if (payload) {
222
+ window.dispatchEvent(
223
+ new CustomEvent('control-details', {
224
+ detail: payload
225
+ })
226
+ );
227
+ }
228
+ }
229
+
230
+ handleControlSetsList(payload: any) {
231
+ console.log('Control sets list received');
232
+ // Emit a custom event for control sets list
233
+ if (payload) {
234
+ window.dispatchEvent(
235
+ new CustomEvent('control-sets-list', {
236
+ detail: payload
237
+ })
238
+ );
239
+ }
240
+ }
241
+
242
+ handleControlUpdated(payload: any) {
243
+ console.log('Control updated successfully:', payload);
244
+ // Don't trigger any state updates - the component already has the updated data
245
+ // This just confirms the save was successful
246
+ }
247
+
248
+ handleMappingOperation(type: string, payload: any) {
249
+ console.log(`Mapping operation successful: ${type}`, payload);
250
+ // Emit an event so the control details panel can refresh its mappings
251
+ window.dispatchEvent(
252
+ new CustomEvent('mappings-changed', {
253
+ detail: payload
254
+ })
255
+ );
256
+ }
257
+
258
+ handleError(payload: any) {
259
+ console.error('WebSocket error:', payload);
260
+ }
261
+
232
262
  private scheduleReconnect() {
233
263
  if (this.reconnectTimer) {
234
264
  clearTimeout(this.reconnectTimer);
@@ -1,2 +0,0 @@
1
- import{O as K,l as E,at as Ne,v as de,m as Me,t as re,h as te,a3 as Oe,L as Ie,M as We,N as ie,P as $,z as L,au as De,av as Le,w as U,y as Pe,x as W,aw as ve,ax as he,T as Re,ab as oe,ay as le,Q as pe,A as $e,az as B,aA as X,aB as q,aC as J,aD as He,aE as Ue,aF as qe,aG as Ve,aH as Fe,a1 as Ye,q as Be,aI as we,aJ as Je,i as ne,aK as se,aL as ze,aM as Ge,X as Ke,aN as Xe,aO as Qe,aP as Ze,aQ as je,aR as xe,aS as et,aT as tt,U as at,aU as rt,aV as nt,aW as st,aX as it,aY as ot,aZ as lt,a_ as ct,ai as ft,k as be,j as _e,a$ as ut,b0 as dt}from"./BIY1u1I9.js";function Tt(e,t){return t}function vt(e,t,a){for(var r=e.items,n=[],s=t.length,o=0;o<s;o++)qe(t[o].e,n,!0);var f=s>0&&n.length===0&&a!==null;if(f){var h=a.parentNode;Ve(h),h.append(a),r.clear(),M(e,t[0].prev,t[s-1].next)}Fe(n,()=>{for(var v=0;v<s;v++){var b=t[v];f||(r.delete(b.k),M(e,b.prev,b.next)),q(b.e,!f)}})}function Nt(e,t,a,r,n,s=null){var o=e,f={flags:t,items:new Map,first:null},h=(t&we)!==0;if(h){var v=e;o=E?K(Ne(v)):v.appendChild(de())}E&&Me();var b=null,_=!1,u=new Map,C=Oe(()=>{var g=a();return he(g)?g:g==null?[]:ve(g)}),c,p;function d(){ht(p,c,f,u,o,n,t,r,a),s!==null&&(c.length===0?b?pe(b):b=U(()=>s(o)):b!==null&&$e(b,()=>{b=null}))}re(()=>{p??=Ye,c=te(C);var g=c.length;if(_&&g===0)return;_=g===0;let A=!1;if(E){var m=Ie(o)===We;m!==(g===0)&&(o=ie(),K(o),$(!1),A=!0)}if(E){for(var S=null,k,i=0;i<g;i++){if(L.nodeType===De&&L.data===Le){o=L,A=!0,$(!1);break}var l=c[i],w=r(l,i);k=ae(L,f,S,null,l,w,i,n,t,a),f.items.set(w,k),S=k}g>0&&K(ie())}if(E)g===0&&s&&(b=U(()=>s(o)));else if(Pe()){var T=new Set,y=W;for(i=0;i<g;i+=1){l=c[i],w=r(l,i);var O=f.items.get(w)??u.get(w);O?(t&(J|B))!==0&&Se(O,l,i,t):(k=ae(null,f,null,null,l,w,i,n,t,a,!0),u.set(w,k)),T.add(w)}for(const[N,V]of f.items)T.has(N)||y.skipped_effects.add(V.e);y.add_callback(d)}else d();A&&$(!0),te(C)}),E&&(o=L)}function ht(e,t,a,r,n,s,o,f,h){var v=(o&Je)!==0,b=(o&(J|B))!==0,_=t.length,u=a.items,C=a.first,c=C,p,d=null,g,A=[],m=[],S,k,i,l;if(v)for(l=0;l<_;l+=1)S=t[l],k=f(S,l),i=u.get(k),i!==void 0&&(i.a?.measure(),(g??=new Set).add(i));for(l=0;l<_;l+=1){if(S=t[l],k=f(S,l),i=u.get(k),i===void 0){var w=r.get(k);if(w!==void 0){r.delete(k),u.set(k,w);var T=d?d.next:c;M(a,d,w),M(a,w,T),Q(w,T,n),d=w}else{var y=c?c.e.nodes_start:n;d=ae(y,a,d,d===null?a.first:d.next,S,k,l,s,o,h)}u.set(k,d),A=[],m=[],c=d.next;continue}if(b&&Se(i,S,l,o),(i.e.f&X)!==0&&(pe(i.e),v&&(i.a?.unfix(),(g??=new Set).delete(i))),i!==c){if(p!==void 0&&p.has(i)){if(A.length<m.length){var O=m[0],N;d=O.prev;var V=A[0],z=A[A.length-1];for(N=0;N<A.length;N+=1)Q(A[N],O,n);for(N=0;N<m.length;N+=1)p.delete(m[N]);M(a,V.prev,z.next),M(a,d,V),M(a,z,O),c=O,d=z,l-=1,A=[],m=[]}else p.delete(i),Q(i,c,n),M(a,i.prev,i.next),M(a,i,d===null?a.first:d.next),M(a,d,i),d=i;continue}for(A=[],m=[];c!==null&&c.k!==k;)(c.e.f&X)===0&&(p??=new Set).add(c),m.push(c),c=c.next;if(c===null)continue;i=c}A.push(i),d=i,c=i.next}if(c!==null||p!==void 0){for(var D=p===void 0?[]:ve(p);c!==null;)(c.e.f&X)===0&&D.push(c),c=c.next;var G=D.length;if(G>0){var me=(o&we)!==0&&_===0?n:null;if(v){for(l=0;l<G;l+=1)D[l].a?.measure();for(l=0;l<G;l+=1)D[l].a?.fix()}vt(a,D,me)}}v&&Be(()=>{if(g!==void 0)for(i of g)i.a?.apply()}),e.first=a.first&&a.first.e,e.last=d&&d.e;for(var Te of r.values())q(Te.e);r.clear()}function Se(e,t,a,r){(r&J)!==0&&le(e.v,t),(r&B)!==0?le(e.i,a):e.i=a}function ae(e,t,a,r,n,s,o,f,h,v,b){var _=(h&J)!==0,u=(h&He)===0,C=_?u?Re(n,!1,!1):oe(n):n,c=(h&B)===0?o:oe(o),p={i:c,v:C,k:s,a:null,e:null,prev:a,next:r};try{if(e===null){var d=document.createDocumentFragment();d.append(e=de())}return p.e=U(()=>f(e,C,c,v),E),p.e.prev=a&&a.e,p.e.next=r&&r.e,a===null?b||(t.first=p):(a.next=p,a.e.next=p.e),r!==null&&(r.prev=p,r.e.prev=p.e),p}finally{}}function Q(e,t,a){for(var r=e.next?e.next.e.nodes_start:a,n=t?t.e.nodes_start:a,s=e.e.nodes_start;s!==null&&s!==r;){var o=Ue(s);n.before(s),s=o}}function M(e,t,a){t===null?e.first=a:(t.next=a,t.e.next=a&&a.e),a!==null&&(a.prev=t,a.e.prev=t&&t.e)}function pt(e,t){var a=void 0,r;re(()=>{a!==(a=t())&&(r&&(q(r),r=null),a&&(r=U(()=>{ne(()=>a(e))})))})}function ge(e){var t,a,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e)){var n=e.length;for(t=0;t<n;t++)e[t]&&(a=ge(e[t]))&&(r&&(r+=" "),r+=a)}else for(a in e)e[a]&&(r&&(r+=" "),r+=a);return r}function wt(){for(var e,t,a=0,r="",n=arguments.length;a<n;a++)(e=arguments[a])&&(t=ge(e))&&(r&&(r+=" "),r+=t);return r}function bt(e){return typeof e=="object"?wt(e):e??""}const ce=[...`
2
- \r\f \v\uFEFF`];function _t(e,t,a){var r=e==null?"":""+e;if(t&&(r=r?r+" "+t:t),a){for(var n in a)if(a[n])r=r?r+" "+n:n;else if(r.length)for(var s=n.length,o=0;(o=r.indexOf(n,o))>=0;){var f=o+s;(o===0||ce.includes(r[o-1]))&&(f===r.length||ce.includes(r[f]))?r=(o===0?"":r.substring(0,o))+r.substring(f+1):o=f}}return r===""?null:r}function fe(e,t=!1){var a=t?" !important;":";",r="";for(var n in e){var s=e[n];s!=null&&s!==""&&(r+=" "+n+": "+s+a)}return r}function Z(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function St(e,t){if(t){var a="",r,n;if(Array.isArray(t)?(r=t[0],n=t[1]):r=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,o=0,f=!1,h=[];r&&h.push(...Object.keys(r).map(Z)),n&&h.push(...Object.keys(n).map(Z));var v=0,b=-1;const p=e.length;for(var _=0;_<p;_++){var u=e[_];if(f?u==="/"&&e[_-1]==="*"&&(f=!1):s?s===u&&(s=!1):u==="/"&&e[_+1]==="*"?f=!0:u==='"'||u==="'"?s=u:u==="("?o++:u===")"&&o--,!f&&s===!1&&o===0){if(u===":"&&b===-1)b=_;else if(u===";"||_===p-1){if(b!==-1){var C=Z(e.substring(v,b).trim());if(!h.includes(C)){u!==";"&&_++;var c=e.substring(v,_).trim();a+=" "+c+";"}}v=_+1,b=-1}}}}return r&&(a+=fe(r)),n&&(a+=fe(n,!0)),a=a.trim(),a===""?null:a}return e==null?null:String(e)}function gt(e,t,a,r,n,s){var o=e.__className;if(E||o!==a||o===void 0){var f=_t(a,r,s);(!E||f!==e.getAttribute("class"))&&(f==null?e.removeAttribute("class"):t?e.className=f:e.setAttribute("class",f)),e.__className=a}else if(s&&n!==s)for(var h in s){var v=!!s[h];(n==null||v!==!!n[h])&&e.classList.toggle(h,v)}return s}function j(e,t={},a,r){for(var n in a){var s=a[n];t[n]!==s&&(a[n]==null?e.style.removeProperty(n):e.style.setProperty(n,s,r))}}function yt(e,t,a,r){var n=e.__style;if(E||n!==t){var s=St(t,r);(!E||s!==e.getAttribute("style"))&&(s==null?e.removeAttribute("style"):e.style.cssText=s),e.__style=t}else r&&(Array.isArray(r)?(j(e,a?.[0],r[0]),j(e,a?.[1],r[1],"important")):j(e,a,r));return r}function F(e,t,a=!1){if(e.multiple){if(t==null)return;if(!he(t))return ze();for(var r of e.options)r.selected=t.includes(H(r));return}for(r of e.options){var n=H(r);if(Ge(n,t)){r.selected=!0;return}}(!a||t!==void 0)&&(e.selectedIndex=-1)}function ye(e){var t=new MutationObserver(()=>{F(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Ke(()=>{t.disconnect()})}function Mt(e,t,a=t){var r=!0;se(e,"change",n=>{var s=n?"[selected]":":checked",o;if(e.multiple)o=[].map.call(e.querySelectorAll(s),H);else{var f=e.querySelector(s)??e.querySelector("option:not([disabled])");o=f&&H(f)}a(o)}),ne(()=>{var n=t();if(F(e,n,r),r&&n===void 0){var s=e.querySelector(":checked");s!==null&&(n=H(s),a(n))}e.__value=n,r=!1}),ye(e)}function H(e){return"__value"in e?e.__value:e.value}const P=Symbol("class"),R=Symbol("style"),Ce=Symbol("is custom element"),ke=Symbol("is html");function Ct(e){if(E){var t=!1,a=()=>{if(!t){if(t=!0,e.hasAttribute("value")){var r=e.value;Y(e,"value",null),e.value=r}if(e.hasAttribute("checked")){var n=e.checked;Y(e,"checked",null),e.checked=n}}};e.__on_r=a,rt(a),nt()}}function kt(e,t){t?e.hasAttribute("selected")||e.setAttribute("selected",""):e.removeAttribute("selected")}function Y(e,t,a,r){var n=Ae(e);E&&(n[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName==="LINK")||n[t]!==(n[t]=a)&&(t==="loading"&&(e[ot]=a),a==null?e.removeAttribute(t):typeof a!="string"&&Ee(e).includes(t)?e[t]=a:e.setAttribute(t,a))}function At(e,t,a,r,n=!1,s=!1){if(E&&n&&e.tagName==="INPUT"){var o=e,f=o.type==="checkbox"?"defaultChecked":"defaultValue";f in a||Ct(o)}var h=Ae(e),v=h[Ce],b=!h[ke];let _=E&&v;_&&$(!1);var u=t||{},C=e.tagName==="OPTION";for(var c in t)c in a||(a[c]=null);a.class?a.class=bt(a.class):a[P]&&(a.class=null),a[R]&&(a.style??=null);var p=Ee(e);for(const i in a){let l=a[i];if(C&&i==="value"&&l==null){e.value=e.__value="",u[i]=l;continue}if(i==="class"){var d=e.namespaceURI==="http://www.w3.org/1999/xhtml";gt(e,d,l,r,t?.[P],a[P]),u[i]=l,u[P]=a[P];continue}if(i==="style"){yt(e,l,t?.[R],a[R]),u[i]=l,u[R]=a[R];continue}var g=u[i];if(!(l===g&&!(l===void 0&&e.hasAttribute(i)))){u[i]=l;var A=i[0]+i[1];if(A!=="$$")if(A==="on"){const w={},T="$$"+i;let y=i.slice(2);var m=lt(y);if(Ze(y)&&(y=y.slice(0,-7),w.capture=!0),!m&&g){if(l!=null)continue;e.removeEventListener(y,u[T],w),u[T]=null}if(l!=null)if(m)e[`__${y}`]=l,xe([y]);else{let O=function(N){u[i].call(this,N)};u[T]=je(y,e,O,w)}else m&&(e[`__${y}`]=void 0)}else if(i==="style")Y(e,i,l);else if(i==="autofocus")et(e,!!l);else if(!v&&(i==="__value"||i==="value"&&l!=null))e.value=e.__value=l;else if(i==="selected"&&C)kt(e,l);else{var S=i;b||(S=tt(S));var k=S==="defaultValue"||S==="defaultChecked";if(l==null&&!v&&!k)if(h[i]=null,S==="value"||S==="checked"){let w=e;const T=t===void 0;if(S==="value"){let y=w.defaultValue;w.removeAttribute(S),w.defaultValue=y,w.value=w.__value=T?y:null}else{let y=w.defaultChecked;w.removeAttribute(S),w.defaultChecked=y,w.checked=T?y:!1}}else e.removeAttribute(i);else k||p.includes(S)&&(v||typeof l!="string")?(e[S]=l,S in h&&(h[S]=at)):typeof l!="function"&&Y(e,S,l)}}}return _&&$(!0),u}function Ot(e,t,a=[],r=[],n,s=!1,o=!1){Xe(a,r,f=>{var h=void 0,v={},b=e.nodeName==="SELECT",_=!1;if(re(()=>{var C=t(...f.map(te)),c=At(e,h,C,n,s,o);_&&b&&"value"in C&&F(e,C.value);for(let d of Object.getOwnPropertySymbols(v))C[d]||q(v[d]);for(let d of Object.getOwnPropertySymbols(C)){var p=C[d];d.description===Qe&&(!h||p!==h[d])&&(v[d]&&q(v[d]),v[d]=U(()=>pt(e,()=>p))),c[d]=p}h=c}),b){var u=e;ne(()=>{F(u,h.value,!0),ye(u)})}_=!0})}function Ae(e){return e.__attributes??={[Ce]:e.nodeName.includes("-"),[ke]:e.namespaceURI===st}}var ue=new Map;function Ee(e){var t=e.getAttribute("is")||e.nodeName,a=ue.get(t);if(a)return a;ue.set(t,a=[]);for(var r,n=e,s=Element.prototype;s!==n;){r=ct(n);for(var o in r)r[o].set&&a.push(o);n=it(n)}return a}function It(e,t,a=t){var r=new WeakSet;se(e,"input",async n=>{var s=n?e.defaultValue:e.value;if(s=x(e)?ee(s):s,a(s),W!==null&&r.add(W),await ft(),s!==(s=t())){var o=e.selectionStart,f=e.selectionEnd;e.value=s??"",f!==null&&(e.selectionStart=o,e.selectionEnd=Math.min(f,e.value.length))}}),(E&&e.defaultValue!==e.value||be(t)==null&&e.value)&&(a(x(e)?ee(e.value):e.value),W!==null&&r.add(W)),_e(()=>{var n=t();if(e===document.activeElement){var s=ut??W;if(r.has(s))return}x(e)&&n===ee(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}function Wt(e,t,a=t){se(e,"change",r=>{var n=r?e.defaultChecked:e.checked;a(n)}),(E&&e.defaultChecked!==e.checked||be(t)==null)&&a(e.checked),_e(()=>{var r=t();e.checked=!!r})}function x(e){var t=e.type;return t==="number"||t==="range"}function ee(e){return e===""?null:+e}const I=dt({id:"unknown",name:"Unknown Control Set",currentPath:"",controls:[],mappings:[],families:[],totalControls:0,totalMappings:0,isConnected:!1});class Et{ws=null;reconnectTimer=null;reconnectAttempts=0;maxReconnectAttempts=5;reconnectDelay=1e3;connect(){if(this.ws&&(this.ws.readyState===WebSocket.CONNECTING||this.ws.readyState===WebSocket.OPEN)){console.log("WebSocket already connected or connecting");return}const t=window.location.protocol==="https:"?"wss:":"ws:",a=window.location.hostname==="localhost"?"localhost:3000":window.location.host,r=`${t}//${a}/ws`;console.log("Connecting to WebSocket:",r);try{this.ws=new WebSocket(r),this.ws.onopen=()=>{console.log("WebSocket connected"),this.reconnectAttempts=0,this.reconnectDelay=1e3},this.ws.onmessage=n=>{try{const s=JSON.parse(n.data);this.handleMessage(s)}catch(s){console.error("Failed to parse WebSocket message:",s)}},this.ws.onerror=n=>{console.error("WebSocket error:",n)},this.ws.onclose=()=>{console.log("WebSocket disconnected"),I.update(n=>({...n,isConnected:!1})),this.ws=null,this.scheduleReconnect()}}catch(n){console.error("Failed to create WebSocket:",n),this.scheduleReconnect()}}handleMessage(t){switch(console.log("WebSocket message received:",t),t.type){case"connected":console.log("WebSocket connection confirmed"),I.update(a=>({...a,isConnected:!0}));break;case"state-update":console.log("State update received"),t.payload&&I.set({...t.payload,isConnected:!0,isSwitchingControlSet:!1});break;case"metadata-update":console.log("Metadata update received"),t.payload&&I.update(a=>({...a,...t.payload,isConnected:!0,isSwitchingControlSet:!1}));break;case"controls-update":console.log("Controls update received"),t.payload&&I.update(a=>({...a,controls:t.payload}));break;case"mappings-update":console.log("Mappings update received"),t.payload&&I.update(a=>({...a,mappings:t.payload}));break;case"control-details":console.log("Control details received:",t.payload),t.payload&&window.dispatchEvent(new CustomEvent("control-details",{detail:t.payload}));break;case"control-sets-list":console.log("Control sets list received"),t.payload&&window.dispatchEvent(new CustomEvent("control-sets-list",{detail:t.payload}));break;case"control-updated":console.log("Control updated successfully:",t.payload);break;case"mapping-created":case"mapping-updated":case"mapping-deleted":console.log(`Mapping operation successful: ${t.type}`,t.payload),window.dispatchEvent(new CustomEvent("mappings-changed",{detail:t.payload}));break;case"error":console.error("WebSocket error:",t.payload);break;default:console.warn("Unknown WebSocket message type:",t.type)}}scheduleReconnect(){if(this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectAttempts>=this.maxReconnectAttempts){console.error("Max reconnection attempts reached");return}this.reconnectAttempts++,console.log(`Scheduling reconnect attempt ${this.reconnectAttempts} in ${this.reconnectDelay}ms`),this.reconnectTimer=window.setTimeout(()=>{this.connect()},this.reconnectDelay),this.reconnectDelay=Math.min(this.reconnectDelay*2,3e4)}disconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws&&(this.ws.close(),this.ws=null),I.update(t=>({...t,isConnected:!1}))}isConnected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}async sendCommand(t,a){if(console.log(`Sending WebSocket command: ${t}`,a),!this.ws||this.ws.readyState!==WebSocket.OPEN){console.log("WebSocket not ready, waiting for connection...");try{await this.waitForConnection()}catch(r){throw console.error("Failed to connect:",r),r}}if(this.ws&&this.ws.readyState===WebSocket.OPEN){const r=JSON.stringify({type:t,payload:a});console.log("Sending message:",r),this.ws.send(r)}else{const r=new Error("WebSocket not connected after waiting");throw console.error(r),r}}waitForConnection(t=5e3){return new Promise((a,r)=>{const n=Date.now(),s=()=>{this.ws&&this.ws.readyState===WebSocket.OPEN?a():Date.now()-n>t?r(new Error("WebSocket connection timeout")):setTimeout(s,100)};s()})}async updateControl(t){return this.sendCommand("update-control",t)}async createMapping(t){return this.sendCommand("create-mapping",t)}async updateMapping(t){return this.sendCommand("update-mapping",t)}async deleteMapping(t){return this.sendCommand("delete-mapping",{uuid:t})}async switchControlSet(t){return I.update(a=>({...a,isSwitchingControlSet:!0})),this.sendCommand("switch-control-set",{path:t})}async getControlDetails(t){return this.sendCommand("get-control",{id:t})}async scanControlSets(){return this.sendCommand("scan-control-sets")}send(t){this.ws&&this.ws.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(t)):console.warn("WebSocket not connected, cannot send message")}}const Dt=new Et;export{Ot as a,Y as b,It as c,Mt as d,Nt as e,I as f,bt as g,yt as h,Tt as i,Wt as j,Ct as r,gt as s,Dt as w};
@@ -1 +0,0 @@
1
- import{l as o,a as r}from"../chunks/BMsYC0uK.js";export{o as load_css,r as start};