UNPKG

@visulima/source-map

Version:

Provides functionality related to source maps.

60 lines (57 loc) 2.34 kB
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 };