Skip to content

Commit

Permalink
Update npm polyfills
Browse files Browse the repository at this point in the history
  • Loading branch information
ije committed Jun 27, 2024
1 parent a40d154 commit 736cdf6
Show file tree
Hide file tree
Showing 30 changed files with 84 additions and 21 deletions.
44 changes: 35 additions & 9 deletions server/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,17 @@ func (ctx *BuildContext) buildModule() (result BuildResult, err error) {
}
}

if specifier != "node-fetch" && args.Kind != api.ResolveJSRequireCall && args.Kind != api.ResolveJSRequireResolve {
data, err := embedFS.ReadFile(("server/embed/polyfills/npm_" + specifier + ".js"))
if err == nil {
return api.OnResolveResult{
Path: args.Path,
PluginData: data,
Namespace: "purge-polyfill",
}, nil
}
}

// resolve specifier with package `browser` field
if !isRelativeSpecifier(specifier) && len(ctx.pkgJson.Browser) > 0 && ctx.isBrowserTarget() {
if name, ok := ctx.pkgJson.Browser[specifier]; ok {
Expand Down Expand Up @@ -729,21 +740,21 @@ func (ctx *BuildContext) buildModule() (result BuildResult, err error) {
},
)

// for wasm module exclude
// purge polyfill
build.OnLoad(
api.OnLoadOptions{Filter: ".*", Namespace: "wasm"},
api.OnLoadOptions{Filter: ".*", Namespace: "purge-polyfill"},
func(args api.OnLoadArgs) (ret api.OnLoadResult, err error) {
wasm, err := os.ReadFile(args.Path)
if err != nil {
data, ok := args.PluginData.([]byte)
if !ok {
err = fmt.Errorf("purge-polyfill: invalid plugin data")
return
}
wasm64 := base64.StdEncoding.EncodeToString(wasm)
code := fmt.Sprintf("export default Uint8Array.from(atob('%s'), c => c.charCodeAt(0))", wasm64)
return api.OnLoadResult{Contents: &code, Loader: api.LoaderJS}, nil
contents := string(data)
return api.OnLoadResult{Contents: &contents, Loader: api.LoaderJS}, nil
},
)

// for browser exclude
// browser exclude
build.OnLoad(
api.OnLoadOptions{Filter: ".*", Namespace: "browser-exclude"},
func(args api.OnLoadArgs) (ret api.OnLoadResult, err error) {
Expand All @@ -757,6 +768,21 @@ func (ctx *BuildContext) buildModule() (result BuildResult, err error) {
},
)

// wasm module exclude
build.OnLoad(
api.OnLoadOptions{Filter: ".*", Namespace: "wasm"},
func(args api.OnLoadArgs) (ret api.OnLoadResult, err error) {
wasm, err := os.ReadFile(args.Path)
if err != nil {
return
}
wasm64 := base64.StdEncoding.EncodeToString(wasm)
code := fmt.Sprintf("export default Uint8Array.from(atob('%s'), c => c.charCodeAt(0))", wasm64)
return api.OnLoadResult{Contents: &code, Loader: api.LoaderJS}, nil
},
)

// resolve `__filename` and `__dirname`
build.OnLoad(
api.OnLoadOptions{Filter: "\\.c?js$"},
func(args api.OnLoadArgs) (ret api.OnLoadResult, err error) {
Expand Down Expand Up @@ -833,6 +859,7 @@ func (ctx *BuildContext) buildModule() (result BuildResult, err error) {
return api.OnLoadResult{Contents: &js, Loader: api.LoaderJS}, nil
},
)

},
}

Expand Down Expand Up @@ -960,7 +987,6 @@ rebuild:
}
}
err = errors.New("esbuild: " + msg)
fmt.Println(ret.Errors[0].Location)
return
}

Expand Down
20 changes: 12 additions & 8 deletions server/build_resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -775,14 +775,18 @@ func (ctx *BuildContext) resolveExternalModule(specifier string, kind api.Resolv
}

