@sentry/remix
Version:
Official Sentry SDK for Remix
44 lines (41 loc) • 1.7 kB
JavaScript
import * as fs from 'node:fs';
import * as path from 'node:path';
import { UNSTAMPED_FETCH } from './assetServer.js';
import { findDebugId, addDebugIdToSourceMap } from './debugId.js';
async function emitAssets(options) {
const { assets, entries, outDir } = options;
const fetchMap = assets[UNSTAMPED_FETCH] ?? ((request) => assets.fetch(request));
const emitted = [];
for (const url of await assets.getPreloads([...entries])) {
const response = await assets.fetch(new Request(`http://asset-server${url}`));
if (response?.status !== 200) {
continue;
}
const source = await response.text();
const debugId = findDebugId(source);
const file = path.join(outDir, toRelativePath(url));
fs.mkdirSync(path.dirname(file), { recursive: true });
fs.writeFileSync(file, source);
const asset = { url, file, debugId };
const mapResponse = await fetchMap(new Request(`http://asset-server${toMapUrl(url)}`));
if (mapResponse?.status === 200) {
const map = await mapResponse.text();
asset.mapFile = `${file}.map`;
fs.writeFileSync(asset.mapFile, debugId ? addDebugIdToSourceMap(map, debugId) : map);
}
emitted.push(asset);
}
return emitted;
}
function toMapUrl(url) {
const queryIndex = url.indexOf("?");
return queryIndex === -1 ? `${url}.map` : `${url.slice(0, queryIndex)}.map${url.slice(queryIndex)}`;
}
function toRelativePath(url) {
const pathname = url.split("?")[0] ?? url;
return path.join(
...pathname.replace(/^\//, "").split("/").map((segment) => decodeURIComponent(segment).replace(/[/\\]/g, "_")).filter((segment) => segment !== "..")
);
}
export { emitAssets };
//# sourceMappingURL=emitAssets.js.map