What's Changed
@nestjs/schedule is now a native ES module, and the major version is aligned with the Nest 12 release line (there is no 7.x — 6.1.3 goes straight to 12.0.0).
ESM migration
The package is published as pure ESM ("type": "module", compiled with NodeNext) behind a proper exports map. The legacy root index.js / index.d.ts / index.ts shims are gone, and deep imports into build internals are no longer resolvable — import from the package root.
// ✅
import { ScheduleModule, Cron, CronExpression } from '@nestjs/schedule';
// ❌ no longer resolvable
import { CronExpression } from '@nestjs/schedule/dist/enums/cron-expression.enum';Only . and ./package.json are exported.
require(esm) — CommonJS still works
You do not need to convert your app to ESM. Thanks to Node's require(esm) support, a CommonJS app can keep doing:
const { ScheduleModule } = require('@nestjs/schedule');This is why the package now declares "engines": { "node": ">=20.19.0" } — require(esm) is unflagged from Node 20.19 / 22.12 onward. On older Node versions the require will throw ERR_REQUIRE_ESM.
Fixes
- Duplicate scheduler names are now rejected at startup. Two
@Cron,@Interval, or@Timeoutdeclarations sharing an explicit name previously slipped past decorator collection and only conflicted later; theDUPLICATE_SCHEDULERerror is now thrown during initialization, where you can actually see it.
Upgrading
npm i @nestjs/schedule@12- Node 20.19+ (or 22.12+) is required.
- Replace any deep imports with root imports.
- If you were importing from the removed root
index.jsshim path explicitly, drop the path —@nestjs/scheduleresolves on its own.