From ab74044409f5ebd66f6724e5eaf541cd23cc7c08 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Mar 2025 10:54:12 -0400 Subject: [PATCH 1/7] chore(async-rewriter): add test for fully synchronous cb passed to builtin --- packages/async-rewriter2/src/async-writer-babel.spec.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index ad96c05ffc..8098b0e9f6 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -482,6 +482,13 @@ describe('AsyncWriter', function () { ); }); + it('handles sync callbacks for builtin functions', async function () { + const ret = runTranspiledCode( + '["abc", "def"].filter(x => x.endsWith("f"))' + ); + expect(await ret).to.deep.equal(['def']); + }); + it('supports typeof for un-defined variables', function () { expect(runTranspiledCode('typeof nonexistent')).to.equal('undefined'); }); From eceefe1755e8f2e0cf9b9974e021c8ae9164248b Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Mar 2025 12:28:49 -0400 Subject: [PATCH 2/7] fixup: labels --- .../async-rewriter2/src/async-writer-babel.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index 8098b0e9f6..026dbf623d 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -262,6 +262,19 @@ describe('AsyncWriter', function () { runTranspiledCode('switch (1) { case 1: 1; break; case 2: 2; break;}') ).to.equal(1); }); + + it('does supports labeled break/switch', function () { + expect( + runTranspiledCode(` + let i,j; + label1: for (i = 0;; i++) { + label2: for (j = 0; j < 2; j++) { + if (i++ === 0) continue label2; + }; + if (i++ > 20) break label1; + }; i`) + ).to.equal(23); + }); }); context('implicit awaiting', function () { From ef209d13092648d8a17d99cdd4304801c633d408 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Mar 2025 13:43:25 -0400 Subject: [PATCH 3/7] fixup: `this` intactness --- .../async-rewriter2/src/async-writer-babel.spec.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index 026dbf623d..b84f43fca6 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -263,7 +263,7 @@ describe('AsyncWriter', function () { ).to.equal(1); }); - it('does supports labeled break/switch', function () { + it('supports labeled break/switch', function () { expect( runTranspiledCode(` let i,j; @@ -275,6 +275,15 @@ describe('AsyncWriter', function () { }; i`) ).to.equal(23); }); + + it.only('keeps `this` intact for function calls', function () { + expect('({ foo: 42, method() { return this } }).method().foo').to.equal( + 42 + ); + expect( + '({ foo: 42, method() { return this } })["method"]().foo' + ).to.equal(42); + }); }); context('implicit awaiting', function () { From 29f6ab1ef54d78108d1ebc59098790ec51bebb00 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Mar 2025 13:44:25 -0400 Subject: [PATCH 4/7] fixup: un-.only() --- packages/async-rewriter2/src/async-writer-babel.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index b84f43fca6..6fea7091c6 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -276,7 +276,7 @@ describe('AsyncWriter', function () { ).to.equal(23); }); - it.only('keeps `this` intact for function calls', function () { + it('keeps `this` intact for function calls', function () { expect('({ foo: 42, method() { return this } }).method().foo').to.equal( 42 ); From 12d4d630b4cb20f4421a9641edd800e24354c51e Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Mar 2025 13:46:28 -0400 Subject: [PATCH 5/7] fixup: ... --- .../async-rewriter2/src/async-writer-babel.spec.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index 6fea7091c6..1955c2ab98 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -277,11 +277,15 @@ describe('AsyncWriter', function () { }); it('keeps `this` intact for function calls', function () { - expect('({ foo: 42, method() { return this } }).method().foo').to.equal( - 42 - ); expect( - '({ foo: 42, method() { return this } })["method"]().foo' + runTranspiledCode( + '({ foo: 42, method() { return this } }).method().foo' + ) + ).to.equal(42); + expect( + runTranspiledCode( + '({ foo: 42, method() { return this } })["method"]().foo' + ) ).to.equal(42); }); }); From 893e3670f67c51807f06b8707034f8cc02eab329 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 24 Mar 2025 21:56:03 -0400 Subject: [PATCH 6/7] fixup: another one, this time for classes --- packages/async-rewriter2/src/async-writer-babel.spec.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index 1955c2ab98..5e9c0ceed1 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -241,6 +241,13 @@ describe('AsyncWriter', function () { expect(ctx.A).to.equal(A); }); + it('can initialize immediately after a class definition', function () { + const A = runTranspiledCode( + 'class A { prop = 42; }\nconst foo = new A(); foo' + ); + expect(A.prop).to.equal(42); + }); + it('does not move classes from block scopes to the top-level scope', function () { const A = runTranspiledCode('{ class A {} }'); expect(A).to.equal(undefined); From 4a65d1355519023f72793e806a0210b494dd3770 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 25 Mar 2025 11:39:52 -0400 Subject: [PATCH 7/7] fixup: test for semicolon-less statements in functions --- .../async-rewriter2/src/async-writer-babel.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/async-rewriter2/src/async-writer-babel.spec.ts b/packages/async-rewriter2/src/async-writer-babel.spec.ts index 5e9c0ceed1..d96bcc75a6 100644 --- a/packages/async-rewriter2/src/async-writer-babel.spec.ts +++ b/packages/async-rewriter2/src/async-writer-babel.spec.ts @@ -234,6 +234,19 @@ describe('AsyncWriter', function () { ); }); + it('can handle semicolon-less input inside functions', function () { + expect( + runTranspiledCode(` + (function() { + let foo = {} + foo.bar = {} + foo.fn = function() {} + return foo; + })() + `).bar + ).to.deep.equal({}); + }); + it('moves top-level classes into the top-level scope', function () { const A = runTranspiledCode('class A {}'); expect(A.constructor.name).to.equal('Function');