Skip to content

Commit f3f8d1a

Browse files
committed
Compress npm polyfills
1 parent 1ad4421 commit f3f8d1a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+101
-113
lines changed

scripts/update-nodelibs.sh renamed to scripts/update-node-libs.sh

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
tag="2.0.1"
44
dlUrl="https://codeload.github.com/jspm/jspm-core/tar.gz/refs/tags/${tag}"
55

6+
cd $(dirname $0)
67
curl -o "jspm-core-${tag}.tar.gz" $dlUrl
78
tar -xzf jspm-core-${tag}.tar.gz
8-
cd jspm-core-${tag}/nodelibs
9-
rm -rf node
10-
mv browser node
11-
tar -czf nodelibs.tar.gz node
12-
mv nodelibs.tar.gz ../../server/embed/nodelibs.tar.gz
13-
cd ../../
9+
mv jspm-core-${tag}/nodelibs/browser node
10+
tar -czf node-libs.tar.gz node
11+
mv node-libs.tar.gz ../server/embed/node-libs.tar.gz
1412
rm -rf jspm-core-${tag}
15-
rm -rf jspm-core-${tag}.tar.gz
13+
rm -rf node
14+
rm -f jspm-core-${tag}.tar.gz

scripts/update-npm-polyfills.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
3+
tag="0.0.1"
4+
dlUrl="https://codeload.github.com/esm-dev/esm-npm-polyfills/tar.gz/refs/tags/${tag}"
5+
6+
cd $(dirname $0)
7+
curl -o "esm-npm-polyfills-${tag}.tar.gz" $dlUrl
8+
mv "esm-npm-polyfills-${tag}.tar.gz" ../server/embed/npm-polyfills.tar.gz

server/build.go

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -427,15 +427,12 @@ func (ctx *BuildContext) buildModule() (result BuildResult, err error) {
427427
}
428428
}
429429

