aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js_ast.zig1
-rw-r--r--src/js_parser/js_parser.zig84
2 files changed, 45 insertions, 40 deletions
diff --git a/src/js_ast.zig b/src/js_ast.zig
index 96b14c363..2cb3f3f03 100644
--- a/src/js_ast.zig
+++ b/src/js_ast.zig
@@ -4552,6 +4552,7 @@ pub const Part = struct {
runtime,
cjs_imports,
react_fast_refresh,
+ dirname_filename,
};
pub const SymbolUseMap = std.ArrayHashMapUnmanaged(Ref, Symbol.Use, RefHashCtx, false);
diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig
index 276dda451..a4d505af6 100644
--- a/src/js_parser/js_parser.zig
+++ b/src/js_parser/js_parser.zig
@@ -2403,6 +2403,50 @@ pub const Parser = struct {
}
}
+ const uses_dirname = p.symbols.items[p.dirname_ref.innerIndex()].use_count_estimate > 0;
+ const uses_filename = p.symbols.items[p.filename_ref.innerIndex()].use_count_estimate > 0;
+ if (uses_dirname or uses_filename) {
+ const count = @as(usize, @boolToInt(uses_dirname)) + @as(usize, @boolToInt(uses_filename));
+ var declared_symbols = try p.allocator.alloc(js_ast.DeclaredSymbol, count);
+ var decls = p.allocator.alloc(G.Decl, count) catch unreachable;
+ if (uses_dirname) {
+ decls[0] = .{
+ .binding = p.b(B.Identifier{ .ref = p.dirname_ref }, logger.Loc.Empty),
+ .value = p.e(
+ // TODO: test UTF-8 file paths
+ E.String.init(p.source.path.name.dir),
+ logger.Loc.Empty,
+ ),
+ };
+ declared_symbols[0] = .{ .ref = p.dirname_ref, .is_top_level = true };
+ p.recordUsage(p.dirname_ref);
+ }
+ if (uses_filename) {
+ decls[@as(usize, @boolToInt(uses_dirname))] = .{
+ .binding = p.b(B.Identifier{ .ref = p.filename_ref }, logger.Loc.Empty),
+ .value = p.e(
+ E.String.init(p.source.path.text),
+ logger.Loc.Empty,
+ ),
+ };
+ declared_symbols[@as(usize, @boolToInt(uses_dirname))] = .{ .ref = p.filename_ref, .is_top_level = true };
+ p.recordUsage(p.filename_ref);
+ }
+
+ // TODO: DeclaredSymbol
+ var part_stmts = p.allocator.alloc(Stmt, 1) catch unreachable;
+ part_stmts[0] = p.s(S.Local{
+ .kind = .k_var,
+ .decls = decls,
+ }, logger.Loc.Empty);
+ before.append(js_ast.Part{
+ .stmts = part_stmts,
+ .declared_symbols = declared_symbols,
+ .tag = .dirname_filename,
+ }) catch unreachable;
+
+ }
+
var did_import_fast_refresh = false;
// Analyze cross-part dependencies for tree shaking and code splitting
@@ -2825,46 +2869,6 @@ pub const Parser = struct {
p.resolveCommonJSSymbols();
- const uses_dirname = p.symbols.items[p.dirname_ref.innerIndex()].use_count_estimate > 0;
- const uses_filename = p.symbols.items[p.filename_ref.innerIndex()].use_count_estimate > 0;
- if (uses_dirname or uses_filename) {
- const count = @as(usize, @boolToInt(uses_dirname)) + @as(usize, @boolToInt(uses_filename));
- var declared_symbols = try p.allocator.alloc(js_ast.DeclaredSymbol, count);
- var decls = p.allocator.alloc(G.Decl, count) catch unreachable;
- if (uses_dirname) {
- decls[0] = .{
- .binding = p.b(B.Identifier{ .ref = p.dirname_ref }, logger.Loc.Empty),
- .value = p.e(
- // TODO: test UTF-8 file paths
- E.String.init(p.source.path.name.dir),
- logger.Loc.Empty,
- ),
- };
- declared_symbols[0] = .{ .ref = p.dirname_ref, .is_top_level = true };
- }
- if (uses_filename) {
- decls[@as(usize, @boolToInt(uses_dirname))] = .{
- .binding = p.b(B.Identifier{ .ref = p.filename_ref }, logger.Loc.Empty),
- .value = p.e(
- E.String.init(p.source.path.text),
- logger.Loc.Empty,
- ),
- };
- declared_symbols[@as(usize, @boolToInt(uses_dirname))] = .{ .ref = p.filename_ref, .is_top_level = true };
- }
-
- // TODO: DeclaredSymbol
- var part_stmts = p.allocator.alloc(Stmt, 1) catch unreachable;
- part_stmts[0] = p.s(S.Local{
- .kind = .k_var,
- .decls = decls,
- }, logger.Loc.Empty);
- before.append(js_ast.Part{
- .stmts = part_stmts,
- .declared_symbols = declared_symbols,
- }) catch unreachable;
- }
-
// - don't import runtime if we're bundling, it's already included
// - when HMR is enabled, we always need to import the runtime for HMRClient and HMRModule.
// - when HMR is not enabled, we only need any runtime imports if we're importing require()