1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#include "root.h"
#include "./NodeModuleModule.h"
#include "ImportMetaObject.h"
#include "JavaScriptCore/JSBoundFunction.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());
}
Zig::ImportMetaObject *importMetaObject = Zig::ImportMetaObject::create(
globalObject, callFrame->uncheckedArgument(0));
auto clientData = WebCore::clientData(vm);
RETURN_IF_EXCEPTION(scope, {});
if (!importMetaObject) {
throwTypeError(globalObject, scope, "Invalid path"_s);
return JSC::JSValue::encode(JSC::jsUndefined());
}
auto requireFunctionValue = importMetaObject->get(
globalObject, clientData->builtinNames().requirePublicName());
RETURN_IF_EXCEPTION(scope, {});
JSC::JSBoundFunction *boundRequireFunction = JSC::JSBoundFunction::create(
vm, globalObject, requireFunctionValue.getObject(), importMetaObject,
nullptr, 1, jsString(vm, String("require"_s)));
RETURN_IF_EXCEPTION(scope, {});
auto resolveFunction = importMetaObject->get(
globalObject, clientData->builtinNames().resolveSyncPublicName());
JSC::JSBoundFunction *boundResolveFunction = JSC::JSBoundFunction::create(
vm, globalObject, resolveFunction.getObject(), importMetaObject, nullptr,
1, jsString(vm, String("resolve"_s)));
boundRequireFunction->putDirect(
vm, clientData->builtinNames().resolvePublicName(), boundResolveFunction,
JSC::PropertyAttribute::Function | 0);
RELEASE_AND_RETURN(scope, JSC::JSValue::encode(boundRequireFunction));
}
JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModulePaths,
(JSC::JSGlobalObject * globalObject,
JSC::CallFrame *callFrame)) {
return JSC::JSValue::encode(JSC::JSArray::create(globalObject->vm(), 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());
}
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));
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
|