All free skills / Other majors
croner 10.x
Use Croner 10.x (^10.0.0, documented at 10.0.1) to calculate, match, schedule, and control cron jobs in plain JavaScript/TypeScript scripts.
- For
croner@10.0.1- Verified
- 2026-09-07, 4 examples executed
- Skill package
@modootoday/pmcp-croner@10.0.0
Use this skill for free
No PMCP login or subscription is required. Download the original instructions, or install the content-only archive with your project's package manager.
Download SKILL.md · Download package archive
npm install --save-dev https://pmcp.build/skills/croner/10/package.tgz
PMCP discovers the installed package's instructions. Connect your runtime after installation.
Archive integrity
sha512-CKy62V1plHt0aC1hD84lb+8D35Lp2szRxOb4RVWYvi9zENkkVwNEzJwtLw/JeY51xGE0mBhIbotJZ7Sfkgv4Eg==Complete instructions
Verified against croner@10.0.1 on 2026-09-07. 4 of 4 examples executed.
croner
Scope and version
This skill targets Croner 10.x, specifically the documented 10.0.1 line. It is a library, not a separate runner or CLI: import Cron and use it from your program. Documented runtime targets include Node.js >=18, Deno >=2, Bun >=1, and browsers.
Import correctly
Use the named export and instantiate it with new:
import { Cron } from "croner";
CommonJS uses:
const { Cron } = require("croner");
Do not use import Cron from "croner"; the default export was removed in v9. Do not omit new.
Constructing jobs
The constructor accepts a cron pattern, a JavaScript Date, or an ISO 8601 string as its first argument. A Date or ISO string creates a one-shot job. The second argument is optional options, and the third is an optional callback:
const job = new Cron("* * * * * *", { maxRuns: 1 }, () => {
// called by the schedule
});
A callback can instead be supplied as the second argument:
const job = new Cron("*/5 * * * * *", () => {
// every fifth second
});
Jobs schedule immediately unless { paused: true } is supplied. Use paused: true when constructing a job for inspection or when you intend to start it explicitly.
Calculation and enumeration
These methods calculate dates without waiting for timers:
nextRun(startFromDate?)returns aDate.nextRuns(count, startFromDate?)returns scheduledDate[].previousRuns(count, referenceDate?)returns scheduledDate[].previousRun()returns the previous scheduled date.msToNext(startFromDate?)returns milliseconds until the next execution.currentRun()returns the current run information exposed by the job.
import { Cron } from "croner";
import assert from "node:assert/strict";
const job = new Cron("0 0 0 * * 7", { paused: true });
const from = new Date("2025-01-01T00:00:00Z");
const runs = job.nextRuns(2, from);
assert.equal(runs.length, 2);
assert.ok(runs[0] instanceof Date);
assert.ok(runs[1] > runs[0]);
assert.ok(job.nextRun(from) instanceof Date);
assert.ok(job.msToNext(from) >= 0);
assert.equal(job.previousRuns(1, from).length, 1);
Matching dates
match(date) checks whether a Date or date string satisfies the pattern. This was added in 10.0.0.
import { Cron } from "croner";
import assert from "node:assert/strict";
const monday = new Cron("0 0 0 * * MON", { paused: true });
assert.equal(monday.match("2024-01-01T00:00:00"), true);
assert.equal(monday.match("2024-01-02T00:00:00"), false);
assert.equal(monday.match(new Date("2024-01-01T00:00:00")), true);
One-shot dates and time zones
An ISO local time can be interpreted in a specified IANA time zone:
const job = new Cron("2024-01-23T00:00:00", {
timezone: "Asia/Kolkata",
paused: true,
});
The timezone option supports names such as Europe/Stockholm. getOnce() returns the original one-shot value as a Date, represented in the runtime’s date format; compare its timestamp or ISO representation rather than comparing it with the original string.
import { Cron } from "croner";
import assert from "node:assert/strict";
const job = new Cron("2030-01-23T00:00:00", {
timezone: "Asia/Kolkata",
paused: true,
});
assert.ok(job.getOnce() instanceof Date);
assert.equal(job.getOnce()?.toISOString(), "2030-01-22T18:30:00.000Z");
assert.ok(job.nextRun() instanceof Date);
Triggering and controlling a job
The control methods are trigger(), pause(), resume(), and stop(). Status methods include isRunning(), isStopped(), and isBusy().
stop() is permanent: a stopped job cannot be resumed. It also removes a named job from the exported scheduledJobs array. The documented import examples show Cron; do not assume the named-jobs array is available from the same documented import shape without checking the installed package.
import { Cron } from "croner";
import assert from "node:assert/strict";
let calls = 0;
const job = new Cron("* * * * * *", { paused: true }, () => {
calls += 1;
});
assert.equal(job.isRunning(), false);
assert.equal(job.isStopped(), false);
assert.equal(job.isBusy(), false);
assert.equal(job.getPattern(), "* * * * * *");
assert.equal(job.getOnce(), null);
job.trigger();
assert.equal(calls, 1);
job.pause();
job.resume();
job.stop();
assert.equal(job.isStopped(), true);
The callback-based scheduling API requires the host runtime to remain alive for timer execution. unref is documented for Node.js and Deno, not browsers.
10.x syntax and options
10.x adds an optional seventh year field, W for nearest weekday, and + for explicit day-of-month AND day-of-week logic. Examples include:
new Cron("0 12 * * * * 2025", { paused: true });
new Cron("0 12 15W * *", { paused: true });
new Cron("0 12 15 * +FRI", { paused: true });
? is now a wildcard alias for *; it no longer has the older behavior of replacing fields with current-time values.
Use domAndDow rather than deprecated legacyMode: domAndDow: false is OR logic (the default), while domAndDow: true is AND logic.
Strict stepping is now the default. Forms such as */10, 0-59/10, and 30-50/10 are valid; legacy forms /10, 0/10, and 30/30 require { sloppyRanges: true }.
Other documented 10.x options include dayOffset, mode, and alternativeWeekdays. mode can be "auto", "5-part", "6-part", "7-part", "5-or-6-parts", or "6-or-7-parts".
Migration traps
Code copied from older majors commonly uses names that no longer exist:
next()becamenextRun().enumerate()becamenextRuns().current()becamecurrentRun().previous()becamepreviousRun().running()becameisRunning().busy()becameisBusy().
Also account for the v9 removal of the default export and optional new.
Not covered
This skill does not cover undocumented exports such as the exact shape or import path of scheduledJobs, callback argument/context details, browser bundler configuration, or behavior requiring a long-lived timer run. It also does not cover package-specific CLI or runner usage because the research documents none.