diff options
-rw-r--r-- | src/bun.js/builtins/js/ImportMetaObject.js | 17 | ||||
-rw-r--r-- | test/bun.js/react-dom.test.tsx | 12 |
2 files changed, 24 insertions, 5 deletions
diff --git a/src/bun.js/builtins/js/ImportMetaObject.js b/src/bun.js/builtins/js/ImportMetaObject.js index bb08bb107..40e60ed22 100644 --- a/src/bun.js/builtins/js/ImportMetaObject.js +++ b/src/bun.js/builtins/js/ImportMetaObject.js @@ -66,14 +66,20 @@ function require(name) { function loadModule(meta, resolvedSpecifier) { "use strict"; - var Loader = globalThis.Loader; var queue = @createFIFO(); var key = resolvedSpecifier; - var registry = Loader.registry; while (key) { - @fulfillModuleSync(key); - var entry = registry.@get(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); + + if (!entry || entry.state <= @ModuleFetch) { + @fulfillModuleSync(key); + entry = Loader.registry.@get(key); + } + // entry.fetch is a Promise<SourceCode> // SourceCode is not a string, it's a JSC::SourceCode object @@ -147,9 +153,10 @@ function loadModule(meta, resolvedSpecifier) { entry.dependencies = dependencies; key = queue.shift(); - while (key && (registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) { + while (key && (Loader.registry.@get(key)?.state ?? @ModuleFetch) >= @ModuleLink) { key = queue.shift(); } + } var linkAndEvaluateResult = Loader.linkAndEvaluateModule( diff --git a/test/bun.js/react-dom.test.tsx b/test/bun.js/react-dom.test.tsx index 6c7884073..d204e88e0 100644 --- a/test/bun.js/react-dom.test.tsx +++ b/test/bun.js/react-dom.test.tsx @@ -11,6 +11,7 @@ import { describe, expect, it } from "bun:test"; import { renderToReadableStream as renderToReadableStreamBrowser } from "react-dom/server.browser"; import { gc } from "./gc"; import { renderToReadableStream as renderToReadableStreamBun } from "./reactdom-bun"; +import React from "react"; Object.defineProperty(renderToReadableStreamBrowser, "name", { value: "server.browser", @@ -88,6 +89,17 @@ const fixtures = [ ], ]; +describe("React", () => { + it("React.createContext works", () => { + expect(typeof React.createContext).toBe("function"); + const pleaseDontThrow = React.createContext({ foo: true }); + expect(pleaseDontThrow.$$typeof.description).toBe("react.context"); + + const pleaseDontThrow2 = React.default.createContext({ foo: true }); + expect(pleaseDontThrow2.$$typeof.description).toBe("react.context"); + }); +}); + describe("ReactDOM", () => { for (let renderToReadableStream of [ renderToReadableStreamBun, |