diff options
-rw-r--r-- | src/ast/base.zig | 10 | ||||
-rw-r--r-- | src/bun.js/module_loader.zig | 2 | ||||
-rw-r--r-- | src/fs.zig | 57 | ||||
-rw-r--r-- | src/js_parser.zig | 2 | ||||
-rw-r--r-- | src/resolver/resolver.zig | 10 | ||||
-rw-r--r-- | test/bun.js/install/bunx.test.ts | 43 |
6 files changed, 72 insertions, 52 deletions
diff --git a/src/ast/base.zig b/src/ast/base.zig index 1ce91ccbe..f3cc34925 100644 --- a/src/ast/base.zig +++ b/src/ast/base.zig @@ -283,13 +283,3 @@ test "Ref" { try std.testing.expectEqual(ref.isSourceContentsSlice(), first.is_source_contents_slice); } } - -// This is kind of the wrong place, but it's shared between files -pub const RequireOrImportMeta = struct { - // CommonJS files will return the "require_*" wrapper function and an invalid - // exports object reference. Lazily-initialized ESM files will return the - // "init_*" wrapper function and the exports object for that file. - wrapper_ref: Ref = Ref.None, - exports_ref: Ref = Ref.None, - is_wrapper_async: bool = false, -}; diff --git a/src/bun.js/module_loader.zig b/src/bun.js/module_loader.zig index 0583a36ad..0bd379e63 100644 --- a/src/bun.js/module_loader.zig +++ b/src/bun.js/module_loader.zig @@ -1128,7 +1128,7 @@ pub const ModuleLoader = struct { return resolved_source; } - return ResolvedSource{ + return .{ .allocator = null, .source_code = ZigString.init(try default_allocator.dupe(u8, printer.ctx.getWritten())), .specifier = ZigString.init(display_specifier), diff --git a/src/fs.zig b/src/fs.zig index 68f8bfe33..05903fac2 100644 --- a/src/fs.zig +++ b/src/fs.zig @@ -203,22 +203,13 @@ pub const FileSystem = struct { // } pub fn addEntry(dir: *DirEntry, entry: std.fs.IterableDir.Entry, allocator: std.mem.Allocator, comptime Iterator: type, iterator: Iterator) !void { - var _kind: Entry.Kind = undefined; - switch (entry.kind) { - .Directory => { - _kind = Entry.Kind.dir; - }, - .SymLink => { - // This might be wrong! - _kind = Entry.Kind.file; - }, - .File => { - _kind = Entry.Kind.file; - }, - else => { - return; - }, - } + const _kind: Entry.Kind = switch (entry.kind) { + .Directory => .dir, + // This might be wrong! + .SymLink => .file, + .File => .file, + else => return, + }; // entry.name only lives for the duration of the iteration const name = if (entry.name.len >= strings.StringOrTinyString.Max) @@ -231,22 +222,20 @@ pub const FileSystem = struct { else strings.StringOrTinyString.initLowerCase(entry.name); - var stored = try EntryStore.instance.append( - Entry{ - .base_ = name, - .base_lowercase_ = name_lowercased, - .dir = dir.dir, - .mutex = Mutex.init(), - // Call "stat" lazily for performance. The "@material-ui/icons" package - // contains a directory with over 11,000 entries in it and running "stat" - // for each entry was a big performance issue for that package. - .need_stat = entry.kind == .SymLink, - .cache = Entry.Cache{ - .symlink = PathString.empty, - .kind = _kind, - }, + const stored = try EntryStore.instance.append(.{ + .base_ = name, + .base_lowercase_ = name_lowercased, + .dir = dir.dir, + .mutex = Mutex.init(), + // Call "stat" lazily for performance. The "@material-ui/icons" package + // contains a directory with over 11,000 entries in it and running "stat" + // for each entry was a big performance issue for that package. + .need_stat = entry.kind == .SymLink, + .cache = .{ + .symlink = PathString.empty, + .kind = _kind, }, - ); + }); const stored_name = stored.base(); @@ -270,7 +259,7 @@ pub const FileSystem = struct { Output.prettyln("\n {s}", .{dir}); } - return DirEntry{ .dir = dir, .data = EntryMap{} }; + return .{ .dir = dir, .data = .{} }; } pub const Err = struct { @@ -363,7 +352,7 @@ pub const FileSystem = struct { }; pub const Entry = struct { - cache: Cache = Cache{}, + cache: Cache = .{}, dir: string, base_: strings.StringOrTinyString, @@ -406,7 +395,7 @@ pub const FileSystem = struct { pub const Cache = struct { symlink: PathString = PathString.empty, fd: StoredFileDescriptorType = 0, - kind: Kind = Kind.file, + kind: Kind = .file, }; pub const Kind = enum { diff --git a/src/js_parser.zig b/src/js_parser.zig index 27c349f24..a8861875a 100644 --- a/src/js_parser.zig +++ b/src/js_parser.zig @@ -18902,7 +18902,7 @@ fn NewParser_( // } } - return js_ast.Ast{ + return .{ .runtime_imports = p.runtime_imports, .parts = parts, .module_scope = p.module_scope.*, diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig index 3331e8b06..7be97a291 100644 --- a/src/resolver/resolver.zig +++ b/src/resolver/resolver.zig @@ -1819,7 +1819,7 @@ pub const Resolver = struct { } fn dirInfoForResolution( r: *ThisResolver, - dir_path: []const u8, + dir_path: string, package_id: Install.PackageID, ) !?*DirInfo { std.debug.assert(r.package_manager != null); @@ -1833,7 +1833,7 @@ pub const Resolver = struct { var cached_dir_entry_result = rfs.entries.getOrPut(dir_path) catch unreachable; var dir_entries_option: *Fs.FileSystem.RealFS.EntriesOption = undefined; - var needs_iter: bool = true; + var needs_iter = true; var open_dir = std.fs.cwd().openIterableDir(dir_path, .{}) catch |err| { switch (err) { error.FileNotFound => unreachable, @@ -1855,7 +1855,9 @@ pub const Resolver = struct { if (needs_iter) { const allocator = r.fs.allocator; dir_entries_option = rfs.entries.put(&cached_dir_entry_result, .{ - .entries = Fs.FileSystem.DirEntry.init(dir_path), + .entries = Fs.FileSystem.DirEntry.init( + Fs.FileSystem.DirnameStore.instance.append(string, dir_path) catch unreachable, + ), }) catch unreachable; if (FeatureFlags.store_file_descriptors) { @@ -1870,7 +1872,7 @@ pub const Resolver = struct { // We must initialize it as empty so that the result index is correct. // This is important so that browser_scope has a valid index. - var dir_info_ptr = r.dir_cache.put(&dir_cache_info_result, DirInfo{}) catch unreachable; + var dir_info_ptr = r.dir_cache.put(&dir_cache_info_result, .{}) catch unreachable; try r.dirInfoUncached( dir_info_ptr, diff --git a/test/bun.js/install/bunx.test.ts b/test/bun.js/install/bunx.test.ts index 08ec3fc50..76cd944a1 100644 --- a/test/bun.js/install/bunx.test.ts +++ b/test/bun.js/install/bunx.test.ts @@ -53,11 +53,11 @@ it("should install and run specified version", async () => { expect(await exited).toBe(0); }); -it("should download dependencies to run local file", async () => { +it("should download dependency to run local file", async () => { await writeFile( join(x_dir, "test.js"), ` -import { minify } from "uglify-js"; +const { minify } = require("uglify-js@3.17.4"); console.log(minify("print(6 * 7)").code); `, @@ -82,3 +82,42 @@ console.log(minify("print(6 * 7)").code); expect(await exited).toBe(0); expect(await readdirSorted(x_dir)).toEqual([".cache", "test.js"]); }); + +it("should download dependencies to run local file", async () => { + await writeFile( + join(x_dir, "test.js"), + ` +import { file } from "bun"; +import decompress from "decompress@4.2.1"; + +const buffer = await file("${join(import.meta.dir, "baz-0.0.3.tgz")}").arrayBuffer(); +for (const entry of await decompress(Buffer.from(buffer))) { + console.log(\`\${entry.type}: \${entry.path}\`); +} +`, + ); + const { stdout, stderr, exited } = spawn({ + cmd: [bunExe(), "test.js"], + cwd: x_dir, + stdout: null, + stdin: "pipe", + stderr: "pipe", + env: { + ...env, + BUN_INSTALL_CACHE_DIR: join(x_dir, ".cache"), + }, + }); + expect(stderr).toBeDefined(); + const err = await new Response(stderr).text(); + expect(err).toBe(""); + expect(stdout).toBeDefined(); + const out = await new Response(stdout).text(); + expect(out.split(/\r?\n/)).toEqual([ + "directory: package/", + "file: package/index.js", + "file: package/package.json", + "", + ]); + expect(await exited).toBe(0); + expect(await readdirSorted(x_dir)).toEqual([".cache", "test.js"]); +}); |