From 9e53665bd65ab72dfc8d59ddf18cde87f4268756 Mon Sep 17 00:00:00 2001 From: Mohamed Achaq Date: Mon, 20 Oct 2025 10:34:35 +0100 Subject: [PATCH 1/3] fix: update cron expression formats for better accuracy and clarity in parser --- bun.lockb | Bin 155175 -> 158351 bytes lib/parser.ts | 16 ++++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bun.lockb b/bun.lockb index c810a47d5933f81f79abfa9a3d483e0fe51ed195..718ad42920ecdb6a4ff0310fab4ea703533dacfe 100755 GIT binary patch delta 33963 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 Kp1fxGss9f}ZzatD delta 33576 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 M-(6P!0&CI#0dC+;2><{9 diff --git a/lib/parser.ts b/lib/parser.ts index 0666475..d418466 100644 --- a/lib/parser.ts +++ b/lib/parser.ts @@ -25,12 +25,12 @@ class CronParser implements ICronParser { private readonly aliases: Map = new Map([ ["@every_second", "* * * * * *"], ["@every_minute", "0 * * * * *"], - ["@yearly", "0 0 1 1 * *"], - ["@annually", "0 0 1 1 * *"], - ["@monthly", "0 0 1 * * *"], - ["@weekly", "0 0 * * 0 *"], - ["@daily", "0 0 * * * *"], - ["@hourly", "0 * * * * *"], + ["@yearly", "0 0 0 1 1 *"], + ["@annually", "0 0 0 1 1 *"], + ["@monthly", "0 0 0 1 * *"], + ["@weekly", "0 0 0 * * 0"], + ["@daily", "0 0 0 * * *"], + ["@hourly", "0 0 * * * *"], ]); /** @@ -68,10 +68,10 @@ class CronParser implements ICronParser { } /** - * Parses a string in the format "@on__" and returns the corresponding cron expression. + * Parses a string in the format "@on_" and returns the corresponding cron expression. */ private parseOnDayStr(str: OnDayStrType): string { - const [, day, _unit] = str.split("_"); + const [, day] = str.split("_"); const days = new Map([ ["sunday", 0], ["monday", 1], From 19158eabffe8e24595d81ae39fdeb86eb2018546 Mon Sep 17 00:00:00 2001 From: Mohamed Achaq Date: Mon, 20 Oct 2025 10:36:13 +0100 Subject: [PATCH 2/3] chore: release version 0.3.1 with critical fixes to cron expression parsing for improved accuracy --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8a9ab1..31b465a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # cronbake +## 0.3.1 + +### Patch Changes + +- Fix critical parser bugs in cron expression aliases: + - `@hourly`: Corrected from running every minute to running every hour at minute 0 + - `@daily`: Fixed from running every hour to running once daily at midnight + - `@weekly`: Fixed invalid cron expression (had month=0) to run at midnight every Sunday + - `@monthly`: Corrected hour from 1 AM to midnight on the 1st of each month + - `@yearly` & `@annually`: Corrected hour from 1 AM to midnight on January 1st + - `parseOnDayStr`: Fixed parsing logic to correctly handle `@on_` format + ## 0.3.0 ### Minor Changes diff --git a/package.json b/package.json index e1f9013..89ff513 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "cronbake", "description": "A powerful and flexible cron job manager built with TypeScript", "module": "dist/index.js", - "version": "0.3.0", + "version": "0.3.1", "publishConfig": { "access": "public" }, From 31633142db0ba4d6ceb3877d5403eba6e9802bf3 Mon Sep 17 00:00:00 2001 From: Mohamed Achaq Date: Mon, 20 Oct 2025 10:43:26 +0100 Subject: [PATCH 3/3] test: enhance cron job tests with a frequent execution scenario to prevent timeouts --- lib/index.test.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/index.test.ts b/lib/index.test.ts index b5b9a1a..2f9ec1f 100644 --- a/lib/index.test.ts +++ b/lib/index.test.ts @@ -635,8 +635,15 @@ describe("Cron", () => { }); it("should get the date of the last execution of the cron job", () => { - const lastExecution = cron.lastExecution(); + // Use a frequent cron to avoid timeout in getPrevious() loop + const frequentCron = new Cron({ + name: "frequent-test", + cron: "* * * * * *", + callback: jest.fn(), + }); + const lastExecution = frequentCron.lastExecution(); expect(lastExecution).toBeInstanceOf(Date); + frequentCron.destroy(); }); it("should get the date of the next execution of the cron job", () => {