fix(minifier): keep new Map/WeakSet/WeakMap with a string argument#23470
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
Merging this PR will not alter performance
Comparing Footnotes
|
4e06c45 to
3f90446
Compare
48bb82e to
bee3c28
Compare
3f90446 to
6e47b47
Compare
Merge activity
|
bee3c28 to
53509a8
Compare
…ent (#23470) ## Summary `new Map("ab")` / `new WeakSet("ab")` / `new WeakMap("ab")` throw at runtime (`"a"` is not a `[k, v]` entry, and is not an object), but the shared collection purity table treated `Set`, `Map`, `WeakSet`, and `WeakMap` identically and marked any string argument pure — so these throwing constructions were dropped when unused, silently removing an observable `TypeError`. Split `Set` (which accepts any iterable of values, so a string argument is pure) from `Map` / `WeakSet` / `WeakMap` (which require `[k, v]` entries / object keys). A degenerate empty-string argument (`new Map("")` — pure, but never written in practice) is conservatively kept rather than special-cased. This aligns with esbuild, which requires array-literal entries for these constructors. Pre-existing bug, surfaced while reviewing the parent PR (#23469).
6e47b47 to
d63771e
Compare
…ent (#23470) ## Summary `new Map("ab")` / `new WeakSet("ab")` / `new WeakMap("ab")` throw at runtime (`"a"` is not a `[k, v]` entry, and is not an object), but the shared collection purity table treated `Set`, `Map`, `WeakSet`, and `WeakMap` identically and marked any string argument pure — so these throwing constructions were dropped when unused, silently removing an observable `TypeError`. Split `Set` (which accepts any iterable of values, so a string argument is pure) from `Map` / `WeakSet` / `WeakMap` (which require `[k, v]` entries / object keys). A degenerate empty-string argument (`new Map("")` — pure, but never written in practice) is conservatively kept rather than special-cased. This aligns with esbuild, which requires array-literal entries for these constructors. Pre-existing bug, surfaced while reviewing the parent PR (#23469).
d63771e to
e409fe0
Compare
### 💥 BREAKING CHANGES - 7a76cd3 estree: [**BREAKING**] Make whether to include TS fields a runtime option (#23574) (overlookmotel) - e7b6b68 estree: [**BREAKING**] `ESTree` config use methods not consts (#23573) (overlookmotel) ### 🚀 Features - 556cc6d data_structures: Add `CodeBuffer::as_str` method (#23571) (overlookmotel) - 38c4b06 parser: Add friendly error for adjacent JSX elements (#23378) (sapphi-red) - 53509a8 minifier: Treeshake pure typed arrays and Set/Map array literals (#23469) (Dunqing) - 09762d9 minifier: Inline const value for read-only vars (#22593) (Dunqing) ### 🐛 Bug Fixes - 20375f9 react_compiler: Keep imports referenced only by a computed key (#23586) (Boshen) - 31bfd9b minifier: Keep Object introspection calls on a possible Proxy (#23483) (Dunqing) - 837a395 parser: Treat a line comment after ':' as leading, not trailing (#23515) (Dunqing) - e409fe0 minifier: Keep `new Map`/`WeakSet`/`WeakMap` with a string argument (#23470) (Dunqing) - ae02b4e ci/parser: Use `minimal` for vitest reporter (#23457) (camc314) ### ⚡ Performance - cf24329 mangler: Compile slot sort once instead of per CAPACITY (#23577) (Boshen) - 4058a6a parser: Reduce code bloat from verify_modifiers monomorphization (#23576) (Boshen) - 053b0c1 estree: Remove pointless `mem::take` (#23572) (overlookmotel) - dfb52b6 transformer: Pre-size statement vecs in TS enum & namespace lowering (#23516) (Yunfei He) - 970e09a minifier: Compute template-literal inline checks in a single pass (#23467) (Yunfei He) - 3170c0e semantic,mangler,minifier: Fix `Semantic::stats` node count and reuse stats in mangler builds (#23352) (Boshen) - d1fa6e0 minifier: Evaluate ternary branches once in minimize_conditional_expression (#23479) (Yunfei He) - 3fa8051 transformer: Pre-size JSX props vec to attribute count (#23466) (Yunfei He) - 488b382 react_compiler: Borrow binding names in prefilter instead of allocating (#23471) (Yunfei He) - bcb3894 minifier: Incremental scoping refresh, delete LiveUsageCollector (#23197) (Dunqing) ### 📚 Documentation - f68641e data_structures: Improve docs on safety contract (#23575) (overlookmotel) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
…ent (#23470) ## Summary `new Map("ab")` / `new WeakSet("ab")` / `new WeakMap("ab")` throw at runtime (`"a"` is not a `[k, v]` entry, and is not an object), but the shared collection purity table treated `Set`, `Map`, `WeakSet`, and `WeakMap` identically and marked any string argument pure — so these throwing constructions were dropped when unused, silently removing an observable `TypeError`. Split `Set` (which accepts any iterable of values, so a string argument is pure) from `Map` / `WeakSet` / `WeakMap` (which require `[k, v]` entries / object keys). A degenerate empty-string argument (`new Map("")` — pure, but never written in practice) is conservatively kept rather than special-cased. This aligns with esbuild, which requires array-literal entries for these constructors. Pre-existing bug, surfaced while reviewing the parent PR (#23469).
### 💥 BREAKING CHANGES - 7a76cd3 estree: [**BREAKING**] Make whether to include TS fields a runtime option (#23574) (overlookmotel) - e7b6b68 estree: [**BREAKING**] `ESTree` config use methods not consts (#23573) (overlookmotel) ### 🚀 Features - 556cc6d data_structures: Add `CodeBuffer::as_str` method (#23571) (overlookmotel) - 38c4b06 parser: Add friendly error for adjacent JSX elements (#23378) (sapphi-red) - 53509a8 minifier: Treeshake pure typed arrays and Set/Map array literals (#23469) (Dunqing) - 09762d9 minifier: Inline const value for read-only vars (#22593) (Dunqing) ### 🐛 Bug Fixes - 20375f9 react_compiler: Keep imports referenced only by a computed key (#23586) (Boshen) - 31bfd9b minifier: Keep Object introspection calls on a possible Proxy (#23483) (Dunqing) - 837a395 parser: Treat a line comment after ':' as leading, not trailing (#23515) (Dunqing) - e409fe0 minifier: Keep `new Map`/`WeakSet`/`WeakMap` with a string argument (#23470) (Dunqing) - ae02b4e ci/parser: Use `minimal` for vitest reporter (#23457) (camc314) ### ⚡ Performance - cf24329 mangler: Compile slot sort once instead of per CAPACITY (#23577) (Boshen) - 4058a6a parser: Reduce code bloat from verify_modifiers monomorphization (#23576) (Boshen) - 053b0c1 estree: Remove pointless `mem::take` (#23572) (overlookmotel) - dfb52b6 transformer: Pre-size statement vecs in TS enum & namespace lowering (#23516) (Yunfei He) - 970e09a minifier: Compute template-literal inline checks in a single pass (#23467) (Yunfei He) - 3170c0e semantic,mangler,minifier: Fix `Semantic::stats` node count and reuse stats in mangler builds (#23352) (Boshen) - d1fa6e0 minifier: Evaluate ternary branches once in minimize_conditional_expression (#23479) (Yunfei He) - 3fa8051 transformer: Pre-size JSX props vec to attribute count (#23466) (Yunfei He) - 488b382 react_compiler: Borrow binding names in prefilter instead of allocating (#23471) (Yunfei He) - bcb3894 minifier: Incremental scoping refresh, delete LiveUsageCollector (#23197) (Dunqing) ### 📚 Documentation - f68641e data_structures: Improve docs on safety contract (#23575) (overlookmotel) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>

Summary
new Map("ab")/new WeakSet("ab")/new WeakMap("ab")throw at runtime ("a"is not a[k, v]entry, and is not an object), but the shared collection purity table treatedSet,Map,WeakSet, andWeakMapidentically and marked any string argument pure — so these throwing constructions were dropped when unused, silently removing an observableTypeError.Split
Set(which accepts any iterable of values, so a string argument is pure) fromMap/WeakSet/WeakMap(which require[k, v]entries / object keys). A degenerate empty-string argument (new Map("")— pure, but never written in practice) is conservatively kept rather than special-cased.This aligns with esbuild, which requires array-literal entries for these constructors. Pre-existing bug, surfaced while reviewing the parent PR (#23469).