@buoy-gg/assets 7.0.38 → 7.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/lib/commonjs/capture/expo.js +46 -1
  2. package/lib/commonjs/capture/expo.js.map +1 -0
  3. package/lib/commonjs/capture/install.js +91 -1
  4. package/lib/commonjs/capture/install.js.map +1 -0
  5. package/lib/commonjs/capture/isBuoyAsset.js +23 -1
  6. package/lib/commonjs/capture/isBuoyAsset.js.map +1 -0
  7. package/lib/commonjs/capture/measure.js +186 -1
  8. package/lib/commonjs/capture/measure.js.map +1 -0
  9. package/lib/commonjs/capture/metroGraph.js +175 -1
  10. package/lib/commonjs/capture/metroGraph.js.map +1 -0
  11. package/lib/commonjs/capture/registry.js +127 -1
  12. package/lib/commonjs/capture/registry.js.map +1 -0
  13. package/lib/commonjs/components/AssetDetail.js +211 -1
  14. package/lib/commonjs/components/AssetDetail.js.map +1 -0
  15. package/lib/commonjs/components/AssetImage.js +66 -1
  16. package/lib/commonjs/components/AssetImage.js.map +1 -0
  17. package/lib/commonjs/components/AssetRow.js +232 -1
  18. package/lib/commonjs/components/AssetRow.js.map +1 -0
  19. package/lib/commonjs/components/AssetsFilterBar.js +105 -1
  20. package/lib/commonjs/components/AssetsFilterBar.js.map +1 -0
  21. package/lib/commonjs/components/AssetsHeader.js +73 -1
  22. package/lib/commonjs/components/AssetsHeader.js.map +1 -0
  23. package/lib/commonjs/components/AssetsIcon.js +19 -1
  24. package/lib/commonjs/components/AssetsIcon.js.map +1 -0
  25. package/lib/commonjs/components/AssetsListControls.js +81 -1
  26. package/lib/commonjs/components/AssetsListControls.js.map +1 -0
  27. package/lib/commonjs/components/AssetsModal.js +378 -1
  28. package/lib/commonjs/components/AssetsModal.js.map +1 -0
  29. package/lib/commonjs/components/ScanNotice.js +85 -1
  30. package/lib/commonjs/components/ScanNotice.js.map +1 -0
  31. package/lib/commonjs/components/optionalExpoImage.js +16 -1
  32. package/lib/commonjs/components/optionalExpoImage.js.map +1 -0
  33. package/lib/commonjs/components/optionalExpoImage.web.js +11 -1
  34. package/lib/commonjs/components/optionalExpoImage.web.js.map +1 -0
  35. package/lib/commonjs/export.js +62 -1
  36. package/lib/commonjs/export.js.map +1 -0
  37. package/lib/commonjs/format.js +59 -1
  38. package/lib/commonjs/format.js.map +1 -0
  39. package/lib/commonjs/hooks/useAssetRecords.js +22 -1
  40. package/lib/commonjs/hooks/useAssetRecords.js.map +1 -0
  41. package/lib/commonjs/hooks/useAssetScanStatus.js +28 -1
  42. package/lib/commonjs/hooks/useAssetScanStatus.js.map +1 -0
  43. package/lib/commonjs/index.js +313 -1
  44. package/lib/commonjs/index.js.map +1 -0
  45. package/lib/commonjs/preset.js +39 -1
  46. package/lib/commonjs/preset.js.map +1 -0
  47. package/lib/commonjs/remote.js +68 -1
  48. package/lib/commonjs/remote.js.map +1 -0
  49. package/lib/commonjs/state.js +51 -1
  50. package/lib/commonjs/state.js.map +1 -0
  51. package/lib/commonjs/store/assetStore.js +256 -1
  52. package/lib/commonjs/store/assetStore.js.map +1 -0
  53. package/lib/commonjs/store/baseline.js +175 -1
  54. package/lib/commonjs/store/baseline.js.map +1 -0
  55. package/lib/commonjs/store/insights.js +120 -1
  56. package/lib/commonjs/store/insights.js.map +1 -0
  57. package/lib/commonjs/sync/assetsSyncAdapter.js +157 -1
  58. package/lib/commonjs/sync/assetsSyncAdapter.js.map +1 -0
  59. package/lib/commonjs/types.js +2 -1
  60. package/lib/commonjs/types.js.map +1 -0
  61. package/lib/commonjs/utils/deviceScale.js +50 -1
  62. package/lib/commonjs/utils/deviceScale.js.map +1 -0
  63. package/lib/commonjs/utils/testIDs.js +110 -1
  64. package/lib/commonjs/utils/testIDs.js.map +1 -0
  65. package/lib/module/capture/expo.js +41 -1
  66. package/lib/module/capture/expo.js.map +1 -0
  67. package/lib/module/capture/install.js +85 -1
  68. package/lib/module/capture/install.js.map +1 -0
  69. package/lib/module/capture/isBuoyAsset.js +18 -1
  70. package/lib/module/capture/isBuoyAsset.js.map +1 -0
  71. package/lib/module/capture/measure.js +179 -1
  72. package/lib/module/capture/measure.js.map +1 -0
  73. package/lib/module/capture/metroGraph.js +168 -1
  74. package/lib/module/capture/metroGraph.js.map +1 -0
  75. package/lib/module/capture/registry.js +120 -1
  76. package/lib/module/capture/registry.js.map +1 -0
  77. package/lib/module/components/AssetDetail.js +207 -1
  78. package/lib/module/components/AssetDetail.js.map +1 -0
  79. package/lib/module/components/AssetImage.js +62 -1
  80. package/lib/module/components/AssetImage.js.map +1 -0
  81. package/lib/module/components/AssetRow.js +228 -1
  82. package/lib/module/components/AssetRow.js.map +1 -0
  83. package/lib/module/components/AssetsFilterBar.js +101 -1
  84. package/lib/module/components/AssetsFilterBar.js.map +1 -0
  85. package/lib/module/components/AssetsHeader.js +69 -1
  86. package/lib/module/components/AssetsHeader.js.map +1 -0
  87. package/lib/module/components/AssetsIcon.js +12 -1
  88. package/lib/module/components/AssetsIcon.js.map +1 -0
  89. package/lib/module/components/AssetsListControls.js +77 -1
  90. package/lib/module/components/AssetsListControls.js.map +1 -0
  91. package/lib/module/components/AssetsModal.js +373 -1
  92. package/lib/module/components/AssetsModal.js.map +1 -0
  93. package/lib/module/components/ScanNotice.js +81 -1
  94. package/lib/module/components/ScanNotice.js.map +1 -0
  95. package/lib/module/components/optionalExpoImage.js +12 -1
  96. package/lib/module/components/optionalExpoImage.js.map +1 -0
  97. package/lib/module/components/optionalExpoImage.web.js +7 -1
  98. package/lib/module/components/optionalExpoImage.web.js.map +1 -0
  99. package/lib/module/export.js +57 -1
  100. package/lib/module/export.js.map +1 -0
  101. package/lib/module/format.js +51 -1
  102. package/lib/module/format.js.map +1 -0
  103. package/lib/module/hooks/useAssetRecords.js +18 -1
  104. package/lib/module/hooks/useAssetRecords.js.map +1 -0
  105. package/lib/module/hooks/useAssetScanStatus.js +23 -1
  106. package/lib/module/hooks/useAssetScanStatus.js.map +1 -0
  107. package/lib/module/index.js +63 -1
  108. package/lib/module/index.js.map +1 -0
  109. package/lib/module/preset.js +35 -1
  110. package/lib/module/preset.js.map +1 -0
  111. package/lib/module/remote.js +61 -1
  112. package/lib/module/remote.js.map +1 -0
  113. package/lib/module/state.js +47 -1
  114. package/lib/module/state.js.map +1 -0
  115. package/lib/module/store/assetStore.js +240 -1
  116. package/lib/module/store/assetStore.js.map +1 -0
  117. package/lib/module/store/baseline.js +167 -1
  118. package/lib/module/store/baseline.js.map +1 -0
  119. package/lib/module/store/insights.js +116 -1
  120. package/lib/module/store/insights.js.map +1 -0
  121. package/lib/module/sync/assetsSyncAdapter.js +153 -1
  122. package/lib/module/sync/assetsSyncAdapter.js.map +1 -0
  123. package/lib/module/types.js +2 -1
  124. package/lib/module/types.js.map +1 -0
  125. package/lib/module/utils/deviceScale.js +46 -1
  126. package/lib/module/utils/deviceScale.js.map +1 -0
  127. package/lib/module/utils/testIDs.js +99 -1
  128. package/lib/module/utils/testIDs.js.map +1 -0
  129. package/lib/typescript/capture/expo.d.ts.map +1 -0
  130. package/lib/typescript/capture/install.d.ts.map +1 -0
  131. package/lib/typescript/capture/isBuoyAsset.d.ts.map +1 -0
  132. package/lib/typescript/capture/measure.d.ts.map +1 -0
  133. package/lib/typescript/capture/metroGraph.d.ts.map +1 -0
  134. package/lib/typescript/capture/registry.d.ts.map +1 -0
  135. package/lib/typescript/components/AssetDetail.d.ts.map +1 -0
  136. package/lib/typescript/components/AssetImage.d.ts.map +1 -0
  137. package/lib/typescript/components/AssetRow.d.ts.map +1 -0
  138. package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -0
  139. package/lib/typescript/components/AssetsHeader.d.ts.map +1 -0
  140. package/lib/typescript/components/AssetsIcon.d.ts.map +1 -0
  141. package/lib/typescript/components/AssetsListControls.d.ts.map +1 -0
  142. package/lib/typescript/components/AssetsModal.d.ts.map +1 -0
  143. package/lib/typescript/components/ScanNotice.d.ts.map +1 -0
  144. package/lib/typescript/components/optionalExpoImage.d.ts.map +1 -0
  145. package/lib/typescript/components/optionalExpoImage.web.d.ts.map +1 -0
  146. package/lib/typescript/export.d.ts.map +1 -0
  147. package/lib/typescript/format.d.ts.map +1 -0
  148. package/lib/typescript/hooks/useAssetRecords.d.ts.map +1 -0
  149. package/lib/typescript/hooks/useAssetScanStatus.d.ts.map +1 -0
  150. package/lib/typescript/index.d.ts.map +1 -0
  151. package/lib/typescript/preset.d.ts.map +1 -0
  152. package/lib/typescript/remote.d.ts.map +1 -0
  153. package/lib/typescript/state.d.ts.map +1 -0
  154. package/lib/typescript/store/assetStore.d.ts.map +1 -0
  155. package/lib/typescript/store/baseline.d.ts.map +1 -0
  156. package/lib/typescript/store/insights.d.ts.map +1 -0
  157. package/lib/typescript/sync/assetsSyncAdapter.d.ts.map +1 -0
  158. package/lib/typescript/types.d.ts.map +1 -0
  159. package/lib/typescript/utils/deviceScale.d.ts.map +1 -0
  160. package/lib/typescript/utils/testIDs.d.ts.map +1 -0
  161. package/package.json +2 -2