430-
if specifier != "node-fetch" && args.Kind != api.ResolveJSRequireCall && args.Kind != api.ResolveJSRequireResolve {
431-
data, err := embedFS.ReadFile(("server/embed/polyfills/npm_" + specifier + ".js"))
432-
if err == nil {
433-
return api.OnResolveResult{
434-
Path: args.Path,
435-
PluginData: data,
436-
Namespace: "purge-polyfill",
437-
}, nil
438-
}
430+
if data, ok := npmPolyfills[specifier]; ok && args.Kind == api.ResolveJSImportStatement {
431+
return api.OnResolveResult{
432+
Path: args.Path,
433+
PluginData: data,
434+
Namespace: "purge-polyfill",
435+
}, nil
439436
}
440437

441438
// resolve specifier with package `browser` field

server/build_resolver.go

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package server
22

33
import (
4-
"bytes"
54
"crypto/sha1"
65
"encoding/base64"
76
"encoding/hex"
@@ -776,20 +775,13 @@ func (ctx *BuildContext) resolveExternalModule(specifier string, kind api.Resolv
776775
}
777776

778777
// replace some npm polyfills with native APIs
779-
780-
if specifier == "node-fetch" {
781-
if ctx.target != "node" {
782-
resolvedPath = "/npm_node-fetch.js"
783-
return
784-
}
785-
} else {
786-
data, err := embedFS.ReadFile(("server/embed/polyfills/npm_" + specifier + ".js"))
787-
if err == nil {
788-
data = bytes.ReplaceAll(data, []byte{';', '\n'}, []byte{';'})
789-
data = bytes.TrimSuffix(data, []byte{';'})
790-
resolvedPath = fmt.Sprintf("data:text/javascript;base64,%s", base64.StdEncoding.EncodeToString(data))
791-
return
792-
}
778+
if data, ok := npmPolyfills[specifier]; ok {
779+
resolvedPath = fmt.Sprintf("data:text/javascript;base64,%s", base64.StdEncoding.EncodeToString(data))
780+
return
781+
}
782+
if specifier == "node-fetch" && ctx.target != "node" {
783+
resolvedPath = "/npm_node-fetch.js"
784+
return
793785
}
794786

795787
// common npm dependency
@@ -1112,7 +1104,7 @@ func (ctx *BuildContext) cjsLexer(specifier string) (cjs cjsLexerResult, err err
11121104
}
11131105

11141106
func (ctx *BuildContext) esmLexer(specifier string) (isESM bool, namedExports []string, err error) {
1115-
isESM, namedExports, err = validateJS(path.Join(ctx.wd, "node_modules", ctx.pkg.Name, specifier))
1107+
isESM, namedExports, err = validateJSFile(path.Join(ctx.wd, "node_modules", ctx.pkg.Name, specifier))
11161108
if err != nil {
11171109
err = fmt.Errorf("esmLexer: %v", err)
11181110
}
@@ -1189,7 +1181,7 @@ func normalizeBuildEntry(ctx *BuildContext, entry *BuildEntry) {
11891181
}
11901182
// check if the cjs entry is an ESM
11911183
if entry.cjs != "" && strings.HasSuffix(entry.cjs, ".js") {
1192-
isESM, _, _ := validateJS(path.Join(ctx.pkgDir, entry.cjs))
1184+
isESM, _, _ := validateJSFile(path.Join(ctx.pkgDir, entry.cjs))
11931185
if isESM {
11941186
if entry.esm == "" {
11951187
entry.esm = entry.cjs

server/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"strings"
1111
)
1212

13+
// Config represents the configuration of esm.sh server.
1314
type Config struct {
1415
Port uint16 `json:"port"`
1516
TlsPort uint16 `json:"tlsPort"`

server/consts.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package server
22

3+
// esm.sh version
34
const VERSION = 136
45

56
// asset extensions

server/dts_walker.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var (
2727
bytesStripleSlash = []byte{'/', '/', '/'}
2828
)
2929

30+
// Walks through a .d.ts file and resolves import paths.
3031
func walkDts(r io.Reader, buf *bytes.Buffer, resolve func(specifier string, kind string, position int) (resovledPath string, err error)) (err error) {
3132
var multiLineComment bool
3233
var importExportExpr bool

server/embed.go

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
"io"
99
"os"
1010
"path"
11+
"strings"
1112
)
1213

1314
var (
14-
embedFS EmbedFS
15-
nodeLibs map[string]string
15+
embedFS EmbedFS
16+
nodeLibs map[string]string
17+
npmPolyfills map[string][]byte
1618
)
1719

1820
type EmbedFS interface {
@@ -32,7 +34,7 @@ func (fs MockEmbedFS) Lstat(name string) (os.FileInfo, error) {
3234
}
3335

3436
func loadNodeLibs(fs EmbedFS) (err error) {
35-
data, err := fs.ReadFile("server/embed/nodelibs.tar.gz")
37+
data, err := fs.ReadFile("server/embed/node-libs.tar.gz")
3638
if err != nil {
3739
return
3840
}
@@ -41,7 +43,6 @@ func loadNodeLibs(fs EmbedFS) (err error) {
4143
return
4244
}
4345
tr := tar.NewReader(gr)
44-
nodeLibs = make(map[string]string)
4546
for {
4647
h, err := tr.Next()
4748
if err != nil {
@@ -70,7 +71,39 @@ func loadNodeLibs(fs EmbedFS) (err error) {
7071
return nil
7172
}
7273

74+
func loadNpmPolyfills(fs EmbedFS) (err error) {
75+
data, err := fs.ReadFile("server/embed/npm-polyfills.tar.gz")
76+
if err != nil {
77+
return
78+
}
79+
gr, err := gzip.NewReader(bytes.NewReader(data))
80+
if err != nil {
81+
return
82+
}
83+
tr := tar.NewReader(gr)
84+
for {
85+
h, err := tr.Next()
86+
if err != nil {
87+
break
88+
}
89+
if h.Typeflag == tar.TypeReg {
90+
data, err := io.ReadAll(tr)
91+
if err != nil {
92+
return err
93+
}
94+
if strings.HasSuffix(h.Name, ".mjs") {
95+
name := strings.TrimSuffix(path.Base(h.Name), ".mjs")
96+
data = bytes.ReplaceAll(data, []byte{';', '\n'}, []byte{';'})
97+
data = bytes.TrimSuffix(data, []byte{';'})
98+
npmPolyfills[name] = data
99+
}
100+
}
101+
}
102+
return nil
103+
}
104+
73105
func init() {
74106
embedFS = &embed.FS{}
75107
nodeLibs = make(map[string]string)
108+
npmPolyfills = make(map[string][]byte)
76109
}
Binary file not shown.

server/embed/npm-polyfills.tar.gz

2.2 KB
Binary file not shown.

server/embed/polyfills/npm_abort-controller.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

server/embed/polyfills/npm_array-every.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

server/embed/polyfills/npm_array-flatten.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

server/embed/polyfills/npm_array-includes.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_array.prototype.find.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_define-properties.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_define-property.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_es-define-property.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_filter-array.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_for-each.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

server/embed/polyfills/npm_function-bind.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_has-own-prop.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_has-own.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_has-property-descriptors.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_has-proto.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

server/embed/polyfills/npm_has-symbols.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_has-tostringtag.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_hasown.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_index-of.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_is-even.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_is-nan.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_is-number.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_is-odd.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_is-regexp.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_is-string.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_left-pad.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_object-assign.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_object-is.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_object-keys.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_object.entries.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_object.values.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_pad-left.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/embed/polyfills/npm_regexp.prototype.flags.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

server/js.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ import (
1212
"github.com/ije/esbuild-internal/logger"
1313
)
1414

15-
var (
16-
jsExts = []string{".mjs", ".js", ".jsx", ".mts", ".ts", ".tsx", ".cjs"}
17-
)
15+
var jsExts = []string{".mjs", ".js", ".jsx", ".mts", ".ts", ".tsx", ".cjs"}
1816

1917
// stripModuleExt strips the module extension from the given string.
2018
func stripModuleExt(s string, exts ...string) string {
@@ -29,7 +27,8 @@ func stripModuleExt(s string, exts ...string) string {
2927
return s
3028
}
3129

32-
func validateJS(filename string) (isESM bool, namedExports []string, err error) {
30+
// validateJSFile validates the given javascript file.
31+
func validateJSFile(filename string) (isESM bool, namedExports []string, err error) {
3332
data, err := os.ReadFile(filename)
3433
if err != nil {
3534
return
@@ -64,6 +63,7 @@ func validateJS(filename string) (isESM bool, namedExports []string, err error)
6463
return
6564
}
6665

66+
// minify minifies the given javascript code.
6767
func minify(code string, target api.Target, loader api.Loader) ([]byte, error) {
6868
ret := api.Transform(code, api.TransformOptions{
6969
Target: target,

server/npm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
const npmRegistry = "https://registry.npmjs.org/"
2525
const jsrRegistry = "https://npm.jsr.io/"
2626

27-
// ref https://github.com/npm/validate-npm-package-name
27+
// base https://github.com/npm/validate-npm-package-name
2828
var npmNaming = valid.Validator{valid.FromTo{'a', 'z'}, valid.FromTo{'A', 'Z'}, valid.FromTo{'0', '9'}, valid.Eq('.'), valid.Eq('-'), valid.Eq('_')}
2929

3030
// NpmPackageVerions defines versions of a NPM package

server/router.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ const (
4949
ctCSS = "text/css; charset=utf-8"
5050
)
5151

52+
func auth(secret string) rex.Handle {
53+
return func(ctx *rex.Context) interface{} {
54+
if secret != "" && ctx.R.Header.Get("Authorization") != "Bearer "+secret {
55+
return rex.Status(401, "Unauthorized")
56+
}
57+
return nil
58+
}
59+
}
60+
5261
func router() rex.Handle {
5362
startTime := time.Now()
5463
globalETag := fmt.Sprintf(`W/"v%d"`, VERSION)
@@ -1203,15 +1212,6 @@ func router() rex.Handle {
12031212
}
12041213
}
12051214

1206-
func appendVaryHeader(header http.Header, key string) {
1207-
vary := header.Get("Vary")
1208-
if vary == "" {
1209-
header.Set("Vary", key)
1210-
} else {
1211-
header.Set("Vary", vary+", "+key)
1212-
}
1213-
}
1214-
12151215
func throwErrorJS(ctx *rex.Context, message string, static bool) interface{} {
12161216
buf := bytes.NewBuffer(nil)
12171217
fmt.Fprintf(buf, "/* esm.sh - error */\n")

server/server.go

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var (
2323
log *logger.Logger
2424
)
2525

26-
// Serve serves ESM server
26+
// Serve serves the esm.sh server
2727
func Serve(efs EmbedFS) {
2828
var (
2929
cfile string
@@ -89,6 +89,12 @@ func Serve(efs EmbedFS) {
8989
}
9090
log.Debugf("%d node libs loaded", len(nodeLibs))
9191

92+
err = loadNpmPolyfills(efs)
93+
if err != nil {
94+
log.Fatalf("load npm polyfills: %v", err)
95+
}
96+
log.Debugf("%d npm polyfills loaded", len(npmPolyfills))
97+
9298
var accessLogger *logger.Logger
9399
if config.LogDir == "" {
94100
accessLogger = &logger.Logger{}
@@ -160,17 +166,3 @@ func Serve(efs EmbedFS) {
160166
log.FlushBuffer()
161167
accessLogger.FlushBuffer()
162168
}
163-
164-
func init() {
165-
config = &Config{}
166-
log = &logger.Logger{}
167-
}
168-
169-
func auth(secret string) rex.Handle {
170-
return func(ctx *rex.Context) interface{} {
171-
if secret != "" && ctx.R.Header.Get("Authorization") != "Bearer "+secret {
172-
return rex.Status(401, "Unauthorized")
173-
}
174-
return nil
175-
}
176-
}

0 commit comments

Comments
 (0)