mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
187 lines
7.7 KiB
C++
187 lines
7.7 KiB
C++
#include "root.h"
|
|
|
|
#include "./NodeModuleModule.h"
|
|
|
|
#include "ImportMetaObject.h"
|
|
#include "JavaScriptCore/JSBoundFunction.h"
|
|
#include "JavaScriptCore/ObjectConstructor.h"
|
|
using namespace Zig;
|
|
using namespace JSC;
|
|
|
|
JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleCreateRequire,
|
|
(JSC::JSGlobalObject * globalObject,
|
|
JSC::CallFrame *callFrame)) {
|
|
JSC::VM &vm = globalObject->vm();
|
|
auto scope = DECLARE_THROW_SCOPE(vm);
|
|
if (callFrame->argumentCount() < 1) {
|
|
throwTypeError(globalObject, scope,
|
|
"createRequire() requires at least one argument"_s);
|
|
return JSC::JSValue::encode(JSC::jsUndefined());
|
|
}
|
|
|
|
auto str = callFrame->uncheckedArgument(0).toStringOrNull(globalObject);
|
|
RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
|
|
WTF::String val = str->value(globalObject);
|
|
auto *meta = Zig::ImportMetaObject::create(globalObject, str);
|
|
auto clientData = WebCore::clientData(vm);
|
|
auto requireFunction =
|
|
Zig::ImportMetaObject::createRequireFunction(vm, globalObject, val);
|
|
auto nameStr = jsCast<JSFunction *>(requireFunction)->name(vm);
|
|
JSC::JSBoundFunction *boundRequireFunction =
|
|
JSC::JSBoundFunction::create(vm, globalObject, requireFunction, meta,
|
|
nullptr, 0, jsString(vm, nameStr));
|
|
boundRequireFunction->putDirect(
|
|
vm, clientData->builtinNames().resolvePublicName(),
|
|
requireFunction->getDirect(
|
|
vm, clientData->builtinNames().resolvePublicName()),
|
|
0);
|
|
|
|
RELEASE_AND_RETURN(scope, JSValue::encode(boundRequireFunction));
|
|
}
|
|
JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModulePaths,
|
|
(JSC::JSGlobalObject * globalObject,
|
|
JSC::CallFrame *callFrame)) {
|
|
return JSC::JSValue::encode(JSC::JSArray::create(
|
|
globalObject->vm(),
|
|
globalObject->arrayStructureForIndexingTypeDuringAllocation(
|
|
ArrayWithContiguous),
|
|
0));
|
|
}
|
|
|
|
JSC_DEFINE_HOST_FUNCTION(jsFunctionFindSourceMap,
|
|
(JSGlobalObject * globalObject,
|
|
CallFrame *callFrame)) {
|
|
auto &vm = globalObject->vm();
|
|
auto scope = DECLARE_THROW_SCOPE(vm);
|
|
throwException(globalObject, scope,
|
|
createError(globalObject, "Not implemented"_s));
|
|
return JSValue::encode(jsUndefined());
|
|
}
|
|
|
|
JSC_DEFINE_HOST_FUNCTION(jsFunctionSyncBuiltinExports,
|
|
(JSGlobalObject * globalObject,
|
|
CallFrame *callFrame)) {
|
|
return JSValue::encode(jsUndefined());
|
|
}
|
|
|
|
JSC_DEFINE_HOST_FUNCTION(jsFunctionSourceMap, (JSGlobalObject * globalObject,
|
|
CallFrame *callFrame)) {
|
|
auto &vm = globalObject->vm();
|
|
auto scope = DECLARE_THROW_SCOPE(vm);
|
|
throwException(globalObject, scope,
|
|
createError(globalObject, "Not implemented"_s));
|
|
return JSValue::encode(jsUndefined());
|
|
}
|
|
|
|
JSC_DEFINE_HOST_FUNCTION(jsFunctionResolveFileName,
|
|
(JSC::JSGlobalObject * globalObject,
|
|
JSC::CallFrame *callFrame)) {
|
|
JSC::VM &vm = globalObject->vm();
|
|
|
|
switch (callFrame->argumentCount()) {
|
|
case 0: {
|
|
auto scope = DECLARE_THROW_SCOPE(globalObject->vm());
|
|
// not "requires" because "require" could be confusing
|
|
JSC::throwTypeError(
|
|
globalObject, scope,
|
|
"Module._resolveFileName needs 2+ arguments (a string)"_s);
|
|
scope.release();
|
|
return JSC::JSValue::encode(JSC::JSValue{});
|
|
}
|
|
default: {
|
|
JSC::JSValue moduleName = callFrame->argument(0);
|
|
|
|
if (moduleName.isUndefinedOrNull()) {
|
|
auto scope = DECLARE_THROW_SCOPE(globalObject->vm());
|
|
JSC::throwTypeError(globalObject, scope,
|
|
"Module._resolveFileName expects a string"_s);
|
|
scope.release();
|
|
return JSC::JSValue::encode(JSC::JSValue{});
|
|
}
|
|
|
|
auto result =
|
|
Bun__resolveSync(globalObject, JSC::JSValue::encode(moduleName),
|
|
JSValue::encode(callFrame->argument(1)), false);
|
|
auto scope = DECLARE_THROW_SCOPE(globalObject->vm());
|
|
|
|
if (!JSC::JSValue::decode(result).isString()) {
|
|
JSC::throwException(globalObject, scope, JSC::JSValue::decode(result));
|
|
return JSC::JSValue::encode(JSC::JSValue{});
|
|
}
|
|
|
|
scope.release();
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace Zig {
|
|
void generateNodeModuleModule(JSC::JSGlobalObject *globalObject,
|
|
JSC::Identifier moduleKey,
|
|
Vector<JSC::Identifier, 4> &exportNames,
|
|
JSC::MarkedArgumentBuffer &exportValues) {
|
|
JSC::VM &vm = globalObject->vm();
|
|
|
|
exportValues.append(JSFunction::create(
|
|
vm, globalObject, 1, String("createRequire"_s),
|
|
jsFunctionNodeModuleCreateRequire, ImplementationVisibility::Public));
|
|
exportValues.append(JSFunction::create(vm, globalObject, 1, String("paths"_s),
|
|
jsFunctionNodeModulePaths,
|
|
ImplementationVisibility::Public));
|
|
exportValues.append(JSFunction::create(
|
|
vm, globalObject, 1, String("findSourceMap"_s), jsFunctionFindSourceMap,
|
|
ImplementationVisibility::Public));
|
|
exportValues.append(JSFunction::create(
|
|
vm, globalObject, 0, String("syncBuiltinExports"_s),
|
|
jsFunctionSyncBuiltinExports, ImplementationVisibility::Public));
|
|
exportValues.append(
|
|
JSFunction::create(vm, globalObject, 1, String("SourceMap"_s),
|
|
jsFunctionSourceMap, ImplementationVisibility::Public,
|
|
NoIntrinsic, jsFunctionSourceMap, nullptr));
|
|
|
|
exportNames.append(JSC::Identifier::fromString(vm, "createRequire"_s));
|
|
exportNames.append(JSC::Identifier::fromString(vm, "paths"_s));
|
|
exportNames.append(JSC::Identifier::fromString(vm, "findSourceMap"_s));
|
|
exportNames.append(JSC::Identifier::fromString(vm, "syncBuiltinExports"_s));
|
|
exportNames.append(JSC::Identifier::fromString(vm, "SourceMap"_s));
|
|
|
|
// note: this is not technically correct
|
|
// it doesn't set process.mainModule
|
|
exportNames.append(JSC::Identifier::fromString(vm, "_resolveFileName"_s));
|
|
exportValues.append(JSFunction::create(
|
|
vm, globalObject, 3, String("_resolveFileName"_s),
|
|
jsFunctionResolveFileName, ImplementationVisibility::Public));
|
|
|
|
exportNames.append(JSC::Identifier::fromString(vm, "_nodeModulePaths"_s));
|
|
exportValues.append(JSFunction::create(
|
|
vm, globalObject, 0, String("_nodeModulePaths"_s),
|
|
jsFunctionNodeModulePaths, ImplementationVisibility::Public));
|
|
|
|
exportNames.append(JSC::Identifier::fromString(vm, "_cache"_s));
|
|
exportValues.append(JSC::constructEmptyObject(globalObject));
|
|
|
|
exportNames.append(JSC::Identifier::fromString(vm, "builtinModules"_s));
|
|
|
|
JSC::JSArray *builtinModules = JSC::JSArray::create(
|
|
vm,
|
|
globalObject->arrayStructureForIndexingTypeDuringAllocation(
|
|
ArrayWithContiguous),
|
|
7);
|
|
builtinModules->putDirectIndex(globalObject, 0,
|
|
JSC::jsString(vm, String("node:assert"_s)));
|
|
builtinModules->putDirectIndex(globalObject, 1,
|
|
JSC::jsString(vm, String("node:buffer"_s)));
|
|
builtinModules->putDirectIndex(globalObject, 2,
|
|
JSC::jsString(vm, String("node:events"_s)));
|
|
builtinModules->putDirectIndex(globalObject, 3,
|
|
JSC::jsString(vm, String("node:util"_s)));
|
|
builtinModules->putDirectIndex(globalObject, 4,
|
|
JSC::jsString(vm, String("node:path"_s)));
|
|
builtinModules->putDirectIndex(globalObject, 5,
|
|
JSC::jsString(vm, String("bun:ffi"_s)));
|
|
builtinModules->putDirectIndex(globalObject, 6,
|
|
JSC::jsString(vm, String("bun:sqlite"_s)));
|
|
exportValues.append(builtinModules);
|
|
}
|
|
} // namespace Zig
|