@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.
- package/LICENSE +58 -0
- package/README.md +55 -0
- package/lib/commonjs/capture/expo.js +46 -0
- package/lib/commonjs/capture/expo.js.map +1 -0
- package/lib/commonjs/capture/install.js +78 -0
- package/lib/commonjs/capture/install.js.map +1 -0
- package/lib/commonjs/capture/measure.js +186 -0
- package/lib/commonjs/capture/measure.js.map +1 -0
- package/lib/commonjs/capture/metroGraph.js +148 -0
- package/lib/commonjs/capture/metroGraph.js.map +1 -0
- package/lib/commonjs/capture/registry.js +124 -0
- package/lib/commonjs/capture/registry.js.map +1 -0
- package/lib/commonjs/components/AssetDetail.js +205 -0
- package/lib/commonjs/components/AssetDetail.js.map +1 -0
- package/lib/commonjs/components/AssetRow.js +246 -0
- package/lib/commonjs/components/AssetRow.js.map +1 -0
- package/lib/commonjs/components/AssetsFilterBar.js +92 -0
- package/lib/commonjs/components/AssetsFilterBar.js.map +1 -0
- package/lib/commonjs/components/AssetsHeader.js +66 -0
- package/lib/commonjs/components/AssetsHeader.js.map +1 -0
- package/lib/commonjs/components/AssetsIcon.js +19 -0
- package/lib/commonjs/components/AssetsIcon.js.map +1 -0
- package/lib/commonjs/components/AssetsListControls.js +94 -0
- package/lib/commonjs/components/AssetsListControls.js.map +1 -0
- package/lib/commonjs/components/AssetsModal.js +338 -0
- package/lib/commonjs/components/AssetsModal.js.map +1 -0
- package/lib/commonjs/components/BaselineBar.js +110 -0
- package/lib/commonjs/components/BaselineBar.js.map +1 -0
- package/lib/commonjs/export.js +62 -0
- package/lib/commonjs/export.js.map +1 -0
- package/lib/commonjs/format.js +59 -0
- package/lib/commonjs/format.js.map +1 -0
- package/lib/commonjs/hooks/useAssetRecords.js +22 -0
- package/lib/commonjs/hooks/useAssetRecords.js.map +1 -0
- package/lib/commonjs/index.js +260 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +45 -0
- package/lib/commonjs/preset.js.map +1 -0
- package/lib/commonjs/remote.js +65 -0
- package/lib/commonjs/remote.js.map +1 -0
- package/lib/commonjs/state.js +51 -0
- package/lib/commonjs/state.js.map +1 -0
- package/lib/commonjs/store/assetStore.js +234 -0
- package/lib/commonjs/store/assetStore.js.map +1 -0
- package/lib/commonjs/store/baseline.js +165 -0
- package/lib/commonjs/store/baseline.js.map +1 -0
- package/lib/commonjs/store/insights.js +129 -0
- package/lib/commonjs/store/insights.js.map +1 -0
- package/lib/commonjs/sync/assetsSyncAdapter.js +157 -0
- package/lib/commonjs/sync/assetsSyncAdapter.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/capture/expo.js +41 -0
- package/lib/module/capture/expo.js.map +1 -0
- package/lib/module/capture/install.js +72 -0
- package/lib/module/capture/install.js.map +1 -0
- package/lib/module/capture/measure.js +179 -0
- package/lib/module/capture/measure.js.map +1 -0
- package/lib/module/capture/metroGraph.js +141 -0
- package/lib/module/capture/metroGraph.js.map +1 -0
- package/lib/module/capture/registry.js +117 -0
- package/lib/module/capture/registry.js.map +1 -0
- package/lib/module/components/AssetDetail.js +201 -0
- package/lib/module/components/AssetDetail.js.map +1 -0
- package/lib/module/components/AssetRow.js +242 -0
- package/lib/module/components/AssetRow.js.map +1 -0
- package/lib/module/components/AssetsFilterBar.js +88 -0
- package/lib/module/components/AssetsFilterBar.js.map +1 -0
- package/lib/module/components/AssetsHeader.js +62 -0
- package/lib/module/components/AssetsHeader.js.map +1 -0
- package/lib/module/components/AssetsIcon.js +12 -0
- package/lib/module/components/AssetsIcon.js.map +1 -0
- package/lib/module/components/AssetsListControls.js +90 -0
- package/lib/module/components/AssetsListControls.js.map +1 -0
- package/lib/module/components/AssetsModal.js +333 -0
- package/lib/module/components/AssetsModal.js.map +1 -0
- package/lib/module/components/BaselineBar.js +106 -0
- package/lib/module/components/BaselineBar.js.map +1 -0
- package/lib/module/export.js +57 -0
- package/lib/module/export.js.map +1 -0
- package/lib/module/format.js +51 -0
- package/lib/module/format.js.map +1 -0
- package/lib/module/hooks/useAssetRecords.js +18 -0
- package/lib/module/hooks/useAssetRecords.js.map +1 -0
- package/lib/module/index.js +59 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/preset.js +40 -0
- package/lib/module/preset.js.map +1 -0
- package/lib/module/remote.js +58 -0
- package/lib/module/remote.js.map +1 -0
- package/lib/module/state.js +47 -0
- package/lib/module/state.js.map +1 -0
- package/lib/module/store/assetStore.js +219 -0
- package/lib/module/store/assetStore.js.map +1 -0
- package/lib/module/store/baseline.js +157 -0
- package/lib/module/store/baseline.js.map +1 -0
- package/lib/module/store/insights.js +125 -0
- package/lib/module/store/insights.js.map +1 -0
- package/lib/module/sync/assetsSyncAdapter.js +153 -0
- package/lib/module/sync/assetsSyncAdapter.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/capture/expo.d.ts +18 -0
- package/lib/typescript/capture/expo.d.ts.map +1 -0
- package/lib/typescript/capture/install.d.ts +17 -0
- package/lib/typescript/capture/install.d.ts.map +1 -0
- package/lib/typescript/capture/measure.d.ts +38 -0
- package/lib/typescript/capture/measure.d.ts.map +1 -0
- package/lib/typescript/capture/metroGraph.d.ts +33 -0
- package/lib/typescript/capture/metroGraph.d.ts.map +1 -0
- package/lib/typescript/capture/registry.d.ts +45 -0
- package/lib/typescript/capture/registry.d.ts.map +1 -0
- package/lib/typescript/components/AssetDetail.d.ts +17 -0
- package/lib/typescript/components/AssetDetail.d.ts.map +1 -0
- package/lib/typescript/components/AssetRow.d.ts +32 -0
- package/lib/typescript/components/AssetRow.d.ts.map +1 -0
- package/lib/typescript/components/AssetsFilterBar.d.ts +16 -0
- package/lib/typescript/components/AssetsFilterBar.d.ts.map +1 -0
- package/lib/typescript/components/AssetsHeader.d.ts +22 -0
- package/lib/typescript/components/AssetsHeader.d.ts.map +1 -0
- package/lib/typescript/components/AssetsIcon.d.ts +9 -0
- package/lib/typescript/components/AssetsIcon.d.ts.map +1 -0
- package/lib/typescript/components/AssetsListControls.d.ts +18 -0
- package/lib/typescript/components/AssetsListControls.d.ts.map +1 -0
- package/lib/typescript/components/AssetsModal.d.ts +24 -0
- package/lib/typescript/components/AssetsModal.d.ts.map +1 -0
- package/lib/typescript/components/BaselineBar.d.ts +13 -0
- package/lib/typescript/components/BaselineBar.d.ts.map +1 -0
- package/lib/typescript/export.d.ts +8 -0
- package/lib/typescript/export.d.ts.map +1 -0
- package/lib/typescript/format.d.ts +13 -0
- package/lib/typescript/format.d.ts.map +1 -0
- package/lib/typescript/hooks/useAssetRecords.d.ts +11 -0
- package/lib/typescript/hooks/useAssetRecords.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +26 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +38 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/lib/typescript/remote.d.ts +17 -0
- package/lib/typescript/remote.d.ts.map +1 -0
- package/lib/typescript/state.d.ts +41 -0
- package/lib/typescript/state.d.ts.map +1 -0
- package/lib/typescript/store/assetStore.d.ts +51 -0
- package/lib/typescript/store/assetStore.d.ts.map +1 -0
- package/lib/typescript/store/baseline.d.ts +22 -0
- package/lib/typescript/store/baseline.d.ts.map +1 -0
- package/lib/typescript/store/insights.d.ts +7 -0
- package/lib/typescript/store/insights.d.ts.map +1 -0
- package/lib/typescript/sync/assetsSyncAdapter.d.ts +83 -0
- package/lib/typescript/sync/assetsSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +162 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +77 -0
- package/src/capture/expo.ts +45 -0
- package/src/capture/install.ts +73 -0
- package/src/capture/measure.ts +167 -0
- package/src/capture/metroGraph.ts +146 -0
- package/src/capture/registry.ts +134 -0
- package/src/components/AssetDetail.tsx +207 -0
- package/src/components/AssetRow.tsx +243 -0
- package/src/components/AssetsFilterBar.tsx +99 -0
- package/src/components/AssetsHeader.tsx +75 -0
- package/src/components/AssetsIcon.tsx +9 -0
- package/src/components/AssetsListControls.tsx +101 -0
- package/src/components/AssetsModal.tsx +368 -0
- package/src/components/BaselineBar.tsx +98 -0
- package/src/export.ts +108 -0
- package/src/format.ts +53 -0
- package/src/hooks/useAssetRecords.ts +26 -0
- package/src/index.tsx +87 -0
- package/src/preset.tsx +35 -0
- package/src/remote.ts +65 -0
- package/src/state.ts +84 -0
- package/src/store/assetStore.ts +209 -0
- package/src/store/baseline.ts +152 -0
- package/src/store/insights.ts +145 -0
- package/src/sync/assetsSyncAdapter.ts +151 -0
- 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":[]}
|