@buoy-gg/network 7.0.43 → 7.0.44
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkSyncAdapter=exports.SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_BODY_INLINE_LIMIT=void 0;var _store=require("../conditions/store");var _networkEventStore=require("../utils/networkEventStore");var _networkSavedStore=require("../utils/networkSavedStore");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _presets=require("../overrides/presets");var _engine=require("../overrides/engine");var _networkListener=require("../utils/networkListener");var _sharedUi=require("@buoy-gg/shared-ui");const SNAPSHOT_BODY_INLINE_LIMIT=exports.SNAPSHOT_BODY_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;function shouldStripBody(e,t){if(e===void 0)return false;if((t??0)>SNAPSHOT_BODY_INLINE_LIMIT)return true;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_BODY_INLINE_LIMIT)}const wireCache=new WeakMap;const strippedCache=new WeakMap;function toWireEvent(e){const t=wireCache.get(e);if(t)return t;let r;try{r=buildWireEvent(e)}catch{r=buildMetadataOnly(e)}wireCache.set(e,r);return r}function buildMetadataOnly(e){const t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0};let r=1024;try{r=(0,_sharedUi.approxJsonSize)(t,SNAPSHOT_EVENTS_BUDGET).bytes}catch{}return{event:t,bytes:r}}function buildWireEvent(e){const t=shouldStripBody(e.requestData,e.requestSize);const r=shouldStripBody(e.responseData,e.responseSize);const n=toWireGraphqlVariables(e.graphqlVariables);const o=toWireHeaders(e.requestHeaders);const s=toWireHeaders(e.responseHeaders);const d=t||r||n!==e.graphqlVariables||o!==e.requestHeaders||s!==e.responseHeaders;let i=e;if(d){i={...e};if(t){i.requestData=void 0;i.requestBodyOmitted=true}if(r){i.responseData=void 0;i.responseBodyOmitted=true}if(n!==e.graphqlVariables){i.graphqlVariables=n}if(o!==e.requestHeaders){i.requestHeaders=o;i.headersOmitted=true}if(s!==e.responseHeaders){i.responseHeaders=s;i.headersOmitted=true}}return{event:i,bytes:(0,_sharedUi.approxJsonSize)(i,SNAPSHOT_EVENTS_BUDGET).bytes}}function toStrippedEvent(e){const t=strippedCache.get(e);if(t)return t;const{event:r}=toWireEvent(e);const n={...r};if(n.requestData!==void 0){n.requestData=void 0;n.requestBodyOmitted=true}if(n.responseData!==void 0){n.responseData=void 0;n.responseBodyOmitted=true}if(n.graphqlVariables!==void 0){n.graphqlVariables=toWireGraphqlVariables(n.graphqlVariables,true)}const o={event:n,bytes:(0,_sharedUi.approxJsonSize)(n,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,o);return o}function fitEventsToBudget(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const o=toWireEvent(e[n]);if(r+o.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=o.event;r+=o.bytes}else{const s=toStrippedEvent(e[n]);t[n]=s.event;r+=s.bytes}}return t}function toWireGraphqlVariables(e,t=false){if(!e)return e;if(!t&&!shouldStripBody(e,void 0))return e;const r={};for(const[n,o]of Object.entries(e)){if(typeof o==="string"&&o.length<=64)r[n]=o;else if(typeof o==="number"||typeof o==="boolean"){r[n]=o}}return Object.keys(r).length>0?r:void 0}const SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_HEADER_VALUE_LIMIT=64;function toWireHeaders(e){if(!e)return e;let t=false;const r={};for(const[n,o]of Object.entries(e)){if(typeof o!=="string")continue;if(o.length<=SNAPSHOT_HEADER_VALUE_LIMIT){r[n]=o}else{r[n]=`${o.slice(0,SNAPSHOT_HEADER_VALUE_LIMIT)}\u2026 [${o.length-SNAPSHOT_HEADER_VALUE_LIMIT} more]`;t=true}}return t?r:e}const stripLargeRuleBodies=e=>{let t=false;const r=e.rules.map(n=>{if(!n.body||n.body.length<=SNAPSHOT_BODY_INLINE_LIMIT){return n}t=true;return{...n,body:void 0,bodyOmitted:true}});return t?{...e,rules:r}:e};const resolveEvent=e=>_networkEventStore.networkEventStore.getEventById(e)??_networkSavedStore.networkSavedStore.getEventById(e);const readId=e=>e&&typeof e==="object"?e.id:void 0;const readBool=(e,t)=>!!(e&&typeof e==="object"&&e[t]);const inactiveStamp=()=>(0,_engine.overridesCanApply)()?{}:{active:false,inactiveReason:_engine.OVERRIDES_INACTIVE_REASON};const VALID_KINDS=["respond","fail","delay"];function readRuleDraft(e,t){if(!e||typeof e!=="object")return null;const r=e.rule??e;if(!r||typeof r!=="object")return null;const n=r;const o=typeof n.urlPattern==="string"&&n.urlPattern.trim()?n.urlPattern.trim():t?.urlPattern??"";if(!o)return null;const s=VALID_KINDS.includes(n.kind)?n.kind:t?.kind??"respond";return{id:typeof n.id==="string"?n.id:void 0,enabled:n.enabled!==false,name:typeof n.name==="string"?n.name:t?.name,urlPattern:o,methods:Array.isArray(n.methods)?n.methods.filter(d=>typeof d==="string").map(d=>d.toUpperCase()):t?.methods,requireHeader:typeof n.requireHeader==="string"&&n.requireHeader.trim()?n.requireHeader.trim():void 0,kind:s,status:typeof n.status==="number"?n.status:t?.status,statusText:typeof n.statusText==="string"?n.statusText:t?.statusText,headers:n.headers&&typeof n.headers==="object"?n.headers:t?.headers,body:patchedBody(n,t),failKind:n.failKind==="timeout"?"timeout":void 0,delayMs:typeof n.delayMs==="number"?n.delayMs:void 0,times:typeof n.times==="number"?n.times:null,alternate:n.alternate===true}}const isPlainObject=e=>!!e&&typeof e==="object"&&!Array.isArray(e);function deepMerge(e,t,r="",n={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>0&&t.length<e.length){n.shrunk.push({path:r||"(root)",have:e.length,sent:t.length})}return t}if(!isPlainObject(e)||!isPlainObject(t))return t;const o={...e};for(const[s,d]of Object.entries(t)){const i=r?`${r}.${s}`:s;if(s in e){const u=(0,_sharedUi.shapeKind)(e[s]);const l=(0,_sharedUi.shapeKind)(d);if((u==="array"||u==="object")&&u!==l){n.breaks.push({path:i,from:u,to:l})}o[s]=deepMerge(e[s],d,i,n)}else{o[s]=d}}return o}function patchViolations(e,t){if(e.body!=null||!isPlainObject(e.bodyPatch)||typeof t!=="string")return[];try{return(0,_sharedUi.typedEditViolations)(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function patchedBody(e,t){if(typeof e.body==="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);const r=t?.body??(typeof e.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(n=>n.id===e.id)?.body:void 0);if(isPlainObject(e.bodyPatch)&&typeof r==="string"){try{return JSON.stringify(deepMerge(JSON.parse(r),e.bodyPatch),null,2)}catch{return r}}return r}function existingRule(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t.id;if(typeof r!=="string")return null;const n=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===r);return n?{...n}:null}function preservedBody(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t;if(r.bodyOmitted!==true||typeof r.id!=="string")return null;const n=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===r.id);return n?{body:n.body}:null}function baseFromRequest(e){if(!e||typeof e!=="object")return null;const t=e.fromRequestId;if(typeof t!=="string"||!t)return null;const r=resolveEvent(t);return r?(0,_presets.draftFromEvent)(r):null}const networkSyncAdapter=exports.networkSyncAdapter={dispose:()=>{_overrideRulesStore.overrideRulesStore.setEnabled(false)},version:6,getSnapshot:()=>{_networkEventStore.networkEventStore.ensureInterception();return{conditions:{version:1,runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.getNetworkCondition)(),available:(0,_store.conditionsCanApply)()},events:fitEventsToBudget(_networkEventStore.networkEventStore.getEvents()),overrides:stripLargeRuleBodies(_overrideRulesStore.overrideRulesStore.getState()),saved:_networkSavedStore.networkSavedStore.getRecords().map(e=>({...e,event:toWireEvent(e.event).event}))}},subscribe:e=>{const t=_networkEventStore.networkEventStore.subscribeToEvents(e);const r=(0,_store.subscribeNetworkConditions)(e);const n=_networkSavedStore.networkSavedStore.subscribe(e);const o=_overrideRulesStore.overrideRulesStore.subscribe(e);return()=>{r();t();n();o()}},actions:{getNetworkConditions:()=>({runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.getNetworkCondition)(),available:(0,_store.conditionsCanApply)()}),setNetworkConditions:e=>{const t=e&&typeof e==="object"?e.profile:void 0;return{runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.setNetworkCondition)(t),available:(0,_store.conditionsCanApply)()}},clearEvents:()=>{_networkEventStore.networkEventStore.clearEvents()},getEventBody:e=>{const t=readId(e);if(!t)return null;const r=resolveEvent(t);if(!r)return null;return{url:r.url??null,method:r.method??null,status:r.status??null,override:r.override??null,requestData:r.requestData??null,responseData:r.responseData??null,requestHeaders:r.requestHeaders??null,responseHeaders:r.responseHeaders??null}},setPinned:e=>{const t=readId(e);if(!t)return null;const r=resolveEvent(t);if(!r)return null;const n=readBool(e,"pinned");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).pinned;if(o===n)return{ok:true};return _networkSavedStore.networkSavedStore.togglePin(r)},setSaved:e=>{const t=readId(e);if(!t)return null;const r=resolveEvent(t);if(!r)return null;const n=readBool(e,"saved");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).saved;if(o===n)return{ok:true};return _networkSavedStore.networkSavedStore.toggleSave(r)},removeSavedRecord:e=>{const t=e&&typeof e==="object"?e.key:void 0;if(!t)return null;_networkSavedStore.networkSavedStore.remove(t);return{ok:true}},clearSavedRequests:()=>{_networkSavedStore.networkSavedStore.clearSaved();return{ok:true}},clearPinnedRequests:()=>{_networkSavedStore.networkSavedStore.clearPinned();return{ok:true}},setOverridesEnabled:e=>{_overrideRulesStore.overrideRulesStore.setEnabled(readBool(e,"enabled"));return{ok:true,enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,...inactiveStamp()}},upsertOverrideRule:e=>{const t=baseFromRequest(e)??preservedBody(e)??existingRule(e);const r=e?.rule??e;if(r&&typeof r.bodyPath==="string"&&r.body==null){const s=t?.body??(typeof r.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(u=>u.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."}}if(r.bodyValue===void 0){return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${r.bodyPath}" to.`}}let d;try{d=JSON.parse(s)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}const i=(0,_sharedUi.patchFromPath)(d,r.bodyPath,r.bodyValue);if(!i.ok)return{ok:false,error:`Refused: ${i.error}`};r.bodyPatch=i.patch;delete r.bodyPath;delete r.bodyValue}if(r&&isPlainObject(r.bodyPatch)&&r.body==null){const s=t?.body??(typeof r.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(d=>d.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."}}if(r.force!==true){let d;try{const u=(0,_sharedUi.expandKeyedArrays)(JSON.parse(s),r.bodyPatch);d=u.error;if(u.notes.length)r.bodyPatch=u.patch}catch{}if(d){return{ok:false,error:`Refused: ${d}`}}const i=patchViolations(r,s);if(i.length>0){return{ok:false,error:(0,_sharedUi.refusalText)(i,"response body",(0,_sharedUi.suggestedPatch)(r.bodyPatch,i)),violations:i}}}}const n=readRuleDraft(e,t);if(!n){const s=e?.fromRequestId;return{ok:false,error:s?`No captured request \`${s}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}const o=_overrideRulesStore.overrideRulesStore.upsertRule(n);if(!o)return{ok:false,error:"Override rule limit reached."};if(o.enabled)_overrideRulesStore.overrideRulesStore.setEnabled(true);return{ok:true,rule:{id:o.id,urlPattern:o.urlPattern,enabled:o.enabled,kind:o.kind,status:o.status,times:o.times,bodySize:o.body?o.body.length:0},...o.times===void 0||o.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${o.id}\`). If you meant only the next one, set times:1.`}:{},...inactiveStamp()}},setOverrideRuleEnabled:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.setRuleEnabled(t,readBool(e,"enabled"));return{ok:true,...inactiveStamp()}},deleteOverrideRule:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.removeRule(t);return{ok:true}},clearOverrideRules:()=>{_overrideRulesStore.overrideRulesStore.clearRules();return{ok:true}},listOverrideRules:()=>_overrideRulesStore.overrideRulesStore.getState(),getOverrideRuleBody:e=>{const t=readId(e);if(!t)return null;const r=_overrideRulesStore.overrideRulesStore.getState().rules.find(n=>n.id===t);if(!r)return null;return{body:r.body??null}},getCaptureStatus:()=>{const e=_networkEventStore.networkEventStore.getSubscriberCounts().total;let t=null;let r=null;try{t=(0,_networkListener.isNetworkListening)();r=(0,_networkListener.getNetworkListenerCount)()}catch{}let n=null;try{n=(0,_networkListener.isNetworkInterceptionLive)()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:n,listenerCount:r,eventCount:_networkEventStore.networkEventStore.getEvents().length}},debugOverrides:e=>{const t=(e&&typeof e==="object"?e.url:void 0)??"https://example.com/";return{interceptorInstalled:(0,_networkListener.isNetworkListening)(),listenerCount:(0,_networkListener.getNetworkListenerCount)(),engine:(0,_engine.inspectEngine)(t,"GET"),store:{enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,ruleCount:_overrideRulesStore.overrideRulesStore.getState().rules.length,rulesVisibleToEngine:_overrideRulesStore.overrideRulesStore.getRules().length}}}}};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkSyncAdapter=exports.SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_BODY_INLINE_LIMIT=void 0;var _store=require("../conditions/store");var _networkEventStore=require("../utils/networkEventStore");var _networkSavedStore=require("../utils/networkSavedStore");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _presets=require("../overrides/presets");var _engine=require("../overrides/engine");var _networkListener=require("../utils/networkListener");var _sharedUi=require("@buoy-gg/shared-ui");const SNAPSHOT_BODY_INLINE_LIMIT=exports.SNAPSHOT_BODY_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;function shouldStripBody(e,t){if(e===void 0)return false;if((t??0)>SNAPSHOT_BODY_INLINE_LIMIT)return true;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_BODY_INLINE_LIMIT)}const wireCache=new WeakMap;const strippedCache=new WeakMap;function toWireEvent(e){const t=wireCache.get(e);if(t)return t;let r;try{r=buildWireEvent(e)}catch{r=buildMetadataOnly(e)}wireCache.set(e,r);return r}function buildMetadataOnly(e){const t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0};let r=1024;try{r=(0,_sharedUi.approxJsonSize)(t,SNAPSHOT_EVENTS_BUDGET).bytes}catch{}return{event:t,bytes:r}}function buildWireEvent(e){const t=shouldStripBody(e.requestData,e.requestSize);const r=shouldStripBody(e.responseData,e.responseSize);const n=toWireGraphqlVariables(e.graphqlVariables);const o=toWireHeaders(e.requestHeaders);const s=toWireHeaders(e.responseHeaders);const d=t||r||n!==e.graphqlVariables||o!==e.requestHeaders||s!==e.responseHeaders;let i=e;if(d){i={...e};if(t){i.requestData=void 0;i.requestBodyOmitted=true}if(r){i.responseData=void 0;i.responseBodyOmitted=true}if(n!==e.graphqlVariables){i.graphqlVariables=n}if(o!==e.requestHeaders){i.requestHeaders=o;i.headersOmitted=true}if(s!==e.responseHeaders){i.responseHeaders=s;i.headersOmitted=true}}return{event:i,bytes:(0,_sharedUi.approxJsonSize)(i,SNAPSHOT_EVENTS_BUDGET).bytes}}function toStrippedEvent(e){const t=strippedCache.get(e);if(t)return t;const{event:r}=toWireEvent(e);const n={...r};if(n.requestData!==void 0){n.requestData=void 0;n.requestBodyOmitted=true}if(n.responseData!==void 0){n.responseData=void 0;n.responseBodyOmitted=true}if(n.graphqlVariables!==void 0){n.graphqlVariables=toWireGraphqlVariables(n.graphqlVariables,true)}const o={event:n,bytes:(0,_sharedUi.approxJsonSize)(n,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,o);return o}function fitEventsToBudget(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const o=toWireEvent(e[n]);if(r+o.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=o.event;r+=o.bytes}else{const s=toStrippedEvent(e[n]);t[n]=s.event;r+=s.bytes}}return t}function toWireGraphqlVariables(e,t=false){if(!e)return e;if(!t&&!shouldStripBody(e,void 0))return e;const r={};for(const[n,o]of Object.entries(e)){if(typeof o==="string"&&o.length<=64)r[n]=o;else if(typeof o==="number"||typeof o==="boolean"){r[n]=o}}return Object.keys(r).length>0?r:void 0}const SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_HEADER_VALUE_LIMIT=64;function toWireHeaders(e){if(!e)return e;let t=false;const r={};for(const[n,o]of Object.entries(e)){if(typeof o!=="string")continue;if(o.length<=SNAPSHOT_HEADER_VALUE_LIMIT){r[n]=o}else{r[n]=`${o.slice(0,SNAPSHOT_HEADER_VALUE_LIMIT)}\u2026 [${o.length-SNAPSHOT_HEADER_VALUE_LIMIT} more]`;t=true}}return t?r:e}const stripLargeRuleBodies=e=>{let t=false;const r=e.rules.map(n=>{if(!n.body||n.body.length<=SNAPSHOT_BODY_INLINE_LIMIT){return n}t=true;return{...n,body:void 0,bodyOmitted:true}});return t?{...e,rules:r}:e};const resolveEvent=e=>_networkEventStore.networkEventStore.getEventById(e)??_networkSavedStore.networkSavedStore.getEventById(e);const readId=e=>e&&typeof e==="object"?e.id:void 0;const readBool=(e,t)=>!!(e&&typeof e==="object"&&e[t]);const inactiveStamp=()=>(0,_engine.overridesCanApply)()?{}:{active:false,inactiveReason:_engine.OVERRIDES_INACTIVE_REASON};const VALID_KINDS=["respond","fail","delay"];function readRuleDraft(e,t){if(!e||typeof e!=="object")return null;const r=e.rule??e;if(!r||typeof r!=="object")return null;const n=r;const o=typeof n.urlPattern==="string"&&n.urlPattern.trim()?n.urlPattern.trim():t?.urlPattern??"";if(!o)return null;const s=VALID_KINDS.includes(n.kind)?n.kind:t?.kind??"respond";return{id:typeof n.id==="string"?n.id:void 0,enabled:n.enabled!==false,name:typeof n.name==="string"?n.name:t?.name,urlPattern:o,methods:Array.isArray(n.methods)?n.methods.filter(d=>typeof d==="string").map(d=>d.toUpperCase()):t?.methods,requireHeader:typeof n.requireHeader==="string"&&n.requireHeader.trim()?n.requireHeader.trim():void 0,kind:s,status:typeof n.status==="number"?n.status:t?.status,statusText:typeof n.statusText==="string"?n.statusText:t?.statusText,headers:n.headers&&typeof n.headers==="object"?n.headers:t?.headers,body:patchedBody(n,t),failKind:n.failKind==="timeout"?"timeout":void 0,delayMs:typeof n.delayMs==="number"?n.delayMs:void 0,times:typeof n.times==="number"?n.times:null,alternate:n.alternate===true}}const isPlainObject=e=>!!e&&typeof e==="object"&&!Array.isArray(e);function deepMerge(e,t,r="",n={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>0&&t.length<e.length){n.shrunk.push({path:r||"(root)",have:e.length,sent:t.length})}return t}if(!isPlainObject(e)||!isPlainObject(t))return t;const o={...e};for(const[s,d]of Object.entries(t)){const i=r?`${r}.${s}`:s;if(s in e){const u=(0,_sharedUi.shapeKind)(e[s]);const l=(0,_sharedUi.shapeKind)(d);if((u==="array"||u==="object")&&u!==l){n.breaks.push({path:i,from:u,to:l})}o[s]=deepMerge(e[s],d,i,n)}else{o[s]=d}}return o}function patchViolations(e,t){if(e.body!=null||!isPlainObject(e.bodyPatch)||typeof t!=="string")return[];try{return(0,_sharedUi.typedEditViolations)(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function patchedBody(e,t){if(typeof e.body==="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);const r=t?.body??(typeof e.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(n=>n.id===e.id)?.body:void 0);if(isPlainObject(e.bodyPatch)&&typeof r==="string"){try{return JSON.stringify(deepMerge(JSON.parse(r),e.bodyPatch),null,2)}catch{return r}}return r}function existingRule(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t.id;if(typeof r!=="string")return null;const n=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===r);return n?{...n}:null}function preservedBody(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t;if(r.bodyOmitted!==true||typeof r.id!=="string")return null;const n=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===r.id);return n?{body:n.body}:null}function baseFromRequest(e){if(!e||typeof e!=="object")return null;const t=e.fromRequestId;if(typeof t!=="string"||!t)return null;const r=resolveEvent(t);return r?(0,_presets.draftFromEvent)(r):null}const networkSyncAdapter=exports.networkSyncAdapter={dispose:()=>{_overrideRulesStore.overrideRulesStore.setEnabled(false)},version:6,getSnapshot:()=>{_networkEventStore.networkEventStore.ensureInterception();return{conditions:{version:1,runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.getNetworkCondition)(),available:(0,_store.conditionsCanApply)()},events:fitEventsToBudget(_networkEventStore.networkEventStore.getEvents()),overrides:stripLargeRuleBodies(_overrideRulesStore.overrideRulesStore.getState()),saved:_networkSavedStore.networkSavedStore.getRecords().map(e=>({...e,event:toWireEvent(e.event).event}))}},subscribe:e=>{const t=_networkEventStore.networkEventStore.subscribeToEvents(e);const r=(0,_store.subscribeNetworkConditions)(e);const n=_networkSavedStore.networkSavedStore.subscribe(e);const o=_overrideRulesStore.overrideRulesStore.subscribe(e);return()=>{r();t();n();o()}},actions:{getNetworkConditions:()=>({runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.getNetworkCondition)(),available:(0,_store.conditionsCanApply)()}),setNetworkConditions:e=>{const t=e&&typeof e==="object"?e.profile:void 0;return{runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.setNetworkCondition)(t),available:(0,_store.conditionsCanApply)()}},clearEvents:()=>{_networkEventStore.networkEventStore.clearEvents()},getEventBody:e=>{const t=readId(e);if(!t)return null;const r=resolveEvent(t);if(!r)return null;return{url:r.url??null,method:r.method??null,status:r.status??null,override:r.override??null,requestData:r.requestData??null,responseData:r.responseData??null,requestHeaders:r.requestHeaders??null,responseHeaders:r.responseHeaders??null}},setPinned:e=>{const t=readId(e);if(!t)return null;const r=resolveEvent(t);if(!r)return null;const n=readBool(e,"pinned");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).pinned;if(o===n)return{ok:true};return _networkSavedStore.networkSavedStore.togglePin(r)},setSaved:e=>{const t=readId(e);if(!t)return null;const r=resolveEvent(t);if(!r)return null;const n=readBool(e,"saved");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).saved;if(o===n)return{ok:true};return _networkSavedStore.networkSavedStore.toggleSave(r)},removeSavedRecord:e=>{const t=e&&typeof e==="object"?e.key:void 0;if(!t)return null;_networkSavedStore.networkSavedStore.remove(t);return{ok:true}},clearSavedRequests:()=>{_networkSavedStore.networkSavedStore.clearSaved();return{ok:true}},clearPinnedRequests:()=>{_networkSavedStore.networkSavedStore.clearPinned();return{ok:true}},setOverridesEnabled:e=>{_overrideRulesStore.overrideRulesStore.setEnabled(readBool(e,"enabled"));return{ok:true,enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,...inactiveStamp()}},upsertOverrideRule:e=>{const t=baseFromRequest(e)??preservedBody(e)??existingRule(e);const r=e?.rule??e;if(r&&typeof r.bodyPath==="string"&&r.body==null){const s=t?.body??(typeof r.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(u=>u.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."}}if(r.bodyValue===void 0){return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${r.bodyPath}" to.`}}let d;try{d=JSON.parse(s)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}const i=(0,_sharedUi.patchFromPath)(d,r.bodyPath,r.bodyValue);if(!i.ok)return{ok:false,error:`Refused: ${i.error}`};r.bodyPatch=i.patch;delete r.bodyPath;delete r.bodyValue}if(r&&isPlainObject(r.bodyPatch)&&r.body==null){const s=t?.body??(typeof r.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(d=>d.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."}}if(r.force!==true){let d;try{const u=(0,_sharedUi.expandKeyedArrays)(JSON.parse(s),r.bodyPatch);d=u.error;if(u.notes.length)r.bodyPatch=u.patch}catch{}if(d){return{ok:false,error:`Refused: ${d}`}}const i=patchViolations(r,s);if(i.length>0){return{ok:false,error:(0,_sharedUi.refusalText)(i,"response body",(0,_sharedUi.suggestedPatch)(r.bodyPatch,i)),violations:i}}}}const n=readRuleDraft(e,t);if(!n){const s=e?.fromRequestId;return{ok:false,error:s?`No captured request \`${s}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}const o=_overrideRulesStore.overrideRulesStore.upsertRule(n);if(!o)return{ok:false,error:"Override rule limit reached."};if(o.enabled)_overrideRulesStore.overrideRulesStore.setEnabled(true);return{ok:true,rule:{id:o.id,urlPattern:o.urlPattern,enabled:o.enabled,kind:o.kind,status:o.status,times:o.times,bodySize:o.body?o.body.length:0},...o.times===void 0||o.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${o.id}\`). If you meant only the next one, set times:1.`}:{},...inactiveStamp()}},setOverrideRuleEnabled:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.setRuleEnabled(t,readBool(e,"enabled"));return{ok:true,...inactiveStamp()}},deleteOverrideRule:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.removeRule(t);return{ok:true}},clearOverrideRules:()=>{_overrideRulesStore.overrideRulesStore.clearRules();return{ok:true}},listOverrideRules:async()=>{await _overrideRulesStore.overrideRulesStore.ensureLoaded();return _overrideRulesStore.overrideRulesStore.getState()},getOverrideRuleBody:e=>{const t=readId(e);if(!t)return null;const r=_overrideRulesStore.overrideRulesStore.getState().rules.find(n=>n.id===t);if(!r)return null;return{body:r.body??null}},getCaptureStatus:()=>{const e=_networkEventStore.networkEventStore.getSubscriberCounts().total;let t=null;let r=null;try{t=(0,_networkListener.isNetworkListening)();r=(0,_networkListener.getNetworkListenerCount)()}catch{}let n=null;try{n=(0,_networkListener.isNetworkInterceptionLive)()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:n,listenerCount:r,eventCount:_networkEventStore.networkEventStore.getEvents().length}},debugOverrides:e=>{const t=(e&&typeof e==="object"?e.url:void 0)??"https://example.com/";return{interceptorInstalled:(0,_networkListener.isNetworkListening)(),listenerCount:(0,_networkListener.getNetworkListenerCount)(),engine:(0,_engine.inspectEngine)(t,"GET"),store:{enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,ruleCount:_overrideRulesStore.overrideRulesStore.getState().rules.length,rulesVisibleToEngine:_overrideRulesStore.overrideRulesStore.getRules().length}}}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{getNetworkCondition as E,setNetworkCondition as A,subscribeNetworkConditions as j,conditionsCanApply as g,networkConditionsRuntimeId as h}from"../conditions/store";import{networkEventStore as f}from"../utils/networkEventStore";import{flagsForEventId as O,networkSavedStore as a}from"../utils/networkSavedStore";import{overrideRulesStore as u}from"../overrides/overrideRulesStore";import{draftFromEvent as x}from"../overrides/presets";import{inspectEngine as B,overridesCanApply as T,OVERRIDES_INACTIVE_REASON as C}from"../overrides/engine";import{getNetworkListenerCount as R,isNetworkInterceptionLive as M,isNetworkListening as P}from"../utils/networkListener";import{approxJsonSize as m,isOverWireBudget as _}from"@buoy-gg/shared-ui";import{expandKeyedArrays as L,patchFromPath as $,refusalText as J,shapeKind as w,suggestedPatch as W,typedEditViolations as K}from"@buoy-gg/shared-ui";export const SNAPSHOT_BODY_INLINE_LIMIT=16*1024;export const SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;function S(e,t){if(e===void 0)return false;if((t??0)>SNAPSHOT_BODY_INLINE_LIMIT)return true;return _(e,SNAPSHOT_BODY_INLINE_LIMIT)}const I=new WeakMap;const N=new WeakMap;function k(e){const t=I.get(e);if(t)return t;let r;try{r=F(e)}catch{r=z(e)}I.set(e,r);return r}function z(e){const t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0};let r=1024;try{r=m(t,SNAPSHOT_EVENTS_BUDGET).bytes}catch{}return{event:t,bytes:r}}function F(e){const t=S(e.requestData,e.requestSize);const r=S(e.responseData,e.responseSize);const n=D(e.graphqlVariables);const o=H(e.requestHeaders);const s=H(e.responseHeaders);const d=t||r||n!==e.graphqlVariables||o!==e.requestHeaders||s!==e.responseHeaders;let i=e;if(d){i={...e};if(t){i.requestData=void 0;i.requestBodyOmitted=true}if(r){i.responseData=void 0;i.responseBodyOmitted=true}if(n!==e.graphqlVariables){i.graphqlVariables=n}if(o!==e.requestHeaders){i.requestHeaders=o;i.headersOmitted=true}if(s!==e.responseHeaders){i.responseHeaders=s;i.headersOmitted=true}}return{event:i,bytes:m(i,SNAPSHOT_EVENTS_BUDGET).bytes}}function G(e){const t=N.get(e);if(t)return t;const{event:r}=k(e);const n={...r};if(n.requestData!==void 0){n.requestData=void 0;n.requestBodyOmitted=true}if(n.responseData!==void 0){n.responseData=void 0;n.responseBodyOmitted=true}if(n.graphqlVariables!==void 0){n.graphqlVariables=D(n.graphqlVariables,true)}const o={event:n,bytes:m(n,SNAPSHOT_EVENTS_BUDGET).bytes};N.set(e,o);return o}function U(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const o=k(e[n]);if(r+o.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=o.event;r+=o.bytes}else{const s=G(e[n]);t[n]=s.event;r+=s.bytes}}return t}function D(e,t=false){if(!e)return e;if(!t&&!S(e,void 0))return e;const r={};for(const[n,o]of Object.entries(e)){if(typeof o==="string"&&o.length<=64)r[n]=o;else if(typeof o==="number"||typeof o==="boolean"){r[n]=o}}return Object.keys(r).length>0?r:void 0}export const SNAPSHOT_HEADER_VALUE_LIMIT=64;function H(e){if(!e)return e;let t=false;const r={};for(const[n,o]of Object.entries(e)){if(typeof o!=="string")continue;if(o.length<=SNAPSHOT_HEADER_VALUE_LIMIT){r[n]=o}else{r[n]=`${o.slice(0,SNAPSHOT_HEADER_VALUE_LIMIT)}\u2026 [${o.length-SNAPSHOT_HEADER_VALUE_LIMIT} more]`;t=true}}return t?r:e}const Y=e=>{let t=false;const r=e.rules.map(n=>{if(!n.body||n.body.length<=SNAPSHOT_BODY_INLINE_LIMIT){return n}t=true;return{...n,body:void 0,bodyOmitted:true}});return t?{...e,rules:r}:e};const b=e=>f.getEventById(e)??a.getEventById(e);const c=e=>e&&typeof e==="object"?e.id:void 0;const p=(e,t)=>!!(e&&typeof e==="object"&&e[t]);const v=()=>T()?{}:{active:false,inactiveReason:C};const Q=["respond","fail","delay"];function X(e,t){if(!e||typeof e!=="object")return null;const r=e.rule??e;if(!r||typeof r!=="object")return null;const n=r;const o=typeof n.urlPattern==="string"&&n.urlPattern.trim()?n.urlPattern.trim():t?.urlPattern??"";if(!o)return null;const s=Q.includes(n.kind)?n.kind:t?.kind??"respond";return{id:typeof n.id==="string"?n.id:void 0,enabled:n.enabled!==false,name:typeof n.name==="string"?n.name:t?.name,urlPattern:o,methods:Array.isArray(n.methods)?n.methods.filter(d=>typeof d==="string").map(d=>d.toUpperCase()):t?.methods,requireHeader:typeof n.requireHeader==="string"&&n.requireHeader.trim()?n.requireHeader.trim():void 0,kind:s,status:typeof n.status==="number"?n.status:t?.status,statusText:typeof n.statusText==="string"?n.statusText:t?.statusText,headers:n.headers&&typeof n.headers==="object"?n.headers:t?.headers,body:ee(n,t),failKind:n.failKind==="timeout"?"timeout":void 0,delayMs:typeof n.delayMs==="number"?n.delayMs:void 0,times:typeof n.times==="number"?n.times:null,alternate:n.alternate===true}}const y=e=>!!e&&typeof e==="object"&&!Array.isArray(e);function V(e,t,r="",n={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>0&&t.length<e.length){n.shrunk.push({path:r||"(root)",have:e.length,sent:t.length})}return t}if(!y(e)||!y(t))return t;const o={...e};for(const[s,d]of Object.entries(t)){const i=r?`${r}.${s}`:s;if(s in e){const l=w(e[s]);const q=w(d);if((l==="array"||l==="object")&&l!==q){n.breaks.push({path:i,from:l,to:q})}o[s]=V(e[s],d,i,n)}else{o[s]=d}}return o}function Z(e,t){if(e.body!=null||!y(e.bodyPatch)||typeof t!=="string")return[];try{return K(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function ee(e,t){if(typeof e.body==="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);const r=t?.body??(typeof e.id==="string"?u.getState().rules.find(n=>n.id===e.id)?.body:void 0);if(y(e.bodyPatch)&&typeof r==="string"){try{return JSON.stringify(V(JSON.parse(r),e.bodyPatch),null,2)}catch{return r}}return r}function te(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t.id;if(typeof r!=="string")return null;const n=u.getState().rules.find(o=>o.id===r);return n?{...n}:null}function re(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t;if(r.bodyOmitted!==true||typeof r.id!=="string")return null;const n=u.getState().rules.find(o=>o.id===r.id);return n?{body:n.body}:null}function ne(e){if(!e||typeof e!=="object")return null;const t=e.fromRequestId;if(typeof t!=="string"||!t)return null;const r=b(t);return r?x(r):null}export const networkSyncAdapter={dispose:()=>{u.setEnabled(false)},version:6,getSnapshot:()=>{f.ensureInterception();return{conditions:{version:1,runtimeId:h,profile:E(),available:g()},events:U(f.getEvents()),overrides:Y(u.getState()),saved:a.getRecords().map(e=>({...e,event:k(e.event).event}))}},subscribe:e=>{const t=f.subscribeToEvents(e);const r=j(e);const n=a.subscribe(e);const o=u.subscribe(e);return()=>{r();t();n();o()}},actions:{getNetworkConditions:()=>({runtimeId:h,profile:E(),available:g()}),setNetworkConditions:e=>{const t=e&&typeof e==="object"?e.profile:void 0;return{runtimeId:h,profile:A(t),available:g()}},clearEvents:()=>{f.clearEvents()},getEventBody:e=>{const t=c(e);if(!t)return null;const r=b(t);if(!r)return null;return{url:r.url??null,method:r.method??null,status:r.status??null,override:r.override??null,requestData:r.requestData??null,responseData:r.responseData??null,requestHeaders:r.requestHeaders??null,responseHeaders:r.responseHeaders??null}},setPinned:e=>{const t=c(e);if(!t)return null;const r=b(t);if(!r)return null;const n=p(e,"pinned");const o=O(a.getState(),t).pinned;if(o===n)return{ok:true};return a.togglePin(r)},setSaved:e=>{const t=c(e);if(!t)return null;const r=b(t);if(!r)return null;const n=p(e,"saved");const o=O(a.getState(),t).saved;if(o===n)return{ok:true};return a.toggleSave(r)},removeSavedRecord:e=>{const t=e&&typeof e==="object"?e.key:void 0;if(!t)return null;a.remove(t);return{ok:true}},clearSavedRequests:()=>{a.clearSaved();return{ok:true}},clearPinnedRequests:()=>{a.clearPinned();return{ok:true}},setOverridesEnabled:e=>{u.setEnabled(p(e,"enabled"));return{ok:true,enabled:u.getState().enabled,...v()}},upsertOverrideRule:e=>{const t=ne(e)??re(e)??te(e);const r=e?.rule??e;if(r&&typeof r.bodyPath==="string"&&r.body==null){const s=t?.body??(typeof r.id==="string"?u.getState().rules.find(l=>l.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."}}if(r.bodyValue===void 0){return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${r.bodyPath}" to.`}}let d;try{d=JSON.parse(s)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}const i=$(d,r.bodyPath,r.bodyValue);if(!i.ok)return{ok:false,error:`Refused: ${i.error}`};r.bodyPatch=i.patch;delete r.bodyPath;delete r.bodyValue}if(r&&y(r.bodyPatch)&&r.body==null){const s=t?.body??(typeof r.id==="string"?u.getState().rules.find(d=>d.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."}}if(r.force!==true){let d;try{const l=L(JSON.parse(s),r.bodyPatch);d=l.error;if(l.notes.length)r.bodyPatch=l.patch}catch{}if(d){return{ok:false,error:`Refused: ${d}`}}const i=Z(r,s);if(i.length>0){return{ok:false,error:J(i,"response body",W(r.bodyPatch,i)),violations:i}}}}const n=X(e,t);if(!n){const s=e?.fromRequestId;return{ok:false,error:s?`No captured request \`${s}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}const o=u.upsertRule(n);if(!o)return{ok:false,error:"Override rule limit reached."};if(o.enabled)u.setEnabled(true);return{ok:true,rule:{id:o.id,urlPattern:o.urlPattern,enabled:o.enabled,kind:o.kind,status:o.status,times:o.times,bodySize:o.body?o.body.length:0},...o.times===void 0||o.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${o.id}\`). If you meant only the next one, set times:1.`}:{},...v()}},setOverrideRuleEnabled:e=>{const t=c(e);if(!t)return{ok:false,error:"Missing rule id."};u.setRuleEnabled(t,p(e,"enabled"));return{ok:true,...v()}},deleteOverrideRule:e=>{const t=c(e);if(!t)return{ok:false,error:"Missing rule id."};u.removeRule(t);return{ok:true}},clearOverrideRules:()=>{u.clearRules();return{ok:true}},listOverrideRules:()=>u.getState(),getOverrideRuleBody:e=>{const t=c(e);if(!t)return null;const r=u.getState().rules.find(n=>n.id===t);if(!r)return null;return{body:r.body??null}},getCaptureStatus:()=>{const e=f.getSubscriberCounts().total;let t=null;let r=null;try{t=P();r=R()}catch{}let n=null;try{n=M()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:n,listenerCount:r,eventCount:f.getEvents().length}},debugOverrides:e=>{const t=(e&&typeof e==="object"?e.url:void 0)??"https://example.com/";return{interceptorInstalled:P(),listenerCount:R(),engine:B(t,"GET"),store:{enabled:u.getState().enabled,ruleCount:u.getState().rules.length,rulesVisibleToEngine:u.getRules().length}}}}};
|
|
1
|
+
"use strict";import{getNetworkCondition as E,setNetworkCondition as A,subscribeNetworkConditions as j,conditionsCanApply as g,networkConditionsRuntimeId as h}from"../conditions/store";import{networkEventStore as f}from"../utils/networkEventStore";import{flagsForEventId as O,networkSavedStore as a}from"../utils/networkSavedStore";import{overrideRulesStore as u}from"../overrides/overrideRulesStore";import{draftFromEvent as x}from"../overrides/presets";import{inspectEngine as B,overridesCanApply as T,OVERRIDES_INACTIVE_REASON as C}from"../overrides/engine";import{getNetworkListenerCount as R,isNetworkInterceptionLive as L,isNetworkListening as P}from"../utils/networkListener";import{approxJsonSize as m,isOverWireBudget as M}from"@buoy-gg/shared-ui";import{expandKeyedArrays as _,patchFromPath as $,refusalText as J,shapeKind as w,suggestedPatch as W,typedEditViolations as K}from"@buoy-gg/shared-ui";export const SNAPSHOT_BODY_INLINE_LIMIT=16*1024;export const SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;function S(e,t){if(e===void 0)return false;if((t??0)>SNAPSHOT_BODY_INLINE_LIMIT)return true;return M(e,SNAPSHOT_BODY_INLINE_LIMIT)}const I=new WeakMap;const N=new WeakMap;function k(e){const t=I.get(e);if(t)return t;let r;try{r=F(e)}catch{r=z(e)}I.set(e,r);return r}function z(e){const t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0};let r=1024;try{r=m(t,SNAPSHOT_EVENTS_BUDGET).bytes}catch{}return{event:t,bytes:r}}function F(e){const t=S(e.requestData,e.requestSize);const r=S(e.responseData,e.responseSize);const n=D(e.graphqlVariables);const o=H(e.requestHeaders);const s=H(e.responseHeaders);const d=t||r||n!==e.graphqlVariables||o!==e.requestHeaders||s!==e.responseHeaders;let i=e;if(d){i={...e};if(t){i.requestData=void 0;i.requestBodyOmitted=true}if(r){i.responseData=void 0;i.responseBodyOmitted=true}if(n!==e.graphqlVariables){i.graphqlVariables=n}if(o!==e.requestHeaders){i.requestHeaders=o;i.headersOmitted=true}if(s!==e.responseHeaders){i.responseHeaders=s;i.headersOmitted=true}}return{event:i,bytes:m(i,SNAPSHOT_EVENTS_BUDGET).bytes}}function G(e){const t=N.get(e);if(t)return t;const{event:r}=k(e);const n={...r};if(n.requestData!==void 0){n.requestData=void 0;n.requestBodyOmitted=true}if(n.responseData!==void 0){n.responseData=void 0;n.responseBodyOmitted=true}if(n.graphqlVariables!==void 0){n.graphqlVariables=D(n.graphqlVariables,true)}const o={event:n,bytes:m(n,SNAPSHOT_EVENTS_BUDGET).bytes};N.set(e,o);return o}function U(e){const t=new Array(e.length);let r=0;for(let n=0;n<e.length;n++){const o=k(e[n]);if(r+o.bytes<=SNAPSHOT_EVENTS_BUDGET){t[n]=o.event;r+=o.bytes}else{const s=G(e[n]);t[n]=s.event;r+=s.bytes}}return t}function D(e,t=false){if(!e)return e;if(!t&&!S(e,void 0))return e;const r={};for(const[n,o]of Object.entries(e)){if(typeof o==="string"&&o.length<=64)r[n]=o;else if(typeof o==="number"||typeof o==="boolean"){r[n]=o}}return Object.keys(r).length>0?r:void 0}export const SNAPSHOT_HEADER_VALUE_LIMIT=64;function H(e){if(!e)return e;let t=false;const r={};for(const[n,o]of Object.entries(e)){if(typeof o!=="string")continue;if(o.length<=SNAPSHOT_HEADER_VALUE_LIMIT){r[n]=o}else{r[n]=`${o.slice(0,SNAPSHOT_HEADER_VALUE_LIMIT)}\u2026 [${o.length-SNAPSHOT_HEADER_VALUE_LIMIT} more]`;t=true}}return t?r:e}const Y=e=>{let t=false;const r=e.rules.map(n=>{if(!n.body||n.body.length<=SNAPSHOT_BODY_INLINE_LIMIT){return n}t=true;return{...n,body:void 0,bodyOmitted:true}});return t?{...e,rules:r}:e};const b=e=>f.getEventById(e)??a.getEventById(e);const c=e=>e&&typeof e==="object"?e.id:void 0;const p=(e,t)=>!!(e&&typeof e==="object"&&e[t]);const v=()=>T()?{}:{active:false,inactiveReason:C};const Q=["respond","fail","delay"];function X(e,t){if(!e||typeof e!=="object")return null;const r=e.rule??e;if(!r||typeof r!=="object")return null;const n=r;const o=typeof n.urlPattern==="string"&&n.urlPattern.trim()?n.urlPattern.trim():t?.urlPattern??"";if(!o)return null;const s=Q.includes(n.kind)?n.kind:t?.kind??"respond";return{id:typeof n.id==="string"?n.id:void 0,enabled:n.enabled!==false,name:typeof n.name==="string"?n.name:t?.name,urlPattern:o,methods:Array.isArray(n.methods)?n.methods.filter(d=>typeof d==="string").map(d=>d.toUpperCase()):t?.methods,requireHeader:typeof n.requireHeader==="string"&&n.requireHeader.trim()?n.requireHeader.trim():void 0,kind:s,status:typeof n.status==="number"?n.status:t?.status,statusText:typeof n.statusText==="string"?n.statusText:t?.statusText,headers:n.headers&&typeof n.headers==="object"?n.headers:t?.headers,body:ee(n,t),failKind:n.failKind==="timeout"?"timeout":void 0,delayMs:typeof n.delayMs==="number"?n.delayMs:void 0,times:typeof n.times==="number"?n.times:null,alternate:n.alternate===true}}const y=e=>!!e&&typeof e==="object"&&!Array.isArray(e);function V(e,t,r="",n={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>0&&t.length<e.length){n.shrunk.push({path:r||"(root)",have:e.length,sent:t.length})}return t}if(!y(e)||!y(t))return t;const o={...e};for(const[s,d]of Object.entries(t)){const i=r?`${r}.${s}`:s;if(s in e){const l=w(e[s]);const q=w(d);if((l==="array"||l==="object")&&l!==q){n.breaks.push({path:i,from:l,to:q})}o[s]=V(e[s],d,i,n)}else{o[s]=d}}return o}function Z(e,t){if(e.body!=null||!y(e.bodyPatch)||typeof t!=="string")return[];try{return K(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function ee(e,t){if(typeof e.body==="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);const r=t?.body??(typeof e.id==="string"?u.getState().rules.find(n=>n.id===e.id)?.body:void 0);if(y(e.bodyPatch)&&typeof r==="string"){try{return JSON.stringify(V(JSON.parse(r),e.bodyPatch),null,2)}catch{return r}}return r}function te(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t.id;if(typeof r!=="string")return null;const n=u.getState().rules.find(o=>o.id===r);return n?{...n}:null}function re(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const r=t;if(r.bodyOmitted!==true||typeof r.id!=="string")return null;const n=u.getState().rules.find(o=>o.id===r.id);return n?{body:n.body}:null}function ne(e){if(!e||typeof e!=="object")return null;const t=e.fromRequestId;if(typeof t!=="string"||!t)return null;const r=b(t);return r?x(r):null}export const networkSyncAdapter={dispose:()=>{u.setEnabled(false)},version:6,getSnapshot:()=>{f.ensureInterception();return{conditions:{version:1,runtimeId:h,profile:E(),available:g()},events:U(f.getEvents()),overrides:Y(u.getState()),saved:a.getRecords().map(e=>({...e,event:k(e.event).event}))}},subscribe:e=>{const t=f.subscribeToEvents(e);const r=j(e);const n=a.subscribe(e);const o=u.subscribe(e);return()=>{r();t();n();o()}},actions:{getNetworkConditions:()=>({runtimeId:h,profile:E(),available:g()}),setNetworkConditions:e=>{const t=e&&typeof e==="object"?e.profile:void 0;return{runtimeId:h,profile:A(t),available:g()}},clearEvents:()=>{f.clearEvents()},getEventBody:e=>{const t=c(e);if(!t)return null;const r=b(t);if(!r)return null;return{url:r.url??null,method:r.method??null,status:r.status??null,override:r.override??null,requestData:r.requestData??null,responseData:r.responseData??null,requestHeaders:r.requestHeaders??null,responseHeaders:r.responseHeaders??null}},setPinned:e=>{const t=c(e);if(!t)return null;const r=b(t);if(!r)return null;const n=p(e,"pinned");const o=O(a.getState(),t).pinned;if(o===n)return{ok:true};return a.togglePin(r)},setSaved:e=>{const t=c(e);if(!t)return null;const r=b(t);if(!r)return null;const n=p(e,"saved");const o=O(a.getState(),t).saved;if(o===n)return{ok:true};return a.toggleSave(r)},removeSavedRecord:e=>{const t=e&&typeof e==="object"?e.key:void 0;if(!t)return null;a.remove(t);return{ok:true}},clearSavedRequests:()=>{a.clearSaved();return{ok:true}},clearPinnedRequests:()=>{a.clearPinned();return{ok:true}},setOverridesEnabled:e=>{u.setEnabled(p(e,"enabled"));return{ok:true,enabled:u.getState().enabled,...v()}},upsertOverrideRule:e=>{const t=ne(e)??re(e)??te(e);const r=e?.rule??e;if(r&&typeof r.bodyPath==="string"&&r.body==null){const s=t?.body??(typeof r.id==="string"?u.getState().rules.find(l=>l.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."}}if(r.bodyValue===void 0){return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${r.bodyPath}" to.`}}let d;try{d=JSON.parse(s)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}const i=$(d,r.bodyPath,r.bodyValue);if(!i.ok)return{ok:false,error:`Refused: ${i.error}`};r.bodyPatch=i.patch;delete r.bodyPath;delete r.bodyValue}if(r&&y(r.bodyPatch)&&r.body==null){const s=t?.body??(typeof r.id==="string"?u.getState().rules.find(d=>d.id===r.id)?.body:void 0);if(typeof s!=="string"){return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."}}if(r.force!==true){let d;try{const l=_(JSON.parse(s),r.bodyPatch);d=l.error;if(l.notes.length)r.bodyPatch=l.patch}catch{}if(d){return{ok:false,error:`Refused: ${d}`}}const i=Z(r,s);if(i.length>0){return{ok:false,error:J(i,"response body",W(r.bodyPatch,i)),violations:i}}}}const n=X(e,t);if(!n){const s=e?.fromRequestId;return{ok:false,error:s?`No captured request \`${s}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}const o=u.upsertRule(n);if(!o)return{ok:false,error:"Override rule limit reached."};if(o.enabled)u.setEnabled(true);return{ok:true,rule:{id:o.id,urlPattern:o.urlPattern,enabled:o.enabled,kind:o.kind,status:o.status,times:o.times,bodySize:o.body?o.body.length:0},...o.times===void 0||o.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${o.id}\`). If you meant only the next one, set times:1.`}:{},...v()}},setOverrideRuleEnabled:e=>{const t=c(e);if(!t)return{ok:false,error:"Missing rule id."};u.setRuleEnabled(t,p(e,"enabled"));return{ok:true,...v()}},deleteOverrideRule:e=>{const t=c(e);if(!t)return{ok:false,error:"Missing rule id."};u.removeRule(t);return{ok:true}},clearOverrideRules:()=>{u.clearRules();return{ok:true}},listOverrideRules:async()=>{await u.ensureLoaded();return u.getState()},getOverrideRuleBody:e=>{const t=c(e);if(!t)return null;const r=u.getState().rules.find(n=>n.id===t);if(!r)return null;return{body:r.body??null}},getCaptureStatus:()=>{const e=f.getSubscriberCounts().total;let t=null;let r=null;try{t=P();r=R()}catch{}let n=null;try{n=L()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:n,listenerCount:r,eventCount:f.getEvents().length}},debugOverrides:e=>{const t=(e&&typeof e==="object"?e.url:void 0)??"https://example.com/";return{interceptorInstalled:P(),listenerCount:R(),engine:B(t,"GET"),store:{enabled:u.getState().enabled,ruleCount:u.getState().rules.length,rulesVisibleToEngine:u.getRules().length}}}}};
|
|
@@ -208,8 +208,15 @@ export declare const networkSyncAdapter: {
|
|
|
208
208
|
clearOverrideRules: () => {
|
|
209
209
|
ok: boolean;
|
|
210
210
|
};
|
|
211
|
-
/**
|
|
212
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Read the rules back — hit counts included, which the snapshot coalesces.
|
|
213
|
+
*
|
|
214
|
+
* Waits for the saved rules to load first. At app start this is called
|
|
215
|
+
* before hydration finishes, and an empty list then reads as "every rule
|
|
216
|
+
* was deleted": Scenarios dropped its active record while the rule came
|
|
217
|
+
* back from disk a moment later, still answering requests.
|
|
218
|
+
*/
|
|
219
|
+
listOverrideRules: () => Promise<OverrideRulesState>;
|
|
213
220
|
/**
|
|
214
221
|
* The full body of one rule, for the surfaces the snapshot withheld it from
|
|
215
222
|
* (see `stripLargeRuleBodies`). Fetched when the user opens the rule, which
|
package/lib/web/index.mjs
CHANGED
|
@@ -140,6 +140,6 @@ ${JSON.stringify(n.responseData,null,2)}
|
|
|
140
140
|
|
|
141
141
|
`+o}import{Fragment as du,jsx as he,jsxs as xt}from"react/jsx-runtime";function uu({activeStatus:e,onToggleStatus:t,ignoredPatterns:r,paused:o}){let n=wi({ignoredPatterns:r,paused:o});return he(Ri,{counts:n,activeStatus:e,onToggleStatus:t})}function Ri({counts:e,activeStatus:t,onToggleStatus:r}){return xt(c,{style:ee.headerChipRow,children:[xt(N,{style:[ee.headerChip,t==="success"&&ee.headerChipActive],onPress:()=>r("success"),children:[he(Ed,{size:12,color:ot.semantic.success}),he(g,{style:[ee.headerChipValue,{color:ot.semantic.success}],children:e.successful})]}),xt(N,{style:[ee.headerChip,t==="error"&&ee.headerChipActive],onPress:()=>r("error"),children:[he(Ld,{size:12,color:ot.semantic.error}),he(g,{style:[ee.headerChipValue,{color:ot.semantic.error}],children:e.failed})]}),xt(N,{style:[ee.headerChip,t==="pending"&&ee.headerChipActive],onPress:()=>r("pending"),children:[he(Pd,{size:12,color:ot.semantic.warning}),he(g,{style:[ee.headerChipValue,{color:ot.semantic.warning}],children:e.pending})]})]})}function cu({paused:e}){let t=au({paused:e});return he(N,{"sentry-label":"ignore clear events",testID:"buoy-network-clear",accessibilityLabel:"Clear network requests",accessibilityRole:"button",onPress:()=>K.clearEvents(),style:[ee.headerActionButton,!t&&ee.headerActionButtonDisabled],disabled:!t,children:he(Od,{size:14,color:t?re.color.textSecondary:re.color.textTertiary})})}function hu({onPress:e}){let{savedRecords:t}=Ot(),r=t.length;return xt(N,{"sentry-label":"ignore open saved",onPress:e,accessibilityLabel:"Saved requests",style:ee.headerActionButton,children:[he(li,{size:14,color:r>0?re.color.accent:re.color.textSecondary}),r>0?he(c,{style:ee.savedBadge,children:he(g,{style:ee.savedBadgeText,children:r>99?"99+":r})}):null]})}function ki({isPro:e,onUpgradePress:t}){let r=Ro(),o=Ot(),{pinned:n,saved:i}=Pr(o,r),s=zd("network.saved"),a=!n&&o.pinnedEvents.length>=Lr,l=!i&&o.savedRecords.length>=s,u=()=>r?K.getEvents().find(C=>C.id===r)??se.getEventById(r):null,b=()=>{let C=u();C&&o.togglePin(C)},E=()=>{if(l&&!e){t();return}let C=u();C&&o.toggleSave(C)};return xt(du,{children:[he(N,{"sentry-label":"ignore pin request",onPress:b,disabled:a,testID:"buoy-network-pin",accessibilityRole:"button",accessibilityLabel:n?"Unpin request":"Pin request",accessibilityHint:a?`Pin limit reached (${Lr})`:void 0,style:[ee.headerActionButton,n&&ee.headerActionButtonActive,a&&ee.headerActionButtonDisabled],children:he(Bd,{size:14,active:n,color:n?re.color.accent:a?re.color.textTertiary:re.color.textSecondary})}),he(N,{"sentry-label":"ignore save request",onPress:E,disabled:l&&e,testID:"buoy-network-save",accessibilityRole:"button",accessibilityLabel:i?"Remove from saved":"Save request",accessibilityHint:l&&e?`Saved limit reached (${nt})`:void 0,style:[ee.headerActionButton,i&&ee.headerActionButtonSaved,l&&e&&ee.headerActionButtonDisabled],children:he(li,{size:14,color:i?re.color.accent:l&&e?re.color.textTertiary:re.color.textSecondary})})]})}function pu({isPro:e,filter:t,ignoredPatterns:r,copySettings:o,paused:n,onUpgradePress:i,label:s}){let a=lu({filter:t,ignoredPatterns:r,paused:n});return e?he(Dd,{value:()=>Ci(rr(or(K.getEvents(),r),t),o),size:14,label:s,buttonStyle:s?ee.copyMenuRow:ee.headerActionButton,labelStyle:ee.copyMenuLabel,colors:{idle:a?re.color.textSecondary:re.color.textTertiary,success:ot.semantic.success,error:ot.semantic.error},disabled:!a}):xt(N,{"sentry-label":"ignore copy pro",onPress:i,style:[s?ee.copyMenuRow:ee.headerActionButton,!a&&ee.headerActionButtonDisabled],disabled:!a,children:[he(qd,{size:14,color:a?re.color.textSecondary:re.color.textTertiary}),s?he(g,{style:ee.copyMenuLabel,children:s}):null]})}var ee=fe.create({copyMenuRow:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:6,paddingVertical:11,justifyContent:"flex-start"},copyMenuLabel:{fontSize:13,fontWeight:"600",color:re.color.text},headerChipRow:{flexDirection:"row",alignItems:"center",gap:8},headerChip:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:re.color.buttonSurface,paddingHorizontal:10,paddingVertical:5,borderRadius:12,borderWidth:1,borderColor:re.color.border},headerChipActive:{backgroundColor:re.color.accentSoft,borderColor:re.color.accentBorderStrong},headerChipValue:{fontSize:12,fontWeight:"600",fontFamily:di},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:re.color.buttonSurface,borderWidth:1,borderColor:re.color.border,alignItems:"center",justifyContent:"center"},headerActionButtonDisabled:{opacity:.55},headerActionButtonActive:{backgroundColor:re.color.accentSoft,borderColor:re.color.accentBorderStrong},headerActionButtonSaved:{backgroundColor:re.color.accentSoft,borderColor:re.color.accentBorderStrong},savedBadge:{position:"absolute",top:-3,right:-3,minWidth:14,height:14,paddingHorizontal:3,borderRadius:7,backgroundColor:re.color.accent,alignItems:"center",justifyContent:"center"},savedBadgeText:{color:re.color.onAccent,fontSize:9,fontWeight:"700",fontFamily:di}});D();ce();import{useCallback as fu}from"react";import{FlaskConical as gu,Pin as mu,Power as yu,macOSColors as be,ToolEmptyState as bu,resolveListEmptyState as vu,EVENT_LIST_PRESET as Su,monoFont as xu}from"@buoy-gg/shared-ui/web";D();ce();import{memo as wu}from"react";import{ChevronRight as Tu,Upload as Cu,Download as Ru,Clock as ku,AlertCircle as Iu,Bookmark as Eu,FlaskConical as Lu,Pin as Pu,DevToolsCard as qu,MethodBadge as Bu,TypeBadge as Ou,night as we,macOSColors as Dt,monoFont as ko}from"@buoy-gg/shared-ui/web";import{formatRelativeTime as Du}from"@buoy-gg/shared-ui/web";import{jsx as ne,jsxs as _e}from"react/jsx-runtime";function zu(e,t){return t?Dt.semantic.error:e?e>=200&&e<300?Dt.semantic.success:e>=300&&e<400?Dt.semantic.info:e>=400?Dt.semantic.error:Dt.text.muted:Dt.semantic.warning}function Au(e){let t=e?.["content-type"]||e?.["Content-Type"]||"";return t.includes("json")?"JSON":t.includes("xml")?"XML":t.includes("html")?"HTML":t.includes("text")?"TEXT":t.includes("image")?"IMG":t.includes("video")?"VIDEO":t.includes("audio")?"AUDIO":t.includes("form")?"FORM":null}function Ii(e){switch(e){case"fetch":return{backgroundColor:"rgba(74, 144, 226, 0.15)",color:"#4A90E2"};case"graphql":return{backgroundColor:"rgba(229, 53, 171, 0.15)",color:"#E535AB"};case"grpc-web":return{backgroundColor:"rgba(16, 185, 129, 0.15)",color:"#10B981"};case"xhr":return{backgroundColor:"rgba(245, 158, 11, 0.15)",color:"#F59E0B"};default:return{backgroundColor:"rgba(147, 51, 234, 0.15)",color:"#9333EA"}}}function Hu({event:e,isPending:t,statusColor:r}){return t?_e(c,{style:le.pendingBadge,children:[ne(ku,{size:10,color:we.color.warning}),ne(g,{style:le.pendingText,children:"..."})]}):e.error?_e(c,{style:le.errorBadge,children:[ne(Iu,{size:10,color:we.color.danger}),ne(g,{style:le.errorText,children:"ERR"})]}):ne(c,{style:le.statusBadge,children:ne(g,{style:[le.statusText,{color:r}],children:String(e.status)})})}function Mu({requestSize:e,responseSize:t}){return!e&&!t?null:_e(c,{style:le.sizeRow,children:[e?_e(c,{style:le.sizeItem,children:[ne(Cu,{size:8,color:we.color.info}),ne(g,{style:le.sizeText,children:Ye(e)})]}):null,t?_e(c,{style:le.sizeItem,children:[ne(Ru,{size:8,color:we.color.accent}),ne(g,{style:le.sizeText,children:Ye(t)})]}):null]})}function Nu({timestamp:e,duration:t}){let r=vo(),o=Du(e,r);return t?_e(g,{style:le.bottomRightText,children:[Ir(t)," ",o]}):ne(g,{style:le.bottomRightText,children:o})}var zt=wu(function({event:e,onPress:t,pinned:r=false,saved:o=false,overridden:n=false,onLongPress:i}){let s=zu(e.status,e.error),a=!e.status&&!e.error,l=Au(e.responseHeaders),u=e.path||e.url.replace(/^https?:\/\/[^/]+/,"");return e.requestClient==="graphql"?e.operationName?u=Zn(e.operationName,e.graphqlVariables):u=u.replace(/\/graphql[^?]*/,"/graphql"):e.operationName&&(u=`${u}
|
|
142
142
|
(${e.operationName})`),_e(qu,{onPress:()=>t(e),onLongPress:i?()=>i(e):void 0,style:le.cardWrapper,contentStyle:[le.container,{borderLeftColor:s}],testID:`buoy-network-row-${e.id}`,accessibilityLabel:`${e.method} ${e.path||e.url}`,children:[_e(c,{style:le.topRightContainer,children:[r?ne(Pu,{size:10,active:true,color:we.color.info}):null,o?ne(Eu,{size:10,color:we.color.accent}):null,n||e.override?ne(Lu,{size:10,color:we.color.warning}):null,ne(Hu,{event:e,isPending:a,statusColor:s}),e.requestClient?ne(c,{style:[le.topRightBadge,{backgroundColor:Ii(e.requestClient).backgroundColor}],children:ne(g,{style:[le.clientText,{color:Ii(e.requestClient).color}],children:e.requestClient==="graphql"?"GQL":e.requestClient==="grpc-web"?"gRPC":e.requestClient==="xhr"?"XHR":e.requestClient})}):null]}),_e(c,{style:le.leftSection,children:[ne(Bu,{method:e.method,size:"small"}),ne(Mu,{requestSize:e.requestSize,responseSize:e.responseSize})]}),ne(c,{style:le.middleSection,children:ne(g,{style:le.urlText,numberOfLines:2,children:u})}),_e(c,{style:le.rightSection,children:[l?ne(Ou,{type:l,size:"small"}):null,ne(Tu,{size:14,color:we.color.textTertiary})]}),ne(c,{style:le.bottomRightContainer,children:ne(Nu,{timestamp:e.timestamp,duration:e.duration})})]})});zt.displayName="NetworkEventItemCompact";var le=fe.create({cardWrapper:{marginHorizontal:8},container:{flexDirection:"row",alignItems:"center",backgroundColor:"rgba(12, 12, 12, 0.9)",borderLeftWidth:3,borderLeftColor:"transparent",borderBottomWidth:1},leftSection:{marginRight:8,alignItems:"flex-start"},topRightContainer:{position:"absolute",top:1,right:1,flexDirection:"row",alignItems:"center",gap:4},topRightBadge:{paddingHorizontal:4,paddingVertical:2,borderRadius:4},middleSection:{flex:1,justifyContent:"center",paddingRight:8},urlText:{fontSize:12,color:we.color.text,lineHeight:16,fontFamily:ko},rightSection:{flexDirection:"row",alignItems:"center",gap:6},bottomRightContainer:{position:"absolute",bottom:4,right:8},bottomRightText:{fontSize:9,color:we.color.textTertiary,fontFamily:ko},statusBadge:{paddingHorizontal:4,paddingVertical:1,borderRadius:3},statusText:{fontSize:10,fontWeight:"600"},pendingBadge:{flexDirection:"row",alignItems:"center",gap:2,paddingHorizontal:4,paddingVertical:1,backgroundColor:we.color.warningSoft,borderRadius:3},pendingText:{fontSize:10,color:we.color.warning,fontWeight:"600"},errorBadge:{flexDirection:"row",alignItems:"center",gap:2,paddingHorizontal:4,paddingVertical:1,backgroundColor:we.color.dangerSoft,borderRadius:3},errorText:{fontSize:10,color:we.color.danger,fontWeight:"600"},durationText:{fontSize:9,color:we.color.textSecondary},sizeRow:{flexDirection:"row",gap:4,marginTop:4},sizeItem:{flexDirection:"row",alignItems:"center",gap:2},sizeText:{fontSize:8,color:we.color.textSecondary,fontFamily:ko},clientText:{fontSize:8,fontWeight:"700",letterSpacing:.3,textTransform:"uppercase"}});D();ce();import{ProBadge as Fu,Zap as ju,buoyColors as nr}from"@buoy-gg/shared-ui/web";import{jsx as Dr,jsxs as Io}from"react/jsx-runtime";function Ei({title:e,subtitle:t,onPress:r}){return Io(N,{style:ir.banner,onPress:r,activeOpacity:.8,children:[Io(c,{style:ir.content,children:[Io(c,{style:ir.left,children:[Dr(ju,{size:16,color:nr.primary}),Dr(g,{style:ir.title,children:e})]}),Dr(Fu,{})]}),Dr(g,{style:ir.subtitle,children:t})]})}var ir=fe.create({banner:{backgroundColor:nr.card,borderRadius:10,borderWidth:1,borderColor:nr.primary+"40",padding:12,marginHorizontal:12,marginTop:12,marginBottom:34},content:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",marginBottom:4},left:{flexDirection:"row",alignItems:"center",gap:8},title:{color:nr.text,fontSize:13,fontWeight:"600"},subtitle:{color:nr.textMuted,fontSize:11}});D();import{useEffect as Li,useMemo as zr,useState as $u}from"react";import{useLimit as Wu}from"@buoy-gg/shared-ui/web";function sr(e){let{filter:t,ignoredPatterns:r,paused:o,visible:n=true,isPro:i}=e,s=Wu("network.requests"),a=i?1/0:s,[l,u]=$u(()=>K.getEvents());Li(()=>{if(!n)return;if(o){u(K.getEvents());return}let p=null,R=null,I=K.subscribeToEvents(h=>{R=h,p==null&&(p=requestAnimationFrame(()=>{p=null,R&&u(R),R=null}))});return()=>{I(),p!=null&&cancelAnimationFrame(p)}},[o,n]),Li(()=>K.onClear(()=>{u([])}),[]);let b=zr(()=>or(l,r),[l,r]),E=zr(()=>rr(b,t),[b,t]),C=zr(()=>{let p=new Set;return l.slice(a).forEach(R=>{p.add(R.id)}),p},[l,a]),S=zr(()=>C.size===0?E:E.filter(p=>!C.has(p.id)),[E,C]),O=E.length-S.length;return{events:E,visibleEvents:S,hasLockedEvents:O>0,lockedEventCount:O,totalEvents:b.length}}D();import{useCallback as At,useSyncExternalStore as Vu}from"react";D();import{devToolsStorageKeys as Pi,persistentStorage as qi}from"@buoy-gg/shared-ui/web";var Uu=800,_u=3,Xu=Object.freeze([]),Ju=250,Gu=["respond","fail","delay"];function Ku(e){if(!Array.isArray(e))return[];let t=[];for(let r of e){if(!r||typeof r!="object")continue;let o=r;if(typeof o.id!="string"||typeof o.urlPattern!="string"||!o.urlPattern)continue;let n=Gu.includes(o.kind)?o.kind:"respond";t.push({id:o.id,enabled:o.enabled!==false,name:typeof o.name=="string"?o.name:void 0,urlPattern:o.urlPattern,methods:Array.isArray(o.methods)?o.methods.filter(i=>typeof i=="string"):void 0,requireHeader:typeof o.requireHeader=="string"&&o.requireHeader?o.requireHeader:void 0,kind:n,status:typeof o.status=="number"?Math.min(_t,Math.max(Ut,o.status)):void 0,statusText:typeof o.statusText=="string"?o.statusText:void 0,headers:o.headers&&typeof o.headers=="object"?o.headers:void 0,body:typeof o.body=="string"?o.body:void 0,failKind:o.failKind==="timeout"?"timeout":void 0,delayMs:typeof o.delayMs=="number"?o.delayMs:void 0,times:typeof o.times=="number"?o.times:null,alternate:o.alternate===true,hits:0,seen:0,createdAt:typeof o.createdAt=="number"?o.createdAt:0})}return t.slice(0,tt)}var Yu=class{constructor(){this.rules=[];this.enabled=true;this.listeners=new Set;this.loaded=false;this.loadPromise=null;this.dirty=false;this.idCounter=0;this.state={enabled:true,rules:[],autoPaused:false};this.launchStreak=0;this.autoPaused=false;this.keepAlive=null;this.hitEmitTimer=null;this.engineDisabled=false;this.remote=null;this.remoteEchoUntil=0}enableRemoteMode(e){this.remote=e,this.disableEngine()}disableRemoteMode(){this.remote=null}replaceRules(e,t=false){this.remote&&(!t&&ue()<this.remoteEchoUntil||(this.enabled=e.enabled,this.rules=e.rules,this.rebuild(),this.emit()))}markLocalEdit(){this.remote&&(this.remoteEchoUntil=ue()+Uu)}disableEngine(){this.engineDisabled=true,this.keepAlive&&(this.keepAlive(),this.keepAlive=null,ht()===0&&Xt())}getState(){return this.state}getRules(){return this.engineDisabled||!this.enabled?Xu:this.rules}async fetchRuleBody(e){let t=this.rules.find(r=>r.id===e);if(!t)return null;if(!t.bodyOmitted)return t.body??null;if(!this.remote?.getRuleBody)return null;try{return await this.remote.getRuleBody(e)}catch{return null}}activeCount(){return this.enabled?this.rules.filter(e=>e.enabled&&!uo(e)).length:0}subscribe(e){return this.listeners.add(e),this.ensureLoaded(),()=>{this.listeners.delete(e)}}setEnabled(e){this.enabled!==e&&(this.remote?.setEnabled(e),this.markLocalEdit(),this.markTouched(),this.enabled=e,this.commit(this.rules))}addRule(e){if(this.rules.length>=tt)return null;let t={...e,id:`ovr_${Date.now().toString(36)}_${++this.idCounter}`,hits:0,seen:0,createdAt:Date.now()};return this.commit([t,...this.rules]),t}upsertRule(e){this.remote?.upsertRule(e),this.markLocalEdit(),this.markTouched();let{id:t,...r}=e;return t&&this.rules.some(o=>o.id===t)?(this.updateRule(t,r),this.rules.find(o=>o.id===t)??null):this.addRule(r)}updateRule(e,t){let r=this.rules.findIndex(n=>n.id===e);if(r===-1)return;let o=[...this.rules];o[r]={...o[r],...t,hits:0,seen:0},this.commit(o)}setRuleEnabled(e,t){let r=this.rules.findIndex(n=>n.id===e);if(r===-1||this.rules[r].enabled===t)return;this.remote?.setRuleEnabled(e,t),this.markLocalEdit(),this.markTouched();let o=[...this.rules];o[r]={...o[r],enabled:t,hits:t?0:o[r].hits,seen:t?0:o[r].seen},this.commit(o)}removeRule(e){let t=this.rules.filter(r=>r.id!==e);t.length!==this.rules.length&&(this.remote?.removeRule(e),this.markLocalEdit(),this.markTouched(),this.commit(t))}clearRules(){this.rules.length!==0&&(this.remote?.clearRules(),this.markLocalEdit(),this.markTouched(),this.commit([]))}recordMatch(e){let t=this.rules.findIndex(o=>o.id===e);if(t===-1)return;let r=[...this.rules];r[t]={...r[t],seen:r[t].seen+1},this.rules=r,this.rebuild()}recordHit(e){let t=this.rules.findIndex(s=>s.id===e);if(t===-1)return;let r=this.rules[t],o=r.hits+1,n=typeof r.times=="number"&&o>=r.times,i=[...this.rules];if(i[t]={...r,hits:o,enabled:n?false:r.enabled},n){this.commit(i);return}this.rules=i,this.rebuild(),this.scheduleHitEmit()}ensureLoaded(){return this.remote||this.loaded?Promise.resolve():this.loadPromise?this.loadPromise:(this.loadPromise=(async()=>{try{let e=await qi.getItem(Pi.network.overrides());if(e&&!this.dirty){let t=JSON.parse(e);this.enabled=t?.enabled!==false,this.rules=Ku(t?.rules),this.launchStreak=typeof t?.launchStreak=="number"?t.launchStreak:0,this.applyLaunchGuard(),this.rebuild()}}catch{}finally{this.loaded=true,this.syncKeepAlive(),this.emit()}})(),this.loadPromise)}applyLaunchGuard(){if(!this.enabled||this.activeCount()===0){this.launchStreak=0;return}this.launchStreak+=1,this.launchStreak>=_u&&(this.enabled=false,this.autoPaused=true,this.launchStreak=0),this.persist()}syncKeepAlive(){let e=!this.engineDisabled&&this.activeCount()>0;if(e&&!this.keepAlive){qn(),this.keepAlive=Jt(()=>{});return}!e&&this.keepAlive&&(this.keepAlive(),this.keepAlive=null,ht()===0&&Xt())}scheduleHitEmit(){this.hitEmitTimer===null&&(this.hitEmitTimer=setTimeout(()=>{this.hitEmitTimer=null,this.emit()},Ju))}commit(e){this.dirty=true,this.rules=e.slice(0,tt),this.rebuild(),this.syncKeepAlive(),this.emit(),this.persist()}rebuild(){this.state={enabled:this.enabled,rules:this.rules,autoPaused:this.autoPaused}}markTouched(){this.launchStreak=0,this.autoPaused=false}noteHealthyLaunch(){this.launchStreak===0&&!this.autoPaused||(this.markTouched(),this.persist(),this.rebuild(),this.emit())}persist(){this.remote||qi.setItem(Pi.network.overrides(),JSON.stringify({enabled:this.enabled,rules:this.rules,launchStreak:this.launchStreak})).catch(()=>{})}emit(){this.listeners.forEach(e=>e())}},_=new Yu;Na({getRules:()=>_.getRules(),recordHit:e=>_.recordHit(e),recordMatch:e=>_.recordMatch(e)});function Ar(){let e=Vu(At(s=>_.subscribe(s),[]),()=>_.getState(),()=>_.getState()),t=At(s=>_.setEnabled(s),[]),r=At(s=>_.upsertRule(s),[]),o=At((s,a)=>_.setRuleEnabled(s,a),[]),n=At(s=>_.removeRule(s),[]),i=At(()=>_.clearRules(),[]);return{enabled:e.enabled,rules:e.rules,autoPaused:e.autoPaused,activeCount:_.activeCount(),setEnabled:t,upsertRule:r,setRuleEnabled:o,removeRule:n,clearRules:i,isRuleSpent:uo}}D();function Zu(e,t){if(t.length===0)return[];let r=new Set(t.map(n=>n.id)),o=new Set;for(let n of t){let i;for(let s of e){if(s.override&&r.has(s.override.ruleId)){o.add(s.id);continue}lo(n,s.url,String(s.method||"GET"),s.requestHeaders)&&(s.timestamp>=n.createdAt?o.add(s.id):(!i||s.timestamp>i.timestamp)&&(i=s))}i&&o.add(i.id)}return e.filter(n=>o.has(n.id))}D();var Qu=[];function Eo(e,t,r){return t.length===0?{pinned:Qu,rest:e}:{pinned:t,rest:r.size===0?e:e.filter(o=>!r.has(o.id))}}import{jsx as ve,jsxs as wt}from"react/jsx-runtime";var ec=e=>e.id;function tc({events:e,onEventPress:t,onLongPress:r,savedLiveIds:o,onClearPinned:n}){return e.length===0?null:wt(c,{style:Se.pinnedSection,children:[wt(c,{style:Se.pinnedHeader,children:[ve(mu,{size:11,active:true,color:be.semantic.info}),wt(g,{style:Se.pinnedTitle,children:["PINNED \xB7 ",e.length]}),ve(N,{onPress:n,"sentry-label":"ignore unpin all",style:Se.pinnedClear,children:ve(g,{style:Se.pinnedClearText,children:"Unpin all"})})]}),e.map(i=>ve(zt,{event:i,onPress:t,onLongPress:r,pinned:true,saved:o.has(i.id)},i.id))]})}function rc({events:e,onEventPress:t,onLongPress:r,savedLiveIds:o,paused:n,onTogglePaused:i}){return e.length===0?null:wt(c,{style:[Se.overriddenSection,n&&Se.overriddenSectionOff],children:[wt(c,{style:Se.overriddenHeader,children:[ve(gu,{size:11,color:n?be.text.muted:be.semantic.warning}),ve(g,{testID:"buoy-network-overridden-strip",style:[Se.overriddenTitle,n&&Se.overriddenTitleOff],children:n?`PAUSED \xB7 ${e.length}`:`OVERRIDDEN \xB7 ${e.length}`}),ve(N,{onPress:i,"sentry-label":"ignore pause overrides",style:Se.overriddenManage,children:ve(g,{style:[Se.overriddenManageText,n&&Se.overriddenTitleOff],children:n?"Resume":"Pause"})})]}),e.map(s=>ve(zt,{event:s,onPress:t,onLongPress:r,overridden:true,saved:o.has(s.id)},s.id))]})}function oc({visible:e,paused:t,filter:r,ignoredPatterns:o,isPro:n,searchText:i,onEventPress:s,onUpgradePress:a}){let{visibleEvents:l,hasLockedEvents:u,lockedEventCount:b,totalEvents:E}=sr({filter:r,ignoredPatterns:o,paused:t,visible:e,isPro:n}),{pinnedEvents:C,pinnedLiveIds:S,savedLiveIds:O,togglePin:p,clearPinned:R}=Ot(),{rules:I,enabled:h,setEnabled:L,isRuleSpent:z}=Ar(),P=fu(G=>{p(G)},[p]);if(!e)return null;let{pinned:T,rest:x}=Eo(l,C,S),m=I.filter(G=>G.enabled&&!z(G)),v=Zu([...T,...x],m),d=new Set(v.map(G=>G.id)),f=T.filter(G=>!d.has(G.id)),y=d.size?x.filter(G=>!d.has(G.id)):x,A=!t,ae=({item:G})=>ve(zt,{event:G,onPress:s,onLongPress:P,saved:O.has(G.id)}),te=()=>f.length>0||v.length>0?null:ve(bu,{testID:"buoy-network-empty",...vu({subject:"requests",search:i,total:E,capturing:A,waiting:{otto:"fishing",title:"No network events",message:"Network requests will appear here"},paused:{title:"No network events",message:"Enable interception to start capturing"}})}),Q=()=>{if(!u)return null;let G=i.length>0,H=G?`${b} matching ${b===1?"request":"requests"} in locked history`:`${b} requests locked`;return ve(Ei,{title:H,subtitle:G?"Upgrade to Pro to search your full request history":"Upgrade to Pro to unlock full request history",onPress:a})};return wt(c,{style:Se.root,children:[A?null:wt(c,{style:Se.disabledBanner,children:[ve(yu,{size:14,color:be.semantic.warning}),ve(g,{style:Se.disabledText,children:"Network interception is disabled"})]}),ve(rc,{events:v,onEventPress:s,onLongPress:P,savedLiveIds:O,paused:!h,onTogglePaused:()=>L(!h)}),ve(tc,{events:f,onEventPress:s,onLongPress:P,savedLiveIds:O,onClearPinned:R}),y.length>0||u?ve(io,{testID:"buoy-network-list",data:y,renderItem:ae,keyExtractor:ec,contentContainerStyle:Se.listContent,showsVerticalScrollIndicator:true,onEndReachedThreshold:.8,scrollEnabled:true,...Su,extraData:O,"sentry-label":"ignore network events list",ListFooterComponent:Q}):te()]})}var Se=fe.create({root:{flex:1,minHeight:0},overriddenSection:{borderBottomWidth:1,borderBottomColor:be.semantic.warning+"44",backgroundColor:be.semantic.warningBackground},overriddenSectionOff:{borderBottomColor:be.border.default,backgroundColor:be.background.card},overriddenTitleOff:{color:be.text.muted},overriddenHeader:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:12,paddingTop:8,paddingBottom:4},overriddenTitle:{flex:1,fontSize:10,fontWeight:"700",letterSpacing:.8,color:be.semantic.warning},overriddenManage:{paddingHorizontal:6,paddingVertical:2},overriddenManageText:{fontSize:10,fontWeight:"600",color:be.semantic.warning},pinnedSection:{borderBottomWidth:1,borderBottomColor:be.border.default,paddingBottom:4},pinnedHeader:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:20,paddingTop:10,paddingBottom:6},pinnedTitle:{flex:1,color:be.semantic.info,fontSize:10,fontWeight:"700",letterSpacing:.6,fontFamily:xu},pinnedClear:{paddingHorizontal:6,paddingVertical:2},pinnedClearText:{color:be.text.muted,fontSize:10},disabledBanner:{flexDirection:"row",alignItems:"center",gap:8,padding:10,marginHorizontal:12,marginTop:8,backgroundColor:be.semantic.warningBackground,borderRadius:8,borderWidth:1,borderColor:be.semantic.warning+"20"},disabledText:{color:be.semantic.warning,fontSize:11,flex:1},listContent:{paddingTop:8}});D();ce();import{useState as nc}from"react";import{Bookmark as ic,CopyButton as sc,Search as ac,macOSColors as He,useLimit as lc,ToolEmptyState as dc,resolveListEmptyState as uc,EVENT_LIST_PRESET as cc,monoFont as hc}from"@buoy-gg/shared-ui/web";D();function Bi(e,t,r){let o=e.slice(0,Math.min(t,nt)),n=o.map(i=>i.event);return{events:r?rr(n,{searchText:r}):n,lockedCount:e.length-o.length}}import{jsx as Xe,jsxs as Hr}from"react/jsx-runtime";var pc=e=>e.id;function Oi({visible:e,isPro:t,copySettings:r,search:o,onSearchChange:n,onEventPress:i,onUpgradePress:s}){let{savedRecords:a,pinnedLiveIds:l,toggleSave:u,clearSaved:b}=Ot(),E=lc("network.saved"),[C,S]=nc(""),O=o!=null&&n!=null,p=O?o:C,R=O?n:S;if(!e)return null;let{events:I,lockedCount:h}=Bi(a,E,p),L=T=>{u(T)},z=({item:T})=>Xe(zt,{event:T,onPress:i,onLongPress:L,saved:true,pinned:l.has(T.id)}),P=()=>h===0?null:Xe(Ei,{title:`${h} saved ${h===1?"request":"requests"} locked`,subtitle:`Your plan keeps ${E}. Upgrade to Pro to unlock the rest.`,onPress:s});return Hr(c,{style:Je.root,children:[Hr(c,{style:Je.toolbar,children:[Xe(ic,{size:11,color:He.semantic.debug}),Hr(g,{style:Je.toolbarTitle,children:["SAVED \xB7 ",a.length,E>=nt?"":`/${E}`]}),t?Xe(sc,{value:()=>Ci(I,r),size:13,buttonStyle:Je.toolbarButton,colors:{idle:He.text.secondary,success:He.semantic.success,error:He.semantic.error},disabled:I.length===0}):null,Xe(N,{onPress:b,"sentry-label":"ignore clear saved",style:Je.toolbarClear,disabled:a.length===0,children:Xe(g,{style:[Je.toolbarClearText,a.length===0&&Je.toolbarClearTextDisabled],children:"Clear all"})})]}),a.length>0?Hr(c,{style:Je.searchRow,children:[Xe(ac,{size:13,color:He.text.secondary}),Xe(Pt,{style:Je.searchInput,placeholder:"Search saved requests\u2026",placeholderTextColor:He.text.muted,value:p,onChangeText:R,"sentry-label":"ignore saved search",accessibilityLabel:"Search saved requests",autoCapitalize:"none",autoCorrect:false,returnKeyType:"search"})]}):null,a.length===0||p.trim().length>0&&I.length===0&&h===0?Xe(dc,{testID:"buoy-network-saved-empty",...uc({subject:"saved requests",verb:"kept",search:a.length===0?"":p,total:a.length,waiting:{otto:"empty",title:"No saved requests",message:"Open a request and tap the bookmark to keep it here \u2014 saved requests survive Clear and app restarts."}})}):Xe(io,{data:I,renderItem:z,keyExtractor:pc,contentContainerStyle:Je.listContent,showsVerticalScrollIndicator:true,scrollEnabled:true,...cc,extraData:l,"sentry-label":"ignore saved requests list",ListFooterComponent:P})]})}var Je=fe.create({root:{flex:1,minHeight:0},toolbar:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:20,paddingTop:10,paddingBottom:6},toolbarTitle:{flex:1,color:He.semantic.debug,fontSize:10,fontWeight:"700",letterSpacing:.6,fontFamily:hc},toolbarButton:{width:26,height:26,borderRadius:6,alignItems:"center",justifyContent:"center"},toolbarClear:{paddingHorizontal:6,paddingVertical:2},toolbarClearText:{color:He.text.muted,fontSize:10},toolbarClearTextDisabled:{color:He.text.disabled},searchRow:{flexDirection:"row",alignItems:"center",gap:6,marginHorizontal:12,marginBottom:8,paddingHorizontal:10,paddingVertical:5,backgroundColor:He.background.input,borderRadius:10,borderWidth:1,borderColor:He.border.default},searchInput:{flex:1,color:He.text.primary,fontSize:13,paddingVertical:2},listContent:{paddingTop:4}});D();ce();import{useCallback as fc,useEffect as Mr,useState as gc}from"react";import{AlertCircle as mc,AlertTriangle as yc,DevToolsCard as bc,EmptyState as vc,MethodBadge as Sc,Plus as xc,Trash2 as wc,macOSColors as Y,useLimit as Tc,monoFont as Cc}from"@buoy-gg/shared-ui/web";D();ce();import{useMemo as Di,useState as Nr}from"react";import{ChevronDown as Rc,ChevronRight as kc,macOSColors as U,useSafeAreaInsets as Ic,monoFont as Ec}from"@buoy-gg/shared-ui/web";D();ce();import{useState as Fr,useMemo as jr,useCallback as ar,useRef as Lo,useEffect as Lc,memo as $r}from"react";import{displayValue as Pc,buoyColors as q,monoFont as Be}from"@buoy-gg/shared-ui/web";import{CopyButton as qc}from"@buoy-gg/shared-ui/web";import{ChevronRight as Bc,ChevronDown as Oc,Trash as zi}from"@buoy-gg/shared-ui/web";import{CyberpunkInput as Dc}from"@buoy-gg/shared-ui/web/dataViewer";D();var Tt=(e,t,r)=>{if(t.length===0)return r;if(e instanceof Map){let o=new Map(e);if(t.length===1)return o.set(t[0],r),o;let[n,...i]=t,s=o.get(n);return o.set(n,Tt(s??null,i,r)),o}if(e instanceof Set){let o=Tt(Array.from(e),t,r);return new Set(Array.isArray(o)?o:[])}if(Array.isArray(e)){let o=[...e];if(t.length===1)return o[t[0]]=r,o;let[n,...i]=t;return o[n]=Tt(o[n],i,r),o}if(e instanceof Object){let o={...e};if(t.length===1)return o[t[0]]=r,o;let[n,...i]=t;return o[n]=Tt(o[n],i,r),o}return e};D();var Ct=(e,t)=>{if(e instanceof Map){let r=new Map(e);if(t.length===1)return r.delete(t[0]),r;let[o,...n]=t;return r.set(o,Ct(r.get(o),n)),r}if(e instanceof Set){let r=Ct(Array.from(e),t);return new Set(r)}if(Array.isArray(e)){let r=[...e];if(t.length===1)return r.filter((i,s)=>s.toString()!==t[0]);let[o,...n]=t;return r[o]=Ct(r[o],n),r}if(e instanceof Object){let r={...e};if(t.length===1)return delete r[t[0]],r;let[o,...n]=t;return r[o]=Ct(r[o],n),r}return e};D();import{createContext as zc,useContext as Ac}from"react";var Ai=zc(null);function Wr(){return Ac(Ai)}import{Fragment as Vr,jsx as J,jsxs as Ie}from"react/jsx-runtime";var lr=100,Ht={top:8,bottom:8,left:8,right:8},Hi=12,Hc=(e,t=lr)=>{if(t<1||e.length===0)return[];let r=[];for(let o=0;o<e.length;o+=t)r.push(e.slice(o,o+t));return r},Po=$r(({expanded:e,isFocused:t=false,isMain:r=false})=>J(c,{style:[$.expanderIcon,r&&$.expanderIconMain,e?$.expanded:$.collapsed],children:e?J(Oc,{size:r?14:Hi,color:t?q.primary:r?q.text:q.textSecondary,strokeWidth:2.5}):J(Bc,{size:r?14:Hi,color:t?q.primary:r?q.text:q.textSecondary,strokeWidth:2.5})}));Po.displayName="Expander";var Mi=$r(({value:e,isFocused:t=false})=>J(qc,{value:e,isFocused:t,buttonStyle:t?{...$.buttonStyle,...$.buttonStyleFocused}:$.buttonStyle}));Mi.displayName="CopyButton";var qo=$r(({dataPath:e,isFocused:t=false})=>{let r=Wr(),o=ar(()=>{r&&r.onChange(Ct(r.root,e))},[r,e]);return r?J(N,{"sentry-label":"ignore devtools explorer delete button",onPress:o,style:[$.deleteButton,t&&$.deleteButtonFocused],accessibilityLabel:"Delete item",hitSlop:Ht,activeOpacity:.7,children:J(zi,{size:14,strokeWidth:2,color:t?q.error:q.error+"CC"})}):null});qo.displayName="DeleteItemButton";var Ni=$r(({dataPath:e,isFocused:t=false})=>{let r=Wr(),o=ar(()=>{r&&r.onChange(Tt(r.root,e,[]))},[r,e]);return r?J(N,{"sentry-label":"ignore devtools explorer clear button",style:[$.clearButton,t&&$.clearButtonFocused],"aria-label":"Remove all items",onPress:o,hitSlop:Ht,activeOpacity:.7,children:J(g,{style:[$.clearButtonText,{color:t?q.warning:q.warning+"CC"}],children:"[]"})}):null});Ni.displayName="ClearArrayButton";function Mc({dataPath:e,value:t,itemsDeletable:r}){let o=Wr(),n=ar(()=>{if(!o)return;let l=typeof t=="boolean"?t:false;o.onChange(Tt(o.root,e,!l))},[o,e,t]),i=ar(()=>{o&&o.onChange(Ct(o.root,e))},[o,e]);if(!o)return null;let s=t?$.toggleBadgeTrue:$.toggleBadgeFalse,a=t?$.toggleTextTrue:$.toggleTextFalse;return Ie(N,{"sentry-label":"ignore devtools explorer toggle button",style:$.modernToggleButton,onPress:n,hitSlop:Ht,activeOpacity:.8,children:[J(c,{style:[$.toggleBadge,s],children:J(g,{style:[$.toggleBadgeText,a],children:t?"TRUE":"FALSE"})}),r&&J(N,{"sentry-label":"ignore devtools explorer delete button in toggle",onPress:i,style:$.deleteButtonInToggle,accessibilityLabel:"Delete item",hitSlop:Ht,activeOpacity:.7,children:J(zi,{size:14,strokeWidth:2,color:q.error+"CC"})})]})}function Bo({editable:e,label:t,value:r,defaultExpanded:o,dataPath:n,itemsDeletable:i,dataVersion:s=0}){let a=Wr(),[l,u]=Fr(false),[b,E]=Fr("");Lc(()=>{if(r!=null&&(typeof r=="string"||typeof r=="number")){let d=r.toString();E(d)}},[r,t,s]);let C=jr(()=>{let d=t.toUpperCase();return["DATA","QUERY","QUERYKEY","TYPES","STATS","OPTIONS","OBSERVERS"].includes(d)},[t]),[S,O]=Fr((o||[]).includes(t)),p=()=>O(d=>!d),[R,I]=Fr([]),h=jr(()=>r==null||typeof r!="object"?[]:Array.isArray(r)?(r.length>1e3?r.slice(0,1e3):r).map((d,f)=>({label:f.toString(),value:d})):r instanceof Map?Array.from(r.entries()).slice(0,1e3).map(([d,f])=>({label:d.toString(),value:f})):r instanceof Set?Array.from(r).slice(0,1e3).map((d,f)=>({label:f.toString(),value:d})):Object.entries(r).slice(0,1e3).map(([d,f])=>({label:d,value:f})),[r]),L=jr(()=>Array.isArray(r)?"array":r===null||typeof r!="object"?typeof r:r instanceof Map||r instanceof Set?"Iterable":"object",[r]),z=jr(()=>Hc(h,lr),[h]),P=n??[],T=Lo(a),x=Lo(P),m=Lo(L);T.current=a,x.current=P,m.current=L;let v=ar((d,f)=>{E(f);let y=T.current;if(!y||d&&isNaN(Number(f)))return;let A=m.current==="number"?Number(f):f;y.onChange(Tt(y.root,x.current,A))},[E]);return J(c,{style:$.minWidthWrapper,children:Ie(c,{style:$.fullWidthMarginRight,children:[z.length>0&&Ie(Vr,{children:[Ie(c,{style:[$.flexRowItemsCenterGap,C&&$.flexRowItemsCenterGapMain],children:[Ie(N,{"sentry-label":"ignore devtools explorer expander button",style:$.expanderButton,onPress:p,hitSlop:Ht,activeOpacity:.6,children:[J(Po,{expanded:S,isFocused:l,isMain:C}),J(g,{style:[$.labelText,l&&$.labelTextFocused,C&&$.labelTextMain],children:t}),J(g,{style:$.textGray500,children:`${String(L).toLowerCase()==="iterable"?"(Iterable) ":""}${h.length} ${h.length>1?"items":"item"}`})]}),e&&Ie(c,{style:$.flexRowGapItemsCenter,children:[J(Mi,{value:r,isFocused:l}),i&&a!==null&&J(qo,{dataPath:P,isFocused:l}),L==="array"&&a!==null&&J(Ni,{dataPath:P,isFocused:l})]})]}),S&&Ie(Vr,{children:[z.length===1&&J(c,{style:[$.singleEntryContainer,C&&$.singleEntryContainerMain],children:h.map((d,f)=>J(Bo,{defaultExpanded:o,label:d.label,value:d.value,editable:e,dataPath:[...P,d.label],itemsDeletable:L==="array"||L==="Iterable"||L==="object",dataVersion:s},d.label+f))}),z.length>1&&J(c,{style:$.multiEntryContainer,children:z.map((d,f)=>J(c,{children:Ie(c,{style:$.relativeOutlineNone,children:[Ie(N,{"sentry-label":"ignore devtools explorer page toggle",onPress:()=>I(y=>y.includes(f)?y.filter(A=>A!==f):[...y,f]),style:$.pageExpanderButton,hitSlop:Ht,children:[J(Po,{expanded:R.includes(f)}),Ie(g,{style:$.pageRangeText,children:["[",f*lr,"...",f*lr+lr-1,"]"]})]}),R.includes(f)&&J(c,{style:$.entriesContainer,children:d.map(y=>J(Bo,{defaultExpanded:o,label:y.label,value:y.value,editable:e,dataPath:[...P,y.label],dataVersion:s},y.label))})]})},f))})]})]}),z.length===0&&Ie(c,{style:$.flexRowGapFullWidth,children:[e&&a!==null&&(L==="string"||L==="number"||L==="boolean")?Ie(Vr,{children:[e&&a&&(L==="string"||L==="number")&&J(c,{style:$.nebulaInputWrapper,children:J(Dc,{label:t,accessibilityLabel:"Data input field for editing values",style:[L==="number"?$.textNumber:$.textString],keyboardType:L==="number"?"numeric":"default",value:b,onChangeText:d=>v(L==="number",d),onFocus:()=>u(true),onBlur:()=>u(false),showNumberControls:L==="number",onIncrement:()=>{let d=Number(b)||0;v(true,String(d+1))},onDecrement:()=>{let d=Number(b)||0;v(true,String(d-1))},showDeleteButton:i,onDelete:()=>{a.onChange(Ct(a.root,P))}})}),L==="boolean"&&Ie(c,{style:$.booleanRowContainer,children:[J(g,{style:$.booleanLabel,children:t}),J(c,{style:$.booleanToggleWrapper,children:J(Mc,{dataPath:P,value:r,itemsDeletable:i})})]})]}):Ie(Vr,{children:[J(g,{style:$.text344054,children:t}),J(g,{style:$.displayValueText,children:Pc(r)})]}),e&&i&&a!==null&&L!=="string"&&L!=="number"&&L!=="boolean"&&J(qo,{dataPath:P,isFocused:l})]})]})})}var $=fe.create({buttonStyle:{backgroundColor:q.card+"E6",borderWidth:1,borderColor:q.textSecondary+"33",borderRadius:6,flexDirection:"row",alignItems:"center",justifyContent:"center",width:28,height:28,position:"relative",shadowColor:"#000",shadowOffset:{width:0,height:1},shadowOpacity:.2,shadowRadius:2},buttonStyleFocused:{borderColor:q.primary+"CC",backgroundColor:q.primary+"26",shadowColor:q.primary,shadowOpacity:.3,shadowRadius:4},deleteButton:{backgroundColor:q.error+"1A",borderColor:q.error+"4D",borderWidth:1,borderRadius:6,padding:0,alignItems:"center",justifyContent:"center",width:28,height:28,position:"relative",shadowColor:q.error,shadowOffset:{width:0,height:0},shadowOpacity:.15,shadowRadius:3},deleteButtonFocused:{borderColor:q.error+"CC",backgroundColor:q.error+"33",shadowOpacity:.3,shadowRadius:5},deleteButtonInToggle:{backgroundColor:q.error+"1A",borderColor:q.error+"4D",borderWidth:1,borderRadius:6,padding:0,alignItems:"center",justifyContent:"center",width:28,height:28,shadowColor:q.error,shadowOffset:{width:0,height:0},shadowOpacity:.15,shadowRadius:3},clearButton:{backgroundColor:q.warning+"1A",borderWidth:1,borderColor:q.warning+"4D",borderRadius:6,flexDirection:"row",padding:0,alignItems:"center",justifyContent:"center",width:28,height:28,position:"relative",zIndex:10,shadowColor:q.warning,shadowOffset:{width:0,height:0},shadowOpacity:.15,shadowRadius:3},clearButtonFocused:{borderColor:q.warning+"CC",backgroundColor:q.warning+"33",shadowOpacity:.3,shadowRadius:5},clearButtonText:{fontSize:12,fontWeight:"700",fontFamily:Be},expanderIcon:{width:18,height:18,alignItems:"center",justifyContent:"center",marginRight:1,backgroundColor:q.textSecondary+"14",borderRadius:3},expanderIconMain:{backgroundColor:q.textSecondary+"1A",width:20,height:20,borderRadius:4,borderWidth:.5,borderColor:q.textSecondary+"33"},expanded:{transform:[{rotate:"0deg"}]},collapsed:{transform:[{rotate:"0deg"}]},minWidthWrapper:{minWidth:180,fontSize:11,flexDirection:"row",flexWrap:"wrap",width:"100%",marginVertical:.5},fullWidthMarginRight:{position:"relative",width:"100%",marginRight:1},flexRowItemsCenterGap:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingVertical:3,paddingHorizontal:6,marginVertical:1,borderRadius:4,backgroundColor:q.card+"66",borderWidth:.5,borderColor:q.textSecondary+"1A"},flexRowItemsCenterGapMain:{backgroundColor:q.card+"E6",borderLeftWidth:2.5,borderLeftColor:q.textSecondary+"80",borderColor:q.textSecondary+"26",paddingVertical:5,paddingHorizontal:8,marginBottom:3,borderWidth:1,shadowColor:"#000",shadowOffset:{width:0,height:0},shadowOpacity:.08,shadowRadius:3},expanderButton:{flexDirection:"row",alignItems:"center",backgroundColor:"transparent",paddingVertical:1,paddingHorizontal:2,gap:6,borderWidth:0,minHeight:24,flex:1},labelText:{color:q.textSecondary,fontSize:10,fontWeight:"600",marginRight:4,fontFamily:Be,letterSpacing:.4},labelTextFocused:{color:q.text},labelTextMain:{color:q.text,fontSize:11,fontWeight:"700",letterSpacing:.6},textGray500:{color:q.textMuted,fontSize:10,fontWeight:"400",fontFamily:Be,opacity:.7},pageRangeText:{color:q.textSecondary,fontSize:10,fontWeight:"600",fontFamily:Be},flexRowGapItemsCenter:{flexDirection:"row",alignItems:"center",gap:4,paddingLeft:2},singleEntryContainer:{marginLeft:2,marginTop:2,paddingLeft:8,borderLeftWidth:1.5,borderLeftColor:q.textSecondary+"40"},singleEntryContainerMain:{borderLeftColor:q.textSecondary+"4D",marginLeft:4,paddingLeft:10},multiEntryContainer:{marginLeft:2,marginTop:2,paddingLeft:8,borderLeftWidth:1.5,borderLeftColor:q.textSecondary+"40"},multiEntryContainerMain:{borderLeftColor:q.textSecondary+"4D",marginLeft:4,paddingLeft:10},relativeOutlineNone:{position:"relative"},pageExpanderButton:{flexDirection:"row",alignItems:"center",backgroundColor:q.card+"66",paddingVertical:3,paddingHorizontal:6,gap:6,borderRadius:4,borderWidth:.5,borderColor:q.textSecondary+"1A",marginBottom:2,minHeight:24},entriesContainer:{marginLeft:2,paddingLeft:8,marginTop:2,borderLeftWidth:1.5,borderLeftColor:q.textSecondary+"40"},textNumber:{color:q.text,fontWeight:"600",fontFamily:Be},textString:{color:q.text,fontFamily:Be},flexRowGapFullWidth:{flexDirection:"row",width:"100%",alignItems:"center",marginVertical:1,gap:6,paddingHorizontal:4,paddingVertical:2,borderRadius:3},text344054:{color:q.textSecondary,fontWeight:"600",fontSize:9,minWidth:50,fontFamily:Be,letterSpacing:.4,opacity:.8},numberInputButtons:{position:"absolute",right:8,top:"50%",transform:[{translateY:-18}],flexDirection:"row",gap:4,zIndex:10},touchableButton:{width:32,height:32,borderRadius:6,backgroundColor:q.card+"E6",borderWidth:1,borderColor:q.textSecondary+"33",alignItems:"center",justifyContent:"center",marginLeft:2,shadowColor:"#000",shadowOffset:{width:0,height:1},shadowOpacity:.2,shadowRadius:2},touchableButtonFocused:{borderColor:q.primary+"CC",backgroundColor:q.primary+"26",shadowColor:q.primary,shadowOffset:{width:0,height:0},shadowOpacity:.3,shadowRadius:4,elevation:3},nebulaInputWrapper:{flex:1,width:"100%",position:"relative"},displayValueText:{flex:1,color:q.text,fontWeight:"400",fontFamily:Be,fontSize:12,paddingVertical:6,paddingHorizontal:10,borderRadius:6,borderWidth:1,borderColor:q.textMuted+"66",minHeight:34},dataRow:{flexDirection:"row",alignItems:"center",paddingVertical:4,paddingHorizontal:8,minHeight:44,gap:12},dataLabel:{color:q.textSecondary,fontSize:13,fontWeight:"500",minWidth:80,flexShrink:0},dataValueContainer:{flex:1,flexDirection:"row",alignItems:"center"},inputWithActions:{flex:1,position:"relative"},numberControls:{position:"absolute",right:8,top:"50%",transform:[{translateY:-16}],flexDirection:"column",gap:2},numberButton:{width:32,height:16,borderRadius:4,alignItems:"center",justifyContent:"center",borderWidth:1,borderColor:q.primary+"0F"},readOnlyValue:{color:q.text,fontSize:13,fontFamily:Be,paddingVertical:8,paddingHorizontal:12,borderRadius:6,borderWidth:1,borderColor:q.textMuted+"33",flex:1},actionButtons:{flexDirection:"row",gap:6,paddingLeft:8},booleanContainer:{flexDirection:"row",alignItems:"center",padding:8,borderRadius:6,borderWidth:1,borderColor:q.textMuted+"4D",flex:1},booleanText:{marginLeft:8,color:q.warning,fontWeight:"500",fontFamily:Be},modernToggleButton:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",borderRadius:6,borderWidth:1,borderColor:q.textMuted+"99",paddingHorizontal:8,paddingVertical:6,marginVertical:2,minHeight:34,gap:8},toggleIconContainer:{marginRight:6},toggleIcon:{padding:8,borderRadius:8,alignItems:"center",justifyContent:"center",width:32,height:32},toggleIconSmall:{width:8,height:8,borderRadius:4},toggleContent:{flex:1,minWidth:0},toggleLabel:{color:"#E5E7EB",fontSize:11,fontWeight:"600",fontFamily:Be,letterSpacing:.3},toggleStatus:{color:"#9CA3AF",fontSize:11},toggleBadge:{marginLeft:6,paddingHorizontal:6,paddingVertical:3,borderRadius:4,borderWidth:1},toggleBadgeText:{fontSize:9,fontWeight:"700",textTransform:"uppercase",letterSpacing:.8,fontFamily:Be},toggleIconTrue:{backgroundColor:q.primary},toggleIconFalse:{backgroundColor:q.textMuted},toggleBadgeTrue:{backgroundColor:q.primary+"1A",borderColor:q.primary+"4D"},toggleBadgeFalse:{backgroundColor:q.textMuted+"1A",borderColor:q.textMuted+"4D"},toggleTextTrue:{color:q.primary,fontWeight:"600"},toggleTextFalse:{color:q.textSecondary,fontWeight:"500"},booleanRowContainer:{flexDirection:"row",alignItems:"center",width:"100%",gap:8,paddingVertical:2},booleanLabel:{color:q.textSecondary,fontSize:10,fontWeight:"600",fontFamily:Be,letterSpacing:.4,minWidth:60,flexShrink:0},booleanToggleWrapper:{flex:1}});D();ce();import{useState as Nc}from"react";import{absoluteFill as Fi,macOSColors as Ee}from"@buoy-gg/shared-ui/web";import{jsx as st,jsxs as Oo}from"react/jsx-runtime";function Do({title:e,hint:t,value:r,placeholder:o="Number",min:n,max:i,onSubmit:s,onCancel:a}){let[l,u]=Nc(r!=null?String(r):""),b=()=>{let E=l.trim();if(!E){s(null);return}let C=Number(E);if(!Number.isFinite(C)){s(null);return}let S=C;n!=null&&(S=Math.max(n,S)),i!=null&&(S=Math.min(i,S)),s(S)};return Oo(c,{style:Oe.overlay,children:[st(N,{style:Oe.backdrop,activeOpacity:1,onPress:a,"sentry-label":"ignore dismiss number prompt"}),Oo(c,{style:Oe.panel,children:[st(g,{style:Oe.title,children:e}),st(Pt,{style:Oe.input,value:l,onChangeText:u,placeholder:o,placeholderTextColor:Ee.text.muted,keyboardType:"number-pad",autoFocus:true,selectTextOnFocus:true,onSubmitEditing:b,returnKeyType:"done","sentry-label":"ignore number prompt input",accessibilityLabel:e}),t?st(g,{style:Oe.hint,children:t}):null,Oo(c,{style:Oe.actions,children:[st(N,{onPress:a,"sentry-label":"ignore cancel number prompt",style:[Oe.button,Oe.cancelButton],children:st(g,{style:Oe.cancelText,children:"Cancel"})}),st(N,{onPress:b,"sentry-label":"ignore save number prompt",style:[Oe.button,Oe.saveButton],children:st(g,{style:Oe.saveText,children:"Set"})})]})]})]})}var Oe=fe.create({overlay:{...Fi,zIndex:40},backdrop:{...Fi,backgroundColor:"rgba(0,0,0,0.6)"},panel:{marginHorizontal:12,marginTop:12,padding:14,borderRadius:10,borderWidth:1,borderColor:Ee.border.hover,backgroundColor:Ee.background.card,gap:10},title:{fontSize:13,fontWeight:"700",color:Ee.text.primary},input:{backgroundColor:Ee.background.input,borderWidth:1,borderColor:Ee.border.input,borderRadius:6,paddingHorizontal:12,paddingVertical:10,fontSize:16,fontWeight:"700",color:Ee.text.primary},hint:{fontSize:10,color:Ee.text.muted},actions:{flexDirection:"row",gap:8},button:{flex:1,paddingVertical:10,borderRadius:6,alignItems:"center",borderWidth:1},cancelButton:{borderColor:Ee.border.default,backgroundColor:Ee.background.base},cancelText:{fontSize:12,fontWeight:"600",color:Ee.text.secondary},saveButton:{borderColor:Ee.semantic.info,backgroundColor:`${Ee.semantic.info}22`},saveText:{fontSize:12,fontWeight:"700",color:Ee.semantic.info}});import{Fragment as ji,jsx as V,jsxs as Te}from"react/jsx-runtime";var Fc=["GET","POST","PUT","PATCH","DELETE"],$i=[0,500,1e3,3e3,1e4],Wi=[{id:"500",label:"Server error",code:"500",danger:true,patch:{kind:"respond",status:500,statusText:"Internal Server Error"}},{id:"401",label:"Unauthorized",code:"401",danger:true,patch:{kind:"respond",status:401,statusText:"Unauthorized"}},{id:"404",label:"Not found",code:"404",danger:true,patch:{kind:"respond",status:404,statusText:"Not Found"}},{id:"403",label:"Forbidden",code:"403",danger:true,patch:{kind:"respond",status:403,statusText:"Forbidden"}},{id:"429",label:"Rate limited",code:"429",danger:true,patch:{kind:"respond",status:429,statusText:"Too Many Requests"}},{id:"503",label:"Unavailable",code:"503",danger:true,patch:{kind:"respond",status:503,statusText:"Service Unavailable"}},{id:"400",label:"Bad request",code:"400",danger:true,patch:{kind:"respond",status:400,statusText:"Bad Request"}},{id:"200",label:"Success",code:"200",patch:{kind:"respond",status:200,statusText:"OK"}},{id:"offline",label:"Offline",danger:true,patch:{kind:"fail",failKind:"network"}},{id:"timeout",label:"Timeout",danger:true,patch:{kind:"fail",failKind:"timeout"}},{id:"passthrough",label:"Real response",patch:{kind:"delay"}}];function jc(e){return e.kind==="delay"?"passthrough":e.kind==="fail"?e.failKind==="timeout"?"timeout":"offline":String(e.status??200)}function $c({outcome:e,active:t,onPress:r}){let o=e.danger?U.semantic.error:U.semantic.info;return Te(N,{onPress:r,"sentry-label":"ignore override outcome",testID:`buoy-network-outcome-${e.label.toLowerCase().replace(/\s+/g,"-")}${e.code?`-${e.code}`:""}`,accessibilityRole:"button",accessibilityLabel:`${e.label}${e.code?` ${e.code}`:""}`,style:[M.outcome,t&&{borderColor:o,backgroundColor:`${o}1F`}],children:[V(g,{style:[M.outcomeLabel,t&&{color:o}],children:e.label}),e.code?V(g,{style:[M.outcomeCode,t&&{color:o}],children:e.code}):null]})}function Vi({title:e,summary:t,open:r,onToggle:o,children:n}){return Te(c,{style:M.disclosure,children:[Te(N,{onPress:o,"sentry-label":"ignore override disclosure",testID:`buoy-network-disclosure-${e.toLowerCase().replace(/\s+/g,"-")}`,accessibilityRole:"button",accessibilityLabel:e,style:M.disclosureHeader,children:[r?V(Rc,{size:12,color:U.text.muted}):V(kc,{size:12,color:U.text.muted}),V(g,{style:M.disclosureTitle,children:e}),t&&!r?V(g,{style:M.disclosureSummary,numberOfLines:1,children:t}):null]}),r?V(c,{style:M.disclosureBody,children:n}):null]})}function Mt({label:e,active:t,onPress:r}){return V(N,{onPress:r,"sentry-label":"ignore override chip",testID:`buoy-network-chip-${e.toLowerCase().replace(/\s+/g,"-")}`,accessibilityRole:"button",accessibilityLabel:e,style:[M.chip,t&&M.chipActive],children:V(g,{style:[M.chipText,t&&M.chipTextActive],children:e})})}function Wc({draft:e,onChange:t,onSave:r,onCancel:o,saveLabel:n="Save",applySafeAreaInset:i=false}){let s=Ic({minBottom:16}),a=i?s.bottom:0,l=y=>t({...e,...y}),[u,b]=Nr(!e.urlPattern.trim()),[E,C]=Nr(false),[S,O]=Nr(null),[p,R]=Nr(null),I=jc(e),h=e.kind==="respond"&&typeof e.status=="number"&&!Wi.some(y=>y.code===String(e.status)),L=e.kind==="respond",z=e.methods?.[0],P=`${z??"Any"} ${e.urlPattern||"No URL yet"}`,T=Di(()=>{let y=(e.body??"").trim();if(!y)return"Empty";let A=y.split(`
|
|
143
|
-
`).length;return`${A} line${A===1?"":"s"}`},[e.body]),x=Di(()=>{let y=(e.body??"").trim();if(!y)return null;try{return JSON.parse(y)}catch{return null}},[e.body]),m=(e.body??"").trim().length>0&&!x,v=e.delayMs??0,d=v>0&&!$i.includes(v),f=!e.alternate&&typeof e.times=="number"&&e.times!==1;return Te(c,{style:M.root,children:[Te(dt,{testID:"buoy-network-editor-scroll",style:M.scroll,contentContainerStyle:M.scrollContent,keyboardShouldPersistTaps:"handled",children:[Te(Vi,{title:"Applies to",summary:P,open:u,onToggle:()=>b(y=>!y),children:[V(Pt,{style:M.input,value:e.urlPattern,onChangeText:y=>l({urlPattern:y}),testID:"buoy-network-override-pattern",accessibilityLabel:"Override URL pattern",placeholder:"https://api.example.com/v1/users*",placeholderTextColor:U.text.muted,autoCapitalize:"none",autoCorrect:false,multiline:true,"sentry-label":"ignore override url pattern"}),Te(c,{style:M.chipRow,children:[V(Mt,{label:"Any",active:!z,onPress:()=>l({methods:void 0})}),Fc.map(y=>V(Mt,{label:y,active:z===y,onPress:()=>l({methods:[y]})},y))]})]}),Te(c,{style:M.outcomeGrid,children:[Wi.map(y=>V($c,{outcome:y,active:I===y.id,onPress:()=>l(y.patch)},y.id)),V(N,{onPress:()=>R("status"),"sentry-label":"ignore custom status",accessibilityLabel:"Custom status code",style:[M.customField,h&&M.customFieldActive],children:V(g,{style:[M.customValue,h&&M.customInputActive],children:h?String(e.status):"Custom"})})]}),L?V(Vi,{title:"Response body",summary:T,open:E,onToggle:()=>C(y=>!y),children:S!==null?Te(ji,{children:[V(Pt,{style:[M.input,M.bodyInput],value:S,onChangeText:O,placeholder:"Paste a new body\u2026",placeholderTextColor:U.text.muted,autoCapitalize:"none",autoCorrect:false,autoFocus:true,multiline:true,"sentry-label":"ignore override body paste"}),Te(c,{style:M.inlineActions,children:[V(N,{onPress:()=>O(null),"sentry-label":"ignore cancel body paste",style:M.textButton,children:V(g,{style:M.textButtonMuted,children:"Cancel"})}),V(N,{onPress:()=>{let y=S.trim();try{l({body:JSON.stringify(JSON.parse(y),null,2)})}catch{l({body:y})}O(null)},disabled:!S.trim(),"sentry-label":"ignore apply body paste",style:M.textButton,children:V(g,{style:[M.textButtonLabel,!S.trim()&&M.textButtonDisabled],children:"Replace"})})]})]}):Te(ji,{children:[x!==null?V(Ai.Provider,{value:{root:x,onChange:y=>l({body:JSON.stringify(y,null,2)})},children:V(Bo,{editable:true,label:"",value:x,defaultExpanded:[""]})}):V(g,{style:M.emptyBody,children:m?"This body isn't JSON, so there's no tree to show.":"No body yet."}),V(N,{onPress:()=>O(""),"sentry-label":"ignore edit all body",style:M.textButton,children:V(g,{style:M.textButtonLabel,children:"Edit all"})})]})}):null,Te(c,{style:M.field,children:[V(g,{style:M.subLabel,children:"Delay"}),Te(c,{style:M.chipRow,children:[$i.map(y=>V(Mt,{label:y===0?"None":`${y/1e3}s`,active:v===y,onPress:()=>l({delayMs:y})},y)),V(N,{onPress:()=>R("delay"),"sentry-label":"ignore custom delay",accessibilityLabel:"Custom delay in seconds",style:[M.customField,d&&M.customFieldActive],children:V(g,{style:[M.customValue,d&&M.customInputActive],children:d?`${v/1e3}s`:"Custom"})})]})]}),Te(c,{style:M.field,children:[V(g,{style:M.subLabel,children:"Fires"}),V(g,{style:M.subHint,children:"A limited rule switches itself off once it's used up. Every other alternates forever \u2014 the first request through, the next overridden."}),Te(c,{style:M.chipRow,children:[V(Mt,{label:"Always",active:!e.alternate&&e.times==null,onPress:()=>l({alternate:false,times:null})}),V(Mt,{label:"Once",active:!e.alternate&&e.times===1,onPress:()=>l({alternate:false,times:1})}),V(Mt,{label:"Every other",active:e.alternate===true,onPress:()=>l({alternate:true,times:null})}),V(N,{onPress:()=>{l({alternate:false}),R("times")},"sentry-label":"ignore custom times",accessibilityLabel:"Custom number of times",style:[M.customField,f&&M.customFieldActive],children:V(g,{style:[M.customValue,f&&M.customInputActive],children:f?`${e.times}\xD7`:"Custom"})})]})]})]}),p==="status"?V(Do,{title:"Custom status code",hint:`${Ut}\u2013${_t}`,value:h?e.status:void 0,min:Ut,max:_t,onSubmit:y=>{l({kind:"respond",status:y??void 0,statusText:void 0}),R(null)},onCancel:()=>R(null)}):null,p==="delay"?V(Do,{title:"Custom delay",hint:"Seconds",value:d?v/1e3:void 0,min:0,onSubmit:y=>{l({delayMs:y!=null?Math.round(y*1e3):0}),R(null)},onCancel:()=>R(null)}):null,p==="times"?V(Do,{title:"Fires how many times",hint:"Leave empty for always",value:f?e.times:void 0,min:1,onSubmit:y=>{l({alternate:false,times:y&&y>0?y:null}),R(null)},onCancel:()=>R(null)}):null,Te(c,{style:[M.footer,{paddingBottom:12+a}],children:[V(N,{onPress:o,"sentry-label":"ignore cancel override",testID:"buoy-network-editor-cancel",accessibilityRole:"button",accessibilityLabel:"Cancel",style:[M.footerButton,M.cancelButton],children:V(g,{style:M.cancelText,children:"Cancel"})}),V(N,{onPress:r,disabled:!e.urlPattern.trim(),"sentry-label":"ignore save override",testID:"buoy-network-editor-save",accessibilityRole:"button",accessibilityLabel:n,style:[M.footerButton,M.saveButton,!e.urlPattern.trim()&&M.saveButtonDisabled],children:V(g,{style:M.saveText,children:n})})]})]})}var M=fe.create({root:{flex:1},scroll:{flex:1},scrollContent:{padding:12,paddingBottom:24,gap:4},field:{gap:8,paddingVertical:6},outcomeGrid:{flexDirection:"row",flexWrap:"wrap",gap:6,paddingVertical:10},outcome:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,paddingVertical:9,borderRadius:6,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.card},outcomeLabel:{fontSize:12,fontWeight:"600",color:U.text.primary},outcomeCode:{fontSize:10,fontWeight:"700",color:U.text.muted},disclosure:{borderRadius:6,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.card,overflow:"hidden"},disclosureHeader:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,paddingVertical:10},disclosureTitle:{fontSize:12,fontWeight:"600",color:U.text.primary},disclosureSummary:{flex:1,textAlign:"right",fontSize:11,color:U.text.muted},disclosureBody:{paddingHorizontal:10,paddingBottom:10,gap:8},input:{backgroundColor:U.background.input,borderWidth:1,borderColor:U.border.input,borderRadius:6,paddingHorizontal:10,paddingVertical:8,color:U.text.primary,fontSize:12,fontFamily:Ec,minHeight:40},bodyInput:{minHeight:140,textAlignVertical:"top"},chipRow:{flexDirection:"row",flexWrap:"wrap",gap:6},chip:{paddingHorizontal:10,paddingVertical:6,borderRadius:5,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.base},chipActive:{borderColor:U.semantic.info,backgroundColor:`${U.semantic.info}1F`},chipText:{fontSize:11,fontWeight:"600",color:U.text.secondary},chipTextActive:{color:U.semantic.info},customField:{flexDirection:"row",alignItems:"center",paddingHorizontal:8,borderRadius:5,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.base},customFieldActive:{borderColor:U.semantic.info,backgroundColor:`${U.semantic.info}1F`},customValue:{paddingVertical:6,fontSize:11,fontWeight:"600",color:U.text.secondary},customInputActive:{color:U.semantic.info},subHint:{fontSize:10,lineHeight:14,color:U.text.muted,marginTop:-2},subLabel:{fontSize:10,fontWeight:"700",letterSpacing:.6,color:U.text.muted,textTransform:"uppercase"},textButton:{alignSelf:"flex-start",paddingVertical:4},textButtonLabel:{fontSize:11,fontWeight:"600",color:U.semantic.info},textButtonMuted:{fontSize:11,fontWeight:"600",color:U.text.secondary},textButtonDisabled:{opacity:.4},inlineActions:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},emptyBody:{fontSize:11,color:U.text.muted,paddingVertical:6},footer:{flexDirection:"row",gap:8,padding:12,borderTopWidth:1,borderTopColor:U.border.default,backgroundColor:U.background.base},footerButton:{flex:1,paddingVertical:11,borderRadius:6,alignItems:"center",borderWidth:1},cancelButton:{borderColor:U.border.default,backgroundColor:U.background.card},cancelText:{fontSize:12,fontWeight:"600",color:U.text.secondary},saveButton:{borderColor:U.semantic.info,backgroundColor:`${U.semantic.info}22`},saveButtonDisabled:{opacity:.4},saveText:{fontSize:12,fontWeight:"700",color:U.semantic.info}});import{jsx as de,jsxs as Rt}from"react/jsx-runtime";function Vc(){return{enabled:true,urlPattern:"",kind:"respond",status:500,body:"",times:null}}function Uc(e){let{id:t,hits:r,seen:o,createdAt:n,...i}=e;return i}function _c(e){let t=e.urlPattern,r=t.indexOf("://");if(r===-1)return t;let o=t.indexOf("/",r+3);return o===-1?t.slice(r+3):t.slice(o)}function Xc(e){let t=[];return e.delayMs&&t.push(`${e.delayMs/1e3}s delay`),e.alternate?t.push("every other"):e.times===1?t.push("once"):typeof e.times=="number"&&t.push(`${e.times}\xD7`),t.join(" \xB7 ")}function Jc(e){if(e.kind==="fail")return Y.semantic.error;if(e.kind==="delay")return Y.semantic.info;let t=e.status??200;return t>=200&&t<300?Y.semantic.success:t>=300&&t<400?Y.semantic.info:Y.semantic.error}function Gc({rule:e,spent:t,onEdit:r,onDelete:o}){let n=e.enabled&&!t,i=Jc(e),s=Xc(e),a=e.methods?.length?e.methods.join("/"):"ANY";return Rt(bc,{onPress:r,style:ie.cardWrapper,contentStyle:[ie.card,{borderLeftColor:n?i:"transparent"}],children:[de(Sc,{method:a,size:"small"}),Rt(c,{style:ie.cardMiddle,children:[de(g,{style:[ie.urlText,!n&&ie.urlTextOff],numberOfLines:2,children:_c(e)}),s?de(g,{style:ie.extrasText,children:s}):null]}),e.hits>0?de(g,{style:ie.rowHits,children:e.hits}):null,e.kind==="fail"?Rt(c,{style:ie.failBadge,children:[de(mc,{size:10,color:Y.semantic.error}),de(g,{style:ie.failText,children:e.failKind==="timeout"?"TIMEOUT":"OFFLINE"})]}):de(g,{style:[ie.statusText,{color:i}],children:e.kind==="delay"?"PASS":String(e.status??200)}),de(N,{onPress:o,"sentry-label":"ignore delete override rule",testID:"buoy-network-rule-delete",accessibilityRole:"button",accessibilityLabel:"Delete rule",hitSlop:{top:8,bottom:8,left:4,right:4},style:ie.rowDelete,children:de(wc,{size:13,color:Y.text.muted})})]})}function Kc(e){return e.visible?de(Yc,{...e}):null}function Yc({isPro:e,onUpgradePress:t,pendingDraft:r,onPendingConsumed:o,backHandlerRef:n,applySafeAreaInset:i}){let s=Tc("network.overrideRules"),a=e?tt:s,{enabled:l,autoPaused:u,rules:b,activeCount:E,setEnabled:C,upsertRule:S,setRuleEnabled:O,removeRule:p,isRuleSpent:R}=Ar(),[I,h]=gc(null);Mr(()=>{_.noteHealthyLaunch()},[]),Mr(()=>{if(n)return n.current=I?()=>(h(null),true):null,()=>{n.current=null}},[n,I]);let L=fc(m=>{_.fetchRuleBody(m).then(v=>{v!=null&&h(d=>d?.id===m?{...d,draft:{...d.draft,body:v,bodyOmitted:void 0}}:d)})},[]);Mr(()=>{if(!r)return;let{id:m,...v}=r;h({id:m,draft:v}),m&&v.bodyOmitted&&L(m),o?.()},[r,o,L]),Mr(()=>{I?.id&&(b.some(m=>m.id===I.id)||h(null))},[I?.id,b]);let z=m=>{h({id:m.id,draft:Uc(m)}),m.bodyOmitted&&L(m.id)},P=m=>{b.filter(v=>v.enabled&&!R(v)).length<=a||b.filter(v=>v.enabled&&!R(v)&&v.id!==m).forEach(v=>O(v.id,false))},T=()=>{if(!I)return;let m={...I.draft,enabled:true,urlPattern:I.draft.urlPattern.trim()};if(!m.urlPattern)return;let v=S({...m,id:I.id});P(v?.id??I.id),C(true),h(null)};if(I)return de(Wc,{draft:I.draft,onChange:m=>h({...I,draft:m}),onSave:T,onCancel:()=>h(null),saveLabel:I.id?"Save":"Add",applySafeAreaInset:i});let x=b.length>0;return Rt(c,{style:ie.root,children:[x?Rt(c,{style:[ie.bar,l&&E>0&&ie.barOn],children:[l&&E>0?de(yc,{size:12,color:Y.semantic.warning}):null,de(g,{style:[ie.barText,l&&E>0&&ie.barTextOn],numberOfLines:2,children:u?"Overrides paused \u2014 they'd been on for 3 launches":l&&E>0?`${E} override${E===1?" is":"s are"} on`:"Overrides are off"}),de(N,{onPress:()=>C(!(l&&E>0)),"sentry-label":"ignore toggle overrides master",testID:"buoy-network-overrides-master",accessibilityRole:"button",style:ie.barButton,children:de(g,{style:ie.barButtonText,children:l&&E>0?"Turn all off":u?"Turn back on":"Turn on"})})]}):null,Rt(c,{style:ie.listHeader,children:[de(g,{style:ie.listHeaderText,children:x?`${b.length} rule${b.length===1?"":"s"}`:""}),de(N,{onPress:()=>h({draft:Vc()}),"sentry-label":"ignore new override rule",accessibilityLabel:"New override rule",style:ie.newButton,children:de(xc,{size:14,color:Y.semantic.info})})]}),x?Rt(dt,{style:ie.list,contentContainerStyle:ie.listContent,keyboardShouldPersistTaps:"handled",children:[b.map(m=>de(Gc,{rule:m,spent:R(m),onEdit:()=>z(m),onDelete:()=>p(m.id)},m.id)),a<tt?de(g,{style:ie.footNote,children:`Your plan: ${a} override at a time. Pro: up to ${tt}.`}):null]}):de(c,{style:ie.emptyWrap,children:de(vc,{otto:"empty",iconSize:32,title:"Nothing overridden",description:"Open any request and tap Override, or + to write a rule."})})]})}var ie=fe.create({root:{flex:1},bar:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,borderBottomWidth:1,borderBottomColor:Y.border.default,backgroundColor:Y.background.card},barOn:{borderBottomColor:Y.semantic.warning+"44",backgroundColor:Y.semantic.warningBackground},barText:{flex:1,fontSize:12,fontWeight:"600",color:Y.text.secondary},barTextOn:{color:Y.semantic.warning},barButton:{paddingHorizontal:10,paddingVertical:6,borderRadius:5,borderWidth:1,borderColor:Y.border.hover,backgroundColor:Y.background.base},barButtonText:{fontSize:11,fontWeight:"700",color:Y.text.primary},listHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingTop:10,paddingBottom:4},listHeaderText:{fontSize:10,fontWeight:"700",letterSpacing:.6,color:Y.text.muted,textTransform:"uppercase"},newButton:{padding:6,borderRadius:5,borderWidth:1,borderColor:Y.border.default,backgroundColor:Y.background.card},emptyWrap:{flex:1,justifyContent:"center"},list:{flex:1},listContent:{padding:10,gap:6},cardWrapper:{marginHorizontal:0,marginVertical:0},card:{flexDirection:"row",alignItems:"center",gap:8,borderLeftWidth:3,borderLeftColor:"transparent"},cardMiddle:{flex:1},urlText:{fontSize:12,color:Y.text.primary,lineHeight:16,fontFamily:Cc},urlTextOff:{color:Y.text.muted},extrasText:{fontSize:10,color:Y.text.secondary,marginTop:2},statusText:{fontSize:11,fontWeight:"600"},failBadge:{flexDirection:"row",alignItems:"center",gap:2,paddingHorizontal:4,paddingVertical:1,backgroundColor:Y.semantic.error+"26",borderRadius:3},failText:{fontSize:10,color:Y.semantic.error,fontWeight:"600"},rowHits:{fontSize:11,fontWeight:"700",color:Y.semantic.warning},rowDelete:{padding:5,borderRadius:5,borderWidth:1,borderColor:Y.border.default,backgroundColor:Y.background.base},footNote:{fontSize:10,lineHeight:14,color:Y.text.muted,paddingHorizontal:4,paddingTop:8}});D();ce();import{FlaskConical as Zc,night as kt}from"@buoy-gg/shared-ui/web";import{jsx as zo,jsxs as Qc}from"react/jsx-runtime";function eh({onPress:e}){let{activeCount:t}=Ar(),r=t>0;return Qc(N,{onPress:e,"sentry-label":"ignore open overrides",testID:"buoy-network-overrides",accessibilityRole:"button",style:[Ur.button,r&&Ur.buttonActive],accessibilityLabel:r?`Response overrides \u2014 ${t} active`:"Response overrides",children:[zo(Zc,{size:14,color:r?kt.color.warning:kt.color.textSecondary}),r?zo(c,{style:Ur.badge,children:zo(g,{style:Ur.badgeText,children:t})}):null]})}var Ur=fe.create({button:{width:32,height:32,borderRadius:8,alignItems:"center",justifyContent:"center",backgroundColor:kt.color.buttonSurface,borderWidth:1,borderColor:kt.color.border},buttonActive:{backgroundColor:kt.color.warningSoft,borderColor:kt.color.warning+"77"},badge:{position:"absolute",top:1,right:1,minWidth:12,height:12,borderRadius:6,paddingHorizontal:3,alignItems:"center",justifyContent:"center",backgroundColor:kt.color.warning},badgeText:{fontSize:8,fontWeight:"800",color:"#000000"}});D();ce();import{night as Nt}from"@buoy-gg/shared-ui/web";D();function th(e){let t=e.indexOf("?");return t===-1?e:`${e.slice(0,t)}*`}function rh(e){if(e==null)return"";if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return""}}function Ao(e){return{enabled:true,name:void 0,urlPattern:th(e.url),methods:[String(e.method||"GET").toUpperCase()],kind:"respond",status:e.status&&e.status>=200?e.status:200,statusText:e.statusText,body:rh(e.responseData),times:null}}import{jsx as Ui}from"react/jsx-runtime";function oh({onOpen:e}){let t=Ro(),{rules:r,isRuleSpent:o}=Ar(),n=t?K.getEvents().find(a=>a.id===t)??se.getEventById(t):null,i=n?r.find(a=>a.enabled&&!o(a)&&lo(a,n.url,String(n.method||"GET")))??null:null,s=i!==null;return Ui(N,{onPress:()=>{if(n){if(i){let{id:a,hits:l,seen:u,createdAt:b,...E}=i;e(E,a);return}e(Ao(n))}},"sentry-label":"ignore open overrides",testID:"buoy-network-override-request",accessibilityRole:"button",accessibilityLabel:s?"Edit the override on this request":"Override this request",style:[_r.button,s&&_r.buttonActive],children:Ui(g,{style:[_r.label,s&&_r.labelActive],children:"Override"})})}var _r=fe.create({button:{paddingHorizontal:10,paddingVertical:6,borderRadius:8,borderWidth:1,borderColor:Nt.color.border,backgroundColor:Nt.color.buttonSurface},buttonActive:{borderColor:Nt.color.warning+"77",backgroundColor:Nt.color.warningSoft},label:{fontSize:11,fontWeight:"700",color:Nt.color.accent},labelActive:{color:Nt.color.warning}});D();ce();import{absoluteFill as _i,night as at}from"@buoy-gg/shared-ui/web";import{jsx as Ze,jsxs as Xr}from"react/jsx-runtime";function nh({onPress:e,isOpen:t,hasIndicator:r}){return Xr(N,{onPress:e,"sentry-label":"ignore toggle header menu",testID:"buoy-network-menu",accessibilityRole:"button",accessibilityLabel:t?"Close menu":"More actions",style:[xe.button,t&&xe.buttonOpen],children:[Xr(c,{style:xe.dots,children:[Ze(c,{style:[xe.dot,t&&xe.dotOpen]}),Ze(c,{style:[xe.dot,t&&xe.dotOpen]}),Ze(c,{style:[xe.dot,t&&xe.dotOpen]})]}),r?Ze(c,{style:xe.indicator}):null]})}function ih({onClose:e,children:t}){return Xr(c,{style:xe.overlay,children:[Ze(N,{style:xe.backdrop,activeOpacity:1,onPress:e,"sentry-label":"ignore dismiss header menu"}),Ze(c,{style:xe.panel,children:t})]})}function Ho({icon:e,label:t,detail:r,testID:o,onPress:n}){return Xr(N,{onPress:n,"sentry-label":"ignore header menu item",testID:o,accessibilityRole:"button",accessibilityLabel:t,style:xe.item,children:[Ze(c,{style:xe.itemIcon,children:e}),Ze(g,{style:xe.itemLabel,children:t}),r?Ze(g,{style:xe.itemDetail,children:r}):null]})}var xe=fe.create({button:{width:32,height:32,borderRadius:8,alignItems:"center",justifyContent:"center"},buttonOpen:{backgroundColor:at.color.surfaceElevated},dots:{flexDirection:"column",gap:2.5,alignItems:"center"},dot:{width:3,height:3,borderRadius:2,backgroundColor:at.color.textSecondary},dotOpen:{backgroundColor:at.color.text},indicator:{position:"absolute",top:6,right:8,width:6,height:6,borderRadius:3,backgroundColor:at.color.accent},overlay:{..._i,zIndex:50},backdrop:{..._i,backgroundColor:"rgba(0,0,0,0.5)"},panel:{position:"absolute",top:6,right:8,minWidth:196,paddingVertical:4,borderRadius:10,borderWidth:1,borderColor:at.color.border,backgroundColor:at.color.surface},item:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:12,paddingVertical:11},itemIcon:{width:16,alignItems:"center"},itemLabel:{flex:1,fontSize:13,fontWeight:"600",color:at.color.text},itemDetail:{fontSize:11,color:at.color.textTertiary}});D();import{memo as sh,useEffect as ah,useMemo as lh}from"react";import{EventStepperFooter as dh,useLimit as uh}from"@buoy-gg/shared-ui/web";import{jsx as ch}from"react/jsx-runtime";var hh=()=>Ve.step(-1),ph=()=>Ve.step(1),fh=sh(function({paused:e,filter:t,ignoredPatterns:r,isPro:o,fromSaved:n,savedSearch:i,applySafeAreaInset:s}){let{visibleEvents:a}=sr({filter:t,ignoredPatterns:r,paused:e,isPro:o}),{pinnedEvents:l,pinnedLiveIds:u,savedRecords:b}=Ot(),E=uh("network.saved"),C=lh(()=>{if(n)return Bi(b,E,i).events;let{pinned:p,rest:R}=Eo(a,l,u);return p.length===0?R:[...p,...R]},[n,b,i,o,a,l,u]);ah(()=>{Ve.setIds(eu(C))},[C]);let{index:S,total:O}=ou();return S<0?null:ch(dh,{currentIndex:S,totalItems:O,itemLabel:"Request",applySafeAreaInset:s,onPrevious:hh,onNext:ph,variant:"night"})});D();import{useEffect as gh,useState as mh}from"react";function yh(e){return K.getEvents().find(t=>t.id===e)??se.getEventById(e)}function Xi(e,t={}){let{paused:r=false}=t,[o,n]=mh(null);return gh(()=>{if(!(!e||r))return K.subscribeToEvents(i=>{let s=i.find(a=>a.id===e);s&&n(a=>a&&a.id===e&&a.event===s?a:{id:e,event:s})})},[e,r]),e?o&&o.id===e?o.event:yh(e):null}import{Fragment as bh,jsx as j,jsxs as Me}from"react/jsx-runtime";function vh({visible:e,paused:t,ignoredPatternValues:r,onTogglePattern:o,isPro:n,filter:i,ignoredPatterns:s,fromSaved:a,savedSearch:l,applySafeAreaInset:u}){let b=Ro(),E=ru(),C=b!=null&&b===E,S=Xi(b,{paused:t||!e});return mt(()=>{e&&S&&C&&Ve.reportRendered(S.id)},[e,S,C]),e?Me(c,{style:It.detailRoot,children:[S?j(ri,{event:S,ignoredPatterns:r,onTogglePattern:o,showBodies:C}):j(c,{style:It.detailBodyFallback}),j(fh,{paused:t,filter:i,ignoredPatterns:s,isPro:n,fromSaved:a,savedSearch:l,applySafeAreaInset:u})]}):null}function Sh({visible:e,paused:t,isPro:r,filter:o,onFilterChange:n,ignoredPatterns:i,onRemovePattern:s,onAddPattern:a,onTogglePatternMode:l}){let{events:u}=sr({filter:o,ignoredPatterns:i,paused:t,visible:e,isPro:r});return e?j(Nl,{events:u,filter:o,onFilterChange:n,ignoredPatterns:i,onRemovePattern:s,onAddPattern:a,onTogglePatternMode:l}):null}function xh({visible:e,paused:t,isPro:r,filter:o,ignoredPatterns:n,settings:i,onSettingsChange:s}){let{events:a}=sr({filter:o,ignoredPatterns:n,paused:t,visible:e,isPro:r});return e?j(Id,{settings:i,onSettingsChange:s,events:a}):null}function Ji({visible:e,onClose:t,onBack:r,onMinimize:o,enableSharedModalDimensions:n=false,inline:i=false,paused:s,onPausedChange:a,remoteConditions:l}){let{isPro:u}=wl(),[b,E]=me(false),C=s!=null&&a!=null,S=C?s:b,O=Z=>{let De=typeof Z=="function"?Z(S):Z;C?a(De):E(De)},[p,R]=me({}),I=tu(),[h,L]=me(false),[z,P]=me(false),[T,x]=me(false),[m,v]=me(false),[d,f]=me(0),[y]=me(cl);mt(()=>{y.update(l)},[y,l]),mt(()=>()=>y.update(void 0),[y]);let A=true,[ae,te]=me(null),[Q,G]=me("filters"),[H,W]=me(""),[F,oe]=me(false),pe=wr(false),[et,lt]=me(""),ns=wr(null),{patterns:Et,values:is,add:ss,remove:as,toggle:ls,toggleMode:ds}=Rl(),[jt,_o]=me(wd),Zr=wr(false),[Qr,eo]=me(false),[Lt,us]=me("export"),$t=Z=>{us(Z),eo(true)};mt(()=>{Qr&&u&&eo(false)},[Qr,u]),mt(()=>{if(!e||Zr.current)return;(async()=>{try{let Z=await Fn.getItem(Tr.network.copyOptions());if(Z){let De=JSON.parse(Z);_o(De)}}catch{}finally{Zr.current=true}})()},[e]),mt(()=>{if(!Zr.current)return;(async()=>{try{await Fn.setItem(Tr.network.copyOptions(),JSON.stringify(jt))}catch{}})()},[jt]);let cs=()=>{Ve.clear()},Xo=go(Z=>{Ve.select(Z.id)},[]),hs=go((Z,De)=>{te(De?{...Z,id:De}:Z),x(true),Ve.clear()},[]),ps=go(()=>te(null),[]),Jo=wr(null),Go=Z=>{W(Z),R(De=>({...De,searchText:Z}))},fs=Z=>{R(De=>({...De,status:De.status===Z?void 0:Z}))},[Ko,gs]=me("bottomSheet"),ms=Z=>{gs(Z)};mt(()=>{F&&requestAnimationFrame(()=>{ns.current?.focus()})},[F]);let Yo=()=>h?Me(ge,{children:[j(ge.Navigation,{onBack:()=>L(false)}),j(ge.Content,{title:"",noMargin:true,children:j(xl,{size:"sm",tabs:[{key:"filters",label:"Filters"},{key:"copy",label:"Copy"}],activeKey:Q,onChange:Z=>G(Z)})})]}):I?Me(ge,{children:[j(ge.Navigation,{onBack:cs}),j(ge.Content,{title:"Request Details",centered:true}),Me(ge.Actions,{children:[A?j(oh,{onOpen:hs}):null,j(ki,{isPro:u,onUpgradePress:()=>$t("saved")})]})]}):T&&A?Me(ge,{children:[j(ge.Navigation,{onBack:()=>{Jo.current?.()||(x(false),te(null))}}),j(ge.Content,{title:"Response Overrides",centered:true})]}):z?Me(ge,{children:[j(ge.Navigation,{onBack:()=>P(false)}),j(ge.Content,{title:"Saved Requests",centered:true})]}):Me(ge,{children:[r&&j(ge.Navigation,{onBack:r}),j(ge.Content,{title:"",children:F?j(ge.Search,{value:H,onChangeText:Go,onCancel:()=>{Go(""),oe(false)},onDismiss:()=>oe(false),dismissOnBlur:true,clearOnlyWhenText:true,placeholder:"Search URL, method, operation, error...",accessibilityLabel:"Search network requests",iconSize:14,testID:"buoy-network-search-input",clearTestID:"buoy-network-search-clear",inputProps:{"sentry-label":"ignore network search header"}}):j(uu,{activeStatus:p.status,onToggleStatus:fs,ignoredPatterns:Et,paused:S})}),Me(ge.Actions,{children:[j(N,{"sentry-label":"ignore open search",testID:"buoy-network-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",onPress:()=>oe(true),style:It.headerActionButton,children:j(gl,{size:14,color:Ke.color.textSecondary})}),A?j(eh,{onPress:()=>x(true)}):null,j(Cl,{isEnabled:!S,onToggle:()=>O(Z=>!Z),accessibilityLabel:S?"Resume network capture":"Pause network capture",testID:"buoy-network-power"}),j(cu,{paused:S}),j(nh,{onPress:()=>v(Z=>!Z),isOpen:m,hasIndicator:to})]})]}),to=!!(p.status||p.method||p.contentType),ys=n?Tr.modal.root():Tr.network.modal();if(!e)return null;let bs=I||!h,Zo=Me(bh,{children:[Me(c,{style:It.container,children:[j(vh,{visible:I,paused:S,ignoredPatternValues:is,onTogglePattern:ls,isPro:u,filter:p,ignoredPatterns:Et,fromSaved:z,savedSearch:et,applySafeAreaInset:!i&&Ko==="bottomSheet"}),j(Sh,{visible:h&&Q==="filters"&&!I,paused:S,isPro:u,filter:p,onFilterChange:R,ignoredPatterns:Et,onRemovePattern:as,onAddPattern:ss,onTogglePatternMode:ds}),j(xh,{visible:h&&Q==="copy"&&!I,paused:S,isPro:u,filter:p,ignoredPatterns:Et,settings:jt,onSettingsChange:_o}),j(Kc,{visible:A&&T&&!I&&!h,isPro:u,onUpgradePress:()=>$t("overrides"),pendingDraft:ae,onPendingConsumed:ps,backHandlerRef:Jo,applySafeAreaInset:!i&&Ko==="bottomSheet"}),j(Oi,{visible:z&&!I&&!h&&!(T&&A),isPro:u,copySettings:jt,search:et,onSearchChange:lt,onEventPress:Xo,onUpgradePress:()=>$t("saved")}),j(oc,{visible:!I&&!h&&!z&&!(T&&A),paused:S,filter:p,ignoredPatterns:Et,isPro:u,searchText:H,onEventPress:Xo,onUpgradePress:()=>$t("export")})]}),m?Me(ih,{onClose:()=>v(false),children:[j(Ho,{icon:j(ml,{size:14,color:Ke.color.textSecondary}),label:"Network throttling",testID:"buoy-network-menu-throttling",onPress:()=>{v(false),fl(l?y:void 0),i||f(Z=>Z+1)}}),j(Ho,{icon:j(yl,{size:14,color:to?Ke.color.accent:Ke.color.textSecondary}),label:"Filters",detail:to?"Active":void 0,onPress:()=>{v(false),G("filters"),L(true)}}),j(Ho,{icon:j(bl,{size:14,color:Ke.color.textSecondary}),label:"Saved requests",onPress:()=>{v(false),P(true)}}),j(c,{style:It.menuCopyRow,children:j(pu,{isPro:u,filter:p,ignoredPatterns:Et,copySettings:jt,paused:S,onUpgradePress:()=>{v(false),$t("export")},label:"Copy requests"})})]}):null,j(Tl,{visible:Qr,onClose:()=>eo(false),featureName:Lt==="saved"?"Saved Requests":Lt==="overrides"?"Response Overrides":"Network Export",description:Lt==="saved"?"Keep the requests that matter. Saved requests survive Clear, app restarts, and the 500-request history cap.":Lt==="overrides"?"Force any endpoint to fail, stall or return something else \u2014 no backend changes, no code changes. Free keeps one active rule.":"Export network requests to share with your team, debug APIs, or feed into AI tools.",benefits:Lt==="overrides"?[`Run ${tt} rules at once (free keeps ${wn})`,"Force a 500, a 401 or an empty list in one tap","Simulate offline, timeouts and slow connections","Rules survive an app reload, so you can test the boot path"]:Lt==="saved"?[`Save up to ${nt} requests (free keeps ${fi})`,"Failed requests stay put through a Clear","Snapshots survive an app restart","Export saved requests to teammates or AI assistants"]:["Export to JSON, Markdown, or plain text","Customizable copy presets (URLs only, LLM-ready, full data)","Share request details with teammates","Feed network data directly to AI assistants"]})]});return i?Me(c,{style:It.inlineRoot,children:[j(c,{style:It.inlineHeader,...kl,children:Yo()}),Zo]}):j(vl,{visible:e,onClose:t,onMinimize:o,minimizeRequest:d,persistenceKey:ys,variant:"night",header:{showToggleButton:true,customContent:Yo()},onModeChange:ms,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,disableScrollWrapper:bs,styles:{},children:Zo})}var It=fe.create({container:{flex:1,backgroundColor:"transparent"},detailRoot:{flex:1,minHeight:0},detailBodyFallback:{flex:1},inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:Sl.border.default,backgroundColor:"transparent"},menuCopyRow:{paddingHorizontal:6},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:Ke.color.buttonSurface,borderWidth:1,borderColor:Ke.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:Ke.color.accentSoft,borderColor:Ke.color.accentBorderStrong}});function Gi(e){return j(bo,{children:j(Ji,{...e})})}function wh(e={}){return j(bo,{children:j(Ji,{...e,inline:true,visible:true,onClose:Th})})}var Th=()=>{};import{jsx as Ch}from"react/jsx-runtime";var Ki=typeof navigator<"u"&&navigator.product==="ReactNative";Ki&&_.ensureLoaded();Ki&&typeof Ce<"u"&&Ce&&K.startBootCapture();var Yi=sl({id:"network",name:"NET",description:"Network request logger",slot:"both",icon:({size:e})=>Ch(nl,{size:e}),component:Gi,props:{enableSharedModalDimensions:false}}),Rh=il(Yi,e=>({enableSharedModalDimensions:e.enableSharedModalDimensions??false}));D();function kh(){if(!(typeof navigator<"u"&&navigator.product==="ReactNative")&&(typeof window>"u"||typeof document>"u"))return()=>{};_.ensureLoaded();let e=K.subscribeToEvents(()=>{}),t=false;return()=>{t||(t=true,e())}}D();import{useState as Mo,useEffect as Ih,useCallback as Jr,useMemo as Qe,useRef as Eh}from"react";import{useLimit as Lh,TIER_LIMITS as Ph}from"@buoy-gg/shared-ui/web";var Ff=Ph["network.requests"].free;function qh(e={}){let{isPro:t=false}=e,r=Lh("network.requests"),o=t?1/0:r,[n,i]=Mo([]),[s,a]=Mo({}),[l,u]=Mo(true),b=Eh(null);Ih(()=>(l&&(b.current=K.subscribeToEvents(i)),()=>{b.current&&(b.current(),b.current=null)}),[l]);let E=Jr(()=>{K.clearEvents(),i([])},[]),C=Jr(()=>{u(false)},[]),S=Jr(()=>{u(true)},[]),O=Qe(()=>s.searchText?s.searchText.toLowerCase():null,[s.searchText]),p=Qe(()=>s.method&&s.method.length>0?new Set(s.method):null,[s.method]),R=Qe(()=>s.contentType&&s.contentType.length>0?new Set(s.contentType):null,[s.contentType]),I=Qe(()=>{let d=[...n];if(p&&(d=d.filter(f=>p.has(f.method))),s.status&&s.status!=="all")switch(s.status){case"success":d=d.filter(f=>f.status&&f.status>=200&&f.status<300);break;case"error":d=d.filter(f=>f.error||f.status&&f.status>=400);break;case"pending":d=d.filter(f=>!f.status&&!f.error);break}return O&&(d=d.filter(f=>f.url.toLowerCase().includes(O)||f.method.toLowerCase().includes(O)||f.path?.toLowerCase().includes(O)||f.host?.toLowerCase().includes(O)||f.error&&f.error.toLowerCase().includes(O)||f.operationName&&f.operationName.toLowerCase().includes(O)||Qn(f.graphqlVariables,O))),s.host&&(d=d.filter(f=>f.host===s.host)),R&&(d=d.filter(f=>{let y=f.responseHeaders||f.requestHeaders,A=y?.["content-type"]||y?.["Content-Type"]||"";for(let ae of R)switch(ae){case"JSON":if(A.includes("json"))return true;break;case"XML":if(A.includes("xml"))return true;break;case"HTML":if(A.includes("html"))return true;break;case"TEXT":if(A.includes("text"))return true;break;case"IMAGE":if(A.includes("image"))return true;break;case"VIDEO":if(A.includes("video"))return true;break;case"AUDIO":if(A.includes("audio"))return true;break;case"FORM":if(A.includes("form"))return true;break;case"OTHER":if(!A||!A.includes("json")&&!A.includes("xml")&&!A.includes("html")&&!A.includes("text")&&!A.includes("image")&&!A.includes("video")&&!A.includes("audio")&&!A.includes("form"))return true;break}return false})),d},[n,s,O,p,R]),h=Qe(()=>{let d=new Set;return n.slice(o).forEach(f=>{d.add(f.id)}),d},[n,o]),L=Qe(()=>I.filter(d=>h.has(d.id)),[I,h]),z=L.length>0,P=L.length,T=Jr(d=>h.has(d),[h]),x=Qe(()=>{let d=0,f=0,y=0,A=0,ae=0,te=0,Q=0;for(let H of n)H.status&&H.status>=200&&H.status<300?d++:H.error||H.status&&H.status>=400?f++:!H.status&&!H.error&&y++,A+=H.requestSize||0,ae+=H.responseSize||0,H.duration&&(te+=H.duration,Q++);let G=Q>0?te/Q:0;return{totalRequests:n.length,successfulRequests:d,failedRequests:f,pendingRequests:y,totalDataSent:A,totalDataReceived:ae,averageDuration:Math.round(G)}},[n]),m=Qe(()=>{let d=new Set;for(let f of n)f.host&&d.add(f.host);return Array.from(d)},[n]),v=Qe(()=>{let d=new Set;for(let f of n)d.add(f.method);return Array.from(d)},[n]);return{events:I,allEvents:n,stats:x,filter:s,setFilter:a,clearEvents:E,isCapturing:l,pauseCapturing:C,resumeCapturing:S,hosts:m,methods:v,hasLockedEvents:z,lockedEventCount:P,isEventLocked:T,requestLimit:o,getSubscriberCounts:()=>K.getSubscriberCounts()}}import{useIgnoredPatterns as Bh,ignoredPatternsStore as Oh,urlMatchesIgnoredPattern as Dh,isUrlIgnored as zh}from"@buoy-gg/shared-ui/web";D();import{approxJsonSize as No,isOverWireBudget as Ah}from"@buoy-gg/shared-ui/web";import{expandKeyedArrays as Hh,patchFromPath as Mh,refusalText as Nh,shapeKind as Zi,suggestedPatch as Fh,typedEditViolations as jh}from"@buoy-gg/shared-ui/web";var Fo=16*1024,Gr=1.25*1024*1024;function jo(e,t){return e===void 0?false:(t??0)>Fo?true:Ah(e,Fo)}var Qi=new WeakMap,es=new WeakMap;function $o(e){let t=Qi.get(e);if(t)return t;let r;try{r=Wh(e)}catch{r=$h(e)}return Qi.set(e,r),r}function $h(e){let t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0},r=1024;try{r=No(t,Gr).bytes}catch{}return{event:t,bytes:r}}function Wh(e){let t=jo(e.requestData,e.requestSize),r=jo(e.responseData,e.responseSize),o=ts(e.graphqlVariables),n=rs(e.requestHeaders),i=rs(e.responseHeaders),s=t||r||o!==e.graphqlVariables||n!==e.requestHeaders||i!==e.responseHeaders,a=e;return s&&(a={...e},t&&(a.requestData=void 0,a.requestBodyOmitted=true),r&&(a.responseData=void 0,a.responseBodyOmitted=true),o!==e.graphqlVariables&&(a.graphqlVariables=o),n!==e.requestHeaders&&(a.requestHeaders=n,a.headersOmitted=true),i!==e.responseHeaders&&(a.responseHeaders=i,a.headersOmitted=true)),{event:a,bytes:No(a,Gr).bytes}}function Vh(e){let t=es.get(e);if(t)return t;let{event:r}=$o(e),o={...r};o.requestData!==void 0&&(o.requestData=void 0,o.requestBodyOmitted=true),o.responseData!==void 0&&(o.responseData=void 0,o.responseBodyOmitted=true),o.graphqlVariables!==void 0&&(o.graphqlVariables=ts(o.graphqlVariables,true));let n={event:o,bytes:No(o,Gr).bytes};return es.set(e,n),n}function Uh(e){let t=new Array(e.length),r=0;for(let o=0;o<e.length;o++){let n=$o(e[o]);if(r+n.bytes<=Gr)t[o]=n.event,r+=n.bytes;else{let i=Vh(e[o]);t[o]=i.event,r+=i.bytes}}return t}function ts(e,t=false){if(!e||!t&&!jo(e,void 0))return e;let r={};for(let[o,n]of Object.entries(e))(typeof n=="string"&&n.length<=64||typeof n=="number"||typeof n=="boolean")&&(r[o]=n);return Object.keys(r).length>0?r:void 0}var Wo=64;function rs(e){if(!e)return e;let t=false,r={};for(let[o,n]of Object.entries(e))typeof n=="string"&&(n.length<=Wo?r[o]=n:(r[o]=`${n.slice(0,Wo)}\u2026 [${n.length-Wo} more]`,t=true));return t?r:e}var _h=e=>{let t=false,r=e.rules.map(o=>!o.body||o.body.length<=Fo?o:(t=true,{...o,body:void 0,bodyOmitted:true}));return t?{...e,rules:r}:e},Kr=e=>K.getEventById(e)??se.getEventById(e),Ft=e=>e&&typeof e=="object"?e.id:void 0,Yr=(e,t)=>!!(e&&typeof e=="object"&&e[t]),Vo=()=>Rn()?{}:{active:false,inactiveReason:Fa},Xh=["respond","fail","delay"];function Jh(e,t){if(!e||typeof e!="object")return null;let r=e.rule??e;if(!r||typeof r!="object")return null;let o=r,n=typeof o.urlPattern=="string"&&o.urlPattern.trim()?o.urlPattern.trim():t?.urlPattern??"";if(!n)return null;let i=Xh.includes(o.kind)?o.kind:t?.kind??"respond";return{id:typeof o.id=="string"?o.id:void 0,enabled:o.enabled!==false,name:typeof o.name=="string"?o.name:t?.name,urlPattern:n,methods:Array.isArray(o.methods)?o.methods.filter(s=>typeof s=="string").map(s=>s.toUpperCase()):t?.methods,requireHeader:typeof o.requireHeader=="string"&&o.requireHeader.trim()?o.requireHeader.trim():void 0,kind:i,status:typeof o.status=="number"?o.status:t?.status,statusText:typeof o.statusText=="string"?o.statusText:t?.statusText,headers:o.headers&&typeof o.headers=="object"?o.headers:t?.headers,body:Kh(o,t),failKind:o.failKind==="timeout"?"timeout":void 0,delayMs:typeof o.delayMs=="number"?o.delayMs:void 0,times:typeof o.times=="number"?o.times:null,alternate:o.alternate===true}}var dr=e=>!!e&&typeof e=="object"&&!Array.isArray(e);function os(e,t,r="",o={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t))return t.length>0&&t.length<e.length&&o.shrunk.push({path:r||"(root)",have:e.length,sent:t.length}),t;if(!dr(e)||!dr(t))return t;let n={...e};for(let[i,s]of Object.entries(t)){let a=r?`${r}.${i}`:i;if(i in e){let l=Zi(e[i]),u=Zi(s);(l==="array"||l==="object")&&l!==u&&o.breaks.push({path:a,from:l,to:u}),n[i]=os(e[i],s,a,o)}else n[i]=s}return n}function Gh(e,t){if(e.body!=null||!dr(e.bodyPatch)||typeof t!="string")return[];try{return jh(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function Kh(e,t){if(typeof e.body=="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);let r=t?.body??(typeof e.id=="string"?_.getState().rules.find(o=>o.id===e.id)?.body:void 0);if(dr(e.bodyPatch)&&typeof r=="string")try{return JSON.stringify(os(JSON.parse(r),e.bodyPatch),null,2)}catch{return r}return r}function Yh(e){if(!e||typeof e!="object")return null;let t=e.rule??e;if(!t||typeof t!="object")return null;let r=t.id;if(typeof r!="string")return null;let o=_.getState().rules.find(n=>n.id===r);return o?{...o}:null}function Zh(e){if(!e||typeof e!="object")return null;let t=e.rule??e;if(!t||typeof t!="object")return null;let r=t;if(r.bodyOmitted!==true||typeof r.id!="string")return null;let o=_.getState().rules.find(n=>n.id===r.id);return o?{body:o.body}:null}function Qh(e){if(!e||typeof e!="object")return null;let t=e.fromRequestId;if(typeof t!="string"||!t)return null;let r=Kr(t);return r?Ao(r):null}var ep={dispose:()=>{_.setEnabled(false)},version:6,getSnapshot:()=>(K.ensureInterception(),{conditions:{version:1,runtimeId:ho,profile:gt(),available:ft()},events:Uh(K.getEvents()),overrides:_h(_.getState()),saved:se.getRecords().map(e=>({...e,event:$o(e.event).event}))}),subscribe:e=>{let t=K.subscribeToEvents(e),r=Kt(e),o=se.subscribe(e),n=_.subscribe(e);return()=>{r(),t(),o(),n()}},actions:{getNetworkConditions:()=>({runtimeId:ho,profile:gt(),available:ft()}),setNetworkConditions:e=>{let t=e&&typeof e=="object"?e.profile:void 0;return{runtimeId:ho,profile:Sr(t),available:ft()}},clearEvents:()=>{K.clearEvents()},getEventBody:e=>{let t=Ft(e);if(!t)return null;let r=Kr(t);return r?{url:r.url??null,method:r.method??null,status:r.status??null,override:r.override??null,requestData:r.requestData??null,responseData:r.responseData??null,requestHeaders:r.requestHeaders??null,responseHeaders:r.responseHeaders??null}:null},setPinned:e=>{let t=Ft(e);if(!t)return null;let r=Kr(t);if(!r)return null;let o=Yr(e,"pinned");return Pr(se.getState(),t).pinned===o?{ok:true}:se.togglePin(r)},setSaved:e=>{let t=Ft(e);if(!t)return null;let r=Kr(t);if(!r)return null;let o=Yr(e,"saved");return Pr(se.getState(),t).saved===o?{ok:true}:se.toggleSave(r)},removeSavedRecord:e=>{let t=e&&typeof e=="object"?e.key:void 0;return t?(se.remove(t),{ok:true}):null},clearSavedRequests:()=>(se.clearSaved(),{ok:true}),clearPinnedRequests:()=>(se.clearPinned(),{ok:true}),setOverridesEnabled:e=>(_.setEnabled(Yr(e,"enabled")),{ok:true,enabled:_.getState().enabled,...Vo()}),upsertOverrideRule:e=>{let t=Qh(e)??Zh(e)??Yh(e),r=e?.rule??e;if(r&&typeof r.bodyPath=="string"&&r.body==null){let i=t?.body??(typeof r.id=="string"?_.getState().rules.find(l=>l.id===r.id)?.body:void 0);if(typeof i!="string")return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."};if(r.bodyValue===void 0)return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${r.bodyPath}" to.`};let s;try{s=JSON.parse(i)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}let a=Mh(s,r.bodyPath,r.bodyValue);if(!a.ok)return{ok:false,error:`Refused: ${a.error}`};r.bodyPatch=a.patch,delete r.bodyPath,delete r.bodyValue}if(r&&dr(r.bodyPatch)&&r.body==null){let i=t?.body??(typeof r.id=="string"?_.getState().rules.find(s=>s.id===r.id)?.body:void 0);if(typeof i!="string")return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."};if(r.force!==true){let s;try{let l=Hh(JSON.parse(i),r.bodyPatch);s=l.error,l.notes.length&&(r.bodyPatch=l.patch)}catch{}if(s)return{ok:false,error:`Refused: ${s}`};let a=Gh(r,i);if(a.length>0)return{ok:false,error:Nh(a,"response body",Fh(r.bodyPatch,a)),violations:a}}}let o=Jh(e,t);if(!o){let i=e?.fromRequestId;return{ok:false,error:i?`No captured request \`${i}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}let n=_.upsertRule(o);return n?(n.enabled&&_.setEnabled(true),{ok:true,rule:{id:n.id,urlPattern:n.urlPattern,enabled:n.enabled,kind:n.kind,status:n.status,times:n.times,bodySize:n.body?n.body.length:0},...n.times===void 0||n.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${n.id}\`). If you meant only the next one, set times:1.`}:{},...Vo()}):{ok:false,error:"Override rule limit reached."}},setOverrideRuleEnabled:e=>{let t=Ft(e);return t?(_.setRuleEnabled(t,Yr(e,"enabled")),{ok:true,...Vo()}):{ok:false,error:"Missing rule id."}},deleteOverrideRule:e=>{let t=Ft(e);return t?(_.removeRule(t),{ok:true}):{ok:false,error:"Missing rule id."}},clearOverrideRules:()=>(_.clearRules(),{ok:true}),listOverrideRules:()=>_.getState(),getOverrideRuleBody:e=>{let t=Ft(e);if(!t)return null;let r=_.getState().rules.find(o=>o.id===t);return r?{body:r.body??null}:null},getCaptureStatus:()=>{let e=K.getSubscriberCounts().total,t=null,r=null;try{t=Bn(),r=ht()}catch{}let o=null;try{o=rl()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:o,listenerCount:r,eventCount:K.getEvents().length}},debugOverrides:e=>{let t=(e&&typeof e=="object"?e.url:void 0)??"https://example.com/";return{interceptorInstalled:Bn(),listenerCount:ht(),engine:ja(t,"GET"),store:{enabled:_.getState().enabled,ruleCount:_.getState().rules.length,rulesVisibleToEngine:_.getRules().length}}}}};D();var tp=new Set(["content-length","host","connection","accept-encoding"]);function Uo(e){return`'${e.replace(/'/g,"'\\''")}'`}function rp(e){if(e==null)return null;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return null}}function op(e){let t=(e.method||"GET").toUpperCase(),r=rp(e.requestData),o=[];t!=="GET"&&!(t==="POST"&&r!==null)&&o.push(`-X ${t}`);for(let[i,s]of Object.entries(e.requestHeaders||{}))tp.has(i.toLowerCase())||o.push(`-H ${Uo(`${i}: ${s}`)}`);r!==null&&o.push(`--data-raw ${Uo(r)}`);let n=`curl ${Uo(e.url)}`;return o.length===0?n:`${n} \\
|
|
143
|
+
`).length;return`${A} line${A===1?"":"s"}`},[e.body]),x=Di(()=>{let y=(e.body??"").trim();if(!y)return null;try{return JSON.parse(y)}catch{return null}},[e.body]),m=(e.body??"").trim().length>0&&!x,v=e.delayMs??0,d=v>0&&!$i.includes(v),f=!e.alternate&&typeof e.times=="number"&&e.times!==1;return Te(c,{style:M.root,children:[Te(dt,{testID:"buoy-network-editor-scroll",style:M.scroll,contentContainerStyle:M.scrollContent,keyboardShouldPersistTaps:"handled",children:[Te(Vi,{title:"Applies to",summary:P,open:u,onToggle:()=>b(y=>!y),children:[V(Pt,{style:M.input,value:e.urlPattern,onChangeText:y=>l({urlPattern:y}),testID:"buoy-network-override-pattern",accessibilityLabel:"Override URL pattern",placeholder:"https://api.example.com/v1/users*",placeholderTextColor:U.text.muted,autoCapitalize:"none",autoCorrect:false,multiline:true,"sentry-label":"ignore override url pattern"}),Te(c,{style:M.chipRow,children:[V(Mt,{label:"Any",active:!z,onPress:()=>l({methods:void 0})}),Fc.map(y=>V(Mt,{label:y,active:z===y,onPress:()=>l({methods:[y]})},y))]})]}),Te(c,{style:M.outcomeGrid,children:[Wi.map(y=>V($c,{outcome:y,active:I===y.id,onPress:()=>l(y.patch)},y.id)),V(N,{onPress:()=>R("status"),"sentry-label":"ignore custom status",accessibilityLabel:"Custom status code",style:[M.customField,h&&M.customFieldActive],children:V(g,{style:[M.customValue,h&&M.customInputActive],children:h?String(e.status):"Custom"})})]}),L?V(Vi,{title:"Response body",summary:T,open:E,onToggle:()=>C(y=>!y),children:S!==null?Te(ji,{children:[V(Pt,{style:[M.input,M.bodyInput],value:S,onChangeText:O,placeholder:"Paste a new body\u2026",placeholderTextColor:U.text.muted,autoCapitalize:"none",autoCorrect:false,autoFocus:true,multiline:true,"sentry-label":"ignore override body paste"}),Te(c,{style:M.inlineActions,children:[V(N,{onPress:()=>O(null),"sentry-label":"ignore cancel body paste",style:M.textButton,children:V(g,{style:M.textButtonMuted,children:"Cancel"})}),V(N,{onPress:()=>{let y=S.trim();try{l({body:JSON.stringify(JSON.parse(y),null,2)})}catch{l({body:y})}O(null)},disabled:!S.trim(),"sentry-label":"ignore apply body paste",style:M.textButton,children:V(g,{style:[M.textButtonLabel,!S.trim()&&M.textButtonDisabled],children:"Replace"})})]})]}):Te(ji,{children:[x!==null?V(Ai.Provider,{value:{root:x,onChange:y=>l({body:JSON.stringify(y,null,2)})},children:V(Bo,{editable:true,label:"",value:x,defaultExpanded:[""]})}):V(g,{style:M.emptyBody,children:m?"This body isn't JSON, so there's no tree to show.":"No body yet."}),V(N,{onPress:()=>O(""),"sentry-label":"ignore edit all body",style:M.textButton,children:V(g,{style:M.textButtonLabel,children:"Edit all"})})]})}):null,Te(c,{style:M.field,children:[V(g,{style:M.subLabel,children:"Delay"}),Te(c,{style:M.chipRow,children:[$i.map(y=>V(Mt,{label:y===0?"None":`${y/1e3}s`,active:v===y,onPress:()=>l({delayMs:y})},y)),V(N,{onPress:()=>R("delay"),"sentry-label":"ignore custom delay",accessibilityLabel:"Custom delay in seconds",style:[M.customField,d&&M.customFieldActive],children:V(g,{style:[M.customValue,d&&M.customInputActive],children:d?`${v/1e3}s`:"Custom"})})]})]}),Te(c,{style:M.field,children:[V(g,{style:M.subLabel,children:"Fires"}),V(g,{style:M.subHint,children:"A limited rule switches itself off once it's used up. Every other alternates forever \u2014 the first request through, the next overridden."}),Te(c,{style:M.chipRow,children:[V(Mt,{label:"Always",active:!e.alternate&&e.times==null,onPress:()=>l({alternate:false,times:null})}),V(Mt,{label:"Once",active:!e.alternate&&e.times===1,onPress:()=>l({alternate:false,times:1})}),V(Mt,{label:"Every other",active:e.alternate===true,onPress:()=>l({alternate:true,times:null})}),V(N,{onPress:()=>{l({alternate:false}),R("times")},"sentry-label":"ignore custom times",accessibilityLabel:"Custom number of times",style:[M.customField,f&&M.customFieldActive],children:V(g,{style:[M.customValue,f&&M.customInputActive],children:f?`${e.times}\xD7`:"Custom"})})]})]})]}),p==="status"?V(Do,{title:"Custom status code",hint:`${Ut}\u2013${_t}`,value:h?e.status:void 0,min:Ut,max:_t,onSubmit:y=>{l({kind:"respond",status:y??void 0,statusText:void 0}),R(null)},onCancel:()=>R(null)}):null,p==="delay"?V(Do,{title:"Custom delay",hint:"Seconds",value:d?v/1e3:void 0,min:0,onSubmit:y=>{l({delayMs:y!=null?Math.round(y*1e3):0}),R(null)},onCancel:()=>R(null)}):null,p==="times"?V(Do,{title:"Fires how many times",hint:"Leave empty for always",value:f?e.times:void 0,min:1,onSubmit:y=>{l({alternate:false,times:y&&y>0?y:null}),R(null)},onCancel:()=>R(null)}):null,Te(c,{style:[M.footer,{paddingBottom:12+a}],children:[V(N,{onPress:o,"sentry-label":"ignore cancel override",testID:"buoy-network-editor-cancel",accessibilityRole:"button",accessibilityLabel:"Cancel",style:[M.footerButton,M.cancelButton],children:V(g,{style:M.cancelText,children:"Cancel"})}),V(N,{onPress:r,disabled:!e.urlPattern.trim(),"sentry-label":"ignore save override",testID:"buoy-network-editor-save",accessibilityRole:"button",accessibilityLabel:n,style:[M.footerButton,M.saveButton,!e.urlPattern.trim()&&M.saveButtonDisabled],children:V(g,{style:M.saveText,children:n})})]})]})}var M=fe.create({root:{flex:1},scroll:{flex:1},scrollContent:{padding:12,paddingBottom:24,gap:4},field:{gap:8,paddingVertical:6},outcomeGrid:{flexDirection:"row",flexWrap:"wrap",gap:6,paddingVertical:10},outcome:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,paddingVertical:9,borderRadius:6,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.card},outcomeLabel:{fontSize:12,fontWeight:"600",color:U.text.primary},outcomeCode:{fontSize:10,fontWeight:"700",color:U.text.muted},disclosure:{borderRadius:6,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.card,overflow:"hidden"},disclosureHeader:{flexDirection:"row",alignItems:"center",gap:6,paddingHorizontal:10,paddingVertical:10},disclosureTitle:{fontSize:12,fontWeight:"600",color:U.text.primary},disclosureSummary:{flex:1,textAlign:"right",fontSize:11,color:U.text.muted},disclosureBody:{paddingHorizontal:10,paddingBottom:10,gap:8},input:{backgroundColor:U.background.input,borderWidth:1,borderColor:U.border.input,borderRadius:6,paddingHorizontal:10,paddingVertical:8,color:U.text.primary,fontSize:12,fontFamily:Ec,minHeight:40},bodyInput:{minHeight:140,textAlignVertical:"top"},chipRow:{flexDirection:"row",flexWrap:"wrap",gap:6},chip:{paddingHorizontal:10,paddingVertical:6,borderRadius:5,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.base},chipActive:{borderColor:U.semantic.info,backgroundColor:`${U.semantic.info}1F`},chipText:{fontSize:11,fontWeight:"600",color:U.text.secondary},chipTextActive:{color:U.semantic.info},customField:{flexDirection:"row",alignItems:"center",paddingHorizontal:8,borderRadius:5,borderWidth:1,borderColor:U.border.default,backgroundColor:U.background.base},customFieldActive:{borderColor:U.semantic.info,backgroundColor:`${U.semantic.info}1F`},customValue:{paddingVertical:6,fontSize:11,fontWeight:"600",color:U.text.secondary},customInputActive:{color:U.semantic.info},subHint:{fontSize:10,lineHeight:14,color:U.text.muted,marginTop:-2},subLabel:{fontSize:10,fontWeight:"700",letterSpacing:.6,color:U.text.muted,textTransform:"uppercase"},textButton:{alignSelf:"flex-start",paddingVertical:4},textButtonLabel:{fontSize:11,fontWeight:"600",color:U.semantic.info},textButtonMuted:{fontSize:11,fontWeight:"600",color:U.text.secondary},textButtonDisabled:{opacity:.4},inlineActions:{flexDirection:"row",alignItems:"center",justifyContent:"space-between"},emptyBody:{fontSize:11,color:U.text.muted,paddingVertical:6},footer:{flexDirection:"row",gap:8,padding:12,borderTopWidth:1,borderTopColor:U.border.default,backgroundColor:U.background.base},footerButton:{flex:1,paddingVertical:11,borderRadius:6,alignItems:"center",borderWidth:1},cancelButton:{borderColor:U.border.default,backgroundColor:U.background.card},cancelText:{fontSize:12,fontWeight:"600",color:U.text.secondary},saveButton:{borderColor:U.semantic.info,backgroundColor:`${U.semantic.info}22`},saveButtonDisabled:{opacity:.4},saveText:{fontSize:12,fontWeight:"700",color:U.semantic.info}});import{jsx as de,jsxs as Rt}from"react/jsx-runtime";function Vc(){return{enabled:true,urlPattern:"",kind:"respond",status:500,body:"",times:null}}function Uc(e){let{id:t,hits:r,seen:o,createdAt:n,...i}=e;return i}function _c(e){let t=e.urlPattern,r=t.indexOf("://");if(r===-1)return t;let o=t.indexOf("/",r+3);return o===-1?t.slice(r+3):t.slice(o)}function Xc(e){let t=[];return e.delayMs&&t.push(`${e.delayMs/1e3}s delay`),e.alternate?t.push("every other"):e.times===1?t.push("once"):typeof e.times=="number"&&t.push(`${e.times}\xD7`),t.join(" \xB7 ")}function Jc(e){if(e.kind==="fail")return Y.semantic.error;if(e.kind==="delay")return Y.semantic.info;let t=e.status??200;return t>=200&&t<300?Y.semantic.success:t>=300&&t<400?Y.semantic.info:Y.semantic.error}function Gc({rule:e,spent:t,onEdit:r,onDelete:o}){let n=e.enabled&&!t,i=Jc(e),s=Xc(e),a=e.methods?.length?e.methods.join("/"):"ANY";return Rt(bc,{onPress:r,style:ie.cardWrapper,contentStyle:[ie.card,{borderLeftColor:n?i:"transparent"}],children:[de(Sc,{method:a,size:"small"}),Rt(c,{style:ie.cardMiddle,children:[de(g,{style:[ie.urlText,!n&&ie.urlTextOff],numberOfLines:2,children:_c(e)}),s?de(g,{style:ie.extrasText,children:s}):null]}),e.hits>0?de(g,{style:ie.rowHits,children:e.hits}):null,e.kind==="fail"?Rt(c,{style:ie.failBadge,children:[de(mc,{size:10,color:Y.semantic.error}),de(g,{style:ie.failText,children:e.failKind==="timeout"?"TIMEOUT":"OFFLINE"})]}):de(g,{style:[ie.statusText,{color:i}],children:e.kind==="delay"?"PASS":String(e.status??200)}),de(N,{onPress:o,"sentry-label":"ignore delete override rule",testID:"buoy-network-rule-delete",accessibilityRole:"button",accessibilityLabel:"Delete rule",hitSlop:{top:8,bottom:8,left:4,right:4},style:ie.rowDelete,children:de(wc,{size:13,color:Y.text.muted})})]})}function Kc(e){return e.visible?de(Yc,{...e}):null}function Yc({isPro:e,onUpgradePress:t,pendingDraft:r,onPendingConsumed:o,backHandlerRef:n,applySafeAreaInset:i}){let s=Tc("network.overrideRules"),a=e?tt:s,{enabled:l,autoPaused:u,rules:b,activeCount:E,setEnabled:C,upsertRule:S,setRuleEnabled:O,removeRule:p,isRuleSpent:R}=Ar(),[I,h]=gc(null);Mr(()=>{_.noteHealthyLaunch()},[]),Mr(()=>{if(n)return n.current=I?()=>(h(null),true):null,()=>{n.current=null}},[n,I]);let L=fc(m=>{_.fetchRuleBody(m).then(v=>{v!=null&&h(d=>d?.id===m?{...d,draft:{...d.draft,body:v,bodyOmitted:void 0}}:d)})},[]);Mr(()=>{if(!r)return;let{id:m,...v}=r;h({id:m,draft:v}),m&&v.bodyOmitted&&L(m),o?.()},[r,o,L]),Mr(()=>{I?.id&&(b.some(m=>m.id===I.id)||h(null))},[I?.id,b]);let z=m=>{h({id:m.id,draft:Uc(m)}),m.bodyOmitted&&L(m.id)},P=m=>{b.filter(v=>v.enabled&&!R(v)).length<=a||b.filter(v=>v.enabled&&!R(v)&&v.id!==m).forEach(v=>O(v.id,false))},T=()=>{if(!I)return;let m={...I.draft,enabled:true,urlPattern:I.draft.urlPattern.trim()};if(!m.urlPattern)return;let v=S({...m,id:I.id});P(v?.id??I.id),C(true),h(null)};if(I)return de(Wc,{draft:I.draft,onChange:m=>h({...I,draft:m}),onSave:T,onCancel:()=>h(null),saveLabel:I.id?"Save":"Add",applySafeAreaInset:i});let x=b.length>0;return Rt(c,{style:ie.root,children:[x?Rt(c,{style:[ie.bar,l&&E>0&&ie.barOn],children:[l&&E>0?de(yc,{size:12,color:Y.semantic.warning}):null,de(g,{style:[ie.barText,l&&E>0&&ie.barTextOn],numberOfLines:2,children:u?"Overrides paused \u2014 they'd been on for 3 launches":l&&E>0?`${E} override${E===1?" is":"s are"} on`:"Overrides are off"}),de(N,{onPress:()=>C(!(l&&E>0)),"sentry-label":"ignore toggle overrides master",testID:"buoy-network-overrides-master",accessibilityRole:"button",style:ie.barButton,children:de(g,{style:ie.barButtonText,children:l&&E>0?"Turn all off":u?"Turn back on":"Turn on"})})]}):null,Rt(c,{style:ie.listHeader,children:[de(g,{style:ie.listHeaderText,children:x?`${b.length} rule${b.length===1?"":"s"}`:""}),de(N,{onPress:()=>h({draft:Vc()}),"sentry-label":"ignore new override rule",accessibilityLabel:"New override rule",style:ie.newButton,children:de(xc,{size:14,color:Y.semantic.info})})]}),x?Rt(dt,{style:ie.list,contentContainerStyle:ie.listContent,keyboardShouldPersistTaps:"handled",children:[b.map(m=>de(Gc,{rule:m,spent:R(m),onEdit:()=>z(m),onDelete:()=>p(m.id)},m.id)),a<tt?de(g,{style:ie.footNote,children:`Your plan: ${a} override at a time. Pro: up to ${tt}.`}):null]}):de(c,{style:ie.emptyWrap,children:de(vc,{otto:"empty",iconSize:32,title:"Nothing overridden",description:"Open any request and tap Override, or + to write a rule."})})]})}var ie=fe.create({root:{flex:1},bar:{flexDirection:"row",alignItems:"center",gap:8,paddingHorizontal:12,paddingVertical:10,borderBottomWidth:1,borderBottomColor:Y.border.default,backgroundColor:Y.background.card},barOn:{borderBottomColor:Y.semantic.warning+"44",backgroundColor:Y.semantic.warningBackground},barText:{flex:1,fontSize:12,fontWeight:"600",color:Y.text.secondary},barTextOn:{color:Y.semantic.warning},barButton:{paddingHorizontal:10,paddingVertical:6,borderRadius:5,borderWidth:1,borderColor:Y.border.hover,backgroundColor:Y.background.base},barButtonText:{fontSize:11,fontWeight:"700",color:Y.text.primary},listHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingTop:10,paddingBottom:4},listHeaderText:{fontSize:10,fontWeight:"700",letterSpacing:.6,color:Y.text.muted,textTransform:"uppercase"},newButton:{padding:6,borderRadius:5,borderWidth:1,borderColor:Y.border.default,backgroundColor:Y.background.card},emptyWrap:{flex:1,justifyContent:"center"},list:{flex:1},listContent:{padding:10,gap:6},cardWrapper:{marginHorizontal:0,marginVertical:0},card:{flexDirection:"row",alignItems:"center",gap:8,borderLeftWidth:3,borderLeftColor:"transparent"},cardMiddle:{flex:1},urlText:{fontSize:12,color:Y.text.primary,lineHeight:16,fontFamily:Cc},urlTextOff:{color:Y.text.muted},extrasText:{fontSize:10,color:Y.text.secondary,marginTop:2},statusText:{fontSize:11,fontWeight:"600"},failBadge:{flexDirection:"row",alignItems:"center",gap:2,paddingHorizontal:4,paddingVertical:1,backgroundColor:Y.semantic.error+"26",borderRadius:3},failText:{fontSize:10,color:Y.semantic.error,fontWeight:"600"},rowHits:{fontSize:11,fontWeight:"700",color:Y.semantic.warning},rowDelete:{padding:5,borderRadius:5,borderWidth:1,borderColor:Y.border.default,backgroundColor:Y.background.base},footNote:{fontSize:10,lineHeight:14,color:Y.text.muted,paddingHorizontal:4,paddingTop:8}});D();ce();import{FlaskConical as Zc,night as kt}from"@buoy-gg/shared-ui/web";import{jsx as zo,jsxs as Qc}from"react/jsx-runtime";function eh({onPress:e}){let{activeCount:t}=Ar(),r=t>0;return Qc(N,{onPress:e,"sentry-label":"ignore open overrides",testID:"buoy-network-overrides",accessibilityRole:"button",style:[Ur.button,r&&Ur.buttonActive],accessibilityLabel:r?`Response overrides \u2014 ${t} active`:"Response overrides",children:[zo(Zc,{size:14,color:r?kt.color.warning:kt.color.textSecondary}),r?zo(c,{style:Ur.badge,children:zo(g,{style:Ur.badgeText,children:t})}):null]})}var Ur=fe.create({button:{width:32,height:32,borderRadius:8,alignItems:"center",justifyContent:"center",backgroundColor:kt.color.buttonSurface,borderWidth:1,borderColor:kt.color.border},buttonActive:{backgroundColor:kt.color.warningSoft,borderColor:kt.color.warning+"77"},badge:{position:"absolute",top:1,right:1,minWidth:12,height:12,borderRadius:6,paddingHorizontal:3,alignItems:"center",justifyContent:"center",backgroundColor:kt.color.warning},badgeText:{fontSize:8,fontWeight:"800",color:"#000000"}});D();ce();import{night as Nt}from"@buoy-gg/shared-ui/web";D();function th(e){let t=e.indexOf("?");return t===-1?e:`${e.slice(0,t)}*`}function rh(e){if(e==null)return"";if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return""}}function Ao(e){return{enabled:true,name:void 0,urlPattern:th(e.url),methods:[String(e.method||"GET").toUpperCase()],kind:"respond",status:e.status&&e.status>=200?e.status:200,statusText:e.statusText,body:rh(e.responseData),times:null}}import{jsx as Ui}from"react/jsx-runtime";function oh({onOpen:e}){let t=Ro(),{rules:r,isRuleSpent:o}=Ar(),n=t?K.getEvents().find(a=>a.id===t)??se.getEventById(t):null,i=n?r.find(a=>a.enabled&&!o(a)&&lo(a,n.url,String(n.method||"GET")))??null:null,s=i!==null;return Ui(N,{onPress:()=>{if(n){if(i){let{id:a,hits:l,seen:u,createdAt:b,...E}=i;e(E,a);return}e(Ao(n))}},"sentry-label":"ignore open overrides",testID:"buoy-network-override-request",accessibilityRole:"button",accessibilityLabel:s?"Edit the override on this request":"Override this request",style:[_r.button,s&&_r.buttonActive],children:Ui(g,{style:[_r.label,s&&_r.labelActive],children:"Override"})})}var _r=fe.create({button:{paddingHorizontal:10,paddingVertical:6,borderRadius:8,borderWidth:1,borderColor:Nt.color.border,backgroundColor:Nt.color.buttonSurface},buttonActive:{borderColor:Nt.color.warning+"77",backgroundColor:Nt.color.warningSoft},label:{fontSize:11,fontWeight:"700",color:Nt.color.accent},labelActive:{color:Nt.color.warning}});D();ce();import{absoluteFill as _i,night as at}from"@buoy-gg/shared-ui/web";import{jsx as Ze,jsxs as Xr}from"react/jsx-runtime";function nh({onPress:e,isOpen:t,hasIndicator:r}){return Xr(N,{onPress:e,"sentry-label":"ignore toggle header menu",testID:"buoy-network-menu",accessibilityRole:"button",accessibilityLabel:t?"Close menu":"More actions",style:[xe.button,t&&xe.buttonOpen],children:[Xr(c,{style:xe.dots,children:[Ze(c,{style:[xe.dot,t&&xe.dotOpen]}),Ze(c,{style:[xe.dot,t&&xe.dotOpen]}),Ze(c,{style:[xe.dot,t&&xe.dotOpen]})]}),r?Ze(c,{style:xe.indicator}):null]})}function ih({onClose:e,children:t}){return Xr(c,{style:xe.overlay,children:[Ze(N,{style:xe.backdrop,activeOpacity:1,onPress:e,"sentry-label":"ignore dismiss header menu"}),Ze(c,{style:xe.panel,children:t})]})}function Ho({icon:e,label:t,detail:r,testID:o,onPress:n}){return Xr(N,{onPress:n,"sentry-label":"ignore header menu item",testID:o,accessibilityRole:"button",accessibilityLabel:t,style:xe.item,children:[Ze(c,{style:xe.itemIcon,children:e}),Ze(g,{style:xe.itemLabel,children:t}),r?Ze(g,{style:xe.itemDetail,children:r}):null]})}var xe=fe.create({button:{width:32,height:32,borderRadius:8,alignItems:"center",justifyContent:"center"},buttonOpen:{backgroundColor:at.color.surfaceElevated},dots:{flexDirection:"column",gap:2.5,alignItems:"center"},dot:{width:3,height:3,borderRadius:2,backgroundColor:at.color.textSecondary},dotOpen:{backgroundColor:at.color.text},indicator:{position:"absolute",top:6,right:8,width:6,height:6,borderRadius:3,backgroundColor:at.color.accent},overlay:{..._i,zIndex:50},backdrop:{..._i,backgroundColor:"rgba(0,0,0,0.5)"},panel:{position:"absolute",top:6,right:8,minWidth:196,paddingVertical:4,borderRadius:10,borderWidth:1,borderColor:at.color.border,backgroundColor:at.color.surface},item:{flexDirection:"row",alignItems:"center",gap:10,paddingHorizontal:12,paddingVertical:11},itemIcon:{width:16,alignItems:"center"},itemLabel:{flex:1,fontSize:13,fontWeight:"600",color:at.color.text},itemDetail:{fontSize:11,color:at.color.textTertiary}});D();import{memo as sh,useEffect as ah,useMemo as lh}from"react";import{EventStepperFooter as dh,useLimit as uh}from"@buoy-gg/shared-ui/web";import{jsx as ch}from"react/jsx-runtime";var hh=()=>Ve.step(-1),ph=()=>Ve.step(1),fh=sh(function({paused:e,filter:t,ignoredPatterns:r,isPro:o,fromSaved:n,savedSearch:i,applySafeAreaInset:s}){let{visibleEvents:a}=sr({filter:t,ignoredPatterns:r,paused:e,isPro:o}),{pinnedEvents:l,pinnedLiveIds:u,savedRecords:b}=Ot(),E=uh("network.saved"),C=lh(()=>{if(n)return Bi(b,E,i).events;let{pinned:p,rest:R}=Eo(a,l,u);return p.length===0?R:[...p,...R]},[n,b,i,o,a,l,u]);ah(()=>{Ve.setIds(eu(C))},[C]);let{index:S,total:O}=ou();return S<0?null:ch(dh,{currentIndex:S,totalItems:O,itemLabel:"Request",applySafeAreaInset:s,onPrevious:hh,onNext:ph,variant:"night"})});D();import{useEffect as gh,useState as mh}from"react";function yh(e){return K.getEvents().find(t=>t.id===e)??se.getEventById(e)}function Xi(e,t={}){let{paused:r=false}=t,[o,n]=mh(null);return gh(()=>{if(!(!e||r))return K.subscribeToEvents(i=>{let s=i.find(a=>a.id===e);s&&n(a=>a&&a.id===e&&a.event===s?a:{id:e,event:s})})},[e,r]),e?o&&o.id===e?o.event:yh(e):null}import{Fragment as bh,jsx as j,jsxs as Me}from"react/jsx-runtime";function vh({visible:e,paused:t,ignoredPatternValues:r,onTogglePattern:o,isPro:n,filter:i,ignoredPatterns:s,fromSaved:a,savedSearch:l,applySafeAreaInset:u}){let b=Ro(),E=ru(),C=b!=null&&b===E,S=Xi(b,{paused:t||!e});return mt(()=>{e&&S&&C&&Ve.reportRendered(S.id)},[e,S,C]),e?Me(c,{style:It.detailRoot,children:[S?j(ri,{event:S,ignoredPatterns:r,onTogglePattern:o,showBodies:C}):j(c,{style:It.detailBodyFallback}),j(fh,{paused:t,filter:i,ignoredPatterns:s,isPro:n,fromSaved:a,savedSearch:l,applySafeAreaInset:u})]}):null}function Sh({visible:e,paused:t,isPro:r,filter:o,onFilterChange:n,ignoredPatterns:i,onRemovePattern:s,onAddPattern:a,onTogglePatternMode:l}){let{events:u}=sr({filter:o,ignoredPatterns:i,paused:t,visible:e,isPro:r});return e?j(Nl,{events:u,filter:o,onFilterChange:n,ignoredPatterns:i,onRemovePattern:s,onAddPattern:a,onTogglePatternMode:l}):null}function xh({visible:e,paused:t,isPro:r,filter:o,ignoredPatterns:n,settings:i,onSettingsChange:s}){let{events:a}=sr({filter:o,ignoredPatterns:n,paused:t,visible:e,isPro:r});return e?j(Id,{settings:i,onSettingsChange:s,events:a}):null}function Ji({visible:e,onClose:t,onBack:r,onMinimize:o,enableSharedModalDimensions:n=false,inline:i=false,paused:s,onPausedChange:a,remoteConditions:l}){let{isPro:u}=wl(),[b,E]=me(false),C=s!=null&&a!=null,S=C?s:b,O=Z=>{let De=typeof Z=="function"?Z(S):Z;C?a(De):E(De)},[p,R]=me({}),I=tu(),[h,L]=me(false),[z,P]=me(false),[T,x]=me(false),[m,v]=me(false),[d,f]=me(0),[y]=me(cl);mt(()=>{y.update(l)},[y,l]),mt(()=>()=>y.update(void 0),[y]);let A=true,[ae,te]=me(null),[Q,G]=me("filters"),[H,W]=me(""),[F,oe]=me(false),pe=wr(false),[et,lt]=me(""),ns=wr(null),{patterns:Et,values:is,add:ss,remove:as,toggle:ls,toggleMode:ds}=Rl(),[jt,_o]=me(wd),Zr=wr(false),[Qr,eo]=me(false),[Lt,us]=me("export"),$t=Z=>{us(Z),eo(true)};mt(()=>{Qr&&u&&eo(false)},[Qr,u]),mt(()=>{if(!e||Zr.current)return;(async()=>{try{let Z=await Fn.getItem(Tr.network.copyOptions());if(Z){let De=JSON.parse(Z);_o(De)}}catch{}finally{Zr.current=true}})()},[e]),mt(()=>{if(!Zr.current)return;(async()=>{try{await Fn.setItem(Tr.network.copyOptions(),JSON.stringify(jt))}catch{}})()},[jt]);let cs=()=>{Ve.clear()},Xo=go(Z=>{Ve.select(Z.id)},[]),hs=go((Z,De)=>{te(De?{...Z,id:De}:Z),x(true),Ve.clear()},[]),ps=go(()=>te(null),[]),Jo=wr(null),Go=Z=>{W(Z),R(De=>({...De,searchText:Z}))},fs=Z=>{R(De=>({...De,status:De.status===Z?void 0:Z}))},[Ko,gs]=me("bottomSheet"),ms=Z=>{gs(Z)};mt(()=>{F&&requestAnimationFrame(()=>{ns.current?.focus()})},[F]);let Yo=()=>h?Me(ge,{children:[j(ge.Navigation,{onBack:()=>L(false)}),j(ge.Content,{title:"",noMargin:true,children:j(xl,{size:"sm",tabs:[{key:"filters",label:"Filters"},{key:"copy",label:"Copy"}],activeKey:Q,onChange:Z=>G(Z)})})]}):I?Me(ge,{children:[j(ge.Navigation,{onBack:cs}),j(ge.Content,{title:"Request Details",centered:true}),Me(ge.Actions,{children:[A?j(oh,{onOpen:hs}):null,j(ki,{isPro:u,onUpgradePress:()=>$t("saved")})]})]}):T&&A?Me(ge,{children:[j(ge.Navigation,{onBack:()=>{Jo.current?.()||(x(false),te(null))}}),j(ge.Content,{title:"Response Overrides",centered:true})]}):z?Me(ge,{children:[j(ge.Navigation,{onBack:()=>P(false)}),j(ge.Content,{title:"Saved Requests",centered:true})]}):Me(ge,{children:[r&&j(ge.Navigation,{onBack:r}),j(ge.Content,{title:"",children:F?j(ge.Search,{value:H,onChangeText:Go,onCancel:()=>{Go(""),oe(false)},onDismiss:()=>oe(false),dismissOnBlur:true,clearOnlyWhenText:true,placeholder:"Search URL, method, operation, error...",accessibilityLabel:"Search network requests",iconSize:14,testID:"buoy-network-search-input",clearTestID:"buoy-network-search-clear",inputProps:{"sentry-label":"ignore network search header"}}):j(uu,{activeStatus:p.status,onToggleStatus:fs,ignoredPatterns:Et,paused:S})}),Me(ge.Actions,{children:[j(N,{"sentry-label":"ignore open search",testID:"buoy-network-search-open",accessibilityLabel:"Open search",accessibilityRole:"button",onPress:()=>oe(true),style:It.headerActionButton,children:j(gl,{size:14,color:Ke.color.textSecondary})}),A?j(eh,{onPress:()=>x(true)}):null,j(Cl,{isEnabled:!S,onToggle:()=>O(Z=>!Z),accessibilityLabel:S?"Resume network capture":"Pause network capture",testID:"buoy-network-power"}),j(cu,{paused:S}),j(nh,{onPress:()=>v(Z=>!Z),isOpen:m,hasIndicator:to})]})]}),to=!!(p.status||p.method||p.contentType),ys=n?Tr.modal.root():Tr.network.modal();if(!e)return null;let bs=I||!h,Zo=Me(bh,{children:[Me(c,{style:It.container,children:[j(vh,{visible:I,paused:S,ignoredPatternValues:is,onTogglePattern:ls,isPro:u,filter:p,ignoredPatterns:Et,fromSaved:z,savedSearch:et,applySafeAreaInset:!i&&Ko==="bottomSheet"}),j(Sh,{visible:h&&Q==="filters"&&!I,paused:S,isPro:u,filter:p,onFilterChange:R,ignoredPatterns:Et,onRemovePattern:as,onAddPattern:ss,onTogglePatternMode:ds}),j(xh,{visible:h&&Q==="copy"&&!I,paused:S,isPro:u,filter:p,ignoredPatterns:Et,settings:jt,onSettingsChange:_o}),j(Kc,{visible:A&&T&&!I&&!h,isPro:u,onUpgradePress:()=>$t("overrides"),pendingDraft:ae,onPendingConsumed:ps,backHandlerRef:Jo,applySafeAreaInset:!i&&Ko==="bottomSheet"}),j(Oi,{visible:z&&!I&&!h&&!(T&&A),isPro:u,copySettings:jt,search:et,onSearchChange:lt,onEventPress:Xo,onUpgradePress:()=>$t("saved")}),j(oc,{visible:!I&&!h&&!z&&!(T&&A),paused:S,filter:p,ignoredPatterns:Et,isPro:u,searchText:H,onEventPress:Xo,onUpgradePress:()=>$t("export")})]}),m?Me(ih,{onClose:()=>v(false),children:[j(Ho,{icon:j(ml,{size:14,color:Ke.color.textSecondary}),label:"Network throttling",testID:"buoy-network-menu-throttling",onPress:()=>{v(false),fl(l?y:void 0),i||f(Z=>Z+1)}}),j(Ho,{icon:j(yl,{size:14,color:to?Ke.color.accent:Ke.color.textSecondary}),label:"Filters",detail:to?"Active":void 0,onPress:()=>{v(false),G("filters"),L(true)}}),j(Ho,{icon:j(bl,{size:14,color:Ke.color.textSecondary}),label:"Saved requests",onPress:()=>{v(false),P(true)}}),j(c,{style:It.menuCopyRow,children:j(pu,{isPro:u,filter:p,ignoredPatterns:Et,copySettings:jt,paused:S,onUpgradePress:()=>{v(false),$t("export")},label:"Copy requests"})})]}):null,j(Tl,{visible:Qr,onClose:()=>eo(false),featureName:Lt==="saved"?"Saved Requests":Lt==="overrides"?"Response Overrides":"Network Export",description:Lt==="saved"?"Keep the requests that matter. Saved requests survive Clear, app restarts, and the 500-request history cap.":Lt==="overrides"?"Force any endpoint to fail, stall or return something else \u2014 no backend changes, no code changes. Free keeps one active rule.":"Export network requests to share with your team, debug APIs, or feed into AI tools.",benefits:Lt==="overrides"?[`Run ${tt} rules at once (free keeps ${wn})`,"Force a 500, a 401 or an empty list in one tap","Simulate offline, timeouts and slow connections","Rules survive an app reload, so you can test the boot path"]:Lt==="saved"?[`Save up to ${nt} requests (free keeps ${fi})`,"Failed requests stay put through a Clear","Snapshots survive an app restart","Export saved requests to teammates or AI assistants"]:["Export to JSON, Markdown, or plain text","Customizable copy presets (URLs only, LLM-ready, full data)","Share request details with teammates","Feed network data directly to AI assistants"]})]});return i?Me(c,{style:It.inlineRoot,children:[j(c,{style:It.inlineHeader,...kl,children:Yo()}),Zo]}):j(vl,{visible:e,onClose:t,onMinimize:o,minimizeRequest:d,persistenceKey:ys,variant:"night",header:{showToggleButton:true,customContent:Yo()},onModeChange:ms,enablePersistence:true,initialMode:"bottomSheet",enableGlitchEffects:true,disableScrollWrapper:bs,styles:{},children:Zo})}var It=fe.create({container:{flex:1,backgroundColor:"transparent"},detailRoot:{flex:1,minHeight:0},detailBodyFallback:{flex:1},inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:Sl.border.default,backgroundColor:"transparent"},menuCopyRow:{paddingHorizontal:6},headerActionButton:{width:32,height:32,borderRadius:8,backgroundColor:Ke.color.buttonSurface,borderWidth:1,borderColor:Ke.color.border,alignItems:"center",justifyContent:"center"},activeFilterButton:{backgroundColor:Ke.color.accentSoft,borderColor:Ke.color.accentBorderStrong}});function Gi(e){return j(bo,{children:j(Ji,{...e})})}function wh(e={}){return j(bo,{children:j(Ji,{...e,inline:true,visible:true,onClose:Th})})}var Th=()=>{};import{jsx as Ch}from"react/jsx-runtime";var Ki=typeof navigator<"u"&&navigator.product==="ReactNative";Ki&&_.ensureLoaded();Ki&&typeof Ce<"u"&&Ce&&K.startBootCapture();var Yi=sl({id:"network",name:"NET",description:"Network request logger",slot:"both",icon:({size:e})=>Ch(nl,{size:e}),component:Gi,props:{enableSharedModalDimensions:false}}),Rh=il(Yi,e=>({enableSharedModalDimensions:e.enableSharedModalDimensions??false}));D();function kh(){if(!(typeof navigator<"u"&&navigator.product==="ReactNative")&&(typeof window>"u"||typeof document>"u"))return()=>{};_.ensureLoaded();let e=K.subscribeToEvents(()=>{}),t=false;return()=>{t||(t=true,e())}}D();import{useState as Mo,useEffect as Ih,useCallback as Jr,useMemo as Qe,useRef as Eh}from"react";import{useLimit as Lh,TIER_LIMITS as Ph}from"@buoy-gg/shared-ui/web";var Ff=Ph["network.requests"].free;function qh(e={}){let{isPro:t=false}=e,r=Lh("network.requests"),o=t?1/0:r,[n,i]=Mo([]),[s,a]=Mo({}),[l,u]=Mo(true),b=Eh(null);Ih(()=>(l&&(b.current=K.subscribeToEvents(i)),()=>{b.current&&(b.current(),b.current=null)}),[l]);let E=Jr(()=>{K.clearEvents(),i([])},[]),C=Jr(()=>{u(false)},[]),S=Jr(()=>{u(true)},[]),O=Qe(()=>s.searchText?s.searchText.toLowerCase():null,[s.searchText]),p=Qe(()=>s.method&&s.method.length>0?new Set(s.method):null,[s.method]),R=Qe(()=>s.contentType&&s.contentType.length>0?new Set(s.contentType):null,[s.contentType]),I=Qe(()=>{let d=[...n];if(p&&(d=d.filter(f=>p.has(f.method))),s.status&&s.status!=="all")switch(s.status){case"success":d=d.filter(f=>f.status&&f.status>=200&&f.status<300);break;case"error":d=d.filter(f=>f.error||f.status&&f.status>=400);break;case"pending":d=d.filter(f=>!f.status&&!f.error);break}return O&&(d=d.filter(f=>f.url.toLowerCase().includes(O)||f.method.toLowerCase().includes(O)||f.path?.toLowerCase().includes(O)||f.host?.toLowerCase().includes(O)||f.error&&f.error.toLowerCase().includes(O)||f.operationName&&f.operationName.toLowerCase().includes(O)||Qn(f.graphqlVariables,O))),s.host&&(d=d.filter(f=>f.host===s.host)),R&&(d=d.filter(f=>{let y=f.responseHeaders||f.requestHeaders,A=y?.["content-type"]||y?.["Content-Type"]||"";for(let ae of R)switch(ae){case"JSON":if(A.includes("json"))return true;break;case"XML":if(A.includes("xml"))return true;break;case"HTML":if(A.includes("html"))return true;break;case"TEXT":if(A.includes("text"))return true;break;case"IMAGE":if(A.includes("image"))return true;break;case"VIDEO":if(A.includes("video"))return true;break;case"AUDIO":if(A.includes("audio"))return true;break;case"FORM":if(A.includes("form"))return true;break;case"OTHER":if(!A||!A.includes("json")&&!A.includes("xml")&&!A.includes("html")&&!A.includes("text")&&!A.includes("image")&&!A.includes("video")&&!A.includes("audio")&&!A.includes("form"))return true;break}return false})),d},[n,s,O,p,R]),h=Qe(()=>{let d=new Set;return n.slice(o).forEach(f=>{d.add(f.id)}),d},[n,o]),L=Qe(()=>I.filter(d=>h.has(d.id)),[I,h]),z=L.length>0,P=L.length,T=Jr(d=>h.has(d),[h]),x=Qe(()=>{let d=0,f=0,y=0,A=0,ae=0,te=0,Q=0;for(let H of n)H.status&&H.status>=200&&H.status<300?d++:H.error||H.status&&H.status>=400?f++:!H.status&&!H.error&&y++,A+=H.requestSize||0,ae+=H.responseSize||0,H.duration&&(te+=H.duration,Q++);let G=Q>0?te/Q:0;return{totalRequests:n.length,successfulRequests:d,failedRequests:f,pendingRequests:y,totalDataSent:A,totalDataReceived:ae,averageDuration:Math.round(G)}},[n]),m=Qe(()=>{let d=new Set;for(let f of n)f.host&&d.add(f.host);return Array.from(d)},[n]),v=Qe(()=>{let d=new Set;for(let f of n)d.add(f.method);return Array.from(d)},[n]);return{events:I,allEvents:n,stats:x,filter:s,setFilter:a,clearEvents:E,isCapturing:l,pauseCapturing:C,resumeCapturing:S,hosts:m,methods:v,hasLockedEvents:z,lockedEventCount:P,isEventLocked:T,requestLimit:o,getSubscriberCounts:()=>K.getSubscriberCounts()}}import{useIgnoredPatterns as Bh,ignoredPatternsStore as Oh,urlMatchesIgnoredPattern as Dh,isUrlIgnored as zh}from"@buoy-gg/shared-ui/web";D();import{approxJsonSize as No,isOverWireBudget as Ah}from"@buoy-gg/shared-ui/web";import{expandKeyedArrays as Hh,patchFromPath as Mh,refusalText as Nh,shapeKind as Zi,suggestedPatch as Fh,typedEditViolations as jh}from"@buoy-gg/shared-ui/web";var Fo=16*1024,Gr=1.25*1024*1024;function jo(e,t){return e===void 0?false:(t??0)>Fo?true:Ah(e,Fo)}var Qi=new WeakMap,es=new WeakMap;function $o(e){let t=Qi.get(e);if(t)return t;let r;try{r=Wh(e)}catch{r=$h(e)}return Qi.set(e,r),r}function $h(e){let t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0},r=1024;try{r=No(t,Gr).bytes}catch{}return{event:t,bytes:r}}function Wh(e){let t=jo(e.requestData,e.requestSize),r=jo(e.responseData,e.responseSize),o=ts(e.graphqlVariables),n=rs(e.requestHeaders),i=rs(e.responseHeaders),s=t||r||o!==e.graphqlVariables||n!==e.requestHeaders||i!==e.responseHeaders,a=e;return s&&(a={...e},t&&(a.requestData=void 0,a.requestBodyOmitted=true),r&&(a.responseData=void 0,a.responseBodyOmitted=true),o!==e.graphqlVariables&&(a.graphqlVariables=o),n!==e.requestHeaders&&(a.requestHeaders=n,a.headersOmitted=true),i!==e.responseHeaders&&(a.responseHeaders=i,a.headersOmitted=true)),{event:a,bytes:No(a,Gr).bytes}}function Vh(e){let t=es.get(e);if(t)return t;let{event:r}=$o(e),o={...r};o.requestData!==void 0&&(o.requestData=void 0,o.requestBodyOmitted=true),o.responseData!==void 0&&(o.responseData=void 0,o.responseBodyOmitted=true),o.graphqlVariables!==void 0&&(o.graphqlVariables=ts(o.graphqlVariables,true));let n={event:o,bytes:No(o,Gr).bytes};return es.set(e,n),n}function Uh(e){let t=new Array(e.length),r=0;for(let o=0;o<e.length;o++){let n=$o(e[o]);if(r+n.bytes<=Gr)t[o]=n.event,r+=n.bytes;else{let i=Vh(e[o]);t[o]=i.event,r+=i.bytes}}return t}function ts(e,t=false){if(!e||!t&&!jo(e,void 0))return e;let r={};for(let[o,n]of Object.entries(e))(typeof n=="string"&&n.length<=64||typeof n=="number"||typeof n=="boolean")&&(r[o]=n);return Object.keys(r).length>0?r:void 0}var Wo=64;function rs(e){if(!e)return e;let t=false,r={};for(let[o,n]of Object.entries(e))typeof n=="string"&&(n.length<=Wo?r[o]=n:(r[o]=`${n.slice(0,Wo)}\u2026 [${n.length-Wo} more]`,t=true));return t?r:e}var _h=e=>{let t=false,r=e.rules.map(o=>!o.body||o.body.length<=Fo?o:(t=true,{...o,body:void 0,bodyOmitted:true}));return t?{...e,rules:r}:e},Kr=e=>K.getEventById(e)??se.getEventById(e),Ft=e=>e&&typeof e=="object"?e.id:void 0,Yr=(e,t)=>!!(e&&typeof e=="object"&&e[t]),Vo=()=>Rn()?{}:{active:false,inactiveReason:Fa},Xh=["respond","fail","delay"];function Jh(e,t){if(!e||typeof e!="object")return null;let r=e.rule??e;if(!r||typeof r!="object")return null;let o=r,n=typeof o.urlPattern=="string"&&o.urlPattern.trim()?o.urlPattern.trim():t?.urlPattern??"";if(!n)return null;let i=Xh.includes(o.kind)?o.kind:t?.kind??"respond";return{id:typeof o.id=="string"?o.id:void 0,enabled:o.enabled!==false,name:typeof o.name=="string"?o.name:t?.name,urlPattern:n,methods:Array.isArray(o.methods)?o.methods.filter(s=>typeof s=="string").map(s=>s.toUpperCase()):t?.methods,requireHeader:typeof o.requireHeader=="string"&&o.requireHeader.trim()?o.requireHeader.trim():void 0,kind:i,status:typeof o.status=="number"?o.status:t?.status,statusText:typeof o.statusText=="string"?o.statusText:t?.statusText,headers:o.headers&&typeof o.headers=="object"?o.headers:t?.headers,body:Kh(o,t),failKind:o.failKind==="timeout"?"timeout":void 0,delayMs:typeof o.delayMs=="number"?o.delayMs:void 0,times:typeof o.times=="number"?o.times:null,alternate:o.alternate===true}}var dr=e=>!!e&&typeof e=="object"&&!Array.isArray(e);function os(e,t,r="",o={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t))return t.length>0&&t.length<e.length&&o.shrunk.push({path:r||"(root)",have:e.length,sent:t.length}),t;if(!dr(e)||!dr(t))return t;let n={...e};for(let[i,s]of Object.entries(t)){let a=r?`${r}.${i}`:i;if(i in e){let l=Zi(e[i]),u=Zi(s);(l==="array"||l==="object")&&l!==u&&o.breaks.push({path:a,from:l,to:u}),n[i]=os(e[i],s,a,o)}else n[i]=s}return n}function Gh(e,t){if(e.body!=null||!dr(e.bodyPatch)||typeof t!="string")return[];try{return jh(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function Kh(e,t){if(typeof e.body=="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);let r=t?.body??(typeof e.id=="string"?_.getState().rules.find(o=>o.id===e.id)?.body:void 0);if(dr(e.bodyPatch)&&typeof r=="string")try{return JSON.stringify(os(JSON.parse(r),e.bodyPatch),null,2)}catch{return r}return r}function Yh(e){if(!e||typeof e!="object")return null;let t=e.rule??e;if(!t||typeof t!="object")return null;let r=t.id;if(typeof r!="string")return null;let o=_.getState().rules.find(n=>n.id===r);return o?{...o}:null}function Zh(e){if(!e||typeof e!="object")return null;let t=e.rule??e;if(!t||typeof t!="object")return null;let r=t;if(r.bodyOmitted!==true||typeof r.id!="string")return null;let o=_.getState().rules.find(n=>n.id===r.id);return o?{body:o.body}:null}function Qh(e){if(!e||typeof e!="object")return null;let t=e.fromRequestId;if(typeof t!="string"||!t)return null;let r=Kr(t);return r?Ao(r):null}var ep={dispose:()=>{_.setEnabled(false)},version:6,getSnapshot:()=>(K.ensureInterception(),{conditions:{version:1,runtimeId:ho,profile:gt(),available:ft()},events:Uh(K.getEvents()),overrides:_h(_.getState()),saved:se.getRecords().map(e=>({...e,event:$o(e.event).event}))}),subscribe:e=>{let t=K.subscribeToEvents(e),r=Kt(e),o=se.subscribe(e),n=_.subscribe(e);return()=>{r(),t(),o(),n()}},actions:{getNetworkConditions:()=>({runtimeId:ho,profile:gt(),available:ft()}),setNetworkConditions:e=>{let t=e&&typeof e=="object"?e.profile:void 0;return{runtimeId:ho,profile:Sr(t),available:ft()}},clearEvents:()=>{K.clearEvents()},getEventBody:e=>{let t=Ft(e);if(!t)return null;let r=Kr(t);return r?{url:r.url??null,method:r.method??null,status:r.status??null,override:r.override??null,requestData:r.requestData??null,responseData:r.responseData??null,requestHeaders:r.requestHeaders??null,responseHeaders:r.responseHeaders??null}:null},setPinned:e=>{let t=Ft(e);if(!t)return null;let r=Kr(t);if(!r)return null;let o=Yr(e,"pinned");return Pr(se.getState(),t).pinned===o?{ok:true}:se.togglePin(r)},setSaved:e=>{let t=Ft(e);if(!t)return null;let r=Kr(t);if(!r)return null;let o=Yr(e,"saved");return Pr(se.getState(),t).saved===o?{ok:true}:se.toggleSave(r)},removeSavedRecord:e=>{let t=e&&typeof e=="object"?e.key:void 0;return t?(se.remove(t),{ok:true}):null},clearSavedRequests:()=>(se.clearSaved(),{ok:true}),clearPinnedRequests:()=>(se.clearPinned(),{ok:true}),setOverridesEnabled:e=>(_.setEnabled(Yr(e,"enabled")),{ok:true,enabled:_.getState().enabled,...Vo()}),upsertOverrideRule:e=>{let t=Qh(e)??Zh(e)??Yh(e),r=e?.rule??e;if(r&&typeof r.bodyPath=="string"&&r.body==null){let i=t?.body??(typeof r.id=="string"?_.getState().rules.find(l=>l.id===r.id)?.body:void 0);if(typeof i!="string")return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."};if(r.bodyValue===void 0)return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${r.bodyPath}" to.`};let s;try{s=JSON.parse(i)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}let a=Mh(s,r.bodyPath,r.bodyValue);if(!a.ok)return{ok:false,error:`Refused: ${a.error}`};r.bodyPatch=a.patch,delete r.bodyPath,delete r.bodyValue}if(r&&dr(r.bodyPatch)&&r.body==null){let i=t?.body??(typeof r.id=="string"?_.getState().rules.find(s=>s.id===r.id)?.body:void 0);if(typeof i!="string")return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."};if(r.force!==true){let s;try{let l=Hh(JSON.parse(i),r.bodyPatch);s=l.error,l.notes.length&&(r.bodyPatch=l.patch)}catch{}if(s)return{ok:false,error:`Refused: ${s}`};let a=Gh(r,i);if(a.length>0)return{ok:false,error:Nh(a,"response body",Fh(r.bodyPatch,a)),violations:a}}}let o=Jh(e,t);if(!o){let i=e?.fromRequestId;return{ok:false,error:i?`No captured request \`${i}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}let n=_.upsertRule(o);return n?(n.enabled&&_.setEnabled(true),{ok:true,rule:{id:n.id,urlPattern:n.urlPattern,enabled:n.enabled,kind:n.kind,status:n.status,times:n.times,bodySize:n.body?n.body.length:0},...n.times===void 0||n.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${n.id}\`). If you meant only the next one, set times:1.`}:{},...Vo()}):{ok:false,error:"Override rule limit reached."}},setOverrideRuleEnabled:e=>{let t=Ft(e);return t?(_.setRuleEnabled(t,Yr(e,"enabled")),{ok:true,...Vo()}):{ok:false,error:"Missing rule id."}},deleteOverrideRule:e=>{let t=Ft(e);return t?(_.removeRule(t),{ok:true}):{ok:false,error:"Missing rule id."}},clearOverrideRules:()=>(_.clearRules(),{ok:true}),listOverrideRules:async()=>(await _.ensureLoaded(),_.getState()),getOverrideRuleBody:e=>{let t=Ft(e);if(!t)return null;let r=_.getState().rules.find(o=>o.id===t);return r?{body:r.body??null}:null},getCaptureStatus:()=>{let e=K.getSubscriberCounts().total,t=null,r=null;try{t=Bn(),r=ht()}catch{}let o=null;try{o=rl()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:o,listenerCount:r,eventCount:K.getEvents().length}},debugOverrides:e=>{let t=(e&&typeof e=="object"?e.url:void 0)??"https://example.com/";return{interceptorInstalled:Bn(),listenerCount:ht(),engine:ja(t,"GET"),store:{enabled:_.getState().enabled,ruleCount:_.getState().rules.length,rulesVisibleToEngine:_.getRules().length}}}}};D();var tp=new Set(["content-length","host","connection","accept-encoding"]);function Uo(e){return`'${e.replace(/'/g,"'\\''")}'`}function rp(e){if(e==null)return null;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return null}}function op(e){let t=(e.method||"GET").toUpperCase(),r=rp(e.requestData),o=[];t!=="GET"&&!(t==="POST"&&r!==null)&&o.push(`-X ${t}`);for(let[i,s]of Object.entries(e.requestHeaders||{}))tp.has(i.toLowerCase())||o.push(`-H ${Uo(`${i}: ${s}`)}`);r!==null&&o.push(`--data-raw ${Uo(r)}`);let n=`curl ${Uo(e.url)}`;return o.length===0?n:`${n} \\
|
|
144
144
|
${o.join(` \\
|
|
145
145
|
`)}`}export{Zd as DEFAULT_SETTLE_MS,wn as FREE_TIER_OVERRIDE_LIMIT,fi as FREE_TIER_SAVED_LIMIT,tt as MAX_OVERRIDE_RULES,Lr as MAX_PINNED,nt as MAX_SAVED,Gt as NETWORK_CONDITIONS,od as NetworkBodyResolverProvider,ki as NetworkDetailPinActions,ri as NetworkEventDetailView,zt as NetworkEventItemCompact,Ri as NetworkHeaderBadgesView,Gi as NetworkModal,hu as NetworkSavedButton,Oi as NetworkSavedScreen,wh as NetworkToolView,_t as OVERRIDE_STATUS_MAX,Ut as OVERRIDE_STATUS_MIN,bo as TickProvider,Jt as addNetworkListener,Rh as createNetworkTool,Ao as draftFromEvent,Pr as flagsForEventId,Ye as formatBytes,Ir as formatDuration,Yn as formatHttpStatus,op as generateCurl,gt as getNetworkCondition,Oh as ignoredPatternsStore,zh as isUrlIgnored,K as networkEventStore,yr as networkListener,se as networkSavedStore,Ve as networkSelectionStore,ep as networkSyncAdapter,Yi as networkToolPreset,_ as overrideRulesStore,tl as removeAllNetworkListeners,Sr as setNetworkCondition,Eo as splitPinned,kh as startNetworkCapture,Kt as subscribeNetworkConditions,Dh as urlMatchesIgnoredPattern,Bh as useIgnoredPatterns,Xi as useLiveNetworkEvent,wi as useNetworkBadgeCounts,sr as useNetworkEventList,qh as useNetworkEvents,Ot as useNetworkSaved,vo as useTickEveryMinute};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buoy-gg/network",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.44",
|
|
4
4
|
"description": "In-app network inspector for React Native — requests, responses, timing & errors live, with GraphQL operation parsing. Part of Buoy devtools.",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
],
|
|
35
35
|
"sideEffects": false,
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@buoy-gg/shared-ui": "^7.0.
|
|
37
|
+
"@buoy-gg/shared-ui": "^7.0.44"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"react": "*"
|