@visulima/source-map
Version:
Provides functionality related to source maps.
60 lines (57 loc) • 2.34 kB
JavaScript
import { readFileSync } from 'node:fs';
import { AnyMap } from '@jridgewell/trace-mapping';
import { toNamespacedPath, dirname, resolve } from '@visulima/path';
var __defProp = Object.defineProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
const INLINE_SOURCEMAP_REGEX = /^data:application\/json[^,]+base64,/;
const SOURCEMAP_REGEX = /\/\/[@#][ \t]+sourceMappingURL=([^\s'"]+)[ \t]*$|\/\*[@#][ \t]+sourceMappingURL=([^*]+?)[ \t]*\*\/[ \t]*$/;
const isInlineMap = /* @__PURE__ */ __name((url) => INLINE_SOURCEMAP_REGEX.test(url), "isInlineMap");
const resolveSourceMapUrl = /* @__PURE__ */ __name((sourceFile, sourcePath) => {
const lines = sourceFile.split(/\r?\n/);
let sourceMapUrl = null;
for (let index = lines.length - 1; index >= 0 && !sourceMapUrl; index--) {
sourceMapUrl = SOURCEMAP_REGEX.exec(lines[index]);
}
if (!sourceMapUrl) {
return void 0;
}
return isInlineMap(sourceMapUrl[1]) ? sourceMapUrl[1] : resolve(sourcePath, sourceMapUrl[1]);
}, "resolveSourceMapUrl");
const decodeInlineMap = /* @__PURE__ */ __name((data) => {
const rawData = data.slice(data.indexOf(",") + 1);
return Buffer.from(rawData, "base64").toString();
}, "decodeInlineMap");
const loadSourceMap = /* @__PURE__ */ __name((filename) => {
let sourceMapContent;
try {
sourceMapContent = readFileSync(filename, { encoding: "utf8" });
} catch (error) {
error.message = `Error reading sourcemap for file "${toNamespacedPath(filename)}":
${toNamespacedPath(error.message)}`;
throw error;
}
const sourceMapUrl = resolveSourceMapUrl(sourceMapContent, dirname(filename));
if (!sourceMapUrl) {
return void 0;
}
let traceMapContent;
if (isInlineMap(sourceMapUrl)) {
traceMapContent = decodeInlineMap(sourceMapUrl);
} else {
try {
traceMapContent = readFileSync(sourceMapUrl, { encoding: "utf8" });
} catch (error) {
error.message = `Error reading sourcemap for file "${toNamespacedPath(filename)}":
${toNamespacedPath(error.message)}`;
throw error;
}
}
try {
return new AnyMap(traceMapContent, sourceMapUrl);
} catch (error) {
error.message = `Error parsing sourcemap for file "${toNamespacedPath(filename)}":
${error.message}`;
throw error;
}
}, "loadSourceMap");
export { loadSourceMap as default };