aboutsummaryrefslogtreecommitdiff
path: root/src/js_parser.zig
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-06-24 06:02:16 -0700
committerGravatar GitHub <noreply@github.com> 2023-06-24 06:02:16 -0700
commitff635551436123022ba3980b39580d53973c80a2 (patch)
tree7eb5292a7157e70dd432518f185bc9c39345ae89 /src/js_parser.zig
parent069b42a7cc1275969859dc60e7c303528ca2dccb (diff)
downloadbun-ff635551436123022ba3980b39580d53973c80a2.tar.gz
bun-ff635551436123022ba3980b39580d53973c80a2.tar.zst
bun-ff635551436123022ba3980b39580d53973c80a2.zip
Rewrite Bun's runtime CommonJS loader (#3379)
* wip changes for CommonJS * this rewrite is almost complete * even more code * wip * Remove usages of `import.meta.require` from builtins * Remove usages of require * Regenerate * :scissors: builtin rewrite commonjs in printer * Use lazy custom getters for import.meta * fixups * Remove depd * ugh * still crashing * fixup undici * comment out import.meta.require.resolve temporarily not a real solution but it stops the crashes * Redo import.meta.primordials * Builtins now have a `builtin://` protocol in source origin * Seems to work? * Finsih getting rid of primordials * switcharoo * No more function * just one more bug * Update launch.json * Implement `require.main` * :scissors: * Bump WebKit * Fixup import cycles * Fixup improt cycles * export more things * Implement `createCommonJSModule` builtin * More exports * regenerate * i broke some stuff * some of these tests work now * We lost the encoding * Sort of fix zlib * Sort of fix util * Update events.js * bump * bump * bump * Fix missing export in fs * fix some bugs with builtin esm modules (stream, worker_threads, events). its not perfect yet. * fix some other internal module bugs * oops * fix some extra require default stuff * uncomment this file but it crsahes on my machine * tidy code here * fixup tls exports * make simdutf happier * Add hasPrefix binding * Add test for `require.main` * Fix CommonJS evaluation order race condition * Make node:http load faster * Add missing exports to tls.js * Use the getter * Regenerate builtins * Fix assertion failure in Bun.write() * revamp dotEnv parser (#3347) - fixes `strings.indexOfAny()` - fixes OOB array access fixes #411 fixes #2823 fixes #3042 * fix tests for `expect()` (#3384) - extend test job time-out for `darwin-aarch64` * `expect().resolves` and `expect().rejects` (#3318) * Move expect and snapshots to their own files * expect().resolves and expect().rejects * Fix promise being added to unhandled rejection list * Handle timeouts in expect(<promise>) * wip merge * Fix merge issue --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> * fixup min/memcopy (#3388) * Fix crash in builtins * Don't attempt to evaluate modules with no source code * Update WebCoreJSBuiltins.cpp * Update WebCoreJSBuiltins.cpp * Update WebCoreJSBuiltins.cpp * Fix crash * cleanup * Fix test cc @paperdave * Fixup Undici * Fix issue in node:http * Create util-deprecate.mjs * Fix several bugs * Use the identifier * Support error.code in `util.deprecate` * make the CJs loader slightly more resilient * Update WebCoreJSBuiltins.cpp * Fix macros --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Co-authored-by: dave caruso <me@paperdave.net> Co-authored-by: Alex Lam S.L <alexlamsl@gmail.com> Co-authored-by: Ashcon Partovi <ashcon@partovi.net> Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com>
Diffstat (limited to 'src/js_parser.zig')
-rw-r--r--src/js_parser.zig89
1 files changed, 63 insertions, 26 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig
index 28bd4aa0b..16560d525 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -21217,7 +21217,7 @@ fn NewParser_(
logger.Loc.Empty,
);
const cjsGlobal = p.newSymbol(.unbound, "$_BunCommonJSModule_$") catch unreachable;
- var call_args = allocator.alloc(Expr, 6) catch unreachable;
+ var all_call_args = allocator.alloc(Expr, 7) catch unreachable;
const this_module = p.newExpr(
E.Dot{
.name = "module",
@@ -21226,14 +21226,72 @@ fn NewParser_(
},
logger.Loc.Empty,
);
+ var call_args = all_call_args[1..];
+ var bind_args = all_call_args[0..1];
+ bind_args[0] = this_module;
+ const get_require = p.newExpr(
+ E.Dot{
+ .name = "require",
+ .target = this_module,
+ .name_loc = logger.Loc.Empty,
+ },
+ logger.Loc.Empty,
+ );
+
+ const create_binding = p.newExpr(
+ E.Call{
+ .target = p.newExpr(E.Dot{
+ .name = "bind",
+ .name_loc = logger.Loc.Empty,
+ .target = get_require,
+ }, logger.Loc.Empty),
+ .args = bun.BabyList(Expr).init(bind_args),
+ },
+ logger.Loc.Empty,
+ );
+
+ const module_id = p.newExpr(E.Dot{
+ .name = "id",
+ .target = this_module,
+ .name_loc = logger.Loc.Empty,
+ }, logger.Loc.Empty);
+
+ const require_path = p.newExpr(
+ E.Dot{
+ .name = "path",
+ .target = get_require,
+ .name_loc = logger.Loc.Empty,
+ },
+ logger.Loc.Empty,
+ );
+ const assign_binding = p.newExpr(
+ E.Binary{
+ .left = get_require,
+ .right = create_binding,
+ .op = .bin_assign,
+ },
+ logger.Loc.Empty,
+ );
+
+ const assign_id = p.newExpr(E.Binary{
+ .left = require_path,
+ .right = module_id,
+ .op = .bin_assign,
+ }, logger.Loc.Empty);
+
+ var create_require = [3]Expr{
+ assign_binding,
+ assign_id,
+ get_require,
+ };
//
- // (function(module, exports, require, __dirname, __filename) {}).call(this.exports, this.module, this.exports, this.require, __dirname, __filename)
+ // (function(module, exports, require, __dirname, __filename) {}).call(this.exports, this.module, this.exports, this.module.require = this.module.require.bind(module), (this.module.require.id = this.module.id, this.module.require), __dirname, __filename)
call_args[0..6].* = .{
p.newExpr(
E.Dot{
.name = "exports",
- .target = p.newExpr(E.Identifier{ .ref = cjsGlobal }, logger.Loc.Empty),
+ .target = this_module,
.name_loc = logger.Loc.Empty,
},
logger.Loc.Empty,
@@ -21242,33 +21300,12 @@ fn NewParser_(
p.newExpr(
E.Dot{
.name = "exports",
- .target = p.newExpr(E.Identifier{ .ref = cjsGlobal }, logger.Loc.Empty),
+ .target = this_module,
.name_loc = logger.Loc.Empty,
},
logger.Loc.Empty,
),
- p.newExpr(
- E.Binary{
- .left = p.newExpr(
- E.Dot{
- .name = "require",
- .target = this_module,
- .name_loc = logger.Loc.Empty,
- },
- logger.Loc.Empty,
- ),
- .op = .bin_assign,
- .right = p.newExpr(
- E.Dot{
- .name = "require",
- .target = p.newExpr(E.Identifier{ .ref = cjsGlobal }, logger.Loc.Empty),
- .name_loc = logger.Loc.Empty,
- },
- logger.Loc.Empty,
- ),
- },
- logger.Loc.Empty,
- ),
+ Expr.joinAllWithComma(&create_require, p.allocator),
p.newExpr(
E.Dot{
.name = "__dirname",