languages/javascript/README.md

JavaScript/TypeScript Language Overview & Ecosystem (2026)

Agent-facing 2026 JS/TS ecosystem verdicts: Node LTS lineage and the corepack/install-scripts breaking changes, Bun/Deno npm-compat numbers, Biome's type-aware linting, and the named 2025 supply-chain incidents that changed default tooling behavior.

Skip the basics - this is the delta against what a model already knows, plus decision tables. No JS/TS/ESM primer.

Runtime status (verified, do not assume from training data)

LineStatus (as of 2026-07)Key dates
Node.js 22Maintenance LTSEntered maintenance 2025-10-21, EOL 2027-04-30
Node.js 24Active LTS - current default targetStarted 2025-05-06, moves to maintenance 2026-10-20, EOL 2028-04-30
Node.js 26Current (non-LTS)Started 2026-05-05, promotes to LTS 2026-10-28

Release-cadence change, effective October 2026: Node.js moves from two majors/year to one major per April, promoted to LTS every October - every future release becomes an LTS release, there is no more "odd-numbered Current-only" line. Re-verify this against nodejs/Release before citing a specific version past 2026.

Corepack is gone from core as of Node.js 25+. The Node.js TSC voted to stop bundling it; Node 24 and earlier still ship it as experimental, Node 25+ requires npm install -g corepack separately. Any doc, Dockerfile, or CI script assuming corepack enable works out of the box on a fresh Node install is now version-dependent - pin the Node major before relying on it.

Bun (1.3.x) claims >99% Node API/npm compatibility; Deno (2.8/3.x) claims ~98% npm compatibility, the remaining gap being packages with native N-API/C++ bindings. Both numbers moved substantially since 2024 - do not cite older "Deno can't run most npm packages" framing.

Supply-chain incidents that changed default behavior - cite these, they're real

IncidentDateWhat happenedConsequence for defaults
Chalk/Debug compromise2025-09-08Maintainer Josh Junon ("qix") phished via fake npmjs.help domain; 18 packages hijacked including chalk, debug, ansi-styles, strip-ansi (2.6B combined weekly downloads); payload intercepted crypto-wallet transactionsRoot cause of renewed pressure on 2FA + publish provenance
Shai-Hulud worm2025-09 onwardFirst self-replicating npm worm: compromised @ctrl/tinycolor then auto-republished 180+ packages with a credential-stealing payload (npm/GitHub/AWS/GCP tokens via TruffleHog scanning)Direct trigger for pnpm 10's default-deny on install scripts
npm v12 install-script lockdown2026-07npm stops running preinstall/install/postinstall scripts by default; must opt in per-dependency (allowBuilds)Aligns npm with pnpm 10 (deny-by-default since early 2025), Yarn 4.14, Bun, and Deno - as of npm 12 every major package manager blocks lifecycle scripts by default

Treat "packages can run arbitrary code on npm install" as no longer the default assumption once npm 12 / pnpm 10+ / current Yarn/Bun/Deno are in play - but only for those versions; a project pinned to npm <12 without --ignore-scripts is still fully exposed to this class of attack.

Linter/formatter - corrected verdict

Biome 2.x ("Biotype", late 2025) does type-aware linting without invoking the TypeScript compiler - this closes the previously-cited Biome-vs-ESLint gap. Biome 2.3 (Jan 2026) ships 491 lint rules. In production at Vercel, Discord, Slack, Coinbase, Astro, and the Node.js project itself. Full detail and the remaining cases where ESLint still wins: codestyleguide.md.

Decision table: runtime/tooling choice

Concern2026 defaultNotes
RuntimeNode.js 24 (Active LTS)Bun for CLI/install-speed-sensitive workloads, Deno for sandboxed/untrusted-code execution
Package managerpnpm (new projects)npm 12+ acceptable now that install scripts are deny-by-default; corepack availability is now Node-version-dependent, don't assume it
Linter/formatterBiomeESLint + typescript-eslint only when a required plugin (eslint-plugin-react-hooks, @next/eslint-plugin-next) has no Biome equivalent yet
BundlerTurbopack (Next.js 16+, stable default for both dev and build) / Vite elsewhereWebpack is now the opt-out path (next build --webpack), not the default
Type checkertsc today; TypeScript 7.0 (Go-ported, RC as of 2026-06-18, ~10x faster) once GASee typescript/bestpractices.md

Sources