From e45f72e8e422191adeb4fd1bad896dc6a47c76b3 Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Sun, 6 Nov 2022 21:42:05 -0800 Subject: Automatically install npm packages when running a script in Bun's runtime (#1459) * Update bundler.zig * WIP * Update README.md * Update README.md * wip * Support running scripts without package.json * Add `--no-auto-install` and `--prefer-offline` flags * WIP * wip * Update headers-handwritten.h * WIP * Build fixes * Fix UAF * Update install.zig * Must call .allocate() * Micro-optimization: only call .timestamp() once per tick when installing packages * Support progress bar * Extend the timestamp for package staleness checks to 1 day * Add `--prefer-latest`, `-i` CLI Flags * Fix crash * Support line text manually being set on an Error instance * Add a few more fields for error messages * Fix bug when counting 8 character strings in string builder * Implement error handling for automatic package installs! * Fix crash * Make it say module when there's a slash * Update module_loader.zig * Ban dependency versions in import specifiers when a package.json is present * Remove unused field * Update README.md * Update README.md * Update README.md * Update README.md Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- src/bun.js/bindings/ModuleLoader.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/bun.js/bindings/ModuleLoader.cpp') diff --git a/src/bun.js/bindings/ModuleLoader.cpp b/src/bun.js/bindings/ModuleLoader.cpp index cb5ff0864..45f3cc46b 100644 --- a/src/bun.js/bindings/ModuleLoader.cpp +++ b/src/bun.js/bindings/ModuleLoader.cpp @@ -325,6 +325,29 @@ static JSValue handleVirtualModuleResult( } } +extern "C" void Bun__onFulfillAsyncModule( + EncodedJSValue promiseValue, + ErrorableResolvedSource* res, + ZigString* specifier, + ZigString* referrer) +{ + JSC::JSValue value = JSValue::decode(promiseValue); + JSC::JSInternalPromise* promise = jsCast(value); + auto* globalObject = promise->globalObject(); + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + if (!res->success) { + throwException(scope, res->result.err, globalObject); + auto* exception = scope.exception(); + scope.clearException(); + return promise->reject(promise->globalObject(), exception); + } + + auto provider = Zig::SourceProvider::create(res->result.value); + promise->resolve(promise->globalObject(), JSC::JSSourceCode::create(vm, JSC::SourceCode(provider))); +} + template static JSValue fetchSourceCode( Zig::GlobalObject* globalObject, @@ -435,7 +458,15 @@ static JSValue fetchSourceCode( return handleVirtualModuleResult(globalObject, virtualModuleResult, res, specifier, referrer); } - Bun__transpileFile(bunVM, globalObject, specifier, referrer, res); + if constexpr (allowPromise) { + void* pendingCtx = Bun__transpileFile(bunVM, globalObject, specifier, referrer, res, true); + if (pendingCtx) { + return reinterpret_cast(pendingCtx); + } + } else { + Bun__transpileFile(bunVM, globalObject, specifier, referrer, res, false); + } + if (!res->success) { throwException(scope, res->result.err, globalObject); auto* exception = scope.exception(); -- cgit v1.2.3