@buoy-gg/images 7.0.3

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 (195) hide show
  1. package/LICENSE +58 -0
  2. package/README.md +58 -0
  3. package/lib/commonjs/capture/actions.js +227 -0
  4. package/lib/commonjs/capture/actions.js.map +1 -0
  5. package/lib/commonjs/capture/install.js +41 -0
  6. package/lib/commonjs/capture/install.js.map +1 -0
  7. package/lib/commonjs/capture/installExpoImage.js +99 -0
  8. package/lib/commonjs/capture/installExpoImage.js.map +1 -0
  9. package/lib/commonjs/capture/installRnImage.js +128 -0
  10. package/lib/commonjs/capture/installRnImage.js.map +1 -0
  11. package/lib/commonjs/capture/overrides.js +286 -0
  12. package/lib/commonjs/capture/overrides.js.map +1 -0
  13. package/lib/commonjs/capture/savings.js +193 -0
  14. package/lib/commonjs/capture/savings.js.map +1 -0
  15. package/lib/commonjs/capture/shared.js +367 -0
  16. package/lib/commonjs/capture/shared.js.map +1 -0
  17. package/lib/commonjs/components/ImageDetail.js +444 -0
  18. package/lib/commonjs/components/ImageDetail.js.map +1 -0
  19. package/lib/commonjs/components/ImageDetailFooter.js +232 -0
  20. package/lib/commonjs/components/ImageDetailFooter.js.map +1 -0
  21. package/lib/commonjs/components/ImageRow.js +164 -0
  22. package/lib/commonjs/components/ImageRow.js.map +1 -0
  23. package/lib/commonjs/components/ImagesHeader.js +63 -0
  24. package/lib/commonjs/components/ImagesHeader.js.map +1 -0
  25. package/lib/commonjs/components/ImagesIcon.js +59 -0
  26. package/lib/commonjs/components/ImagesIcon.js.map +1 -0
  27. package/lib/commonjs/components/ImagesListFooter.js +194 -0
  28. package/lib/commonjs/components/ImagesListFooter.js.map +1 -0
  29. package/lib/commonjs/components/ImagesModal.js +173 -0
  30. package/lib/commonjs/components/ImagesModal.js.map +1 -0
  31. package/lib/commonjs/components/ImagesRoot.js +24 -0
  32. package/lib/commonjs/components/ImagesRoot.js.map +1 -0
  33. package/lib/commonjs/components/InsightsBar.js +59 -0
  34. package/lib/commonjs/components/InsightsBar.js.map +1 -0
  35. package/lib/commonjs/export.js +81 -0
  36. package/lib/commonjs/export.js.map +1 -0
  37. package/lib/commonjs/format.js +117 -0
  38. package/lib/commonjs/format.js.map +1 -0
  39. package/lib/commonjs/hooks/useImageRecords.js +20 -0
  40. package/lib/commonjs/hooks/useImageRecords.js.map +1 -0
  41. package/lib/commonjs/index.js +236 -0
  42. package/lib/commonjs/index.js.map +1 -0
  43. package/lib/commonjs/package.json +1 -0
  44. package/lib/commonjs/preset.js +45 -0
  45. package/lib/commonjs/preset.js.map +1 -0
  46. package/lib/commonjs/register.js +19 -0
  47. package/lib/commonjs/register.js.map +1 -0
  48. package/lib/commonjs/state.js +54 -0
  49. package/lib/commonjs/state.js.map +1 -0
  50. package/lib/commonjs/store/imageEventStore.js +160 -0
  51. package/lib/commonjs/store/imageEventStore.js.map +1 -0
  52. package/lib/commonjs/store/insights.js +76 -0
  53. package/lib/commonjs/store/insights.js.map +1 -0
  54. package/lib/commonjs/sync/imagesSyncAdapter.js +315 -0
  55. package/lib/commonjs/sync/imagesSyncAdapter.js.map +1 -0
  56. package/lib/commonjs/types.js +2 -0
  57. package/lib/commonjs/types.js.map +1 -0
  58. package/lib/module/capture/actions.js +214 -0
  59. package/lib/module/capture/actions.js.map +1 -0
  60. package/lib/module/capture/install.js +36 -0
  61. package/lib/module/capture/install.js.map +1 -0
  62. package/lib/module/capture/installExpoImage.js +94 -0
  63. package/lib/module/capture/installExpoImage.js.map +1 -0
  64. package/lib/module/capture/installRnImage.js +122 -0
  65. package/lib/module/capture/installRnImage.js.map +1 -0
  66. package/lib/module/capture/overrides.js +269 -0
  67. package/lib/module/capture/overrides.js.map +1 -0
  68. package/lib/module/capture/savings.js +189 -0
  69. package/lib/module/capture/savings.js.map +1 -0
  70. package/lib/module/capture/shared.js +359 -0
  71. package/lib/module/capture/shared.js.map +1 -0
  72. package/lib/module/components/ImageDetail.js +440 -0
  73. package/lib/module/components/ImageDetail.js.map +1 -0
  74. package/lib/module/components/ImageDetailFooter.js +228 -0
  75. package/lib/module/components/ImageDetailFooter.js.map +1 -0
  76. package/lib/module/components/ImageRow.js +160 -0
  77. package/lib/module/components/ImageRow.js.map +1 -0
  78. package/lib/module/components/ImagesHeader.js +59 -0
  79. package/lib/module/components/ImagesHeader.js.map +1 -0
  80. package/lib/module/components/ImagesIcon.js +55 -0
  81. package/lib/module/components/ImagesIcon.js.map +1 -0
  82. package/lib/module/components/ImagesListFooter.js +190 -0
  83. package/lib/module/components/ImagesListFooter.js.map +1 -0
  84. package/lib/module/components/ImagesModal.js +169 -0
  85. package/lib/module/components/ImagesModal.js.map +1 -0
  86. package/lib/module/components/ImagesRoot.js +20 -0
  87. package/lib/module/components/ImagesRoot.js.map +1 -0
  88. package/lib/module/components/InsightsBar.js +55 -0
  89. package/lib/module/components/InsightsBar.js.map +1 -0
  90. package/lib/module/export.js +76 -0
  91. package/lib/module/export.js.map +1 -0
  92. package/lib/module/format.js +108 -0
  93. package/lib/module/format.js.map +1 -0
  94. package/lib/module/hooks/useImageRecords.js +16 -0
  95. package/lib/module/hooks/useImageRecords.js.map +1 -0
  96. package/lib/module/index.js +73 -0
  97. package/lib/module/index.js.map +1 -0
  98. package/lib/module/preset.js +40 -0
  99. package/lib/module/preset.js.map +1 -0
  100. package/lib/module/register.js +19 -0
  101. package/lib/module/register.js.map +1 -0
  102. package/lib/module/state.js +50 -0
  103. package/lib/module/state.js.map +1 -0
  104. package/lib/module/store/imageEventStore.js +146 -0
  105. package/lib/module/store/imageEventStore.js.map +1 -0
  106. package/lib/module/store/insights.js +71 -0
  107. package/lib/module/store/insights.js.map +1 -0
  108. package/lib/module/sync/imagesSyncAdapter.js +311 -0
  109. package/lib/module/sync/imagesSyncAdapter.js.map +1 -0
  110. package/lib/module/types.js +2 -0
  111. package/lib/module/types.js.map +1 -0
  112. package/lib/typescript/capture/actions.d.ts +49 -0
  113. package/lib/typescript/capture/actions.d.ts.map +1 -0
  114. package/lib/typescript/capture/install.d.ts +15 -0
  115. package/lib/typescript/capture/install.d.ts.map +1 -0
  116. package/lib/typescript/capture/installExpoImage.d.ts +23 -0
  117. package/lib/typescript/capture/installExpoImage.d.ts.map +1 -0
  118. package/lib/typescript/capture/installRnImage.d.ts +24 -0
  119. package/lib/typescript/capture/installRnImage.d.ts.map +1 -0
  120. package/lib/typescript/capture/overrides.d.ts +83 -0
  121. package/lib/typescript/capture/overrides.d.ts.map +1 -0
  122. package/lib/typescript/capture/savings.d.ts +37 -0
  123. package/lib/typescript/capture/savings.d.ts.map +1 -0
  124. package/lib/typescript/capture/shared.d.ts +61 -0
  125. package/lib/typescript/capture/shared.d.ts.map +1 -0
  126. package/lib/typescript/components/ImageDetail.d.ts +13 -0
  127. package/lib/typescript/components/ImageDetail.d.ts.map +1 -0
  128. package/lib/typescript/components/ImageDetailFooter.d.ts +19 -0
  129. package/lib/typescript/components/ImageDetailFooter.d.ts.map +1 -0
  130. package/lib/typescript/components/ImageRow.d.ts +15 -0
  131. package/lib/typescript/components/ImageRow.d.ts.map +1 -0
  132. package/lib/typescript/components/ImagesHeader.d.ts +25 -0
  133. package/lib/typescript/components/ImagesHeader.d.ts.map +1 -0
  134. package/lib/typescript/components/ImagesIcon.d.ts +13 -0
  135. package/lib/typescript/components/ImagesIcon.d.ts.map +1 -0
  136. package/lib/typescript/components/ImagesListFooter.d.ts +8 -0
  137. package/lib/typescript/components/ImagesListFooter.d.ts.map +1 -0
  138. package/lib/typescript/components/ImagesModal.d.ts +17 -0
  139. package/lib/typescript/components/ImagesModal.d.ts.map +1 -0
  140. package/lib/typescript/components/ImagesRoot.d.ts +11 -0
  141. package/lib/typescript/components/ImagesRoot.d.ts.map +1 -0
  142. package/lib/typescript/components/InsightsBar.d.ts +13 -0
  143. package/lib/typescript/components/InsightsBar.d.ts.map +1 -0
  144. package/lib/typescript/export.d.ts +12 -0
  145. package/lib/typescript/export.d.ts.map +1 -0
  146. package/lib/typescript/format.d.ts +26 -0
  147. package/lib/typescript/format.d.ts.map +1 -0
  148. package/lib/typescript/hooks/useImageRecords.d.ts +11 -0
  149. package/lib/typescript/hooks/useImageRecords.d.ts.map +1 -0
  150. package/lib/typescript/index.d.ts +33 -0
  151. package/lib/typescript/index.d.ts.map +1 -0
  152. package/lib/typescript/preset.d.ts +38 -0
  153. package/lib/typescript/preset.d.ts.map +1 -0
  154. package/lib/typescript/register.d.ts +15 -0
  155. package/lib/typescript/register.d.ts.map +1 -0
  156. package/lib/typescript/state.d.ts +54 -0
  157. package/lib/typescript/state.d.ts.map +1 -0
  158. package/lib/typescript/store/imageEventStore.d.ts +34 -0
  159. package/lib/typescript/store/imageEventStore.d.ts.map +1 -0
  160. package/lib/typescript/store/insights.d.ts +11 -0
  161. package/lib/typescript/store/insights.d.ts.map +1 -0
  162. package/lib/typescript/sync/imagesSyncAdapter.d.ts +205 -0
  163. package/lib/typescript/sync/imagesSyncAdapter.d.ts.map +1 -0
  164. package/lib/typescript/types.d.ts +121 -0
  165. package/lib/typescript/types.d.ts.map +1 -0
  166. package/package.json +67 -0
  167. package/register.d.ts +1 -0
  168. package/register.js +15 -0
  169. package/src/capture/actions.ts +206 -0
  170. package/src/capture/install.ts +36 -0
  171. package/src/capture/installExpoImage.ts +115 -0
  172. package/src/capture/installRnImage.tsx +133 -0
  173. package/src/capture/overrides.ts +282 -0
  174. package/src/capture/savings.ts +193 -0
  175. package/src/capture/shared.ts +387 -0
  176. package/src/components/ImageDetail.tsx +456 -0
  177. package/src/components/ImageDetailFooter.tsx +270 -0
  178. package/src/components/ImageRow.tsx +148 -0
  179. package/src/components/ImagesHeader.tsx +77 -0
  180. package/src/components/ImagesIcon.tsx +66 -0
  181. package/src/components/ImagesListFooter.tsx +193 -0
  182. package/src/components/ImagesModal.tsx +195 -0
  183. package/src/components/ImagesRoot.tsx +18 -0
  184. package/src/components/InsightsBar.tsx +51 -0
  185. package/src/export.ts +100 -0
  186. package/src/format.ts +85 -0
  187. package/src/hooks/useImageRecords.ts +24 -0
  188. package/src/index.tsx +108 -0
  189. package/src/preset.tsx +35 -0
  190. package/src/register.ts +17 -0
  191. package/src/state.ts +88 -0
  192. package/src/store/imageEventStore.ts +162 -0
  193. package/src/store/insights.ts +66 -0
  194. package/src/sync/imagesSyncAdapter.ts +261 -0
  195. package/src/types.ts +111 -0
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.applyOverrides = applyOverrides;
7
+ exports.clearAllOverrides = clearAllOverrides;
8
+ exports.clearOverride = clearOverride;
9
+ exports.flashAllMounted = flashAllMounted;
10
+ exports.flashRecord = flashRecord;
11
+ exports.getGlobalModes = getGlobalModes;
12
+ exports.getOverride = getOverride;
13
+ exports.getRenderVersion = getRenderVersion;
14
+ exports.patchSourceCache = patchSourceCache;
15
+ exports.setBlankImages = setBlankImages;
16
+ exports.setNetworkMode = setNetworkMode;
17
+ exports.setOverride = setOverride;
18
+ exports.setOverrideForAllMounted = setOverrideForAllMounted;
19
+ exports.touchGlobal = touchGlobal;
20
+ exports.touchRecord = touchRecord;
21
+ var _state = require("../state");
22
+ var _imageEventStore = require("../store/imageEventStore");
23
+ /**
24
+ * Simulation overrides — the "we own the props" tier of actions.
25
+ *
26
+ * Because the RN decorator and the expo-image render patch control every
27
+ * mounted image's props, anything the component accepts is a simulation:
28
+ * forced errors (instant, offline-safe file:// source), forced loading
29
+ * (blackhole-IP source that never resolves), URL swaps, blanking, style
30
+ * merges (locate-flash border), and app-wide modes (offline images /
31
+ * cold-start / blank images).
32
+ *
33
+ * Re-render plumbing: every mutation bumps a per-record or global version.
34
+ * RN wrappers subscribe via useSyncExternalStore with a per-record snapshot
35
+ * (only the touched image re-renders); expo class instances are re-rendered
36
+ * directly via forceUpdate() from the per-record instance registry.
37
+ */
38
+
39
+ // ---------------------------------------------------------------------------
40
+ // Override model
41
+ // ---------------------------------------------------------------------------
42
+
43
+ const FORCED_ERROR_URI = "file:///buoy-images-forced-error.png";
44
+ const HANG_URI = "https://10.255.255.1/buoy-images-hang.png";
45
+ /** Offline mode replaces network sources with this (fails immediately). */
46
+ const OFFLINE_URI = "file:///buoy-images-offline-no-network.png";
47
+ const FLASH_STYLE = {
48
+ borderWidth: 3,
49
+ borderColor: "#FF453A"
50
+ };
51
+ /**
52
+ * RN core has NO safe "empty source": undefined resolves to the app bundle
53
+ * path and [] does too on RN 0.85 — both fire a bogus onError ("The file …
54
+ * couldn't be opened", observed live). So RN images blank via opacity
55
+ * instead (visual-only; the decoded image stays resident). expo-image
56
+ * supports a true `source={null}` and keeps showing its placeholder.
57
+ */
58
+ const RN_BLANK_STYLE = {
59
+ opacity: 0
60
+ };
61
+ // ---------------------------------------------------------------------------
62
+ // Version bus (re-render triggers)
63
+ // ---------------------------------------------------------------------------
64
+
65
+ function emit() {
66
+ for (const l of (0, _state.imagesState)().actionListeners) l();
67
+ }
68
+ function forceUpdateExpo(recordId) {
69
+ const s = (0, _state.imagesState)();
70
+ if (recordId != null) {
71
+ const instance = s.expoInstances.get(recordId);
72
+ instance?.forceUpdate?.();
73
+ return;
74
+ }
75
+ for (const instance of s.expoInstances.values()) {
76
+ instance?.forceUpdate?.();
77
+ }
78
+ }
79
+
80
+ /** Bump one record's render version (re-renders just that image). */
81
+ function touchRecord(recordId) {
82
+ const s = (0, _state.imagesState)();
83
+ s.recordVersions.set(recordId, ++s.versionCounter);
84
+ emit();
85
+ forceUpdateExpo(recordId);
86
+ }
87
+
88
+ /** Bump the global render version (re-renders every wrapped image). */
89
+ function touchGlobal() {
90
+ const s = (0, _state.imagesState)();
91
+ s.globalVersion = ++s.versionCounter;
92
+ emit();
93
+ forceUpdateExpo();
94
+ }
95
+
96
+ /** Snapshot for the RN wrapper's useSyncExternalStore. */
97
+ function getRenderVersion(recordId) {
98
+ const s = (0, _state.imagesState)();
99
+ const record = recordId != null ? s.recordVersions.get(recordId) ?? 0 : 0;
100
+ return Math.max(record, s.globalVersion);
101
+ }
102
+
103
+ // ---------------------------------------------------------------------------
104
+ // Per-record overrides
105
+ // ---------------------------------------------------------------------------
106
+
107
+ function setOverride(recordId, override) {
108
+ (0, _state.imagesState)().overrides.set(recordId, override);
109
+ (0, _imageEventStore.updateRecord)(recordId, {
110
+ overrideLabel: override.label
111
+ });
112
+ touchRecord(recordId);
113
+ }
114
+ function clearOverride(recordId) {
115
+ (0, _state.imagesState)().overrides.delete(recordId);
116
+ (0, _imageEventStore.updateRecord)(recordId, {
117
+ overrideLabel: undefined
118
+ });
119
+ touchRecord(recordId);
120
+ }
121
+ function getOverride(recordId) {
122
+ if (recordId == null) return undefined;
123
+ return (0, _state.imagesState)().overrides.get(recordId);
124
+ }
125
+
126
+ // ---------------------------------------------------------------------------
127
+ // Mass actions (every mounted image at once)
128
+ // ---------------------------------------------------------------------------
129
+
130
+ /** Apply one override to every mounted record. Returns how many were hit. */
131
+ function setOverrideForAllMounted(source, label) {
132
+ let count = 0;
133
+ for (const record of (0, _imageEventStore.getSnapshot)()) {
134
+ if (!record.mounted) continue;
135
+ setOverride(record.id, {
136
+ source,
137
+ label
138
+ });
139
+ count++;
140
+ }
141
+ return count;
142
+ }
143
+
144
+ /** Remove every active override. Returns how many were cleared. */
145
+ function clearAllOverrides() {
146
+ const ids = [...(0, _state.imagesState)().overrides.keys()];
147
+ for (const id of ids) clearOverride(id);
148
+ return ids.length;
149
+ }
150
+
151
+ /** Flash every mounted image (locate everything the tool tracks). */
152
+ function flashAllMounted(durationMs = 2500) {
153
+ let count = 0;
154
+ for (const record of (0, _imageEventStore.getSnapshot)()) {
155
+ if (!record.mounted) continue;
156
+ flashRecord(record.id, durationMs);
157
+ count++;
158
+ }
159
+ return count;
160
+ }
161
+
162
+ /** Flash a border on the on-screen image so it can be located visually. */
163
+ function flashRecord(recordId, durationMs = 2500) {
164
+ const s = (0, _state.imagesState)();
165
+ s.flashUntil.set(recordId, Date.now() + durationMs);
166
+ touchRecord(recordId);
167
+ setTimeout(() => {
168
+ (0, _state.imagesState)().flashUntil.delete(recordId);
169
+ touchRecord(recordId);
170
+ }, durationMs + 50);
171
+ }
172
+
173
+ // ---------------------------------------------------------------------------
174
+ // Global simulation modes
175
+ // ---------------------------------------------------------------------------
176
+
177
+ /**
178
+ * offline — every NETWORK image load fails immediately (both libs, cache or
179
+ * not); bundled/local assets still load, like a real offline device showing
180
+ * shipped images. Blunt on purpose: toggle + reload = images visibly gone.
181
+ * (The subtler `only-if-cached` variant was correct-but-confusing, and its
182
+ * uncached requests HANG on iOS instead of erroring — bad for QA.)
183
+ * cold — every image bypasses caches (RN `cache:'reload'`, expo
184
+ * `cachePolicy:'none'`): first-launch behavior without clearing anything.
185
+ */
186
+ function setNetworkMode(mode) {
187
+ (0, _state.imagesState)().globalModes.network = mode;
188
+ touchGlobal();
189
+ }
190
+
191
+ /** Chrome-style "disable images": render every image without a source. */
192
+ function setBlankImages(enabled) {
193
+ (0, _state.imagesState)().globalModes.blank = enabled;
194
+ touchGlobal();
195
+ }
196
+ function getGlobalModes() {
197
+ return (0, _state.imagesState)().globalModes;
198
+ }
199
+
200
+ // ---------------------------------------------------------------------------
201
+ // Application (called from the RN wrapper + expo render patch)
202
+ // ---------------------------------------------------------------------------
203
+
204
+ /** Inject a `cache` policy into an RN source (object or array shape). */
205
+ function patchSourceCache(source, cache) {
206
+ if (Array.isArray(source)) {
207
+ return source.map(entry => entry && typeof entry === "object" && typeof entry.uri === "string" ? {
208
+ ...entry,
209
+ cache
210
+ } : entry);
211
+ }
212
+ if (source && typeof source === "object" && typeof source.uri === "string") {
213
+ return {
214
+ ...source,
215
+ cache
216
+ };
217
+ }
218
+ return source; // numeric assets etc. — nothing to patch
219
+ }
220
+ function resolveOverrideSource(source, lib) {
221
+ switch (source.type) {
222
+ case "url":
223
+ return {
224
+ uri: source.uri
225
+ };
226
+ case "error":
227
+ return {
228
+ uri: FORCED_ERROR_URI
229
+ };
230
+ case "hang":
231
+ return {
232
+ uri: HANG_URI
233
+ };
234
+ case "blank":
235
+ // Only reached for expo — RN blanking is style-based (see RN_BLANK_STYLE).
236
+ return null;
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Merge global modes + per-record override + locate-flash into an
242
+ * already-copied props object. Mutates and returns `out`.
243
+ */
244
+ function applyOverrides(out, recordId, lib) {
245
+ const s = (0, _state.imagesState)();
246
+ const modes = s.globalModes;
247
+ if (modes.network === "offline") {
248
+ // Hard offline: network sources fail outright (both libs); bundled/local
249
+ // assets keep loading like a real offline device.
250
+ const record = recordId != null ? (0, _imageEventStore.getRecord)(recordId) : undefined;
251
+ if (record?.sourceKind === "network") {
252
+ out.source = {
253
+ uri: OFFLINE_URI
254
+ };
255
+ }
256
+ } else if (modes.network === "cold") {
257
+ if (lib === "rn") {
258
+ out.source = patchSourceCache(out.source, "reload");
259
+ } else {
260
+ out.cachePolicy = "none";
261
+ }
262
+ }
263
+ if (modes.blank) {
264
+ if (lib === "expo") out.source = null;else out.style = [out.style, RN_BLANK_STYLE];
265
+ }
266
+ const override = getOverride(recordId);
267
+ if (override) {
268
+ if (override.source) {
269
+ if (override.source.type === "blank" && lib === "rn") {
270
+ out.style = [out.style, RN_BLANK_STYLE];
271
+ } else {
272
+ out.source = resolveOverrideSource(override.source, lib);
273
+ }
274
+ }
275
+ if (override.extraProps) Object.assign(out, override.extraProps);
276
+ if (override.style) out.style = [out.style, override.style];
277
+ }
278
+ if (recordId != null) {
279
+ const until = s.flashUntil.get(recordId);
280
+ if (until != null && until > Date.now()) {
281
+ out.style = [out.style, FLASH_STYLE];
282
+ }
283
+ }
284
+ return out;
285
+ }
286
+ //# sourceMappingURL=overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_state","require","_imageEventStore","FORCED_ERROR_URI","HANG_URI","OFFLINE_URI","FLASH_STYLE","borderWidth","borderColor","RN_BLANK_STYLE","opacity","emit","l","imagesState","actionListeners","forceUpdateExpo","recordId","s","instance","expoInstances","get","forceUpdate","values","touchRecord","recordVersions","set","versionCounter","touchGlobal","globalVersion","getRenderVersion","record","Math","max","setOverride","override","overrides","updateRecord","overrideLabel","label","clearOverride","delete","undefined","getOverride","setOverrideForAllMounted","source","count","getSnapshot","mounted","id","clearAllOverrides","ids","keys","length","flashAllMounted","durationMs","flashRecord","flashUntil","Date","now","setTimeout","setNetworkMode","mode","globalModes","network","setBlankImages","enabled","blank","getGlobalModes","patchSourceCache","cache","Array","isArray","map","entry","uri","resolveOverrideSource","lib","type","applyOverrides","out","modes","getRecord","sourceKind","cachePolicy","style","extraProps","Object","assign","until"],"sourceRoot":"../../../src","sources":["capture/overrides.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.proveSavings = proveSavings;
7
+ var _imageEventStore = require("../store/imageEventStore");
8
+ /**
9
+ * Savings prover — Squoosh-style, on device.
10
+ *
11
+ * Instead of estimating what an oversized source wastes, PROVE it: re-encode
12
+ * the image at the displayed size (× pixel ratio) as WebP via
13
+ * expo-image-manipulator (verified: chainable resize → saveAsync WebP on BOTH
14
+ * platforms, available in Expo Go), stat the output file, and report real
15
+ * bytes vs the original. The optimized file:// URI can then be A/B'd in place
16
+ * through the existing swap-url override.
17
+ *
18
+ * Original size is resolved in tiers: observed download bytes (onProgress
19
+ * total) → expo disk-cache file size → HEAD Content-Length.
20
+ */
21
+
22
+ function loadLegacyFs() {
23
+ try {
24
+ const mod = require("expo-file-system/legacy");
25
+ const fs = mod?.default || mod;
26
+ if (fs?.getInfoAsync) return fs;
27
+ } catch {
28
+ // try main import
29
+ }
30
+ try {
31
+ const mod = require("expo-file-system");
32
+ const fs = mod?.default || mod;
33
+ if (fs?.getInfoAsync) return fs;
34
+ } catch {
35
+ // not installed
36
+ }
37
+ return null;
38
+ }
39
+ async function fileSize(uri) {
40
+ const fs = loadLegacyFs();
41
+ if (!fs?.getInfoAsync) return null;
42
+ try {
43
+ const normalized = uri.startsWith("file://") ? uri : `file://${uri}`;
44
+ const info = await fs.getInfoAsync(normalized, {
45
+ size: true
46
+ });
47
+ return info.exists && typeof info.size === "number" ? info.size : null;
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ async function resolveOriginalBytes(record) {
53
+ if (record.bytesTotal && record.bytesTotal > 0) {
54
+ return {
55
+ bytes: record.bytesTotal,
56
+ source: "download"
57
+ };
58
+ }
59
+ // expo disk cache file
60
+ if (record.lib === "expo") {
61
+ try {
62
+ const expo = require("expo-image");
63
+ const path = await expo.Image.getCachePathAsync(record.uri);
64
+ if (path) {
65
+ const size = await fileSize(path);
66
+ if (size != null) return {
67
+ bytes: size,
68
+ source: "cacheFile"
69
+ };
70
+ }
71
+ } catch {
72
+ // fall through
73
+ }
74
+ }
75
+ // HEAD request (network sources only)
76
+ if (record.sourceKind === "network") {
77
+ try {
78
+ const response = await fetch(record.uri, {
79
+ method: "HEAD"
80
+ });
81
+ const length = Number(response.headers.get("content-length"));
82
+ if (Number.isFinite(length) && length > 0) return {
83
+ bytes: length,
84
+ source: "head"
85
+ };
86
+ } catch {
87
+ // unknown original size is fine
88
+ }
89
+ }
90
+ return null;
91
+ }
92
+
93
+ /**
94
+ * Re-encode `record`'s source at its displayed size as WebP and measure it.
95
+ * Requires expo-image-manipulator (graceful message when absent).
96
+ */
97
+ async function proveSavings(record) {
98
+ if (!record.uri || record.sourceKind !== "network" && record.sourceKind !== "asset" && record.sourceKind !== "file") {
99
+ return {
100
+ ok: false,
101
+ message: "No loadable source URI on this record"
102
+ };
103
+ }
104
+ const needed = (0, _imageEventStore.neededPixels)(record);
105
+ if (!needed) {
106
+ return {
107
+ ok: false,
108
+ message: "No layout yet — the image must render once to know its displayed size"
109
+ };
110
+ }
111
+ let manipulator;
112
+ try {
113
+ manipulator = require("expo-image-manipulator");
114
+ } catch {
115
+ return {
116
+ ok: false,
117
+ message: "expo-image-manipulator not installed — add it to enable real savings measurement"
118
+ };
119
+ }
120
+ const webp = manipulator.SaveFormat?.WEBP ?? "webp";
121
+ const targetWidth = Math.min(needed.width, record.intrinsic?.width ?? needed.width);
122
+ let original = null;
123
+ let optimized = null;
124
+ try {
125
+ [original, optimized] = await Promise.all([resolveOriginalBytes(record), (async () => {
126
+ // Preferred: context API (current). Fallback: deprecated manipulateAsync.
127
+ if (manipulator.ImageManipulator?.manipulate) {
128
+ const context = manipulator.ImageManipulator.manipulate(record.uri);
129
+ try {
130
+ const ref = await context.resize({
131
+ width: targetWidth
132
+ }).renderAsync();
133
+ try {
134
+ return await ref.saveAsync({
135
+ format: webp,
136
+ compress: 0.8
137
+ });
138
+ } finally {
139
+ ref.release?.();
140
+ }
141
+ } finally {
142
+ context.release?.();
143
+ }
144
+ }
145
+ if (manipulator.manipulateAsync) {
146
+ return manipulator.manipulateAsync(record.uri, [{
147
+ resize: {
148
+ width: targetWidth
149
+ }
150
+ }], {
151
+ compress: 0.8,
152
+ format: webp
153
+ });
154
+ }
155
+ return null;
156
+ })()]);
157
+ } catch (error) {
158
+ return {
159
+ ok: false,
160
+ message: `Re-encode failed: ${String(error?.message ?? error)}`
161
+ };
162
+ }
163
+ if (!optimized?.uri) {
164
+ return {
165
+ ok: false,
166
+ message: "Re-encode produced no output (unsupported source?)"
167
+ };
168
+ }
169
+ const optimizedBytes = await fileSize(optimized.uri);
170
+ const result = {
171
+ ok: true,
172
+ message: "",
173
+ optimizedUri: optimized.uri,
174
+ optimizedBytes: optimizedBytes ?? undefined,
175
+ optimizedDims: {
176
+ width: optimized.width,
177
+ height: optimized.height
178
+ },
179
+ originalBytes: original?.bytes,
180
+ originalBytesSource: original?.source
181
+ };
182
+ if (original?.bytes != null && optimizedBytes != null) {
183
+ result.savedBytes = Math.max(0, original.bytes - optimizedBytes);
184
+ result.savedPct = original.bytes > 0 ? Math.round(result.savedBytes / original.bytes * 100) : 0;
185
+ result.message = `Right-sized WebP is ${result.savedPct}% smaller (real bytes, encoded on device)`;
186
+ } else if (optimizedBytes != null) {
187
+ result.message = "Optimized variant encoded — original size unknown (no download bytes, cache entry, or Content-Length)";
188
+ } else {
189
+ result.message = "Optimized variant encoded — could not stat the output file";
190
+ }
191
+ return result;
192
+ }
193
+ //# sourceMappingURL=savings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_imageEventStore","require","loadLegacyFs","mod","fs","default","getInfoAsync","fileSize","uri","normalized","startsWith","info","size","exists","resolveOriginalBytes","record","bytesTotal","bytes","source","lib","expo","path","Image","getCachePathAsync","sourceKind","response","fetch","method","length","Number","headers","get","isFinite","proveSavings","ok","message","needed","neededPixels","manipulator","webp","SaveFormat","WEBP","targetWidth","Math","min","width","intrinsic","original","optimized","Promise","all","ImageManipulator","manipulate","context","ref","resize","renderAsync","saveAsync","format","compress","release","manipulateAsync","error","String","optimizedBytes","result","optimizedUri","undefined","optimizedDims","height","originalBytes","originalBytesSource","savedBytes","max","savedPct","round"],"sourceRoot":"../../../src","sources":["capture/savings.ts"],"mappings":"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","ignoreList":[]}