diff options
author | 2022-09-06 03:31:29 -0700 | |
---|---|---|
committer | 2022-09-06 03:37:58 -0700 | |
commit | e9cc9ae81654fecc6cbe9d78346d2c037e9c7027 (patch) | |
tree | f7aceb53090e64621f55076efed9092e66478119 /src | |
parent | ba2a7d72e789b9d58d95d1c596117a48692b2432 (diff) | |
download | bun-e9cc9ae81654fecc6cbe9d78346d2c037e9c7027.tar.gz bun-e9cc9ae81654fecc6cbe9d78346d2c037e9c7027.tar.zst bun-e9cc9ae81654fecc6cbe9d78346d2c037e9c7027.zip |
Make the plugins a little more resilient
Diffstat (limited to 'src')
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 6 | ||||
-rw-r--r-- | src/bun.js/builtins/cpp/ImportMetaObjectBuiltins.cpp | 7 | ||||
-rw-r--r-- | src/bun.js/builtins/js/ImportMetaObject.js | 2 | ||||
-rw-r--r-- | src/bun.js/fs.exports.js | 79 | ||||
-rw-r--r-- | src/bun.js/javascript.zig | 40 |
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); |