evanw / evanw/node-source-map-support

supportRelativeURL bombs when Node "path" object is not present

Open
#197 3 comments 1 reaction 0 assignees View on GitHub
Dominant language
JavaScript
Stars
2.2k
Forks
223
PR merge metrics
No merged PRs in 30d

Description

I am attempting to use source-map-support with a platform where v8 is embedded directly into an application, which is not Node or a browser ([it's a plugin for the Unreal game engine](https://github.com/ncsoft/Unreal.js/blob/master/README.md)). I do not know if this is a use case you support, but source-map-support **does** have many options that seem intended for making it work in unusual environments.

The Unreal environment does not have full `fs` or `path` objects (both are available through require, but return empty objects). It does have a dedicated function for loading a file into a string from disk. I am currently running this:

require('source-map-support').install({overrideRetrieveSourceMap: true, retrieveSourceMap: function(source:string) {
if (!source.startsWith("file:///")) { return null }
let name = decodeURIComponent(source.substr(8)) + ".map"
let result = JavascriptLibrary.ReadStringFromFile(null, name)
if (!result) { return null }
return { url: source, map: result }
}
})

This works **except** for the `supportRelativeURL` function, which calls both `path.dirname` and `path.resolve` without checking. In my testing, source-map-support fails 100% because `supportRelativeURL` gets called by `mapSourcePosition`. (`mapSourcePosition` actually calls `supportRelativeURL` twice. In my testing, the second one is the only one that is triggering, comment "Only return the original position if a matching line was found…". As a side note though the first call is interesting, since in cases where it does trigger, it seems to only be about maintaining the `fileContentsCache`. However if the user is using `overrideRetrieveSourceMap`— which I am— the `fileContentsCache` is unused, so this clause is useless work…).

If I replace the contents of `supportRelativeURL` with `return url`, source-map-support overall works great.

I am not completely sure how to proceed here. I could potentially add the missing `path` methods to the environment (although `path.resolve` concerns me since that involves per-OS support to do properly). It does seem too bad though that source-map-support **almost** allows me to configure it into no dependence on the filesystem, then falls down in this one function.

I think my **expected behavior** is that source-map-support should check for the presence of the methods on `path` it needs, and be resistant to `path` being null, since after all it already goes to the bother of doing this with `fs`. If this is not practical, it might help for people in unusual situations to document in the README that the `path`, `path.dirname` and `path.resolve` objects are required (how is it requiring "path" works in the browser, anyway?).

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.