aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bun.js/bindings/bindings.cpp6
-rw-r--r--src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp7
-rw-r--r--src/bun.js/builtins/js/ImportMetaObject.js2
-rw-r--r--src/bun.js/fs.exports.js79
-rw-r--r--src/bun.js/javascript.zig40
5 files changed, 81 insertions, 53 deletions
diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp
index bb0718ea9..0cf2b2dcb 100644
--- a/src/bun.js/bindings/bindings.cpp
+++ b/src/bun.js/bindings/bindings.cpp
@@ -888,8 +888,10 @@ JSC__JSValue JSC__JSModuleLoader__evaluate(JSC__JSGlobalObject* globalObject, co
globalObject->moduleLoader()->provideFetch(globalObject, jsString(vm, origin.fileSystemPath()), WTFMove(sourceCode));
auto* promise = JSC::importModule(globalObject, JSC::Identifier::fromString(vm, origin.fileSystemPath()), JSValue(), JSValue());
- if (promise->status(vm) == JSC::JSPromise::Status::Pending) {
- vm.drainMicrotasks();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+
+ if (scope.exception()) {
+ promise->rejectWithCaughtException(globalObject, scope);
}
if (promise->status(vm) == JSC::JSPromise::Status::Fulfilled) {
diff --git a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
index eb3f0e1f9..0afe19141 100644
--- a/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
+++ b/src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp
@@ -168,7 +168,7 @@ const char* const s_importMetaObjectLoadCJS2ESMCode =
const JSC::ConstructAbility s_importMetaObjectRequireESMCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_importMetaObjectRequireESMCodeConstructorKind = JSC::ConstructorKind::None;
const JSC::ImplementationVisibility s_importMetaObjectRequireESMCodeImplementationVisibility = JSC::ImplementationVisibility::Public;
-const int s_importMetaObjectRequireESMCodeLength = 559;
+const int s_importMetaObjectRequireESMCodeLength = 561;
static const JSC::Intrinsic s_importMetaObjectRequireESMCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_importMetaObjectRequireESMCode =
"(function (resolved) {\n" \
@@ -184,7 +184,7 @@ const char* const s_importMetaObjectRequireESMCode =
" }\n" \
" var exports = @Loader.getModuleNamespaceObject(entry.module);\n" \
" var commonJS = exports.default;\n" \
- " if (commonJS && @isObject(commonJS) && @commonJSSymbol in commonJS) {\n" \
+ " if (commonJS && @isCallable(commonJS) && @commonJSSymbol in commonJS) {\n" \
" return commonJS();\n" \
" }\n" \
" return exports;\n" \
@@ -212,7 +212,6 @@ const char* const s_importMetaObjectRequireCode =
"\n" \
" return cached;\n" \
" }\n" \
- "\n" \
" \n" \
" //\n" \
" if (last5 === \".json\") {\n" \
@@ -227,7 +226,7 @@ const char* const s_importMetaObjectRequireCode =
" return module.exports;\n" \
" } else if (last5 === \".toml\") {\n" \
" var fs = (globalThis[Symbol.for(\"_fs\")] ||= @Bun.fs());\n" \
- " var exports = Bun.TOML.parse(fs.readFileSync(resolved, \"utf8\"));\n" \
+ " var exports = @Bun.TOML.parse(fs.readFileSync(resolved, \"utf8\"));\n" \
" @requireMap.@set(resolved, exports);\n" \
" return exports;\n" \
" } else {\n" \
diff --git a/src/bun.js/builtins/js/ImportMetaObject.js b/src/bun.js/builtins/js/ImportMetaObject.js
index f7fad3344..d1b409b64 100644
--- a/src/bun.js/builtins/js/ImportMetaObject.js
+++ b/src/bun.js/builtins/js/ImportMetaObject.js
@@ -148,7 +148,7 @@ function requireESM(resolved) {
}
var exports = @Loader.getModuleNamespaceObject(entry.module);
var commonJS = exports.default;
- if (commonJS && @isObject(commonJS) && @commonJSSymbol in commonJS) {
+ if (commonJS && @isCallable(commonJS) && @commonJSSymbol in commonJS) {
return commonJS();
}
return exports;
diff --git a/src/bun.js/fs.exports.js b/src/bun.js/fs.exports.js
index 08f5152bc..b11deca2c 100644
--- a/src/bun.js/fs.exports.js
+++ b/src/bun.js/fs.exports.js
@@ -1,5 +1,4 @@
-var _fs = Bun.fs();
-var fs = Object.create(_fs);
+var fs = Bun.fs();
export var access = function access(...args) {
callbackify(fs.accessSync, args);
@@ -109,7 +108,7 @@ function callbackify(fsFunction, args) {
try {
args[args.length - 1](
null,
- fsFunction.apply(_fs, args.slice(0, args.length - 1))
+ fsFunction.apply(fs, args.slice(0, args.length - 1))
);
} catch (err) {
args[args.length - 1](err);
@@ -131,7 +130,7 @@ function promisify(fsFunction) {
[fsFunction.name]: function (resolve, reject, args) {
var result;
try {
- result = fsFunction.apply(_fs, args);
+ result = fsFunction.apply(fs, args);
args = undefined;
} catch (err) {
args = undefined;
@@ -153,43 +152,43 @@ function promisify(fsFunction) {
};
}
-export var accessSync = fs.accessSync.bind(_fs);
-export var appendFileSync = fs.appendFileSync.bind(_fs);
-export var closeSync = fs.closeSync.bind(_fs);
-export var copyFileSync = fs.copyFileSync.bind(_fs);
-export var existsSync = fs.existsSync.bind(_fs);
-export var chownSync = fs.chownSync.bind(_fs);
-export var chmodSync = fs.chmodSync.bind(_fs);
-export var fchmodSync = fs.fchmodSync.bind(_fs);
-export var fchownSync = fs.fchownSync.bind(_fs);
-export var fstatSync = fs.fstatSync.bind(_fs);
-export var fsyncSync = fs.fsyncSync.bind(_fs);
-export var ftruncateSync = fs.ftruncateSync.bind(_fs);
-export var futimesSync = fs.futimesSync.bind(_fs);
-export var lchmodSync = fs.lchmodSync.bind(_fs);
-export var lchownSync = fs.lchownSync.bind(_fs);
-export var linkSync = fs.linkSync.bind(_fs);
-export var lstatSync = fs.lstatSync.bind(_fs);
-export var mkdirSync = fs.mkdirSync.bind(_fs);
-export var mkdtempSync = fs.mkdtempSync.bind(_fs);
-export var openSync = fs.openSync.bind(_fs);
-export var readSync = fs.readSync.bind(_fs);
-export var writeSync = fs.writeSync.bind(_fs);
-export var readdirSync = fs.readdirSync.bind(_fs);
-export var readFileSync = fs.readFileSync.bind(_fs);
-export var writeFileSync = fs.writeFileSync.bind(_fs);
-export var readlinkSync = fs.readlinkSync.bind(_fs);
-export var realpathSync = fs.realpathSync.bind(_fs);
-export var renameSync = fs.renameSync.bind(_fs);
-export var statSync = fs.statSync.bind(_fs);
-export var symlinkSync = fs.symlinkSync.bind(_fs);
-export var truncateSync = fs.truncateSync.bind(_fs);
-export var unlinkSync = fs.unlinkSync.bind(_fs);
-export var utimesSync = fs.utimesSync.bind(_fs);
-export var lutimesSync = fs.lutimesSync.bind(_fs);
+export var accessSync = fs.accessSync.bind(fs);
+export var appendFileSync = fs.appendFileSync.bind(fs);
+export var closeSync = fs.closeSync.bind(fs);
+export var copyFileSync = fs.copyFileSync.bind(fs);
+export var existsSync = fs.existsSync.bind(fs);
+export var chownSync = fs.chownSync.bind(fs);
+export var chmodSync = fs.chmodSync.bind(fs);
+export var fchmodSync = fs.fchmodSync.bind(fs);
+export var fchownSync = fs.fchownSync.bind(fs);
+export var fstatSync = fs.fstatSync.bind(fs);
+export var fsyncSync = fs.fsyncSync.bind(fs);
+export var ftruncateSync = fs.ftruncateSync.bind(fs);
+export var futimesSync = fs.futimesSync.bind(fs);
+export var lchmodSync = fs.lchmodSync.bind(fs);
+export var lchownSync = fs.lchownSync.bind(fs);
+export var linkSync = fs.linkSync.bind(fs);
+export var lstatSync = fs.lstatSync.bind(fs);
+export var mkdirSync = fs.mkdirSync.bind(fs);
+export var mkdtempSync = fs.mkdtempSync.bind(fs);
+export var openSync = fs.openSync.bind(fs);
+export var readSync = fs.readSync.bind(fs);
+export var writeSync = fs.writeSync.bind(fs);
+export var readdirSync = fs.readdirSync.bind(fs);
+export var readFileSync = fs.readFileSync.bind(fs);
+export var writeFileSync = fs.writeFileSync.bind(fs);
+export var readlinkSync = fs.readlinkSync.bind(fs);
+export var realpathSync = fs.realpathSync.bind(fs);
+export var renameSync = fs.renameSync.bind(fs);
+export var statSync = fs.statSync.bind(fs);
+export var symlinkSync = fs.symlinkSync.bind(fs);
+export var truncateSync = fs.truncateSync.bind(fs);
+export var unlinkSync = fs.unlinkSync.bind(fs);
+export var utimesSync = fs.utimesSync.bind(fs);
+export var lutimesSync = fs.lutimesSync.bind(fs);
-export var createReadStream = fs.createReadStream.bind(_fs);
-export var createWriteStream = fs.createWriteStream.bind(_fs);
+export var createReadStream = fs.createReadStream.bind(fs);
+export var createWriteStream = fs.createWriteStream.bind(fs);
export var promises = {
access: promisify(fs.accessSync),
diff --git a/src/bun.js/javascript.zig b/src/bun.js/javascript.zig
index 4053b89d5..4c120d179 100644
--- a/src/bun.js/javascript.zig
+++ b/src/bun.js/javascript.zig
@@ -787,7 +787,7 @@ pub const VirtualMachine = struct {
.@"bun:jsc" => {
return ResolvedSource{
.allocator = null,
- .source_code = ZigString.init(@embedFile("bun-jsc.exports.js") ++ JSC.Node.fs.constants_string),
+ .source_code = ZigString.init(jsModuleFromFile("bun-jsc.exports.js")),
.specifier = ZigString.init("bun:jsc"),
.source_url = ZigString.init("bun:jsc"),
.hash = 0,
@@ -829,7 +829,7 @@ pub const VirtualMachine = struct {
.@"node:path" => {
return ResolvedSource{
.allocator = null,
- .source_code = ZigString.init(Node.Path.code),
+ .source_code = ZigString.init(jsModuleFromFile("path.exports.js")),
.specifier = ZigString.init("node:path"),
.source_url = ZigString.init("node:path"),
.hash = 0,
@@ -839,7 +839,7 @@ pub const VirtualMachine = struct {
.@"node:os" => {
return ResolvedSource{
.allocator = null,
- .source_code = ZigString.init(Node.Os.code),
+ .source_code = ZigString.init(jsModuleFromFile("os.exports.js")),
.specifier = ZigString.init("node:os"),
.source_url = ZigString.init("node:os"),
.hash = 0,
@@ -3035,16 +3035,30 @@ pub const ModuleLoader = struct {
},
};
var ast_copy = parse_result.ast;
+ ast_copy.import_records = try jsc_vm.allocator.dupe(ImportRecord, ast_copy.import_records);
+ defer jsc_vm.allocator.free(ast_copy.import_records);
ast_copy.parts = &parts;
ast_copy.prepend_part = null;
var temporary_source = parse_result.source;
var source_name = try std.fmt.allocPrint(jsc_vm.allocator, "{s}.plugin.{s}", .{ temporary_source.path.text, temporary_source.path.name.ext[1..] });
temporary_source.path = Fs.Path.init(source_name);
+ var temp_parse_result = parse_result.*;
+ temp_parse_result.ast = ast_copy;
+
+ try jsc_vm.bundler.linker.link(
+ temporary_source.path,
+ &temp_parse_result,
+ jsc_vm.origin,
+ .absolute_path,
+ false,
+ true,
+ );
+
_ = brk: {
defer source_code_printer.* = printer;
break :brk try jsc_vm.bundler.printWithSourceMapMaybe(
- ast_copy,
+ temp_parse_result.ast,
&temporary_source,
@TypeOf(&printer),
&printer,
@@ -3060,7 +3074,7 @@ pub const ModuleLoader = struct {
try dumpSource(temporary_source.path.text, &printer);
var exception = [1]JSC.JSValue{JSC.JSValue.zero};
- _ = JSC.JSModuleLoader.evaluate(
+ const promise = JSC.JSModuleLoader.evaluate(
jsc_vm.global,
wrote.ptr,
wrote.len,
@@ -3076,6 +3090,20 @@ pub const ModuleLoader = struct {
);
return error.PluginError;
}
+
+ if (!promise.isEmptyOrUndefinedOrNull()) {
+ if (promise.asInternalPromise()) |promise_value| {
+ jsc_vm.waitForPromise(promise_value);
+
+ if (promise_value.status(jsc_vm.global.vm()) == .Rejected) {
+ ret.* = JSC.ErrorableResolvedSource.err(
+ error.JSErrorObject,
+ promise_value.result(jsc_vm.global.vm()).asVoid(),
+ );
+ return error.PluginError;
+ }
+ }
+ }
}
}
pub fn normalizeSpecifier(jsc_vm: *VirtualMachine, slice_: string) string {
@@ -3167,7 +3195,7 @@ pub const ModuleLoader = struct {
VirtualMachine.source_code_printer.?,
FetchFlags.transpile,
) catch |err| {
- if (err == error.PluginERror) {
+ if (err == error.PluginError) {
return true;
}
VirtualMachine.processFetchLog(globalObject, specifier_ptr.*, referrer.*, &log, ret, err);