From 70f4c88a0e60ae5b5aeec57b58bd89b28a663b1e Mon Sep 17 00:00:00 2001 From: Je Xia Date: Thu, 19 Dec 2024 09:26:56 +0800 Subject: [PATCH] Fix x script (#954) --- Makefile | 4 ++-- cli/cmd/main.go | 10 ++++---- cli/run.go | 47 ------------------------------------- cli/{server.go => serve.go} | 36 ++++++++++++++++++++++++++++ server/embed/x.ts | 13 +++++----- 5 files changed, 49 insertions(+), 61 deletions(-) delete mode 100644 cli/run.go rename cli/{server.go => serve.go} (97%) diff --git a/Makefile b/Makefile index 54a7a0c22..54da39f69 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -cli/run: - @DEBUG=1 go run cli/cmd/main.go run cli/cmd/demo/${app} +cli/serv: + @DEBUG=1 go run cli/cmd/main.go serve cli/cmd/demo/${app} serv: config.json @rm -rf .esmd/storage diff --git a/cli/cmd/main.go b/cli/cmd/main.go index 0805c7203..9c3563652 100644 --- a/cli/cmd/main.go +++ b/cli/cmd/main.go @@ -13,9 +13,9 @@ const helpMessage = "\033[30mesm.sh - The no-build CDN for modern web developmen Usage: esm.sh [command] [options] Commands: - add Add NPM packages to the "importmap" script - init Create a new esm.sh web app - run Serve an esm.sh web app + add Add NPM packages to the "importmap" script + init Create a new esm.sh web app + serve Serve an esm.sh web app ` //go:embed internal @@ -29,8 +29,8 @@ func main() { cli.Init(&efs) case "add": cli.Add() - case "run": - cli.Run(&efs) + case "serve": + cli.Serve(&efs) default: fmt.Print(helpMessage) } diff --git a/cli/run.go b/cli/run.go deleted file mode 100644 index b5e645782..000000000 --- a/cli/run.go +++ /dev/null @@ -1,47 +0,0 @@ -package cli - -import ( - "embed" - "flag" - "fmt" - "net" - "net/http" - "os" - "path/filepath" - - "github.com/ije/gox/term" -) - -func Run(efs *embed.FS) (err error) { - port := flag.Int("port", 3000, "port to serve on") - rootDir, _ := parseCommandFlag() - - if rootDir == "" { - rootDir, err = os.Getwd() - } else { - rootDir, err = filepath.Abs(rootDir) - if err == nil { - var fi os.FileInfo - fi, err = os.Stat(rootDir) - if err == nil && !fi.IsDir() { - err = fmt.Errorf("stat %s: not a directory", rootDir) - } - } - } - if err != nil { - os.Stderr.WriteString(term.Red(err.Error())) - return err - } - - serv := &http.Server{ - Addr: fmt.Sprintf(":%d", *port), - Handler: &DevServer{efs: efs, rootDir: rootDir}, - } - ln, err := net.Listen("tcp", serv.Addr) - if err != nil { - os.Stderr.WriteString(term.Red(err.Error())) - return err - } - fmt.Printf(term.Green("Server is ready on http://localhost:%d\n"), *port) - return serv.Serve(ln) -} diff --git a/cli/server.go b/cli/serve.go similarity index 97% rename from cli/server.go rename to cli/serve.go index 61e0c6fa7..09851de1a 100644 --- a/cli/server.go +++ b/cli/serve.go @@ -6,8 +6,10 @@ import ( "encoding/hex" "encoding/json" "errors" + "flag" "fmt" "io" + "net" "net/http" "net/url" "os" @@ -25,6 +27,40 @@ import ( "golang.org/x/net/html" ) +func Serve(efs *embed.FS) (err error) { + port := flag.Int("port", 3000, "port to serve on") + rootDir, _ := parseCommandFlag() + + if rootDir == "" { + rootDir, err = os.Getwd() + } else { + rootDir, err = filepath.Abs(rootDir) + if err == nil { + var fi os.FileInfo + fi, err = os.Stat(rootDir) + if err == nil && !fi.IsDir() { + err = fmt.Errorf("stat %s: not a directory", rootDir) + } + } + } + if err != nil { + os.Stderr.WriteString(term.Red(err.Error())) + return err + } + + serv := &http.Server{ + Addr: fmt.Sprintf(":%d", *port), + Handler: &DevServer{efs: efs, rootDir: rootDir}, + } + ln, err := net.Listen("tcp", serv.Addr) + if err != nil { + os.Stderr.WriteString(term.Red(err.Error())) + return err + } + fmt.Printf(term.Green("Server is ready on http://localhost:%d\n"), *port) + return serv.Serve(ln) +} + type DevServer struct { efs *embed.FS loader *LoaderWorker diff --git a/server/embed/x.ts b/server/embed/x.ts index 4082bd83a..34c81145b 100644 --- a/server/embed/x.ts +++ b/server/embed/x.ts @@ -1,32 +1,31 @@ /*! 🚀 esm.sh/x - ts/jsx/vue/svelte just works™️ in browser. */ ((document) => { - const $ = document.querySelector; + const $: typeof document.querySelector = (s: string) => document.querySelector(s); const currentScript = document.currentScript as HTMLScriptElement | null; const modUrl = currentScript?.src || import.meta.url; - const { hostname, href, pathname } = location; + const { hostname, href, pathname, origin } = location; // import the `main` module from esm.sh if it's provided. - // e.g. - const el = currentScript ?? $("script[type=module][src='" + modUrl + "'][main]"); + // e.g. + const el = currentScript ?? $("script[type=module][main][src='" + modUrl + "']"); if (el) { const main = el.getAttribute("main"); if (main) { if (hostname === "localhost" || hostname === "127.0.0.1" || /^192\.168\.\d+\.\d+$/.test(hostname)) { - alert("Please serve your app with `esm.sh run` for local development."); + alert("Please serve your app with `esm.sh serve` for local development."); return; } const mainUrl = new URL(main, href); const q = mainUrl.searchParams; const v = $("meta[name=version]")?.content; - mainUrl.search = ""; if ($("script[type=importmap]")) { q.set("im", btoa(pathname).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "")); } if (v) { q.set("v", v); } - import(new URL(modUrl).origin + "/" + mainUrl); + import(mainUrl.origin === origin ? new URL(modUrl).origin + "/" + mainUrl : "" + mainUrl); } } })(document);