aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/modules/NodeModuleModule.cpp
blob: 319d18478908bb41135eea177b8791dd8e5dad24 (plain) (blame)
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