@nuxt/image
Version:
Nuxt Image Module
80 lines (79 loc) • 2.55 kB
JavaScript
export function createMapper(map) {
return ((key) => key !== void 0 ? map[key] || key : map.missingValue);
}
export function createOperationsGenerator(config = {}) {
const formatter = config.formatter;
const keyMap = config.keyMap && typeof config.keyMap !== "function" ? createMapper(config.keyMap) : config.keyMap;
const map = {};
for (const key in config.valueMap) {
const valueKey = key;
const value = config.valueMap[valueKey];
map[valueKey] = typeof value === "object" ? createMapper(value) : value;
}
return (modifiers) => {
const operations = [];
for (const _key in modifiers) {
const key = _key;
if (typeof modifiers[key] === "undefined") {
continue;
}
const value = typeof map[key] === "function" ? map[key](modifiers[key]) : modifiers[key];
operations.push([keyMap ? keyMap(key) : key, value]);
}
if (formatter) {
return operations.map((entry) => formatter(...entry)).join(config.joinWith ?? "&");
}
return new URLSearchParams(operations).toString();
};
}
export function parseDensities(input = "") {
if (input === void 0 || !input.length) {
return [];
}
const densities = /* @__PURE__ */ new Set();
for (const density of input.split(" ")) {
const d = Number.parseInt(density.replace("x", ""));
if (d) {
densities.add(d);
}
}
return Array.from(densities);
}
export function checkDensities(densities) {
if (densities.length === 0) {
throw new Error("`densities` must not be empty, configure to `1` to render regular size only (DPR 1.0)");
}
if (import.meta.dev && Array.from(densities).some((d) => d > 2)) {
const _densities = densities;
if (!_densities._warned) {
console.warn("[nuxt] [image] Density values above `2` are not recommended. See https://observablehq.com/@eeeps/visual-acuity-and-device-pixel-ratio.");
}
_densities._warned = true;
}
}
export function parseSize(input = "") {
if (typeof input === "number") {
return input;
}
if (typeof input === "string") {
if (input.replace("px", "").match(/^\d+$/g)) {
return Number.parseInt(input, 10);
}
}
}
export function parseSizes(input) {
const sizes = {};
if (typeof input === "string") {
for (const entry of input.split(/[\s,]+/).filter((e) => e)) {
const s = entry.split(":");
if (s.length !== 2) {
sizes["1px"] = s[0].trim();
} else {
sizes[s[0].trim()] = s[1].trim();
}
}
} else {
Object.assign(sizes, input);
}
return sizes;
}