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>
This commit is contained in:
Jarred Sumner
2022-11-06 21:42:05 -08:00
committed by GitHub
parent 645cf90335
commit e45f72e8e4
35 changed files with 5530 additions and 1787 deletions

View File

@@ -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<JSC::JSInternalPromise*>(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<bool allowPromise>
static JSValue fetchSourceCode(
Zig::GlobalObject* globalObject,
@@ -435,7 +458,15 @@ static JSValue fetchSourceCode(
return handleVirtualModuleResult<allowPromise>(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<JSC::JSInternalPromise*>(pendingCtx);
}
} else {
Bun__transpileFile(bunVM, globalObject, specifier, referrer, res, false);
}
if (!res->success) {
throwException(scope, res->result.err, globalObject);
auto* exception = scope.exception();