diff options
Diffstat (limited to 'src/js')
-rw-r--r-- | src/js/builtins.d.ts | 2 | ||||
-rw-r--r-- | src/js/builtins/Module.ts | 15 | ||||
-rw-r--r-- | src/js/out/WebCoreJSBuiltins.cpp | 12 | ||||
-rw-r--r-- | src/js/out/WebCoreJSBuiltins.h | 11 | ||||
-rw-r--r-- | src/js/private.d.ts | 2 |
5 files changed, 35 insertions, 7 deletions
diff --git a/src/js/builtins.d.ts b/src/js/builtins.d.ts index ee7bd68cf..99bf4d98e 100644 --- a/src/js/builtins.d.ts +++ b/src/js/builtins.d.ts @@ -438,7 +438,7 @@ declare function $createCommonJSModule( id: string, exports: any, hasEvaluated: boolean, - parent: CommonJSModuleRecord, + parent: CommonJSModuleRecord | undefined, ): CommonJSModuleRecord; declare function $overridableRequire(this: CommonJSModuleRecord, id: string): any; diff --git a/src/js/builtins/Module.ts b/src/js/builtins/Module.ts index b074d3488..3c9c2f1a0 100644 --- a/src/js/builtins/Module.ts +++ b/src/js/builtins/Module.ts @@ -9,7 +9,7 @@ export function require(this: CommonJSModuleRecord, id: string) { // overridableRequire can be overridden by setting `Module.prototype.require` export function overridableRequire(this: CommonJSModuleRecord, id: string) { - const existing = $requireMap.$get(id) || $requireMap.$get((id = $resolveSync(id, this.path, false))); + const existing = $requireMap.$get(id) || $requireMap.$get((id = $resolveSync(id, this?.path ?? ".", false))); if (existing) { // Scenario where this is necessary: // @@ -46,8 +46,7 @@ export function overridableRequire(this: CommonJSModuleRecord, id: string) { // // Note: we do not need to wrap this in a try/catch, if it throws the C++ code will // clear the module from the map. - // - var out = this.$require(id, mod); + var out = mod.$require(id, this?.id); // -1 means we need to lookup the module from the ESM registry. if (out === -1) { @@ -86,3 +85,13 @@ export function requireNativeModule(id: string) { } return $requireESM(id).default; } + +/** require('node:module')._load */ +export function moduleLoad(request: string, parentPath: CommonJSModuleRecord, isMain: string) { + // TODO: `isMain` does four things in node + // - sets `process.mainModule` + // - sets `module.require.main` + // - sets `module.id` to "." + // - would pass true to the third argument of _resolveFilename if overridden + return $overridableRequire.$call(parentPath, request); +} diff --git a/src/js/out/WebCoreJSBuiltins.cpp b/src/js/out/WebCoreJSBuiltins.cpp index 31246276b..1cea1826b 100644 --- a/src/js/out/WebCoreJSBuiltins.cpp +++ b/src/js/out/WebCoreJSBuiltins.cpp @@ -786,13 +786,21 @@ const int s_moduleMainCodeLength = 68; static const JSC::Intrinsic s_moduleMainCodeIntrinsic = JSC::NoIntrinsic; const char* const s_moduleMainCode = "(function () {\"use strict\";\n return @requireMap.@get(Bun.main);\n})\n"; +// moduleLoad +const JSC::ConstructAbility s_moduleModuleLoadCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; +const JSC::ConstructorKind s_moduleModuleLoadCodeConstructorKind = JSC::ConstructorKind::None; +const JSC::ImplementationVisibility s_moduleModuleLoadCodeImplementationVisibility = JSC::ImplementationVisibility::Public; +const int s_moduleModuleLoadCodeLength = 115; +static const JSC::Intrinsic s_moduleModuleLoadCodeIntrinsic = JSC::NoIntrinsic; +const char* const s_moduleModuleLoadCode = "(function (request, parentPath, isMain) {\"use strict\";\n return @overridableRequire.@call(parentPath, request);\n})\n"; + // overridableRequire const JSC::ConstructAbility s_moduleOverridableRequireCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_moduleOverridableRequireCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_moduleOverridableRequireCodeImplementationVisibility = JSC::ImplementationVisibility::Public; -const int s_moduleOverridableRequireCodeLength = 888; +const int s_moduleOverridableRequireCodeLength = 900; static const JSC::Intrinsic s_moduleOverridableRequireCodeIntrinsic = JSC::NoIntrinsic; -const char* const s_moduleOverridableRequireCode = "(function (id) {\"use strict\";\n const existing = @requireMap.@get(id) || @requireMap.@get(id = @resolveSync(id, this.path, !1));\n if (existing)\n return @evaluateCommonJSModule(existing), existing.exports;\n if (id.endsWith(\".node\"))\n return @internalRequire(id);\n const mod = @createCommonJSModule(id, {}, !1, this);\n @requireMap.@set(id, mod);\n var out = this.@require(id, mod);\n if (out === -1) {\n try {\n out = @requireESM(id);\n } catch (exception) {\n throw @requireMap.@delete(id), exception;\n }\n const esm = @Loader.registry.@get(id);\n if (esm\?.evaluated && (esm.state \?\? 0) >= @ModuleReady) {\n const namespace = @Loader.getModuleNamespaceObject(esm.module);\n return mod.exports = namespace.__esModule \? namespace : Object.create(namespace, { __esModule: { value: !0 } });\n }\n }\n return @evaluateCommonJSModule(mod), mod.exports;\n})\n"; +const char* const s_moduleOverridableRequireCode = "(function (id) {\"use strict\";\n const existing = @requireMap.@get(id) || @requireMap.@get(id = @resolveSync(id, this\?.path \?\? \".\", !1));\n if (existing)\n return @evaluateCommonJSModule(existing), existing.exports;\n if (id.endsWith(\".node\"))\n return @internalRequire(id);\n const mod = @createCommonJSModule(id, {}, !1, this);\n @requireMap.@set(id, mod);\n var out = mod.@require(id, this\?.id);\n if (out === -1) {\n try {\n out = @requireESM(id);\n } catch (exception) {\n throw @requireMap.@delete(id), exception;\n }\n const esm = @Loader.registry.@get(id);\n if (esm\?.evaluated && (esm.state \?\? 0) >= @ModuleReady) {\n const namespace = @Loader.getModuleNamespaceObject(esm.module);\n return mod.exports = namespace.__esModule \? namespace : Object.create(namespace, { __esModule: { value: !0 } });\n }\n }\n return @evaluateCommonJSModule(mod), mod.exports;\n})\n"; // require const JSC::ConstructAbility s_moduleRequireCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; diff --git a/src/js/out/WebCoreJSBuiltins.h b/src/js/out/WebCoreJSBuiltins.h index 3c6ade197..5b8c0b267 100644 --- a/src/js/out/WebCoreJSBuiltins.h +++ b/src/js/out/WebCoreJSBuiltins.h @@ -1506,6 +1506,14 @@ extern const JSC::ConstructAbility s_moduleMainCodeConstructAbility; extern const JSC::ConstructorKind s_moduleMainCodeConstructorKind; extern const JSC::ImplementationVisibility s_moduleMainCodeImplementationVisibility; +// moduleLoad +#define WEBCORE_BUILTIN_MODULE_MODULELOAD 1 +extern const char* const s_moduleModuleLoadCode; +extern const int s_moduleModuleLoadCodeLength; +extern const JSC::ConstructAbility s_moduleModuleLoadCodeConstructAbility; +extern const JSC::ConstructorKind s_moduleModuleLoadCodeConstructorKind; +extern const JSC::ImplementationVisibility s_moduleModuleLoadCodeImplementationVisibility; + // overridableRequire #define WEBCORE_BUILTIN_MODULE_OVERRIDABLEREQUIRE 1 extern const char* const s_moduleOverridableRequireCode; @@ -1540,6 +1548,7 @@ extern const JSC::ImplementationVisibility s_moduleRequireResolveCodeImplementat #define WEBCORE_FOREACH_MODULE_BUILTIN_DATA(macro) \ macro(main, moduleMain, 0) \ + macro(moduleLoad, moduleModuleLoad, 3) \ macro(overridableRequire, moduleOverridableRequire, 1) \ macro(require, moduleRequire, 1) \ macro(requireNativeModule, moduleRequireNativeModule, 1) \ @@ -1547,6 +1556,7 @@ extern const JSC::ImplementationVisibility s_moduleRequireResolveCodeImplementat #define WEBCORE_FOREACH_MODULE_BUILTIN_CODE(macro) \ macro(moduleMainCode, main, "get main"_s, s_moduleMainCodeLength) \ + macro(moduleModuleLoadCode, moduleLoad, ASCIILiteral(), s_moduleModuleLoadCodeLength) \ macro(moduleOverridableRequireCode, overridableRequire, ASCIILiteral(), s_moduleOverridableRequireCodeLength) \ macro(moduleRequireCode, require, ASCIILiteral(), s_moduleRequireCodeLength) \ macro(moduleRequireNativeModuleCode, requireNativeModule, ASCIILiteral(), s_moduleRequireNativeModuleCodeLength) \ @@ -1554,6 +1564,7 @@ extern const JSC::ImplementationVisibility s_moduleRequireResolveCodeImplementat #define WEBCORE_FOREACH_MODULE_BUILTIN_FUNCTION_NAME(macro) \ macro(main) \ + macro(moduleLoad) \ macro(overridableRequire) \ macro(require) \ macro(requireNativeModule) \ diff --git a/src/js/private.d.ts b/src/js/private.d.ts index 77f4d5536..2ca8d630f 100644 --- a/src/js/private.d.ts +++ b/src/js/private.d.ts @@ -215,7 +215,7 @@ interface BunLazyModules { declare var $exports: any; interface CommonJSModuleRecord { - $require(id: string, mod: any): any; + $require(this: CommonJSModuleRecord, id: string, parent: string | undefined): any; children: CommonJSModuleRecord[]; exports: any; id: string; |