| Server IP : 159.203.156.69 / Your IP : 216.73.216.28 Web Server : nginx/1.24.0 System : Linux main-ubuntu 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64 User : root ( 0) PHP Version : 8.3.6 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/tanviranik.com/node_modules/unpic/script/src/providers/ |
Upload File : |
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.transform = exports.generate = exports.extract = void 0;
const utils_js_1 = require("../utils.js");
const storyBlokAssets = /(?<id>\/f\/\d+\/\d+x\d+\/\w+\/[^\/]+)\/?(?<modifiers>m\/?(?<crop>\d+x\d+:\d+x\d+)?\/?(?<resize>(?<flipx>\-)?(?<width>\d+)x(?<flipy>\-)?(?<height>\d+))?\/?(filters\:(?<filters>[^\/]+))?)?$/;
const storyBlokImg2 = /^(?<modifiers>\/(?<crop>\d+x\d+:\d+x\d+)?\/?(?<resize>(?<flipx>\-)?(?<width>\d+)x(?<flipy>\-)?(?<height>\d+))?\/?(filters\:(?<filters>[^\/]+))?\/?)?(?<id>\/f\/.+)$/;
// This regex selects every colon(:) that is not inside parentheses. So that focal(150x150:250x250) is not split into two filters.
const filterSplitterRegex = /:(?![^(]*\))/;
const splitFilters = (filters) => {
if (!filters) {
return {};
}
return Object.fromEntries(filters.split(filterSplitterRegex).map((filter) => {
if (!filter)
return [];
const [key, value] = filter.split("(");
return [key, value.replace(")", "")];
}));
};
const generateFilters = (filters) => {
if (!filters) {
return undefined;
}
const filterItems = Object.entries(filters).map(([key, value]) => `${key}(${value ?? ""})`);
if (filterItems.length === 0) {
return undefined;
}
return `filters:${filterItems.join(":")}`;
};
const extract = (url) => {
const parsedUrl = (0, utils_js_1.toUrl)(url);
const regex = parsedUrl.hostname === "img2.storyblok.com"
? storyBlokImg2
: storyBlokAssets;
const matches = regex.exec(parsedUrl.pathname);
if (!matches || !matches.groups) {
return null;
}
const { id, crop, width, height, filters, flipx, flipy } = matches.groups;
const { format, ...filterMap } = splitFilters(filters ?? "");
// We update old img2.storyblok.com URLs to use the new syntax and domain
if (parsedUrl.hostname === "img2.storyblok.com") {
parsedUrl.hostname = "a.storyblok.com";
}
const operations = Object.fromEntries([
["width", Number(width) || undefined],
["height", Number(height) || undefined],
["format", format],
["crop", crop],
["filters", filterMap],
["flipx", flipx],
["flipy", flipy],
].filter(([_, value]) => value !== undefined));
return {
src: `${parsedUrl.origin}${id}`,
operations,
};
};
exports.extract = extract;
const generate = (src, operations) => {
const url = (0, utils_js_1.toUrl)(src);
const { width = 0, height = 0, format, crop, filters = {}, flipx = "", flipy = "", } = operations;
const size = `${flipx}${width}x${flipy}${height}`;
if (format) {
filters.format = format;
}
const parts = [
url.pathname,
"m",
crop,
size,
generateFilters(filters),
].filter(Boolean);
url.pathname = parts.join("/");
return (0, utils_js_1.toCanonicalUrlString)(url);
};
exports.generate = generate;
exports.transform = (0, utils_js_1.createExtractAndGenerate)(exports.extract, exports.generate);