aboutsummaryrefslogtreecommitdiff
path: root/src/fs.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs.zig')
-rw-r--r--src/fs.zig73
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")) {