@unif/react-native-design 0.33.0 → 0.33.1

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 (29) hide show
  1. package/lib/module/components/ui/Avatar/Avatar.js +3 -3
  2. package/lib/module/components/ui/Avatar/Avatar.js.map +1 -1
  3. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js +3 -3
  4. package/lib/module/components/ui/DrawerHeader/DrawerHeader.js.map +1 -1
  5. package/lib/module/components/ui/Thumbnail/Thumbnail.js +3 -3
  6. package/lib/module/components/ui/Thumbnail/Thumbnail.js.map +1 -1
  7. package/lib/module/components/ui/shared/ImageAttempt.js.map +1 -1
  8. package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js +6 -5
  9. package/lib/module/components/ui/shared/selectImageAttemptSource.shared.js.map +1 -1
  10. package/lib/module/components/ui/shared/useImageSource.js +11 -0
  11. package/lib/module/components/ui/shared/useImageSource.js.map +1 -0
  12. package/lib/module/utils/imageSource.js +47 -13
  13. package/lib/module/utils/imageSource.js.map +1 -1
  14. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts +3 -2
  15. package/lib/typescript/src/components/ui/shared/ImageAttempt.d.ts.map +1 -1
  16. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts +3 -2
  17. package/lib/typescript/src/components/ui/shared/selectImageAttemptSource.shared.d.ts.map +1 -1
  18. package/lib/typescript/src/components/ui/shared/useImageSource.d.ts +6 -0
  19. package/lib/typescript/src/components/ui/shared/useImageSource.d.ts.map +1 -0
  20. package/lib/typescript/src/utils/imageSource.d.ts +3 -2
  21. package/lib/typescript/src/utils/imageSource.d.ts.map +1 -1
  22. package/package.json +1 -1
  23. package/src/components/ui/Avatar/Avatar.tsx +3 -3
  24. package/src/components/ui/DrawerHeader/DrawerHeader.tsx +3 -3
  25. package/src/components/ui/Thumbnail/Thumbnail.tsx +3 -3
  26. package/src/components/ui/shared/ImageAttempt.tsx +3 -2
  27. package/src/components/ui/shared/selectImageAttemptSource.shared.ts +7 -5
  28. package/src/components/ui/shared/useImageSource.ts +8 -0
  29. package/src/utils/imageSource.ts +78 -15
@@ -3,7 +3,7 @@
3
3
  import React from 'react';
4
4
  import { Text, View } from 'react-native';
5
5
  import { scaleFontMetric, useColors, useFontScale } from "../../../theme/index.js";
6
- import { resolveImageSource } from "../../../utils/imageSource.js";
6
+ import { useImageSource } from "../shared/useImageSource.js";
7
7
  import { ImageAttempt } from "../shared/ImageAttempt.js";
8
8
  import { paletteFor, styles } from "./styles.js";
9
9
  import { resolveAvatarBorderRadius, sizingFor } from "./geometry.js";
