@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,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.computeInsights = computeInsights;
|
|
7
|
+
var _state = require("../state");
|
|
8
|
+
var _assetStore = require("./assetStore");
|
|
9
|
+
/**
|
|
10
|
+
* Derived insights over the asset inventory — the Lighthouse/Emerge-style
|
|
11
|
+
* audit findings, each pointing at concrete record ids.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** png/jpeg at or above this measured size are flagged as WebP candidates. */
|
|
15
|
+
const WEBP_CANDIDATE_BYTES = 50 * 1024;
|
|
16
|
+
/** GIFs at or above this measured size decode into serious frame memory. */
|
|
17
|
+
const HEAVY_GIF_BYTES = 100 * 1024;
|
|
18
|
+
/** Fonts at or above this are usually unsubset icon fonts. */
|
|
19
|
+
const HEAVY_FONT_BYTES = 150 * 1024;
|
|
20
|
+
/** Flag images decoding to more pixels than this many screenfuls. */
|
|
21
|
+
const OVER_DECODE_SCREENS = 2;
|
|
22
|
+
/** A higher scale variant this much smaller than a lower one = bad export. */
|
|
23
|
+
const SCALE_ANOMALY_RATIO = 0.9;
|
|
24
|
+
/**
|
|
25
|
+
* Anomaly checks only apply when the smaller variant is at least this big —
|
|
26
|
+
* for tiny icons PNG overhead dominates and byte ordering is pure noise.
|
|
27
|
+
*/
|
|
28
|
+
const SCALE_ANOMALY_MIN_BYTES = 4 * 1024;
|
|
29
|
+
function effectivePixelRatio() {
|
|
30
|
+
const mirror = (0, _state.assetsState)().mirrorPixelRatio;
|
|
31
|
+
if (mirror != null) return mirror;
|
|
32
|
+
try {
|
|
33
|
+
return require("react-native").PixelRatio.get();
|
|
34
|
+
} catch {
|
|
35
|
+
return 2;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Physical pixels of the entire screen (fallback ≈ a 6.1" phone). */
|
|
40
|
+
function screenPixels() {
|
|
41
|
+
try {
|
|
42
|
+
const {
|
|
43
|
+
Dimensions,
|
|
44
|
+
PixelRatio
|
|
45
|
+
} = require("react-native");
|
|
46
|
+
const screen = Dimensions.get("screen");
|
|
47
|
+
const ratio = PixelRatio.get();
|
|
48
|
+
return screen.width * ratio * screen.height * ratio;
|
|
49
|
+
} catch {
|
|
50
|
+
return 1170 * 2532;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** True when the measured per-scale sizes contradict the scales (bad export). */
|
|
55
|
+
function hasScaleAnomaly(record) {
|
|
56
|
+
const sizes = record.sizesByScale;
|
|
57
|
+
if (!sizes) return false;
|
|
58
|
+
const ordered = Object.entries(sizes).map(([scale, bytes]) => ({
|
|
59
|
+
scale: Number(scale),
|
|
60
|
+
bytes
|
|
61
|
+
})).filter(e => Number.isFinite(e.scale) && e.bytes > 0).sort((a, b) => a.scale - b.scale);
|
|
62
|
+
for (let i = 1; i < ordered.length; i++) {
|
|
63
|
+
if (ordered[i - 1].bytes >= SCALE_ANOMALY_MIN_BYTES && ordered[i].bytes < ordered[i - 1].bytes * SCALE_ANOMALY_RATIO) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
function computeInsights(list) {
|
|
70
|
+
const deviceScale = effectivePixelRatio();
|
|
71
|
+
const byHash = new Map();
|
|
72
|
+
for (const r of list) {
|
|
73
|
+
if (!r.hash) continue;
|
|
74
|
+
const group = byHash.get(r.hash);
|
|
75
|
+
if (group) group.push(r);else byHash.set(r.hash, [r]);
|
|
76
|
+
}
|
|
77
|
+
const duplicates = [];
|
|
78
|
+
for (const [hash, group] of byHash) {
|
|
79
|
+
if (group.length < 2) continue;
|
|
80
|
+
const measured = group.find(r => r.sizeBytes != null);
|
|
81
|
+
duplicates.push({
|
|
82
|
+
hash,
|
|
83
|
+
ids: group.map(r => r.id),
|
|
84
|
+
wastedBytes: measured?.sizeBytes != null ? measured.sizeBytes * (group.length - 1) : null
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const screenPx = screenPixels();
|
|
88
|
+
const scaleGaps = [];
|
|
89
|
+
const webpCandidates = [];
|
|
90
|
+
const neverLoaded = [];
|
|
91
|
+
const overDecode = [];
|
|
92
|
+
const heavyGifs = [];
|
|
93
|
+
const heavyFonts = [];
|
|
94
|
+
const scaleAnomalies = [];
|
|
95
|
+
for (const r of list) {
|
|
96
|
+
if (!r.loaded) neverLoaded.push(r.id);
|
|
97
|
+
// Only multi-scale assets missing the device scale are flagged — the
|
|
98
|
+
// author clearly manages variants and missed one. Single-@1x images are
|
|
99
|
+
// the overwhelmingly common case and flagging them all is pure noise.
|
|
100
|
+
if (r.kind === "image" && r.scales.length > 1 && !r.scales.some(s => s >= deviceScale)) {
|
|
101
|
+
scaleGaps.push(r.id);
|
|
102
|
+
}
|
|
103
|
+
if ((r.type === "png" || r.type === "jpg" || r.type === "jpeg") && r.sizeBytes != null && r.sizeBytes >= WEBP_CANDIDATE_BYTES) {
|
|
104
|
+
webpCandidates.push(r.id);
|
|
105
|
+
}
|
|
106
|
+
// estDecodedBytes = pixels × 4, so pixels = bytes / 4.
|
|
107
|
+
if (r.kind === "image" && (0, _assetStore.estDecodedBytes)(r) / 4 > screenPx * OVER_DECODE_SCREENS) {
|
|
108
|
+
overDecode.push(r.id);
|
|
109
|
+
}
|
|
110
|
+
if (r.type === "gif" && (r.sizeBytes ?? 0) >= HEAVY_GIF_BYTES) {
|
|
111
|
+
heavyGifs.push(r.id);
|
|
112
|
+
}
|
|
113
|
+
if (r.kind === "font" && (r.sizeBytes ?? 0) >= HEAVY_FONT_BYTES) {
|
|
114
|
+
heavyFonts.push(r.id);
|
|
115
|
+
}
|
|
116
|
+
if (hasScaleAnomaly(r)) scaleAnomalies.push(r.id);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
duplicates,
|
|
120
|
+
scaleGaps,
|
|
121
|
+
webpCandidates,
|
|
122
|
+
neverLoaded,
|
|
123
|
+
overDecode,
|
|
124
|
+
heavyGifs,
|
|
125
|
+
heavyFonts,
|
|
126
|
+
scaleAnomalies
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_state","require","_assetStore","WEBP_CANDIDATE_BYTES","HEAVY_GIF_BYTES","HEAVY_FONT_BYTES","OVER_DECODE_SCREENS","SCALE_ANOMALY_RATIO","SCALE_ANOMALY_MIN_BYTES","effectivePixelRatio","mirror","assetsState","mirrorPixelRatio","PixelRatio","get","screenPixels","Dimensions","screen","ratio","width","height","hasScaleAnomaly","record","sizes","sizesByScale","ordered","Object","entries","map","scale","bytes","Number","filter","e","isFinite","sort","a","b","i","length","computeInsights","list","deviceScale","byHash","Map","r","hash","group","push","set","duplicates","measured","find","sizeBytes","ids","id","wastedBytes","screenPx","scaleGaps","webpCandidates","neverLoaded","overDecode","heavyGifs","heavyFonts","scaleAnomalies","loaded","kind","scales","some","s","type","estDecodedBytes"],"sourceRoot":"../../../src","sources":["store/insights.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.assetsSyncAdapter = void 0;
|
|
7
|
+
var _install = require("../capture/install");
|
|
8
|
+
var _measure = require("../capture/measure");
|
|
9
|
+
var _assetStore = require("../store/assetStore");
|
|
10
|
+
var _baseline = require("../store/baseline");
|
|
11
|
+
var _insights = require("../store/insights");
|
|
12
|
+
/**
|
|
13
|
+
* Sync adapter for the Assets tool, consumed by @buoy-gg/external-sync's
|
|
14
|
+
* `useExternalSync` (structurally matches its ToolSyncAdapter interface so
|
|
15
|
+
* this package doesn't need a dependency on it — same pattern as images).
|
|
16
|
+
* Exposes the asset inventory to the desktop dashboard and the MCP server.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const KINDS = ["image", "font", "video", "audio", "data", "other"];
|
|
20
|
+
function toWire(record) {
|
|
21
|
+
return {
|
|
22
|
+
id: record.id,
|
|
23
|
+
key: record.key,
|
|
24
|
+
registryId: record.registryId ?? null,
|
|
25
|
+
name: record.name,
|
|
26
|
+
type: record.type,
|
|
27
|
+
kind: record.kind,
|
|
28
|
+
hash: record.hash ?? null,
|
|
29
|
+
location: record.httpServerLocation ?? null,
|
|
30
|
+
width: record.width ?? null,
|
|
31
|
+
height: record.height ?? null,
|
|
32
|
+
scales: record.scales,
|
|
33
|
+
uri: record.resolvedUri ?? null,
|
|
34
|
+
loaded: record.loaded,
|
|
35
|
+
sizeBytes: record.sizeSource === "measured" ? record.sizeBytes ?? null : (0, _assetStore.estDecodedBytes)(record) || null,
|
|
36
|
+
sizeSource: record.sizeSource ?? null
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function requireRecord(params) {
|
|
40
|
+
const id = params?.id;
|
|
41
|
+
if (typeof id !== "number") throw new Error("Missing numeric `id` param");
|
|
42
|
+
const record = (0, _assetStore.getRecord)(id);
|
|
43
|
+
if (!record) {
|
|
44
|
+
throw new Error(`Asset record ${id} not found — re-run the list action for current ids.`);
|
|
45
|
+
}
|
|
46
|
+
return record;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Largest-first is the useful default for an inventory. */
|
|
50
|
+
function bySizeDesc(a, b) {
|
|
51
|
+
return (b.sizeBytes ?? (0, _assetStore.estDecodedBytes)(b)) - (a.sizeBytes ?? (0, _assetStore.estDecodedBytes)(a));
|
|
52
|
+
}
|
|
53
|
+
function overview() {
|
|
54
|
+
const snapshot = (0, _assetStore.getSnapshot)();
|
|
55
|
+
return {
|
|
56
|
+
stats: (0, _assetStore.computeStats)(snapshot),
|
|
57
|
+
scanStatus: (0, _install.getScanStatus)(),
|
|
58
|
+
insights: (0, _insights.computeInsights)(snapshot),
|
|
59
|
+
diff: (0, _baseline.getDiff)(),
|
|
60
|
+
records: [...snapshot].sort(bySizeDesc)
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const assetsSyncAdapter = exports.assetsSyncAdapter = {
|
|
64
|
+
version: 1,
|
|
65
|
+
getSnapshot: () => {
|
|
66
|
+
const {
|
|
67
|
+
records,
|
|
68
|
+
...rest
|
|
69
|
+
} = overview();
|
|
70
|
+
return {
|
|
71
|
+
...rest,
|
|
72
|
+
records: records.slice(0, 200).map(toWire)
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
subscribe: onChange => (0, _assetStore.subscribe)(onChange),
|
|
76
|
+
actions: {
|
|
77
|
+
/** List assets, largest first. Params: { limit?, kind?, loadedOnly? }. */
|
|
78
|
+
list: params => {
|
|
79
|
+
const p = params ?? {};
|
|
80
|
+
const limit = Math.min(Math.max(p.limit ?? 50, 1), 500);
|
|
81
|
+
const {
|
|
82
|
+
records,
|
|
83
|
+
...rest
|
|
84
|
+
} = overview();
|
|
85
|
+
let filtered = records;
|
|
86
|
+
if (p.kind) {
|
|
87
|
+
if (!KINDS.includes(p.kind)) {
|
|
88
|
+
throw new Error(`kind must be one of: ${KINDS.join(", ")}`);
|
|
89
|
+
}
|
|
90
|
+
filtered = filtered.filter(r => r.kind === p.kind);
|
|
91
|
+
}
|
|
92
|
+
if (p.loadedOnly) filtered = filtered.filter(r => r.loaded);
|
|
93
|
+
return {
|
|
94
|
+
...rest,
|
|
95
|
+
total: filtered.length,
|
|
96
|
+
records: filtered.slice(0, limit).map(toWire)
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
/** Full detail for one asset. Params: { id }. */
|
|
100
|
+
getDetail: params => {
|
|
101
|
+
const record = requireRecord(params);
|
|
102
|
+
return {
|
|
103
|
+
...toWire(record),
|
|
104
|
+
origin: record.origin,
|
|
105
|
+
fileSystemLocation: record.fileSystemLocation ?? null,
|
|
106
|
+
files: record.files ?? null,
|
|
107
|
+
sizesByScale: record.sizesByScale ?? null,
|
|
108
|
+
estDecodedBytes: (0, _assetStore.estDecodedBytes)(record) || null
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
/** Re-walk the registry, merge the Metro graph, refresh fonts, measure sizes. */
|
|
112
|
+
rescan: async () => {
|
|
113
|
+
const status = await (0, _install.rescan)();
|
|
114
|
+
return {
|
|
115
|
+
ok: true,
|
|
116
|
+
scanStatus: status
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
/** (Re-)measure byte sizes from the dev server. */
|
|
120
|
+
measureSizes: async () => {
|
|
121
|
+
const result = await (0, _measure.measureSizes)();
|
|
122
|
+
return {
|
|
123
|
+
ok: result.measured > 0,
|
|
124
|
+
...result
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
/** Persist the current inventory as the comparison baseline. */
|
|
128
|
+
saveBaseline: async () => {
|
|
129
|
+
const baseline = await (0, _baseline.saveBaseline)();
|
|
130
|
+
return {
|
|
131
|
+
ok: true,
|
|
132
|
+
savedAt: baseline.savedAt,
|
|
133
|
+
assets: Object.keys(baseline.entries).length
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
/** Drop the saved baseline. */
|
|
137
|
+
clearBaseline: async () => {
|
|
138
|
+
await (0, _baseline.clearBaseline)();
|
|
139
|
+
return {
|
|
140
|
+
ok: true,
|
|
141
|
+
message: "Baseline cleared"
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
/** Change vs the saved baseline (null when no baseline exists). */
|
|
145
|
+
getDiff: () => (0, _baseline.getDiff)(),
|
|
146
|
+
/** Wipe the store (next rescan rebuilds it). */
|
|
147
|
+
clearRecords: () => {
|
|
148
|
+
(0, _assetStore.clearRecords)();
|
|
149
|
+
return {
|
|
150
|
+
ok: true,
|
|
151
|
+
message: "Inventory cleared — rescan to rebuild"
|
|
152
|
+
};
|
|
153
|
+
},
|
|
154
|
+
getScanStatus: () => (0, _install.getScanStatus)()
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=assetsSyncAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_install","require","_measure","_assetStore","_baseline","_insights","KINDS","toWire","record","id","key","registryId","name","type","kind","hash","location","httpServerLocation","width","height","scales","uri","resolvedUri","loaded","sizeBytes","sizeSource","estDecodedBytes","requireRecord","params","Error","getRecord","bySizeDesc","a","b","overview","snapshot","getSnapshot","stats","computeStats","scanStatus","getScanStatus","insights","computeInsights","diff","getDiff","records","sort","assetsSyncAdapter","exports","version","rest","slice","map","subscribe","onChange","actions","list","p","limit","Math","min","max","filtered","includes","join","filter","r","loadedOnly","total","length","getDetail","origin","fileSystemLocation","files","sizesByScale","rescan","status","ok","measureSizes","result","measured","saveBaseline","baseline","savedAt","assets","Object","keys","entries","clearBaseline","message","clearRecords"],"sourceRoot":"../../../src","sources":["sync/assetsSyncAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Expo enrichment — all optional, all read through globalThis.expo guards so
|
|
5
|
+
* bare RN apps (no expo-modules) silently get none of it and no imports are
|
|
6
|
+
* added for anyone.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
function expoModules() {
|
|
10
|
+
return globalThis.expo?.modules;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Every loaded font family — build-time embedded (config plugin / UIAppFonts /
|
|
15
|
+
* android assets/fonts) AND runtime Font.loadAsync, straight from the native
|
|
16
|
+
* module Expo documents as a stable global. [] when unavailable (bare RN).
|
|
17
|
+
*/
|
|
18
|
+
export function getLoadedFontFamilies() {
|
|
19
|
+
try {
|
|
20
|
+
const fonts = expoModules()?.ExpoFontLoader?.getLoadedFonts?.();
|
|
21
|
+
return Array.isArray(fonts) ? [...fonts].sort() : [];
|
|
22
|
+
} catch {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* expo-updates' per-file-hash → local URI map: the COMPLETE shipped asset set
|
|
29
|
+
* in Expo Go / OTA environments, independent of what JS has evaluated.
|
|
30
|
+
* null when not running in an updates-managed environment.
|
|
31
|
+
*/
|
|
32
|
+
export function getLocalAssets() {
|
|
33
|
+
try {
|
|
34
|
+
const map = expoModules()?.ExpoUpdates?.localAssets;
|
|
35
|
+
if (map && typeof map === "object" && Object.keys(map).length > 0) return map;
|
|
36
|
+
return null;
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=expo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["expoModules","globalThis","expo","modules","getLoadedFontFamilies","fonts","ExpoFontLoader","getLoadedFonts","Array","isArray","sort","getLocalAssets","map","ExpoUpdates","localAssets","Object","keys","length"],"sourceRoot":"../../../src","sources":["capture/expo.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;;AASA,SAASA,WAAWA,CAAA,EAA0B;EAC5C,OAAQC,UAAU,CAA2BC,IAAI,EAAEC,OAAO;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAAA,EAAa;EAChD,IAAI;IACF,MAAMC,KAAK,GAAGL,WAAW,CAAC,CAAC,EAAEM,cAAc,EAAEC,cAAc,GAAG,CAAC;IAC/D,OAAOC,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,GAAG,CAAC,GAAGA,KAAK,CAAC,CAACK,IAAI,CAAC,CAAC,GAAG,EAAE;EACtD,CAAC,CAAC,MAAM;IACN,OAAO,EAAE;EACX;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAA,EAAkC;EAC9D,IAAI;IACF,MAAMC,GAAG,GAAGZ,WAAW,CAAC,CAAC,EAAEa,WAAW,EAAEC,WAAW;IACnD,IAAIF,GAAG,IAAI,OAAOA,GAAG,KAAK,QAAQ,IAAIG,MAAM,CAACC,IAAI,CAACJ,GAAG,CAAC,CAACK,MAAM,GAAG,CAAC,EAAE,OAAOL,GAAG;IAC7E,OAAO,IAAI;EACb,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Capture install + scan orchestration.
|
|
5
|
+
*
|
|
6
|
+
* installAssetCapture() is cheap and synchronous (registry walk + patch) and
|
|
7
|
+
* runs at package import. The expensive passes — Metro graph fetch and byte
|
|
8
|
+
* measurement — run in rescan(), triggered when the modal opens or via the
|
|
9
|
+
* `rescan` sync action, so merely installing Buoy never hits the network.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { assetsState } from "../state";
|
|
13
|
+
import { invalidate } from "../store/assetStore";
|
|
14
|
+
import { getLoadedFontFamilies, getLocalAssets } from "./expo";
|
|
15
|
+
import { measureSizes } from "./measure";
|
|
16
|
+
import { fetchAssetGraph, getDevServerOrigin } from "./metroGraph";
|
|
17
|
+
import { getRegistryModule, patchRegisterAsset, walkRegistry } from "./registry";
|
|
18
|
+
export function installAssetCapture() {
|
|
19
|
+
const s = assetsState();
|
|
20
|
+
if (s.captureDisabled || s.installed) return;
|
|
21
|
+
s.installed = true;
|
|
22
|
+
s.registryAvailable = getRegistryModule() != null;
|
|
23
|
+
s.patched = patchRegisterAsset();
|
|
24
|
+
walkRegistry();
|
|
25
|
+
refreshEnrichment();
|
|
26
|
+
s.lastScanAt = Date.now();
|
|
27
|
+
invalidate();
|
|
28
|
+
}
|
|
29
|
+
function refreshEnrichment() {
|
|
30
|
+
const s = assetsState();
|
|
31
|
+
s.fontFamilies = getLoadedFontFamilies();
|
|
32
|
+
const localAssets = getLocalAssets();
|
|
33
|
+
s.localAssetCount = localAssets ? Object.keys(localAssets).length : null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Full scan: registry re-walk (catches anything the patch missed), Metro
|
|
38
|
+
* graph merge (dev), Expo enrichment refresh, then size measurement.
|
|
39
|
+
*/
|
|
40
|
+
export async function rescan() {
|
|
41
|
+
const s = assetsState();
|
|
42
|
+
if (s.captureDisabled) return getScanStatus();
|
|
43
|
+
installAssetCapture();
|
|
44
|
+
walkRegistry();
|
|
45
|
+
refreshEnrichment();
|
|
46
|
+
await fetchAssetGraph();
|
|
47
|
+
s.lastScanAt = Date.now();
|
|
48
|
+
invalidate();
|
|
49
|
+
void measureSizes();
|
|
50
|
+
return getScanStatus();
|
|
51
|
+
}
|
|
52
|
+
export function getScanStatus() {
|
|
53
|
+
const s = assetsState();
|
|
54
|
+
// Mirrors report the synced DEVICE's status, not the dashboard's.
|
|
55
|
+
if (s.mirrorScanStatus) return s.mirrorScanStatus;
|
|
56
|
+
let registryCount = 0;
|
|
57
|
+
for (const record of s.records) if (record.registryId != null) registryCount++;
|
|
58
|
+
return {
|
|
59
|
+
registryAvailable: s.registryAvailable,
|
|
60
|
+
patched: s.patched,
|
|
61
|
+
registryCount,
|
|
62
|
+
graphSupported: s.graphSupported || getDevServerOrigin() != null,
|
|
63
|
+
graphCount: s.graphCount,
|
|
64
|
+
graphError: s.graphError,
|
|
65
|
+
lastScanAt: s.lastScanAt,
|
|
66
|
+
measuring: s.measuring,
|
|
67
|
+
measuredCount: s.measuredCount,
|
|
68
|
+
fontFamilies: s.fontFamilies,
|
|
69
|
+
localAssetCount: s.localAssetCount
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["assetsState","invalidate","getLoadedFontFamilies","getLocalAssets","measureSizes","fetchAssetGraph","getDevServerOrigin","getRegistryModule","patchRegisterAsset","walkRegistry","installAssetCapture","s","captureDisabled","installed","registryAvailable","patched","refreshEnrichment","lastScanAt","Date","now","fontFamilies","localAssets","localAssetCount","Object","keys","length","rescan","getScanStatus","mirrorScanStatus","registryCount","record","records","registryId","graphSupported","graphCount","graphError","measuring","measuredCount"],"sourceRoot":"../../../src","sources":["capture/install.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAQ,UAAU;AACtC,SAASC,UAAU,QAAQ,qBAAqB;AAChD,SAASC,qBAAqB,EAAEC,cAAc,QAAQ,QAAQ;AAC9D,SAASC,YAAY,QAAQ,WAAW;AACxC,SAASC,eAAe,EAAEC,kBAAkB,QAAQ,cAAc;AAClE,SAASC,iBAAiB,EAAEC,kBAAkB,EAAEC,YAAY,QAAQ,YAAY;AAGhF,OAAO,SAASC,mBAAmBA,CAAA,EAAS;EAC1C,MAAMC,CAAC,GAAGX,WAAW,CAAC,CAAC;EACvB,IAAIW,CAAC,CAACC,eAAe,IAAID,CAAC,CAACE,SAAS,EAAE;EACtCF,CAAC,CAACE,SAAS,GAAG,IAAI;EAClBF,CAAC,CAACG,iBAAiB,GAAGP,iBAAiB,CAAC,CAAC,IAAI,IAAI;EACjDI,CAAC,CAACI,OAAO,GAAGP,kBAAkB,CAAC,CAAC;EAChCC,YAAY,CAAC,CAAC;EACdO,iBAAiB,CAAC,CAAC;EACnBL,CAAC,CAACM,UAAU,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACzBlB,UAAU,CAAC,CAAC;AACd;AAEA,SAASe,iBAAiBA,CAAA,EAAS;EACjC,MAAML,CAAC,GAAGX,WAAW,CAAC,CAAC;EACvBW,CAAC,CAACS,YAAY,GAAGlB,qBAAqB,CAAC,CAAC;EACxC,MAAMmB,WAAW,GAAGlB,cAAc,CAAC,CAAC;EACpCQ,CAAC,CAACW,eAAe,GAAGD,WAAW,GAAGE,MAAM,CAACC,IAAI,CAACH,WAAW,CAAC,CAACI,MAAM,GAAG,IAAI;AAC1E;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeC,MAAMA,CAAA,EAA8B;EACxD,MAAMf,CAAC,GAAGX,WAAW,CAAC,CAAC;EACvB,IAAIW,CAAC,CAACC,eAAe,EAAE,OAAOe,aAAa,CAAC,CAAC;EAC7CjB,mBAAmB,CAAC,CAAC;EACrBD,YAAY,CAAC,CAAC;EACdO,iBAAiB,CAAC,CAAC;EACnB,MAAMX,eAAe,CAAC,CAAC;EACvBM,CAAC,CAACM,UAAU,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;EACzBlB,UAAU,CAAC,CAAC;EACZ,KAAKG,YAAY,CAAC,CAAC;EACnB,OAAOuB,aAAa,CAAC,CAAC;AACxB;AAEA,OAAO,SAASA,aAAaA,CAAA,EAAqB;EAChD,MAAMhB,CAAC,GAAGX,WAAW,CAAC,CAAC;EACvB;EACA,IAAIW,CAAC,CAACiB,gBAAgB,EAAE,OAAOjB,CAAC,CAACiB,gBAAgB;EACjD,IAAIC,aAAa,GAAG,CAAC;EACrB,KAAK,MAAMC,MAAM,IAAInB,CAAC,CAACoB,OAAO,EAAE,IAAID,MAAM,CAACE,UAAU,IAAI,IAAI,EAAEH,aAAa,EAAE;EAC9E,OAAO;IACLf,iBAAiB,EAAEH,CAAC,CAACG,iBAAiB;IACtCC,OAAO,EAAEJ,CAAC,CAACI,OAAO;IAClBc,aAAa;IACbI,cAAc,EAAEtB,CAAC,CAACsB,cAAc,IAAI3B,kBAAkB,CAAC,CAAC,IAAI,IAAI;IAChE4B,UAAU,EAAEvB,CAAC,CAACuB,UAAU;IACxBC,UAAU,EAAExB,CAAC,CAACwB,UAAU;IACxBlB,UAAU,EAAEN,CAAC,CAACM,UAAU;IACxBmB,SAAS,EAAEzB,CAAC,CAACyB,SAAS;IACtBC,aAAa,EAAE1B,CAAC,CAAC0B,aAAa;IAC9BjB,YAAY,EAAET,CAAC,CAACS,YAAY;IAC5BE,eAAe,EAAEX,CAAC,CAACW;EACrB,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Byte-size measurement.
|
|
5
|
+
*
|
|
6
|
+
* Dev only in practice: each scale variant is fetched from the Metro dev
|
|
7
|
+
* server (HEAD first for Content-Length, GET-blob fallback since Metro
|
|
8
|
+
* doesn't reliably answer HEAD) and the per-variant sizes are summed onto
|
|
9
|
+
* the record. Android release resource ids and iOS file:// URIs are not
|
|
10
|
+
* measurable from JS — those records keep `estDecodedBytes` as their only
|
|
11
|
+
* size signal and the UI marks them as estimates.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { assetsState } from "../state";
|
|
15
|
+
import { getSnapshot, invalidate, updateRecord } from "../store/assetStore";
|
|
16
|
+
import { getDevServerOrigin } from "./metroGraph";
|
|
17
|
+
const CONCURRENCY = 4;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Best displayable URL for a record: the resolved runtime URI, or (dev) the
|
|
21
|
+
* same dev-server URL the measurement pass uses — this is what gives graph-
|
|
22
|
+
* only (never-loaded) images real thumbnails.
|
|
23
|
+
*/
|
|
24
|
+
export function previewURL(record) {
|
|
25
|
+
if (record.resolvedUri) return record.resolvedUri;
|
|
26
|
+
const variants = variantURLs(record);
|
|
27
|
+
return variants.length ? variants[0].url : null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Image source for thumbnails/previews. On device the NUMERIC registry id is
|
|
32
|
+
* preferred (resolves natively — works for Android release resource ids too).
|
|
33
|
+
* On dashboard mirrors that id belongs to the DEVICE's registry and rn-web
|
|
34
|
+
* throws "asset with ID N could not be found" — use the device's http(s)
|
|
35
|
+
* URL instead (the Metro dev server is reachable from the desktop).
|
|
36
|
+
*/
|
|
37
|
+
export function displaySource(record) {
|
|
38
|
+
const mirror = assetsState().captureDisabled;
|
|
39
|
+
if (!mirror && record.registryId != null) return record.registryId;
|
|
40
|
+
const uri = previewURL(record);
|
|
41
|
+
if (!uri) return null;
|
|
42
|
+
if (mirror && !/^https?:\/\//.test(uri)) return null;
|
|
43
|
+
return {
|
|
44
|
+
uri
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** All scale-variant URLs for a record, derived without re-encoding pitfalls. */
|
|
49
|
+
export function variantURLs(record) {
|
|
50
|
+
const scales = record.scales.length ? record.scales : [1];
|
|
51
|
+
|
|
52
|
+
// Preferred: string surgery on the URL resolveAssetSource already proved
|
|
53
|
+
// works (handles Expo's ?unstable_path= form and monorepo rewrites).
|
|
54
|
+
const resolved = record.resolvedUri;
|
|
55
|
+
if (resolved && /^https?:\/\//.test(resolved) && record.resolvedScale != null) {
|
|
56
|
+
const pickedSuffix = record.resolvedScale === 1 ? "" : `@${record.resolvedScale}x`;
|
|
57
|
+
const marker = `${pickedSuffix}.${record.type}`;
|
|
58
|
+
if (resolved.includes(marker) || pickedSuffix === "") {
|
|
59
|
+
return scales.map(scale => {
|
|
60
|
+
const suffix = scale === 1 ? "" : `@${scale}x`;
|
|
61
|
+
const url = (pickedSuffix === "" ? resolved.replace(`.${record.type}`, `${suffix}.${record.type}`) : resolved.replace(marker, `${suffix}.${record.type}`)).replace(/ /g, "%20"); // RN's asset path builder doesn't encode spaces
|
|
62
|
+
return {
|
|
63
|
+
scale,
|
|
64
|
+
url
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Graph-only records: rebuild the dev-server URL the way Metro's
|
|
71
|
+
// AssetSourceResolver does (plain concatenation), encoding only spaces —
|
|
72
|
+
// full encodeURI would double-encode Expo's pre-escaped unstable_path.
|
|
73
|
+
const origin = getDevServerOrigin();
|
|
74
|
+
if (!origin || !record.httpServerLocation) return [];
|
|
75
|
+
return scales.map(scale => {
|
|
76
|
+
const suffix = scale === 1 ? "" : `@${scale}x`;
|
|
77
|
+
const path = `${record.httpServerLocation}/${record.name}${suffix}.${record.type}`;
|
|
78
|
+
const sep = path.includes("?") ? "&" : "?";
|
|
79
|
+
const url = `${origin}${path}${sep}platform=${platformName()}${record.hash ? `&hash=${record.hash}` : ""}`.replace(/ /g, "%20");
|
|
80
|
+
return {
|
|
81
|
+
scale,
|
|
82
|
+
url
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
function platformName() {
|
|
87
|
+
try {
|
|
88
|
+
return require("react-native").Platform.OS;
|
|
89
|
+
} catch {
|
|
90
|
+
return "ios";
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function fetchSize(url) {
|
|
94
|
+
try {
|
|
95
|
+
const head = await fetch(url, {
|
|
96
|
+
method: "HEAD"
|
|
97
|
+
});
|
|
98
|
+
if (head.ok) {
|
|
99
|
+
const length = Number(head.headers.get("content-length"));
|
|
100
|
+
if (Number.isFinite(length) && length > 0) return length;
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
// fall through to GET
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const response = await fetch(url);
|
|
107
|
+
if (!response.ok) return null;
|
|
108
|
+
const blob = await response.blob();
|
|
109
|
+
return blob.size > 0 ? blob.size : null;
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function measureRecord(record) {
|
|
115
|
+
const variants = variantURLs(record);
|
|
116
|
+
if (!variants.length) {
|
|
117
|
+
updateRecord(record.id, {
|
|
118
|
+
sizeSource: "estimate"
|
|
119
|
+
});
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const sizesByScale = {};
|
|
123
|
+
let total = 0;
|
|
124
|
+
for (const {
|
|
125
|
+
scale,
|
|
126
|
+
url
|
|
127
|
+
} of variants) {
|
|
128
|
+
const size = await fetchSize(url);
|
|
129
|
+
if (size != null) {
|
|
130
|
+
sizesByScale[String(scale)] = size;
|
|
131
|
+
total += size;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (total > 0) {
|
|
135
|
+
updateRecord(record.id, {
|
|
136
|
+
sizesByScale,
|
|
137
|
+
sizeBytes: total,
|
|
138
|
+
sizeSource: "measured"
|
|
139
|
+
});
|
|
140
|
+
} else {
|
|
141
|
+
updateRecord(record.id, {
|
|
142
|
+
sizeSource: "estimate"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** Measure every unmeasured record; safe to re-run (skips measured ones). */
|
|
148
|
+
export async function measureSizes() {
|
|
149
|
+
const s = assetsState();
|
|
150
|
+
if (s.measuring) return {
|
|
151
|
+
measured: s.measuredCount,
|
|
152
|
+
total: getSnapshot().length
|
|
153
|
+
};
|
|
154
|
+
const pending = getSnapshot().filter(r => r.sizeSource !== "measured");
|
|
155
|
+
s.measuring = true;
|
|
156
|
+
invalidate();
|
|
157
|
+
try {
|
|
158
|
+
let index = 0;
|
|
159
|
+
const worker = async () => {
|
|
160
|
+
for (;;) {
|
|
161
|
+
const next = pending[index++];
|
|
162
|
+
if (!next) return;
|
|
163
|
+
await measureRecord(next);
|
|
164
|
+
s.measuredCount = getSnapshot().filter(r => r.sizeSource === "measured").length;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
await Promise.all(Array.from({
|
|
168
|
+
length: Math.min(CONCURRENCY, pending.length)
|
|
169
|
+
}, worker));
|
|
170
|
+
} finally {
|
|
171
|
+
s.measuring = false;
|
|
172
|
+
invalidate();
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
measured: s.measuredCount,
|
|
176
|
+
total: getSnapshot().length
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["assetsState","getSnapshot","invalidate","updateRecord","getDevServerOrigin","CONCURRENCY","previewURL","record","resolvedUri","variants","variantURLs","length","url","displaySource","mirror","captureDisabled","registryId","uri","test","scales","resolved","resolvedScale","pickedSuffix","marker","type","includes","map","scale","suffix","replace","origin","httpServerLocation","path","name","sep","platformName","hash","require","Platform","OS","fetchSize","head","fetch","method","ok","Number","headers","get","isFinite","response","blob","size","measureRecord","id","sizeSource","sizesByScale","total","String","sizeBytes","measureSizes","s","measuring","measured","measuredCount","pending","filter","r","index","worker","next","Promise","all","Array","from","Math","min"],"sourceRoot":"../../../src","sources":["capture/measure.ts"],"mappings":"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","ignoreList":[]}
|