@@ -1 +1,378 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.AssetsModal=AssetsModal,exports.AssetsToolView=AssetsToolView;var _react=require("react"),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_install=require("../capture/install"),_export=require("../export"),_useAssetRecords=require("../hooks/useAssetRecords"),_useAssetScanStatus=require("../hooks/useAssetScanStatus"),_remote=require("../remote"),_assetStore=require("../store/assetStore"),_baseline=require("../store/baseline"),_AssetDetail=require("./AssetDetail"),_AssetRow=require("./AssetRow"),_AssetsFilterBar=require("./AssetsFilterBar"),_AssetsHeader=require("./AssetsHeader"),_AssetsListControls=require("./AssetsListControls"),_ScanNotice=require("./ScanNotice"),_testIDs=require("../utils/testIDs"),_jsxRuntime=require("react/jsx-runtime");function FontFamilies({names:e}){const t=[...new Set(e)];return t.length?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.fontsBox,testID:_testIDs.ASSETS_TEST_IDS.fonts,children:[(0,_jsxRuntime.jsxs)(_reactNative.Text,{style:styles.fontsTitle,testID:_testIDs.ASSETS_TEST_IDS.fontsTitle,children:["LOADED FONT FAMILIES (",t.length,")"]}),(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.fontsWrap,children:t.map(e=>(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.fontChip,testID:(0,_testIDs.assetFontChipTestID)(e),children:e},e))})]}):null}function EmptyState({duplicates:e=!1}){return(0,_jsxRuntime.jsx)(_sharedUi.ToolEmptyState,{testID:_testIDs.ASSETS_TEST_IDS.empty,otto:"scanning",title:e?"No duplicates found":"No assets found yet",message:e?"No assets in this view share a content hash.":"Every bundled asset — images, fonts, video, audio — appears here with sizes, scale coverage, and runtime registration status. Try Rescan after navigating around the app."})}function bySizeDesc(e,t){return(t.sizeBytes??(0,_assetStore.estDecodedBytes)(t))-(e.sizeBytes??(0,_assetStore.estDecodedBytes)(e))}const COMPARATORS={size:bySizeDesc,name:(e,t)=>e.name.localeCompare(t.name)||e.type.localeCompare(t.type),type:(e,t)=>e.type.localeCompare(t.type)||bySizeDesc(e,t)};function AssetsModal({visible:e,onClose:t,onBack:s,onMinimize:i,persistenceKey:a,inline:r=!1}){(0,_install.installAssetCapture)();const{records:n,stats:o,insights:l}=(0,_useAssetRecords.useAssetRecords)(),c=(0,_useAssetScanStatus.useAssetScanStatus)(),[d,u]=(0,_react.useState)(!1);(0,_react.useEffect)(()=>{u(!1)},[c.graphFetchInFlight,c.lastScanAt]);const _=()=>{u(!1);const e=(0,_remote.remoteAssetsDispatch)();e?e("rescan").catch(()=>u(!0)):(0,_install.rescan)()},[h,p]=(0,_react.useState)(null),[x,m]=(0,_react.useState)("all"),[y,S]=(0,_react.useState)(""),[g,f]=(0,_react.useState)("size"),j=null!=h?(0,_assetStore.getRecord)(h):void 0;(0,_react.useEffect)(()=>{if(!e)return;(0,_baseline.loadBaseline)(),u(!1);const t=(0,_remote.remoteAssetsDispatch)();t?t("rescan").catch(()=>u(!0)):(0,_install.rescan)()},[e]);const A=new Set(l.duplicates.flatMap(e=>e.ids)),R=[...n].sort(COMPARATORS[g]),v=y.trim().toLowerCase(),C=R.filter(e=>!("unused"===x&&e.loaded||"duplicates"===x&&!A.has(e.id)||"all"!==x&&"unused"!==x&&"duplicates"!==x&&e.kind!==x||v&&!`${e.name}.${e.type}`.toLowerCase().includes(v))),T=j?C.findIndex(e=>e.id===j.id):-1,b=e=>{const t=C[e];t&&p(t.id)},D={scaleGaps:new Set(l.scaleGaps),scaleAnomalies:new Set(l.scaleAnomalies),duplicates:A,webpCandidates:new Set(l.webpCandidates),overDecode:new Set(l.overDecode),heavy:new Set([...l.heavyGifs,...l.heavyFonts])};let w=0;for(const e of C){const t=e.sizeBytes??(0,_assetStore.estDecodedBytes)(e);t>w&&(w=t)}const I=(0,_jsxRuntime.jsx)(_AssetsHeader.AssetsHeader,{stats:o,measuring:c.measuring,discovering:c.graphFetchInFlight,detailOpen:null!=j,detailIndex:T,detailTotal:C.length,onCloseDetail:()=>p(null),onClear:_assetStore.clearRecords,getReport:()=>j?(0,_export.formatAssetMarkdown)(j):(0,_export.formatInventoryMarkdown)(R,o,l,(0,_install.getScanStatus)(),(0,_baseline.getDiff)()),onBack:s}),N=j?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.detailContainer,children:[(0,_jsxRuntime.jsx)(_AssetDetail.AssetDetail,{record:j,insights:l}),T>=0?(0,_jsxRuntime.jsx)(_sharedUi.EventStepperFooter,{currentIndex:T,totalItems:C.length,itemLabel:"Asset",onPrevious:()=>b(T-1),onNext:()=>b(T+1)}):null]}):(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.listContainer,children:[(0,_jsxRuntime.jsx)(_AssetsFilterBar.AssetsFilterBar,{stats:o,duplicateCount:A.size,filter:x,onChange:e=>{m(e),"duplicates"===e&&S("")}}),(0,_jsxRuntime.jsx)(_AssetsListControls.AssetsListControls,{query:y,onQueryChange:S,sort:g,onSortChange:f}),(0,_jsxRuntime.jsx)(_ScanNotice.ScanNotice,{status:c,total:o.total,onRetry:_}),d&&!c.graphFetchInFlight?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.notice,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.noticeText,children:"Couldn't request an asset scan from the device."}),(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{accessibilityRole:"button",onPress:_,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.retryText,children:"Retry"})})]}):null,"unused"===x?(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.notice,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.noticeText,children:"Not seen in React Native's asset registry this app run. Assets loaded through other paths may appear here; this does not prove they are unused."})}):null,"font"===x?(0,_jsxRuntime.jsx)(FontFamilies,{names:c.fontFamilies}):null,(0,_jsxRuntime.jsx)(_reactNative.FlatList,{testID:_testIDs.ASSETS_TEST_IDS.list,data:C,keyExtractor:e=>String(e.id),contentContainerStyle:styles.listContent,renderItem:({item:e})=>(0,_jsxRuntime.jsx)(_AssetRow.AssetRow,{record:e,flags:{scaleGap:D.scaleGaps.has(e.id),scaleAnomaly:D.scaleAnomalies.has(e.id),duplicate:D.duplicates.has(e.id),webp:D.webpCandidates.has(e.id),oversize:D.overDecode.has(e.id),heavy:D.heavy.has(e.id)},sizeFraction:w>0?(e.sizeBytes??(0,_assetStore.estDecodedBytes)(e))/w:0,onPress:e=>p("number"==typeof e?e:null)}),ListEmptyComponent:c.graphFetchInFlight?null:(0,_jsxRuntime.jsx)(EmptyState,{duplicates:"duplicates"===x})})]});return r?(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.inlineRoot,children:[(0,_jsxRuntime.jsx)(_reactNative.View,{style:styles.inlineHeader,..._sharedUi.windowDragProps,children:I}),N]}):(0,_jsxRuntime.jsx)(_sharedUi.JsModal,{visible:e,onClose:t,onMinimize:i,persistenceKey:a,header:{showToggleButton:!0,customContent:I},enablePersistence:!0,initialMode:"bottomSheet",disableScrollWrapper:!0,children:N})}function AssetsToolView(e={}){return(0,_jsxRuntime.jsx)(AssetsModal,{...e,inline:!0,visible:!0,onClose:()=>{}})}const styles=_reactNative.StyleSheet.create({inlineRoot:{flex:1,minHeight:0,backgroundColor:"transparent"},inlineHeader:{paddingHorizontal:12,paddingVertical:8,borderBottomWidth:1,borderBottomColor:_sharedUi.macOSColors.border.default,backgroundColor:"transparent"},listContainer:{flex:1},listContent:{paddingBottom:16},detailContainer:{flex:1},notice:{marginHorizontal:10,marginBottom:8,padding:10,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.border,backgroundColor:_sharedUi.night.color.surface,gap:4},noticeText:{color:_sharedUi.night.color.textSecondary,fontSize:11},retryText:{color:_sharedUi.night.color.text,fontSize:12,paddingVertical:6},fontsBox:{marginHorizontal:10,marginTop:8,padding:10,borderRadius:8,backgroundColor:_sharedUi.night.color.surface,gap:6},fontsTitle:{color:_sharedUi.night.color.textTertiary,fontSize:9,fontWeight:"700",letterSpacing:.5},fontsWrap:{flexDirection:"row",flexWrap:"wrap",gap:6},fontChip:{color:_sharedUi.night.color.textSecondary,fontSize:10,backgroundColor:_sharedUi.night.color.bg,borderRadius:999,paddingHorizontal:8,paddingVertical:3,overflow:"hidden"},empty:{alignItems:"center",padding:32,gap:8},emptyTitle:{color:_sharedUi.night.color.text,fontSize:13,fontWeight:"600"},emptyText:{color:_sharedUi.night.color.textSecondary,fontSize:11,textAlign:"center",lineHeight:16}});
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AssetsModal = AssetsModal;
7
+ exports.AssetsToolView = AssetsToolView;
8
+ var _react = require("react");
9
+ var _reactNative = require("react-native");
10
+ var _sharedUi = require("@buoy-gg/shared-ui");
11
+ var _install = require("../capture/install");
12
+ var _export = require("../export");
13
+ var _useAssetRecords = require("../hooks/useAssetRecords");
14
+ var _useAssetScanStatus = require("../hooks/useAssetScanStatus");
15
+ var _remote = require("../remote");
16
+ var _assetStore = require("../store/assetStore");
17
+ var _baseline = require("../store/baseline");
18
+ var _AssetDetail = require("./AssetDetail");
19
+ var _AssetRow = require("./AssetRow");
20
+ var _AssetsFilterBar = require("./AssetsFilterBar");
21
+ var _AssetsHeader = require("./AssetsHeader");
22
+ var _AssetsListControls = require("./AssetsListControls");
23
+ var _ScanNotice = require("./ScanNotice");
24
+ var _testIDs = require("../utils/testIDs");
25
+ var _jsxRuntime = require("react/jsx-runtime");
26
+ /**
27
+ * AssetsModal — bottom-sheet wrapper rendered by FloatingDevTools when the
28
+ * Assets tool is opened. Inventory list (largest first) → tap for detail.
29
+ * Opening triggers a full rescan (registry walk + Metro graph + size
30
+ * measurement); merely installing the package never hits the network.
31
+ */
32
+
33
+ function FontFamilies({
34
+ names
35
+ }) {
36
+ const families = [...new Set(names)];
37
+ if (!families.length) return null;
38
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
39
+ style: styles.fontsBox,
40
+ testID: _testIDs.ASSETS_TEST_IDS.fonts,
41
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
42
+ style: styles.fontsTitle,
43
+ testID: _testIDs.ASSETS_TEST_IDS.fontsTitle,
44
+ children: ["LOADED FONT FAMILIES (", families.length, ")"]
45
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
46
+ style: styles.fontsWrap,
47
+ children: families.map(family => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
48
+ style: styles.fontChip,
49
+ testID: (0, _testIDs.assetFontChipTestID)(family),
50
+ children: family
51
+ }, family))
52
+ })]
53
+ });
54
+ }
55
+ function EmptyState({
56
+ duplicates = false
57
+ }) {
58
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.ToolEmptyState, {
59
+ testID: _testIDs.ASSETS_TEST_IDS.empty
60
+ // scanning: a scan ran and found nothing — the copy says "try Rescan".
61
+ ,
62
+ otto: "scanning",
63
+ title: duplicates ? "No duplicates found" : "No assets found yet",
64
+ message: duplicates ? "No assets in this view share a content hash." : "Every bundled asset — images, fonts, video, audio — appears here with sizes, scale coverage, and runtime registration status. Try Rescan after navigating around the app."
65
+ });
66
+ }
67
+
68
+ /** Largest first — measured bytes, falling back to decoded estimate. */
69
+ function bySizeDesc(a, b) {
70
+ return (b.sizeBytes ?? (0, _assetStore.estDecodedBytes)(b)) - (a.sizeBytes ?? (0, _assetStore.estDecodedBytes)(a));
71
+ }
72
+ const COMPARATORS = {
73
+ size: bySizeDesc,
74
+ name: (a, b) => a.name.localeCompare(b.name) || a.type.localeCompare(b.type),
75
+ type: (a, b) => a.type.localeCompare(b.type) || bySizeDesc(a, b)
76
+ };
77
+ function AssetsModal({
78
+ visible,
79
+ onClose,
80
+ onBack,
81
+ onMinimize,
82
+ persistenceKey,
83
+ inline = false
84
+ }) {
85
+ // Safety net: the index import normally installed this already.
86
+ (0, _install.installAssetCapture)();
87
+ const {
88
+ records,
89
+ stats,
90
+ insights
91
+ } = (0, _useAssetRecords.useAssetRecords)();
92
+ const status = (0, _useAssetScanStatus.useAssetScanStatus)();
93
+ const [remoteError, setRemoteError] = (0, _react.useState)(false);
94
+ (0, _react.useEffect)(() => {
95
+ setRemoteError(false);
96
+ }, [status.graphFetchInFlight, status.lastScanAt]);
97
+ const retry = () => {
98
+ setRemoteError(false);
99
+ const remote = (0, _remote.remoteAssetsDispatch)();
100
+ if (remote) void remote("rescan").catch(() => setRemoteError(true));else void (0, _install.rescan)();
101
+ };
102
+ const [selectedId, setSelectedId] = (0, _react.useState)(null);
103
+ const [filter, setFilter] = (0, _react.useState)("all");
104
+ const [query, setQuery] = (0, _react.useState)("");
105
+ const [sort, setSort] = (0, _react.useState)("size");
106
+ const selected = selectedId != null ? (0, _assetStore.getRecord)(selectedId) : undefined;
107
+
108
+ // Full scan on open — locally on device, forwarded on dashboard mirrors.
109
+ // The baseline load is async and re-renders through the store emit.
110
+ (0, _react.useEffect)(() => {
111
+ if (!visible) return;
112
+ void (0, _baseline.loadBaseline)();
113
+ setRemoteError(false);
114
+ const remote = (0, _remote.remoteAssetsDispatch)();
115
+ if (remote) {
116
+ remote("rescan").catch(() => setRemoteError(true));
117
+ } else {
118
+ void (0, _install.rescan)();
119
+ }
120
+ }, [visible]);
121
+ const duplicateIds = new Set(insights.duplicates.flatMap(group => group.ids));
122
+ const sorted = [...records].sort(COMPARATORS[sort]);
123
+ const trimmedQuery = query.trim().toLowerCase();
124
+ const filtered = sorted.filter(r => {
125
+ if (filter === "unused" && r.loaded) return false;
126
+ if (filter === "duplicates" && !duplicateIds.has(r.id)) return false;
127
+ if (filter !== "all" && filter !== "unused" && filter !== "duplicates" && r.kind !== filter) return false;
128
+ if (trimmedQuery && !`${r.name}.${r.type}`.toLowerCase().includes(trimmedQuery)) {
129
+ return false;
130
+ }
131
+ return true;
132
+ });
133
+ const selectedIndex = selected ? filtered.findIndex(r => r.id === selected.id) : -1;
134
+ const stepTo = index => {
135
+ const target = filtered[index];
136
+ if (target) setSelectedId(target.id);
137
+ };
138
+
139
+ // Set lookups so each row's badge checks are O(1).
140
+ const flagSets = {
141
+ scaleGaps: new Set(insights.scaleGaps),
142
+ scaleAnomalies: new Set(insights.scaleAnomalies),
143
+ duplicates: duplicateIds,
144
+ webpCandidates: new Set(insights.webpCandidates),
145
+ overDecode: new Set(insights.overDecode),
146
+ heavy: new Set([...insights.heavyGifs, ...insights.heavyFonts])
147
+ };
148
+
149
+ // The proportional size bar is relative to the largest asset in view.
150
+ let maxBytes = 0;
151
+ for (const r of filtered) {
152
+ const bytes = r.sizeBytes ?? (0, _assetStore.estDecodedBytes)(r);
153
+ if (bytes > maxBytes) maxBytes = bytes;
154
+ }
155
+ const getReport = () => selected ? (0, _export.formatAssetMarkdown)(selected) : (0, _export.formatInventoryMarkdown)(sorted, stats, insights, (0, _install.getScanStatus)(), (0, _baseline.getDiff)());
156
+ const headerContent = /*#__PURE__*/(0, _jsxRuntime.jsx)(_AssetsHeader.AssetsHeader, {
157
+ stats: stats,
158
+ measuring: status.measuring,
159
+ discovering: status.graphFetchInFlight,
160
+ detailOpen: selected != null,
161
+ detailIndex: selectedIndex,
162
+ detailTotal: filtered.length,
163
+ onCloseDetail: () => setSelectedId(null),
164
+ onClear: _assetStore.clearRecords,
165
+ getReport: getReport,
166
+ onBack: onBack
167
+ });
168
+ const body = selected ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
169
+ style: styles.detailContainer,
170
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AssetDetail.AssetDetail, {
171
+ record: selected,
172
+ insights: insights
173
+ }), selectedIndex >= 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.EventStepperFooter, {
174
+ currentIndex: selectedIndex,
175
+ totalItems: filtered.length,
176
+ itemLabel: "Asset",
177
+ onPrevious: () => stepTo(selectedIndex - 1),
178
+ onNext: () => stepTo(selectedIndex + 1)
179
+ }) : null]
180
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
181
+ style: styles.listContainer,
182
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_AssetsFilterBar.AssetsFilterBar, {
183
+ stats: stats,
184
+ duplicateCount: duplicateIds.size,
185
+ filter: filter,
186
+ onChange: next => {
187
+ setFilter(next);
188
+ if (next === "duplicates") setQuery("");
189
+ }
190
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_AssetsListControls.AssetsListControls, {
191
+ query: query,
192
+ onQueryChange: setQuery,
193
+ sort: sort,
194
+ onSortChange: setSort
195
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ScanNotice.ScanNotice, {
196
+ status: status,
197
+ total: stats.total,
198
+ onRetry: retry
199
+ }), remoteError && !status.graphFetchInFlight ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
200
+ style: styles.notice,
201
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
202
+ style: styles.noticeText,
203
+ children: "Couldn't request an asset scan from the device."
204
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
205
+ accessibilityRole: "button",
206
+ onPress: retry,
207
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
208
+ style: styles.retryText,
209
+ children: "Retry"
210
+ })
211
+ })]
212
+ }) : null, filter === "unused" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
213
+ style: styles.notice,
214
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
215
+ style: styles.noticeText,
216
+ children: "Not seen in React Native's asset registry this app run. Assets loaded through other paths may appear here; this does not prove they are unused."
217
+ })
218
+ }) : null, filter === "font" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(FontFamilies, {
219
+ names: status.fontFamilies
220
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
221
+ testID: _testIDs.ASSETS_TEST_IDS.list,
222
+ data: filtered,
223
+ keyExtractor: item => String(item.id),
224
+ contentContainerStyle: styles.listContent,
225
+ renderItem: ({
226
+ item
227
+ }) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_AssetRow.AssetRow, {
228
+ record: item,
229
+ flags: {
230
+ scaleGap: flagSets.scaleGaps.has(item.id),
231
+ scaleAnomaly: flagSets.scaleAnomalies.has(item.id),
232
+ duplicate: flagSets.duplicates.has(item.id),
233
+ webp: flagSets.webpCandidates.has(item.id),
234
+ oversize: flagSets.overDecode.has(item.id),
235
+ heavy: flagSets.heavy.has(item.id)
236
+ },
237
+ sizeFraction: maxBytes > 0 ? (item.sizeBytes ?? (0, _assetStore.estDecodedBytes)(item)) / maxBytes : 0
238
+ // Guarded: programmatic invocations (automation) can call this
239
+ // with an event object instead of an id.
240
+ ,
241
+ onPress: id => setSelectedId(typeof id === "number" ? id : null)
242
+ }),
243
+ ListEmptyComponent: status.graphFetchInFlight ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(EmptyState, {
244
+ duplicates: filter === "duplicates"
245
+ })
246
+ })]
247
+ });
248
+
249
+ // The ONLY difference between phone and desktop is which shell the header
250
+ // and body go in (same pattern as ImagesModal).
251
+ if (inline) {
252
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
253
+ style: styles.inlineRoot,
254
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
255
+ style: styles.inlineHeader,
256
+ ..._sharedUi.windowDragProps,
257
+ children: headerContent
258
+ }), body]
259
+ });
260
+ }
261
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_sharedUi.JsModal, {
262
+ visible: visible,
263
+ onClose: onClose,
264
+ onMinimize: onMinimize,
265
+ persistenceKey: persistenceKey,
266
+ header: {
267
+ showToggleButton: true,
268
+ customContent: headerContent
269
+ },
270
+ enablePersistence: true,
271
+ initialMode: "bottomSheet",
272
+ disableScrollWrapper: true,
273
+ children: body
274
+ });
275
+ }
276
+
277
+ /**
278
+ * The same Assets tool rendered INLINE for hosts that place tools in a panel
279
+ * rather than a modal (the desktop dashboard). One implementation only.
280
+ */
281
+ function AssetsToolView(props = {}) {
282
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(AssetsModal, {
283
+ ...props,
284
+ inline: true,
285
+ visible: true,
286
+ onClose: () => {}
287
+ });
288
+ }
289
+ const styles = _reactNative.StyleSheet.create({
290
+ inlineRoot: {
291
+ flex: 1,
292
+ minHeight: 0,
293
+ // Transparent so the desktop workbench's hoisted sky (one field spanning
294
+ // sidebar + panel) shows through — the shell paints its base beneath it.
295
+ backgroundColor: "transparent"
296
+ },
297
+ inlineHeader: {
298
+ paddingHorizontal: 12,
299
+ paddingVertical: 8,
300
+ borderBottomWidth: 1,
301
+ borderBottomColor: _sharedUi.macOSColors.border.default,
302
+ // Clear, like Bench — the host's hoisted sky shows through the header.
303
+ backgroundColor: "transparent"
304
+ },
305
+ listContainer: {
306
+ flex: 1
307
+ },
308
+ listContent: {
309
+ paddingBottom: 16
310
+ },
311
+ detailContainer: {
312
+ flex: 1
313
+ },
314
+ notice: {
315
+ marginHorizontal: 10,
316
+ marginBottom: 8,
317
+ padding: 10,
318
+ borderRadius: 8,
319
+ borderWidth: 1,
320
+ borderColor: _sharedUi.night.color.border,
321
+ backgroundColor: _sharedUi.night.color.surface,
322
+ gap: 4
323
+ },
324
+ noticeText: {
325
+ color: _sharedUi.night.color.textSecondary,
326
+ fontSize: 11
327
+ },
328
+ retryText: {
329
+ color: _sharedUi.night.color.text,
330
+ fontSize: 12,
331
+ paddingVertical: 6
332
+ },
333
+ fontsBox: {
334
+ marginHorizontal: 10,
335
+ marginTop: 8,
336
+ padding: 10,
337
+ borderRadius: 8,
338
+ backgroundColor: _sharedUi.night.color.surface,
339
+ gap: 6
340
+ },
341
+ fontsTitle: {
342
+ color: _sharedUi.night.color.textTertiary,
343
+ fontSize: 9,
344
+ fontWeight: "700",
345
+ letterSpacing: 0.5
346
+ },
347
+ fontsWrap: {
348
+ flexDirection: "row",
349
+ flexWrap: "wrap",
350
+ gap: 6
351
+ },
352
+ fontChip: {
353
+ color: _sharedUi.night.color.textSecondary,
354
+ fontSize: 10,
355
+ backgroundColor: _sharedUi.night.color.bg,
356
+ borderRadius: 999,
357
+ paddingHorizontal: 8,
358
+ paddingVertical: 3,
359
+ overflow: "hidden"
360
+ },
361
+ empty: {
362
+ alignItems: "center",
363
+ padding: 32,
364
+ gap: 8
365
+ },
366
+ emptyTitle: {
367
+ color: _sharedUi.night.color.text,
368
+ fontSize: 13,
369
+ fontWeight: "600"
370
+ },
371
+ emptyText: {
372
+ color: _sharedUi.night.color.textSecondary,
373
+ fontSize: 11,
374
+ textAlign: "center",
375
+ lineHeight: 16
376
+ }
377
+ });
378
+ //# sourceMappingURL=AssetsModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNative","_sharedUi","_install","_export","_useAssetRecords","_useAssetScanStatus","_remote","_assetStore","_baseline","_AssetDetail","_AssetRow","_AssetsFilterBar","_AssetsHeader","_AssetsListControls","_ScanNotice","_testIDs","_jsxRuntime","FontFamilies","names","families","Set","length","jsxs","View","style","styles","fontsBox","testID","ASSETS_TEST_IDS","fonts","children","Text","fontsTitle","jsx","fontsWrap","map","family","fontChip","assetFontChipTestID","EmptyState","duplicates","ToolEmptyState","empty","otto","title","message","bySizeDesc","a","b","sizeBytes","estDecodedBytes","COMPARATORS","size","name","localeCompare","type","AssetsModal","visible","onClose","onBack","onMinimize","persistenceKey","inline","installAssetCapture","records","stats","insights","useAssetRecords","status","useAssetScanStatus","remoteError","setRemoteError","useState","useEffect","graphFetchInFlight","lastScanAt","retry","remote","remoteAssetsDispatch","catch","rescan","selectedId","setSelectedId","filter","setFilter","query","setQuery","sort","setSort","selected","getRecord","undefined","loadBaseline","duplicateIds","flatMap","group","ids","sorted","trimmedQuery","trim","toLowerCase","filtered","r","loaded","has","id","kind","includes","selectedIndex","findIndex","stepTo","index","target","flagSets","scaleGaps","scaleAnomalies","webpCandidates","overDecode","heavy","heavyGifs","heavyFonts","maxBytes","bytes","getReport","formatAssetMarkdown","formatInventoryMarkdown","getScanStatus","getDiff","headerContent","AssetsHeader","measuring","discovering","detailOpen","detailIndex","detailTotal","onCloseDetail","onClear","clearRecords","body","detailContainer","AssetDetail","record","EventStepperFooter","currentIndex","totalItems","itemLabel","onPrevious","onNext","listContainer","AssetsFilterBar","duplicateCount","onChange","next","AssetsListControls","onQueryChange","onSortChange","ScanNotice","total","onRetry","notice","noticeText","TouchableOpacity","accessibilityRole","onPress","retryText","fontFamilies","FlatList","list","data","keyExtractor","item","String","contentContainerStyle","listContent","renderItem","AssetRow","flags","scaleGap","scaleAnomaly","duplicate","webp","oversize","sizeFraction","ListEmptyComponent","inlineRoot","inlineHeader","windowDragProps","JsModal","header","showToggleButton","customContent","enablePersistence","initialMode","disableScrollWrapper","AssetsToolView","props","StyleSheet","create","flex","minHeight","backgroundColor","paddingHorizontal","paddingVertical","borderBottomWidth","borderBottomColor","macOSColors","border","default","paddingBottom","marginHorizontal","marginBottom","padding","borderRadius","borderWidth","borderColor","night","color","surface","gap","textSecondary","fontSize","text","marginTop","textTertiary","fontWeight","letterSpacing","flexDirection","flexWrap","bg","overflow","alignItems","emptyTitle","emptyText","textAlign","lineHeight"],"sourceRoot":"../../../src","sources":["components/AssetsModal.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1,85 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ScanNotice=ScanNotice;var _react=require("react"),_reactNative=require("react-native"),_sharedUi=require("@buoy-gg/shared-ui"),_testIDs=require("../utils/testIDs"),_jsxRuntime=require("react/jsx-runtime");function ScanNotice({status:e,total:t,onRetry:r}){const[s,i]=(0,_react.useState)(!1);(0,_react.useEffect)(()=>{if(i(!1),!e.graphFetchInFlight)return;const t=null==e.graphFetchStartedAt?0:Math.max(0,Date.now()-e.graphFetchStartedAt),r=setTimeout(()=>i(!0),Math.max(0,8e3-t));return()=>clearTimeout(r)},[e.graphFetchInFlight,e.graphFetchStartedAt]);const a=[];e.graphFetchInFlight&&(a.push(`Finding assets… ${t} found so far.`),s&&a.push("Still finding assets. This is taking longer than usual.")),e.registryAvailable||a.push("The asset registry is unavailable in this environment."),e.graphFetchInFlight||e.graphSupported||!e.graphError||a.push("Showing runtime-registered assets only. A development server is needed to find more assets and measure their sizes.");const n=!e.graphFetchInFlight&&e.graphSupported&&!!e.graphError;return n&&a.push(`Couldn't finish finding assets. Showing ${t} assets found so far.`),e.measuring&&!e.graphFetchInFlight&&a.push("Checking asset sizes…"),0===a.length?null:(0,_jsxRuntime.jsxs)(_reactNative.View,{style:styles.notice,testID:_testIDs.ASSETS_TEST_IDS.notice,children:[e.graphFetchInFlight?(0,_jsxRuntime.jsx)(_reactNative.ActivityIndicator,{size:"small",color:_sharedUi.night.color.textSecondary,accessibilityLabel:"Finding assets",testID:_testIDs.ASSETS_TEST_IDS.discoverySpinner}):null,a.map(e=>(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.noticeText,testID:_testIDs.ASSETS_TEST_IDS.noticeText,children:e},e)),n?(0,_jsxRuntime.jsx)(_reactNative.TouchableOpacity,{accessibilityRole:"button",onPress:r,testID:_testIDs.ASSETS_TEST_IDS.retry,children:(0,_jsxRuntime.jsx)(_reactNative.Text,{style:styles.retryText,children:"Retry"})}):null]})}const styles=_reactNative.StyleSheet.create({notice:{marginHorizontal:10,marginBottom:8,padding:10,borderRadius:8,borderWidth:1,borderColor:_sharedUi.night.color.border,backgroundColor:_sharedUi.night.color.surface,gap:4},noticeText:{color:_sharedUi.night.color.textSecondary,fontSize:11},retryText:{color:_sharedUi.night.color.text,fontSize:12,paddingVertical:6}});
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ScanNotice = ScanNotice;
7
+ var _react = require("react");
8
+ var _reactNative = require("react-native");
9
+ var _sharedUi = require("@buoy-gg/shared-ui");
10
+ var _testIDs = require("../utils/testIDs");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function ScanNotice({
13
+ status,
14
+ total,
15
+ onRetry
16
+ }) {
17
+ const [slow, setSlow] = (0, _react.useState)(false);
18
+ (0, _react.useEffect)(() => {
19
+ setSlow(false);
20
+ if (!status.graphFetchInFlight) return;
21
+ // Start locally for older snapshots that omit the device timestamp.
22
+ const elapsed = status.graphFetchStartedAt == null ? 0 : Math.max(0, Date.now() - status.graphFetchStartedAt);
23
+ const timer = setTimeout(() => setSlow(true), Math.max(0, 8_000 - elapsed));
24
+ return () => clearTimeout(timer);
25
+ }, [status.graphFetchInFlight, status.graphFetchStartedAt]);
26
+ const notices = [];
27
+ if (status.graphFetchInFlight) {
28
+ notices.push(`Finding assets… ${total} found so far.`);
29
+ if (slow) notices.push("Still finding assets. This is taking longer than usual.");
30
+ }
31
+ if (!status.registryAvailable) {
32
+ notices.push("The asset registry is unavailable in this environment.");
33
+ }
34
+ if (!status.graphFetchInFlight && !status.graphSupported && status.graphError) {
35
+ notices.push("Showing runtime-registered assets only. A development server is needed to find more assets and measure their sizes.");
36
+ }
37
+ const failed = !status.graphFetchInFlight && status.graphSupported && !!status.graphError;
38
+ if (failed) notices.push(`Couldn't finish finding assets. Showing ${total} assets found so far.`);
39
+ if (status.measuring && !status.graphFetchInFlight) notices.push("Checking asset sizes…");
40
+ if (notices.length === 0) return null;
41
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
42
+ style: styles.notice,
43
+ testID: _testIDs.ASSETS_TEST_IDS.notice,
44
+ children: [status.graphFetchInFlight ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {
45
+ size: "small",
46
+ color: _sharedUi.night.color.textSecondary,
47
+ accessibilityLabel: "Finding assets",
48
+ testID: _testIDs.ASSETS_TEST_IDS.discoverySpinner
49
+ }) : null, notices.map(n => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
50
+ style: styles.noticeText,
51
+ testID: _testIDs.ASSETS_TEST_IDS.noticeText,
52
+ children: n
53
+ }, n)), failed ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
54
+ accessibilityRole: "button",
55
+ onPress: onRetry,
56
+ testID: _testIDs.ASSETS_TEST_IDS.retry,
57
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
58
+ style: styles.retryText,
59
+ children: "Retry"
60
+ })
61
+ }) : null]
62
+ });
63
+ }
64
+ const styles = _reactNative.StyleSheet.create({
65
+ notice: {
66
+ marginHorizontal: 10,
67
+ marginBottom: 8,
68
+ padding: 10,
69
+ borderRadius: 8,
70
+ borderWidth: 1,
71
+ borderColor: _sharedUi.night.color.border,
72
+ backgroundColor: _sharedUi.night.color.surface,
73
+ gap: 4
74
+ },
75
+ noticeText: {
76
+ color: _sharedUi.night.color.textSecondary,
77
+ fontSize: 11
78
+ },
79
+ retryText: {
80
+ color: _sharedUi.night.color.text,
81
+ fontSize: 12,
82
+ paddingVertical: 6
83
+ }
84
+ });
85
+ //# sourceMappingURL=ScanNotice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","require","_reactNative","_sharedUi","_testIDs","_jsxRuntime","ScanNotice","status","total","onRetry","slow","setSlow","useState","useEffect","graphFetchInFlight","elapsed","graphFetchStartedAt","Math","max","Date","now","timer","setTimeout","clearTimeout","notices","push","registryAvailable","graphSupported","graphError","failed","measuring","length","jsxs","View","style","styles","notice","testID","ASSETS_TEST_IDS","children","jsx","ActivityIndicator","size","color","night","textSecondary","accessibilityLabel","discoverySpinner","map","n","Text","noticeText","TouchableOpacity","accessibilityRole","onPress","retry","retryText","StyleSheet","create","marginHorizontal","marginBottom","padding","borderRadius","borderWidth","borderColor","border","backgroundColor","surface","gap","fontSize","text","paddingVertical"],"sourceRoot":"../../../src","sources":["components/ScanNotice.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1,16 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getExpoPreviewImage=getExpoPreviewImage;let ExpoImage=null;try{ExpoImage=require("expo-image").Image??null}catch{}function getExpoPreviewImage(){return ExpoImage}
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getExpoPreviewImage = getExpoPreviewImage;
7
+ let ExpoImage = null;
8
+ try {
9
+ ExpoImage = require("expo-image").Image ?? null;
10
+ } catch {
11
+ // Optional peer: the package or its native module may be unavailable.
12
+ }
13
+ function getExpoPreviewImage() {
14
+ return ExpoImage;
15
+ }
16
+ //# sourceMappingURL=optionalExpoImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ExpoImage","require","Image","getExpoPreviewImage"],"sourceRoot":"../../../src","sources":["components/optionalExpoImage.ts"],"mappings":";;;;;;AAWA,IAAIA,SAAiD,GAAG,IAAI;AAC5D,IAAI;EACFA,SAAS,GAAGC,OAAO,CAAC,YAAY,CAAC,CAACC,KAAK,IAAI,IAAI;AACjD,CAAC,CAAC,MAAM;EACN;AAAA;AAGK,SAASC,mBAAmBA,CAAA,EAA2C;EAC5E,OAAOH,SAAS;AAClB","ignoreList":[]}
@@ -1 +1,11 @@
1
- "use strict";function getExpoPreviewImage(){return null}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getExpoPreviewImage=getExpoPreviewImage;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getExpoPreviewImage = getExpoPreviewImage;
7
+ /** Browser image elements already support SVG. */
8
+ function getExpoPreviewImage() {
9
+ return null;
10
+ }
11
+ //# sourceMappingURL=optionalExpoImage.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getExpoPreviewImage"],"sourceRoot":"../../../src","sources":["components/optionalExpoImage.web.ts"],"mappings":";;;;;;AAAA;AACO,SAASA,mBAAmBA,CAAA,EAAS;EAC1C,OAAO,IAAI;AACb","ignoreList":[]}
@@ -1 +1,62 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatAssetMarkdown=formatAssetMarkdown,exports.formatInventoryMarkdown=formatInventoryMarkdown;var _format=require("./format"),_assetStore=require("./store/assetStore");function formatAssetMarkdown(e){const t=[`# Asset: ${e.name}.${e.type}`,"",`- Kind: ${e.kind}`,"- Status: "+(e.loaded?"loaded at runtime":"not observed in the runtime registry")];"image"===e.kind&&t.push(`- Dimensions: ${(0,_format.formatDimensions)(e)} (logical)`),e.scales.length&&t.push(`- Scales: ${(0,_format.formatScales)(e.scales)}`),null!=e.sizeBytes&&"measured"===e.sizeSource&&t.push(`- Size (all variants): ${(0,_format.formatBytes)(e.sizeBytes)}`);const s=(0,_assetStore.estDecodedBytes)(e);return s>0&&t.push(`- Decoded memory: ~${(0,_format.formatBytes)(s)}`),e.hash&&t.push(`- Hash: ${e.hash}`),e.httpServerLocation&&t.push(`- Location: ${e.httpServerLocation}`),e.fileSystemLocation&&t.push(`- Source dir: ${e.fileSystemLocation}`),e.resolvedUri&&t.push(`- Resolved URI: ${e.resolvedUri}`),t.join("\n")}function formatInventoryMarkdown(e,t,s,o,a){const n=["# Asset inventory","",`${t.total} assets · ${t.loaded} loaded · ${t.neverLoaded} not observed`+(t.totalBytes>0?` · ${(0,_format.formatBytes)(t.totalBytes)} measured (${t.measuredCount}/${t.total})`:"")];if(o.fontFamilies.length&&n.push(`Fonts loaded: ${o.fontFamilies.join(", ")}`),o.graphSupported||n.push(o.graphError?`_Metro bundle graph unavailable (${o.graphError}) — runtime-registered assets only._`:"_No Metro bundle graph — runtime-registered assets only (release build)._"),a){const e=null!=a.netBytes?`${a.netBytes>=0?"+":"−"}${(0,_format.formatBytes)(Math.abs(a.netBytes))} net`:"net size unknown";n.push("",`## Since baseline (${new Date(a.baselineSavedAt).toISOString()})`,`- ${a.added.length} added · ${a.removed.length} removed · ${a.grown.length} grew · ${e}`);for(const e of a.removed.slice(0,20))n.push(`- removed: ${e.name}.${e.type}`)}const r=[];s.neverLoaded.length&&r.push(`- ${s.neverLoaded.length} shipped but not observed`),s.duplicates.length&&r.push(`- ${s.duplicates.length} duplicate content groups`),s.webpCandidates.length&&r.push(`- ${s.webpCandidates.length} WebP conversion candidates`),s.scaleGaps.length&&r.push(`- ${s.scaleGaps.length} scale-coverage gaps`),s.overDecode.length&&r.push(`- ${s.overDecode.length} images decoding larger than 2× the screen`),s.heavyGifs.length&&r.push(`- ${s.heavyGifs.length} heavy GIFs (convert to video/Lottie)`),s.heavyFonts.length&&r.push(`- ${s.heavyFonts.length} heavy fonts (subset candidates)`),s.scaleAnomalies.length&&r.push(`- ${s.scaleAnomalies.length} scale-variant anomalies (check exports)`),r.length&&n.push("","## Findings",...r),n.push("","## Assets (largest first)","","| Asset | Kind | Dimensions | Scales | Size | Loaded |","| --- | --- | --- | --- | --- | --- |");for(const t of e){const e=null!=t.sizeBytes&&"measured"===t.sizeSource?(0,_format.formatBytes)(t.sizeBytes):(0,_assetStore.estDecodedBytes)(t)>0?`~${(0,_format.formatBytes)((0,_assetStore.estDecodedBytes)(t))}`:"—";n.push(`| ${t.name}.${t.type} | ${t.kind} | ${"image"===t.kind?(0,_format.formatDimensions)(t):"—"} | ${(0,_format.formatScales)(t.scales)} | ${e} | ${t.loaded?"yes":"NO"} |`)}return n.join("\n")}
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.formatAssetMarkdown = formatAssetMarkdown;
7
+ exports.formatInventoryMarkdown = formatInventoryMarkdown;
8
+ var _format = require("./format");
9
+ var _assetStore = require("./store/assetStore");
10
+ /**
11
+ * Markdown reports for the shared ToolbarCopyButton — the paste-into-your-
12
+ * issue-tracker view of the inventory.
13
+ */
14
+
15
+ function formatAssetMarkdown(record) {
16
+ const lines = [`# Asset: ${record.name}.${record.type}`, "", `- Kind: ${record.kind}`, `- Status: ${record.loaded ? "loaded at runtime" : "not observed in the runtime registry"}`];
17
+ if (record.kind === "image") lines.push(`- Dimensions: ${(0, _format.formatDimensions)(record)} (logical)`);
18
+ if (record.scales.length) lines.push(`- Scales: ${(0, _format.formatScales)(record.scales)}`);
19
+ if (record.sizeBytes != null && record.sizeSource === "measured") {
20
+ lines.push(`- Size (all variants): ${(0, _format.formatBytes)(record.sizeBytes)}`);
21
+ }
22
+ const estimate = (0, _assetStore.estDecodedBytes)(record);
23
+ if (estimate > 0) lines.push(`- Decoded memory: ~${(0, _format.formatBytes)(estimate)}`);
24
+ if (record.hash) lines.push(`- Hash: ${record.hash}`);
25
+ if (record.httpServerLocation) lines.push(`- Location: ${record.httpServerLocation}`);
26
+ if (record.fileSystemLocation) lines.push(`- Source dir: ${record.fileSystemLocation}`);
27
+ if (record.resolvedUri) lines.push(`- Resolved URI: ${record.resolvedUri}`);
28
+ return lines.join("\n");
29
+ }
30
+ function formatInventoryMarkdown(records, stats, insights, scanStatus, diff) {
31
+ const lines = ["# Asset inventory", "", `${stats.total} assets · ${stats.loaded} loaded · ${stats.neverLoaded} not observed` + (stats.totalBytes > 0 ? ` · ${(0, _format.formatBytes)(stats.totalBytes)} measured (${stats.measuredCount}/${stats.total})` : "")];
32
+ if (scanStatus.fontFamilies.length) {
33
+ lines.push(`Fonts loaded: ${scanStatus.fontFamilies.join(", ")}`);
34
+ }
35
+ if (!scanStatus.graphSupported) {
36
+ lines.push(scanStatus.graphError ? `_Metro bundle graph unavailable (${scanStatus.graphError}) — runtime-registered assets only._` : "_No Metro bundle graph — runtime-registered assets only (release build)._");
37
+ }
38
+ if (diff) {
39
+ const net = diff.netBytes != null ? `${diff.netBytes >= 0 ? "+" : "−"}${(0, _format.formatBytes)(Math.abs(diff.netBytes))} net` : "net size unknown";
40
+ lines.push("", `## Since baseline (${new Date(diff.baselineSavedAt).toISOString()})`, `- ${diff.added.length} added · ${diff.removed.length} removed · ${diff.grown.length} grew · ${net}`);
41
+ for (const gone of diff.removed.slice(0, 20)) {
42
+ lines.push(`- removed: ${gone.name}.${gone.type}`);
43
+ }
44
+ }
45
+ const findings = [];
46
+ if (insights.neverLoaded.length) findings.push(`- ${insights.neverLoaded.length} shipped but not observed`);
47
+ if (insights.duplicates.length) findings.push(`- ${insights.duplicates.length} duplicate content groups`);
48
+ if (insights.webpCandidates.length) findings.push(`- ${insights.webpCandidates.length} WebP conversion candidates`);
49
+ if (insights.scaleGaps.length) findings.push(`- ${insights.scaleGaps.length} scale-coverage gaps`);
50
+ if (insights.overDecode.length) findings.push(`- ${insights.overDecode.length} images decoding larger than 2× the screen`);
51
+ if (insights.heavyGifs.length) findings.push(`- ${insights.heavyGifs.length} heavy GIFs (convert to video/Lottie)`);
52
+ if (insights.heavyFonts.length) findings.push(`- ${insights.heavyFonts.length} heavy fonts (subset candidates)`);
53
+ if (insights.scaleAnomalies.length) findings.push(`- ${insights.scaleAnomalies.length} scale-variant anomalies (check exports)`);
54
+ if (findings.length) lines.push("", "## Findings", ...findings);
55
+ lines.push("", "## Assets (largest first)", "", "| Asset | Kind | Dimensions | Scales | Size | Loaded |", "| --- | --- | --- | --- | --- | --- |");
56
+ for (const r of records) {
57
+ const size = r.sizeBytes != null && r.sizeSource === "measured" ? (0, _format.formatBytes)(r.sizeBytes) : (0, _assetStore.estDecodedBytes)(r) > 0 ? `~${(0, _format.formatBytes)((0, _assetStore.estDecodedBytes)(r))}` : "—";
58
+ lines.push(`| ${r.name}.${r.type} | ${r.kind} | ${r.kind === "image" ? (0, _format.formatDimensions)(r) : "—"} | ${(0, _format.formatScales)(r.scales)} | ${size} | ${r.loaded ? "yes" : "NO"} |`);
59
+ }
60
+ return lines.join("\n");
61
+ }
62
+ //# sourceMappingURL=export.js.map