-
Notifications
You must be signed in to change notification settings - Fork 280
Expand file tree
/
Copy pathindex.js
More file actions
80 lines (71 loc) · 1.95 KB
/
Copy pathindex.js
File metadata and controls
80 lines (71 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import buildIChefUrl from '#lib/utilities/ichefURL';
const DEFAULT_RESOLUTIONS = [240, 320, 480, 624, 800];
export const getMimeType = srcset => {
if (!srcset || typeof srcset !== 'string') return null;
const [firstSrcset] = srcset.split(',');
const [firstSrcsetUrl] = firstSrcset.split(' ');
const urlFileExtension = firstSrcsetUrl.split('.').pop();
switch (urlFileExtension) {
case 'webp':
return 'image/webp';
case 'jpg':
case 'jpeg':
return 'image/jpeg';
case 'png':
return 'image/png';
case 'gif':
return 'image/gif';
default:
return null;
}
};
export const createSrcsets = ({
originCode,
locator,
originalImageWidth,
imageResolutions = DEFAULT_RESOLUTIONS,
}) => {
if (originCode === 'pips') {
return { primarySrcset: undefined, fallbackSrcset: undefined };
}
const requiredResolutions = imageResolutions.filter(
resolution => resolution <= originalImageWidth,
);
if (
originalImageWidth < imageResolutions[imageResolutions.length - 1] &&
!requiredResolutions.includes(originalImageWidth)
) {
requiredResolutions.push(originalImageWidth);
}
// eslint-disable-next-line prefer-const
let [primarySrcset, fallbackSrcset] = [true, false].map(() =>
requiredResolutions
.map(
resolution =>
`${buildIChefUrl({
originCode,
locator,
resolution,
})} ${resolution}w`,
)
.join(', '),
);
fallbackSrcset = fallbackSrcset.replaceAll('.webp', '');
return {
primarySrcset,
primaryMimeType: getMimeType(primarySrcset),
fallbackSrcset,
fallbackMimeType: getMimeType(fallbackSrcset),
};
};
export const getPlaceholderSrcSet = ({ originCode, locator }) => {
if (!originCode || !locator) return '';
return DEFAULT_RESOLUTIONS.map(
resolution =>
`${buildIChefUrl({
originCode,
locator,
resolution,
})} ${resolution}w`,
).join(', ');
};