Boshen
29417ddc03
feat(minifier): minimize !(a, b) -> a, !b ( #8746 )
2025-01-27 08:24:07 +00:00
renovate[bot]
e00e3abd84
chore(deps): update rust crates (major) ( #8739 )
...
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [oxc_resolver](https://redirect.github.com/oxc-project/oxc-resolver ) |
workspace.dependencies | major | `3` -> `4` |
| [ureq](https://redirect.github.com/algesten/ureq ) |
workspace.dependencies | major | `2.12.1` -> `3.0.0` |
---
### Release Notes
<details>
<summary>oxc-project/oxc-resolver (oxc_resolver)</summary>
###
[`v4.0.0`](https://redirect.github.com/oxc-project/oxc-resolver/blob/HEAD/CHANGELOG.md#400---2025-01-20 )
[Compare
Source](https://redirect.github.com/oxc-project/oxc-resolver/compare/oxc_resolver-v3.0.3...oxc_resolver-v4.0.0 )
##### <!-- 0 -->Features
- \[**breaking**] generic fs cache `type Resolver =
ResolverGeneric<FsCache<FileSystemOs>>`
([#​358](https://redirect.github.com/oxc-project/oxc-resolver/issues/358 ))
- \[**breaking**] `PackageJson` and `TsConfig` traits
([#​360](https://redirect.github.com/oxc-project/oxc-resolver/issues/360 ))
##### <!-- 2 -->Performance
- use papaya instead of dashmap
([#​356](https://redirect.github.com/oxc-project/oxc-resolver/issues/356 ))
</details>
<details>
<summary>algesten/ureq (ureq)</summary>
###
[`v3.0.0`](https://redirect.github.com/algesten/ureq/blob/HEAD/CHANGELOG.md#300 )
[Compare
Source](https://redirect.github.com/algesten/ureq/compare/2.12.1...3.0.0 )
- Replace RequestBuilder Deref with explicit wrappers
([#​944](https://redirect.github.com/algesten/ureq/issues/944 ))
- Remove dependency on `url` crate
([#​943](https://redirect.github.com/algesten/ureq/issues/943 ))
- Feature `Config::save_redirect_history`
([#​939](https://redirect.github.com/algesten/ureq/issues/939 ))
</details>
---
### Configuration
📅 **Schedule**: Branch creation - "on monday" in timezone Asia/Shanghai,
Automerge - "on monday" in timezone Asia/Shanghai.
🚦 **Automerge**: Enabled.
♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.
👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config
help](https://redirect.github.com/renovatebot/renovate/discussions ) if
that's undesired.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box
---
This PR was generated by [Mend Renovate](https://mend.io/renovate/ ).
View the [repository job
log](https://developer.mend.io/github/oxc-project/oxc ).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjM5LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Boshen <boshenc@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-01-27 12:56:52 +08:00
renovate[bot]
40362dfc01
chore(deps): update npm packages ( #8740 )
2025-01-27 12:10:20 +08:00
sapphi-red
e0117db531
feat(minifier): replace const with let for non-exported read-only variables ( #8733 )
...
Replace `const` with `let` when that value does not have any assignments and not exposed.
2025-01-26 12:44:01 +00:00
sapphi-red
360d49e962
feat(minifier): replace Math.pow with ** ( #8730 )
...
Replaces `Math.pow(a, b)` with `(+a) ** (+b)`. `+` does `ToNumber` and `**` does `Number::exponentiate` when both operands are number.
`+` is not added when `a` or `b` is already a number.
**Reference**
- [Spec of `Math.pow`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.pow )
- [Spec of `**`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-exp-operator-runtime-semantics-evaluation )
- [Spec of unary `+`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-unary-plus-operator-runtime-semantics-evaluation )
2025-01-26 11:24:19 +00:00
Boshen
e9fb5febdf
feat(minifier): dce pure expressions such as new Map() ( #8725 )
2025-01-26 18:08:34 +08:00
branchseer
3e509e1c9b
fix(transformer/typescript): enum merging when same name declared in outer scope ( #8691 )
...
```typescript
var x = 10;
enum Merge { x = Math.random() }
enum Merge {
y = x // <-- refers to Merge.x
}
```
This case wasn't covered in #8543 and by the [babel test
case](e568916ef3/packages/babel-plugin-transform-typescript/test/fixtures/enum/non-constant-member-reference/input.ts ).
To handle it we still have to go through the scope ancestors.
---------
Co-authored-by: Dunqing <dengqing0821@gmail.com>
2025-01-26 09:18:00 +08:00
Dunqing
e7ab96cbb6
fix(transformer/jsx): incorrect isStaticChildren argument for Fragment with multiple children ( #8713 )
...
close : #8650
2025-01-25 16:11:28 +00:00
Boshen
0af0267077
refactor(minifier): side effect detection needs symbols resolution ( #8715 )
2025-01-25 15:01:00 +00:00
翠 / green
6589c3bbb3
feat(mangler): reuse variable names ( #8562 )
...
Changed the mangler to reuse variable names where possible.
This will reduce the code size as shorter variable names can be used in
more places. But requires global information and limits parallelism in a
single file and requires more memory.
---------
Co-authored-by: Boshen <boshenc@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-01-25 14:00:24 +08:00
Boshen
8587965e45
perf(minifier): normalize undefined to void 0 before everything else ( #8699 )
...
so subsequent code don't need to lookup `undefined`.
2025-01-25 11:50:08 +08:00
Boshen
b7f13e636e
feat(ast): implement utf8 to utf16 span converter ( #8687 )
...
closes #8629
2025-01-24 16:57:44 +00:00
sapphi-red
343690e178
feat(minifier): replace Number.*_SAFE_INTEGER/Number.EPSILON ( #8682 )
...
The value of `Number.*_SAFE_INTEGER`, `Number.EPSILON` are constants as they cannot be changed. This PR replaces them with `2**53-1` / `-(2**53-1)` / `2**-52` for ES2016+. For ES2015, `Number.EPSILON` is not changed but `Number.*_SAFE_INTEGER`s are replaced with `9007199254740991` / `-9007199254740991`.
**Reference**
- Spec of [`Number.MAX_SAFE_INTEGER`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.max_safe_integer )
- Spec of [`Number.MIN_SAFE_INTEGER`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.min_safe_integer )
- Spec of [`Number.EPSILON`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.epsilon )
### Additional Information
- [`Number.MIN_VALUE`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.min_value ) cannot be replaced as the value depends on the runtime
- [`Number.MAX_VALUE`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.max_value ) can be replaced but I didn't come up with a shorter representation that does not lack precision
2025-01-24 03:47:52 +00:00
sapphi-red
0c5bb30859
feat(minifier): replace Number.POSITIVE_INFINITY/Number.NEGATIVE_INFINITY/Number.NaN ( #8681 )
...
The value of `Number.POSITIVE_INFINITY`, `Number.NEGATIVE_INFINITY`, `Number.NaN` are constants as they cannot be changed. This PR replaces them with `Infinity`/`-Infinity`/`NaN`.
**Reference**
- Spec of [`Number.POSITIVE_INFINITY`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.positive_infinity )
- Spec of [`Number.NEGATIVE_INFINITY`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.positive_infinity )
- Spec of [`Number.NaN`](https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-number.positive_infinity )
2025-01-23 15:26:22 +00:00
Boshen
99607d3f82
feat(codegen): print comments in TSTypeLiteral ( #8679 )
...
fixes #8665
2025-01-23 14:31:55 +00:00
Yuji Sugiura
a529412fe7
refactor(prettier): Verify printing module exports ( #8670 )
...
Part of #5068
- ExportAllDeclaration
- ExportNamedDeclaration
- ExportDefaultDeclaration
- (ExportNamespaceSpecifier = ExportAllDeclaration+exported)
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-01-23 14:54:06 +08:00
Boshen
ba201a6511
fix(minifier): remove "non esbuild optimizations" which is incorrect ( #8668 )
2025-01-23 03:45:42 +00:00
Yuji Sugiura
1e9f3857ab
refactor(prettier): Verify printing module imports ( #8633 )
...
Part of #5068
- [x] ImportDeclaration
- [x] ImportSpecifier
- [x] ImportDefaultSpecifier
- [x] ImportNamespaceSpecifier
- [x] WithClause
- [x] ImportAttribute
2025-01-23 09:58:44 +08:00
Boshen
3802d28233
refactor(minifier): clean up try_minimize_conditional ( #8660 )
2025-01-22 15:17:47 +00:00
Boshen
9953ac7cad
perf(minifier): add LatePeepholeOptimizations ( #8651 )
...
This PR adds a `LatePeepholeOptimizations` pass for minifications that
don't interact with the fixed point loop.
While working on this I found a couple of cases where the previous fixed
point loop is not idempotent.
2025-01-22 16:19:06 +08:00
Boshen
5b3c412e26
perf(minifier): only run optimizations on local changes ( #8644 )
...
Previously all code are ran in a fixed point loop when ast changes.
This PR changes running code when a function changes its enclosing ast only.
2025-01-21 23:55:54 +08:00
camc314
b75d4919ee
chore(linter): update doc comment to reflect existance of stylish formatter ( #8645 )
...
after:
```
Output
-f, --format=ARG Use a specific output format (default, json, unix, checkstyle, github,
stylish)
```
2025-01-21 15:38:15 +00:00
sapphi-red
835b25889b
feat(minifier): compress typeof foo === 'object' && foo !== null to typeof foo == 'object' && !!foo ( #8638 )
...
If `typeof foo == 'object'`, then `foo` is guaranteed to be an object or null. In that case, `foo !== null` can be replaced with `!!foo` because objects return `true` for `!!foo` and null returns `false` for it.
**References**
- [Spec of `typeof`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-typeof-operator )
- [Spec of `!`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-logical-not-operator )
- [Spec of `ToBoolean`](https://tc39.es/ecma262/multipage/abstract-operations.html#sec-toboolean )
2025-01-21 14:59:25 +00:00
sapphi-red
2bcbed2d50
feat(minifier): compress (a = b) === null || a === undefined to (a = b) == null ( #8637 )
2025-01-21 14:59:23 +00:00
Yuji Sugiura
891a9c2040
feat(tasks/prettier): Visualize test details ( #8634 )
...
For example, if there are 3 tests in 1 spec and all of them fail:
- 💥 💥 💥
After some implementation, if 1 test passes:
- 💥 💥 ✨
However, in this case, the coverage as number does not change.
This PR visualizes these details for better mental well-being. 😃
(But in practice, specs are so detailed, there is not much opportunity
for this...)
2025-01-21 17:01:34 +08:00
Kevin Deng 三咲智子
178c2322f5
fix(parser): parse intrinsic TS keyword ( #8627 )
2025-01-21 09:54:10 +08:00
Kevin Deng 三咲智子
48717ab87c
fix(parser): parse true as TSLiteralType ( #8626 )
...
closes #8624
2025-01-21 09:50:49 +08:00
Boshen
6f95cd599a
refactor(minifier): remove all the unnecessary fake ast passes ( #8618 )
...
This also removes handling of making cjs-module-lexer to work.
2025-01-20 22:05:51 +08:00
翠 / green
8c8b5fa9be
fix(minifier): avoid minifing String(a) into "" + a for symbols ( #8612 )
...
We shouldn't change `String(a)` into `"" + a` if `a` can be a Symbol.
`String(Symbol())` does not throw an error, but `"" + Symbol()` does.
**References**
- [Spec of `ToString` (called for `"" +
variable`)](https://tc39.es/ecma262/multipage/abstract-operations.html#sec-tostring )
- [Spec of
`String(a)`](https://tc39.es/ecma262/multipage/text-processing.html#sec-string-constructor-string-value )
---------
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-01-20 13:34:46 +08:00
sapphi-red
997859c42e
refactor(ast): align #[estree(via)] behavior ( #8599 )
...
Follow-on after #8564 . Aligned the behavior of `#[estree(via)]` for fields with `#[estree(via)]` for structs.
2025-01-19 20:44:33 +00:00
branchseer
ac4f98e376
refactor(span): derive Copy on Atom ( #8596 )
...
Follow up from
https://github.com/oxc-project/oxc/pull/8543#discussion_r1918592423
> I agree. https://github.com/oxc-project/backlog/issues/155
> Originally we were considering some form of interning and
reference-counting, so we didn't make it Copy to leave the door open for
that. But now all strings are stored in the arena anyway, so even if we
did decide to intern strings, reference-counting would be irrelevant -
our bump allocator doesn't allow freeing individual allocations anyway.
Most of the changes are done automatically by `just fix` (`cargo clippy
--fix` && `cargo fmt --all`). See the commit list for the manual edits.
2025-01-19 16:14:23 +08:00
Boshen
066ffe8e8d
fix(tasks/prettier_conformance): fix compile error
2025-01-19 12:17:25 +08:00
Boshen
83caa56926
fix(tasks/prettier_conformance): enable test coverage
2025-01-19 12:07:15 +08:00
Boshen
2a2a2eb5ea
chore(tasks/minsize): enable test coverage
2025-01-19 12:00:40 +08:00
Boshen
7b219a930f
fix(minifier): fix dce shadowed undefined ( #8582 )
2025-01-18 09:04:28 +00:00
branchseer
7421a52f7c
fix(transformer/typescript): correctly resolve references to non-constant enum members ( #8543 )
...
fixes #8342
---------
Co-authored-by: overlookmotel <theoverlookmotel@gmail.com>
Co-authored-by: Dunqing <dengqing0821@gmail.com>
2025-01-18 17:02:50 +08:00
Tapan Prakash
538b24a719
feat(linter): Format the configuration documentation correctly ( #8583 )
...
The categories section in the documentation is not formatted correctly.
This fix aims to correct the formatting.
Before
<img width="1194" alt="before"
src="https://github.com/user-attachments/assets/d2eb682b-5971-43ee-bdf0-92eb2e9c78a2 "
/>
After
<img width="1266" alt="after"
src="https://github.com/user-attachments/assets/a4b992c2-fe33-4781-ad0b-de822f87c2d6 "
/>
2025-01-18 17:02:32 +08:00
Boshen
7f4b302508
chore: vitest 3.0.0 ( #8578 )
2025-01-18 12:10:01 +08:00
overlookmotel
fcbca322d7
refactor(ast): rename #[estree(with)] to #[estree(via)] ( #8564 )
...
Follow-on after #8560 . Rename `#[estree(with)]` attr introduced in #8560 for struct fields to `#[estree(via)]`. This is to match the attr which does the same thing on struct itself. e.g.:
869bc73e67/crates/oxc_ast/src/ast/literal.rs (L23-L29)
2025-01-18 03:59:59 +00:00
camc314
4d4e805691
feat(minifier): collapse if stmt with empty consequent ( #8577 )
2025-01-18 03:51:40 +00:00
overlookmotel
3fff7d293b
perf(span): align Span same as usize ( #8298 )
...
`Span` consists of 2 x `u32` (8 bytes total). Align `Span` on 8 bytes on 64-bit platforms. This means that, on 64-bit platforms, `Span` can be treated as equivalent to a `u64` and stored in a single register (instead of requiring 2).
A side-effect is that all AST structs also become aligned on 8. This will be a useful property later on as we can remove alignment calculations from `Allocator::alloc` (since everything now has same alignment).
`BooleanLiteral` (and `BoundaryAssertion`, `CharacterClassEscape` and `IndexedReference` from `oxc_regular_expression` crate) increase from 12 bytes to 16 bytes due to the higher alignment. But this makes no practical difference as they'd almost always end up with padding around them in arena anyway, as they'll be surrounded by 8-aligned types.
2025-01-18 01:47:08 +00:00
overlookmotel
bfd0b0da17
ci(benchmark): make lexer benchmark more realistic ( #8573 )
...
The lexer benchmarks had a problem. The lexer alone cannot make sense of regexp literals, template literals, or JSX text elements - it needs the parser "driving" it.
So lexer was producing plenty of errors on some benchmarks. This is unrealistic - when driven by the parser, the lexer produces no errors. Generating diagnostics is relatively expensive, so this was skewing the benchmarks somewhat.
Solve this by cleaning up the input source text to replace these syntaxes with string literals prior to running the benchmarks.
Unfortunately lexer benchmarks don't exercise the code paths for these syntaxes, but there isn't much we can do about that. We can judge by the parser benchmarks, which are the more important ones anyway.
2025-01-18 01:47:07 +00:00
sapphi-red
19d36771af
fix(ast)!: always return Array<ImportDeclarationSpecifier> for ImportDeclaration.specifiers ( #8560 )
...
refs https://github.com/oxc-project/oxc/issues/2854#issuecomment-2595115817
2025-01-17 13:04:59 +00:00
Boshen
5cb9e979fe
feat(tasks/e2e): transformer + minifier runtime tests for popular npm packages ( #8552 )
...
Code extracted from
https://github.com/privatenumber/minification-benchmarks
2025-01-17 19:13:59 +08:00
overlookmotel
007e8c017c
refactor(ast, regular_expression): shorten ContentEq implementations ( #8519 )
...
Shorten codegen-ed implementations of `ContentEq` for enums, matching what Rust produces for `#[derive(PartialEq)]` (inspired by #8517 ).
2025-01-17 06:24:08 +00:00
sapphi-red
991a22f907
feat(minifier): fold Array::concat into literal ( #8442 )
...
Compress `[].concat(a, [b])` into `[a, b]`.
**References**
- [Spec of `Array::concat`](https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.concat )
2025-01-17 06:00:07 +00:00
sapphi-red
3dc2d8b8e9
feat(minifier): fold string concat chaining ( #8441 )
...
Compress `"".concat(a).concat(b)` into `"".concat(a, b)`.
**References**
- [Spec of `String::concat`](https://tc39.es/ecma262/multipage/text-processing.html#sec-string.prototype.concat )
2025-01-17 06:00:06 +00:00
sapphi-red
a4ae4505f1
feat(minifier): fold array concat chaining ( #8440 )
...
Compress `[].concat(a).concat(b)` into `[].concat(a, b)`.
**References**
- [Spec of `Array::concat`](https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.concat )
---
### The new assumption
I added a new assumption description in `crates/oxc_minifier/README.md`: "Errors thrown when creating a String or an Array that exceeds the maximum length can disappear or moved".
This is an assumption held by other minifiers. Without this assumption, we have to treat `+` and array creation/update to have a sideeffect and that limits the minification.
For input:
```js
[...Array(Number(2n ** 32n - 1n)),""]
" ".repeat(Number(2n ** 29n - 24n - 1n)) + ' '
export {}
```
(Note that `2 ** 32 - 1` is the max array length and `2 ** 29 - 24` is the max string length on V8.)
This code errors with too long array and too long string on V8 based runtimes.
terser outputs:
```js
Array(Number(2n**32n-1n))," ".repeat(Number(536870887n));export{};
```
No error will happen with this code.
SWC outputs:
```js
[...Array(Number(2n**32n-1n))]," ".repeat(Number(2n**29n-24n-1n));export{};
```
No error will happen with this code.
[playground](https://play.swc.rs/?version=1.10.7&code=H4sIAAAAAAAAA4vW09NzLCpKrNTwK81NSi3SMMpT0NJSMAZSugqGeZqaOkpKsbxcSgpKekWpBamJJajqjCxB6oxMYKoVtBXUFdR5uVIrCvKLShSqa3m5AGRqy%2FBiAAAA&config=H4sIAAAAAAAAA32UO3LjMAyG%2B5zCozrFjostcoDtcgYOTYIyvXxoCNCxJuO7L0RJtjeG3En48AMkAOL7bbfrTmi6j903f%2FLPoAtCuf2zBcdE%2BsKWDkzUaIofqHtf6Qkn5HRAaKbrTDrSpQdqKtz%2F2u8XRRdyRlgViy365N34mNPkOBRAfLCxlUPWCInwf%2F3CSv6aAJX6aD%2FkHECnF0RpVD4R9FCkwCaHoAcEddZFiDKdVBePWUoxwUpg1VDyIPJkPfmcOOcztaCtMtmCgHwBQ%2F4MkoxzsSwhX0%2B4T8MWDrXvW59%2FqOGsQ9Uk5IRLawmfVoh6zB5JuZqkEs5wowYzXIr7U%2BmdKkC1pGfdKfu00ZO%2FAFyBoBGTjiDFbR6O52lL7V4qfXI8sjQKnOdbumWCnouqvHdCZafKQCEvdbOArQamyhrpOAveKB96Cwqc41kRQuOXJ3OUktI4QHYC4P5qJ03VDNTtFW7w6UG8wH%2F4liQP2OIRNR23KY7xkMOLBBHomO0LB24F5W1ceEtchm1ekwUeDbCiS8UGnpcAPwDKKrR9%2BTQb%2FDw4oupDPtzXxOJwve3hqFN%2Ff%2B%2FzKn5bHLqYbW1wWfJTf%2BfV%2FLu7O61beD1B5%2FFzFbac13%2FKOhgeLwYAAA%3D%3D )
esbuild outputs:
```js
[...Array(Number(2n**32n-1n))]," ".repeat(Number(2n**29n-24n-1n))+"";export{};
```
No error will happen with this code.
[esbuild try](https://esbuild.github.io/try/#dAAwLjI0LjIALS1taW5pZnkAWy4uLkFycmF5KE51bWJlcigybiAqKiAzMm4gLSAxbikpLCIiXQoiICIucmVwZWF0KE51bWJlcigybiAqKiAyOW4gLSAyNG4gLSAxbikpICsgJyAnCmV4cG9ydCB7fQ )
OXC outputs:
```js
[...Array(Number(2n**32n-1n))]," ".repeat(Number(2n**29n-24n-1n))+" ";export{};
```
The array error won't happen and the String error will happen with this code.
[playground](https://playground.oxc.rs/#eNpVT71OwzAQfhXrlv4QIhpgIBtLR8SOGZxwCUH22To7baMo746dNEVMd5/u+7sRaijhI8/zV2Y1bN96UyFvCxL7vXiM414caLfLJEj4lCRBSMgZHarwn1u8JG7xtCrEndiIjSS8OMtBjJMkyMBCOQL3lIYfKKgLlIF7zEB3FKBslPYR+No6XC9+MJXVKwqsyDeWzZU8ZeAUe+TZ0vZc47HTSMpEAwjoQ/7jY7JjjKQTvitG8n/ilDuL437zXtyC4hZjKUBfPByeITJq+4UtpvoRmI66plu4tTUpIRovNc/fXcx2qr69YRS1+opmJwps9VHbc9KfkCvr43npNU2/v/WIsw== )
2025-01-17 05:53:54 +00:00
Yuji Sugiura
64d38b86b6
refactor(prettier): Verify printing class related nodes ( #8559 )
...
Part of #5068
2025-01-17 13:46:07 +08:00
Dunqing
f413bb5c64
feat(transformer/optional-chaining): change parent scope for expression when it wrapped with an arrow function ( #8511 )
2025-01-16 12:21:44 +00:00