UNPKG

@nuxt/image

Version:

Nuxt Image Module

80 lines (79 loc) 2.55 kB
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; }