Expanding / Resolving ~ in node.js
I am new to nodejs. Can node resolve ~ (unix home directory) example ~foo, ~bar to /home/foo, /home/bar
> path.normalize('~mvaidya') '~mvaidya' > path.resolve('~mvaidya') '/home/mvaidya/~mvaidya' >
This response is wrong; I am hoping that ~mvaidya must resolve to /home/mvaidya
Solution 1:
As QZ Support noted, you can use process.env.HOME
on OSX/Linux. Here's a simple function with no dependencies.
const path = require('path');
function resolveHome(filepath) {
if (filepath[0] === '~') {
return path.join(process.env.HOME, filepath.slice(1));
}
return filepath;
}
Solution 2:
The reason this is not in Node is because ~
expansion is a bash
(or shell) specific thing. It is unclear how to escape it properly. See this comment for details.
There are various libraries offering this, most just a few lines of code...
https://npm.im/untildify ; doesn't do much more than
os.homedir()
, see index.js#L10https://npm.im/expand-tilde ; basically uses
os-homedir
to achieve the same, see index.js#L12https://npm.im/tilde-expansion ; this uses
etc-passwd
so doesn't seem very cross platform, see index.js#L21
So you probably want to do this yourself.
Solution 3:
This NodeJS library supports this feature via an async callback. It uses the etc-passswd lib to perform the expansion so is probably not portable to Windows or other non Unix/Linux platforms.
- https://www.npmjs.org/package/tilde-expansion
- https://github.com/bahamas10/node-tilde-expansion
If you only want to expand the home page for the current user then this lighter weight API may be all you need. It's also synchronous so simpler to use and works on most platforms.
- https://www.npmjs.org/package/expand-home-dir
Examples:
expandHomeDir = require('expand-home-dir')
expandHomeDir('~')
// => /Users/azer
expandHomeDir('~/foo/bar/qux.corge')
// => /Users/azer/foo/bar/qux.corge
Another related lib is home-dir that returns a user's home directory on any platform:
https://www.npmjs.org/package/home-dir
Solution 4:
An example:
const os = require("os");
"~/Dropbox/sample/music".replace("~", os.homedir)