From acc1be1a0c210d160b4600783c6d98ce2755df66 Mon Sep 17 00:00:00 2001 From: X Date: Sun, 29 Jan 2023 01:41:06 +0800 Subject: [PATCH] Fix fake module export names resolving (close #510) --- server/esm.go | 15 +++++++++++++-- test/react-18-stream/deno.json | 8 ++++++++ test/react-18-stream/react-steam.test.tsx | 18 ++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 test/react-18-stream/deno.json create mode 100644 test/react-18-stream/react-steam.test.tsx diff --git a/server/esm.go b/server/esm.go index a92225d49..faa7d74ad 100644 --- a/server/esm.go +++ b/server/esm.go @@ -173,8 +173,20 @@ func initModule(wd string, pkg Pkg, target string, isDev bool) (esm *ESM, npm Np return } - log.Warnf("fake ES module '%s' of '%s', use the `main` field instead", npm.Module, npm.Name) + var ret cjsExportsResult + ret, err = parseCJSModuleExports(wd, path.Join(wd, "node_modules", pkg.Name, modulePath), nodeEnv) + if err == nil && ret.Error != "" { + err = fmt.Errorf("parseCJSModuleExports: %s", ret.Error) + } + if err != nil { + return + } + npm.Main = npm.Module npm.Module = "" + esm.ExportDefault = ret.ExportDefault + esm.Exports = ret.Exports + log.Warnf("fake ES module '%s' of '%s'", npm.Main, npm.Name) + return } if npm.Main != "" { @@ -189,7 +201,6 @@ func initModule(wd string, pkg Pkg, target string, isDev bool) (esm *ESM, npm Np esm.ExportDefault = ret.ExportDefault esm.Exports = ret.Exports } - return } diff --git a/test/react-18-stream/deno.json b/test/react-18-stream/deno.json new file mode 100644 index 000000000..72517779f --- /dev/null +++ b/test/react-18-stream/deno.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "lib": [ + "dom", + "deno.ns" + ] + } +} \ No newline at end of file diff --git a/test/react-18-stream/react-steam.test.tsx b/test/react-18-stream/react-steam.test.tsx new file mode 100644 index 000000000..a8dcf3c36 --- /dev/null +++ b/test/react-18-stream/react-steam.test.tsx @@ -0,0 +1,18 @@ +import { assertStringIncludes } from "https://deno.land/std@0.170.0/testing/asserts.ts"; + +import React from "http://localhost:8080/react@18"; +import { renderToReadableStream } from "http://localhost:8080/react-dom@18/server"; + +Deno.test("react-18-stream", async () => { + const res = new Response( + await renderToReadableStream( +
+

Hi :)

+
, + ), + ); + const html = await res.text(); + assertStringIncludes(html, "Hi :)"); + assertStringIncludes(html, ""); +});