aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js_ast.zig1
-rw-r--r--src/js_parser.zig11
-rw-r--r--test/transpiler/decorators.test.ts20
3 files changed, 31 insertions, 1 deletions
diff --git a/src/js_ast.zig b/src/js_ast.zig
index b5f47474a..358fe3197 100644
--- a/src/js_ast.zig
+++ b/src/js_ast.zig
@@ -840,6 +840,7 @@ pub const G = struct {
get,
set,
spread,
+ declare,
class_static_block,
pub fn jsonStringify(self: @This(), opts: anytype, o: anytype) !void {
diff --git a/src/js_parser.zig b/src/js_parser.zig
index 6390dfdba..076815e54 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -12062,7 +12062,14 @@ fn NewParser_(
// https://github.com/oven-sh/bun/issues/1907
if (opts.is_class and is_typescript_enabled and strings.eqlComptime(raw, "declare")) {
const scope_index = p.scopes_in_order.items.len;
- _ = try p.parseProperty(kind, opts, null);
+ if (try p.parseProperty(kind, opts, null)) |_prop| {
+ var prop = _prop;
+ if (prop.kind == .normal and prop.value == null and opts.ts_decorators.len > 0) {
+ prop.kind = .declare;
+ return prop;
+ }
+ }
+
p.discardScopesUpTo(scope_index);
return null;
}
@@ -19512,6 +19519,8 @@ fn NewParser_(
}
}
+ // TODO: prop.kind == .declare and prop.value == null
+
if (prop.ts_decorators.len > 0) {
const loc = prop.key.?.loc;
const descriptor_key = switch (prop.key.?.data) {
diff --git a/test/transpiler/decorators.test.ts b/test/transpiler/decorators.test.ts
index 100ecc3bc..885391800 100644
--- a/test/transpiler/decorators.test.ts
+++ b/test/transpiler/decorators.test.ts
@@ -998,3 +998,23 @@ test("export default class Named works", () => {
test("export default class works (anonymous name)", () => {
expect(new DecoratedAnonClass()["methoddecorated"]).toBe(true);
});
+
+test("decorator and declare", () => {
+ let counter = 0;
+ function d1(t) {
+ t();
+ }
+ class A {
+ @d1(() => {
+ counter++;
+ })
+ declare a: number;
+
+ m() {
+ counter++;
+ }
+ }
+
+ new A();
+ expect(counter).toBe(1);
+});