1 import {homedir} from 'os';
2 import {basename, dirname, join, normalize, relative, resolve} from 'path';
4 import Context from './Fig/Context.js';
5 import root from './Fig/root.js';
7 const inspect = Symbol.for('nodejs.util.inspect.custom');
9 // TODO: export path module wrappers as well, then I can just use it as a
10 // drop-in replacement
12 export type Path = string & {
16 join: (...components: Array<string>) => Path;
19 strip: (extension?: string) => Path;
21 // Makes sure value as printed by `console.log()` looks like a string.
22 [inspect]: () => string;
26 (string: string): Path;
33 function path(string: string): Path {
34 // Unwrap (possible) Path string-like back to primitive string.
35 string = string.toString();
37 return Object.defineProperties(new String(string), {
40 return path(basename(string));
46 return path(dirname(string));
52 if (string.startsWith('~/')) {
53 return path(join(homedir(), string.slice(2)));
61 value: (...components: Array<string>) => {
64 join(string, ...components.map((c) => c.toString()))
72 if (string.startsWith('~/')) {
73 return path(normalize(join(homedir(), string.slice(2))));
75 return path(resolve(string));
82 const home = homedir();
84 if (string.startsWith(home)) {
85 return path(join('~', string.slice(home.length)));
87 return path(relative('', string));
93 * Strips off ".ext" identified by `extension`, if present.
96 value: (extension?: string) => {
97 return path(join(dirname(string), basename(string, extension)));
107 Object.defineProperty(path, 'aspect', {
109 return path(root).join('aspects', Context.currentAspect);
113 export default Object.assign(path, {