diff options
Diffstat (limited to 'src/fs.zig')
-rw-r--r-- | src/fs.zig | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/src/fs.zig b/src/fs.zig index 6e1da47f4..c0f3cd9dd 100644 --- a/src/fs.zig +++ b/src/fs.zig @@ -1190,13 +1190,84 @@ pub const FileSystem = struct { pub const Directory = struct { path: Path, contents: []string }; pub const File = struct { path: Path, contents: string }; -pub const PathName = struct { +pub const NodeJSPathName = struct { base: string, dir: string, /// includes the leading . ext: string, filename: string, + pub fn init(_path: string) NodeJSPathName { + var path = _path; + var base = path; + // ext must be empty if not detected + var ext: string = ""; + var dir = path; + var is_absolute = true; + var _i = strings.lastIndexOfChar(path, '/'); + var first = true; + while (_i) |i| { + + // Stop if we found a non-trailing slash + if (i + 1 != path.len) { + base = path[i + 1 ..]; + dir = path[0..i]; + is_absolute = false; + break; + } + + // If the path starts with a slash and it's the only slash, it's absolute + if (i == 0 and first) { + base = path[1..]; + dir = &([_]u8{}); + break; + } + + first = false; + // Ignore trailing slashes + + path = path[0..i]; + + _i = strings.lastIndexOfChar(path, '/'); + } + + // clean trailing slashs + if (base.len > 1 and base[base.len - 1] == '/') { + base = base[0 .. base.len - 1]; + } + + // filename is base without extension + var filename = base; + + // if only one character ext = "" even if filename it's "." + if (filename.len > 1) { + // Strip off the extension + var _dot = strings.lastIndexOfChar(filename, '.'); + if (_dot) |dot| { + ext = filename[dot..]; + filename = filename[0..dot]; + } + } + + if (is_absolute) { + dir = &([_]u8{}); + } + + return NodeJSPathName{ + .dir = dir, + .base = base, + .ext = ext, + .filename = filename, + }; + } +}; + +pub const PathName = struct { + base: string, + dir: string, + /// includes the leading . + ext: string, + filename: string, pub fn nonUniqueNameStringBase(self: *const PathName) string { // /bar/foo/index.js -> foo if (self.dir.len > 0 and strings.eqlComptime(self.base, "index")) { |