aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/module_loader.zig8
-rw-r--r--src/bun.js/test/jest.zig4
-rw-r--r--src/bundler/bundle_v2.zig2
-rw-r--r--src/cli.zig29
-rw-r--r--src/cli/build_command.zig6
-rw-r--r--src/fs.zig2
-rw-r--r--src/options.zig4
-rw-r--r--test/js/bun/resolve/more-data.any (renamed from test/js/bun/resolve/png/test-png.png)0
-rw-r--r--test/js/bun/resolve/non-js/data.anything1
-rw-r--r--test/js/bun/resolve/non-js/no-extension-js3
-rw-r--r--test/js/bun/resolve/non-js/non-js-import.test.js16
-rw-r--r--test/js/bun/resolve/non-js/test-png.png0
-rw-r--r--test/js/bun/resolve/png/test-png-import.test.js7
-rw-r--r--test/js/bun/test/test-test.test.ts2
14 files changed, 51 insertions, 33 deletions
diff --git a/src/bun.js/module_loader.zig b/src/bun.js/module_loader.zig
index 8a46b063a..88b065727 100644
--- a/src/bun.js/module_loader.zig
+++ b/src/bun.js/module_loader.zig
@@ -1476,7 +1476,13 @@ pub const ModuleLoader = struct {
&display_specifier,
);
const path = Fs.Path.init(specifier);
- const loader = jsc_vm.bundler.options.loaders.get(path.name.ext) orelse options.Loader.js;
+ const loader = jsc_vm.bundler.options.loaders.get(path.name.ext) orelse brk: {
+ if (strings.eqlLong(specifier, jsc_vm.main, true)) {
+ break :brk options.Loader.js;
+ }
+
+ break :brk options.Loader.file;
+ };
var promise: ?*JSC.JSInternalPromise = null;
ret.* = ErrorableResolvedSource.ok(
ModuleLoader.transpileSourceCode(
diff --git a/src/bun.js/test/jest.zig b/src/bun.js/test/jest.zig
index 197bba03f..dcb9f8725 100644
--- a/src/bun.js/test/jest.zig
+++ b/src/bun.js/test/jest.zig
@@ -1202,9 +1202,7 @@ pub const Expect = struct {
}
}
} else if (value.isString() and expected.isString()) {
- const value_string = value.toString(globalObject).toSlice(globalObject, default_allocator).slice();
- const expected_string = expected.toString(globalObject).toSlice(globalObject, default_allocator).slice();
- if (strings.contains(value_string, expected_string)) {
+ if (value.stringIncludes(globalObject, expected)) {
pass = true;
}
} else {
diff --git a/src/bundler/bundle_v2.zig b/src/bundler/bundle_v2.zig
index 10ad9898c..496b6af10 100644
--- a/src/bundler/bundle_v2.zig
+++ b/src/bundler/bundle_v2.zig
@@ -333,7 +333,7 @@ pub const BundleV2 = struct {
var result = resolve;
var path = result.path() orelse return null;
- const loader = this.bundler.options.loaders.get(path.name.ext) orelse .file;
+ const loader = path.loader(&this.bundler.options.loaders) orelse Loader.js;
if (!loader.isJavaScriptLikeOrJSON()) return null;
var entry = try this.graph.path_to_source_index_map.getOrPut(this.graph.allocator, hash orelse wyhash(0, path.text));
diff --git a/src/cli.zig b/src/cli.zig
index f9c3f403f..6deb8062b 100644
--- a/src/cli.zig
+++ b/src/cli.zig
@@ -1331,18 +1331,9 @@ pub const Command = struct {
}
var was_js_like = false;
- // If we start bun with:
- // 1. `bun foo.js`, assume it's a JavaScript file.
- // 2. `bun /absolute/path/to/bin/foo` assume its a JavaScript file.
- // ^ no file extension
- //
- // #!/usr/bin/env bun
- // will pass us an absolute path to the script.
- // This means a non-standard file extension will not work, but that is better than the current state
- // which is file extension-less doesn't work
- const default_loader = options.defaultLoaders.get(extension) orelse brk: {
+ const default_loader: options.Loader = options.defaultLoaders.get(extension) orelse brk: {
if (extension.len == 0 and ctx.args.entry_points.len > 0 and ctx.args.entry_points[0].len > 0 and std.fs.path.isAbsolute(ctx.args.entry_points[0])) {
- break :brk options.Loader.js;
+ break :brk .js;
}
if (extension.len > 0) {
@@ -1351,22 +1342,20 @@ pub const Command = struct {
}
if (ctx.preloads.len > 0)
- break :brk options.Loader.js;
+ break :brk .js;
}
- break :brk null;
+ break :brk .js;
};
const force_using_bun = ctx.debug.run_in_bun;
var did_check = false;
- if (default_loader) |loader| {
- if (loader.canBeRunByBun()) {
- was_js_like = true;
- if (maybeOpenWithBunJS(&ctx)) {
- return;
- }
- did_check = true;
+ if (default_loader.canBeRunByBun()) {
+ was_js_like = true;
+ if (maybeOpenWithBunJS(&ctx)) {
+ return;
}
+ did_check = true;
}
if (force_using_bun and !did_check) {
diff --git a/src/cli/build_command.zig b/src/cli/build_command.zig
index 1b8e5c632..6b2a6761e 100644
--- a/src/cli/build_command.zig
+++ b/src/cli/build_command.zig
@@ -54,6 +54,12 @@ pub const BuildCommand = struct {
this_bundler.options.code_splitting = ctx.bundler_options.code_splitting;
this_bundler.resolver.opts.code_splitting = ctx.bundler_options.code_splitting;
+ if (this_bundler.options.entry_points.len > 1 and ctx.bundler_options.outdir.len == 0) {
+ Output.prettyErrorln("<red>error<r>: must use \"outdir\" when there are multiple input files", .{});
+ Global.exit(1);
+ return;
+ }
+
this_bundler.configureLinker();
// This step is optional
diff --git a/src/fs.zig b/src/fs.zig
index 3f0303e32..7ef6db609 100644
--- a/src/fs.zig
+++ b/src/fs.zig
@@ -1142,7 +1142,7 @@ pub const PathName = struct {
pub fn init(_path: string) PathName {
var path = _path;
var base = path;
- var ext = path;
+ var ext: string = "";
var dir = path;
var is_absolute = true;
diff --git a/src/options.zig b/src/options.zig
index b0756a396..774570d5c 100644
--- a/src/options.zig
+++ b/src/options.zig
@@ -826,6 +826,7 @@ pub const defaultLoaders = ComptimeStringMap(Loader, .{
.{ ".jsx", Loader.jsx },
.{ ".json", Loader.json },
.{ ".js", Loader.jsx },
+ .{ "", Loader.js },
.{ ".mjs", Loader.js },
.{ ".cjs", Loader.js },
@@ -1143,6 +1144,9 @@ const default_loader_ext = [_]string{
".mts", ".cts",
".toml", ".wasm",
+
+ // no extension will default to js
+ "",
};
pub fn loadersFromTransformOptions(allocator: std.mem.Allocator, _loaders: ?Api.LoaderMap, platform: Platform) !bun.StringArrayHashMap(Loader) {
diff --git a/test/js/bun/resolve/png/test-png.png b/test/js/bun/resolve/more-data.any
index e69de29bb..e69de29bb 100644
--- a/test/js/bun/resolve/png/test-png.png
+++ b/test/js/bun/resolve/more-data.any
diff --git a/test/js/bun/resolve/non-js/data.anything b/test/js/bun/resolve/non-js/data.anything
new file mode 100644
index 000000000..1ba465088
--- /dev/null
+++ b/test/js/bun/resolve/non-js/data.anything
@@ -0,0 +1 @@
+anything
diff --git a/test/js/bun/resolve/non-js/no-extension-js b/test/js/bun/resolve/non-js/no-extension-js
new file mode 100644
index 000000000..ddafdcaa5
--- /dev/null
+++ b/test/js/bun/resolve/non-js/no-extension-js
@@ -0,0 +1,3 @@
+export default function js() {
+ return "success!";
+}
diff --git a/test/js/bun/resolve/non-js/non-js-import.test.js b/test/js/bun/resolve/non-js/non-js-import.test.js
new file mode 100644
index 000000000..41fffee66
--- /dev/null
+++ b/test/js/bun/resolve/non-js/non-js-import.test.js
@@ -0,0 +1,16 @@
+import { expect, test } from "bun:test";
+import { resolve, join } from "path";
+import MyPNG from "./test-png.png";
+import data from "./data.anything";
+import moreData from "../more-data.any";
+import js from "./no-extension-js";
+
+test("png import", () => {
+ expect(MyPNG).toBe(resolve(__dirname, "./test-png.png"));
+});
+
+test("random import", () => {
+ expect(data).toBe(join(import.meta.dir, "data.anything"));
+ expect(moreData).toBe(join(import.meta.dir, "../more-data.any"));
+ expect(js()).toBe("success!");
+});
diff --git a/test/js/bun/resolve/non-js/test-png.png b/test/js/bun/resolve/non-js/test-png.png
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/test/js/bun/resolve/non-js/test-png.png
diff --git a/test/js/bun/resolve/png/test-png-import.test.js b/test/js/bun/resolve/png/test-png-import.test.js
deleted file mode 100644
index ca2d0b9ce..000000000
--- a/test/js/bun/resolve/png/test-png-import.test.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { expect, test } from "bun:test";
-import { resolve } from "path";
-import MyPNG from "./test-png.png";
-
-test("png import", () => {
- expect(MyPNG).toBe(resolve(__dirname, "./test-png.png"));
-});
diff --git a/test/js/bun/test/test-test.test.ts b/test/js/bun/test/test-test.test.ts
index 5154950de..906d8dd16 100644
--- a/test/js/bun/test/test-test.test.ts
+++ b/test/js/bun/test/test-test.test.ts
@@ -1774,6 +1774,8 @@ test("toContain()", () => {
// expect("test").not.toContain("test");
expect(["test", "es"]).toContain("es");
expect("").toContain("");
+ expect("").not.toContain(" ");
+ expect(" ").toContain("");
expect([""]).toContain("");
expect(["lemon", "lime"]).not.toContain("orange");