Skip to content

Commit

Permalink
Merge branch main into beta
Browse files Browse the repository at this point in the history
  • Loading branch information
sheerlox committed Aug 15, 2023
2 parents 6587792 + a09b521 commit 6146d6c
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 9 deletions.
37 changes: 37 additions & 0 deletions .github/renovate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base",
":dependencyDashboard",
":disableRateLimiting",
":pinOnlyDevDependencies",
"npm:unpublishSafe",
"docker:pinDigests",
"helpers:pinGitHubActionDigests"
],
"schedule": ["before 5am every weekday", "every weekend"],
"lockFileMaintenance": { "enabled": true, "automerge": true },
"labels": ["dependencies"],
"packageRules": [
{
"extends": ["packages:linters"],
"groupName": "linters",
"addLabels": ["linters"]
},
{
"extends": ["packages:test"],
"groupName": "tests",
"addLabels": ["tests"]
},
{
"matchDepTypes": ["devDependencies"],
"matchUpdateTypes": ["minor", "patch"],
"automerge": true
},
{
"matchDepTypes": ["action"],
"semanticCommitType": "ci",
"semanticCommitScope": "action"
}
]
}
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,41 @@

* UNIX standard alignments ([#667](https://github.com/kelektiv/node-cron/issues/667)) ([96ef954](https://github.com/kelektiv/node-cron/commit/96ef954998f9c109cc2a969296568b1b56bbbd79))

## [2.4.1](https://github.com/kelektiv/node-cron/compare/v2.4.0...v2.4.1) (2023-08-14)


### 🐛 Bug Fixes

* replace loop timeout by max match date ([#686](https://github.com/kelektiv/node-cron/issues/686)) ([c685c63](https://github.com/kelektiv/node-cron/commit/c685c63a6d7fa86d6c8afca29b536b9da24e824b))


### ⚙️ Continuous Integrations

* **renovate:** configure renovate ([#683](https://github.com/kelektiv/node-cron/issues/683)) ([9dbe962](https://github.com/kelektiv/node-cron/commit/9dbe962fad1c8b1b020441bce84ab91b1a7b4415))

## [2.4.0](https://github.com/kelektiv/node-cron/compare/v2.3.0...v2.4.0) (2023-07-24)


### ✨ Features

* import type definitions from [@types](https://github.com/types)/cron ([d8a2f14](https://github.com/kelektiv/node-cron/commit/d8a2f140b59f063897dd20b7bb4dc7f599d2435b))


### 🐛 Bug Fixes

* don't start job in setTime if it wasn't running ([7e26c23](https://github.com/kelektiv/node-cron/commit/7e26c23e06277bfeb04525c71b67703392dbb8b2))


### 🛠 Builds

* **npm:** ship type definitions with releases ([0b663a8](https://github.com/kelektiv/node-cron/commit/0b663a8584f87cbec63042a4c217f43f38869fc4))


### 🚨 Tests

* add test case for [#598](https://github.com/kelektiv/node-cron/issues/598) fix ([4322ef2](https://github.com/kelektiv/node-cron/commit/4322ef29fa8af201aed5cdf8b829d411311fe025))
* don't stop/start job before using setTime ([f0d5d3f](https://github.com/kelektiv/node-cron/commit/f0d5d3f32eddb8fd77b84438fe471fd374b34566))


### ⚙️ Continuous Integrations

Expand All @@ -19,6 +54,7 @@
### ♻️ Chores

* update default branch name ([#678](https://github.com/kelektiv/node-cron/issues/678)) ([7471e95](https://github.com/kelektiv/node-cron/commit/7471e95cb7433b4f29cfa68da0a652ec8cf630b6))
* wrap setTime tests in describe and move down ([31989e0](https://github.com/kelektiv/node-cron/commit/31989e06f939bf1e9dbc6c0b6fc62c0a7144b9eb))

## [v2.3.1](https://github.com/kelektiv/node-cron/compare/v2.3.0...v2.3.1) (2023-05-25)

Expand Down
20 changes: 12 additions & 8 deletions lib/time.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,19 +260,23 @@ function CronTime(luxon) {
throw new Error('ERROR: You specified an invalid date.');
}

// it shouldn't take more than 5 seconds to find the next execution time
// being very generous with this. Throw error if it takes too long to find the next time to protect from
// infinite loop.
const timeout = Date.now() + 5000;
/**
* maximum match interval is 8 years:
* crontab has '* * 29 2 *' and we are on 1 March 2096:
* next matching time will be 29 February 2104
* source: https://github.com/cronie-crond/cronie/blob/0d669551680f733a4bdd6bab082a0b3d6d7f089c/src/cronnext.c#L401-L403
*/
const maxMatch = luxon.DateTime.now().plus({ years: 8 });

// determine next date
while (true) {
const diff = date - start;

// hard stop if the current date is after the expected execution
if (Date.now() > timeout) {
// hard stop if the current date is after the maximum match interval
if (date > maxMatch) {
throw new Error(
`Something went wrong. It took over five seconds to find the next execution time for the cron job.
Please refer to the canonical issue (https://github.com/kelektiv/node-cron/issues/467) and provide the following string if you would like to help debug:
`Something went wrong. No execution date was found in the next 8 years.
Please provide the following string if you would like to help debug:
Time Zone: ${zone || '""'} - Cron String: ${this} - UTC offset: ${date.offset}
- current Date: ${luxon.DateTime.local().toString()}`
);
Expand Down
31 changes: 30 additions & 1 deletion tests/cron.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ describe('cron', () => {
const clock = sinon.useFakeTimers();
const callback = jest.fn();

var job = cron.job({
const job = cron.job({
cronTime: '* * * * * *',
onTick: callback,
runOnInit: true
Expand Down Expand Up @@ -768,6 +768,35 @@ describe('cron', () => {
expect(callback).toHaveBeenCalledTimes(1);
});

/**
* maximum match interval is 8 years:
* crontab has '* * 29 2 *' and we are on 1 March 2096:
* next matching time will be 29 February 2104
* source: https://github.com/cronie-crond/cronie/blob/0d669551680f733a4bdd6bab082a0b3d6d7f089c/src/cronnext.c#L401-L403
*/
it('should work correctly for max match interval', () => {
const callback = jest.fn();
const d = new Date(2096, 2, 1);
const clock = sinon.useFakeTimers(d.getTime());

const job = new cron.CronJob({
cronTime: ' * * 29 1 *',
onTick: callback,
start: true
});

// 7 years, 11 months and 27 days
const almostEightYears = 2919 * 24 * 60 * 60 * 1000;
clock.tick(almostEightYears);
expect(callback).toHaveBeenCalledTimes(0);

// tick by 1 day
clock.tick(24 * 60 * 60 * 1000);
clock.restore();
job.stop();
expect(callback).toHaveBeenCalledTimes(1);
});

describe('with utcOffset', () => {
it('should run a job using cron syntax with number format utcOffset', () => {
const clock = sinon.useFakeTimers();
Expand Down

0 comments on commit 6146d6c

Please sign in to comment.