evanw / evanw/node-source-map-support

supportRelativeURL bombs when Node "path" object is not present

Offen
#197 3 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
JavaScript
Sterne
2.2k
Forks
223
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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?).

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginne bei supportRelativeURL und mapSourcePosition, wo das Issue Fehler meldet, wenn das Node path object oder dessen Methoden nicht verfügbar sind. Vergleiche diese Behandlung mit den vorhandenen fs-Prüfungen und ermittle, ob die beabsichtigte Lösung robustes Verhalten oder eine README-Dokumentation ist; als erledigt gilt die Aufgabe, wenn die gemeldete Unreal-style-Umgebung nicht mehr fehlschlägt oder ihre Anforderungen eindeutig dokumentiert sind.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.