@buoy-gg/assets 7.0.16

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 (179) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +55 -0
  3. package/lib/commonjs/capture/expo.js +46 -0
  4. package/lib/commonjs/capture/expo.js.map +1 -0
  5. package/lib/commonjs/capture/install.js +78 -0
  6. package/lib/commonjs/capture/install.js.map +1 -0
  7. package/lib/commonjs/capture/measure.js +186 -0
  8. package/lib/commonjs/capture/measure.js.map +1 -0
  9. package/lib/commonjs/capture/metroGraph.js +148 -0
  10. package/lib/commonjs/capture/metroGraph.js.map +1 -0
  11. package/lib/commonjs/capture/registry.js +124 -0
  12. package/lib/commonjs/capture/registry.js.map +1 -0
  13. package/lib/commonjs/components/AssetDetail.js +205 -0
  14. package/lib/commonjs/components/AssetDetail.js.map +1 -0
  15. package/lib/commonjs/components/AssetRow.js +246 -0
  16. package/lib/commonjs/components/AssetRow.js.map +1 -0
  17. package/lib/commonjs/components/AssetsFilterBar.js +92 -0
  18. package/lib/commonjs/components/AssetsFilterBar.js.map +1 -0
  19. package/lib/commonjs/components/AssetsHeader.js +66 -0
  20. package/lib/commonjs/components/AssetsHeader.js.map +1 -0
  21. package/lib/commonjs/components/AssetsIcon.js +19 -0
  22. package/lib/commonjs/components/AssetsIcon.js.map +1 -0
  23. package/lib/commonjs/components/AssetsListControls.js +94 -0
  24. package/lib/commonjs/components/AssetsListControls.js.map +1 -0
  25. package/lib/commonjs/components/AssetsModal.js +338 -0
  26. package/lib/commonjs/components/AssetsModal.js.map +1 -0
  27. package/lib/commonjs/components/BaselineBar.js +110 -0
  28. package/lib/commonjs/components/BaselineBar.js.map +1 -0
  29. package/lib/commonjs/export.js +62 -0
  30. package/lib/commonjs/export.js.map +1 -0
  31. package/lib/commonjs/format.js +59 -0
  32. package/lib/commonjs/format.js.map +1 -0
  33. package/lib/commonjs/hooks/useAssetRecords.js +22 -0
  34. package/lib/commonjs/hooks/useAssetRecords.js.map +1 -0
  35. package/lib/commonjs/index.js +260 -0
  36. package/lib/commonjs/index.js.map +1 -0
  37. package/lib/commonjs/package.json +1 -0
  38. package/lib/commonjs/preset.js +45 -0
  39. package/lib/commonjs/preset.js.map +1 -0
  40. package/lib/commonjs/remote.js +65 -0
  41. package/lib/commonjs/remote.js.map +1 -0
  42. package/lib/commonjs/state.js +51 -0
  43. package/lib/commonjs/state.js.map +1 -0
  44. package/lib/commonjs/store/assetStore.js +234 -0
  45. package/lib/commonjs/store/assetStore.js.map +1 -0
  46. package/lib/commonjs/store/baseline.js +165 -0
  47. package/lib/commonjs/store/baseline.js.map +1 -0
  48. package/lib/commonjs/store/insights.js +129 -0
  49. package/lib/commonjs/store/insights.js.map +1 -0
  50. package/lib/commonjs/sync/assetsSyncAdapter.js +157 -0
  51. package/lib/commonjs/sync/assetsSyncAdapter.js.map +1 -0
  52. package/lib/commonjs/types.js +2 -0
  53. package/lib/commonjs/types.js.map +1 -0
  54. package/lib/module/capture/expo.js +41 -0
  55. package/lib/module/capture/expo.js.map +1 -0
  56. package/lib/module/capture/install.js +72 -0
  57. package/lib/module/capture/install.js.map +1 -0
  58. package/lib/module/capture/measure.js +179 -0
  59. package/lib/module/capture/measure.js.map +1 -0
  60. package/lib/module/capture/metroGraph.js +141 -0
  61. package/lib/module/capture/metroGraph.js.map +1 -0
  62. package/lib/module/capture/registry.js +117 -0
  63. package/lib/module/capture/registry.js.map +1 -0
  64. package/lib/module/components/AssetDetail.js +201 -0
  65. package/lib/module/components/AssetDetail.js.map +1 -0
  66. package/lib/module/components/AssetRow.js +242 -0
  67. package/lib/module/components/AssetRow.js.map +1 -0
  68. package/lib/module/components/AssetsFilterBar.js +88 -0
  69. package/lib/module/components/AssetsFilterBar.js.map +1 -0
  70. package/lib/module/components/AssetsHeader.js +62 -0
  71. package/lib/module/components/AssetsHeader.js.map +1 -0
  72. package/lib/module/components/AssetsIcon.js +12 -0
  73. package/lib/module/components/AssetsIcon.js.map +1 -0
  74. package/lib/module/components/AssetsListControls.js +90 -0
  75. package/lib/module/components/AssetsListControls.js.map +1 -0
  76. package/lib/module/components/AssetsModal.js +333 -0
  77. package/lib/module/components/AssetsModal.js.map +1 -0
  78. package/lib/module/components/BaselineBar.js +106 -0
  79. package/lib/module/components/BaselineBar.js.map +1 -0
  80. package/lib/module/export.js +57 -0
  81. package/lib/module/export.js.map +1 -0
  82. package/lib/module/format.js +51 -0
  83. package/lib/module/format.js.map +1 -0
  84. package/lib/module/hooks/useAssetRecords.js +18 -0
  85. package/lib/module/hooks/useAssetRecords.js.map +1 -0
  86. package/lib/module/index.js +59 -0
  87. package/lib/module/index.js.map +1 -0
  88. package/lib/module/preset.js +40 -0
  89. package/lib/module/preset.js.map +1 -0
  90. package/lib/module/remote.js +58 -0
  91. package/lib/module/remote.js.map +1 -0
  92. package/lib/module/state.js +47 -0
  93. package/lib/module/state.js.map +1 -0
  94. package/lib/module/store/assetStore.js +219 -0
  95. package/lib/module/store/assetStore.js.map +1 -0
  96. package/lib/module/store/baseline.js +157 -0
  97. package/lib/module/store/baseline.js.map +1 -0
  98. package/lib/module/store/insights.js +125 -0
  99. package/lib/module/store/insights.js.map +1 -0
  100. package/lib/module/sync/assetsSyncAdapter.js +153 -0
  101. package/lib/module/sync/assetsSyncAdapter.js.map +1 -0
  102. package/lib/module/types.js +2 -0
  103. package/lib/module/types.js.map +1 -0
  104. package/lib/typescript/capture/expo.d.ts +18 -0
  105. package/lib/typescript/capture/expo.d.ts.map +1 -0
  106. package/lib/typescript/capture/install.d.ts +17 -0
  107. package/lib/typescript/capture/install.d.ts.map +1 -0
  108. package/lib/typescript/capture/measure.d.ts +38 -0
  109. package/lib/typescript/capture/measure.d.ts.map +1 -0
  110. package/lib/typescript/capture/metroGraph.d.ts +33 -0
  111. package/lib/typescript/capture/metroGraph.d.ts.map +1 -0
  112. package/lib/typescript/capture/registry.d.ts +45 -0
  113. package/lib/typescript/capture/registry.d.ts.map +1 -0
  114. package/lib/typescript/components/AssetDetail.d.ts +17 -0
  115. package/lib/typescript/components/AssetDetail.d.ts.map +1 -0
  116. package/lib/typescript/components/AssetRow.d.ts +32 -0
  117. package/lib/typescript/components/AssetRow.d.ts.map +1 -0
  118. package/lib/typescript/components/AssetsFilterBar.d.ts +16 -0
  119. package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -0
  120. package/lib/typescript/components/AssetsHeader.d.ts +22 -0
  121. package/lib/typescript/components/AssetsHeader.d.ts.map +1 -0
  122. package/lib/typescript/components/AssetsIcon.d.ts +9 -0
  123. package/lib/typescript/components/AssetsIcon.d.ts.map +1 -0
  124. package/lib/typescript/components/AssetsListControls.d.ts +18 -0
  125. package/lib/typescript/components/AssetsListControls.d.ts.map +1 -0
  126. package/lib/typescript/components/AssetsModal.d.ts +24 -0
  127. package/lib/typescript/components/AssetsModal.d.ts.map +1 -0
  128. package/lib/typescript/components/BaselineBar.d.ts +13 -0
  129. package/lib/typescript/components/BaselineBar.d.ts.map +1 -0
  130. package/lib/typescript/export.d.ts +8 -0
  131. package/lib/typescript/export.d.ts.map +1 -0
  132. package/lib/typescript/format.d.ts +13 -0
  133. package/lib/typescript/format.d.ts.map +1 -0
  134. package/lib/typescript/hooks/useAssetRecords.d.ts +11 -0
  135. package/lib/typescript/hooks/useAssetRecords.d.ts.map +1 -0
  136. package/lib/typescript/index.d.ts +26 -0
  137. package/lib/typescript/index.d.ts.map +1 -0
  138. package/lib/typescript/preset.d.ts +38 -0
  139. package/lib/typescript/preset.d.ts.map +1 -0
  140. package/lib/typescript/remote.d.ts +17 -0
  141. package/lib/typescript/remote.d.ts.map +1 -0
  142. package/lib/typescript/state.d.ts +41 -0
  143. package/lib/typescript/state.d.ts.map +1 -0
  144. package/lib/typescript/store/assetStore.d.ts +51 -0
  145. package/lib/typescript/store/assetStore.d.ts.map +1 -0
  146. package/lib/typescript/store/baseline.d.ts +22 -0
  147. package/lib/typescript/store/baseline.d.ts.map +1 -0
  148. package/lib/typescript/store/insights.d.ts +7 -0
  149. package/lib/typescript/store/insights.d.ts.map +1 -0
  150. package/lib/typescript/sync/assetsSyncAdapter.d.ts +83 -0
  151. package/lib/typescript/sync/assetsSyncAdapter.d.ts.map +1 -0
  152. package/lib/typescript/types.d.ts +162 -0
  153. package/lib/typescript/types.d.ts.map +1 -0
  154. package/package.json +77 -0
  155. package/src/capture/expo.ts +45 -0
  156. package/src/capture/install.ts +73 -0
  157. package/src/capture/measure.ts +167 -0
  158. package/src/capture/metroGraph.ts +146 -0
  159. package/src/capture/registry.ts +134 -0
  160. package/src/components/AssetDetail.tsx +207 -0
  161. package/src/components/AssetRow.tsx +243 -0
  162. package/src/components/AssetsFilterBar.tsx +99 -0
  163. package/src/components/AssetsHeader.tsx +75 -0
  164. package/src/components/AssetsIcon.tsx +9 -0
  165. package/src/components/AssetsListControls.tsx +101 -0
  166. package/src/components/AssetsModal.tsx +368 -0
  167. package/src/components/BaselineBar.tsx +98 -0
  168. package/src/export.ts +108 -0
  169. package/src/format.ts +53 -0
  170. package/src/hooks/useAssetRecords.ts +26 -0
  171. package/src/index.tsx +87 -0
  172. package/src/preset.tsx +35 -0
  173. package/src/remote.ts +65 -0
  174. package/src/state.ts +84 -0
  175. package/src/store/assetStore.ts +209 -0
  176. package/src/store/baseline.ts +152 -0
  177. package/src/store/insights.ts +145 -0
  178. package/src/sync/assetsSyncAdapter.ts +151 -0
  179. package/src/types.ts +160 -0
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.disableAssetsCapture = disableAssetsCapture;
7
+ exports.remoteAssetsDispatch = remoteAssetsDispatch;
8
+ exports.replaceAssetsFromSnapshot = replaceAssetsFromSnapshot;
9
+ exports.setRemoteAssetsHandler = setRemoteAssetsHandler;
10
+ var _state = require("./state");
11
+ var _assetStore = require("./store/assetStore");
12
+ /**
13
+ * Remote-dispatch seam for dashboard mirrors (Buoy Desktop).
14
+ *
15
+ * On device this stays null and every action runs locally. A dashboard sets
16
+ * a handler that forwards action name + params over external-sync to the
17
+ * SAME adapter actions the MCP uses (sync/assetsSyncAdapter.ts), so one
18
+ * action vocabulary serves phone UI, desktop UI, and LLM automation.
19
+ */
20
+
21
+ function setRemoteAssetsHandler(handler) {
22
+ (0, _state.assetsState)().remoteDispatch = handler;
23
+ }
24
+ function remoteAssetsDispatch() {
25
+ return (0, _state.assetsState)().remoteDispatch;
26
+ }
27
+
28
+ /** Dashboards never scan their own bundle — the store is purely a mirror. */
29
+ function disableAssetsCapture() {
30
+ (0, _state.assetsState)().captureDisabled = true;
31
+ }
32
+
33
+ /** Replace the whole store from a synced adapter snapshot. */
34
+ function replaceAssetsFromSnapshot(payload) {
35
+ const s = (0, _state.assetsState)();
36
+ const wire = payload.records ?? [];
37
+ s.records = wire.map(w => ({
38
+ id: w.id,
39
+ key: w.key,
40
+ registryId: w.registryId ?? undefined,
41
+ name: w.name,
42
+ type: w.type,
43
+ kind: w.kind,
44
+ hash: w.hash ?? undefined,
45
+ httpServerLocation: w.location ?? undefined,
46
+ width: w.width ?? undefined,
47
+ height: w.height ?? undefined,
48
+ scales: w.scales,
49
+ resolvedUri: w.uri ?? undefined,
50
+ loaded: w.loaded,
51
+ origin: w.registryId != null ? "registry" : "graph",
52
+ sizeBytes: w.sizeBytes ?? undefined,
53
+ sizeSource: w.sizeSource ?? undefined,
54
+ firstSeenAt: Date.now()
55
+ }));
56
+ s.byKey = new Map(s.records.map(r => [r.key, r]));
57
+ s.byId = new Map(s.records.map(r => [r.id, r]));
58
+ if (payload.scanStatus) {
59
+ s.mirrorScanStatus = payload.scanStatus;
60
+ s.fontFamilies = payload.scanStatus.fontFamilies ?? [];
61
+ }
62
+ s.mirrorDiff = payload.diff ?? null;
63
+ (0, _assetStore.invalidate)();
64
+ }
65
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_state","require","_assetStore","setRemoteAssetsHandler","handler","assetsState","remoteDispatch","remoteAssetsDispatch","disableAssetsCapture","captureDisabled","replaceAssetsFromSnapshot","payload","s","wire","records","map","w","id","key","registryId","undefined","name","type","kind","hash","httpServerLocation","location","width","height","scales","resolvedUri","uri","loaded","origin","sizeBytes","sizeSource","firstSeenAt","Date","now","byKey","Map","r","byId","scanStatus","mirrorScanStatus","fontFamilies","mirrorDiff","diff","invalidate"],"sourceRoot":"../../src","sources":["remote.ts"],"mappings":";;;;;;;;;AASA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWO,SAASE,sBAAsBA,CACpCC,OAAoC,EAC9B;EACN,IAAAC,kBAAW,EAAC,CAAC,CAACC,cAAc,GAAGF,OAAO;AACxC;AAEO,SAASG,oBAAoBA,CAAA,EAAgC;EAClE,OAAO,IAAAF,kBAAW,EAAC,CAAC,CAACC,cAAc;AACrC;;AAEA;AACO,SAASE,oBAAoBA,CAAA,EAAS;EAC3C,IAAAH,kBAAW,EAAC,CAAC,CAACI,eAAe,GAAG,IAAI;AACtC;;AAEA;AACO,SAASC,yBAAyBA,CAACC,OAA8B,EAAQ;EAC9E,MAAMC,CAAC,GAAG,IAAAP,kBAAW,EAAC,CAAC;EACvB,MAAMQ,IAAI,GAAGF,OAAO,CAACG,OAAO,IAAI,EAAE;EAClCF,CAAC,CAACE,OAAO,GAAGD,IAAI,CAACE,GAAG,CAAEC,CAAC,KAAM;IAC3BC,EAAE,EAAED,CAAC,CAACC,EAAE;IACRC,GAAG,EAAEF,CAAC,CAACE,GAAG;IACVC,UAAU,EAAEH,CAAC,CAACG,UAAU,IAAIC,SAAS;IACrCC,IAAI,EAAEL,CAAC,CAACK,IAAI;IACZC,IAAI,EAAEN,CAAC,CAACM,IAAI;IACZC,IAAI,EAAEP,CAAC,CAACO,IAAI;IACZC,IAAI,EAAER,CAAC,CAACQ,IAAI,IAAIJ,SAAS;IACzBK,kBAAkB,EAAET,CAAC,CAACU,QAAQ,IAAIN,SAAS;IAC3CO,KAAK,EAAEX,CAAC,CAACW,KAAK,IAAIP,SAAS;IAC3BQ,MAAM,EAAEZ,CAAC,CAACY,MAAM,IAAIR,SAAS;IAC7BS,MAAM,EAAEb,CAAC,CAACa,MAAM;IAChBC,WAAW,EAAEd,CAAC,CAACe,GAAG,IAAIX,SAAS;IAC/BY,MAAM,EAAEhB,CAAC,CAACgB,MAAM;IAChBC,MAAM,EAAEjB,CAAC,CAACG,UAAU,IAAI,IAAI,GAAI,UAAU,GAAc,OAAiB;IACzEe,SAAS,EAAElB,CAAC,CAACkB,SAAS,IAAId,SAAS;IACnCe,UAAU,EAAEnB,CAAC,CAACmB,UAAU,IAAIf,SAAS;IACrCgB,WAAW,EAAEC,IAAI,CAACC,GAAG,CAAC;EACxB,CAAC,CAAC,CAAC;EACH1B,CAAC,CAAC2B,KAAK,GAAG,IAAIC,GAAG,CAAC5B,CAAC,CAACE,OAAO,CAACC,GAAG,CAAE0B,CAAC,IAAK,CAACA,CAAC,CAACvB,GAAG,EAAEuB,CAAC,CAAC,CAAC,CAAC;EACnD7B,CAAC,CAAC8B,IAAI,GAAG,IAAIF,GAAG,CAAC5B,CAAC,CAACE,OAAO,CAACC,GAAG,CAAE0B,CAAC,IAAK,CAACA,CAAC,CAACxB,EAAE,EAAEwB,CAAC,CAAC,CAAC,CAAC;EACjD,IAAI9B,OAAO,CAACgC,UAAU,EAAE;IACtB/B,CAAC,CAACgC,gBAAgB,GAAGjC,OAAO,CAACgC,UAAU;IACvC/B,CAAC,CAACiC,YAAY,GAAGlC,OAAO,CAACgC,UAAU,CAACE,YAAY,IAAI,EAAE;EACxD;EACAjC,CAAC,CAACkC,UAAU,GAAGnC,OAAO,CAACoC,IAAI,IAAI,IAAI;EACnC,IAAAC,sBAAU,EAAC,CAAC;AACd","ignoreList":[]}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assetsState = assetsState;
7
+ /**
8
+ * Global singleton state for the Assets tool.
9
+ *
10
+ * Same rationale as the images tool: the package can be evaluated as two
11
+ * module instances (lib vs src resolution), and the registerAsset patch must
12
+ * share one store with whichever copy the UI renders from. All mutable state
13
+ * lives on globalThis under a well-known symbol.
14
+ */
15
+
16
+ const KEY = Symbol.for("buoy.assets.globalState.v1");
17
+ function assetsState() {
18
+ const g = globalThis;
19
+ if (!g[KEY]) {
20
+ g[KEY] = {
21
+ records: [],
22
+ byKey: new Map(),
23
+ byId: new Map(),
24
+ nextId: 1,
25
+ listeners: new Set(),
26
+ snapshot: [],
27
+ emitScheduled: false,
28
+ installed: false,
29
+ patched: false,
30
+ registryAvailable: false,
31
+ graphSupported: false,
32
+ graphCount: null,
33
+ graphError: null,
34
+ graphFetchInFlight: false,
35
+ lastScanAt: null,
36
+ measuring: false,
37
+ measuredCount: 0,
38
+ fontFamilies: [],
39
+ localAssetCount: null,
40
+ baseline: null,
41
+ baselineLoaded: false,
42
+ captureDisabled: false,
43
+ remoteDispatch: null,
44
+ mirrorScanStatus: null,
45
+ mirrorPixelRatio: null,
46
+ mirrorDiff: null
47
+ };
48
+ }
49
+ return g[KEY];
50
+ }
51
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["KEY","Symbol","for","assetsState","g","globalThis","records","byKey","Map","byId","nextId","listeners","Set","snapshot","emitScheduled","installed","patched","registryAvailable","graphSupported","graphCount","graphError","graphFetchInFlight","lastScanAt","measuring","measuredCount","fontFamilies","localAssetCount","baseline","baselineLoaded","captureDisabled","remoteDispatch","mirrorScanStatus","mirrorPixelRatio","mirrorDiff"],"sourceRoot":"../../src","sources":["state.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAyCA,MAAMA,GAAG,GAAGC,MAAM,CAACC,GAAG,CAAC,4BAA4B,CAAC;AAE7C,SAASC,WAAWA,CAAA,EAAsB;EAC/C,MAAMC,CAAC,GAAGC,UAA2D;EACrE,IAAI,CAACD,CAAC,CAACJ,GAAG,CAAC,EAAE;IACXI,CAAC,CAACJ,GAAG,CAAC,GAAG;MACPM,OAAO,EAAE,EAAE;MACXC,KAAK,EAAE,IAAIC,GAAG,CAAC,CAAC;MAChBC,IAAI,EAAE,IAAID,GAAG,CAAC,CAAC;MACfE,MAAM,EAAE,CAAC;MACTC,SAAS,EAAE,IAAIC,GAAG,CAAC,CAAC;MACpBC,QAAQ,EAAE,EAAE;MACZC,aAAa,EAAE,KAAK;MACpBC,SAAS,EAAE,KAAK;MAChBC,OAAO,EAAE,KAAK;MACdC,iBAAiB,EAAE,KAAK;MACxBC,cAAc,EAAE,KAAK;MACrBC,UAAU,EAAE,IAAI;MAChBC,UAAU,EAAE,IAAI;MAChBC,kBAAkB,EAAE,KAAK;MACzBC,UAAU,EAAE,IAAI;MAChBC,SAAS,EAAE,KAAK;MAChBC,aAAa,EAAE,CAAC;MAChBC,YAAY,EAAE,EAAE;MAChBC,eAAe,EAAE,IAAI;MACrBC,QAAQ,EAAE,IAAI;MACdC,cAAc,EAAE,KAAK;MACrBC,eAAe,EAAE,KAAK;MACtBC,cAAc,EAAE,IAAI;MACpBC,gBAAgB,EAAE,IAAI;MACtBC,gBAAgB,EAAE,IAAI;MACtBC,UAAU,EAAE;IACd,CAAC;EACH;EACA,OAAO7B,CAAC,CAACJ,GAAG,CAAC;AACf","ignoreList":[]}
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.assetKey = assetKey;
7
+ exports.clearRecords = clearRecords;
8
+ exports.computeStats = computeStats;
9
+ exports.estDecodedBytes = estDecodedBytes;
10
+ exports.getRecord = getRecord;
11
+ exports.getRecordByKey = getRecordByKey;
12
+ exports.getSnapshot = getSnapshot;
13
+ exports.invalidate = invalidate;
14
+ exports.kindForType = kindForType;
15
+ exports.subscribe = subscribe;
16
+ exports.updateRecord = updateRecord;
17
+ exports.upsertRecord = upsertRecord;
18
+ var _state = require("../state");
19
+ /**
20
+ * assetStore
21
+ *
22
+ * Bounded store of AssetRecords keyed by their stable asset key
23
+ * (`location/name.type`). Follows the images tool's store shape — Set of
24
+ * listeners, frame-coalesced emit, all mutable state on the globalThis
25
+ * singleton (../state.ts) so dual module instances share one store.
26
+ *
27
+ * Unlike the images tool this is an INVENTORY, not an event log: upserts
28
+ * merge into the existing record for a key instead of appending, and there
29
+ * is no ring-buffer cap (a bundle has a bounded asset count by construction).
30
+ */
31
+
32
+ function emit() {
33
+ const s = (0, _state.assetsState)();
34
+ if (s.emitScheduled) return;
35
+ s.emitScheduled = true;
36
+ requestAnimationFrame(() => {
37
+ s.emitScheduled = false;
38
+ for (const listener of s.listeners) listener();
39
+ });
40
+ }
41
+
42
+ /** Snapshot identity only changes on emit, so useSyncExternalStore stays cheap. */
43
+ function invalidate() {
44
+ const s = (0, _state.assetsState)();
45
+ s.snapshot = [...s.records];
46
+ emit();
47
+ }
48
+ const KIND_BY_EXT = {
49
+ png: "image",
50
+ jpg: "image",
51
+ jpeg: "image",
52
+ gif: "image",
53
+ webp: "image",
54
+ bmp: "image",
55
+ psd: "image",
56
+ svg: "image",
57
+ tiff: "image",
58
+ ktx: "image",
59
+ heic: "image",
60
+ heif: "image",
61
+ avif: "image",
62
+ ttf: "font",
63
+ otf: "font",
64
+ woff: "font",
65
+ woff2: "font",
66
+ ttc: "font",
67
+ mp4: "video",
68
+ m4v: "video",
69
+ mov: "video",
70
+ mpeg: "video",
71
+ mpg: "video",
72
+ webm: "video",
73
+ avi: "video",
74
+ mp3: "audio",
75
+ wav: "audio",
76
+ aac: "audio",
77
+ aiff: "audio",
78
+ caf: "audio",
79
+ m4a: "audio",
80
+ ogg: "audio",
81
+ json: "data",
82
+ db: "data",
83
+ yaml: "data",
84
+ yml: "data",
85
+ xml: "data",
86
+ html: "data",
87
+ pdf: "data",
88
+ zip: "data"
89
+ };
90
+ function kindForType(type) {
91
+ return KIND_BY_EXT[type.toLowerCase()] ?? "other";
92
+ }
93
+ function assetKey(httpServerLocation, name, type) {
94
+ // The runtime registry percent-encodes ?unstable_path= locations while the
95
+ // Metro graph endpoint returns them decoded — normalize or every asset
96
+ // splits into a registry record + a graph record.
97
+ let location = httpServerLocation ?? "";
98
+ try {
99
+ location = decodeURIComponent(location);
100
+ } catch {
101
+ // malformed escapes: keep the raw string
102
+ }
103
+ return `${location}/${name}.${type}`;
104
+ }
105
+ /** Merge an asset sighting into the store; creates the record on first sight. */
106
+ function upsertRecord(input) {
107
+ const s = (0, _state.assetsState)();
108
+ let record = s.byKey.get(input.key);
109
+ if (!record) {
110
+ record = {
111
+ id: s.nextId++,
112
+ key: input.key,
113
+ name: input.name,
114
+ type: input.type,
115
+ kind: kindForType(input.type),
116
+ scales: input.scales ?? [],
117
+ loaded: input.loaded ?? false,
118
+ origin: input.origin,
119
+ firstSeenAt: Date.now()
120
+ };
121
+ s.records.push(record);
122
+ s.byKey.set(record.key, record);
123
+ s.byId.set(record.id, record);
124
+ }
125
+ if (input.registryId != null) record.registryId = input.registryId;
126
+ if (input.hash != null) record.hash = input.hash;
127
+ if (input.httpServerLocation != null) record.httpServerLocation = input.httpServerLocation;
128
+ if (input.width != null) record.width = input.width;
129
+ if (input.height != null) record.height = input.height;
130
+ if (input.scales && input.scales.length) {
131
+ // Dedupe: foo.png + foo@1x.png both existing yields [1, 1, …] from Metro.
132
+ record.scales = [...new Set(input.scales)].sort((a, b) => a - b);
133
+ }
134
+ if (input.resolvedUri != null) record.resolvedUri = input.resolvedUri;
135
+ if (input.resolvedScale != null) record.resolvedScale = input.resolvedScale;
136
+ if (input.loaded) record.loaded = true;
137
+ if (input.fileSystemLocation != null) record.fileSystemLocation = input.fileSystemLocation;
138
+ if (input.files) record.files = input.files;
139
+ if (input.fileHashes) record.fileHashes = input.fileHashes;
140
+ invalidate();
141
+ return record;
142
+ }
143
+
144
+ /** Mutate a record in place (records are owned by the store) and notify. */
145
+ function updateRecord(id, patch) {
146
+ const s = (0, _state.assetsState)();
147
+ const record = s.byId.get(id);
148
+ if (!record) return undefined;
149
+ Object.assign(record, patch);
150
+ invalidate();
151
+ return record;
152
+ }
153
+ function getRecord(id) {
154
+ return (0, _state.assetsState)().byId.get(id);
155
+ }
156
+ function getRecordByKey(key) {
157
+ return (0, _state.assetsState)().byKey.get(key);
158
+ }
159
+ function getSnapshot() {
160
+ return (0, _state.assetsState)().snapshot;
161
+ }
162
+ function subscribe(listener) {
163
+ const s = (0, _state.assetsState)();
164
+ s.listeners.add(listener);
165
+ return () => (0, _state.assetsState)().listeners.delete(listener);
166
+ }
167
+ function clearRecords() {
168
+ const s = (0, _state.assetsState)();
169
+ s.records = [];
170
+ s.byKey = new Map();
171
+ s.byId = new Map();
172
+ s.measuredCount = 0;
173
+ s.graphCount = null;
174
+ invalidate();
175
+ }
176
+
177
+ /**
178
+ * Estimated decoded-bitmap memory (RGBA8888) at the scale this device would
179
+ * pick — the size fallback when bytes can't be measured (release builds).
180
+ */
181
+ function estDecodedBytes(record) {
182
+ if (record.kind !== "image" || !record.width || !record.height) return 0;
183
+ const scale = record.resolvedScale ?? (record.scales.length ? record.scales[record.scales.length - 1] : 1);
184
+ return Math.round(record.width * scale * record.height * scale * 4);
185
+ }
186
+ function computeStats(list) {
187
+ const s = (0, _state.assetsState)();
188
+ const byKind = {
189
+ image: {
190
+ count: 0,
191
+ bytes: 0
192
+ },
193
+ font: {
194
+ count: 0,
195
+ bytes: 0
196
+ },
197
+ video: {
198
+ count: 0,
199
+ bytes: 0
200
+ },
201
+ audio: {
202
+ count: 0,
203
+ bytes: 0
204
+ },
205
+ data: {
206
+ count: 0,
207
+ bytes: 0
208
+ },
209
+ other: {
210
+ count: 0,
211
+ bytes: 0
212
+ }
213
+ };
214
+ const stats = {
215
+ total: list.length,
216
+ loaded: 0,
217
+ neverLoaded: 0,
218
+ byKind,
219
+ totalBytes: 0,
220
+ measuredCount: 0,
221
+ fontFamilies: s.fontFamilies.length
222
+ };
223
+ for (const r of list) {
224
+ if (r.loaded) stats.loaded++;else stats.neverLoaded++;
225
+ byKind[r.kind].count++;
226
+ if (r.sizeBytes != null && r.sizeSource === "measured") {
227
+ byKind[r.kind].bytes += r.sizeBytes;
228
+ stats.totalBytes += r.sizeBytes;
229
+ stats.measuredCount++;
230
+ }
231
+ }
232
+ return stats;
233
+ }
234
+ //# sourceMappingURL=assetStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_state","require","emit","s","assetsState","emitScheduled","requestAnimationFrame","listener","listeners","invalidate","snapshot","records","KIND_BY_EXT","png","jpg","jpeg","gif","webp","bmp","psd","svg","tiff","ktx","heic","heif","avif","ttf","otf","woff","woff2","ttc","mp4","m4v","mov","mpeg","mpg","webm","avi","mp3","wav","aac","aiff","caf","m4a","ogg","json","db","yaml","yml","xml","html","pdf","zip","kindForType","type","toLowerCase","assetKey","httpServerLocation","name","location","decodeURIComponent","upsertRecord","input","record","byKey","get","key","id","nextId","kind","scales","loaded","origin","firstSeenAt","Date","now","push","set","byId","registryId","hash","width","height","length","Set","sort","a","b","resolvedUri","resolvedScale","fileSystemLocation","files","fileHashes","updateRecord","patch","undefined","Object","assign","getRecord","getRecordByKey","getSnapshot","subscribe","add","delete","clearRecords","Map","measuredCount","graphCount","estDecodedBytes","scale","Math","round","computeStats","list","byKind","image","count","bytes","font","video","audio","data","other","stats","total","neverLoaded","totalBytes","fontFamilies","r","sizeBytes","sizeSource"],"sourceRoot":"../../../src","sources":["store/assetStore.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.clearBaseline = clearBaseline;
7
+ exports.computeDiff = computeDiff;
8
+ exports.getDiff = getDiff;
9
+ exports.loadBaseline = loadBaseline;
10
+ exports.saveBaseline = saveBaseline;
11
+ var _sharedUi = require("@buoy-gg/shared-ui");
12
+ var _remote = require("../remote");
13
+ var _state = require("../state");
14
+ var _assetStore = require("./assetStore");
15
+ /**
16
+ * Baseline diff — the regression-prevention half of the tool.
17
+ *
18
+ * "Save baseline" persists a slim {hash, size} snapshot of the inventory via
19
+ * shared-ui's persistentStorage (FileSystem → AsyncStorage → memory), and
20
+ * every later scan diffs against it: new assets, removed assets, grown
21
+ * assets, net bytes. Run it before and after a branch and you get "this
22
+ * branch added 2.3 MB" without any CI tooling.
23
+ *
24
+ * On dashboard mirrors the actions forward to the device (the baseline
25
+ * belongs to the app being inspected, not the dashboard) and the computed
26
+ * diff arrives back inside the synced snapshot.
27
+ */
28
+
29
+ const STORAGE_KEY = "@react_buoy/assets/baseline";
30
+
31
+ /** ≥1 KB counts as growth; below that is codec/metadata noise. */
32
+ const GROWN_THRESHOLD_BYTES = 1024;
33
+
34
+ /** Load the persisted baseline into state once; safe to call repeatedly. */
35
+ async function loadBaseline() {
36
+ const s = (0, _state.assetsState)();
37
+ if (s.baselineLoaded) return s.baseline;
38
+ s.baselineLoaded = true;
39
+ try {
40
+ const raw = await _sharedUi.persistentStorage.getItem(STORAGE_KEY);
41
+ if (raw) {
42
+ const parsed = JSON.parse(raw);
43
+ if (parsed && typeof parsed.savedAt === "number" && parsed.entries) {
44
+ s.baseline = parsed;
45
+ (0, _assetStore.invalidate)();
46
+ }
47
+ }
48
+ } catch {
49
+ // unreadable baseline = no baseline
50
+ }
51
+ return s.baseline;
52
+ }
53
+ async function saveBaseline() {
54
+ const remote = (0, _remote.remoteAssetsDispatch)();
55
+ if (remote) {
56
+ await remote("saveBaseline");
57
+ return (0, _state.assetsState)().baseline ?? {
58
+ savedAt: Date.now(),
59
+ entries: {}
60
+ };
61
+ }
62
+ const s = (0, _state.assetsState)();
63
+ const entries = {};
64
+ for (const r of (0, _assetStore.getSnapshot)()) {
65
+ entries[r.key] = {
66
+ hash: r.hash ?? null,
67
+ sizeBytes: r.sizeSource === "measured" ? r.sizeBytes ?? null : null,
68
+ name: r.name,
69
+ type: r.type
70
+ };
71
+ }
72
+ const baseline = {
73
+ savedAt: Date.now(),
74
+ entries
75
+ };
76
+ s.baseline = baseline;
77
+ s.baselineLoaded = true;
78
+ (0, _assetStore.invalidate)();
79
+ try {
80
+ await _sharedUi.persistentStorage.setItem(STORAGE_KEY, JSON.stringify(baseline));
81
+ } catch {
82
+ // in-memory baseline still works for this session
83
+ }
84
+ return baseline;
85
+ }
86
+ async function clearBaseline() {
87
+ const remote = (0, _remote.remoteAssetsDispatch)();
88
+ if (remote) {
89
+ await remote("clearBaseline");
90
+ return;
91
+ }
92
+ const s = (0, _state.assetsState)();
93
+ s.baseline = null;
94
+ s.baselineLoaded = true;
95
+ (0, _assetStore.invalidate)();
96
+ try {
97
+ await _sharedUi.persistentStorage.removeItem(STORAGE_KEY);
98
+ } catch {
99
+ // nothing to clean up
100
+ }
101
+ }
102
+ function computeDiff(records, baseline) {
103
+ const added = [];
104
+ const grown = [];
105
+ const seen = new Set();
106
+ let currentBytes = 0;
107
+ let baselineBytes = 0;
108
+ let comparable = false;
109
+ for (const r of records) {
110
+ seen.add(r.key);
111
+ const then = baseline.entries[r.key];
112
+ if (!then) {
113
+ added.push(r.id);
114
+ continue;
115
+ }
116
+ const now = r.sizeSource === "measured" ? r.sizeBytes ?? null : null;
117
+ if (now != null && then.sizeBytes != null) {
118
+ comparable = true;
119
+ currentBytes += now;
120
+ baselineBytes += then.sizeBytes;
121
+ if (now - then.sizeBytes >= GROWN_THRESHOLD_BYTES) {
122
+ grown.push({
123
+ id: r.id,
124
+ deltaBytes: now - then.sizeBytes
125
+ });
126
+ }
127
+ }
128
+ }
129
+ const removed = [];
130
+ for (const [key, entry] of Object.entries(baseline.entries)) {
131
+ if (!seen.has(key)) {
132
+ removed.push({
133
+ key,
134
+ name: entry.name,
135
+ type: entry.type
136
+ });
137
+ if (entry.sizeBytes != null) baselineBytes += entry.sizeBytes;
138
+ }
139
+ }
140
+ // Added assets' measured bytes count toward the net even without a
141
+ // baseline counterpart — that's exactly the growth being reported.
142
+ for (const id of added) {
143
+ const r = records.find(rec => rec.id === id);
144
+ if (r?.sizeSource === "measured" && r.sizeBytes != null) {
145
+ comparable = true;
146
+ currentBytes += r.sizeBytes;
147
+ }
148
+ }
149
+ return {
150
+ baselineSavedAt: baseline.savedAt,
151
+ added,
152
+ removed,
153
+ grown: grown.sort((a, b) => b.deltaBytes - a.deltaBytes),
154
+ netBytes: comparable ? currentBytes - baselineBytes : null
155
+ };
156
+ }
157
+
158
+ /** Current diff: the synced device's on mirrors, computed locally on device. */
159
+ function getDiff() {
160
+ const s = (0, _state.assetsState)();
161
+ if (s.mirrorDiff) return s.mirrorDiff;
162
+ if (!s.baseline) return null;
163
+ return computeDiff((0, _assetStore.getSnapshot)(), s.baseline);
164
+ }
165
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sharedUi","require","_remote","_state","_assetStore","STORAGE_KEY","GROWN_THRESHOLD_BYTES","loadBaseline","s","assetsState","baselineLoaded","baseline","raw","persistentStorage","getItem","parsed","JSON","parse","savedAt","entries","invalidate","saveBaseline","remote","remoteAssetsDispatch","Date","now","r","getSnapshot","key","hash","sizeBytes","sizeSource","name","type","setItem","stringify","clearBaseline","removeItem","computeDiff","records","added","grown","seen","Set","currentBytes","baselineBytes","comparable","add","then","push","id","deltaBytes","removed","entry","Object","has","find","rec","baselineSavedAt","sort","a","b","netBytes","getDiff","mirrorDiff"],"sourceRoot":"../../../src","sources":["store/baseline.ts"],"mappings":"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","ignoreList":[]}