@overlayed/app 2.1.0 → 2.3.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.
package/dist/preload.js CHANGED
@@ -1 +1 @@
1
- import{contextBridge as e}from"electron";const t=process.argv.find(e=>e.startsWith(`--overlayed-meta=`)),n=process.argv.find(e=>e.startsWith(`--overlayed-runtime=`));let r,i;try{r=t?JSON.parse(t.slice(t.indexOf(`=`)+1)):void 0}catch(e){console.error(`[overlayed] Failed to parse meta argument:`,t,e)}try{i=n?JSON.parse(n.slice(n.indexOf(`=`)+1)):void 0}catch(e){console.error(`[overlayed] Failed to parse runtime argument:`,n,e)}r&&e.exposeInMainWorld(`__overlayed`,r),i&&e.exposeInMainWorld(`__overlayedRuntime`,i);
1
+ import{contextBridge as e,ipcRenderer as t}from"electron";let n=-1;const r=e=>{addEventListener(`pageshow`,t=>{t.persisted&&(n=t.timeStamp,e(t))},!0)},i=(e,t,n,r)=>{let i,a;return o=>{t.value>=0&&(o||r)&&(a=t.value-(i??0),(a||i===void 0)&&(i=t.value,t.delta=a,t.rating=((e,t)=>e>t[1]?`poor`:e>t[0]?`needs-improvement`:`good`)(t.value,n),e(t)))}},a=e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},o=()=>{let e=performance.getEntriesByType(`navigation`)[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},s=()=>o()?.activationStart??0,c=(e,t=-1)=>{let r=o(),i=`navigate`;return n>=0?i=`back-forward-cache`:r&&(document.prerendering||s()>0?i=`prerender`:document.wasDiscarded?i=`restore`:r.type&&(i=r.type.replace(/_/g,`-`))),{name:e,value:t,rating:`good`,delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+0xe8d4a51000}`,navigationType:i}},l=new WeakMap;function u(e,t){let n=l.get(t);return n||(n=new WeakMap,l.set(t,n)),n.get(e)||n.set(e,new t),n.get(e)}var d=class{t;i=0;o=[];h(e){if(e.hadRecentInput)return;let t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e)}};const f=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){let r=new PerformanceObserver(e=>{queueMicrotask(()=>{t(e.getEntries())})});return r.observe({type:e,buffered:!0,...n}),r}}catch{}},p=e=>{let t=!1;return()=>{t||=(e(),!0)}};let m=-1;const h=new Set,g=()=>document.visibilityState!==`hidden`||document.prerendering?1/0:0,_=e=>{if(document.visibilityState===`hidden`){if(e.type===`visibilitychange`)for(let e of h)e();isFinite(m)||(m=e.type===`visibilitychange`?e.timeStamp:0,removeEventListener(`prerenderingchange`,_,!0))}},v=()=>{if(m<0){let e=s();m=(document.prerendering?void 0:globalThis.performance.getEntriesByType(`visibility-state`).find(t=>t.name===`hidden`&&t.startTime>=e)?.startTime)??g(),addEventListener(`visibilitychange`,_,!0),addEventListener(`prerenderingchange`,_,!0),r(()=>{setTimeout(()=>{m=g()})})}return{get firstHiddenTime(){return m},onHidden(e){h.add(e)}}},y=e=>{document.prerendering?addEventListener(`prerenderingchange`,e,!0):e()},b=[1800,3e3],x=(e,t={})=>{y(()=>{let n=v(),o,l=c(`FCP`),u=f(`paint`,e=>{for(let t of e)t.name===`first-contentful-paint`&&(u.disconnect(),t.startTime<n.firstHiddenTime&&(l.value=Math.max(t.startTime-s(),0),l.entries.push(t),o(!0)))});u&&(o=i(e,l,b,t.reportAllChanges),r(n=>{l=c(`FCP`),o=i(e,l,b,t.reportAllChanges),a(()=>{l.value=performance.now()-n.timeStamp,o(!0)})}))})},S=[.1,.25],C=(e,t={})=>{let n=v();x(p(()=>{let o,s=c(`CLS`,0),l=u(t,d),p=e=>{for(let t of e)l.h(t);l.i>s.value&&(s.value=l.i,s.entries=l.o,o())},m=f(`layout-shift`,p);m&&(o=i(e,s,S,t.reportAllChanges),n.onHidden(()=>{p(m.takeRecords()),o(!0)}),r(()=>{l.i=0,s=c(`CLS`,0),o=i(e,s,S,t.reportAllChanges),a(o)}),setTimeout(o))}))};let w=0,T=1/0,E=0;const D=e=>{for(let t of e)t.interactionId&&(T=Math.min(T,t.interactionId),E=Math.max(E,t.interactionId),w=E?(E-T)/7+1:0)};let O;const k=()=>O?w:performance.interactionCount??0,A=()=>{`interactionCount`in performance||O||(O=f(`event`,D,{durationThreshold:0}))};let j=0;var M=class{l=[];u=new Map;m;p;v(){j=k(),this.l.length=0,this.u.clear()}T(){let e=Math.min(this.l.length-1,Math.floor((k()-j)/50));return this.l[e]}h(e){if(this.m?.(e),!e.interactionId&&e.entryType!==`first-input`)return;let t=this.l.at(-1),n=this.u.get(e.interactionId);if(n||this.l.length<10||e.duration>t.L){if(n?e.duration>n.L?(n.entries=[e],n.L=e.duration):e.duration===n.L&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],L:e.duration},this.u.set(n.id,n),this.l.push(n)),this.l.sort((e,t)=>t.L-e.L),this.l.length>10){let e=this.l.splice(10);for(let t of e)this.u.delete(t.id)}this.p?.(n)}}};const N=e=>{let t=globalThis.requestIdleCallback||setTimeout,n=globalThis.cancelIdleCallback||clearTimeout;if(document.visibilityState===`hidden`)e();else{let r=p(e),i=-1,a=()=>{n(i),r()};addEventListener(`visibilitychange`,a,{once:!0,capture:!0}),i=t(()=>{removeEventListener(`visibilitychange`,a,{capture:!0}),r()})}},P=[200,500],F=(e,t={})=>{if(!globalThis.PerformanceEventTiming||!(`interactionId`in PerformanceEventTiming.prototype))return;let n=v();y(()=>{A();let a,o=c(`INP`),s=u(t,M),l=e=>{N(()=>{for(let t of e)s.h(t);let t=s.T();t&&t.L!==o.value&&(o.value=t.L,o.entries=t.entries,a())})},d=f(`event`,l,{durationThreshold:t.durationThreshold??40});a=i(e,o,P,t.reportAllChanges),d&&(d.observe({type:`first-input`,buffered:!0}),n.onHidden(()=>{l(d.takeRecords()),a(!0)}),r(()=>{s.v(),o=c(`INP`),a=i(e,o,P,t.reportAllChanges)}))})};var I=class{m;h(e){this.m?.(e)}};const L=[2500,4e3],R=(e,t={})=>{y(()=>{let n=v(),o,l=c(`LCP`),d=u(t,I),m=e=>{t.reportAllChanges||(e=e.slice(-1));for(let t of e)d.h(t),t.startTime<n.firstHiddenTime&&(l.value=Math.max(t.startTime-s(),0),l.entries=[t],o())},h=f(`largest-contentful-paint`,m);if(h){o=i(e,l,L,t.reportAllChanges);let n=p(()=>{m(h.takeRecords()),h.disconnect(),o(!0)}),s=e=>{e.isTrusted&&(N(n),removeEventListener(e.type,s,{capture:!0}))};for(let e of[`keydown`,`click`,`visibilitychange`])addEventListener(e,s,{capture:!0});r(n=>{l=c(`LCP`),o=i(e,l,L,t.reportAllChanges),a(()=>{l.value=performance.now()-n.timeStamp,o(!0)})})}})},z=[800,1800],B=e=>{document.prerendering?y(()=>B(e)):document.readyState===`complete`?setTimeout(e):addEventListener(`load`,()=>B(e),!0)},V=(e,t={})=>{let n=c(`TTFB`),a=i(e,n,z,t.reportAllChanges);B(()=>{let l=o();l&&(n.value=Math.max(l.responseStart-s(),0),n.entries=[l],a(!0),r(()=>{n=c(`TTFB`,0),a=i(e,n,z,t.reportAllChanges),a(!0)}))})};function H({protocol:e,pathname:t,hash:n}){let r=e===`file:`?t.slice(t.lastIndexOf(`/`)):t;if(n.startsWith(`#/`)){let e=n.indexOf(`?`);r+=e===-1?n:n.slice(0,e)}return r.slice(0,512)}function U(e){return!(typeof e==`object`&&e&&`webVitals`in e&&e.webVitals===!1)}function W(){let e={},n,r=!1,i=t=>{n??=H(location);let r=t.value;switch(t.name){case`CLS`:e.cls=Math.round(r*1e4)/1e4;break;case`LCP`:e.lcp=Math.round(r);break;case`INP`:e.inp=Math.round(r);break;case`FCP`:e.fcp=Math.round(r);break;case`TTFB`:e.ttfb=Math.round(r);break}},a=()=>{if(r||n===void 0)return;r=!0,removeEventListener(`visibilitychange`,o,!0),removeEventListener(`pagehide`,o,!0);let i={page:n,...e};try{t.send(`overlayed:web-vitals`,i)}catch{}},o=()=>{document.visibilityState===`hidden`&&a()};R(i),C(i),F(i,{reportAllChanges:!0}),x(i),V(i),addEventListener(`visibilitychange`,o,!0),addEventListener(`pagehide`,o,!0)}const G=process.argv.find(e=>e.startsWith(`--overlayed-meta=`)),K=process.argv.find(e=>e.startsWith(`--overlayed-runtime=`));let q,J;try{q=G?JSON.parse(G.slice(G.indexOf(`=`)+1)):void 0}catch(e){console.error(`[overlayed] Failed to parse meta argument:`,G,e)}try{J=K?JSON.parse(K.slice(K.indexOf(`=`)+1)):void 0}catch(e){console.error(`[overlayed] Failed to parse runtime argument:`,K,e)}q&&e.exposeInMainWorld(`__overlayed`,q),J&&e.exposeInMainWorld(`__overlayedRuntime`,J),U(J)&&W();
package/dist/sand.d.ts CHANGED
@@ -116,49 +116,15 @@ declare function module(): {
116
116
  readonly events: import("arktype").Module<{
117
117
  event: {
118
118
  game: "sand";
119
- type: "trampler_lost";
120
- creationTime: number;
121
- content: {
122
- tramplerId: SandTramplerId;
123
- };
124
- } | {
125
- game: "sand";
126
- type: "party_member_joined";
127
- creationTime: number;
128
- content: {
129
- accountId: SandAccountId;
130
- displayName: string;
131
- platformId: SandPlatformId;
132
- playfabId: SandPlayfabId;
133
- characterId: SandCharacterId;
134
- isCaptain: boolean;
135
- };
136
- } | {
137
- game: "sand";
138
- type: "tech_tree_changed";
119
+ type: "extraction_removed";
139
120
  creationTime: number;
140
121
  content: {
141
- unlocked: number;
142
- total: number;
143
- nodes: {
144
- id: SandTechNodeId;
145
- name: string;
146
- tier: number;
147
- isUnlocked: boolean;
148
- isAvailable: boolean;
149
- }[];
122
+ extractionId: SandExtractionId;
150
123
  };
151
124
  } | {
152
125
  game: "sand";
153
126
  type: "match_ended";
154
127
  creationTime: number;
155
- } | {
156
- game: "sand";
157
- type: "extraction_removed";
158
- creationTime: number;
159
- content: {
160
- extractionId: SandExtractionId;
161
- };
162
128
  } | {
163
129
  game: "sand";
164
130
  type: "logged_in";
@@ -183,6 +149,18 @@ declare function module(): {
183
149
  content: {
184
150
  joinCode: SandPartyJoinCode;
185
151
  };
152
+ } | {
153
+ game: "sand";
154
+ type: "party_member_joined";
155
+ creationTime: number;
156
+ content: {
157
+ accountId: SandAccountId;
158
+ displayName: string;
159
+ platformId: SandPlatformId;
160
+ playfabId: SandPlayfabId;
161
+ characterId: SandCharacterId;
162
+ isCaptain: boolean;
163
+ };
186
164
  } | {
187
165
  game: "sand";
188
166
  type: "party_member_left";
@@ -215,6 +193,21 @@ declare function module(): {
215
193
  amount: number;
216
194
  delta: number;
217
195
  };
196
+ } | {
197
+ game: "sand";
198
+ type: "tech_tree_changed";
199
+ creationTime: number;
200
+ content: {
201
+ unlocked: number;
202
+ total: number;
203
+ nodes: {
204
+ id: SandTechNodeId;
205
+ name: string;
206
+ tier: number;
207
+ isUnlocked: boolean;
208
+ isAvailable: boolean;
209
+ }[];
210
+ };
218
211
  } | {
219
212
  game: "sand";
220
213
  type: "tech_tree_item_unlocked";
@@ -343,6 +336,13 @@ declare function module(): {
343
336
  z: number;
344
337
  };
345
338
  };
339
+ } | {
340
+ game: "sand";
341
+ type: "trampler_lost";
342
+ creationTime: number;
343
+ content: {
344
+ tramplerId: SandTramplerId;
345
+ };
346
346
  } | {
347
347
  game: "sand";
348
348
  type: "inventory_changed";
@@ -1056,49 +1056,15 @@ type InventoryEquippedChangedEvent = typeof InventoryEquippedChanged.infer; //#e
1056
1056
  declare const sandEvents: import("arktype").Module<{
1057
1057
  event: {
1058
1058
  game: "sand";
1059
- type: "trampler_lost";
1060
- creationTime: number;
1061
- content: {
1062
- tramplerId: SandTramplerId;
1063
- };
1064
- } | {
1065
- game: "sand";
1066
- type: "party_member_joined";
1067
- creationTime: number;
1068
- content: {
1069
- accountId: SandAccountId;
1070
- displayName: string;
1071
- platformId: SandPlatformId;
1072
- playfabId: SandPlayfabId;
1073
- characterId: SandCharacterId;
1074
- isCaptain: boolean;
1075
- };
1076
- } | {
1077
- game: "sand";
1078
- type: "tech_tree_changed";
1059
+ type: "extraction_removed";
1079
1060
  creationTime: number;
1080
1061
  content: {
1081
- unlocked: number;
1082
- total: number;
1083
- nodes: {
1084
- id: SandTechNodeId;
1085
- name: string;
1086
- tier: number;
1087
- isUnlocked: boolean;
1088
- isAvailable: boolean;
1089
- }[];
1062
+ extractionId: SandExtractionId;
1090
1063
  };
1091
1064
  } | {
1092
1065
  game: "sand";
1093
1066
  type: "match_ended";
1094
1067
  creationTime: number;
1095
- } | {
1096
- game: "sand";
1097
- type: "extraction_removed";
1098
- creationTime: number;
1099
- content: {
1100
- extractionId: SandExtractionId;
1101
- };
1102
1068
  } | {
1103
1069
  game: "sand";
1104
1070
  type: "logged_in";
@@ -1123,6 +1089,18 @@ declare const sandEvents: import("arktype").Module<{
1123
1089
  content: {
1124
1090
  joinCode: SandPartyJoinCode;
1125
1091
  };
1092
+ } | {
1093
+ game: "sand";
1094
+ type: "party_member_joined";
1095
+ creationTime: number;
1096
+ content: {
1097
+ accountId: SandAccountId;
1098
+ displayName: string;
1099
+ platformId: SandPlatformId;
1100
+ playfabId: SandPlayfabId;
1101
+ characterId: SandCharacterId;
1102
+ isCaptain: boolean;
1103
+ };
1126
1104
  } | {
1127
1105
  game: "sand";
1128
1106
  type: "party_member_left";
@@ -1155,6 +1133,21 @@ declare const sandEvents: import("arktype").Module<{
1155
1133
  amount: number;
1156
1134
  delta: number;
1157
1135
  };
1136
+ } | {
1137
+ game: "sand";
1138
+ type: "tech_tree_changed";
1139
+ creationTime: number;
1140
+ content: {
1141
+ unlocked: number;
1142
+ total: number;
1143
+ nodes: {
1144
+ id: SandTechNodeId;
1145
+ name: string;
1146
+ tier: number;
1147
+ isUnlocked: boolean;
1148
+ isAvailable: boolean;
1149
+ }[];
1150
+ };
1158
1151
  } | {
1159
1152
  game: "sand";
1160
1153
  type: "tech_tree_item_unlocked";
@@ -1283,6 +1276,13 @@ declare const sandEvents: import("arktype").Module<{
1283
1276
  z: number;
1284
1277
  };
1285
1278
  };
1279
+ } | {
1280
+ game: "sand";
1281
+ type: "trampler_lost";
1282
+ creationTime: number;
1283
+ content: {
1284
+ tramplerId: SandTramplerId;
1285
+ };
1286
1286
  } | {
1287
1287
  game: "sand";
1288
1288
  type: "inventory_changed";
package/dist/siege.d.ts CHANGED
@@ -657,6 +657,19 @@ declare function module(): {
657
657
  };
658
658
  };
659
659
  event: {
660
+ game: "siege";
661
+ type: "operator_banned";
662
+ creationTime: number;
663
+ content: {
664
+ team: 0 | 1;
665
+ index: number;
666
+ side: "attacker" | "both" | "defender" | "invalid" | (string & {});
667
+ operatorName: {
668
+ id: SiegeOperatorNameId;
669
+ value: string;
670
+ } | null;
671
+ };
672
+ } | {
660
673
  game: "siege";
661
674
  type: "player_side_changed";
662
675
  creationTime: number;
@@ -666,8 +679,13 @@ declare function module(): {
666
679
  };
667
680
  } | {
668
681
  game: "siege";
669
- type: "stopped_queuing";
682
+ type: "player_died";
670
683
  creationTime: number;
684
+ content: {
685
+ playerId: SiegePlayerId;
686
+ instigatorPlayerId: SiegePlayerId;
687
+ headshot: boolean;
688
+ };
671
689
  } | {
672
690
  game: "siege";
673
691
  type: "started_queuing";
@@ -680,6 +698,10 @@ declare function module(): {
680
698
  };
681
699
  matchType: SiegeMatchType;
682
700
  };
701
+ } | {
702
+ game: "siege";
703
+ type: "stopped_queuing";
704
+ creationTime: number;
683
705
  } | {
684
706
  game: "siege";
685
707
  type: "match_started";
@@ -748,19 +770,6 @@ declare function module(): {
748
770
  index: number;
749
771
  side: "attacker" | "both" | "defender" | "invalid" | (string & {});
750
772
  };
751
- } | {
752
- game: "siege";
753
- type: "operator_banned";
754
- creationTime: number;
755
- content: {
756
- team: 0 | 1;
757
- index: number;
758
- side: "attacker" | "both" | "defender" | "invalid" | (string & {});
759
- operatorName: {
760
- id: SiegeOperatorNameId;
761
- value: string;
762
- } | null;
763
- };
764
773
  } | {
765
774
  game: "siege";
766
775
  type: "operator_ban_cleared";
@@ -931,15 +940,6 @@ declare function module(): {
931
940
  playerId: SiegePlayerId;
932
941
  lifeState: "dead" | "downed" | "low_health" | "normal" | "overhealed" | "respawning" | (string & {});
933
942
  };
934
- } | {
935
- game: "siege";
936
- type: "player_died";
937
- creationTime: number;
938
- content: {
939
- playerId: SiegePlayerId;
940
- instigatorPlayerId: SiegePlayerId;
941
- headshot: boolean;
942
- };
943
943
  } | {
944
944
  game: "siege";
945
945
  type: "player_downed";
@@ -2017,6 +2017,19 @@ declare const siegeEvents: import("arktype").Module<{
2017
2017
  };
2018
2018
  };
2019
2019
  event: {
2020
+ game: "siege";
2021
+ type: "operator_banned";
2022
+ creationTime: number;
2023
+ content: {
2024
+ team: 0 | 1;
2025
+ index: number;
2026
+ side: "attacker" | "both" | "defender" | "invalid" | (string & {});
2027
+ operatorName: {
2028
+ id: SiegeOperatorNameId;
2029
+ value: string;
2030
+ } | null;
2031
+ };
2032
+ } | {
2020
2033
  game: "siege";
2021
2034
  type: "player_side_changed";
2022
2035
  creationTime: number;
@@ -2026,8 +2039,13 @@ declare const siegeEvents: import("arktype").Module<{
2026
2039
  };
2027
2040
  } | {
2028
2041
  game: "siege";
2029
- type: "stopped_queuing";
2042
+ type: "player_died";
2030
2043
  creationTime: number;
2044
+ content: {
2045
+ playerId: SiegePlayerId;
2046
+ instigatorPlayerId: SiegePlayerId;
2047
+ headshot: boolean;
2048
+ };
2031
2049
  } | {
2032
2050
  game: "siege";
2033
2051
  type: "started_queuing";
@@ -2040,6 +2058,10 @@ declare const siegeEvents: import("arktype").Module<{
2040
2058
  };
2041
2059
  matchType: SiegeMatchType;
2042
2060
  };
2061
+ } | {
2062
+ game: "siege";
2063
+ type: "stopped_queuing";
2064
+ creationTime: number;
2043
2065
  } | {
2044
2066
  game: "siege";
2045
2067
  type: "match_started";
@@ -2108,19 +2130,6 @@ declare const siegeEvents: import("arktype").Module<{
2108
2130
  index: number;
2109
2131
  side: "attacker" | "both" | "defender" | "invalid" | (string & {});
2110
2132
  };
2111
- } | {
2112
- game: "siege";
2113
- type: "operator_banned";
2114
- creationTime: number;
2115
- content: {
2116
- team: 0 | 1;
2117
- index: number;
2118
- side: "attacker" | "both" | "defender" | "invalid" | (string & {});
2119
- operatorName: {
2120
- id: SiegeOperatorNameId;
2121
- value: string;
2122
- } | null;
2123
- };
2124
2133
  } | {
2125
2134
  game: "siege";
2126
2135
  type: "operator_ban_cleared";
@@ -2291,15 +2300,6 @@ declare const siegeEvents: import("arktype").Module<{
2291
2300
  playerId: SiegePlayerId;
2292
2301
  lifeState: "dead" | "downed" | "low_health" | "normal" | "overhealed" | "respawning" | (string & {});
2293
2302
  };
2294
- } | {
2295
- game: "siege";
2296
- type: "player_died";
2297
- creationTime: number;
2298
- content: {
2299
- playerId: SiegePlayerId;
2300
- instigatorPlayerId: SiegePlayerId;
2301
- headshot: boolean;
2302
- };
2303
2303
  } | {
2304
2304
  game: "siege";
2305
2305
  type: "player_downed";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@overlayed/app",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Overlayed app",
5
5
  "keywords": [
6
6
  "typescript"
@@ -80,16 +80,17 @@
80
80
  "msw": "^2.14.6",
81
81
  "typescript": "^6.0.3",
82
82
  "vite": "^8.1.3",
83
+ "web-vitals": "^5.3.0",
84
+ "@overlayed/api": "0.0.6",
83
85
  "@overlayed/cortex-client": "0.0.6",
84
86
  "@overlayed/events": "0.0.4",
85
87
  "@overlayed/sand": "0.0.0",
86
- "@overlayed/native-managers": "0.0.4",
87
- "@overlayed/api": "0.0.6",
88
88
  "@overlayed/shared-node": "0.0.4",
89
- "@overlayed/siege": "0.0.5",
90
89
  "@overlayed/universal": "0.0.0",
90
+ "@overlayed/siege": "0.0.5",
91
91
  "@overlayed/utils": "0.0.4",
92
- "@overlayed/utils-node": "0.0.4"
92
+ "@overlayed/utils-node": "0.0.4",
93
+ "@overlayed/native-managers": "0.0.4"
93
94
  },
94
95
  "peerDependencies": {
95
96
  "electron": "33.3.0"