aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js_parser.zig13
-rw-r--r--test/transpiler/decorator-export-default-class-fixture.ts10
-rw-r--r--test/transpiler/decorators.test.ts5
3 files changed, 27 insertions, 1 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig
index 230a09fd0..df5c84294 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -18146,7 +18146,18 @@ fn NewParser_(
data.default_name = createDefaultName(p, stmt.loc) catch unreachable;
}
- stmts.append(stmt.*) catch unreachable;
+ var class_stmts = p.lowerClass(.{ .stmt = s2 });
+
+ if (class_stmts.len > 1) {
+ std.debug.assert(class_stmts[0].data == .s_class);
+ data.value.stmt = class_stmts[0];
+ stmts.append(stmt.*) catch {};
+ stmts.appendSlice(class_stmts[1..]) catch {};
+ } else {
+ data.value.stmt = class_stmts[0];
+ stmts.append(stmt.*) catch {};
+ }
+
return;
},
else => {},
diff --git a/test/transpiler/decorator-export-default-class-fixture.ts b/test/transpiler/decorator-export-default-class-fixture.ts
new file mode 100644
index 000000000..901c17718
--- /dev/null
+++ b/test/transpiler/decorator-export-default-class-fixture.ts
@@ -0,0 +1,10 @@
+function decorator(target: any, propertyKey: any) {
+ target[propertyKey + "decorated"] = true;
+}
+
+export default class DecoratedClass {
+ @decorator
+ method() {
+ return 42;
+ }
+}
diff --git a/test/transpiler/decorators.test.ts b/test/transpiler/decorators.test.ts
index 8769ea2bc..ad0980930 100644
--- a/test/transpiler/decorators.test.ts
+++ b/test/transpiler/decorators.test.ts
@@ -1,5 +1,6 @@
// @ts-nocheck
import { test, expect, describe } from "bun:test";
+import DecoratedClass from "./decorator-export-default-class-fixture";
test("decorator order of evaluation", () => {
let counter = 0;
@@ -988,3 +989,7 @@ describe("constructor statements", () => {
expect(a.v2).toBe(0);
});
});
+
+test("export default class works", () => {
+ expect(new DecoratedClass()["methoddecorated"]).toBe(true);
+});