Description
Problem
Spinning off from #48740 (comment), many of our APIs such as fs.readFile
accept URL instances (what you get from new URL
) but not URL strings (like import.meta.url
, or the return value of the soon-to-be-unflagged import.meta.resolve
). In the case of many (all?) of these, all strings are interpreted as paths. This is frustrating since in ESM, we have easy access to URL strings such as import.meta.url
but path strings require using helpers such as fileURLToPath
.
Original Idea
Please see discussion in the full thread below; while this first idea kicked us off, we’re still brainstorming other solutions. If/when we reach a consensus on ideas that seem worth implementing, I’ll update this top post with a summary.
Wherever feasible, all Node.js APIs that can accept URL strings should do so. In particular this is most relevant to the fs
APIs, especially the ones that already accept URL instances. To avoid ambiguity with path strings, such APIs should only interpret URL strings that begin with file:
.
I presume that this would be a semver-major change, to avoid needing to first check for the existence of a file or folder named file:
in the local path; or perhaps we could add such a check now in order to land this and backport it, and remove such a check in a semver major.
We would also need to consider the security implications. Per @aduh95:
the fact is that
readFile('file:///etc/passwd')
currently throws (unless there is a local folder namedfile:
, but that’s unlikely), it would concern me if we were to release a new version of node where it no longer throws.
I don’t really see how this is a security concern, but I concede that there might be issues to consider. Perhaps some can be addressed via permissions or policies. I do feel however that since URL strings are so prevalent in ESM, we should require a high bar for security concerns to outweigh usability for this feature.
cc @nodejs/loaders @nodejs/modules @nodejs/security