@buoy-gg/shared-ui 7.0.77 → 7.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/JsModal.js +1 -1
- package/lib/commonjs/bugCase/capture.js +1 -1
- package/lib/commonjs/bugCase/format.js +1 -1
- package/lib/commonjs/bugCase/index.js +1 -1
- package/lib/commonjs/bugCase/lock.js +1 -1
- package/lib/commonjs/bugCase/recorder.js +1 -1
- package/lib/commonjs/bugCase/scrub.js +1 -1
- package/lib/commonjs/bugCase/steps.js +1 -1
- package/lib/commonjs/bugCase/validate.js +1 -0
- package/lib/commonjs/dataViewer/LiveExplorer.js +1 -1
- package/lib/commonjs/dataViewer/SplitDiffViewer.js +1 -1
- package/lib/commonjs/dataViewer/ThemedSplitView.js +1 -1
- package/lib/commonjs/dataViewer/VirtualizedDataExplorer.js +1 -1
- package/lib/commonjs/dataViewer/flattenTree.js +1 -0
- package/lib/commonjs/dataViewer/liveEntries.js +1 -0
- package/lib/commonjs/history/components/HistoryList.js +1 -1
- package/lib/commonjs/icons/index.js +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/license/BuoyUpgradeSheet.js +1 -1
- package/lib/commonjs/license/FreeAccountPrompt.js +1 -1
- package/lib/commonjs/license/index.js +1 -1
- package/lib/commonjs/settings/components/BubbleSettingsSection.js +1 -1
- package/lib/commonjs/sync/keyedArrays.js +1 -1
- package/lib/commonjs/sync/valuePath.js +1 -1
- package/lib/commonjs/ui/components/ChipStrip.js +1 -1
- package/lib/commonjs/ui/components/DataInspector.js +1 -1
- package/lib/commonjs/ui/components/DetailView.js +1 -1
- package/lib/commonjs/ui/components/DynamicFilterView.js +1 -1
- package/lib/commonjs/ui/components/EntityFilterView.js +1 -1
- package/lib/commonjs/ui/components/EventHistoryViewer/EventHistoryViewer.js +1 -1
- package/lib/commonjs/ui/components/EventHistoryViewer/EventPickerModal.js +1 -1
- package/lib/commonjs/ui/components/WindowControls.js +1 -1
- package/lib/commonjs/ui/floating/FloatingTool.js +1 -1
- package/lib/commonjs/ui/listPresets.js +1 -1
- package/lib/commonjs/utils/index.js +1 -1
- package/lib/commonjs/utils/loadOptionalModule.js +1 -1
- package/lib/commonjs/utils/loadToolModule.js +1 -1
- package/lib/commonjs/utils/minimalSuperJSON.js +1 -1
- package/lib/commonjs/utils/persistentStorage.js +1 -1
- package/lib/commonjs/utils/reloadPlatform.js +1 -1
- package/lib/commonjs/utils/snapshotProviderKit.js +1 -1
- package/lib/module/JsModal.js +1 -1
- package/lib/module/bugCase/capture.js +1 -1
- package/lib/module/bugCase/format.js +2 -2
- package/lib/module/bugCase/index.js +1 -1
- package/lib/module/bugCase/lock.js +1 -1
- package/lib/module/bugCase/recorder.js +1 -1
- package/lib/module/bugCase/scrub.js +1 -1
- package/lib/module/bugCase/steps.js +1 -1
- package/lib/module/bugCase/validate.js +1 -0
- package/lib/module/dataViewer/LiveExplorer.js +1 -1
- package/lib/module/dataViewer/SplitDiffViewer.js +1 -1
- package/lib/module/dataViewer/ThemedSplitView.js +1 -1
- package/lib/module/dataViewer/VirtualizedDataExplorer.js +1 -1
- package/lib/module/dataViewer/flattenTree.js +1 -0
- package/lib/module/dataViewer/liveEntries.js +1 -0
- package/lib/module/history/components/HistoryList.js +1 -1
- package/lib/module/icons/index.js +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/license/BuoyUpgradeSheet.js +1 -1
- package/lib/module/license/FreeAccountPrompt.js +1 -1
- package/lib/module/license/index.js +1 -1
- package/lib/module/settings/components/BubbleSettingsSection.js +1 -1
- package/lib/module/sync/keyedArrays.js +1 -1
- package/lib/module/sync/valuePath.js +1 -1
- package/lib/module/ui/components/ChipStrip.js +1 -1
- package/lib/module/ui/components/DataInspector.js +1 -1
- package/lib/module/ui/components/DetailView.js +1 -1
- package/lib/module/ui/components/DynamicFilterView.js +1 -1
- package/lib/module/ui/components/EntityFilterView.js +1 -1
- package/lib/module/ui/components/EventHistoryViewer/EventHistoryViewer.js +1 -1
- package/lib/module/ui/components/EventHistoryViewer/EventPickerModal.js +1 -1
- package/lib/module/ui/components/WindowControls.js +1 -1
- package/lib/module/ui/floating/FloatingTool.js +1 -1
- package/lib/module/ui/listPresets.js +1 -1
- package/lib/module/utils/index.js +1 -1
- package/lib/module/utils/loadOptionalModule.js +1 -1
- package/lib/module/utils/loadToolModule.js +1 -1
- package/lib/module/utils/minimalSuperJSON.js +1 -1
- package/lib/module/utils/persistentStorage.js +1 -1
- package/lib/module/utils/reloadPlatform.js +1 -1
- package/lib/module/utils/snapshotProviderKit.js +1 -1
- package/lib/typescript/commonjs/JsModal.d.ts +6 -0
- package/lib/typescript/commonjs/JsModal.web.d.ts +2 -0
- package/lib/typescript/commonjs/bugCase/index.d.ts +1 -0
- package/lib/typescript/commonjs/bugCase/recorder.d.ts +1 -0
- package/lib/typescript/commonjs/bugCase/steps.d.ts +6 -0
- package/lib/typescript/commonjs/bugCase/validate.d.ts +14 -0
- package/lib/typescript/commonjs/dataViewer/flattenTree.d.ts +35 -0
- package/lib/typescript/commonjs/dataViewer/liveEntries.d.ts +19 -0
- package/lib/typescript/commonjs/hooks/safe-area-impl.d.ts +1 -1
- package/lib/typescript/commonjs/icons/index.d.ts +1 -0
- package/lib/typescript/commonjs/index.d.ts +2 -2
- package/lib/typescript/commonjs/license/BuoyUpgradeSheet.d.ts +8 -0
- package/lib/typescript/commonjs/license/index.d.ts +1 -1
- package/lib/typescript/commonjs/sync/keyedArrays.d.ts +6 -1
- package/lib/typescript/commonjs/ui/floating/FloatingTool.d.ts +6 -1
- package/lib/typescript/commonjs/ui/listPresets.d.ts +2 -2
- package/lib/typescript/commonjs/utils/index.d.ts +1 -1
- package/lib/typescript/commonjs/utils/minimalSuperJSON.d.ts +4 -2
- package/lib/typescript/commonjs/utils/persistentStorage.d.ts +6 -0
- package/lib/typescript/module/JsModal.d.ts +6 -0
- package/lib/typescript/module/JsModal.web.d.ts +2 -0
- package/lib/typescript/module/bugCase/index.d.ts +1 -0
- package/lib/typescript/module/bugCase/recorder.d.ts +1 -0
- package/lib/typescript/module/bugCase/steps.d.ts +6 -0
- package/lib/typescript/module/bugCase/validate.d.ts +14 -0
- package/lib/typescript/module/dataViewer/flattenTree.d.ts +35 -0
- package/lib/typescript/module/dataViewer/liveEntries.d.ts +19 -0
- package/lib/typescript/module/hooks/safe-area-impl.d.ts +1 -1
- package/lib/typescript/module/icons/index.d.ts +1 -0
- package/lib/typescript/module/index.d.ts +2 -2
- package/lib/typescript/module/license/BuoyUpgradeSheet.d.ts +8 -0
- package/lib/typescript/module/license/index.d.ts +1 -1
- package/lib/typescript/module/sync/keyedArrays.d.ts +6 -1
- package/lib/typescript/module/ui/floating/FloatingTool.d.ts +6 -1
- package/lib/typescript/module/ui/listPresets.d.ts +2 -2
- package/lib/typescript/module/utils/index.d.ts +1 -1
- package/lib/typescript/module/utils/minimalSuperJSON.d.ts +4 -2
- package/lib/typescript/module/utils/persistentStorage.d.ts +6 -0
- package/lib/web/chunks/chunk-36A4T5PL.mjs +1 -0
- package/lib/web/chunks/{chunk-XUYN4NOF.mjs → chunk-5UII72AQ.mjs} +1 -1
- package/lib/web/chunks/chunk-A3N3WVKC.mjs +1 -0
- package/lib/web/chunks/chunk-AVRGPBZK.mjs +6 -0
- package/lib/web/chunks/chunk-JTNYUDJZ.mjs +1 -0
- package/lib/web/chunks/{chunk-BMITMQVB.mjs → chunk-LADTE6U4.mjs} +3 -3
- package/lib/web/chunks/chunk-N5Z7Z2GY.mjs +1 -0
- package/lib/web/chunks/chunk-SAWSKX4E.mjs +6 -0
- package/lib/web/chunks/{chunk-OVTASJUJ.mjs → chunk-SUG6TLF5.mjs} +1 -1
- package/lib/web/chunks/{chunk-GTRVOJUH.mjs → chunk-UVVRCZX5.mjs} +1 -1
- package/lib/web/chunks/chunk-Y7FM4WZ7.mjs +6 -0
- package/lib/web/chunks/chunk-ZRZQZF2T.mjs +15 -0
- package/lib/web/chunks/persistentStorage.web-IBLIV62L.mjs +1 -0
- package/lib/web/dataViewer.mjs +2 -2
- package/lib/web/history.mjs +1 -1
- package/lib/web/index.mjs +6 -6
- package/lib/web/ui.mjs +1 -1
- package/lib/web/utils.mjs +1 -1
- package/package.json +5 -5
- package/lib/web/chunks/chunk-DJD42EPL.mjs +0 -1
- package/lib/web/chunks/chunk-GN75GBYZ.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{getRegisteredToolModule as g}from"./toolModules.js";export function loadToolModule(e){const r=g(e);if(r)return r;try{switch(e){case"@buoy-gg/license":return require("@buoy-gg/license");case"@buoy-gg/storage":return require("@buoy-gg/storage");case"@buoy-gg/network":return require("@buoy-gg/network");case"@buoy-gg/redux":return require("@buoy-gg/redux");case"@buoy-gg/zustand":return require("@buoy-gg/zustand");case"@buoy-gg/jotai":return require("@buoy-gg/jotai");case"@buoy-gg/react-query":return require("@buoy-gg/react-query");case"@buoy-gg/route-events":return require("@buoy-gg/route-events");case"@buoy-gg/highlight-updates":return require("@buoy-gg/highlight-updates");case"@buoy-gg/core":return require("@buoy-gg/core");case"@buoy-gg/events":return require("@buoy-gg/events");case"@buoy-gg/clock":return require("@buoy-gg/clock");case"@buoy-gg/shared-ui":return require("../index");case"@buoy-gg/shared-ui/dataViewer":return require("../dataViewer");default:throw new Error(`Unknown tool module: ${e}`)}}catch(u){throw u}}
|
|
1
|
+
"use strict";import{getRegisteredToolModule as g}from"./toolModules.js";export function loadToolModule(e){const r=g(e);if(r)return r;try{switch(e){case"@buoy-gg/license":return require("@buoy-gg/license");case"@buoy-gg/storage":return require("@buoy-gg/storage");case"@buoy-gg/network":return require("@buoy-gg/network");case"@buoy-gg/redux":return require("@buoy-gg/redux");case"@buoy-gg/zustand":return require("@buoy-gg/zustand");case"@buoy-gg/jotai":return require("@buoy-gg/jotai");case"@buoy-gg/react-query":return require("@buoy-gg/react-query");case"@buoy-gg/route-events":return require("@buoy-gg/route-events");case"@buoy-gg/highlight-updates":return require("@buoy-gg/highlight-updates");case"@buoy-gg/core":return require("@buoy-gg/core");case"@buoy-gg/events":return require("@buoy-gg/events");case"@buoy-gg/memory-leaks":return require("@buoy-gg/memory-leaks");case"@buoy-gg/clock":return require("@buoy-gg/clock");case"@buoy-gg/shared-ui":return require("../index");case"@buoy-gg/shared-ui/dataViewer":return require("../dataViewer");default:throw new Error(`Unknown tool module: ${e}`)}}catch(u){throw u}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const
|
|
1
|
+
"use strict";const T=n=>typeof n==="undefined";const h=n=>{if(typeof n!=="object"||n===null)return false;if(n===Object.prototype)return false;if(Object.getPrototypeOf(n)===null)return true;return Object.getPrototypeOf(n)===Object.prototype};const A=n=>Array.isArray(n);const B=n=>typeof n==="boolean"||n===null||typeof n==="undefined"||typeof n==="number"||typeof n==="string"||typeof n==="symbol";const L=n=>n instanceof Date&&!isNaN(n.valueOf());const w=n=>n instanceof Error;const C=n=>n instanceof RegExp;const O=n=>n instanceof Set;const k=n=>n instanceof Map;const M=n=>typeof n==="bigint";const j=n=>typeof n==="number"&&isNaN(n);const $=n=>n===Infinity||n===-Infinity;const F=n=>n===0&&1/n===-Infinity;const Y=n=>n instanceof URL;const E=n=>ArrayBuffer.isView(n)&&!(n instanceof DataView);function u(n,t){if(!n)throw new Error(`This ${t} value has the wrong shape.`)}const N={Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,Uint8ClampedArray};const R=[{isApplicable:T,annotation:"undefined",transform:()=>null,untransform:()=>void 0},{isApplicable:M,annotation:"bigint",transform:n=>n.toString(),untransform:n=>{u(typeof n==="string"||typeof n==="number","bigint");if(typeof BigInt!=="undefined"){return BigInt(n)}console.error("[Buoy]","BigInt is not supported in this environment");return n}},{isApplicable:L,annotation:"Date",transform:n=>n.toISOString(),untransform:n=>{u(typeof n==="string"||typeof n==="number","Date");const t=new Date(n);u(!Number.isNaN(t.getTime()),"Date");return t}},{isApplicable:w,annotation:"Error",transform:n=>({name:n.name,message:n.message,stack:n.stack,cause:"cause"in n?n.cause:void 0}),untransform:n=>{u(!!n&&typeof n==="object"&&!Array.isArray(n),"Error");const t=new Error(typeof n.message==="string"?n.message:"");if(typeof n.name==="string")t.name=n.name;if(typeof n.stack==="string")t.stack=n.stack;if(n.cause!==void 0){t.cause=n.cause}return t}},{isApplicable:C,annotation:"regexp",transform:n=>""+n,untransform:n=>{u(typeof n==="string","regexp");const t=n.slice(1,n.lastIndexOf("/"));const r=n.slice(n.lastIndexOf("/")+1);return new RegExp(t,r)}},{isApplicable:O,annotation:"set",transform:n=>[...n.values()],untransform:n=>{u(Array.isArray(n),"set");return new Set(n)}},{isApplicable:k,annotation:"map",transform:n=>[...n.entries()],untransform:n=>{u(Array.isArray(n)&&n.every(t=>Array.isArray(t)&&t.length===2),"map");return new Map(n)}},{isApplicable:n=>j(n)||$(n),annotation:"number",transform:n=>{if(j(n))return"NaN";return n>0?"Infinity":"-Infinity"},untransform:n=>{u(typeof n==="string","number");return Number(n)}},{isApplicable:F,annotation:"number",transform:()=>"-0",untransform:()=>-0},{isApplicable:Y,annotation:"URL",transform:n=>n.toString(),untransform:n=>{u(typeof n==="string","URL");return new URL(n)}},{isApplicable:E,annotation:n=>["typed-array",n.constructor.name],transform:n=>[...n],untransform:(n,t)=>{u(Array.isArray(n),"typed-array");const r=Array.isArray(t)?t[1]:"Uint8Array";const e=typeof r==="string"&&Object.prototype.hasOwnProperty.call(N,r)?N[r]:void 0;if(!e){throw new Error(`Unknown typed array: ${r}`)}return new e(n)}}];function b(n){for(const t of R){if(t.isApplicable(n)){const r=typeof t.annotation==="function"?t.annotation(n):t.annotation;return{value:t.transform(n),type:r}}}return void 0}function S(n,t){for(const r of R){const e=typeof r.annotation==="function"?Array.isArray(t)&&t[0]==="typed-array"&&r.isApplicable===E:r.annotation===t;if(e){return r.untransform(n,t)}}throw new Error(`Unknown transformation: ${t}`)}const U=n=>h(n)||A(n)||k(n)||O(n)||w(n);function d(n){return n.replace(/\\/g,"\\\\").replace(/\./g,"\\.")}function x(n,t=[],r=[]){const e=B(n);if(!e&&!U(n)){const s=b(n);return s?{transformedValue:s.value,annotations:{[t.map(String).map(d).join(".")]:s.type}}:{transformedValue:n}}if(!e&&r.indexOf(n)!==-1){return{transformedValue:null}}if(!U(n)){const s=b(n);return s?{transformedValue:s.value,annotations:t.length>0?{[t.map(String).map(d).join(".")]:s.type}:{"":s.type}}:{transformedValue:n}}const o=b(n);const i=o?.value??n;const f=A(i)?[]:{};const a={};if(o){const s=t.length>0?t.map(String).map(d).join("."):"";a[s]=o.type}const c=A(i)?i.map((s,y)=>[y,s]):Object.entries(i);for(const[s,y]of c){const l=String(s);if(l==="__proto__"||l==="constructor"||l==="prototype"){throw new Error(`Detected property ${l}. This is a prototype pollution risk, please remove it from your object.`)}const g=x(y,[...t,s],[...r,n]);f[s]=g.transformedValue;if(g.annotations){Object.assign(a,g.annotations)}}return{transformedValue:f,annotations:Object.keys(a).length>0?a:void 0}}function I(n){if(n==="")return[];const t=[];let r="";for(let e=0;e<n.length;e++){const o=n.charAt(e);if(o==="\\"){const i=n.charAt(e+1);if(i==="\\"){r+="\\";e++;continue}else if(i==="."){r+=".";e++;continue}}if(o==="."){t.push(r);r="";continue}r+=o}t.push(r);return t}function p(n){if(Array.isArray(n))return n.map(p);if(h(n)){const t={};for(const r of Object.keys(n)){Object.defineProperty(t,r,{value:p(n[r]),enumerable:true,writable:true,configurable:true})}return t}return n}const V=new Set(["__proto__","constructor","prototype"]);function D(n){return n.every(t=>typeof t==="number"||!V.has(t))}function m(n,t){return n!==null&&typeof n==="object"&&Object.prototype.hasOwnProperty.call(n,t)}function z(n,t,r){if(t.length===0||!D(t)){return false}let e=n;for(let i=0;i<t.length-1;i++){if(!m(e,t[i]))return false;e=e[t[i]]}const o=t[t.length-1];if(!m(e,o))return false;e[o]=r;return true}function _(n,t){let r=n;for(const e of t){if(!m(r,e)||typeof e==="string"&&V.has(e))return void 0;r=r[e]}return r}function P(n,t){if(!D(t))return false;let r=n;for(const e of t){if(!m(r,e))return false;r=r[e]}return true}export function serialize(n){const t=x(n);const r={json:t.transformedValue};if(t.annotations){r.meta={values:t.annotations}}return r}export function deserialize(n,t={}){const{json:r,meta:e}=n;if(!e?.values){return p(r)}let o=p(r);const i=Object.entries(e.values).map(([f,a])=>({pathString:f,type:a,path:I(f)})).sort((f,a)=>a.path.length-f.path.length);for(const{type:f,path:a}of i){try{if(a.length===0){o=S(o,f)}else{if(!P(o,a))continue;const c=_(o,a);const s=S(c,f);z(o,a,s)}}catch(c){if(!t.skipBadAnnotations)throw c}}return o}export function dropAnnotations(n,t){const r=n.meta?.values;if(!r)return n;const e={};for(const[o,i]of Object.entries(r)){let f;try{const a=I(o);if(a.length>0&&!P(n.json,a))continue;f=_(n.json,a)}catch{continue}if(!t(f,i))e[o]=i}return Object.keys(e).length?{json:n.json,meta:{values:e}}:{json:n.json}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{devToolsStorageKeys as h}from"../storage/devToolsStorageKeys.js";import{notifyStorageWrite as
|
|
1
|
+
"use strict";import{devToolsStorageKeys as h}from"../storage/devToolsStorageKeys.js";import{notifyStorageWrite as A}from"./storageWrites.js";import{hasAsyncStorageNative as b}from"./asyncStorageNative.js";let c=null;let I=null;let w=false;let o=null;let y=null;const n=new Map;function m(){return typeof window!=="undefined"&&window?.localStorage!==void 0}const F="react-buoy";const x=".health-check";function d(){if(!o?.documentDirectory)return null;return`${o.documentDirectory}${F}/`}function B(t){return encodeURIComponent(t.replace(/~/g,"~0").replace(/\//g,"~1"))}function W(t){return decodeURIComponent(t).replace(/~1/g,"/").replace(/~0/g,"~")}function S(t){const e=d();if(!e)return null;return`${e}${B(t)}.json`}function g(){if(o)return o;try{const t=require("expo-file-system/legacy");o=t?.default||t;if(o&&o.documentDirectory){return o}o=null}catch{}try{const t=require("expo-file-system");o=t?.default||t;if(o&&o.documentDirectory){return o}o=null}catch{}return null}function u(){if(y)return y;if(!b())return null;try{const t=require("@react-native-async-storage/async-storage");y=t?.default||t;if(y&&typeof y.getItem==="function"){return y}y=null}catch{}return null}async function E(){const t=g();if(!t||!t.documentDirectory){return false}const e=d();if(!e)return false;const r=`${e}${x}`;try{const a=await t.getInfoAsync(e);if(!a.exists){await t.makeDirectoryAsync(e,{intermediates:true})}const s=`health-check-${Date.now()}`;await t.writeAsStringAsync(r,s);const l=await t.readAsStringAsync(r);if(l!==s){return false}await t.deleteAsync(r,{idempotent:true});return true}catch(a){console.warn("[Buoy]","[React Buoy] FileSystem health check failed:",a);return false}}async function G(){const t=u();if(!t)return;try{const e=await t.getAllKeys();const r=e.filter(l=>l.startsWith(h.base));if(r.length===0){return}const a=await t.multiGet(r);let s=0;for(const[l,K]of a){if(K!==null){await p.setItem(l,K);s++}}void s}catch(e){console.warn("[Buoy]","[React Buoy] Migration failed:",e)}}async function v(t,e){const r=g();if(!r)return false;const a=d();const s=S(t);if(!a||!s)return false;try{const l=await r.getInfoAsync(a);if(!l.exists){await r.makeDirectoryAsync(a,{intermediates:true})}await r.writeAsStringAsync(s,e);return true}catch(l){console.warn("[Buoy]","[React Buoy] FileSystem write failed:",l);return false}}async function R(t,e){const r=u();if(!r){n.set(t,e);return false}try{await r.setItem(t,e);return true}catch{n.set(t,e);return false}}async function D(t,e){if(!m()){n.set(t,e);return false}try{window.localStorage.setItem(t,e);return true}catch{n.set(t,e);return false}}const p={async getItem(t){const e=g();if(!e)return null;const r=S(t);if(!r)return null;try{const a=await e.getInfoAsync(r);if(!a.exists){return null}const s=await e.readAsStringAsync(r);return s}catch{return null}},async setItem(t,e){await v(t,e)},async removeItem(t){const e=g();if(!e)return;const r=S(t);if(!r)return;try{await e.deleteAsync(r,{idempotent:true})}catch{}},async getAllKeys(){const t=g();if(!t)return[];const e=d();if(!e)return[];try{const r=await t.getInfoAsync(e);if(!r.exists)return[];const a=await t.readDirectoryAsync(e);return a.filter(s=>s.endsWith(".json")).map(s=>W(s.replace(".json","")))}catch{return[]}},async multiGet(t){const e=[];for(const r of t){const a=await this.getItem(r);e.push([r,a])}return e},async multiRemove(t){for(const e of t){await this.removeItem(e)}},async clear(){const t=g();if(!t)return;const e=d();if(!e)return;try{await t.deleteAsync(e,{idempotent:true})}catch{}}};const k={async getItem(t){const e=u();if(!e)return n.get(t)??null;try{return await e.getItem(t)}catch{return n.get(t)??null}},async setItem(t,e){await R(t,e)},async removeItem(t){const e=u();n.delete(t);if(!e)return;try{await e.removeItem(t)}catch{}},async getAllKeys(){const t=u();if(!t)return Array.from(n.keys());try{const e=await t.getAllKeys();return e.filter(r=>r.startsWith(h.base))}catch{return Array.from(n.keys())}},async multiGet(t){const e=u();if(!e){return t.map(r=>[r,n.get(r)??null])}try{const r=await e.multiGet(t);return r}catch{return t.map(r=>[r,n.get(r)??null])}},async multiRemove(t){t.forEach(r=>n.delete(r));const e=u();if(!e)return;try{await e.multiRemove(t)}catch{}},async clear(){n.clear();const t=u();if(!t)return;try{const e=await t.getAllKeys();const r=e.filter(a=>a.startsWith(h.base));if(r.length>0){await t.multiRemove(r)}}catch{}}};const C={async getItem(t){if(!m())return n.get(t)??null;try{return window.localStorage.getItem(t)}catch{return n.get(t)??null}},async setItem(t,e){await D(t,e)},async removeItem(t){n.delete(t);if(!m())return;try{window.localStorage.removeItem(t)}catch{}},async getAllKeys(){if(!m())return Array.from(n.keys());try{const t=[];const e=window.localStorage;for(let r=0;r<e.length;r++){const a=e.key(r);if(a&&a.startsWith(h.base)){t.push(a)}}return t}catch{return Array.from(n.keys())}},async multiGet(t){const e=[];for(const r of t){const a=await this.getItem(r);e.push([r,a])}return e},async multiRemove(t){for(const e of t){await this.removeItem(e)}},async clear(){n.clear();if(!m())return;try{const t=await this.getAllKeys();const e=window.localStorage;for(const r of t){e.removeItem(r)}}catch{}}};const $={async getItem(t){return n.get(t)??null},async setItem(t,e){n.set(t,e)},async removeItem(t){n.delete(t)},async getAllKeys(){return Array.from(n.keys())},async multiGet(t){return t.map(e=>[e,n.get(e)??null])},async multiRemove(t){t.forEach(e=>n.delete(e))},async clear(){n.clear()}};async function P(){if(c!==null)return;const t=await E();if(t){const e=await p.getAllKeys();if(e.length===0){await G()}c="filesystem"}else if(m()){c="localstorage"}else{const e=u();if(e){c="asyncstorage";if(!w){w=true;console.warn("[Buoy]","[React Buoy] Using AsyncStorage fallback. Settings may be lost if AsyncStorage is cleared. Install expo-file-system for persistent storage.")}}else{c="memory";if(!w){w=true;console.warn("[Buoy]","[React Buoy] Using in-memory storage. Settings will be lost on app restart.")}}}}function i(){if(!I){I=P()}return I}function f(){switch(c){case"filesystem":return p;case"asyncstorage":return k;case"localstorage":return C;case"memory":default:return $}}export const persistentStorage={async getItem(t){await i();return f().getItem(t)},async setItem(t,e){await i();await f().setItem(t,e);A(t,e)},async removeItem(t){await i();await f().removeItem(t);A(t,null)},async getAllKeys(){await i();return f().getAllKeys()},async multiGet(t){await i();return f().multiGet(t)},async multiRemove(t){await i();return f().multiRemove(t)},async clear(){await i();return f().clear()}};export async function setItemChecked(t,e){await i();let r;switch(c){case"filesystem":r=await v(t,e);break;case"asyncstorage":r=await R(t,e);break;case"localstorage":r=await D(t,e);break;default:await persistentStorage.setItem(t,e);return false}A(t,e);return r}export async function isUsingPersistentStorage(){await i();return c==="filesystem"}export async function getStorageBackendType(){await i();return c??"memory"}export function resetStorageInit(){c=null;I=null;w=false}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function t(){const o=globalThis.expo;if(!o?.modules?.ExpoGo||typeof o.reloadAppAsync!=="function")return null;const
|
|
1
|
+
"use strict";function t(){const o=globalThis.expo;if(!o?.modules?.ExpoGo||typeof o.reloadAppAsync!=="function")return null;const e=o.reloadAppAsync.bind(o);return n=>{void e(n)}}export function loadDevSettings(){const o=t();if(o)return{reload:o};try{const e=require("react-native");const n=e?.DevSettings;if(n&&typeof n.reload==="function"){return n}}catch{}return null}export function loadExpoUpdates(){const o=globalThis.expo?.modules;if(!o?.ExpoUpdates)return null;try{const e=require("expo-updates");if(e&&typeof e.reloadAsync==="function"){return e}}catch{}return null}export function loadBrowserReload(){return null}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";import{boundedDeepEqual as
|
|
1
|
+
"use strict";import{boundedDeepEqual as a,jsonLikelyLargerThan as p}from"../dataViewer/objectDiff.js";export const PREVIEW_ITEM_RENDER_BYTE_LIMIT=256*1024;export function createRestoreScope(t){const n=new Set(t?.excludeKeys??[]);const u=t?.includeKeys?new Set(t.includeKeys):null;let e=0;const o=(r,d)=>{if(r.has(d))return true;const s=d.indexOf("/");return d.startsWith("mmkv:")&&s>5&&r.has(d.slice(0,s))};const i=r=>!o(n,r)&&(!u||o(u,r));return{touch:i,allows(r){if(i(r))return true;e+=1;return false},countExcluded(r){e+=r},get excludedHits(){return e},excludedWarning(r){return e>0?`${e} ${r} excluded by you`:null}}}export function emptyRestoreResult(){return{ok:true,applied:0,skipped:[],warnings:[]}}export function failedRestore(t){return{ok:false,applied:0,skipped:[],warnings:[t]}}export function skippedRestore(t,n){return{ok:false,applied:0,skipped:[{id:t,reason:n}],warnings:[]}}export function classifyPreviewItem(t,n={}){const{key:u,label:e,oldValue:o,newValue:i,inOld:r,inNew:d}=t;if(!d)return{key:u,label:e,verdict:"removed",oldValue:o};if(!r)return{key:u,label:e,verdict:"added",newValue:i};const s=n.equal??a;if(s(o,i))return{key:u,label:e,verdict:"unchanged"};const l=n.tooLarge??(c=>p(c,PREVIEW_ITEM_RENDER_BYTE_LIMIT));if(l(o)||l(i)){return{key:u,label:e,verdict:"too-large",reason:n.tooLargeReason??"value too large to render a diff \u2014 restore still applies it"}}return{key:u,label:e,verdict:"changed",oldValue:o,newValue:i}}export function wontApply(t,n){if(t.verdict==="unchanged")return t;return{...t,verdict:"wont-apply",reason:n}}export function unionKeys(t,n){const u=e=>e===void 0?[]:e instanceof Map?Array.from(e.keys()):Object.keys(e);return new Set([...u(t),...u(n)])}
|
|
@@ -99,6 +99,12 @@ interface JsModalProps {
|
|
|
99
99
|
background?: boolean;
|
|
100
100
|
/** Chrome variant — see {@link ModalVariant}. */
|
|
101
101
|
variant?: ModalVariant;
|
|
102
|
+
/**
|
|
103
|
+
* Lift the bottom sheet above the iOS keyboard. On by default. A body that
|
|
104
|
+
* keeps its own input above the keyboard (Ask Buoy's KeyboardPad) passes
|
|
105
|
+
* false, or it would move twice.
|
|
106
|
+
*/
|
|
107
|
+
avoidKeyboard?: boolean;
|
|
102
108
|
}
|
|
103
109
|
/**
|
|
104
110
|
* JsModal - Ultra-optimized modal component for true 60FPS performance
|
|
@@ -85,6 +85,8 @@ export interface ModalState {
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
export interface JsModalProps {
|
|
88
|
+
/** Native only (lifts the sheet above the iOS keyboard). Accepted here for parity. */
|
|
89
|
+
avoidKeyboard?: boolean;
|
|
88
90
|
visible: boolean;
|
|
89
91
|
onClose: () => void;
|
|
90
92
|
children: ReactNode;
|
|
@@ -5,6 +5,7 @@ export type { BugCaseCrypto, BugCaseHeader, BugCaseLockErrorCode, LockedBugCase
|
|
|
5
5
|
export { bugCaseRecorderStatus, startBugCaseRecorder, stopBugCaseRecorder } from "./recorder";
|
|
6
6
|
export type { BugCaseRecorderStatus } from "./recorder";
|
|
7
7
|
export { formatBugCase, isFailedCall } from "./format";
|
|
8
|
+
export { BugCaseShapeError, validateBugCase } from "./validate";
|
|
8
9
|
export { classifyKey, keyWords, REMOVED_MARK, removedMark, ScrubLimitError, scrubBugCase } from "./scrub";
|
|
9
10
|
export type { ScrubbedItem, ScrubKind, ScrubResult, ScrubRules } from "./scrub";
|
|
10
11
|
export { bugCaseSteps, formatBugCaseSteps, safeTouch } from "./steps";
|
|
@@ -2,6 +2,7 @@ export interface BugCaseRecorderStatus {
|
|
|
2
2
|
watching: string[];
|
|
3
3
|
touches: boolean;
|
|
4
4
|
}
|
|
5
|
+
/** Start recording, or add the tools that registered since the last call. */
|
|
5
6
|
export declare function startBugCaseRecorder(): Promise<BugCaseRecorderStatus>;
|
|
6
7
|
export declare function stopBugCaseRecorder(): void;
|
|
7
8
|
export declare function bugCaseRecorderStatus(): BugCaseRecorderStatus;
|
|
@@ -33,6 +33,12 @@ export interface BugCaseStep {
|
|
|
33
33
|
t: number;
|
|
34
34
|
text: string;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* A tap on React Native's own dev chrome (the LogBox warning banners and
|
|
38
|
+
* their inspector), not on the app. It showed up on the link page as
|
|
39
|
+
* "Tapped LogBoxButton" when a tester closed a warning.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isDevChromeTouch(touch: BugCaseTouch): boolean;
|
|
36
42
|
/**
|
|
37
43
|
* Drop what a case must never carry: the text a field held or received.
|
|
38
44
|
* Toggle and slider values stay; they are what the step is about.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check an opened bug case before anyone uses it.
|
|
3
|
+
*
|
|
4
|
+
* A case comes from someone else's phone, and a hand-made blob can say
|
|
5
|
+
* anything. Every reader (the link page, the Mac, the phone's loader) gets the
|
|
6
|
+
* same shapes: wrong-typed parts become empty, oversize text is cut, and a
|
|
7
|
+
* case without its core (version, date, app) is refused.
|
|
8
|
+
*/
|
|
9
|
+
import { type BugCase } from "./types";
|
|
10
|
+
export declare class BugCaseShapeError extends Error {
|
|
11
|
+
constructor(part: string);
|
|
12
|
+
}
|
|
13
|
+
export declare function validateBugCase(raw: unknown): BugCase;
|
|
14
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { JsonValue } from "../types/types";
|
|
2
|
+
/**
|
|
3
|
+
* Pure tree → rows flattening for VirtualizedDataExplorer.
|
|
4
|
+
*
|
|
5
|
+
* Lives outside the component so it can be unit tested without React Native.
|
|
6
|
+
* Every child of an expanded node becomes a row: the list is virtualized, so
|
|
7
|
+
* rows are cheap, and the header's "(N items)" must match what you can scroll
|
|
8
|
+
* to. An earlier version stopped after 150 children (a leftover `break` meant to
|
|
9
|
+
* "yield" that nothing ever resumed) and capped the count at 500.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MAX_DEPTH_LIMIT = 15;
|
|
12
|
+
export interface FlatDataItem {
|
|
13
|
+
id: string;
|
|
14
|
+
key: string;
|
|
15
|
+
value: JsonValue;
|
|
16
|
+
valueType: string;
|
|
17
|
+
depth: number;
|
|
18
|
+
isExpandable: boolean;
|
|
19
|
+
isExpanded: boolean;
|
|
20
|
+
parentId?: string;
|
|
21
|
+
hasChildren: boolean;
|
|
22
|
+
childCount: number;
|
|
23
|
+
path: string[];
|
|
24
|
+
type: string;
|
|
25
|
+
isLastChild?: boolean;
|
|
26
|
+
parentHasMoreSiblings?: boolean[];
|
|
27
|
+
siblingIndex?: number;
|
|
28
|
+
totalSiblings?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare const getValueType: (value: JsonValue) => string;
|
|
31
|
+
export declare const getValueCount: (value: JsonValue, valueType: string) => number;
|
|
32
|
+
/** A collection's children as [key, value] pairs, in display order. */
|
|
33
|
+
export declare const getChildEntries: (value: JsonValue, valueType: string) => [string, JsonValue][];
|
|
34
|
+
export declare function flattenTree(value: JsonValue, expandedSet: Set<string>, circularCache: WeakSet<object>, maxDepth: number, key?: string, depth?: number, parentId?: string, path?: string[], siblingIndex?: number, totalSiblings?: number, parentHasMoreSiblings?: boolean[]): FlatDataItem[];
|
|
35
|
+
//# sourceMappingURL=flattenTree.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { JsonValue } from "../types/types";
|
|
2
|
+
/**
|
|
3
|
+
* Pure helpers for LiveExplorer's child list, kept out of the component so they
|
|
4
|
+
* can be unit tested without React Native.
|
|
5
|
+
*
|
|
6
|
+
* Every child is listed. Long lists are split into collapsed pages of
|
|
7
|
+
* `LIVE_PAGE_SIZE`, so a huge array costs one header row per page until you
|
|
8
|
+
* open one. Children past 1,000 used to be dropped, so they could not be reached.
|
|
9
|
+
*/
|
|
10
|
+
export declare const LIVE_PAGE_SIZE = 100;
|
|
11
|
+
export type LiveEntry = {
|
|
12
|
+
label: string;
|
|
13
|
+
value: JsonValue;
|
|
14
|
+
};
|
|
15
|
+
/** A node's children, in display order. */
|
|
16
|
+
export declare function getLiveSubEntries(value: JsonValue): LiveEntry[];
|
|
17
|
+
/** `[first...last]` for page `index`; the last page stops at the real end. */
|
|
18
|
+
export declare function livePageRange(index: number, total: number, size?: number): string;
|
|
19
|
+
//# sourceMappingURL=liveEntries.d.ts.map
|
|
@@ -28,4 +28,5 @@ export { ClockToolIcon, CLOCK_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-co
|
|
|
28
28
|
export { PermissionsIcon, PERMISSIONS_ICON_COLOR } from "@buoy-gg/floating-tools-core";
|
|
29
29
|
export { LifecycleToolIcon, LIFECYCLE_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-core";
|
|
30
30
|
export { LocationToolIcon, LOCATION_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-core";
|
|
31
|
+
export { OtaInspectorIcon, OTA_INSPECTOR_ICON_COLOR } from '@buoy-gg/floating-tools-core';
|
|
31
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -14,7 +14,7 @@ export * from "./tools/defineTool";
|
|
|
14
14
|
export * from "./sync/toolActionRegistry";
|
|
15
15
|
export * from "./sync/toolUiBridge";
|
|
16
16
|
export * from "./sync/toolScreenHeader";
|
|
17
|
-
export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, realNow, getRealAppState, subscribeRealAppState, BUOY_SYNTHETIC_MARK, countBuoyListener, type RealAppState, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
|
|
17
|
+
export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, setItemChecked, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, realNow, getRealAppState, subscribeRealAppState, BUOY_SYNTHETIC_MARK, countBuoyListener, type RealAppState, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
|
|
18
18
|
export type { SafeRouteLocation } from "./utils";
|
|
19
19
|
export * from "./utils/toolModules";
|
|
20
20
|
export { subscribeStorageWrites } from "./utils/storageWrites";
|
|
@@ -51,7 +51,7 @@ export type { Environment } from "./types/types";
|
|
|
51
51
|
export { normalizeEnvironment } from "./types/types";
|
|
52
52
|
export { HintsProvider, useHintsDisabled, useHintsContext } from "./context";
|
|
53
53
|
export * from "./history";
|
|
54
|
-
export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, useSignInState, ProBadge, ProUpgradeModal, FreeAccountPrompt, LOGIN_COMMAND, getUseIsPro, getUseLicense, getUseTier, signOutOfBuoy, TIER_LIMITS, useLimit, resolveEffectiveTier } from "./license";
|
|
54
|
+
export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, BuoyGetProCard, useSignInState, ProBadge, ProUpgradeModal, FreeAccountPrompt, LOGIN_COMMAND, getUseIsPro, getUseLicense, getUseTier, signOutOfBuoy, TIER_LIMITS, useLimit, resolveEffectiveTier } from "./license";
|
|
55
55
|
export type { FeatureGateProps, ProFeatureBannerProps, UpgradeModalProps, BuoyUpgradeSheetProps, ProUpgradeModalProps, FreeAccountPromptProps, BuoyTier, TierLimitKey } from "./license";
|
|
56
56
|
export { getAccountAccess, hasAccountAccess, assertAccountAccess, subscribeAccountAccess, getUseAccountAccess, retryAccountAccess, isProNow, getTeamCredential } from "./license/licenseModule";
|
|
57
57
|
export { setBuoyAppId, getBuoyAppId } from "./utils/appIdentity";
|
|
@@ -14,6 +14,14 @@ export declare function BuoySignInCard({ onClose, onNotConfigured, footer, }: {
|
|
|
14
14
|
export declare function BuoyNeedsPlanCard({ onClose }: {
|
|
15
15
|
onClose: () => void;
|
|
16
16
|
}): import("react").JSX.Element;
|
|
17
|
+
/**
|
|
18
|
+
* "Get Buoy Pro": a QR code and a link to buoy.gg/pricing, then a way to
|
|
19
|
+
* check again. BuoyUpgradeSheet shows it in a Modal; the parity sheet draws
|
|
20
|
+
* it inline.
|
|
21
|
+
*/
|
|
22
|
+
export declare function BuoyGetProCard({ onClose }: {
|
|
23
|
+
onClose: () => void;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
17
25
|
export interface BuoyUpgradeSheetProps {
|
|
18
26
|
visible: boolean;
|
|
19
27
|
onClose: () => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, ProBadge, ProUpgradeModal } from "./FeatureGate";
|
|
2
2
|
export type { FeatureGateProps, ProFeatureBannerProps, UpgradeModalProps, ProUpgradeModalProps } from "./FeatureGate";
|
|
3
|
-
export { BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, useSignInState } from "./BuoyUpgradeSheet";
|
|
3
|
+
export { BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, BuoyGetProCard, useSignInState } from "./BuoyUpgradeSheet";
|
|
4
4
|
export type { BuoyUpgradeSheetProps } from "./BuoyUpgradeSheet";
|
|
5
5
|
export { FreeAccountPrompt, LOGIN_COMMAND } from "./FreeAccountPrompt";
|
|
6
6
|
export type { FreeAccountPromptProps } from "./FreeAccountPrompt";
|
|
@@ -4,8 +4,13 @@
|
|
|
4
4
|
* Every item must carry it, and every value must be a distinct string/number —
|
|
5
5
|
* a duplicated id would make an addressed edit ambiguous, and silently picking
|
|
6
6
|
* the first match is exactly the kind of "helpful" guess that loses data.
|
|
7
|
+
*
|
|
8
|
+
* A unique `…Id` field counts too: Haiven's `/chat/me` rows carry only
|
|
9
|
+
* `channelId`, and a keyed edit on them was written over the list as an object.
|
|
10
|
+
* When `keys` are given, the field holding one of them wins, so a studio patch
|
|
11
|
+
* keyed by slug edits that studio instead of appending a new one under `id`.
|
|
7
12
|
*/
|
|
8
|
-
export declare function identityField(items: unknown[]): string | undefined;
|
|
13
|
+
export declare function identityField(items: unknown[], keys?: string[]): string | undefined;
|
|
9
14
|
/**
|
|
10
15
|
* Let a caller address list items by their own id instead of resending the list.
|
|
11
16
|
*
|
|
@@ -27,6 +27,11 @@ export type FloatingToolProps = {
|
|
|
27
27
|
* out of the way of app headers.
|
|
28
28
|
*/
|
|
29
29
|
defaultPlacement?: "top" | "bottom";
|
|
30
|
+
/**
|
|
31
|
+
* Extra room a "bottom" tool keeps above the safe area, e.g. for the dev
|
|
32
|
+
* warning banner (LogBox) that covers the bottom of a dev build.
|
|
33
|
+
*/
|
|
34
|
+
bottomClearance?: number;
|
|
30
35
|
children?: ReactNode;
|
|
31
36
|
/** When true, pushes the bubble to the side (hidden position) */
|
|
32
37
|
pushToSide?: boolean;
|
|
@@ -70,7 +75,7 @@ export type FloatingToolProps = {
|
|
|
70
75
|
* @performance Implements efficient boundary checking and position validation
|
|
71
76
|
* @performance Includes debounced position saving for optimal storage performance
|
|
72
77
|
*/
|
|
73
|
-
export declare function FloatingTool({ id, suspendPointerEvents, revealToken, variant, dragFromSurface, accessibilityLabel, minimizedStack, hasMinimizedStack, accessory, handleAdornment, enablePositionPersistence, defaultPlacement, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolProps): import("react").JSX.Element | null;
|
|
78
|
+
export declare function FloatingTool({ id, suspendPointerEvents, revealToken, variant, dragFromSurface, accessibilityLabel, minimizedStack, hasMinimizedStack, accessory, handleAdornment, enablePositionPersistence, defaultPlacement, bottomClearance, pushToSide, centerOnboarding, children, environment, availableEnvironments, onEnvironmentSwitch, showEnvironmentSelector, }: FloatingToolProps): import("react").JSX.Element | null;
|
|
74
79
|
/** Native AppHost gets its anchor from the minimized-tools provider. */
|
|
75
80
|
export declare function getBubbleAnchorPosition(): {
|
|
76
81
|
x: number;
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* Spread them onto a FlatList: `<FlatList {...EVENT_LIST_PRESET} … />`.
|
|
6
6
|
* A tool that later moves to FlashList changes this file, not eleven.
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import { type FlatListProps } from "react-native";
|
|
9
9
|
/**
|
|
10
10
|
* `removeClippedSubviews` is off in E2E bundles: clipped rows leave the
|
|
11
11
|
* hierarchy entirely, so a row past the fold reads to the test as "the tool
|
|
12
12
|
* stopped capturing".
|
|
13
13
|
*/
|
|
14
14
|
export declare const CLIP_OFFSCREEN_CELLS: boolean;
|
|
15
|
-
type ListPreset = Pick<FlatListProps<unknown>, "initialNumToRender" | "maxToRenderPerBatch" | "windowSize" | "updateCellsBatchingPeriod" | "removeClippedSubviews">;
|
|
15
|
+
type ListPreset = Pick<FlatListProps<unknown>, "initialNumToRender" | "maxToRenderPerBatch" | "windowSize" | "updateCellsBatchingPeriod" | "removeClippedSubviews" | "keyboardShouldPersistTaps" | "keyboardDismissMode">;
|
|
16
16
|
/**
|
|
17
17
|
* Event / change / request lists: rows are tall-ish and arrive in bursts.
|
|
18
18
|
* Window and batch values are the "tuned" winner of the buoy-optimize
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { absoluteFill } from "./absoluteFill";
|
|
2
2
|
export { displayValue, parseDisplayValue } from "./displayValue";
|
|
3
3
|
export { getSafeAreaInsets } from "./getSafeAreaInsets";
|
|
4
|
-
export { persistentStorage, isUsingPersistentStorage, getStorageBackendType, type DevToolsStorage, } from "./persistentStorage";
|
|
4
|
+
export { persistentStorage, setItemChecked, isUsingPersistentStorage, getStorageBackendType, type DevToolsStorage, } from "./persistentStorage";
|
|
5
5
|
export { safeStringify } from "./safeStringify";
|
|
6
6
|
export { getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, } from "./typeHelpers";
|
|
7
7
|
export { parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, } from "./valueFormatting";
|
|
@@ -13,12 +13,14 @@ export interface SuperJSONResult {
|
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
15
|
export declare function serialize(object: any): SuperJSONResult;
|
|
16
|
-
export declare function deserialize<T = unknown>(payload: SuperJSONResult
|
|
16
|
+
export declare function deserialize<T = unknown>(payload: SuperJSONResult, options?: {
|
|
17
|
+
skipBadAnnotations?: boolean;
|
|
18
|
+
}): T;
|
|
17
19
|
/**
|
|
18
20
|
* Drop the annotations whose value `drop` rejects. A bug case's scrubber can
|
|
19
21
|
* replace a Date with "[removed:pii]"; the Date annotation left behind would
|
|
20
22
|
* turn that into Invalid Date (or throw, for a BigInt) on deserialize.
|
|
21
23
|
*/
|
|
22
|
-
export declare function dropAnnotations(payload: SuperJSONResult, drop: (value: unknown) => boolean): SuperJSONResult;
|
|
24
|
+
export declare function dropAnnotations(payload: SuperJSONResult, drop: (value: unknown, type: unknown) => boolean): SuperJSONResult;
|
|
23
25
|
export {};
|
|
24
26
|
//# sourceMappingURL=minimalSuperJSON.d.ts.map
|
|
@@ -29,6 +29,12 @@ type StorageBackend = "filesystem" | "asyncstorage" | "localstorage" | "memory";
|
|
|
29
29
|
* Same API as AsyncStorage for easy migration.
|
|
30
30
|
*/
|
|
31
31
|
export declare const persistentStorage: DevToolsStorage;
|
|
32
|
+
/**
|
|
33
|
+
* Like persistentStorage.setItem, but says whether the value reached disk:
|
|
34
|
+
* false when the backend failed or kept it in memory only. For data that is
|
|
35
|
+
* worthless half saved (a blob in chunks, an undo copy).
|
|
36
|
+
*/
|
|
37
|
+
export declare function setItemChecked(key: string, value: string): Promise<boolean>;
|
|
32
38
|
/**
|
|
33
39
|
* Check if persistent storage (FileSystem) is being used
|
|
34
40
|
*/
|
|
@@ -99,6 +99,12 @@ interface JsModalProps {
|
|
|
99
99
|
background?: boolean;
|
|
100
100
|
/** Chrome variant — see {@link ModalVariant}. */
|
|
101
101
|
variant?: ModalVariant;
|
|
102
|
+
/**
|
|
103
|
+
* Lift the bottom sheet above the iOS keyboard. On by default. A body that
|
|
104
|
+
* keeps its own input above the keyboard (Ask Buoy's KeyboardPad) passes
|
|
105
|
+
* false, or it would move twice.
|
|
106
|
+
*/
|
|
107
|
+
avoidKeyboard?: boolean;
|
|
102
108
|
}
|
|
103
109
|
/**
|
|
104
110
|
* JsModal - Ultra-optimized modal component for true 60FPS performance
|
|
@@ -85,6 +85,8 @@ export interface ModalState {
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
export interface JsModalProps {
|
|
88
|
+
/** Native only (lifts the sheet above the iOS keyboard). Accepted here for parity. */
|
|
89
|
+
avoidKeyboard?: boolean;
|
|
88
90
|
visible: boolean;
|
|
89
91
|
onClose: () => void;
|
|
90
92
|
children: ReactNode;
|
|
@@ -5,6 +5,7 @@ export type { BugCaseCrypto, BugCaseHeader, BugCaseLockErrorCode, LockedBugCase
|
|
|
5
5
|
export { bugCaseRecorderStatus, startBugCaseRecorder, stopBugCaseRecorder } from "./recorder";
|
|
6
6
|
export type { BugCaseRecorderStatus } from "./recorder";
|
|
7
7
|
export { formatBugCase, isFailedCall } from "./format";
|
|
8
|
+
export { BugCaseShapeError, validateBugCase } from "./validate";
|
|
8
9
|
export { classifyKey, keyWords, REMOVED_MARK, removedMark, ScrubLimitError, scrubBugCase } from "./scrub";
|
|
9
10
|
export type { ScrubbedItem, ScrubKind, ScrubResult, ScrubRules } from "./scrub";
|
|
10
11
|
export { bugCaseSteps, formatBugCaseSteps, safeTouch } from "./steps";
|
|
@@ -2,6 +2,7 @@ export interface BugCaseRecorderStatus {
|
|
|
2
2
|
watching: string[];
|
|
3
3
|
touches: boolean;
|
|
4
4
|
}
|
|
5
|
+
/** Start recording, or add the tools that registered since the last call. */
|
|
5
6
|
export declare function startBugCaseRecorder(): Promise<BugCaseRecorderStatus>;
|
|
6
7
|
export declare function stopBugCaseRecorder(): void;
|
|
7
8
|
export declare function bugCaseRecorderStatus(): BugCaseRecorderStatus;
|
|
@@ -33,6 +33,12 @@ export interface BugCaseStep {
|
|
|
33
33
|
t: number;
|
|
34
34
|
text: string;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* A tap on React Native's own dev chrome (the LogBox warning banners and
|
|
38
|
+
* their inspector), not on the app. It showed up on the link page as
|
|
39
|
+
* "Tapped LogBoxButton" when a tester closed a warning.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isDevChromeTouch(touch: BugCaseTouch): boolean;
|
|
36
42
|
/**
|
|
37
43
|
* Drop what a case must never carry: the text a field held or received.
|
|
38
44
|
* Toggle and slider values stay; they are what the step is about.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check an opened bug case before anyone uses it.
|
|
3
|
+
*
|
|
4
|
+
* A case comes from someone else's phone, and a hand-made blob can say
|
|
5
|
+
* anything. Every reader (the link page, the Mac, the phone's loader) gets the
|
|
6
|
+
* same shapes: wrong-typed parts become empty, oversize text is cut, and a
|
|
7
|
+
* case without its core (version, date, app) is refused.
|
|
8
|
+
*/
|
|
9
|
+
import { type BugCase } from "./types";
|
|
10
|
+
export declare class BugCaseShapeError extends Error {
|
|
11
|
+
constructor(part: string);
|
|
12
|
+
}
|
|
13
|
+
export declare function validateBugCase(raw: unknown): BugCase;
|
|
14
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { JsonValue } from "../types/types";
|
|
2
|
+
/**
|
|
3
|
+
* Pure tree → rows flattening for VirtualizedDataExplorer.
|
|
4
|
+
*
|
|
5
|
+
* Lives outside the component so it can be unit tested without React Native.
|
|
6
|
+
* Every child of an expanded node becomes a row: the list is virtualized, so
|
|
7
|
+
* rows are cheap, and the header's "(N items)" must match what you can scroll
|
|
8
|
+
* to. An earlier version stopped after 150 children (a leftover `break` meant to
|
|
9
|
+
* "yield" that nothing ever resumed) and capped the count at 500.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MAX_DEPTH_LIMIT = 15;
|
|
12
|
+
export interface FlatDataItem {
|
|
13
|
+
id: string;
|
|
14
|
+
key: string;
|
|
15
|
+
value: JsonValue;
|
|
16
|
+
valueType: string;
|
|
17
|
+
depth: number;
|
|
18
|
+
isExpandable: boolean;
|
|
19
|
+
isExpanded: boolean;
|
|
20
|
+
parentId?: string;
|
|
21
|
+
hasChildren: boolean;
|
|
22
|
+
childCount: number;
|
|
23
|
+
path: string[];
|
|
24
|
+
type: string;
|
|
25
|
+
isLastChild?: boolean;
|
|
26
|
+
parentHasMoreSiblings?: boolean[];
|
|
27
|
+
siblingIndex?: number;
|
|
28
|
+
totalSiblings?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare const getValueType: (value: JsonValue) => string;
|
|
31
|
+
export declare const getValueCount: (value: JsonValue, valueType: string) => number;
|
|
32
|
+
/** A collection's children as [key, value] pairs, in display order. */
|
|
33
|
+
export declare const getChildEntries: (value: JsonValue, valueType: string) => [string, JsonValue][];
|
|
34
|
+
export declare function flattenTree(value: JsonValue, expandedSet: Set<string>, circularCache: WeakSet<object>, maxDepth: number, key?: string, depth?: number, parentId?: string, path?: string[], siblingIndex?: number, totalSiblings?: number, parentHasMoreSiblings?: boolean[]): FlatDataItem[];
|
|
35
|
+
//# sourceMappingURL=flattenTree.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { JsonValue } from "../types/types";
|
|
2
|
+
/**
|
|
3
|
+
* Pure helpers for LiveExplorer's child list, kept out of the component so they
|
|
4
|
+
* can be unit tested without React Native.
|
|
5
|
+
*
|
|
6
|
+
* Every child is listed. Long lists are split into collapsed pages of
|
|
7
|
+
* `LIVE_PAGE_SIZE`, so a huge array costs one header row per page until you
|
|
8
|
+
* open one. Children past 1,000 used to be dropped, so they could not be reached.
|
|
9
|
+
*/
|
|
10
|
+
export declare const LIVE_PAGE_SIZE = 100;
|
|
11
|
+
export type LiveEntry = {
|
|
12
|
+
label: string;
|
|
13
|
+
value: JsonValue;
|
|
14
|
+
};
|
|
15
|
+
/** A node's children, in display order. */
|
|
16
|
+
export declare function getLiveSubEntries(value: JsonValue): LiveEntry[];
|
|
17
|
+
/** `[first...last]` for page `index`; the last page stops at the real end. */
|
|
18
|
+
export declare function livePageRange(index: number, total: number, size?: number): string;
|
|
19
|
+
//# sourceMappingURL=liveEntries.d.ts.map
|
|
@@ -28,4 +28,5 @@ export { ClockToolIcon, CLOCK_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-co
|
|
|
28
28
|
export { PermissionsIcon, PERMISSIONS_ICON_COLOR } from "@buoy-gg/floating-tools-core";
|
|
29
29
|
export { LifecycleToolIcon, LIFECYCLE_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-core";
|
|
30
30
|
export { LocationToolIcon, LOCATION_TOOL_ICON_COLOR } from "@buoy-gg/floating-tools-core";
|
|
31
|
+
export { OtaInspectorIcon, OTA_INSPECTOR_ICON_COLOR } from '@buoy-gg/floating-tools-core';
|
|
31
32
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -14,7 +14,7 @@ export * from "./tools/defineTool";
|
|
|
14
14
|
export * from "./sync/toolActionRegistry";
|
|
15
15
|
export * from "./sync/toolUiBridge";
|
|
16
16
|
export * from "./sync/toolScreenHeader";
|
|
17
|
-
export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, realNow, getRealAppState, subscribeRealAppState, BUOY_SYNTHETIC_MARK, countBuoyListener, type RealAppState, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
|
|
17
|
+
export { absoluteFill, displayValue, parseDisplayValue, getSafeAreaInsets, persistentStorage, setItemChecked, isUsingPersistentStorage, getStorageBackendType, safeStringify, getValueType, isPrimitive, isJsonSerializable, isValidJson, getConstructorName, isEmpty, getValueSize, parseValue, formatValue, getTypeColor, truncateText, flattenObject, formatPath, loadOptionalModule, getCachedOptionalModule, setRenderCaptureProvider, getRenderCaptureProvider, type RenderCaptureProvider, type RenderCaptureSummary, type RenderCaptureTopComponent, type RenderCauseCounts, registerStateSnapshotProvider, getStateSnapshotProviders, getStateSnapshotProvider, subscribeToStateSnapshotProviders, type StateSnapshotProvider, type StateSnapshotProviderStatus, type StateSnapshotCapture, type StateSnapshotRestoreResult, type StateSnapshotPreview, type StateSnapshotPreviewItem, type StateSnapshotPreviewVerdict, superJsonSerialize, superJsonDeserialize, type SuperJSONResult, realNow, getRealAppState, subscribeRealAppState, BUOY_SYNTHETIC_MARK, countBuoyListener, type RealAppState, reloadApp, scheduleReloadApp, resolveReloadStrategy, REMOTE_RELOAD_DELAY_MS, type ReloadStrategy, type ResolvedReloadStrategy, getDevServerOrigin, Subscribable, type SubscribableListener, subscriberCountNotifier, subscribeToSubscriberCountChanges, notifySubscriberCountChange, useSafeRouter, useSafePathname, useSafeSegments, useSafeGlobalSearchParams, getSafeRouter, getSafeCurrentPathname, getSafeCurrentRoute, isExpoRouterAvailable, } from "./utils";
|
|
18
18
|
export type { SafeRouteLocation } from "./utils";
|
|
19
19
|
export * from "./utils/toolModules";
|
|
20
20
|
export { subscribeStorageWrites } from "./utils/storageWrites";
|
|
@@ -51,7 +51,7 @@ export type { Environment } from "./types/types";
|
|
|
51
51
|
export { normalizeEnvironment } from "./types/types";
|
|
52
52
|
export { HintsProvider, useHintsDisabled, useHintsContext } from "./context";
|
|
53
53
|
export * from "./history";
|
|
54
|
-
export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, useSignInState, ProBadge, ProUpgradeModal, FreeAccountPrompt, LOGIN_COMMAND, getUseIsPro, getUseLicense, getUseTier, signOutOfBuoy, TIER_LIMITS, useLimit, resolveEffectiveTier } from "./license";
|
|
54
|
+
export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, BuoyGetProCard, useSignInState, ProBadge, ProUpgradeModal, FreeAccountPrompt, LOGIN_COMMAND, getUseIsPro, getUseLicense, getUseTier, signOutOfBuoy, TIER_LIMITS, useLimit, resolveEffectiveTier } from "./license";
|
|
55
55
|
export type { FeatureGateProps, ProFeatureBannerProps, UpgradeModalProps, BuoyUpgradeSheetProps, ProUpgradeModalProps, FreeAccountPromptProps, BuoyTier, TierLimitKey } from "./license";
|
|
56
56
|
export { getAccountAccess, hasAccountAccess, assertAccountAccess, subscribeAccountAccess, getUseAccountAccess, retryAccountAccess, isProNow, getTeamCredential } from "./license/licenseModule";
|
|
57
57
|
export { setBuoyAppId, getBuoyAppId } from "./utils/appIdentity";
|
|
@@ -14,6 +14,14 @@ export declare function BuoySignInCard({ onClose, onNotConfigured, footer, }: {
|
|
|
14
14
|
export declare function BuoyNeedsPlanCard({ onClose }: {
|
|
15
15
|
onClose: () => void;
|
|
16
16
|
}): import("react").JSX.Element;
|
|
17
|
+
/**
|
|
18
|
+
* "Get Buoy Pro": a QR code and a link to buoy.gg/pricing, then a way to
|
|
19
|
+
* check again. BuoyUpgradeSheet shows it in a Modal; the parity sheet draws
|
|
20
|
+
* it inline.
|
|
21
|
+
*/
|
|
22
|
+
export declare function BuoyGetProCard({ onClose }: {
|
|
23
|
+
onClose: () => void;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
17
25
|
export interface BuoyUpgradeSheetProps {
|
|
18
26
|
visible: boolean;
|
|
19
27
|
onClose: () => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { FeatureGate, UpgradePrompt, useFeatureGate, ProFeatureBanner, UpgradeModal, ProBadge, ProUpgradeModal } from "./FeatureGate";
|
|
2
2
|
export type { FeatureGateProps, ProFeatureBannerProps, UpgradeModalProps, ProUpgradeModalProps } from "./FeatureGate";
|
|
3
|
-
export { BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, useSignInState } from "./BuoyUpgradeSheet";
|
|
3
|
+
export { BuoyUpgradeSheet, BuoySignInCard, BuoyNeedsPlanCard, BuoyGetProCard, useSignInState } from "./BuoyUpgradeSheet";
|
|
4
4
|
export type { BuoyUpgradeSheetProps } from "./BuoyUpgradeSheet";
|
|
5
5
|
export { FreeAccountPrompt, LOGIN_COMMAND } from "./FreeAccountPrompt";
|
|
6
6
|
export type { FreeAccountPromptProps } from "./FreeAccountPrompt";
|