@@ -28,7 +28,7 @@ export function Avatar({
28
28
  const dims = sizingFor(size);
29
29
  const palette = paletteFor(variant, c);
30
30
  const labelFontSize = scaleFontMetric(dims.fs, fontScale);
31
- const resolvedSource = resolveImageSource(source);
31
+ const resolvedSource = useImageSource(source);
32
32
  const fallback = /*#__PURE__*/_jsx(Text, {
33
33
  style: [styles.label, {
34
34
  fontSize: labelFontSize,
@@ -48,7 +48,7 @@ export function Avatar({
48
48
  accessibilityLabel: label,
49
49
  testID: testID,
50
50
  children: resolvedSource === undefined ? fallback : /*#__PURE__*/_jsx(ImageAttempt, {
51
- source: resolvedSource.source,
51
+ source: resolvedSource,
52
52
  fallback: fallback,
53
53
  style: styles.image,
54
54
  resizeMode: "cover"
@@ -1 +1 @@
1
- {"version":3,"names":["React","Text","View","scaleFontMetric","useColors","useFontScale","resolveImageSource","ImageAttempt","paletteFor","styles","resolveAvatarBorderRadius","sizingFor","jsx","_jsx","Avatar","label","size","shape","variant","source","style","testID","c","fontScale","dims","palette","labelFontSize","fs","resolvedSource","fallback","fontSize","color","fg","numberOfLines","children","base","width","box","height","borderRadius","backgroundColor","bg","accessible","accessibilityLabel","undefined","image","resizeMode","key"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/Avatar.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,YAAY,QAAQ,yBAAgB;AACzE,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,EAAEC,MAAM,QAAQ,aAAU;AAC7C,SAASC,yBAAyB,EAAEC,SAAS,QAAQ,eAAY;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGlE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAC;EACrBC,KAAK;EACLC,IAAI,GAAG,IAAI;EACXC,KAAK,GAAG,QAAQ;EAChBC,OAAO,GAAG,SAAS;EACnBC,MAAM;EACNC,KAAK;EACLC;AACW,CAAC,EAAqB;EACjC,MAAMC,CAAC,GAAGlB,SAAS,CAAC,CAAC;EACrB,MAAMmB,SAAS,GAAGlB,YAAY,CAAC,CAAC;EAChC,MAAMmB,IAAI,GAAGb,SAAS,CAACK,IAAI,CAAC;EAC5B,MAAMS,OAAO,GAAGjB,UAAU,CAACU,OAAO,EAAEI,CAAC,CAAC;EACtC,MAAMI,aAAa,GAAGvB,eAAe,CAACqB,IAAI,CAACG,EAAE,EAAEJ,SAAS,CAAC;EACzD,MAAMK,cAAc,GAAGtB,kBAAkB,CAACa,MAAM,CAAC;EACjD,MAAMU,QAAQ,gBACZhB,IAAA,CAACZ,IAAI;IACHmB,KAAK,EAAE,CAACX,MAAM,CAACM,KAAK,EAAE;MAAEe,QAAQ,EAAEJ,aAAa;MAAEK,KAAK,EAAEN,OAAO,CAACO;IAAG,CAAC,CAAE;IACtEC,aAAa,EAAE,CAAE;IAAAC,QAAA,EAEhBnB;EAAK,CACF,CACP;EAED,oBACEF,IAAA,CAACX,IAAI;IACHkB,KAAK,EAAE,CACLX,MAAM,CAAC0B,IAAI,EACX;MACEC,KAAK,EAAEZ,IAAI,CAACa,GAAG;MACfC,MAAM,EAAEd,IAAI,CAACa,GAAG;MAChBE,YAAY,EAAE7B,yBAAyB,CAACM,IAAI,EAAEC,KAAK,CAAC;MACpDuB,eAAe,EAAEf,OAAO,CAACgB;IAC3B,CAAC,EACDrB,KAAK,CACL;IACFsB,UAAU,EAAE,CAAC,CAAC3B,KAAM;IACpB4B,kBAAkB,EAAE5B,KAAM;IAC1BM,MAAM,EAAEA,MAAO;IAAAa,QAAA,EAEdN,cAAc,KAAKgB,SAAS,GAC3Bf,QAAQ,gBAERhB,IAAA,CAACN,YAAY;MAEXY,MAAM,EAAES,cAAc,CAACT,MAAO;MAC9BU,QAAQ,EAAEA,QAAS;MACnBT,KAAK,EAAEX,MAAM,CAACoC,KAAM;MACpBC,UAAU,EAAC;IAAO,GAJblB,cAAc,CAACmB,GAKrB;EACF,CACG,CAAC;AAEX","ignoreList":[]}
1
+ {"version":3,"names":["React","Text","View","scaleFontMetric","useColors","useFontScale","useImageSource","ImageAttempt","paletteFor","styles","resolveAvatarBorderRadius","sizingFor","jsx","_jsx","Avatar","label","size","shape","variant","source","style","testID","c","fontScale","dims","palette","labelFontSize","fs","resolvedSource","fallback","fontSize","color","fg","numberOfLines","children","base","width","box","height","borderRadius","backgroundColor","bg","accessible","accessibilityLabel","undefined","image","resizeMode","key"],"sourceRoot":"../../../../../src","sources":["components/ui/Avatar/Avatar.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,EAAEC,SAAS,EAAEC,YAAY,QAAQ,yBAAgB;AACzE,SAASC,cAAc,QAAQ,6BAA0B;AACzD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,EAAEC,MAAM,QAAQ,aAAU;AAC7C,SAASC,yBAAyB,EAAEC,SAAS,QAAQ,eAAY;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGlE;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAAC;EACrBC,KAAK;EACLC,IAAI,GAAG,IAAI;EACXC,KAAK,GAAG,QAAQ;EAChBC,OAAO,GAAG,SAAS;EACnBC,MAAM;EACNC,KAAK;EACLC;AACW,CAAC,EAAqB;EACjC,MAAMC,CAAC,GAAGlB,SAAS,CAAC,CAAC;EACrB,MAAMmB,SAAS,GAAGlB,YAAY,CAAC,CAAC;EAChC,MAAMmB,IAAI,GAAGb,SAAS,CAACK,IAAI,CAAC;EAC5B,MAAMS,OAAO,GAAGjB,UAAU,CAACU,OAAO,EAAEI,CAAC,CAAC;EACtC,MAAMI,aAAa,GAAGvB,eAAe,CAACqB,IAAI,CAACG,EAAE,EAAEJ,SAAS,CAAC;EACzD,MAAMK,cAAc,GAAGtB,cAAc,CAACa,MAAM,CAAC;EAC7C,MAAMU,QAAQ,gBACZhB,IAAA,CAACZ,IAAI;IACHmB,KAAK,EAAE,CAACX,MAAM,CAACM,KAAK,EAAE;MAAEe,QAAQ,EAAEJ,aAAa;MAAEK,KAAK,EAAEN,OAAO,CAACO;IAAG,CAAC,CAAE;IACtEC,aAAa,EAAE,CAAE;IAAAC,QAAA,EAEhBnB;EAAK,CACF,CACP;EAED,oBACEF,IAAA,CAACX,IAAI;IACHkB,KAAK,EAAE,CACLX,MAAM,CAAC0B,IAAI,EACX;MACEC,KAAK,EAAEZ,IAAI,CAACa,GAAG;MACfC,MAAM,EAAEd,IAAI,CAACa,GAAG;MAChBE,YAAY,EAAE7B,yBAAyB,CAACM,IAAI,EAAEC,KAAK,CAAC;MACpDuB,eAAe,EAAEf,OAAO,CAACgB;IAC3B,CAAC,EACDrB,KAAK,CACL;IACFsB,UAAU,EAAE,CAAC,CAAC3B,KAAM;IACpB4B,kBAAkB,EAAE5B,KAAM;IAC1BM,MAAM,EAAEA,MAAO;IAAAa,QAAA,EAEdN,cAAc,KAAKgB,SAAS,GAC3Bf,QAAQ,gBAERhB,IAAA,CAACN,YAAY;MAEXY,MAAM,EAAES,cAAe;MACvBC,QAAQ,EAAEA,QAAS;MACnBT,KAAK,EAAEX,MAAM,CAACoC,KAAM;MACpBC,UAAU,EAAC;IAAO,GAJblB,cAAc,CAACmB,GAKrB;EACF,CACG,CAAC;AAEX","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  import React from 'react';
4
4
  import { Text, View } from 'react-native';
5
5
  import { useThemedStyles } from "../../../theme/index.js";
6
- import { resolveImageSource } from "../../../utils/imageSource.js";
6
+ import { useImageSource } from "../shared/useImageSource.js";
7
7
  import { A11Y_HIDDEN_PROPS } from "../shared/a11y.js";
8
8
  import { ImageAttempt } from "../shared/ImageAttempt.js";
9
9
  import { makeStyles } from "./styles.js";
@@ -22,7 +22,7 @@ export function DrawerHeader({
22
22
  const styles = useThemedStyles(makeStyles);
23
23
  // [L-51] 码点级取首字,防 emoji / 代理对被截断为乱码。
24
24
  const initial = [...name.trim()][0] ?? '?';
25
- const resolvedSource = resolveImageSource(source);
25
+ const resolvedSource = useImageSource(source);
26
26
  const fallback = /*#__PURE__*/_jsx(Text, {
27
27
  style: styles.avatarText,
28
28
  children: initial
@@ -34,7 +34,7 @@ export function DrawerHeader({
34
34
  ...A11Y_HIDDEN_PROPS,
35
35
  style: [styles.avatar, resolvedSource !== undefined && styles.avatarImageMode],
36
36
  children: resolvedSource === undefined ? fallback : /*#__PURE__*/_jsx(ImageAttempt, {
37
- source: resolvedSource.source,
37
+ source: resolvedSource,
38
38
  fallback: fallback,
39
39
  style: styles.avatarImage,
40
40
  resizeMode: "cover"
@@ -1 +1 @@
1
- {"version":3,"names":["React","Text","View","useThemedStyles","resolveImageSource","A11Y_HIDDEN_PROPS","ImageAttempt","makeStyles","jsx","_jsx","jsxs","_jsxs","DrawerHeader","name","subtitle","source","style","testID","styles","initial","trim","resolvedSource","fallback","avatarText","children","header","avatar","undefined","avatarImageMode","avatarImage","resizeMode","key","numberOfLines"],"sourceRoot":"../../../../../src","sources":["components/ui/DrawerHeader/DrawerHeader.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,QAAQ,yBAAgB;AAChD,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,iBAAiB,QAAQ,mBAAgB;AAClD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,QAAQ,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGtC;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,IAAI;EACJC,QAAQ;EACRC,MAAM;EACNC,KAAK;EACLC;AACiB,CAAC,EAAqB;EACvC,MAAMC,MAAM,GAAGf,eAAe,CAACI,UAAU,CAAC;EAC1C;EACA,MAAMY,OAAO,GAAG,CAAC,GAAGN,IAAI,CAACO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;EAC1C,MAAMC,cAAc,GAAGjB,kBAAkB,CAACW,MAAM,CAAC;EACjD,MAAMO,QAAQ,gBAAGb,IAAA,CAACR,IAAI;IAACe,KAAK,EAAEE,MAAM,CAACK,UAAW;IAAAC,QAAA,EAAEL;EAAO,CAAO,CAAC;EAEjE,oBACER,KAAA,CAACT,IAAI;IAACc,KAAK,EAAE,CAACE,MAAM,CAACO,MAAM,EAAET,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAO,QAAA,gBAClDf,IAAA,CAACP,IAAI;MAAA,GACCG,iBAAiB;MACrBW,KAAK,EAAE,CACLE,MAAM,CAACQ,MAAM,EACbL,cAAc,KAAKM,SAAS,IAAIT,MAAM,CAACU,eAAe,CACtD;MAAAJ,QAAA,EAEDH,cAAc,KAAKM,SAAS,GAC3BL,QAAQ,gBAERb,IAAA,CAACH,YAAY;QAEXS,MAAM,EAAEM,cAAc,CAACN,MAAO;QAC9BO,QAAQ,EAAEA,QAAS;QACnBN,KAAK,EAAEE,MAAM,CAACW,WAAY;QAC1BC,UAAU,EAAC;MAAO,GAJbT,cAAc,CAACU,GAKrB;IACF,CACG,CAAC,eACPtB,IAAA,CAACR,IAAI;MAACe,KAAK,EAAEE,MAAM,CAACL,IAAK;MAACmB,aAAa,EAAE,CAAE;MAAAR,QAAA,EACxCX;IAAI,CACD,CAAC,EACNC,QAAQ,gBACPL,IAAA,CAACR,IAAI;MAACe,KAAK,EAAEE,MAAM,CAACJ,QAAS;MAACkB,aAAa,EAAE,CAAE;MAAAR,QAAA,EAC5CV;IAAQ,CACL,CAAC,GACL,IAAI;EAAA,CACJ,CAAC;AAEX","ignoreList":[]}
1
+ {"version":3,"names":["React","Text","View","useThemedStyles","useImageSource","A11Y_HIDDEN_PROPS","ImageAttempt","makeStyles","jsx","_jsx","jsxs","_jsxs","DrawerHeader","name","subtitle","source","style","testID","styles","initial","trim","resolvedSource","fallback","avatarText","children","header","avatar","undefined","avatarImageMode","avatarImage","resizeMode","key","numberOfLines"],"sourceRoot":"../../../../../src","sources":["components/ui/DrawerHeader/DrawerHeader.tsx"],"mappings":";;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACzC,SAASC,eAAe,QAAQ,yBAAgB;AAChD,SAASC,cAAc,QAAQ,6BAA0B;AACzD,SAASC,iBAAiB,QAAQ,mBAAgB;AAClD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,UAAU,QAAQ,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGtC;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,IAAI;EACJC,QAAQ;EACRC,MAAM;EACNC,KAAK;EACLC;AACiB,CAAC,EAAqB;EACvC,MAAMC,MAAM,GAAGf,eAAe,CAACI,UAAU,CAAC;EAC1C;EACA,MAAMY,OAAO,GAAG,CAAC,GAAGN,IAAI,CAACO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;EAC1C,MAAMC,cAAc,GAAGjB,cAAc,CAACW,MAAM,CAAC;EAC7C,MAAMO,QAAQ,gBAAGb,IAAA,CAACR,IAAI;IAACe,KAAK,EAAEE,MAAM,CAACK,UAAW;IAAAC,QAAA,EAAEL;EAAO,CAAO,CAAC;EAEjE,oBACER,KAAA,CAACT,IAAI;IAACc,KAAK,EAAE,CAACE,MAAM,CAACO,MAAM,EAAET,KAAK,CAAE;IAACC,MAAM,EAAEA,MAAO;IAAAO,QAAA,gBAClDf,IAAA,CAACP,IAAI;MAAA,GACCG,iBAAiB;MACrBW,KAAK,EAAE,CACLE,MAAM,CAACQ,MAAM,EACbL,cAAc,KAAKM,SAAS,IAAIT,MAAM,CAACU,eAAe,CACtD;MAAAJ,QAAA,EAEDH,cAAc,KAAKM,SAAS,GAC3BL,QAAQ,gBAERb,IAAA,CAACH,YAAY;QAEXS,MAAM,EAAEM,cAAe;QACvBC,QAAQ,EAAEA,QAAS;QACnBN,KAAK,EAAEE,MAAM,CAACW,WAAY;QAC1BC,UAAU,EAAC;MAAO,GAJbT,cAAc,CAACU,GAKrB;IACF,CACG,CAAC,eACPtB,IAAA,CAACR,IAAI;MAACe,KAAK,EAAEE,MAAM,CAACL,IAAK;MAACmB,aAAa,EAAE,CAAE;MAAAR,QAAA,EACxCX;IAAI,CACD,CAAC,EACNC,QAAQ,gBACPL,IAAA,CAACR,IAAI;MAACe,KAAK,EAAEE,MAAM,CAACJ,QAAS;MAACkB,aAAa,EAAE,CAAE;MAAAR,QAAA,EAC5CV;IAAQ,CACL,CAAC,GACL,IAAI;EAAA,CACJ,CAAC;AAEX","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  import React, { useEffect, createElement as _createElement } from 'react';
4
4
  import { StyleSheet, View } from 'react-native';
5
5
  import { useColors, useThemedStyles } from "../../../theme/index.js";
6
- import { resolveImageSource } from "../../../utils/imageSource.js";
6
+ import { useImageSource } from "../shared/useImageSource.js";
7
7
  import { createLogger } from "../../../utils/logger/index.js";
8
8
  import { ImageAttempt } from "../shared/ImageAttempt.js";
9
9
  import { A11Y_HIDDEN_PROPS } from "../shared/a11y.js";
@@ -39,7 +39,7 @@ export function Thumbnail(props) {
39
39
  const sourceCandidate = hasUri !== hasSource ? hasUri && typeof uri === 'string' ? {
40
40
  uri: uri.trim()
41
41
  } : source : undefined;
42
- const resolvedSource = resolveImageSource(sourceCandidate);
42
+ const resolvedSource = useImageSource(sourceCandidate);
43
43
  const sanitizedImageStyle = sanitizeThumbnailImageStyle(imageStyle);
44
44
  const diagnostics = [...normalizedDimensions.diagnostics, ...(resolvedSource === undefined ? ['source'] : []), ...sanitizedImageStyle.diagnostics.map(field => field === 'style' ? 'imageStyle' : `imageStyle.${field}`)];
45
45
  const diagnosticKey = diagnostics.join(',');
@@ -71,7 +71,7 @@ export function Thumbnail(props) {
71
71
  children: [resolvedSource === undefined ? fallbackContent : /*#__PURE__*/_createElement(ImageAttempt, {
72
72
  ...imageAccessibilityProps,
73
73
  key: resolvedSource.key,
74
- source: resolvedSource.source,
74
+ source: resolvedSource,
75
75
  fallback: fallbackContent,
76
76
  style: [sanitizedImageStyle.style, StyleSheet.absoluteFill],
77
77
  resizeMode: resizeMode
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","createElement","_createElement","StyleSheet","View","useColors","useThemedStyles","resolveImageSource","createLogger","ImageAttempt","A11Y_HIDDEN_PROPS","normalizeThumbnailDimensions","sanitizeThumbnailImageStyle","makeStyles","jsx","_jsx","jsxs","_jsxs","log","hasOwn","value","key","Object","prototype","hasOwnProperty","call","Thumbnail","props","uri","source","size","fallback","selected","containerStyle","imageStyle","resizeMode","accessibilityLabel","testID","colors","styles","normalizedDimensions","dim","dimensions","hasUri","hasSource","sourceCandidate","trim","undefined","resolvedSource","sanitizedImageStyle","diagnostics","map","field","diagnosticKey","join","__DEV__","length","warn","normalizedLabel","imageAccessibilityProps","accessible","accessibilityRole","ringStyle","borderRadius","borderColor","primary","fallbackContent","style","children","visualFrame","absoluteFill","pointerEvents","ring"],"sourceRoot":"../../../../../src","sources":["components/ui/Thumbnail/Thumbnail.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAAC,aAAA,IAAAC,cAAA,QAAQ,OAAO;AACxC,SAASC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,SAASC,SAAS,EAAEC,eAAe,QAAQ,yBAAgB;AAC3D,SAASC,kBAAkB,QAAQ,+BAA4B;AAC/D,SAASC,YAAY,QAAQ,gCAAuB;AACpD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,iBAAiB,QAAQ,mBAAgB;AAClD,SACEC,4BAA4B,EAC5BC,2BAA2B,QACtB,gBAAa;AACpB,SAASC,UAAU,QAAQ,aAAU;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAGtC,MAAMC,GAAG,GAAGV,YAAY,CAAC,WAAW,CAAC;AACrC,MAAMW,MAAM,GAAGA,CAACC,KAAa,EAAEC,GAAgB,KAC7CC,MAAM,CAACC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACL,KAAK,EAAEC,GAAG,CAAC;;AAElD;AACA;AACA;AACA;AACA,OAAO,SAASK,SAASA,CAACC,KAAqB,EAAqB;EAClE,MAAM;IACJC,GAAG;IACHC,MAAM;IACNC,IAAI,GAAG,IAAI;IACXC,QAAQ;IACRC,QAAQ;IACRC,cAAc;IACdC,UAAU;IACVC,UAAU,GAAG,OAAO;IACpBC,kBAAkB;IAClBC;EACF,CAAC,GAAGV,KAAK;EACT,MAAMW,MAAM,GAAGjC,SAAS,CAAC,CAAC;EAC1B,MAAMkC,MAAM,GAAGjC,eAAe,CAACO,UAAU,CAAC;EAC1C,MAAM2B,oBAAoB,GAAG7B,4BAA4B,CAACmB,IAAI,CAAC;EAC/D,MAAMW,GAAG,GAAGD,oBAAoB,CAACE,UAAU;EAC3C,MAAMC,MAAM,GAAGxB,MAAM,CAACQ,KAAK,EAAE,KAAK,CAAC;EACnC,MAAMiB,SAAS,GAAGzB,MAAM,CAACQ,KAAK,EAAE,QAAQ,CAAC;EACzC,MAAMkB,eAAe,GACnBF,MAAM,KAAKC,SAAS,GAChBD,MAAM,IAAI,OAAOf,GAAG,KAAK,QAAQ,GAC/B;IAAEA,GAAG,EAAEA,GAAG,CAACkB,IAAI,CAAC;EAAE,CAAC,GACnBjB,MAAM,GACRkB,SAAS;EACf,MAAMC,cAAc,GAAGzC,kBAAkB,CAACsC,eAAe,CAAC;EAC1D,MAAMI,mBAAmB,GAAGrC,2BAA2B,CAACsB,UAAU,CAAC;EACnE,MAAMgB,WAAW,GAAG,CAClB,GAAGV,oBAAoB,CAACU,WAAW,EACnC,IAAIF,cAAc,KAAKD,SAAS,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,EACnD,GAAGE,mBAAmB,CAACC,WAAW,CAACC,GAAG,CAAEC,KAAK,IAC3CA,KAAK,KAAK,OAAO,GAAG,YAAY,GAAG,cAAcA,KAAK,EACxD,CAAC,CACF;EACD,MAAMC,aAAa,GAAGH,WAAW,CAACI,IAAI,CAAC,GAAG,CAAC;EAE3CtD,SAAS,CAAC,MAAM;IACd,IAAIuD,OAAO,IAAIF,aAAa,CAACG,MAAM,GAAG,CAAC,EAAE;MACvCtC,GAAG,CAACuC,IAAI,CAAC,sBAAsBJ,aAAa,OAAO,CAAC;IACtD;EACF,CAAC,EAAE,CAACA,aAAa,CAAC,CAAC;EAEnB,MAAMK,eAAe,GACnB,OAAOtB,kBAAkB,KAAK,QAAQ,GAClCA,kBAAkB,CAACU,IAAI,CAAC,CAAC,GACzBC,SAAS;EACf,MAAMY,uBAAuB,GAC3BD,eAAe,IAAIA,eAAe,CAACF,MAAM,GAAG,CAAC,GACzC;IACEI,UAAU,EAAE,IAAI;IAChBxB,kBAAkB,EAAEsB,eAAe;IACnCG,iBAAiB,EAAE;EACrB,CAAC,GACDnD,iBAAiB;EACvB,MAAMoD,SAAS,GAAG;IAChBC,YAAY,EAAEtB,GAAG,CAACsB,YAAY;IAC9BC,WAAW,EAAEhC,QAAQ,GAAGM,MAAM,CAAC2B,OAAO,GAAG;EAC3C,CAAC;EACD,MAAMC,eAAe,GACnBnC,QAAQ,KAAKgB,SAAS,GAAG,IAAI,gBAC3BhC,IAAA,CAACX,IAAI;IAAA,GAAKuD,uBAAuB;IAAEQ,KAAK,EAAE5B,MAAM,CAACR,QAAS;IAAAqC,QAAA,EACvDrC;EAAQ,CACL,CACP;EAEH,oBACEhB,IAAA,CAACX,IAAI;IAAC+D,KAAK,EAAElC,cAAe;IAACI,MAAM,EAAEA,MAAO;IAAA+B,QAAA,eAC1CnD,KAAA,CAACb,IAAI;MAAC+D,KAAK,EAAE,CAAC5B,MAAM,CAAC8B,WAAW,EAAE5B,GAAG,CAAE;MAAA2B,QAAA,GACpCpB,cAAc,KAAKD,SAAS,GAC3BmB,eAAe,gBAEfhE,cAAA,CAACO,YAAY;QAAA,GACPkD,uBAAuB;QAC3BtC,GAAG,EAAE2B,cAAc,CAAC3B,GAAI;QACxBQ,MAAM,EAAEmB,cAAc,CAACnB,MAAO;QAC9BE,QAAQ,EAAEmC,eAAgB;QAC1BC,KAAK,EAAE,CAAClB,mBAAmB,CAACkB,KAAK,EAAEhE,UAAU,CAACmE,YAAY,CAAE;QAC5DnC,UAAU,EAAEA;MAAW,CACxB,CACF,eACDpB,IAAA,CAACX,IAAI;QAAA,GACCM,iBAAiB;QACrB6D,aAAa,EAAC,MAAM;QACpBJ,KAAK,EAAE,CAAChE,UAAU,CAACmE,YAAY,EAAE/B,MAAM,CAACiC,IAAI,EAAEV,SAAS;MAAE,CAC1D,CAAC;IAAA,CACE;EAAC,CACH,CAAC;AAEX","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","createElement","_createElement","StyleSheet","View","useColors","useThemedStyles","useImageSource","createLogger","ImageAttempt","A11Y_HIDDEN_PROPS","normalizeThumbnailDimensions","sanitizeThumbnailImageStyle","makeStyles","jsx","_jsx","jsxs","_jsxs","log","hasOwn","value","key","Object","prototype","hasOwnProperty","call","Thumbnail","props","uri","source","size","fallback","selected","containerStyle","imageStyle","resizeMode","accessibilityLabel","testID","colors","styles","normalizedDimensions","dim","dimensions","hasUri","hasSource","sourceCandidate","trim","undefined","resolvedSource","sanitizedImageStyle","diagnostics","map","field","diagnosticKey","join","__DEV__","length","warn","normalizedLabel","imageAccessibilityProps","accessible","accessibilityRole","ringStyle","borderRadius","borderColor","primary","fallbackContent","style","children","visualFrame","absoluteFill","pointerEvents","ring"],"sourceRoot":"../../../../../src","sources":["components/ui/Thumbnail/Thumbnail.tsx"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useState","Image","selectImageAttemptSource","Fragment","_Fragment","jsx","_jsx","ImageAttempt","source","fallback","imageProps","failed","setFailed","handleError","selectedSource","undefined","children","onError"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/ImageAttempt.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,KAAK,QAAQ,cAAc;AAEpC,SAASC,wBAAwB,QAAQ,4BAA4B;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAOtE;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACR,GAAGC;AACc,CAAC,EAAqB;EACvC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAAC,KAAK,CAAC;EAC3C;EACA,MAAMa,WAAW,GAAGd,WAAW,CAAC,MAAMa,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;EAC1D,MAAME,cAAc,GAAGZ,wBAAwB,CAACM,MAAM,CAAC;EAEvD,OAAOG,MAAM,IAAIG,cAAc,KAAKC,SAAS,gBAC3CT,IAAA,CAAAF,SAAA;IAAAY,QAAA,EAAGP;EAAQ,CAAG,CAAC,gBAEfH,IAAA,CAACL,KAAK;IAAA,GAAKS,UAAU;IAAEF,MAAM,EAAEM,cAAe;IAACG,OAAO,EAAEJ;EAAY,CAAE,CACvE;AACH","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useState","Image","selectImageAttemptSource","Fragment","_Fragment","jsx","_jsx","ImageAttempt","source","fallback","imageProps","failed","setFailed","handleError","selectedSource","undefined","children","onError"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/ImageAttempt.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,SAASC,KAAK,QAAQ,cAAc;AAGpC,SAASC,wBAAwB,QAAQ,4BAA4B;AAAC,SAAAC,QAAA,IAAAC,SAAA,EAAAC,GAAA,IAAAC,IAAA;AAOtE;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAC;EAC3BC,MAAM;EACNC,QAAQ;EACR,GAAGC;AACc,CAAC,EAAqB;EACvC,MAAM,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAAC,KAAK,CAAC;EAC3C;EACA,MAAMa,WAAW,GAAGd,WAAW,CAAC,MAAMa,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;EAC1D,MAAME,cAAc,GAAGZ,wBAAwB,CAACM,MAAM,CAAC;EAEvD,OAAOG,MAAM,IAAIG,cAAc,KAAKC,SAAS,gBAC3CT,IAAA,CAAAF,SAAA;IAAAY,QAAA,EAAGP;EAAQ,CAAG,CAAC,gBAEfH,IAAA,CAACL,KAAK;IAAA,GAAKS,UAAU;IAAEF,MAAM,EAAEM,cAAe;IAACG,OAAO,EAAEJ;EAAY,CAAE,CACvE;AACH","ignoreList":[]}
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import { isValidImageSource } from "../../../utils/imageSource.js";
4
- export function selectNativeImageAttemptSource(source) {
5
- return isValidImageSource(source) ? source : undefined;
3
+ // Input validation belongs to the media component's resolver. Its frozen result
4
+ // is safe to select here without reading or serializing the original input again.
5
+ export function selectNativeImageAttemptSource(resolved) {
6
+ return resolved?.source;
6
7
  }
7
- export function selectWebImageAttemptSource(source) {
8
- if (!isValidImageSource(source)) return undefined;
8
+ export function selectWebImageAttemptSource(resolved) {
9
+ const source = resolved?.source;
9
10
 
10
11
  // RNW 0.21 不解析 native 的 candidate 数组;Web 明确使用第一候选项。
11
12
  return Array.isArray(source) ? source[0] : source;
@@ -1 +1 @@
1
- {"version":3,"names":["isValidImageSource","selectNativeImageAttemptSource","source","undefined","selectWebImageAttemptSource","Array","isArray"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/selectImageAttemptSource.shared.ts"],"mappings":";;AACA,SAASA,kBAAkB,QAAQ,+BAA4B;AAE/D,OAAO,SAASC,8BAA8BA,CAC5CC,MAAe,EACkB;EACjC,OAAOF,kBAAkB,CAACE,MAAM,CAAC,GAAGA,MAAM,GAAGC,SAAS;AACxD;AAEA,OAAO,SAASC,2BAA2BA,CACzCF,MAAe,EACkB;EACjC,IAAI,CAACF,kBAAkB,CAACE,MAAM,CAAC,EAAE,OAAOC,SAAS;;EAEjD;EACA,OAAOE,KAAK,CAACC,OAAO,CAACJ,MAAM,CAAC,GAAGA,MAAM,CAAC,CAAC,CAAC,GAAGA,MAAM;AACnD","ignoreList":[]}
1
+ {"version":3,"names":["selectNativeImageAttemptSource","resolved","source","selectWebImageAttemptSource","Array","isArray"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/selectImageAttemptSource.shared.ts"],"mappings":";;AAGA;AACA;AACA,OAAO,SAASA,8BAA8BA,CAC5CC,QAAyC,EACR;EACjC,OAAOA,QAAQ,EAAEC,MAAM;AACzB;AAEA,OAAO,SAASC,2BAA2BA,CACzCF,QAAyC,EACR;EACjC,MAAMC,MAAM,GAAGD,QAAQ,EAAEC,MAAM;;EAE/B;EACA,OAAOE,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,GAAGA,MAAM,CAAC,CAAC,CAAC,GAAGA,MAAM;AACnD","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import { useMemo } from 'react';
4
+ import { createImageSourceResolver } from "../../../utils/imageSource.js";
5
+
6
+ /** Reuse immutable image inputs without retaining a global source cache. */
7
+ export function useImageSource(source) {
8
+ const resolve = useMemo(createImageSourceResolver, []);
9
+ return resolve(source);
10
+ }
11
+ //# sourceMappingURL=useImageSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","createImageSourceResolver","useImageSource","source","resolve"],"sourceRoot":"../../../../../src","sources":["components/ui/shared/useImageSource.ts"],"mappings":";;AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,yBAAyB,QAAQ,+BAA4B;;AAEtE;AACA,OAAO,SAASC,cAAcA,CAACC,MAAe,EAAE;EAC9C,MAAMC,OAAO,GAAGJ,OAAO,CAACC,yBAAyB,EAAE,EAAE,CAAC;EACtD,OAAOG,OAAO,CAACD,MAAM,CAAC;AACxB","ignoreList":[]}
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key);
4
- function valid(snapshot, canonical) {
4
+ function valid(snapshot, canonical, children) {
5
5
  return {
6
6
  valid: true,
7
7
  snapshot,
8
- canonical
8
+ canonical,
9
+ children
9
10
  };
10
11
  }
11
12
  function invalid(kind) {
@@ -14,7 +15,7 @@ function invalid(kind) {
14
15
  canonical: `invalid:${kind}`
15
16
  };
16
17
  }
17
- function visitArray(value, keys, seen) {
18
+ function visitArray(value, keys, seen, previous) {
18
19
  if (!keys.includes('length')) return invalid('descriptor');
19
20
  const lengthDescriptor = Reflect.getOwnPropertyDescriptor(value, 'length');
20
21
  if (lengthDescriptor === undefined || lengthDescriptor.enumerable || !hasOwn(lengthDescriptor, 'value') || typeof lengthDescriptor.value !== 'number' || !Number.isInteger(lengthDescriptor.value) || lengthDescriptor.value < 0) {
@@ -25,6 +26,9 @@ function visitArray(value, keys, seen) {
25
26
  const keySet = new Set(keys);
26
27
  const parts = [];
27
28
  const snapshot = [];
29
+ const children = new Map();
30
+ const previousChildren = previous?.valid ? previous.children : undefined;
31
+ let unchanged = previous?.valid === true && Array.isArray(previous.snapshot) && previousChildren?.size === length;
28
32
  let allValid = true;
29
33
  for (let index = 0; index < length; index += 1) {
30
34
  const key = String(index);
@@ -33,7 +37,10 @@ function visitArray(value, keys, seen) {
33
37
  if (descriptor === undefined || !descriptor.enumerable || !hasOwn(descriptor, 'value')) {
34
38
  return invalid('descriptor');
35
39
  }
36
- const item = visit(descriptor.value, seen);
40
+ const priorItem = previousChildren?.get(key);
41
+ const item = visit(descriptor.value, seen, priorItem);
42
+ children.set(key, item);
43
+ unchanged = unchanged && item === priorItem;
37
44
  parts.push(item.canonical);
38
45
  if (item.valid) {
39
46
  snapshot.push(item.snapshot);
@@ -41,22 +48,29 @@ function visitArray(value, keys, seen) {
41
48
  allValid = false;
42
49
  }
43
50
  }
51
+ if (allValid && unchanged && previous?.valid) return previous;
44
52
  const canonical = `array:[${parts.join(',')}]`;
45
- return allValid ? valid(Object.freeze(snapshot), canonical) : {
53
+ return allValid ? valid(Object.freeze(snapshot), canonical, children) : {
46
54
  valid: false,
47
55
  canonical
48
56
  };
49
57
  }
50
- function visitObject(value, keys, seen) {
58
+ function visitObject(value, keys, seen, previous) {
51
59
  const snapshot = {};
52
60
  const parts = [];
61
+ const children = new Map();
62
+ const previousChildren = previous?.valid ? previous.children : undefined;
63
+ let unchanged = previous?.valid === true && previous.snapshot !== null && typeof previous.snapshot === 'object' && !Array.isArray(previous.snapshot) && previousChildren?.size === keys.length;
53
64
  let allValid = true;
54
65
  for (const key of [...keys].sort()) {
55
66
  const descriptor = Reflect.getOwnPropertyDescriptor(value, key);
56
67
  if (descriptor === undefined) return invalid('descriptor');
57
68
  if (!descriptor.enumerable) return invalid('non-enumerable');
58
69
  if (!hasOwn(descriptor, 'value')) return invalid('accessor');
59
- const item = visit(descriptor.value, seen);
70
+ const priorItem = previousChildren?.get(key);
71
+ const item = visit(descriptor.value, seen, priorItem);
72
+ children.set(key, item);
73
+ unchanged = unchanged && item === priorItem;
60
74
  parts.push(`${JSON.stringify(key)}:${item.canonical}`);
61
75
  if (item.valid) {
62
76
  Object.defineProperty(snapshot, key, {
@@ -69,8 +83,9 @@ function visitObject(value, keys, seen) {
69
83
  allValid = false;
70
84
  }
71
85
  }
86
+ if (allValid && unchanged && previous?.valid) return previous;
72
87
  const canonical = `object:{${parts.join(',')}}`;
73
- return allValid ? valid(Object.freeze(snapshot), canonical) : {
88
+ return allValid ? valid(Object.freeze(snapshot), canonical, children) : {
74
89
  valid: false,
75
90
  canonical
76
91
  };
@@ -80,7 +95,10 @@ function visitObject(value, keys, seen) {
80
95
  * 只从 own data descriptor 读取一次,绝不执行 getter。snapshot 与 canonical
81
96
  * key 因而来自同一份值;任何 descriptor / Proxy 异常都失败关闭。
82
97
  */
83
- function visit(value, seen) {
98
+ function visit(value, seen, previous) {
99
+ // Objects are always re-read through their descriptors: callers can mutate
100
+ // an existing source or supply a Proxy. Only observed primitive values are reused.
101
+ if ((value === null || typeof value !== 'object') && previous?.valid && Object.is(previous.snapshot, value)) return previous;
84
102
  if (value === undefined) return valid(undefined, 'undefined:');
85
103
  if (value === null) return valid(null, 'null:');
86
104
  switch (typeof value) {
@@ -110,7 +128,7 @@ function visit(value, seen) {
110
128
  }
111
129
  seen.add(value);
112
130
  try {
113
- return isArray ? visitArray(value, keys, seen) : visitObject(value, keys, seen);
131
+ return isArray ? visitArray(value, keys, seen, previous) : visitObject(value, keys, seen, previous);
114
132
  } finally {
115
133
  seen.delete(value);
116
134
  }
@@ -118,9 +136,9 @@ function visit(value, seen) {
118
136
  return invalid('exception');
119
137
  }
120
138
  }
121
- function snapshotValue(value) {
139
+ function snapshotValue(value, previous) {
122
140
  try {
123
- return visit(value, new WeakSet());
141
+ return visit(value, new WeakSet(), previous);
124
142
  } catch {
125
143
  return invalid('exception');
126
144
  }
@@ -174,7 +192,9 @@ function asImageSource(snapshot) {
174
192
  * 与 semantic key。调用方必须把同一返回值里的 source / key 一起交给 attempt。
175
193
  */
176
194
  export function resolveImageSource(source) {
177
- const result = snapshotValue(source);
195
+ return resolveSnapshot(snapshotValue(source));
196
+ }
197
+ function resolveSnapshot(result) {
178
198
  if (!result.valid) return undefined;
179
199
  const snapshot = asImageSource(result.snapshot);
180
200
  if (snapshot === undefined) return undefined;
@@ -183,6 +203,20 @@ export function resolveImageSource(source) {
183
203
  key: `image-source:${result.canonical}`
184
204
  });
185
205
  }
206
+
207
+ /** One resolver belongs to one mounted media component; only its latest tree is kept. */
208
+ export function createImageSourceResolver() {
209
+ let previous;
210
+ let resolved;
211
+ return source => {
212
+ const next = snapshotValue(source, previous);
213
+ if (next !== previous) {
214
+ resolved = resolveSnapshot(next);
215
+ previous = resolved === undefined ? undefined : next;
216
+ }
217
+ return resolved;
218
+ };
219
+ }
186
220
  export function imageSourceKey(source) {
187
221
  return `image-source:${snapshotValue(source).canonical}`;
188
222
  }
@@ -1 +1 @@
1
- {"version":3,"names":["hasOwn","value","key","Object","prototype","hasOwnProperty","call","valid","snapshot","canonical","invalid","kind","visitArray","keys","seen","includes","lengthDescriptor","Reflect","getOwnPropertyDescriptor","undefined","enumerable","Number","isInteger","length","keySet","Set","parts","allValid","index","String","has","descriptor","item","visit","push","join","freeze","visitObject","sort","JSON","stringify","defineProperty","configurable","writable","isFinite","isArray","Array","ownKeys","add","delete","snapshotValue","WeakSet","canonicalSourceValue","URI_STRING_FIELDS","CACHE_POLICIES","isSnapshotObject","isValidHeaders","every","isValidUriSource","uri","trim","field","fieldValue","headers","cache","asImageSource","resolveImageSource","source","result","imageSourceKey","isValidImageSource"],"sourceRoot":"../../../src","sources":["utils/imageSource.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["hasOwn","value","key","Object","prototype","hasOwnProperty","call","valid","snapshot","canonical","children","invalid","kind","visitArray","keys","seen","previous","includes","lengthDescriptor","Reflect","getOwnPropertyDescriptor","undefined","enumerable","Number","isInteger","length","keySet","Set","parts","Map","previousChildren","unchanged","Array","isArray","size","allValid","index","String","has","descriptor","priorItem","get","item","visit","set","push","join","freeze","visitObject","sort","JSON","stringify","defineProperty","configurable","writable","is","isFinite","ownKeys","add","delete","snapshotValue","WeakSet","canonicalSourceValue","URI_STRING_FIELDS","CACHE_POLICIES","isSnapshotObject","isValidHeaders","every","isValidUriSource","uri","trim","field","fieldValue","headers","cache","asImageSource","resolveImageSource","source","resolveSnapshot","result","createImageSourceResolver","resolved","next","imageSourceKey","isValidImageSource"],"sourceRoot":"../../../src","sources":["utils/imageSource.ts"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
- import type { ImageProps, ImageSourcePropType } from 'react-native';
2
+ import type { ImageProps } from 'react-native';
3
+ import type { ResolvedImageSource } from '../../../utils/imageSource';
3
4
  type ImageAttemptProps = Omit<ImageProps, 'onError' | 'source'> & {
4
- source: ImageSourcePropType;
5
+ source: ResolvedImageSource;
5
6
  fallback: React.ReactNode;
6
7
  };
7
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ImageAttempt.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/ImageAttempt.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGpE,KAAK,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG;IAChE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,GAAG,UAAU,EACd,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWvC"}
1
+ {"version":3,"file":"ImageAttempt.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/ImageAttempt.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,KAAK,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC,GAAG;IAChE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,GAAG,UAAU,EACd,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAWvC"}
@@ -1,4 +1,5 @@
1
1
  import type { ImageSourcePropType } from 'react-native';
2
- export declare function selectNativeImageAttemptSource(source: unknown): ImageSourcePropType | undefined;
3
- export declare function selectWebImageAttemptSource(source: unknown): ImageSourcePropType | undefined;
2
+ import type { ResolvedImageSource } from '../../../utils/imageSource';
3
+ export declare function selectNativeImageAttemptSource(resolved: ResolvedImageSource | undefined): ImageSourcePropType | undefined;
4
+ export declare function selectWebImageAttemptSource(resolved: ResolvedImageSource | undefined): ImageSourcePropType | undefined;
4
5
  //# sourceMappingURL=selectImageAttemptSource.shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectImageAttemptSource.shared.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/selectImageAttemptSource.shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGxD,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,OAAO,GACd,mBAAmB,GAAG,SAAS,CAEjC;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,GACd,mBAAmB,GAAG,SAAS,CAKjC"}
1
+ {"version":3,"file":"selectImageAttemptSource.shared.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/selectImageAttemptSource.shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAItE,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GACxC,mBAAmB,GAAG,SAAS,CAEjC;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GACxC,mBAAmB,GAAG,SAAS,CAKjC"}
@@ -0,0 +1,6 @@
1
+ /** Reuse immutable image inputs without retaining a global source cache. */
2
+ export declare function useImageSource(source: unknown): Readonly<{
3
+ source: import("react-native").ImageSourcePropType;
4
+ key: string;
5
+ }> | undefined;
6
+ //# sourceMappingURL=useImageSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useImageSource.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/shared/useImageSource.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO;;;eAG7C"}
@@ -1,5 +1,5 @@
1
1
  import type { ImageSourcePropType } from 'react-native';
2
- type ResolvedImageSource = Readonly<{
2
+ export type ResolvedImageSource = Readonly<{
3
3
  source: ImageSourcePropType;
4
4
  key: string;
5
5
  }>;
@@ -9,6 +9,8 @@ export declare function canonicalSourceValue(value: unknown): string;
9
9
  * 与 semantic key。调用方必须把同一返回值里的 source / key 一起交给 attempt。
10
10
  */
11
11
  export declare function resolveImageSource(source: unknown): ResolvedImageSource | undefined;
12
+ /** One resolver belongs to one mounted media component; only its latest tree is kept. */
13
+ export declare function createImageSourceResolver(): (source: unknown) => ResolvedImageSource | undefined;
12
14
  export declare function imageSourceKey(source: ImageSourcePropType | undefined): string;
13
15
  /**
14
16
  * JS 消费者可能绕过类型系统。只有能安全 snapshot 的 asset id、URI object 或
@@ -16,5 +18,4 @@ export declare function imageSourceKey(source: ImageSourcePropType | undefined):
16
18
  * 一律失败关闭。
17
19
  */
18
20
  export declare function isValidImageSource(source: unknown): source is ImageSourcePropType;
19
- export {};
20
21
  //# sourceMappingURL=imageSource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"imageSource.d.ts","sourceRoot":"","sources":["../../../../src/utils/imageSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA4BxD,KAAK,mBAAmB,GAAG,QAAQ,CAAC;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAAC;AAkKH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE3D;AAyED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,mBAAmB,GAAG,SAAS,CAWjC;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,GAAG,SAAS,GACtC,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,mBAAmB,CAE/B"}
1
+ {"version":3,"file":"imageSource.d.ts","sourceRoot":"","sources":["../../../../src/utils/imageSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA6BxD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC,CAAC;AA6MH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE3D;AAyED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,mBAAmB,GAAG,SAAS,CAEjC;AAgBD,yFAAyF;AACzF,wBAAgB,yBAAyB,KAG/B,QAAQ,OAAO,KAAG,mBAAmB,GAAG,SAAS,CAQ1D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,GAAG,SAAS,GACtC,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,mBAAmB,CAE/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unif/react-native-design",
3
- "version": "0.33.0",
3
+ "version": "0.33.1",
4
4
  "description": "Unif React Native 设计系统:基础组件、主题、字体和图标",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { Text, View } from 'react-native';
3
3
  import { scaleFontMetric, useColors, useFontScale } from '../../../theme';
4
- import { resolveImageSource } from '../../../utils/imageSource';
4
+ import { useImageSource } from '../shared/useImageSource';
5
5
  import { ImageAttempt } from '../shared/ImageAttempt';
6
6
  import { paletteFor, styles } from './styles';
7
7
  import { resolveAvatarBorderRadius, sizingFor } from './geometry';
@@ -27,7 +27,7 @@ export function Avatar({
27
27
  const dims = sizingFor(size);
28
28
  const palette = paletteFor(variant, c);
29
29
  const labelFontSize = scaleFontMetric(dims.fs, fontScale);
30
- const resolvedSource = resolveImageSource(source);
30
+ const resolvedSource = useImageSource(source);
31
31
  const fallback = (
32
32
  <Text
33
33
  style={[styles.label, { fontSize: labelFontSize, color: palette.fg }]}
@@ -58,7 +58,7 @@ export function Avatar({
58
58
  ) : (
59
59
  <ImageAttempt
60
60
  key={resolvedSource.key}
61
- source={resolvedSource.source}
61
+ source={resolvedSource}
62
62
  fallback={fallback}
63
63
  style={styles.image}
64
64
  resizeMode="cover"
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { Text, View } from 'react-native';
3
3
  import { useThemedStyles } from '../../../theme';
4
- import { resolveImageSource } from '../../../utils/imageSource';
4
+ import { useImageSource } from '../shared/useImageSource';
5
5
  import { A11Y_HIDDEN_PROPS } from '../shared/a11y';
6
6
  import { ImageAttempt } from '../shared/ImageAttempt';
7
7
  import { makeStyles } from './styles';
@@ -21,7 +21,7 @@ export function DrawerHeader({
21
21
  const styles = useThemedStyles(makeStyles);
22
22
  // [L-51] 码点级取首字,防 emoji / 代理对被截断为乱码。
23
23
  const initial = [...name.trim()][0] ?? '?';
24
- const resolvedSource = resolveImageSource(source);
24
+ const resolvedSource = useImageSource(source);
25
25
  const fallback = <Text style={styles.avatarText}>{initial}</Text>;
26
26
 
27
27
  return (
@@ -38,7 +38,7 @@ export function DrawerHeader({
38
38
  ) : (
39
39
  <ImageAttempt
40
40
  key={resolvedSource.key}
41
- source={resolvedSource.source}
41
+ source={resolvedSource}
42
42
  fallback={fallback}
43
43
  style={styles.avatarImage}
44
44
  resizeMode="cover"
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect } from 'react';
2
2
  import { StyleSheet, View } from 'react-native';
3
3
  import { useColors, useThemedStyles } from '../../../theme';
4
- import { resolveImageSource } from '../../../utils/imageSource';
4
+ import { useImageSource } from '../shared/useImageSource';
5
5
  import { createLogger } from '../../../utils/logger';
6
6
  import { ImageAttempt } from '../shared/ImageAttempt';
7
7
  import { A11Y_HIDDEN_PROPS } from '../shared/a11y';
@@ -45,7 +45,7 @@ export function Thumbnail(props: ThumbnailProps): React.JSX.Element {
45
45
  ? { uri: uri.trim() }
46
46
  : source
47
47
  : undefined;
48
- const resolvedSource = resolveImageSource(sourceCandidate);
48
+ const resolvedSource = useImageSource(sourceCandidate);
49
49
  const sanitizedImageStyle = sanitizeThumbnailImageStyle(imageStyle);
50
50
  const diagnostics = [
51
51
  ...normalizedDimensions.diagnostics,
@@ -94,7 +94,7 @@ export function Thumbnail(props: ThumbnailProps): React.JSX.Element {
94
94
  <ImageAttempt
95
95
  {...imageAccessibilityProps}
96
96
  key={resolvedSource.key}
97
- source={resolvedSource.source}
97
+ source={resolvedSource}
98
98
  fallback={fallbackContent}
99
99
  style={[sanitizedImageStyle.style, StyleSheet.absoluteFill]}
100
100
  resizeMode={resizeMode}
@@ -1,10 +1,11 @@
1
1
  import React, { useCallback, useState } from 'react';
2
2
  import { Image } from 'react-native';
3
- import type { ImageProps, ImageSourcePropType } from 'react-native';
3
+ import type { ImageProps } from 'react-native';
4
+ import type { ResolvedImageSource } from '../../../utils/imageSource';
4
5
  import { selectImageAttemptSource } from './selectImageAttemptSource';
5
6
 
6
7
  type ImageAttemptProps = Omit<ImageProps, 'onError' | 'source'> & {
7
- source: ImageSourcePropType;
8
+ source: ResolvedImageSource;
8
9
  fallback: React.ReactNode;
9
10
  };
10
11
 
@@ -1,16 +1,18 @@
1
1
  import type { ImageSourcePropType } from 'react-native';
2
- import { isValidImageSource } from '../../../utils/imageSource';
2
+ import type { ResolvedImageSource } from '../../../utils/imageSource';
3
3
 
4
+ // Input validation belongs to the media component's resolver. Its frozen result
5
+ // is safe to select here without reading or serializing the original input again.
4
6
  export function selectNativeImageAttemptSource(
5
- source: unknown
7
+ resolved: ResolvedImageSource | undefined
6
8
  ): ImageSourcePropType | undefined {
7
- return isValidImageSource(source) ? source : undefined;
9
+ return resolved?.source;
8
10
  }
9
11
 
10
12
  export function selectWebImageAttemptSource(
11
- source: unknown
13
+ resolved: ResolvedImageSource | undefined
12
14
  ): ImageSourcePropType | undefined {
13
- if (!isValidImageSource(source)) return undefined;
15
+ const source = resolved?.source;
14
16
 
15
17
  // RNW 0.21 不解析 native 的 candidate 数组;Web 明确使用第一候选项。
16
18
  return Array.isArray(source) ? source[0] : source;
@@ -0,0 +1,8 @@
1
+ import { useMemo } from 'react';
2
+ import { createImageSourceResolver } from '../../../utils/imageSource';
3
+
4
+ /** Reuse immutable image inputs without retaining a global source cache. */
5
+ export function useImageSource(source: unknown) {
6
+ const resolve = useMemo(createImageSourceResolver, []);
7
+ return resolve(source);
8
+ }
@@ -20,13 +20,14 @@ type SnapshotResult =
20
20
  valid: true;
21
21
  snapshot: SnapshotValue;
22
22
  canonical: string;
23
+ children?: ReadonlyMap<string, SnapshotResult>;
23
24
  }
24
25
  | {
25
26
  valid: false;
26
27
  canonical: string;
27
28
  };
28
29
 
29
- type ResolvedImageSource = Readonly<{
30
+ export type ResolvedImageSource = Readonly<{
30
31
  source: ImageSourcePropType;
31
32
  key: string;
32
33
  }>;
@@ -34,8 +35,12 @@ type ResolvedImageSource = Readonly<{
34
35
  const hasOwn = (value: object, key: PropertyKey): boolean =>
35
36
  Object.prototype.hasOwnProperty.call(value, key);
36
37
 
37
- function valid(snapshot: SnapshotValue, canonical: string): SnapshotResult {
38
- return { valid: true, snapshot, canonical };
38
+ function valid(
39
+ snapshot: SnapshotValue,
40
+ canonical: string,
41
+ children?: ReadonlyMap<string, SnapshotResult>
42
+ ): SnapshotResult {
43
+ return { valid: true, snapshot, canonical, children };
39
44
  }
40
45
 
41
46
  function invalid(kind: string): SnapshotResult {
@@ -45,7 +50,8 @@ function invalid(kind: string): SnapshotResult {
45
50
  function visitArray(
46
51
  value: object,
47
52
  keys: readonly string[],
48
- seen: WeakSet<object>
53
+ seen: WeakSet<object>,
54
+ previous?: SnapshotResult
49
55
  ): SnapshotResult {
50
56
  if (!keys.includes('length')) return invalid('descriptor');
51
57
 
@@ -67,6 +73,12 @@ function visitArray(
67
73
  const keySet = new Set(keys);
68
74
  const parts: string[] = [];
69
75
  const snapshot: SnapshotValue[] = [];
76
+ const children = new Map<string, SnapshotResult>();
77
+ const previousChildren = previous?.valid ? previous.children : undefined;
78
+ let unchanged =
79
+ previous?.valid === true &&
80
+ Array.isArray(previous.snapshot) &&
81
+ previousChildren?.size === length;
70
82
  let allValid = true;
71
83
 
72
84
  for (let index = 0; index < length; index += 1) {
@@ -82,7 +94,10 @@ function visitArray(
82
94
  return invalid('descriptor');
83
95
  }
84
96
 
85
- const item = visit(descriptor.value, seen);
97
+ const priorItem = previousChildren?.get(key);
98
+ const item = visit(descriptor.value, seen, priorItem);
99
+ children.set(key, item);
100
+ unchanged = unchanged && item === priorItem;
86
101
  parts.push(item.canonical);
87
102
  if (item.valid) {
88
103
  snapshot.push(item.snapshot);
@@ -91,19 +106,29 @@ function visitArray(
91
106
  }
92
107
  }
93
108
 
109
+ if (allValid && unchanged && previous?.valid) return previous;
94
110
  const canonical = `array:[${parts.join(',')}]`;
95
111
  return allValid
96
- ? valid(Object.freeze(snapshot), canonical)
112
+ ? valid(Object.freeze(snapshot), canonical, children)
97
113
  : { valid: false, canonical };
98
114
  }
99
115
 
100
116
  function visitObject(
101
117
  value: object,
102
118
  keys: readonly string[],
103
- seen: WeakSet<object>
119
+ seen: WeakSet<object>,
120
+ previous?: SnapshotResult
104
121
  ): SnapshotResult {
105
122
  const snapshot: Record<string, SnapshotValue> = {};
106
123
  const parts: string[] = [];
124
+ const children = new Map<string, SnapshotResult>();
125
+ const previousChildren = previous?.valid ? previous.children : undefined;
126
+ let unchanged =
127
+ previous?.valid === true &&
128
+ previous.snapshot !== null &&
129
+ typeof previous.snapshot === 'object' &&
130
+ !Array.isArray(previous.snapshot) &&
131
+ previousChildren?.size === keys.length;
107
132
  let allValid = true;
108
133
 
109
134
  for (const key of [...keys].sort()) {
@@ -112,7 +137,10 @@ function visitObject(
112
137
  if (!descriptor.enumerable) return invalid('non-enumerable');
113
138
  if (!hasOwn(descriptor, 'value')) return invalid('accessor');
114
139
 
115
- const item = visit(descriptor.value, seen);
140
+ const priorItem = previousChildren?.get(key);
141
+ const item = visit(descriptor.value, seen, priorItem);
142
+ children.set(key, item);
143
+ unchanged = unchanged && item === priorItem;
116
144
  parts.push(`${JSON.stringify(key)}:${item.canonical}`);
117
145
  if (item.valid) {
118
146
  Object.defineProperty(snapshot, key, {
@@ -126,9 +154,10 @@ function visitObject(
126
154
  }
127
155
  }
128
156
 
157
+ if (allValid && unchanged && previous?.valid) return previous;
129
158
  const canonical = `object:{${parts.join(',')}}`;
130
159
  return allValid
131
- ? valid(Object.freeze(snapshot), canonical)
160
+ ? valid(Object.freeze(snapshot), canonical, children)
132
161
  : { valid: false, canonical };
133
162
  }
134
163
 
@@ -136,7 +165,19 @@ function visitObject(
136
165
  * 只从 own data descriptor 读取一次,绝不执行 getter。snapshot 与 canonical
137
166
  * key 因而来自同一份值;任何 descriptor / Proxy 异常都失败关闭。
138
167
  */
139
- function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
168
+ function visit(
169
+ value: unknown,
170
+ seen: WeakSet<object>,
171
+ previous?: SnapshotResult
172
+ ): SnapshotResult {
173
+ // Objects are always re-read through their descriptors: callers can mutate
174
+ // an existing source or supply a Proxy. Only observed primitive values are reused.
175
+ if (
176
+ (value === null || typeof value !== 'object') &&
177
+ previous?.valid &&
178
+ Object.is(previous.snapshot, value)
179
+ )
180
+ return previous;
140
181
  if (value === undefined) return valid(undefined, 'undefined:');
141
182
  if (value === null) return valid(null, 'null:');
142
183
 
@@ -173,8 +214,8 @@ function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
173
214
  seen.add(value);
174
215
  try {
175
216
  return isArray
176
- ? visitArray(value, keys, seen)
177
- : visitObject(value, keys, seen);
217
+ ? visitArray(value, keys, seen, previous)
218
+ : visitObject(value, keys, seen, previous);
178
219
  } finally {
179
220
  seen.delete(value);
180
221
  }
@@ -183,9 +224,12 @@ function visit(value: unknown, seen: WeakSet<object>): SnapshotResult {
183
224
  }
184
225
  }
185
226
 
186
- function snapshotValue(value: unknown): SnapshotResult {
227
+ function snapshotValue(
228
+ value: unknown,
229
+ previous?: SnapshotResult
230
+ ): SnapshotResult {
187
231
  try {
188
- return visit(value, new WeakSet<object>());
232
+ return visit(value, new WeakSet<object>(), previous);
189
233
  } catch {
190
234
  return invalid('exception');
191
235
  }
@@ -273,7 +317,12 @@ function asImageSource(
273
317
  export function resolveImageSource(
274
318
  source: unknown
275
319
  ): ResolvedImageSource | undefined {
276
- const result = snapshotValue(source);
320
+ return resolveSnapshot(snapshotValue(source));
321
+ }
322
+
323
+ function resolveSnapshot(
324
+ result: SnapshotResult
325
+ ): ResolvedImageSource | undefined {
277
326
  if (!result.valid) return undefined;
278
327
 
279
328
  const snapshot = asImageSource(result.snapshot);
@@ -285,6 +334,20 @@ export function resolveImageSource(
285
334
  });
286
335
  }
287
336
 
337
+ /** One resolver belongs to one mounted media component; only its latest tree is kept. */
338
+ export function createImageSourceResolver() {
339
+ let previous: SnapshotResult | undefined;
340
+ let resolved: ResolvedImageSource | undefined;
341
+ return (source: unknown): ResolvedImageSource | undefined => {
342
+ const next = snapshotValue(source, previous);
343
+ if (next !== previous) {
344
+ resolved = resolveSnapshot(next);
345
+ previous = resolved === undefined ? undefined : next;
346
+ }
347
+ return resolved;
348
+ };
349
+ }
350
+
288
351
  export function imageSourceKey(
289
352
  source: ImageSourcePropType | undefined
290
353
  ): string {