astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
30 lines (29 loc) • 1.6 kB
JavaScript
import { fileExtension, joinPaths, prependForwardSlash, removeBase } from "@astrojs/internal-helpers/path";
import { getAssetsPrefix } from "./getAssetsPrefix.js";
import { hashTransform, propsToFilename } from "./hash.js";
import { isESMImportedImage } from "./imageKind.js";
import { createPlaceholderURL, stringifyPlaceholderURL } from "./url.js";
// Must stay deterministic: each runtime resolves images on its own and the build dedupes by hash.
export function resolveStaticImage(options, hashProperties, originalFSPath, config) {
const ESMImportedImageSrc = isESMImportedImage(options.src) ? options.src.src : options.src;
const assetPrefix = getAssetsPrefix(fileExtension(ESMImportedImageSrc), config.assetsPrefix);
const finalOriginalPath = removeBase(removeBase(ESMImportedImageSrc, config.base), assetPrefix);
const hash = hashTransform(options, config.serviceEntrypoint, hashProperties);
const finalFilePath = prependForwardSlash(joinPaths(isESMImportedImage(options.src) ? "" : config.assetsDir, prependForwardSlash(propsToFilename(finalOriginalPath, options, hash))));
const url = createPlaceholderURL(config.assetsPrefix ? encodeURI(joinPaths(assetPrefix, finalFilePath)) : encodeURI(prependForwardSlash(joinPaths(config.base, finalFilePath))));
if (config.assetQueryParams) {
config.assetQueryParams.forEach((value, key) => {
url.searchParams.set(key, value);
});
}
return {
url: stringifyPlaceholderURL(url),
image: {
originalPath: finalOriginalPath,
hash,
finalPath: finalFilePath,
originalSrcPath: originalFSPath,
transform: options
}
};
}