38 lines
1.2 KiB
JavaScript
38 lines
1.2 KiB
JavaScript
![]() |
import fs from "node:fs";
|
||
|
import path from "node:path";
|
||
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
||
|
import { prependForwardSlash, slash } from "../../core/path.js";
|
||
|
import { imageMetadata } from "./metadata.js";
|
||
|
async function emitESMImage(id, watchMode, fileEmitter) {
|
||
|
if (!id) {
|
||
|
return void 0;
|
||
|
}
|
||
|
const url = pathToFileURL(id);
|
||
|
const meta = await imageMetadata(url);
|
||
|
if (!meta) {
|
||
|
return void 0;
|
||
|
}
|
||
|
if (!watchMode) {
|
||
|
const pathname = decodeURI(url.pathname);
|
||
|
const filename = path.basename(pathname, path.extname(pathname) + `.${meta.format}`);
|
||
|
const handle = fileEmitter({
|
||
|
name: filename,
|
||
|
source: await fs.promises.readFile(url),
|
||
|
type: "asset"
|
||
|
});
|
||
|
meta.src = `__ASTRO_ASSET_IMAGE__${handle}__`;
|
||
|
} else {
|
||
|
url.searchParams.append("origWidth", meta.width.toString());
|
||
|
url.searchParams.append("origHeight", meta.height.toString());
|
||
|
url.searchParams.append("origFormat", meta.format);
|
||
|
meta.src = `/@fs` + prependForwardSlash(fileURLToNormalizedPath(url));
|
||
|
}
|
||
|
return meta;
|
||
|
}
|
||
|
function fileURLToNormalizedPath(filePath) {
|
||
|
return slash(fileURLToPath(filePath) + filePath.search).replace(/\\/g, "/");
|
||
|
}
|
||
|
export {
|
||
|
emitESMImage
|
||
|
};
|