import { AstroError, AstroErrorData } from "../core/errors/index.js"; import { DEFAULT_HASH_PROPS } from "./consts.js"; import { isLocalService } from "./services/service.js"; import { isESMImportedImage, isRemoteImage } from "./utils/imageKind.js"; async function getConfiguredImageService() { if (!globalThis?.astroAsset?.imageService) { const { default: service } = await import( // @ts-expect-error "virtual:image-service" ).catch((e) => { const error = new AstroError(AstroErrorData.InvalidImageService); error.cause = e; throw error; }); if (!globalThis.astroAsset) globalThis.astroAsset = {}; globalThis.astroAsset.imageService = service; return service; } return globalThis.astroAsset.imageService; } async function getImage(options, imageConfig) { if (!options || typeof options !== "object") { throw new AstroError({ ...AstroErrorData.ExpectedImageOptions, message: AstroErrorData.ExpectedImageOptions.message(JSON.stringify(options)) }); } if (typeof options.src === "undefined") { throw new AstroError({ ...AstroErrorData.ExpectedImage, message: AstroErrorData.ExpectedImage.message( options.src, "undefined", JSON.stringify(options) ) }); } const service = await getConfiguredImageService(); const resolvedOptions = { ...options, src: typeof options.src === "object" && "then" in options.src ? (await options.src).default ?? await options.src : options.src }; const originalPath = isESMImportedImage(resolvedOptions.src) ? resolvedOptions.src.fsPath : resolvedOptions.src; const clonedSrc = isESMImportedImage(resolvedOptions.src) ? ( // @ts-expect-error - clone is a private, hidden prop resolvedOptions.src.clone ?? resolvedOptions.src ) : resolvedOptions.src; resolvedOptions.src = clonedSrc; const validatedOptions = service.validateOptions ? await service.validateOptions(resolvedOptions, imageConfig) : resolvedOptions; const srcSetTransforms = service.getSrcSet ? await service.getSrcSet(validatedOptions, imageConfig) : []; let imageURL = await service.getURL(validatedOptions, imageConfig); let srcSets = await Promise.all( srcSetTransforms.map(async (srcSet) => ({ transform: srcSet.transform, url: await service.getURL(srcSet.transform, imageConfig), descriptor: srcSet.descriptor, attributes: srcSet.attributes })) ); if (isLocalService(service) && globalThis.astroAsset.addStaticImage && !(isRemoteImage(validatedOptions.src) && imageURL === validatedOptions.src)) { const propsToHash = service.propertiesToHash ?? DEFAULT_HASH_PROPS; imageURL = globalThis.astroAsset.addStaticImage(validatedOptions, propsToHash, originalPath); srcSets = srcSetTransforms.map((srcSet) => ({ transform: srcSet.transform, url: globalThis.astroAsset.addStaticImage(srcSet.transform, propsToHash, originalPath), descriptor: srcSet.descriptor, attributes: srcSet.attributes })); } return { rawOptions: resolvedOptions, options: validatedOptions, src: imageURL, srcSet: { values: srcSets, attribute: srcSets.map((srcSet) => `${srcSet.url} ${srcSet.descriptor}`).join(", ") }, attributes: service.getHTMLAttributes !== void 0 ? await service.getHTMLAttributes(validatedOptions, imageConfig) : {} }; } export { getConfiguredImageService, getImage };