// replace some npm polyfills with native APIs
if specifier == "node-fetch" && ctx.target != "node" {
resolvedPath = "/npm_node-fetch.js"
return
}
data, err := embedFS.ReadFile(("server/embed/polyfills/npm_" + specifier + ".js"))
if err == nil {
resolvedPath = fmt.Sprintf("data:application/javascript;base64,%s", base64.StdEncoding.EncodeToString(data))
return

if specifier == "node-fetch" {
if ctx.target != "node" {
resolvedPath = "/npm_node-fetch.js"
return
}
} else {
data, err := embedFS.ReadFile(("server/embed/polyfills/npm_" + specifier + ".js"))
if err == nil {
resolvedPath = fmt.Sprintf("data:text/javascript;base64,%s", base64.StdEncoding.EncodeToString(data))
return
}
}

// common npm dependency
Expand Down
2 changes: 2 additions & 0 deletions server/embed/polyfills/npm_array-every.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const every = (a, p, t) => a.every(p, t);
export default every;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_array.prototype.find.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (a, predicate, thisArg) => a.find(predicate, thisArg);
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_define-properties.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.defineProperties;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_define-property.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.defineProperty;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_es-define-property.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.defineProperty;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_filter-array.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (a, predicate, thisArg) => a.filter(predicate, thisArg);
9 changes: 9 additions & 0 deletions server/embed/polyfills/npm_for-each.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export default (v, cb) => {
if (Array.isArray(v)) {
v.forEach(cb);
} else if (v && typeof v === "object") {
for (const k in v) {
cb(v[k], k, v);
}
}
};
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_has-own-prop.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
3 changes: 1 addition & 2 deletions server/embed/polyfills/npm_has-own.js
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
const hasOwn = Object.prototype.hasOwnProperty;
export default Object.hasOwn ?? ((o, p) => hasOwn.call(o, p));
export default Object.hasOwn ?? ((o, p) => Object.prototype.hasOwnProperty.call(o, p));
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_has-property-descriptors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default () => true;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_has-tostringtag.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default () => typeof Symbol.toStringTag === "symbol";
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_hasown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.hasOwn ?? ((o, p) => Object.prototype.hasOwnProperty.call(o, p));
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_index-of.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (a, searchElement, start) => a.indexOf(searchElement, start);
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_is-even.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (n) => (n % 2) === 0;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_is-nan.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Number.isNaN;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_is-number.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (v) => typeof v === "number";
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_is-odd.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (n) => (n % 2) === 1;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_is-regexp.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (v) => v instanceof RegExp;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_is-string.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (v) => typeof v === "string";
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_left-pad.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (s, l, c) => s.padStart(l, c);
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_object-is.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.is;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_object-keys.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.keys;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_object.entries.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.entries;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_object.values.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default Object.values;
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_pad-left.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (s, l, c) => s.padStart(l, c);
1 change: 1 addition & 0 deletions server/embed/polyfills/npm_regexp.prototype.flags.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default (reg) => reg.flags;
2 changes: 1 addition & 1 deletion server/nodejs.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import (

const (
nodejsMinVersion = 22
pnpmMinVersion = "9.0.0"
nodeTypesVersion = "20.14.4"
pnpmMinVersion = "9.0.0"
)

var nodejsInternalModules = map[string]bool{
Expand Down
2 changes: 1 addition & 1 deletion test/esm-worker/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ Deno.test("esm-worker", { sanitizeOps: false, sanitizeResources: false }, async
assertEquals(res7.status, 200);
assertStringIncludes(
await res7.text(),
`"data:application/javascript;base64,ZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbjsK"`,
`"data:text/javascript;base64,ZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmFzc2lnbjsK"`,
);

const res8 = await fetch(`${workerOrigin}/[email protected]?external=react`);
Expand Down

0 comments on commit 736cdf6

Please sign in to comment.