URL version of `process.cwd()`
What is the problem this feature will solve?
Right now we don't have convenient way to get current working directory in URL form such as file:///path/to/current/working/directory/
.
Having easy access to this form would allow to resolve local paths using WHATWG URL constructor, i.e. new URL('../path/to/file', cwdURL)
, without need to import path
and worry about platform-specific separators.
Getting this form in userspace is not very convenient:
// results in URL without trailing slash, indicating that it's directory and allowing to use it directly as baseURL
const cwdURL = url.pathToFileURL(process.cwd());
// appending pathname suffix to full href is semantically wrong
const cwdURL = url.pathToFileURL(process.cwd()).href + '/';
// triggers pathname setter which requires reparsing URL again
const cwdURL = url.pathToFileURL(process.cwd());
cwdURL.pathname += '/';
// three imports for one value, including `path` which we may want to avoid
const cwdURL = url.pathToFileURL(process.cwd() + path.sep);
// very bad for multiple reasons but tempting enough to appear in the wild :(
const cwdURL = `file://${process.cwd()}/`;
What is the feature you are proposing to solve the problem?
-
support URL
instances withfile:
protocol inprocess.chdir(directory)
. -
add process.cwdURL()
that returnsURL
instance or string. -
add resolve(...urls)
method that would construct new absolute URL on top of cwd if all providedurls
are relative.url.resolve()
is not vacant and has different behaviour, so it should have different name or place.
Better naming suggestions are very welcome.
What alternatives have you considered?
- userland module.
- adjustments to parsing URLs with
file:
protocol that would resolve relativepathname
against cwd instead of root, i.e.:
// current behaviour
new URL('file:./file.txt').href === 'file:///file.txt'
// proposed behaviour
new URL('file:./file.txt').href === 'file:///path/to/current/working/directory/file.txt'