What can be checked automatically
Part of this catalog is already enforced by a lint rule, so it belongs in CI rather than in a review. The rest is multi-line behaviour spread over a file, which no linter can match and a person or an agent has to recognise. Knowing which half a migration falls into is most of deciding how to tackle it.
5 a linter already finds
Turn these on and stop reviewing them by hand. This catalog names the rule rather than reimplementing the check, the same way it points at guides rather than copying them.
- Deep cloning
structuredClone() - Deferred promises
Promise.withResolvers() - Event emitters
EventTarget with CustomEvent - Grouping a list by key
Object.groupBy() and Map.groupBy() - Query string parsing
URLSearchParams and the URL constructor
All of them at once, in an eslint config:
import unicorn from "eslint-plugin-unicorn";
export default [
{
plugins: { unicorn },
rules: {
"unicorn/prefer-event-target": "error",
"unicorn/prefer-group-by": "error",
"unicorn/prefer-promise-with-resolvers": "error",
"unicorn/prefer-structured-clone": "error",
"unicorn/prefer-url-search-parameters": "error",
},
},
];26 shapes that need a person
No package is installed for any of these, so nothing matches in a package.json either. They are stateful and spread over a file, which is why no lint rule covers them. An agent reading the code can, which is what the skill and the MCP server are for.
- Animating to height auto
interpolate-size: allow-keywords, or calc-size() - Carousels
CSS scroll-snap with ::scroll-button() and ::scroll-marker() - Element resize tracking
ResizeObserver - Focus trapping
the inert attribute - Generating UUIDs
crypto.randomUUID() - Modal dialogs
<dialog> with showModal() - Multi-line text truncation
-webkit-line-clamp - Scroll chaining and body scroll lock
overscroll-behavior: contain - Styled scrollbars
scrollbar-width, scrollbar-color and scrollbar-gutter - Tooltips, dropdowns and popovers
The Popover API with CSS anchor positioning - Visibility tracking
IntersectionObserver
Not this tool's job
Three questions near this one, each better answered somewhere else. Reimplementing them here would be worse than pointing at them.
- knip
- Unused dependencies, exports and files. It reads npm scripts, config files and plugin names, which is what makes an "unused" claim trustworthy rather than a guess.
- Biome useBaseline
- The opposite direction to this catalog. It stops you using a feature before your target browsers have it, where this tells you a feature is finally old enough to replace a library.
- eslint-plugin-compat
- Checks calls against your browserslist. Useful alongside a finding here that reads as newly available.