aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/builtins/js/ImportMetaObject.js
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-04 00:54:21 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-04 00:54:21 -0700
commit1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1 (patch)
tree2b2a508df2219037460dbde31ed0d6df9bc9adb0 /src/bun.js/builtins/js/ImportMetaObject.js
parentef268c5ee5d6e873d5f1d61c95d74d93c6f1cc80 (diff)
downloadbun-1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1.tar.gz
bun-1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1.tar.zst
bun-1112eb75e3bbc4b8afa1c12f7fd06ca3122878a1.zip
`[node:module]` Implement `_resolveFileName`, stub `_nodeModulePaths` & `_cache`
Closes https://github.com/oven-sh/bun/issues/1111
Diffstat (limited to 'src/bun.js/builtins/js/ImportMetaObject.js')
-rw-r--r--src/bun.js/builtins/js/ImportMetaObject.js110
1 files changed, 55 insertions, 55 deletions
diff --git a/src/bun.js/builtins/js/ImportMetaObject.js b/src/bun.js/builtins/js/ImportMetaObject.js
index ce28775c2..f7fad3344 100644
--- a/src/bun.js/builtins/js/ImportMetaObject.js
+++ b/src/bun.js/builtins/js/ImportMetaObject.js
@@ -23,61 +23,22 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-function require(name) {
- "use strict";
- if (typeof name !== "string") {
- @throwTypeError("require() expects a string as its argument");
- }
-
- const resolved = this.resolveSync(name, this.path);
- var cached = @requireMap.@get(resolved);
- const last5 = resolved.substring(resolved.length - 5);
- if (cached) {
- if (last5 === ".node") {
- return cached.exports;
- }
-
- return cached;
- }
-
-
- // TODO: remove this hardcoding
- if (last5 === ".json") {
- var fs = (globalThis[Symbol.for("_fs")] ||= Bun.fs());
- var exports = JSON.parse(fs.readFileSync(resolved, "utf8"));
- @requireMap.@set(resolved, exports);
- return exports;
- } else if (last5 === ".node") {
- var module = { exports: {} };
- globalThis.process.dlopen(module, resolved);
- @requireMap.@set(resolved, module);
- return module.exports;
- } else if (last5 === ".toml") {
- var fs = (globalThis[Symbol.for("_fs")] ||= Bun.fs());
- var exports = Bun.TOML.parse(fs.readFileSync(resolved, "utf8"));
- @requireMap.@set(resolved, exports);
- return exports;
- } else {
- var exports = this.requireModule(this, resolved);
- @requireMap.@set(resolved, exports);
- return exports;
- }
-}
-function loadModule(meta, resolvedSpecifier) {
+function loadCJS2ESM(resolvedSpecifier) {
"use strict";
+ var loader = @Loader;
var queue = @createFIFO();
var key = resolvedSpecifier;
while (key) {
// we need to explicitly check because state could be @ModuleFetch
// it will throw this error if we do not:
// @throwTypeError("Requested module is already fetched.");
- var entry = Loader.registry.@get(key);
+ var entry = loader.registry.@get(key);
if (!entry || !entry.state || entry.state <= @ModuleFetch) {
@fulfillModuleSync(key);
- entry = Loader.registry.@get(key);
+ entry = loader.registry.@get(key);
}
@@ -92,7 +53,7 @@ function loadModule(meta, resolvedSpecifier) {
// parseModule() returns a Promise, but the value is already fulfilled
// so we just pull it out of the promise here once again
// But, this time we do it a little more carefully because this is a JSC function call and not bun source code
- var moduleRecordPromise = Loader.parseModule(key, sourceCodeObject);
+ var moduleRecordPromise = loader.parseModule(key, sourceCodeObject);
var module = entry.module;
if (!module && moduleRecordPromise && @isPromise(moduleRecordPromise)) {
var reactionsOrResult = @getPromiseInternalField(
@@ -127,7 +88,7 @@ function loadModule(meta, resolvedSpecifier) {
// This is very similar to "requestInstantiate" in ModuleLoader.js in JavaScriptCore.
@setStateToMax(entry, @ModuleLink);
var dependenciesMap = module.dependenciesMap;
- var requestedModules = Loader.requestedModules(module);
+ var requestedModules = loader.requestedModules(module);
var dependencies = @newArrayWithSize(requestedModules.length);
for (var i = 0, length = requestedModules.length; i < length; ++i) {
var depName = requestedModules[i];
@@ -136,8 +97,8 @@ function loadModule(meta, resolvedSpecifier) {
var depKey =
depName[0] === "/"
? depName
- : Loader.resolve(depName, key, @undefined);
- var depEntry = Loader.ensureRegistered(depKey);
+ : loader.resolve(depName, key, @undefined);
+ var depEntry = loader.ensureRegistered(depKey);
if (depEntry.state < @ModuleLink) {
queue.push(depKey);
}
@@ -151,13 +112,13 @@ function loadModule(meta, resolvedSpecifier) {
entry.instantiate = @Promise.resolve(entry)
entry.satisfy = @Promise.resolve(entry);
key = queue.shift();
- while (key && (Loader.registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) {
+ while (key && (loader.registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) {
key = queue.shift();
}
}
- var linkAndEvaluateResult = Loader.linkAndEvaluateModule(
+ var linkAndEvaluateResult = loader.linkAndEvaluateModule(
resolvedSpecifier,
@undefined
);
@@ -169,26 +130,65 @@ function loadModule(meta, resolvedSpecifier) {
);
}
- return Loader.registry.@get(resolvedSpecifier);
+ return loader.registry.@get(resolvedSpecifier);
}
-function requireModule(meta, resolved) {
+
+function requireESM(resolved) {
"use strict";
- var Loader = globalThis.Loader;
- var entry = Loader.registry.@get(resolved);
+ var entry = @Loader.registry.@get(resolved);
if (!entry || !entry.evaluated) {
- entry = this.loadModule(meta, resolved);
+ entry = @loadCJS2ESM(resolved);
}
if (!entry || !entry.evaluated || !entry.module) {
@throwTypeError(`require() failed to evaluate module \"${resolved}\". This is an internal consistentency error.`);
}
- var exports = Loader.getModuleNamespaceObject(entry.module);
+ var exports = @Loader.getModuleNamespaceObject(entry.module);
var commonJS = exports.default;
if (commonJS && @isObject(commonJS) && @commonJSSymbol in commonJS) {
return commonJS();
}
return exports;
}
+
+function require(name) {
+ "use strict";
+ if (typeof name !== "string") {
+ @throwTypeError("require() expects a string as its argument");
+ }
+ const resolved = @resolveSync(name, this.path);
+ var cached = @requireMap.@get(resolved);
+ const last5 = resolved.substring(resolved.length - 5);
+ if (cached) {
+ if (last5 === ".node") {
+ return cached.exports;
+ }
+
+ return cached;
+ }
+
+ // TODO: remove this hardcoding
+ if (last5 === ".json") {
+ var fs = (globalThis[Symbol.for("_fs")] ||= @Bun.fs());
+ var exports = JSON.parse(fs.readFileSync(resolved, "utf8"));
+ @requireMap.@set(resolved, exports);
+ return exports;
+ } else if (last5 === ".node") {
+ var module = { exports: {} };
+ process.dlopen(module, resolved);
+ @requireMap.@set(resolved, module);
+ return module.exports;
+ } else if (last5 === ".toml") {
+ var fs = (globalThis[Symbol.for("_fs")] ||= @Bun.fs());
+ var exports = @Bun.TOML.parse(fs.readFileSync(resolved, "utf8"));
+ @requireMap.@set(resolved, exports);
+ return exports;
+ } else {
+ var exports = @requireESM(resolved);
+ @requireMap.@set(resolved, exports);
+ return exports;
+ }
+} \ No newline at end of file