Major Changes
-
2c8179d: Part of an estate-wide sweep pinning
type-plusto an exact8.0.0-beta.10.fsa-emitteris a wave-1 leaf — nothing else in the estate depends on it — so it goes first.Breaking: the TypeScript floor moves to 5.6
type-plus5, 6 and 7 declare notypescriptpeer at all. 8 declares>= 5.6.0. That reaches consumers here, becauseAnyFunctionis in the published declarations:import { AnyFunction } from "type-plus";
Anyone type-checking against
fsa-emitterresolves type-plus's own.d.tsand inherits the peer. Hencemajor.The last published release is 2.0.2, which already declares
type-plus: ^7.0.0— the same asmain. So the jump consumers actually see is 7 → 8.Why an exact pin
^8.0.0-beta.10resolves to>=8.0.0-beta.10 <9.0.0-0, which admits every later 8.0.0 prerelease as well as8.0.0and8.1.0. type-plus 8 is a prerelease line where breaking changes land between betas: beta.10 -> beta.11 changedEqual's signature and removedisType.f. An exact version makes each bump a reviewable PR instead of something a lockfile refresh can do silently. Move back to a caret when 8.0.0 is stable.No source change
AnyFunctionis unchanged in 8 — this package's single type-plus import needed no edit.pnpm verifypasses: 4/4 tasks, 51 tests.Second commit: first-party packages are exempt from the release-age soak
assertron@11.6.0already declarestype-plus: ^8.0.0-beta.10andtersify: ^4.0.6, but was younger than the 24h soak, so pnpm would otherwise silently resolve11.5.2instead and drag intype-plus@7.6.2andtersify@3.12.1alongside the 8.x this package pins.pnpm-workspace.yamlnow exempts first-party names and scopes. Third-party packages are unaffected:minimumReleaseAge: 1440andminimumReleaseAgeStrict: trueboth stay.pnpm why type-plus -r -> Found 1 version of type-plus (8.0.0-beta.10) pnpm why tersify -r -> Found 1 version of tersify (4.0.6)Node floor
type-plus 8 pulls
unpartial@^1.0.7, which declaresengines: node >= 20. This package already declares^20.19.0 || ^22.13.0 || >=24, so nothing moves here. -
8fd6935: Ship ESM only. The CommonJS build is gone.
What was removed
- The
cjs/output is no longer built or published, and with itmainandtypings. - The published tarball now contains
esm/only. Thets/sources are no longer shipped; the sourcemaps carrysourcesContent, so stepping into the library still shows the original TypeScript.
What replaces it
-
"type": "module"plus anexportsmap with norequirecondition:{ ".": { "types": "./esm/index.d.ts", "default": "./esm/index.js" }, "./package.json": "./package.json" } -
Declarations now sit beside the JavaScript in
esm/, where they never shipped before. The emitted file names inesm/are unchanged.
What consumers must do
- Import the package, do not
requireit. On Node 22.12 and laterrequire('fsa-emitter')still works through Node's built-in support for requiring ESM; on older runtimes it throwsERR_REQUIRE_ESM. Move toimportor dynamicimport(). - Import from the package root. Deep imports such as
fsa-emitter/esm/Emitter.jsandfsa-emitter/ts/Emitterno longer resolve, because theexportsmap does not expose subpaths. Everything the package exported is re-exported from the root. - TypeScript consumers need a module resolution that reads
exports—node16,nodenext, orbundler. The legacynoderesolution finds no entry point, sincemainandtypingsare gone.
- The
Patch Changes
-
9c64c64: Declare a supported Node range:
^20.19.0 || ^22.13.0 || >=24.Every version in that range has unflagged
require(esm), so a CommonJS consumer's
require()of this now-ESM-only package resolves rather than throwingERR_REQUIRE_ESM.
Node 18 (EOL April 2025) and Node 20.0–20.18 are excluded becauserequire()hard-fails there.