Showing preview only (293K chars total). Download the full file or copy to clipboard to get everything.
Repository: kelektiv/node-cron
Branch: main
Commit: f38b13673d42
Files: 59
Total size: 277.5 KB
Directory structure:
gitextract_9meia9mw/
├── .commitlintrc
├── .editorconfig
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug.yaml
│ │ └── feature.yaml
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── SECURITY.md
│ ├── renovate.json
│ └── workflows/
│ ├── codeql.yml
│ ├── lint_pr_title.yml
│ ├── release.yml
│ ├── scorecards.yml
│ └── test.yml
├── .gitignore
├── .husky/
│ ├── commit-msg
│ └── pre-commit
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .releaserc
├── .vscode/
│ └── launch.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── eslint.config.mjs
├── examples/
│ ├── at_10_minutes.mjs
│ ├── at_midnight.mjs
│ ├── basic.mjs
│ ├── complex_expr.mjs
│ ├── every_10_minutes.mjs
│ ├── every_30_minutes_between_9_and_5.mjs
│ ├── get_next_runs.mjs
│ ├── in_the_past.mjs
│ ├── is_crontime_valid.mjs
│ ├── is_job_running.mjs
│ ├── long_running_on_tick.mjs
│ ├── mon_to_fri_at_11_30.mjs
│ ├── multiple_jobs.mjs
│ ├── object_param.mjs
│ ├── run_at_specific_date.mjs
│ ├── time_dom_syntax_with_tz.mjs
│ └── utc_offset_syntax.mjs
├── jest.config.json
├── package.json
├── src/
│ ├── constants.ts
│ ├── errors.ts
│ ├── index.ts
│ ├── job.ts
│ ├── time.ts
│ ├── types/
│ │ ├── cron.types.ts
│ │ └── utils.ts
│ └── utils.ts
├── tests/
│ ├── cron.fuzz.ts
│ ├── cron.test.ts
│ ├── crontime.test.ts
│ └── threshold.test.ts
├── tsconfig.build.json
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .commitlintrc
================================================
{
"extends": [
"@insurgent/commitlint-config"
]
}
================================================
FILE: .editorconfig
================================================
root = true
[*.{js}]
indent_style = tab
indent_size = 2
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yaml
================================================
name: Bug
description: Report a bug
body:
- type: textarea
id: description
attributes:
label: Description
description: Provide a more detailed introduction to the issue itself, and why you consider it to be a bug
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
description: Tell us what should happen
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: Actual Behavior
description: Tell us what happens instead
validations:
required: true
- type: textarea
id: possible-fix
attributes:
label: Possible Fix
description: Not obligatory, but suggest a fix or reason for the bug
- type: textarea
id: reproducing
attributes:
label: Steps to Reproduce
description: Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant
validations:
required: true
- type: textarea
id: context
attributes:
label: Context
description: How has this bug affected you? What were you trying to accomplish?
validations:
required: true
- type: textarea
id: environment
attributes:
label: Your Environment
description: Include as many relevant details about the environment you experienced the bug in
value: '- **`cron` version**:
- **NodeJS version**:
- **Operating System and version**:
- **TypeScript version (if applicable)**:
- **Link to your project (if applicable)**:'
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yaml
================================================
name: Feature/improvement request
description: Suggest new features or improvements
labels: ['type:feature']
body:
- type: textarea
id: suggestion
attributes:
label: ⭐ Suggestion
description: A summary of what you'd like to see added or changed
validations:
required: true
- type: textarea
id: usecases
attributes:
label: 💻 Use Cases
description: |
What are possible test cases for your suggested feature?
Are you using any workarounds in the meantime?
validations:
required: false
- type: textarea
id: relatedproblems
attributes:
label: ❌ Related Problems
description: |
Is your Request related to a problem?
Think about linking existing Issues here!
validations:
required: false
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--- Provide a general summary of your changes in the Title above (following the Conventional Commits standard) -->
<!-- More infos: https://www.conventionalcommits.org -->
<!-- Commit types: https://github.com/insurgent-lab/conventional-changelog-preset#commit-types-->
## Description
<!--- Describe your changes in detail -->
## Related Issue
<!--- This project only accepts pull requests related to open issues -->
<!--- If suggesting a new feature or change, please discuss it in an issue first -->
<!--- If fixing a bug, there should be an issue describing it with steps to reproduce -->
<!--- Please link to the issue here: -->
## Motivation and Context
<!--- Why is this change required? What problem does it solve? -->
## How Has This Been Tested?
<!--- Please describe in detail how you tested your changes. -->
<!--- Include details of your testing environment, and the tests you ran to -->
<!--- see how your change affects other areas of the code, etc. -->
## Screenshots (if appropriate):
## Types of changes
<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to change)
## Checklist:
<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
- [ ] My code follows the code style of this project.
- [ ] My change requires a change to the documentation.
- [ ] I have updated the documentation accordingly.
- [ ] I have added tests to cover my changes.
- [ ] All new and existing tests passed.
- [ ] If my change introduces a breaking change, I have added a `!` after the type/scope in the title (see the Conventional Commits standard).
================================================
FILE: .github/SECURITY.md
================================================
# Security Policy
## Reporting a Vulnerability
**Please do not report security vulnerabilities through public GitHub issues.**
Instead, please report it in a private conversation with one or more of our maintainers [on Discord](https://discord.gg/yyKns29zch).
Please encrypt your message to us using our PGP key. The key fingerprint is:
```
A656 0650 74D2 6C7D CF6E D0F4 0784 3C69 92BF C9FA
```
The key is available from [keyserver.ubuntu.com](https://keyserver.ubuntu.com/pks/lookup?search=0xA656065074D26C7DCF6ED0F407843C6992BFC9FA&fingerprint=on&op=index).
Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
- Full paths of source file(s) related to the manifestation of the issue
- The location of the affected source code (tag/branch/commit or direct URL)
- Any special configuration required to reproduce the issue
- Step-by-step instructions to reproduce the issue
- Proof-of-concept or exploit code (if possible)
- Impact of the issue, including how an attacker might exploit the issue
Please get in touch and give the project contributors a chance to resolve the vulnerability and issue a new release prior to any public exposure; this helps protect the project's users and provides them with a chance to upgrade and/or update in order to protect their applications.
## Preferred Languages
We prefer all communications to be in English.
## Policy
`cron` follows the principle of [Coordinated Vulnerability Disclosure](https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html#responsible-or-coordinated-disclosure).
================================================
FILE: .github/renovate.json
================================================
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
":dependencyDashboard",
":disableRateLimiting",
":pinOnlyDevDependencies",
"npm:unpublishSafe",
"docker:pinDigests",
"helpers:pinGitHubActionDigestsToSemver",
"security:openssf-scorecard"
],
"ignorePresets": [
":semanticPrefixFixDepsChoreOthers",
"group:semantic-releaseMonorepo",
"group:commitlintMonorepo"
],
"schedule": ["before 5am every weekday", "every weekend"],
"lockFileMaintenance": {
"enabled": true,
"automerge": true,
"automergeType": "branch"
},
"labels": ["dependencies"],
"osvVulnerabilityAlerts": true,
"packageRules": [
{
"matchPackageNames": ["*"],
"semanticCommitType": "chore",
"semanticCommitScope": "deps",
"schedule": "* * 10,25 * *"
},
{
"matchDepTypes": ["devDependencies"],
"matchUpdateTypes": ["minor", "patch", "pin", "pinDigest"],
"automerge": true,
"automergeType": "branch"
},
{
"matchDepTypes": ["dependencies"],
"semanticCommitType": "build",
"semanticCommitScope": "deps",
"schedule": "at any time"
},
{
"matchDepTypes": ["dependencies"],
"matchUpdateTypes": ["minor", "patch"],
"semanticCommitType": "build",
"automerge": true,
"automergeType": "branch"
},
{
"matchManagers": ["github-actions"],
"semanticCommitType": "chore",
"semanticCommitScope": "action",
"schedule": "* * 10,25 * *"
},
{
"matchManagers": ["github-actions"],
"matchUpdateTypes": ["minor", "patch", "pin", "pinDigest"],
"automerge": true,
"automergeType": "branch"
},
{
"extends": ["monorepo:semantic-release"],
"groupName": "semantic-release related packages",
"matchUpdateTypes": ["digest", "patch", "minor", "major"]
},
{
"extends": ["monorepo:commitlint"],
"groupName": "semantic-release related packages",
"matchUpdateTypes": ["digest", "patch", "minor", "major"]
},
{
"groupName": "semantic-release related packages",
"matchUpdateTypes": ["digest", "patch", "minor", "major"],
"matchPackageNames": [
"/@insurgent/conventional-changelog-preset/",
"/@insurgent/commitlint-config/"
]
},
{
"extends": ["packages:linters"],
"groupName": "linters",
"addLabels": ["linters"]
},
{
"extends": ["packages:test"],
"groupName": "tests",
"addLabels": ["tests"]
},
{
"matchDepTypes": ["devDependencies"],
"matchUpdateTypes": ["minor", "patch"],
"automerge": true,
"automergeType": "branch"
}
]
}
================================================
FILE: .github/workflows/codeql.yml
================================================
name: 'CodeQL'
on:
push:
branches: ['main']
pull_request:
# The branches below must be a subset of the branches above
branches: ['main']
schedule:
- cron: '0 0 * * 1'
permissions:
contents: read
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: ['typescript']
# CodeQL supports [ $supported-codeql-languages ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Harden Runner
uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc # v2.15.1
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
with:
category: '/language:${{matrix.language}}'
================================================
FILE: .github/workflows/lint_pr_title.yml
================================================
name: 'Lint PR title'
on:
pull_request_target:
types:
- opened
- edited
- synchronize
permissions:
pull-requests: write
jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- name: Harden Runner
uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc # v2.15.1
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
id: lint_pr_title
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HUSKY: 0
- uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2.9.4
# When the previous steps fails, the workflow would stop. By adding this
# condition you can continue the execution with the populated error message.
if: always() && (steps.lint_pr_title.outputs.error_message != null)
with:
header: pr-title-lint-error
message: |
Hey there and thank you for opening this pull request! 👋🏼
We require pull request titles to follow the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/) and it looks like your proposed title needs to be adjusted.
Details:
```
${{ steps.lint_pr_title.outputs.error_message }}
```
# Delete a previous comment when the issue has been resolved
- if: ${{ steps.lint_pr_title.outputs.error_message == null }}
uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2.9.4
with:
header: pr-title-lint-error
delete: true
================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on:
push:
branches:
- main
- beta
- '+([0-9])?(.{+([0-9]),x}).x'
jobs:
test:
uses: ./.github/workflows/test.yml
release:
needs: test
runs-on: ubuntu-latest
# using trusted publishing. see https://docs.npmjs.com/trusted-publishers
permissions:
id-token: write
contents: write
steps:
- name: Harden Runner
uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc # v2.15.1
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- name: Generate token
id: get_workflow_token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with:
app-id: ${{ secrets.NODE_CRON_RELEASE_APP_ID }}
private-key: ${{ secrets.NODE_CRON_RELEASE_APP_PRIVATE_KEY }}
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
token: ${{ steps.get_workflow_token.outputs.token }}
- name: Use Node.js LTS
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 'lts/*'
cache: npm
- name: Install packages
run: npm ci
- name: Audit npm signatures
run: npm audit signatures
- name: Build project
run: npm run build
- name: Run Semantic Release
run: npx semantic-release
env:
GITHUB_TOKEN: ${{ steps.get_workflow_token.outputs.token }}
HUSKY: 0
================================================
FILE: .github/workflows/scorecards.yml
================================================
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '20 7 * * 2'
push:
branches: ['main']
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
contents: read
actions: read
steps:
- name: Harden Runner
uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc # v2.15.1
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- name: 'Checkout code'
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: 'Run analysis'
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecards on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: 'Upload artifact'
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: 'Upload to code-scanning'
uses: github/codeql-action/upload-sarif@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
with:
sarif_file: results.sarif
================================================
FILE: .github/workflows/test.yml
================================================
name: Test
on:
push:
branches:
- renovate/** # branches generated by https://github.com/apps/renovate
pull_request:
branches:
- main
- beta
- '+([0-9])?(.{+([0-9]),x}).x'
workflow_call:
permissions:
contents: read
jobs:
# prevent duplicate checks on Renovate PRs
prevent-duplicate-checks:
runs-on: ubuntu-latest
steps:
- uses: insurgent-lab/is-in-pr-action@129df59687402c4a9c81a9a9e88d7448cdbba541 # v0.2.0
id: isInPR
outputs:
should-run: ${{ !(steps.isInPR.outputs.result == 'true' && startsWith(github.ref, 'refs/heads/renovate/')) }}
test_matrix:
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node: [18, 20, 22, 23, 24, 25]
runs-on: ${{ matrix.os }}
timeout-minutes: 5
needs: prevent-duplicate-checks
if: ${{ needs.prevent-duplicate-checks.outputs.should-run == 'true' }}
steps:
- name: Harden Runner
uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc # v2.15.1
with:
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
- name: Checkout project
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Use Node.js ${{ matrix.node }}
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: ${{ matrix.node }}
cache: 'npm'
- name: Install packages
run: npm ci
- name: Audit npm signatures
run: npm audit signatures
- name: Check codestyle compliance
run: npm run lint
- name: Build project
run: npm run build
- name: Run tests
run: npm run test
- name: Run fuzz tests
run: npm run test:fuzz
# separate job to set as required status check in branch protection
required_check:
runs-on: ubuntu-latest
needs:
- prevent-duplicate-checks
- test_matrix
if: ${{ !cancelled() && needs.prevent-duplicate-checks.outputs.should-run == 'true' }}
steps:
- name: All required jobs and matrix versions passed
if: ${{ !(contains(needs.*.result, 'failure')) }}
run: exit 0
- name: Some required jobs or matrix versions failed
if: ${{ contains(needs.*.result, 'failure') }}
run: exit 1
================================================
FILE: .gitignore
================================================
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# husky local debugging helper scripts
.husky/_
================================================
FILE: .husky/commit-msg
================================================
# only run commitlint on main (for admins pushing directly to branch)
[ "$(git rev-parse --abbrev-ref HEAD)" != "main" ] && exit 0
npx --no -- commitlint --edit ${1}
================================================
FILE: .husky/pre-commit
================================================
npx lint-staged
================================================
FILE: .nvmrc
================================================
24.12.0
================================================
FILE: .prettierignore
================================================
CHANGELOG.md
dist/
coverage/
================================================
FILE: .prettierrc
================================================
{
"arrowParens": "avoid",
"endOfLine": "auto",
"singleQuote": true,
"trailingComma": "none",
"useTabs": true
}
================================================
FILE: .releaserc
================================================
{
"repositoryUrl": "git@github.com:kelektiv/node-cron.git",
"branches": [
"main",
{
"name": "beta",
"prerelease": true
},
"+([0-9])?(.{+([0-9]),x}).x"
],
"tagFormat": "v${version}",
"plugins": [
[
"@semantic-release/commit-analyzer",
{
"config": "@insurgent/conventional-changelog-preset",
"releaseRules": "@insurgent/conventional-changelog-preset/release-rules"
}
],
[
"@semantic-release/release-notes-generator",
{
"config": "@insurgent/conventional-changelog-preset"
}
],
[
"@semantic-release/npm",
{
"npmPublish": true,
"provenance": true
}
],
[
"@semantic-release/changelog",
{
"changelogFile": "CHANGELOG.md"
}
],
[
"@semantic-release/git",
{
"assets": [
"CHANGELOG.md",
"package.json",
"package-lock.json"
],
"message": "Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}
],
"@semantic-release/github"
]
}
================================================
FILE: .vscode/launch.json
================================================
{
"version": "1.0.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Jest Debug",
"env": { "NODE_ENV": "test" },
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["--runInBand"],
"console": "integratedTerminal",
"windows": {
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
}
}
]
}
================================================
FILE: CHANGELOG.md
================================================
## [4.4.0](https://github.com/kelektiv/node-cron/compare/v4.3.5...v4.4.0) (2025-12-09)
### ✨ Features
* update node versions to include 24 and 25 ([#1031](https://github.com/kelektiv/node-cron/issues/1031)) ([b228e7c](https://github.com/kelektiv/node-cron/commit/b228e7cdf92106fe1af614768b2492e1cefbc20f)), closes [#1000](https://github.com/kelektiv/node-cron/issues/1000)
### ♻️ Chores
* **deps:** lock file maintenance ([570f9bc](https://github.com/kelektiv/node-cron/commit/570f9bc69bf729890c2a409a99a1eec1b287bc0a))
* **deps:** lock file maintenance ([#1026](https://github.com/kelektiv/node-cron/issues/1026)) ([ac05b84](https://github.com/kelektiv/node-cron/commit/ac05b84a238a4564a890760bdac802d591296872))
## [4.3.5](https://github.com/kelektiv/node-cron/compare/v4.3.4...v4.3.5) (2025-11-30)
### 🐛 Bug Fixes
* suppress setTimeout warning with negatives ([#1030](https://github.com/kelektiv/node-cron/issues/1030)) ([74d3b74](https://github.com/kelektiv/node-cron/commit/74d3b74dd42adeb348d6e13dd798d61fb68073a7)), closes [#1000](https://github.com/kelektiv/node-cron/issues/1000)
### ♻️ Chores
* **action:** update actions/checkout action to v5.0.1 ([0f3b9f3](https://github.com/kelektiv/node-cron/commit/0f3b9f3c12ea9e2cb8567570551f79d557f53b5f))
* **action:** update actions/checkout action to v6 ([#1028](https://github.com/kelektiv/node-cron/issues/1028)) ([232f23a](https://github.com/kelektiv/node-cron/commit/232f23adad475b70f8c958b29d47f32eb905fb96))
* **action:** update actions/create-github-app-token action to v2.2.0 ([1ade9ce](https://github.com/kelektiv/node-cron/commit/1ade9ce4ac91a5703798e1c219c59bf92abfdd81))
* **action:** update actions/setup-node action to v6 ([#1017](https://github.com/kelektiv/node-cron/issues/1017)) ([288cf0d](https://github.com/kelektiv/node-cron/commit/288cf0d83f546b86d5a7bd804a8e88182a6f38cd))
* **action:** update actions/upload-artifact action to v5 ([#1018](https://github.com/kelektiv/node-cron/issues/1018)) ([7091186](https://github.com/kelektiv/node-cron/commit/709118655aab2d222f50f3a9aff36bc50e0742fa))
* **action:** update github/codeql-action action to v3.31.2 ([8c5c4db](https://github.com/kelektiv/node-cron/commit/8c5c4db54cc2221181f839c849766dbf54a886db))
* **action:** update github/codeql-action action to v3.31.5 ([c6516f1](https://github.com/kelektiv/node-cron/commit/c6516f1cbfa8c0d3e453f5d77b14ac02faabc59a))
* **action:** update github/codeql-action action to v4 ([#1014](https://github.com/kelektiv/node-cron/issues/1014)) ([258ee3b](https://github.com/kelektiv/node-cron/commit/258ee3b0502042720fef103f864e7ffea34783ac))
* **action:** update step-security/harden-runner action to v2.13.2 ([2f44428](https://github.com/kelektiv/node-cron/commit/2f44428f3aec7829a049bb11cbbb2ed346fdf579))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.39.1 ([319462a](https://github.com/kelektiv/node-cron/commit/319462a0f972c3b1c15aa62c4b4bbfcdf7cfe251))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/github to v12.0.1 ([dfa3411](https://github.com/kelektiv/node-cron/commit/dfa341118e126dbe2e2f7be36b81d9a434cc9608))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.15.0 ([7aa02a2](https://github.com/kelektiv/node-cron/commit/7aa02a2e5996902ecbe9ed69c047cf0093cbea71))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.15.3 ([af87e4d](https://github.com/kelektiv/node-cron/commit/af87e4d391315d72ddddaddac96e43c0eef1936e))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.19.0 ([67701aa](https://github.com/kelektiv/node-cron/commit/67701aa2de16a78927ed788c07158e0b2d34fe46))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.19.1 ([2c0d2bb](https://github.com/kelektiv/node-cron/commit/2c0d2bb069847f00ab0246499ea7e21fe34eed6f))
* **deps:** update dependency [@types](https://github.com/types)/sinon to v21 ([#1029](https://github.com/kelektiv/node-cron/issues/1029)) ([028b8b7](https://github.com/kelektiv/node-cron/commit/028b8b737c1a03c4baba4ebb325e04221adf686c))
* **deps:** update semantic-release related packages ([e29b122](https://github.com/kelektiv/node-cron/commit/e29b122f0c220b654bdfeeccf6a3408144efd145))
## [4.3.4](https://github.com/kelektiv/node-cron/compare/v4.3.3...v4.3.4) (2025-11-06)
### 🐛 Bug Fixes
* catch errors in async onTick functions ([#1013](https://github.com/kelektiv/node-cron/issues/1013)) ([2ac3001](https://github.com/kelektiv/node-cron/commit/2ac300176017202cf74e281f0ec85541a961c5d2))
### 🛠 Builds
* add GitHub app token to use for release ([#1024](https://github.com/kelektiv/node-cron/issues/1024)) ([61b54f6](https://github.com/kelektiv/node-cron/commit/61b54f62940105312b4d5921a08ec57231474edb))
* remove chai since we aren't using it ([#1012](https://github.com/kelektiv/node-cron/issues/1012)) ([cf14205](https://github.com/kelektiv/node-cron/commit/cf14205a36898cad43c4ad36460a9eb457882bdf))
* switch to using built in GitHub token ([#1022](https://github.com/kelektiv/node-cron/issues/1022)) ([d24b3ea](https://github.com/kelektiv/node-cron/commit/d24b3ea1d19b463bf27826513d8f917d56aea77b))
* update release config to use trusted publishing ([#1023](https://github.com/kelektiv/node-cron/issues/1023)) ([0cb3ff6](https://github.com/kelektiv/node-cron/commit/0cb3ff6e6a561aec4ea5e2e120eb78a31a5f9b5e)), closes [#1017](https://github.com/kelektiv/node-cron/issues/1017) [#1018](https://github.com/kelektiv/node-cron/issues/1018)
* use trusted publishing to publish to NPM ([#1021](https://github.com/kelektiv/node-cron/issues/1021)) ([44f14f3](https://github.com/kelektiv/node-cron/commit/44f14f38dcbf405053354c4e1f5dbcad6d757b66))
### ♻️ Chores
* **action:** update actions/checkout action to v4.3.0 ([d8913b8](https://github.com/kelektiv/node-cron/commit/d8913b8a835e79095b84695baf3b6eea9a30bb43))
* **action:** update actions/checkout action to v5 ([#1005](https://github.com/kelektiv/node-cron/issues/1005)) ([2e2a021](https://github.com/kelektiv/node-cron/commit/2e2a02198b3e74b6526499ce1e246ed9aba9d587))
* **action:** update actions/setup-node action to v5 ([#1009](https://github.com/kelektiv/node-cron/issues/1009)) ([4a7f1f3](https://github.com/kelektiv/node-cron/commit/4a7f1f346d491632679183dbe1bfba4eabd48286))
* **action:** update amannn/action-semantic-pull-request action to v6 ([#1006](https://github.com/kelektiv/node-cron/issues/1006)) ([832ca6e](https://github.com/kelektiv/node-cron/commit/832ca6e40687bd13153001c243f684173e140cf7))
* **action:** update github/codeql-action action to v3.29.11 ([ec90183](https://github.com/kelektiv/node-cron/commit/ec90183c7be532d0dd45a97fd4aa165a16c81d55))
* **action:** update github/codeql-action action to v3.29.8 ([842e3e0](https://github.com/kelektiv/node-cron/commit/842e3e0cfe1a581a0993705e09440dd952723c39))
* **action:** update github/codeql-action action to v3.30.3 ([#1010](https://github.com/kelektiv/node-cron/issues/1010)) ([b195a01](https://github.com/kelektiv/node-cron/commit/b195a015471dca39b59220f745f2f840726ec9ef))
* **action:** update github/codeql-action action to v3.30.4 ([45a48b8](https://github.com/kelektiv/node-cron/commit/45a48b8c9067e947b734ccbe8ab1de700f2d80de))
* **action:** update github/codeql-action action to v3.30.7 ([5de5bfc](https://github.com/kelektiv/node-cron/commit/5de5bfcc31f7657acbfce9933ef5bb17ada72bcd))
* **action:** update github/codeql-action action to v3.30.8 ([4df56a5](https://github.com/kelektiv/node-cron/commit/4df56a5acf9eb38a1aa47baafb729d2685b1b05b))
* **action:** update github/codeql-action action to v3.31.0 ([14d7498](https://github.com/kelektiv/node-cron/commit/14d74984fcfd9bdcd5a04461582205b3f4e2f678))
* **action:** update ossf/scorecard-action action to v2.4.3 ([e8a33a0](https://github.com/kelektiv/node-cron/commit/e8a33a05fd7c417583957296af5695dd8b751c65))
* **action:** update step-security/harden-runner action to v2.13.1 ([2a4a2c2](https://github.com/kelektiv/node-cron/commit/2a4a2c2c94abdf6a2c6081fd844c5fffd09733bd))
* **deps:** lock file maintenance ([1de94a3](https://github.com/kelektiv/node-cron/commit/1de94a3afcf130b608310a3e3613044f7c6d504b))
* **deps:** lock file maintenance ([420c4b1](https://github.com/kelektiv/node-cron/commit/420c4b1b93eceb9afba7442f2bd77446df2506bf))
* **deps:** lock file maintenance ([ac128a2](https://github.com/kelektiv/node-cron/commit/ac128a2d64a34c9d4d984ef6f2bdf2cab7a030e5))
* **deps:** lock file maintenance ([573faca](https://github.com/kelektiv/node-cron/commit/573facaec3e62dcbb66140cb9240f448322ae275))
* **deps:** lock file maintenance ([bbb3ab2](https://github.com/kelektiv/node-cron/commit/bbb3ab21bc6249ae8206679cba381dd91a2105bd))
* **deps:** lock file maintenance ([fd06770](https://github.com/kelektiv/node-cron/commit/fd06770c325b07252682ddaa619948d379be37c4))
* **deps:** lock file maintenance ([3c5769e](https://github.com/kelektiv/node-cron/commit/3c5769efeff562a436703f120f2c37b84f0c7f74))
* **deps:** lock file maintenance ([51e2121](https://github.com/kelektiv/node-cron/commit/51e212188a1d6787a55c34d7aa1616e17e68d10d))
* **deps:** lock file maintenance ([daf30a6](https://github.com/kelektiv/node-cron/commit/daf30a60c2ed3f9b1b70f0b40999f3204d9b5536))
* **deps:** lock file maintenance ([a60f049](https://github.com/kelektiv/node-cron/commit/a60f04931e0de28d8a716f52b83011c6c9036ef2))
* **deps:** lock file maintenance ([555cbbf](https://github.com/kelektiv/node-cron/commit/555cbbfe82a23fbb0d0dac5d6e8f9ebd61e70a4a))
* **deps:** lock file maintenance ([a330852](https://github.com/kelektiv/node-cron/commit/a330852fce41c60c83abebc9b09506dae8486d11))
* **deps:** lock file maintenance ([90fbb48](https://github.com/kelektiv/node-cron/commit/90fbb487bc84f8da0bbea61be0595c91e3b22fa6))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.34.0 ([cdf3a2d](https://github.com/kelektiv/node-cron/commit/cdf3a2de3a3040b2f9ef8427a462d09ceb8a420a))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.35.0 ([#1011](https://github.com/kelektiv/node-cron/issues/1011)) ([64c84bd](https://github.com/kelektiv/node-cron/commit/64c84bd04e2218652d43bfc0582f56323adedc22))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.36.0 ([23e0fbc](https://github.com/kelektiv/node-cron/commit/23e0fbc572aa8c33696766f16e7b75163fb046ae))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.37.0 ([3a20922](https://github.com/kelektiv/node-cron/commit/3a209225620cc013b06ece09445a4fbcea6b7627))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.38.0 ([#1020](https://github.com/kelektiv/node-cron/issues/1020)) ([b853a38](https://github.com/kelektiv/node-cron/commit/b853a388754a49f853e8b011e52eb96fd8267783))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/github to v11.0.4 ([#1007](https://github.com/kelektiv/node-cron/issues/1007)) ([d04396d](https://github.com/kelektiv/node-cron/commit/d04396da14c3f8b17b4ca14e28a0470b8eaa3c34))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.13.20 ([#1019](https://github.com/kelektiv/node-cron/issues/1019)) ([c906a92](https://github.com/kelektiv/node-cron/commit/c906a92c1f6e315d5c58cdf31ad8d4382b33ba63))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.13.3 ([461e602](https://github.com/kelektiv/node-cron/commit/461e602bd7e0233e8ddcbbeab734618a65484b60))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.13.4 ([7665c00](https://github.com/kelektiv/node-cron/commit/7665c000553e94f3690b2ba0f36a5531121fc6c6))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.13.5 ([5b74613](https://github.com/kelektiv/node-cron/commit/5b746130a61533836d0fb67550dd3d84bda321be))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.17.0 ([40603d9](https://github.com/kelektiv/node-cron/commit/40603d91ef0c0ab22122301043ba0c8447d6a5c1))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.17.2 ([cce46b8](https://github.com/kelektiv/node-cron/commit/cce46b8b9622f54134931ecb08f9070ffbc8ed4f))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.18.1 ([9e07aab](https://github.com/kelektiv/node-cron/commit/9e07aabf6da956d981b190c9aaf159de7d409540))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.18.12 ([3d8843d](https://github.com/kelektiv/node-cron/commit/3d8843d6588739cc2ef2691b4665227012919a4d))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.18.6 ([438addc](https://github.com/kelektiv/node-cron/commit/438addcdde9dcf3034c3a761e083ad9a6d572062))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.18.8 ([18f6c48](https://github.com/kelektiv/node-cron/commit/18f6c48651c43edbc80ad2217bdbddd668e956fb))
* **deps:** update dependency chai to v5.3.3 ([#1008](https://github.com/kelektiv/node-cron/issues/1008)) ([a308ecb](https://github.com/kelektiv/node-cron/commit/a308ecb958992f67ab61ec5ecb709c77c9ddea71))
* **deps:** update dependency jest to v30.2.0 ([bad0c07](https://github.com/kelektiv/node-cron/commit/bad0c07c43c7df971ee0453c8d4608c3cc31c9fd))
* **deps:** update dependency typescript to v5.9.2 ([411a2da](https://github.com/kelektiv/node-cron/commit/411a2dad1cb287779803f3ed3e6ef13bc425357d))
* **deps:** update dependency typescript to v5.9.3 ([2251f01](https://github.com/kelektiv/node-cron/commit/2251f010c5e8b41d24a381dcd46f959239606491))
* **deps:** update linters ([26069e5](https://github.com/kelektiv/node-cron/commit/26069e5c5ffe17959e812cac12b99796d03ae9ea))
* **deps:** update semantic-release related packages ([4c56e18](https://github.com/kelektiv/node-cron/commit/4c56e181b8035b9a5fe390d66d09c67e00d3ed2c))
* **deps:** update semantic-release related packages ([bafbf3b](https://github.com/kelektiv/node-cron/commit/bafbf3bbc565d5c02b35644bb9ba6384b9e5f063))
* **deps:** update semantic-release related packages (major) ([#1015](https://github.com/kelektiv/node-cron/issues/1015)) ([7b06e1d](https://github.com/kelektiv/node-cron/commit/7b06e1da37cbbee922e02e2ce1ef0aa356748388))
* **deps:** update tests (major) ([#998](https://github.com/kelektiv/node-cron/issues/998)) ([99670af](https://github.com/kelektiv/node-cron/commit/99670afcaace5a62b2b803f87450b3606abc1f38))
## [4.3.3](https://github.com/kelektiv/node-cron/compare/v4.3.2...v4.3.3) (2025-08-01)
### 🛠 Builds
* **deps:** update dependency [@types](https://github.com/types)/luxon to ~3.7.0 ([9bd0c4e](https://github.com/kelektiv/node-cron/commit/9bd0c4e1c079388e1bbd3d88a153a343c61e396d))
### ♻️ Chores
* **action:** update github/codeql-action action to v3.29.4 ([f28ea6a](https://github.com/kelektiv/node-cron/commit/f28ea6a66071155c4dbed2819040bfd7da37b8d3))
* **action:** update marocchino/sticky-pull-request-comment action to v2.9.4 ([ceb7a0c](https://github.com/kelektiv/node-cron/commit/ceb7a0c1b37caab545aeebb721561f20d4736306))
* **action:** update step-security/harden-runner action to v2.13.0 ([91e2402](https://github.com/kelektiv/node-cron/commit/91e2402038284730d38109b6ad0bb76eeb3f8aab))
* **deps:** lock file maintenance ([34130fc](https://github.com/kelektiv/node-cron/commit/34130fc0d74d7765d4c1b2b21010f4009b821567))
* **deps:** lock file maintenance ([b79e0c2](https://github.com/kelektiv/node-cron/commit/b79e0c27ebe93373fdcca3a84186ee43e2042deb))
* **deps:** lock file maintenance ([281e1aa](https://github.com/kelektiv/node-cron/commit/281e1aa5875f2a7f871dde127074afb7ccd179aa))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.16.5 ([16cdbab](https://github.com/kelektiv/node-cron/commit/16cdbab1309e040fbcf316d4915456fb549f5ff2))
* **deps:** update dependency chai to v5.2.1 ([08b58ce](https://github.com/kelektiv/node-cron/commit/08b58ceb389f52a82a4965817312a1b428661dda))
* **deps:** update dependency semantic-release to v24.2.7 ([bc3fab6](https://github.com/kelektiv/node-cron/commit/bc3fab6bb8b79aa346f0e5b5c312d0334d3a082d))
* **deps:** update linters ([b692865](https://github.com/kelektiv/node-cron/commit/b6928658787c921650f6f084362b4e3108899ae7))
* **deps:** update swc monorepo ([4f3d063](https://github.com/kelektiv/node-cron/commit/4f3d063bd3617ea410ff7b965e44e3d18efbb00d))
## [4.3.2](https://github.com/kelektiv/node-cron/compare/v4.3.1...v4.3.2) (2025-07-13)
### 🛠 Builds
* **deps:** update dependency luxon to ~3.7.0 ([db69c74](https://github.com/kelektiv/node-cron/commit/db69c745016fb1b968aa42376c88da41678dc467))
### ♻️ Chores
* **action:** update github/codeql-action action to v3.29.0 ([#990](https://github.com/kelektiv/node-cron/issues/990)) ([a3fbb3c](https://github.com/kelektiv/node-cron/commit/a3fbb3cc4d98d3ddc485691092ea9a4bec208740))
* **action:** update github/codeql-action action to v3.29.2 ([0403c53](https://github.com/kelektiv/node-cron/commit/0403c53320e1b403b11ae5f8da031e93c52ba766))
* **action:** update marocchino/sticky-pull-request-comment action to v2.9.3 ([eda0c4d](https://github.com/kelektiv/node-cron/commit/eda0c4df35e15f3e2d2fff111ea4326b64d6e462))
* **action:** update ossf/scorecard-action action to v2.4.2 ([#991](https://github.com/kelektiv/node-cron/issues/991)) ([29a3a60](https://github.com/kelektiv/node-cron/commit/29a3a604ef78772f08cbf7f04dd7da001a58e8ba))
* **action:** update step-security/harden-runner action to v2.12.1 ([ba49a56](https://github.com/kelektiv/node-cron/commit/ba49a5656c163bce2ad70b09be8f7247ec3f9414))
* **action:** update step-security/harden-runner action to v2.12.2 ([845202e](https://github.com/kelektiv/node-cron/commit/845202ee974b43d366ab1183a7993b8ba6ead7fc))
* **deps:** lock file maintenance ([#989](https://github.com/kelektiv/node-cron/issues/989)) ([bc1bf72](https://github.com/kelektiv/node-cron/commit/bc1bf72ff7a7595504d936f028a3267d9d823384))
* **deps:** lock file maintenance ([#999](https://github.com/kelektiv/node-cron/issues/999)) ([e78d986](https://github.com/kelektiv/node-cron/commit/e78d9869d6cd59eaa808ecbb9366399b80e3ba99))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.12.1 ([#992](https://github.com/kelektiv/node-cron/issues/992)) ([b5d3bd3](https://github.com/kelektiv/node-cron/commit/b5d3bd332856dc46aa2742d1992b79ba44e3e48f))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.12.5 ([d374494](https://github.com/kelektiv/node-cron/commit/d374494609e698edcd35a4e5ece78c09851eba00))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.12.9 ([8060c41](https://github.com/kelektiv/node-cron/commit/8060c41685446f4b2c4ea1e0355ad388faa04ad2))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.15.32 ([#993](https://github.com/kelektiv/node-cron/issues/993)) ([ce9743b](https://github.com/kelektiv/node-cron/commit/ce9743ba05275982215c6fa8d2ca8d82013e4705))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.16.0 ([7bae5b1](https://github.com/kelektiv/node-cron/commit/7bae5b1ef895a843f0c3df176f15b50d964c895a))
* **deps:** update linters ([24eb53f](https://github.com/kelektiv/node-cron/commit/24eb53ff67d5d8f4093278d4efa1109c61b9f7f6))
* **deps:** update linters ([#995](https://github.com/kelektiv/node-cron/issues/995)) ([9395484](https://github.com/kelektiv/node-cron/commit/939548475833953c9d98d68bd9cc1b9ef1a0e738))
* **deps:** update node.js to v23.11.1 ([#985](https://github.com/kelektiv/node-cron/issues/985)) ([674a344](https://github.com/kelektiv/node-cron/commit/674a3448b5c286120174bd49ad5d1d99a156fc92))
* **deps:** update semantic-release related packages ([cc2676a](https://github.com/kelektiv/node-cron/commit/cc2676aa88e6d0c68802bd5937e148ac2284f9b2))
* **deps:** update semantic-release related packages ([#994](https://github.com/kelektiv/node-cron/issues/994)) ([4d738df](https://github.com/kelektiv/node-cron/commit/4d738df05f794f4edb13fbe0cc02ad163b694f85))
## [4.3.1](https://github.com/kelektiv/node-cron/compare/v4.3.0...v4.3.1) (2025-05-29)
### 🐛 Bug Fixes
* prevent sourcemap error in IDEs ([#988](https://github.com/kelektiv/node-cron/issues/988)) ([0db2c2d](https://github.com/kelektiv/node-cron/commit/0db2c2d3ff7d1f74d6d009c70b371d9e1fca7ae9)), closes [#987](https://github.com/kelektiv/node-cron/issues/987)
### ♻️ Chores
* **action:** update actions/setup-node action to v4.4.0 ([86f8cec](https://github.com/kelektiv/node-cron/commit/86f8cec5225aab3d03cad1aeeb3c74d605ac3177))
* **action:** update github/codeql-action action to v3.28.16 ([33d396f](https://github.com/kelektiv/node-cron/commit/33d396f0b3c9df243faafed09c1fc09ea363fd85))
* **action:** update github/codeql-action action to v3.28.17 ([97a9185](https://github.com/kelektiv/node-cron/commit/97a91859e5e08639c9eee1158f60d146cfc543f2))
* **action:** update github/codeql-action action to v3.28.18 ([6a72709](https://github.com/kelektiv/node-cron/commit/6a72709a34ecf63893345008455c0bba865095a6))
* **action:** update step-security/harden-runner action to v2.12.0 ([c0ad19d](https://github.com/kelektiv/node-cron/commit/c0ad19d8951ad15ee6fb6365a169a9534f9fa7b2))
* **deps:** lock file maintenance ([784bc9c](https://github.com/kelektiv/node-cron/commit/784bc9c8ea101be57c890d439fc2ffb17cfe539e))
* **deps:** lock file maintenance ([7a97350](https://github.com/kelektiv/node-cron/commit/7a973506fc88aeea76e01f3c7350f4c830537eb5))
* **deps:** lock file maintenance ([40163b4](https://github.com/kelektiv/node-cron/commit/40163b4cd8e63dd7188e30ef7fab8e2f25373c4b))
* **deps:** lock file maintenance ([9bcb7e3](https://github.com/kelektiv/node-cron/commit/9bcb7e3ba8eaa86fb3ab1f0a54dde12c135430fa))
* **deps:** lock file maintenance ([#983](https://github.com/kelektiv/node-cron/issues/983)) ([3df1cf6](https://github.com/kelektiv/node-cron/commit/3df1cf62d52ccfb091e487dddcc138773fd9626b))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.25.1 ([162008f](https://github.com/kelektiv/node-cron/commit/162008f2e3a3084a44f5f74a0f2d4fa626a2105a))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.27.0 ([5c1161c](https://github.com/kelektiv/node-cron/commit/5c1161cf6e72e3bec9184adab0a05d548dc2ce0c))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/github to v11.0.2 ([d27afcd](https://github.com/kelektiv/node-cron/commit/d27afcd394e60426632355ceb0f3a30ee9c4cea7))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.11.21 ([a195b0f](https://github.com/kelektiv/node-cron/commit/a195b0f5a526652be7ff7f8976a6010475cce4bb))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.11.29 ([edd52d4](https://github.com/kelektiv/node-cron/commit/edd52d463eeedb18f13495feefbbf1b19a3bd1d2))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.14.1 ([f24a7cb](https://github.com/kelektiv/node-cron/commit/f24a7cbb0a3d34906a65543a558588cbc5740b9f))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.15.15 ([#984](https://github.com/kelektiv/node-cron/issues/984)) ([bfb12a7](https://github.com/kelektiv/node-cron/commit/bfb12a76268427470bf298594ea141bd91c5a185))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.15.21 ([86b539a](https://github.com/kelektiv/node-cron/commit/86b539a309fc796846030f34aeea3514ffa6b46c))
* **deps:** update dependency lint-staged to v15.5.1 ([25a3659](https://github.com/kelektiv/node-cron/commit/25a36594fc87091af092f095dc32fec07cd911df))
* **deps:** update dependency lint-staged to v15.5.2 ([be017c5](https://github.com/kelektiv/node-cron/commit/be017c52cc709bcf69ba169c97d1a0b6f8250752))
* **deps:** update linters ([6ed6fdb](https://github.com/kelektiv/node-cron/commit/6ed6fdb4daf73088c0d124987dd9d4c8768f2434))
* **deps:** update semantic-release related packages ([555bba9](https://github.com/kelektiv/node-cron/commit/555bba9ad22f097edfd0e6b5ec5466fa9d58d0a4))
* **deps:** update swc monorepo ([edd3284](https://github.com/kelektiv/node-cron/commit/edd328409dbc8fd1f93813905b6e4107b0694d94))
## [4.3.0](https://github.com/kelektiv/node-cron/compare/v4.2.0...v4.3.0) (2025-04-15)
### ✨ Features
* add options to handle cases where jobs could stop unexpectedly ([#980](https://github.com/kelektiv/node-cron/issues/980)) ([994b93a](https://github.com/kelektiv/node-cron/commit/994b93ab2f41af729c4928f5999e2487a67f611d)), closes [#963](https://github.com/kelektiv/node-cron/issues/963) [#962](https://github.com/kelektiv/node-cron/issues/962) [#962](https://github.com/kelektiv/node-cron/issues/962) [#963](https://github.com/kelektiv/node-cron/issues/963)
## [4.2.1-beta.1](https://github.com/kelektiv/node-cron/compare/v4.2.0...v4.2.1-beta.1) (2025-04-15)
### 🐛 Bug Fixes
* prevent jobs from stopping unexpectedly ([#963](https://github.com/kelektiv/node-cron/issues/963)) ([69d2ef5](https://github.com/kelektiv/node-cron/commit/69d2ef5ce5235985ceba391e0e04379550572374))
## [4.2.0](https://github.com/kelektiv/node-cron/compare/v4.1.4...v4.2.0) (2025-04-14)
### ✨ Features
* Allow awaiting job.stop() ([#977](https://github.com/kelektiv/node-cron/issues/977)) ([e296b76](https://github.com/kelektiv/node-cron/commit/e296b76f55783925644ea7d9d10fdfce4172209c)), closes [#976](https://github.com/kelektiv/node-cron/issues/976)
### ♻️ Chores
* **action:** update github/codeql-action action to v3.28.15 ([baf9c7e](https://github.com/kelektiv/node-cron/commit/baf9c7ef2d0edcbe7ab68c86c42febfc7c662383))
* **action:** update marocchino/sticky-pull-request-comment action to v2.9.2 ([#975](https://github.com/kelektiv/node-cron/issues/975)) ([df57bef](https://github.com/kelektiv/node-cron/commit/df57befb81f7ea66045663add5919bb169b00b0b))
* **action:** update step-security/harden-runner action to v2.11.1 ([da1764d](https://github.com/kelektiv/node-cron/commit/da1764d8ff959058f263446de8cc388fe1ef86f6))
* **deps:** lock file maintenance ([c37a3ec](https://github.com/kelektiv/node-cron/commit/c37a3ec62c96c108146da8affafa733503c2d77c))
* **deps:** lock file maintenance ([#979](https://github.com/kelektiv/node-cron/issues/979)) ([6a355a3](https://github.com/kelektiv/node-cron/commit/6a355a348f8659494da563cc01ff17fff0e429f0))
* **deps:** pin dependencies ([6ddc31e](https://github.com/kelektiv/node-cron/commit/6ddc31e6e366fd79bbe9cc49034112414b2dbae3))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v2.1.1 ([3fa6836](https://github.com/kelektiv/node-cron/commit/3fa68364269855f91d0d5b19c99d03df8615c67c))
* **deps:** update dependency [@swc](https://github.com/swc)/core to v1.11.18 ([00d0685](https://github.com/kelektiv/node-cron/commit/00d06855966939040c66e696327e62e195db516f))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.14.0 ([7dedc90](https://github.com/kelektiv/node-cron/commit/7dedc9044b23715a2d92ac6cac9552bcbf969641))
* **deps:** update dependency sinon to v19.0.5 ([448934c](https://github.com/kelektiv/node-cron/commit/448934c42d6592ba5620e65395be7aa153fec099))
* **deps:** update dependency sinon to v20 ([#974](https://github.com/kelektiv/node-cron/issues/974)) ([ac25eff](https://github.com/kelektiv/node-cron/commit/ac25efff3c4cfae8ca4e4c845812359fcac92d8d))
* **deps:** update dependency typescript to v5.8.3 ([7b583a4](https://github.com/kelektiv/node-cron/commit/7b583a466f3a8cbb01870a0d1bcd40f5de2af01a))
* **deps:** update linters ([#978](https://github.com/kelektiv/node-cron/issues/978)) ([cdb638a](https://github.com/kelektiv/node-cron/commit/cdb638a342478573d8276f280236eb3f4902f1ce))
* **deps:** update node.js to v23.11.0 ([#973](https://github.com/kelektiv/node-cron/issues/973)) ([7d457cf](https://github.com/kelektiv/node-cron/commit/7d457cf34cb2f57c9eec28e46ae35cc8a512e94a))
## [4.1.4](https://github.com/kelektiv/node-cron/compare/v4.1.3...v4.1.4) (2025-04-06)
### 🛠 Builds
* **deps:** update dependency [@types](https://github.com/types)/luxon to ~3.6.0 ([dccbfc7](https://github.com/kelektiv/node-cron/commit/dccbfc79911ee73ff7a3f4863229511ed3ff70cd))
### ♻️ Chores
* **deps:** lock file maintenance ([c3190bf](https://github.com/kelektiv/node-cron/commit/c3190bffd96621d400fb9ca8f0ecff14a08e487c))
## [4.1.3](https://github.com/kelektiv/node-cron/compare/v4.1.2...v4.1.3) (2025-03-28)
### 🛠 Builds
* **deps:** update dependency luxon to ~3.6.0 ([5935617](https://github.com/kelektiv/node-cron/commit/5935617c3b51e2394b5f63a39bb28cad60d97ef1))
## [4.1.2](https://github.com/kelektiv/node-cron/compare/v4.1.1...v4.1.2) (2025-03-28)
### 🐛 Bug Fixes
* timezone should default to local ([#972](https://github.com/kelektiv/node-cron/issues/972)) ([d2b1aac](https://github.com/kelektiv/node-cron/commit/d2b1aac9c705e111a466daa85b95bed9f7725abd)), closes [#971](https://github.com/kelektiv/node-cron/issues/971) [#971](https://github.com/kelektiv/node-cron/issues/971)
## [4.1.1](https://github.com/kelektiv/node-cron/compare/v4.1.0...v4.1.1) (2025-03-26)
### 🐛 Bug Fixes
* cron should still execute after changing the time back during daylight savings ([#966](https://github.com/kelektiv/node-cron/issues/966)) ([8cf0712](https://github.com/kelektiv/node-cron/commit/8cf07121290beb1b9e1a33bd393503fa031c691a)), closes [#881](https://github.com/kelektiv/node-cron/issues/881) [#881](https://github.com/kelektiv/node-cron/issues/881)
### ♻️ Chores
* **action:** update actions/setup-node action to v4.3.0 ([e70709f](https://github.com/kelektiv/node-cron/commit/e70709f3b004f8ccdddbebf308e85aeabf76ffb5))
* **action:** update actions/upload-artifact action to v4.6.1 ([06ed76c](https://github.com/kelektiv/node-cron/commit/06ed76c0f0947132eb951b13503f7cb0db797880))
* **action:** update actions/upload-artifact action to v4.6.2 ([69ea222](https://github.com/kelektiv/node-cron/commit/69ea2223febff26b5dd0074bde002f218ba93c4c))
* **action:** update github/codeql-action action to v3.28.10 ([1d14a08](https://github.com/kelektiv/node-cron/commit/1d14a0896732686dbc1020fb3ba9d0bf890acec4))
* **action:** update github/codeql-action action to v3.28.11 ([cd28d4f](https://github.com/kelektiv/node-cron/commit/cd28d4ffb7000c35d766b564f33d2988be5b4601))
* **action:** update github/codeql-action action to v3.28.13 ([154f885](https://github.com/kelektiv/node-cron/commit/154f885d2da0c203395daa746a9fd3c378d35ab8))
* **action:** update ossf/scorecard-action action to v2.4.1 ([6a4ec39](https://github.com/kelektiv/node-cron/commit/6a4ec391836848fa4fa0949cc03acb0da1d1cf6b))
* **deps:** lock file maintenance ([6742c01](https://github.com/kelektiv/node-cron/commit/6742c01a10ec1651de29897d826b0fa21e5f44fc))
* **deps:** lock file maintenance ([a97cdb1](https://github.com/kelektiv/node-cron/commit/a97cdb19b2c179c1e7fcb07c8f5357299e252a13))
* **deps:** lock file maintenance ([c585973](https://github.com/kelektiv/node-cron/commit/c585973bf822713a8c0c9006074827732130f345))
* **deps:** lock file maintenance ([e156aa7](https://github.com/kelektiv/node-cron/commit/e156aa768821ca644c61ddd1387764aa817c85ca))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v19.8.0 ([3984884](https://github.com/kelektiv/node-cron/commit/3984884b29315d73c7323f52d238480e31da1ba3))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.22.0 ([7415480](https://github.com/kelektiv/node-cron/commit/7415480ccafddad023f62df6cd9ca975930c8315))
* **deps:** update dependency [@eslint](https://github.com/eslint)/js to v9.23.0 ([00fc7ed](https://github.com/kelektiv/node-cron/commit/00fc7ed1e679f31eeef1a057cbb791bd415c76e7))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v2.1.0 ([a9a8608](https://github.com/kelektiv/node-cron/commit/a9a860807f01fe8526e0d8983b6371ceb27c68dd))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.13.11 ([38cf6a6](https://github.com/kelektiv/node-cron/commit/38cf6a6ce15d17d888b6103457c4a0c8cb4a1019))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.13.5 ([a746320](https://github.com/kelektiv/node-cron/commit/a746320f3efe92e47423cf949f42ed1eef945a45))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.13.9 ([4ac339f](https://github.com/kelektiv/node-cron/commit/4ac339fe4848e20caad97844a283df5a4344bedd))
* **deps:** update dependency lint-staged to v15.5.0 ([5efb27f](https://github.com/kelektiv/node-cron/commit/5efb27f1e1657fc439781ba3ea1fdb2e571ea03e))
* **deps:** update dependency prettier to v3.5.3 ([d8f2456](https://github.com/kelektiv/node-cron/commit/d8f245616d1415fa08569ac571af4db77ed7f4ab))
* **deps:** update dependency sinon to v19.0.4 ([5144f4d](https://github.com/kelektiv/node-cron/commit/5144f4dfd90d0755591200cf957b3aff76f52afb))
* **deps:** update dependency ts-jest to v29.2.6 ([3625528](https://github.com/kelektiv/node-cron/commit/3625528fbcd2fd0e3da63a03e80271541fe92086))
* **deps:** update dependency typescript to v5.8.2 ([4ef66e8](https://github.com/kelektiv/node-cron/commit/4ef66e84985b5b2259ae67aded6391f5cbd3a5ec))
* **deps:** update linters ([ecbe916](https://github.com/kelektiv/node-cron/commit/ecbe916c825663839038e94a23aefe5c91744fe5))
* **deps:** update node.js to v23.10.0 ([#970](https://github.com/kelektiv/node-cron/issues/970)) ([6775fff](https://github.com/kelektiv/node-cron/commit/6775fff2d06798954d60cc66964e2b671a8be1e7))
* **deps:** update tests ([5d5e555](https://github.com/kelektiv/node-cron/commit/5d5e55527a5dc108f814f5ab8825e405b91a467d))
## [4.1.0](https://github.com/kelektiv/node-cron/compare/v4.0.0...v4.1.0) (2025-02-24)
### ✨ Features
* add isCronTimeValid function to validate cron expressions ([#959](https://github.com/kelektiv/node-cron/issues/959)) ([cbd8106](https://github.com/kelektiv/node-cron/commit/cbd81063229036859fbb6969d4f628a0e7945e57))
### ♻️ Chores
* **action:** update actions/setup-node action to v4.2.0 ([#950](https://github.com/kelektiv/node-cron/issues/950)) ([3a4a701](https://github.com/kelektiv/node-cron/commit/3a4a7015b59c56434b462754728e4ed6483202ef))
* **action:** update github/codeql-action action to v3.28.9 ([#946](https://github.com/kelektiv/node-cron/issues/946)) ([84ebb32](https://github.com/kelektiv/node-cron/commit/84ebb32e0db478e48e82203099ec0e301021cfc3))
* **action:** update marocchino/sticky-pull-request-comment action to v2.9.1 ([#947](https://github.com/kelektiv/node-cron/issues/947)) ([7cdcbc2](https://github.com/kelektiv/node-cron/commit/7cdcbc21676fa48f78d58146590e9f59796b56b9))
* **action:** update step-security/harden-runner action to v2.11.0 ([#948](https://github.com/kelektiv/node-cron/issues/948)) ([b7f9c79](https://github.com/kelektiv/node-cron/commit/b7f9c794f95a95d19a4bfa11d2778dc6a0a21666))
* **deps:** lock file maintenance ([fa08aa3](https://github.com/kelektiv/node-cron/commit/fa08aa3e0edacdc324381cff33160d49b6db6af0))
* **deps:** lock file maintenance ([#944](https://github.com/kelektiv/node-cron/issues/944)) ([374ac42](https://github.com/kelektiv/node-cron/commit/374ac429d4ff6f19440d4c18d6e366a69cfea233))
* **deps:** update dependency [@types](https://github.com/types)/node to v22.13.4 ([#952](https://github.com/kelektiv/node-cron/issues/952)) ([05f1702](https://github.com/kelektiv/node-cron/commit/05f17020fe33ded1839c43132caa0b3dc2770f6e))
* **deps:** update dependency lint-staged to v15.4.3 ([#953](https://github.com/kelektiv/node-cron/issues/953)) ([b99fc3b](https://github.com/kelektiv/node-cron/commit/b99fc3b82c613b3686930f2055a2b8e10134238b))
* **deps:** update dependency typescript to v5.7.3 ([#949](https://github.com/kelektiv/node-cron/issues/949)) ([5313b71](https://github.com/kelektiv/node-cron/commit/5313b71e20bcd7a417fce03966cfa5c78062b05a))
* **deps:** update linters ([#954](https://github.com/kelektiv/node-cron/issues/954)) ([9159759](https://github.com/kelektiv/node-cron/commit/91597592d05770b7e31bbd93eb0b4160da175154))
* **deps:** update semantic-release related packages ([#951](https://github.com/kelektiv/node-cron/issues/951)) ([92d7ac3](https://github.com/kelektiv/node-cron/commit/92d7ac3f8fa6fcbf37ead72abc3f798fdc05370a))
* remove bower.json, which is unused ([#955](https://github.com/kelektiv/node-cron/issues/955)) ([8e509f3](https://github.com/kelektiv/node-cron/commit/8e509f3ad7dcd5d250e75a41417830b9b01c2bdb))
## [4.0.0](https://github.com/kelektiv/node-cron/compare/v3.5.0...v4.0.0) (2025-02-19)
### ⚠ Breaking changes
* drop support for Node v16 and rename job.running to job.isActive (#957)
### 📦 Code Refactoring
* drop support for Node v16 and rename job.running to job.isActive ([#957](https://github.com/kelektiv/node-cron/issues/957)) ([605e94e](https://github.com/kelektiv/node-cron/commit/605e94ef3b6469caf2e8526d0935014eea8804c8)), closes [#902](https://github.com/kelektiv/node-cron/issues/902) [#905](https://github.com/kelektiv/node-cron/issues/905)
### ♻️ Chores
* **action:** update actions/checkout action to v4.2.2 ([#927](https://github.com/kelektiv/node-cron/issues/927)) ([ff1721e](https://github.com/kelektiv/node-cron/commit/ff1721e95f1a0d7291f3809dd89af8a0956b8f7f))
* **action:** update actions/setup-node action to v4.1.0 ([#928](https://github.com/kelektiv/node-cron/issues/928)) ([3e27773](https://github.com/kelektiv/node-cron/commit/3e277738b4a5d096f5990602c3d7aaff02f5961c))
* **action:** update actions/upload-artifact action to v4.6.0 ([#931](https://github.com/kelektiv/node-cron/issues/931)) ([8283000](https://github.com/kelektiv/node-cron/commit/82830003bcb375b55ae86b2038305af69f587d33))
* **action:** update amannn/action-semantic-pull-request action to v5.5.3 ([#929](https://github.com/kelektiv/node-cron/issues/929)) ([f1851d7](https://github.com/kelektiv/node-cron/commit/f1851d7d3f4780ef7f6834f35999f93cae5961cf))
* **action:** update github/codeql-action action to v3.28.1 ([#922](https://github.com/kelektiv/node-cron/issues/922)) ([eefd476](https://github.com/kelektiv/node-cron/commit/eefd47698bad8da9c9cad15fba9ecc0925b95f49))
* **deps:** lock file maintenance ([c3af5fc](https://github.com/kelektiv/node-cron/commit/c3af5fc439b822683377abea4a7e957ee7743c5c))
* **deps:** lock file maintenance ([d689a1c](https://github.com/kelektiv/node-cron/commit/d689a1c489f9576de49da8ee8489cbaf700be3c3))
* **renovate:** improve schedules & automerging to reduce noise ([#942](https://github.com/kelektiv/node-cron/issues/942)) ([c253032](https://github.com/kelektiv/node-cron/commit/c253032d520edd09f29e111fa181f4977a7f9d53))
## [3.5.0](https://github.com/kelektiv/node-cron/compare/v3.4.0...v3.5.0) (2025-01-10)
### ✨ Features
* throw instead of silently rewriting invalid cron expressions ([#937](https://github.com/kelektiv/node-cron/issues/937)) ([dcc5b93](https://github.com/kelektiv/node-cron/commit/dcc5b939fb08a806793799019c9f256bd137c33d))
### ⚙️ Continuous Integrations
* **action:** update step-security/harden-runner action to v2.10.3 ([#943](https://github.com/kelektiv/node-cron/issues/943)) ([cd7ee9f](https://github.com/kelektiv/node-cron/commit/cd7ee9f62fbdd16ec150e9e5aa69d8852f5b3dcb))
### ♻️ Chores
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.12 ([2a867f9](https://github.com/kelektiv/node-cron/commit/2a867f9c34c216ac04ce8bce34e0e16578f7dd0c))
* **deps:** update dependency [@types](https://github.com/types)/node to v22 ([#900](https://github.com/kelektiv/node-cron/issues/900)) ([f7548bd](https://github.com/kelektiv/node-cron/commit/f7548bd3b6981514abd174341b39813d0d6f239a))
## [3.4.0](https://github.com/kelektiv/node-cron/compare/v3.3.2...v3.4.0) (2025-01-09)
### ✨ Features
* error handling on ticks ([#861](https://github.com/kelektiv/node-cron/issues/861)) ([0d3161f](https://github.com/kelektiv/node-cron/commit/0d3161ff7831752edade0333e4ae9ce70e50ac0b)), closes [#426](https://github.com/kelektiv/node-cron/issues/426)
### 📚 Documentation
* **contributing:** add "Submitting a Pull Request" & "Coding Rules" sections ([#936](https://github.com/kelektiv/node-cron/issues/936)) ([ddd8988](https://github.com/kelektiv/node-cron/commit/ddd89881bcb2f3737e1ea50296fe25294d112bdd))
### ♻️ Chores
* **deps:** lock file maintenance ([494b4bf](https://github.com/kelektiv/node-cron/commit/494b4bf5d61ba2b4d57e7b46cd433bcb4577d525))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.11 ([2978e92](https://github.com/kelektiv/node-cron/commit/2978e92ba1a26dfe8de7eb6c1ee4b3847cf18279))
* **deps:** update dependency lint-staged to v15.3.0 ([11f9bad](https://github.com/kelektiv/node-cron/commit/11f9badb761d06cd74a543116854094559acb813))
* **deps:** update semantic-release related packages ([b830bdb](https://github.com/kelektiv/node-cron/commit/b830bdb41df2ebc48d3510ffd71f3d59255eaf11))
* **deps:** update tests (major) ([#826](https://github.com/kelektiv/node-cron/issues/826)) ([e47fd5a](https://github.com/kelektiv/node-cron/commit/e47fd5aaefb5452fd06e4a76b847110a13832456))
## [3.3.2](https://github.com/kelektiv/node-cron/compare/v3.3.1...v3.3.2) (2024-12-30)
### 🐛 Bug Fixes
* fix infinite loop on expressions resolving only inside a DST forward jump ([#938](https://github.com/kelektiv/node-cron/issues/938)) ([efb8df5](https://github.com/kelektiv/node-cron/commit/efb8df53405b4ce2ea2e70be9e4d90c124616a51)), closes [/github.com/kelektiv/node-cron/pull/667/files#diff-c14c2dca8456f15417b39cfbd9758009f8eb4f3a190a415768d6e4ae6ae9dceeL473-L477](https://github.com/kelektiv//github.com/kelektiv/node-cron/pull/667/files/issues/diff-c14c2dca8456f15417b39cfbd9758009f8eb4f3a190a415768d6e4ae6ae9dceeL473-L477) [#919](https://github.com/kelektiv/node-cron/issues/919) [#919](https://github.com/kelektiv/node-cron/issues/919)
### ⚙️ Continuous Integrations
* **action:** update marocchino/sticky-pull-request-comment action to v2.9.0 ([#930](https://github.com/kelektiv/node-cron/issues/930)) ([1e7bce9](https://github.com/kelektiv/node-cron/commit/1e7bce9d12a774104f39c1d75b37bdb134e4b270))
* **renovate:** pin GitHub action digests to semver ([#926](https://github.com/kelektiv/node-cron/issues/926)) ([6541167](https://github.com/kelektiv/node-cron/commit/654116766a299bc5ac5d21a99e2abd7ccc4f43fe))
### ♻️ Chores
* **deps:** lock file maintenance ([70c3339](https://github.com/kelektiv/node-cron/commit/70c333955612d39b692ab9535b36fe33423eb593))
* **deps:** lock file maintenance ([afad454](https://github.com/kelektiv/node-cron/commit/afad454e5e4f52e3da54965a0e10540e035c4f58))
* **deps:** lock file maintenance ([b1dbf69](https://github.com/kelektiv/node-cron/commit/b1dbf69104a58022a638d5b68b59f85089fae7c6))
* **deps:** pin dependencies ([#915](https://github.com/kelektiv/node-cron/issues/915)) ([dfcbd3c](https://github.com/kelektiv/node-cron/commit/dfcbd3cf7d901415bda5b4929566bd4ad527af62))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v19.6.1 ([7999427](https://github.com/kelektiv/node-cron/commit/799942794b6cff0966fe4977260728c4f9721385))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/release-notes-generator to v14.0.2 ([93c9373](https://github.com/kelektiv/node-cron/commit/93c9373ae020e535683d6c65bff9e1eeabe20d4a))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.10 ([9313ffd](https://github.com/kelektiv/node-cron/commit/9313ffd148e88d68251b13e3b7ec5028d372a9d2))
* **deps:** update dependency lint-staged to v15.2.11 ([100c9ff](https://github.com/kelektiv/node-cron/commit/100c9ff2f67246b73e6cf053aa581e87a31aed0a))
## [3.3.1](https://github.com/kelektiv/node-cron/compare/v3.3.0...v3.3.1) (2024-12-12)
### 🐛 Bug Fixes
* correct waitForCompletion behavior ([#924](https://github.com/kelektiv/node-cron/issues/924)) ([f6270f8](https://github.com/kelektiv/node-cron/commit/f6270f869d1d472c276f3e153d491f964ba6a4ec)), closes [#923](https://github.com/kelektiv/node-cron/issues/923) [#923](https://github.com/kelektiv/node-cron/issues/923) [#894](https://github.com/kelektiv/node-cron/issues/894)
## [3.3.0](https://github.com/kelektiv/node-cron/compare/v3.2.1...v3.3.0) (2024-12-10)
### ✨ Features
* support async handling and add CronJob status tracking ([#894](https://github.com/kelektiv/node-cron/issues/894)) ([b58fb6b](https://github.com/kelektiv/node-cron/commit/b58fb6b1dc122a6d55bd13134aab1a038e9a531d)), closes [#713](https://github.com/kelektiv/node-cron/issues/713) [#556](https://github.com/kelektiv/node-cron/issues/556)
### ⚙️ Continuous Integrations
* **action:** update github/codeql-action action to v3.27.2 ([#912](https://github.com/kelektiv/node-cron/issues/912)) ([d11ba30](https://github.com/kelektiv/node-cron/commit/d11ba304b380e03e3fa3f7f1185b3eb6cb259405))
* **action:** update github/codeql-action action to v3.27.5 ([#917](https://github.com/kelektiv/node-cron/issues/917)) ([2a4035e](https://github.com/kelektiv/node-cron/commit/2a4035e4310495847a3cfa54a893e2c216d54c09))
* **action:** update step-security/harden-runner action to v2.10.2 ([#920](https://github.com/kelektiv/node-cron/issues/920)) ([26a8f9f](https://github.com/kelektiv/node-cron/commit/26a8f9f714c04077f77d24214676feeb1ccf1837))
* add pre-commit hook to lint and prettify ([#911](https://github.com/kelektiv/node-cron/issues/911)) ([e1140d1](https://github.com/kelektiv/node-cron/commit/e1140d1f6d4fa79d7a2abb876a4aad9c111fec2f)), closes [#907](https://github.com/kelektiv/node-cron/issues/907)
### ♻️ Chores
* **deps:** lock file maintenance ([94465ae](https://github.com/kelektiv/node-cron/commit/94465aed29609c20fc1f24b52547fb022782a164))
* **deps:** lock file maintenance ([23d67a4](https://github.com/kelektiv/node-cron/commit/23d67a4c5095ac96bb37ae2dae9b5a72b580aca4))
* **deps:** lock file maintenance ([135fdf7](https://github.com/kelektiv/node-cron/commit/135fdf7667ce5a4516dab975b1592fe43a7d2882))
* **deps:** lock file maintenance ([edcff3b](https://github.com/kelektiv/node-cron/commit/edcff3b87750057d82ec8df62770dad63af00d59))
* **deps:** pin dependency lint-staged to 15.2.10 ([#916](https://github.com/kelektiv/node-cron/issues/916)) ([5cf24da](https://github.com/kelektiv/node-cron/commit/5cf24da52ea060622e21521212824f33020908d2))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v19.6.0 ([9d9ab94](https://github.com/kelektiv/node-cron/commit/9d9ab94196e590b814c2693ff3fcbc7074eca4b4))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.7 ([9181b6a](https://github.com/kelektiv/node-cron/commit/9181b6ac234bee70f3c426059645336610affa8b))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.8 ([5899fc2](https://github.com/kelektiv/node-cron/commit/5899fc22c19fb7b95c0f3e812e2330db3e272e3c))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.9 ([ca5065a](https://github.com/kelektiv/node-cron/commit/ca5065a4d784922feec0257e8ac999f5aa3a9667))
* **deps:** update dependency husky to v9.1.7 ([a960a29](https://github.com/kelektiv/node-cron/commit/a960a2927cf43f7b212b38aec290e0ad266b33c7))
* **deps:** update dependency typescript to v5.7.2 ([3447ff5](https://github.com/kelektiv/node-cron/commit/3447ff5f868981a70beeef804bff9139484f6d12))
## [3.2.1](https://github.com/kelektiv/node-cron/compare/v3.2.0...v3.2.1) (2024-11-12)
### 🛠 Builds
* migrate eslint config to flat style ([#913](https://github.com/kelektiv/node-cron/issues/913)) ([38c1044](https://github.com/kelektiv/node-cron/commit/38c104492a229123bbbaf0dad943fee2122ece72)), closes [#899](https://github.com/kelektiv/node-cron/issues/899)
## [3.2.0](https://github.com/kelektiv/node-cron/compare/v3.1.9...v3.2.0) (2024-11-12)
### ✨ Features
* add support for Node v22 ([#914](https://github.com/kelektiv/node-cron/issues/914)) ([9147b20](https://github.com/kelektiv/node-cron/commit/9147b20de6f243a1ab82c86ac836221462ff7695))
### ⚙️ Continuous Integrations
* **action:** update actions/checkout action to v4.2.2 ([#880](https://github.com/kelektiv/node-cron/issues/880)) ([293f54a](https://github.com/kelektiv/node-cron/commit/293f54a3dbd832153ecd995bb77f754d56f03156))
* **action:** update actions/checkout digest to 11bd719 ([#879](https://github.com/kelektiv/node-cron/issues/879)) ([0287c69](https://github.com/kelektiv/node-cron/commit/0287c69400122a98689c86785bade332875ddd35))
* **action:** update actions/setup-node digest to 39370e3 ([#889](https://github.com/kelektiv/node-cron/issues/889)) ([0f7a3aa](https://github.com/kelektiv/node-cron/commit/0f7a3aab6825c491ca3475d95fb3c381f96391f6))
* **action:** update actions/upload-artifact action to v4.4.3 ([#878](https://github.com/kelektiv/node-cron/issues/878)) ([226ad5b](https://github.com/kelektiv/node-cron/commit/226ad5bd3764b19b651f1fa46fbcf67a0e867576))
* **action:** update step-security/harden-runner action to v2.10.1 ([#882](https://github.com/kelektiv/node-cron/issues/882)) ([b09438e](https://github.com/kelektiv/node-cron/commit/b09438ea8f7121d197685311edc16e6b665f4183))
### ♻️ Chores
* **deps:** lock file maintenance ([ad613cb](https://github.com/kelektiv/node-cron/commit/ad613cbf4dc6160c63107bae192f58b89b3252d2))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v2.0.3 ([2d00739](https://github.com/kelektiv/node-cron/commit/2d00739e2cdc040f89f0c37e39a6d6f821130f79))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/github to v11.0.1 ([a17bbdd](https://github.com/kelektiv/node-cron/commit/a17bbdd964d019c341480368542a143dbc8cb20a))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.6 ([4509c4d](https://github.com/kelektiv/node-cron/commit/4509c4d7e3dfaef03b1258a00a91cb7783ec3604))
* **deps:** update dependency husky to v9 ([#844](https://github.com/kelektiv/node-cron/issues/844)) ([9ea2216](https://github.com/kelektiv/node-cron/commit/9ea22166bccce4967be732e3e56205059acafc90))
## [3.1.9](https://github.com/kelektiv/node-cron/compare/v3.1.8...v3.1.9) (2024-11-04)
### 🛠 Builds
* **typescript:** add missing "types" property to package.json ([#908](https://github.com/kelektiv/node-cron/issues/908)) ([1953c97](https://github.com/kelektiv/node-cron/commit/1953c973652175cd751beeb12a57e640f1abb958))
### 📚 Documentation
* Add .nvmrc with recommended Node version for development ([#904](https://github.com/kelektiv/node-cron/issues/904)) ([91848e9](https://github.com/kelektiv/node-cron/commit/91848e9267dd8a05acba6b8d705930ddd5c5196e))
### ⚙️ Continuous Integrations
* **action:** update github/codeql-action action to v3.27.0 ([#866](https://github.com/kelektiv/node-cron/issues/866)) ([a6dd871](https://github.com/kelektiv/node-cron/commit/a6dd8710279662a67f7c3ec0cef2f61553bb605b))
* **action:** update ossf/scorecard-action action to v2.4.0 ([#883](https://github.com/kelektiv/node-cron/issues/883)) ([e0880a1](https://github.com/kelektiv/node-cron/commit/e0880a1fd6722e87d134035ecd4f4232a8e303dd))
### ♻️ Chores
* **config:** migrate renovate config ([#903](https://github.com/kelektiv/node-cron/issues/903)) ([5ce34f4](https://github.com/kelektiv/node-cron/commit/5ce34f4cfa01341a453283b7d8599d1b6380f2aa))
* **deps:** lock file maintenance ([be77f4a](https://github.com/kelektiv/node-cron/commit/be77f4ad329cd2988be470db51e9750ee34a3fe6))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v2 ([#891](https://github.com/kelektiv/node-cron/issues/891)) ([20c448b](https://github.com/kelektiv/node-cron/commit/20c448bd569efb954a03591ac479d927f9e6bc5f))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.2 ([24fa266](https://github.com/kelektiv/node-cron/commit/24fa266d30e4e377d549cf3c230257a3fb0d0621))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.3 ([5bd340e](https://github.com/kelektiv/node-cron/commit/5bd340e3bab6dd340153804667a58ea829948e17))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.4 ([1ce42a4](https://github.com/kelektiv/node-cron/commit/1ce42a483b78506cfdb542bf0a3e6f9c71d6efe3))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.5 ([767c430](https://github.com/kelektiv/node-cron/commit/767c43072a669a6c3ea808185cc8a424293bd7bc))
* **deps:** update semantic-release related packages (major) ([#835](https://github.com/kelektiv/node-cron/issues/835)) ([73a8d37](https://github.com/kelektiv/node-cron/commit/73a8d3714e0b8e817f882f5ae090320d313c914d))
## [3.1.8](https://github.com/kelektiv/node-cron/compare/v3.1.7...v3.1.8) (2024-10-29)
### 🛠 Builds
* **deps:** update dependency luxon to ~3.5.0 ([676045b](https://github.com/kelektiv/node-cron/commit/676045b45506146a4906661efe130be508f7e4fe))
### ⚙️ Continuous Integrations
* allow Renovate to auto-merge minor and patch dependency version updates ([#901](https://github.com/kelektiv/node-cron/issues/901)) ([3899b5d](https://github.com/kelektiv/node-cron/commit/3899b5d926cc531850d7551552c178a9b45e2a1d))
### ♻️ Chores
* **deps:** lock file maintenance ([f28aed4](https://github.com/kelektiv/node-cron/commit/f28aed49ad5dfdd3bca38a5331006f876d5b223f))
* **deps:** lock file maintenance ([a420629](https://github.com/kelektiv/node-cron/commit/a4206292daae053af00705d06af855306de533a9))
* **deps:** lock file maintenance ([63a1cf1](https://github.com/kelektiv/node-cron/commit/63a1cf1b46d1b9e4f0efe54db6dc6806640e1f15))
* **deps:** lock file maintenance ([7366c8f](https://github.com/kelektiv/node-cron/commit/7366c8f5dc13dc31d8768a3f5151d4faa5e0478d))
* **deps:** lock file maintenance ([c44d785](https://github.com/kelektiv/node-cron/commit/c44d78557c65821bd28cd66f10e4a5e67f50835b))
* **deps:** lock file maintenance ([cf74b29](https://github.com/kelektiv/node-cron/commit/cf74b29a1f6d2efba9de31f4c891571feb1af9e9))
* **deps:** lock file maintenance ([67b2327](https://github.com/kelektiv/node-cron/commit/67b2327ac88ba9d133f9e4d793c55c1664225966))
* **deps:** lock file maintenance ([190d845](https://github.com/kelektiv/node-cron/commit/190d8452b024f76615966d1187993850ee9d7850))
* **deps:** lock file maintenance ([166c4a2](https://github.com/kelektiv/node-cron/commit/166c4a2798c55960ed1a326074dfc20d46112b14))
* **deps:** lock file maintenance ([b6680c7](https://github.com/kelektiv/node-cron/commit/b6680c7d8f01c6c604810d3bf993ff05dd6c47c1))
* **deps:** lock file maintenance ([18679e9](https://github.com/kelektiv/node-cron/commit/18679e97d4f29d69ab617ded35fffcf0e58dbd9f))
* **deps:** lock file maintenance ([d99fc57](https://github.com/kelektiv/node-cron/commit/d99fc5758e38979b92d54a8b8bf50c46359ad9a7))
* **deps:** lock file maintenance ([8c63a93](https://github.com/kelektiv/node-cron/commit/8c63a93b376e487318f84dd145c559bec73f3633))
* **deps:** lock file maintenance ([91a5d20](https://github.com/kelektiv/node-cron/commit/91a5d20bc635d11734dba05ab67493c3fa43a6da))
* **deps:** lock file maintenance ([738f2ac](https://github.com/kelektiv/node-cron/commit/738f2ac6ff2ccb9cdd21b959bca7dc901fc01ea4))
* **deps:** lock file maintenance ([59df061](https://github.com/kelektiv/node-cron/commit/59df061e0d7e2c581c43ef2815d00dd2d7b0fa7a))
* **deps:** lock file maintenance ([ad3aac7](https://github.com/kelektiv/node-cron/commit/ad3aac73ac4bd492c516f2864b4041394c9d6299))
* **deps:** lock file maintenance ([abda61e](https://github.com/kelektiv/node-cron/commit/abda61e936ba909bcfa6858dceced300175c5b71))
* **deps:** lock file maintenance ([b6954f8](https://github.com/kelektiv/node-cron/commit/b6954f8214ae13ea3ce3e4a5944da4ec497dffad))
* **deps:** lock file maintenance ([650401f](https://github.com/kelektiv/node-cron/commit/650401f401c0063079421d5d5481ae36d83e5cb1))
* **deps:** lock file maintenance ([a9cd1a6](https://github.com/kelektiv/node-cron/commit/a9cd1a699c943b105537a933f34cf3f4e4a1fc69))
* **deps:** lock file maintenance ([652b595](https://github.com/kelektiv/node-cron/commit/652b5958ec567f46302350ab9ba78290a0571a8f))
* **deps:** lock file maintenance ([e52f3e7](https://github.com/kelektiv/node-cron/commit/e52f3e7d2bfba0048959683a1214f43c9c9a8a82))
* **deps:** lock file maintenance ([a149323](https://github.com/kelektiv/node-cron/commit/a1493231499a25760066e176b9a29a04f2c99a82))
* **deps:** lock file maintenance ([dc19fcd](https://github.com/kelektiv/node-cron/commit/dc19fcd35824706fa56f237081a0829e1c330587))
* **deps:** lock file maintenance ([9aab99b](https://github.com/kelektiv/node-cron/commit/9aab99bb09ae5c2310dd1c9677ec8ff6ae6ad5c9))
* **deps:** lock file maintenance ([5a8f16d](https://github.com/kelektiv/node-cron/commit/5a8f16d3bacafea8116ff45a7ee1052feceeb1a8))
* **deps:** lock file maintenance ([e2ab57f](https://github.com/kelektiv/node-cron/commit/e2ab57f5f6e1d870fcb137cc15c0cd15fcf1bc08))
* **deps:** lock file maintenance ([cdc4477](https://github.com/kelektiv/node-cron/commit/cdc44772b4f212321bda22ac726b3a2f6bb038da))
* **deps:** lock file maintenance ([83e2a67](https://github.com/kelektiv/node-cron/commit/83e2a679488a1106c17a53aa7e3a9e0c44c7359e))
* **deps:** lock file maintenance ([4ffc01c](https://github.com/kelektiv/node-cron/commit/4ffc01c1fb37ef42942a44ec1e943c31e2d8b808))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v1.8.2 ([6dfafb6](https://github.com/kelektiv/node-cron/commit/6dfafb6c1428792d75156d7c3d93d95d2a28334d))
* **deps:** update dependency [@types](https://github.com/types)/jest to v29.5.13 ([1de1b8a](https://github.com/kelektiv/node-cron/commit/1de1b8ae2bf0451792d47cb7ede515ed78bf1218))
* **deps:** update dependency [@types](https://github.com/types)/jest to v29.5.14 ([30cd519](https://github.com/kelektiv/node-cron/commit/30cd519c3cf69593712da050a9c0cb9261830ded))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.10 ([78f9456](https://github.com/kelektiv/node-cron/commit/78f9456bd3356d640919ee090ade3bc6747d07f3))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.11 ([a7871f4](https://github.com/kelektiv/node-cron/commit/a7871f4da678114301ea3865278f531dc9099003))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.12 ([b2997da](https://github.com/kelektiv/node-cron/commit/b2997da13c637684e7f3d831f25274a6c7271a73))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.13 ([8876227](https://github.com/kelektiv/node-cron/commit/8876227b161e1dfd2be5c3e435a35922a0cefe80))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.5 ([ca49751](https://github.com/kelektiv/node-cron/commit/ca49751f1696dfce9cbac489efa5ea306f46f62a))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.6 ([4347927](https://github.com/kelektiv/node-cron/commit/43479278b0413313c21ad788a21c9029645c0cdf))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.7 ([9c2357b](https://github.com/kelektiv/node-cron/commit/9c2357b077828d8a3a3a937efb36730ba5c22ef6))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.8 ([3e86607](https://github.com/kelektiv/node-cron/commit/3e8660732917b2196fedfaa0a92033700319760f))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.13.0 ([8bc9e52](https://github.com/kelektiv/node-cron/commit/8bc9e52b5383e00d0886b38175e2dfaa68c3d0f5))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.0 ([846691e](https://github.com/kelektiv/node-cron/commit/846691e612a8382b7fd37f43adceccda6d34b508))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.1 ([be4afcd](https://github.com/kelektiv/node-cron/commit/be4afcde2efbfcd54ba3db146d55eba95a9c1fac))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.10 ([ef14320](https://github.com/kelektiv/node-cron/commit/ef143202724f3ccd21f1a5579dd891420facc90b))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.11 ([b60d875](https://github.com/kelektiv/node-cron/commit/b60d87565f7109178bbe389c2e7dd9614caa7a27))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.12 ([6eca2e0](https://github.com/kelektiv/node-cron/commit/6eca2e09802dcc7dafed62a22db1c2904df66f94))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.13 ([1eb978b](https://github.com/kelektiv/node-cron/commit/1eb978b8cddf8a2f2bead841adcad408238333c6))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.14 ([f5ba29b](https://github.com/kelektiv/node-cron/commit/f5ba29b86fc4df45b377dfc1b92460fd31e34daa))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.15 ([636d854](https://github.com/kelektiv/node-cron/commit/636d854a7da98fbe278cc6d1b5a7587103d7dabe))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.2 ([d4dddeb](https://github.com/kelektiv/node-cron/commit/d4dddeb2a743dad3024df1ec97edfa49e6e71122))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.4 ([39d6891](https://github.com/kelektiv/node-cron/commit/39d6891240fcb8b13cf636dc86846c9d7332e57d))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.5 ([e337fc5](https://github.com/kelektiv/node-cron/commit/e337fc54c002baa09080c237495e095eea6d4d1b))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.6 ([4d5849a](https://github.com/kelektiv/node-cron/commit/4d5849ae9245edc578253b7b46ae50f5c95f0080))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.7 ([312df9f](https://github.com/kelektiv/node-cron/commit/312df9f4fd6827e297c6643552ebee264abc97be))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.8 ([2c8dd30](https://github.com/kelektiv/node-cron/commit/2c8dd30ac548d3eb488912549a694aaf85756190))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.14.9 ([18af32b](https://github.com/kelektiv/node-cron/commit/18af32b712f97f0a245d12e34617c7b580ff0e73))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.15.0 ([7ddf6d9](https://github.com/kelektiv/node-cron/commit/7ddf6d9e5929712699086bfcb9169351a784fa38))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.1 ([ce067ef](https://github.com/kelektiv/node-cron/commit/ce067efeb24a139b2179af7c94f3cc1900290272))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.10 ([34fe6e2](https://github.com/kelektiv/node-cron/commit/34fe6e28f6e7607c4fdbeb9fb5e738d2dc8ffff2))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.11 ([6c68d92](https://github.com/kelektiv/node-cron/commit/6c68d92a8f49d0a34cd9ab0f9903073d711eec9b))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.12 ([8eae99a](https://github.com/kelektiv/node-cron/commit/8eae99a8940e1d18b7e80369651632aad1c29cb1))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.13 ([716b77b](https://github.com/kelektiv/node-cron/commit/716b77b6520b2c0f3b7a2b263fd02fa0bb9cfc59))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.14 ([49e621c](https://github.com/kelektiv/node-cron/commit/49e621cd79ea651d5f164025c1c013df3c2f611a))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.15 ([518d610](https://github.com/kelektiv/node-cron/commit/518d610bab9d6f161ea02a99fe84795fc4d3f311))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.2 ([35b662e](https://github.com/kelektiv/node-cron/commit/35b662e1731d810079ed6746206a43d2dca67635))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.3 ([71f95ab](https://github.com/kelektiv/node-cron/commit/71f95ab86d5bfddf5b4c248f013eee8aa881c73f))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.4 ([6141a63](https://github.com/kelektiv/node-cron/commit/6141a63bdce1f29865e0cac077c4108b18e9551a))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.5 ([1dd5130](https://github.com/kelektiv/node-cron/commit/1dd5130434cda1cbb3f70a221b9f579198885386))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.6 ([0d4e172](https://github.com/kelektiv/node-cron/commit/0d4e172e1ee9ef33db7bde6b8a0c057a561f6ca9))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.7 ([0a3d240](https://github.com/kelektiv/node-cron/commit/0a3d240d8603a2465b072941cacf39e0dd339b7e))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.16.9 ([d7ea710](https://github.com/kelektiv/node-cron/commit/d7ea71036f8ac5450230e1e00a0d007487b272b1))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.0 ([3823c7b](https://github.com/kelektiv/node-cron/commit/3823c7b8b2178569552e7c62572e586f1e91e3bb))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.17.1 ([7b7275d](https://github.com/kelektiv/node-cron/commit/7b7275ddcb0ccad4cf5be00c8800e56c1704a7a5))
* **deps:** update dependency chai to v4.5.0 ([91967d3](https://github.com/kelektiv/node-cron/commit/91967d3855d29a21b6421962c07e91ece4cae7e2))
* **deps:** update dependency eslint to v8.57.1 ([082e62e](https://github.com/kelektiv/node-cron/commit/082e62e49c3a6f0609799e55039d98abd83e9e7d))
* **deps:** update dependency eslint-plugin-prettier to v5.2.1 ([a82c504](https://github.com/kelektiv/node-cron/commit/a82c504d4fbcc8471606ba865c4b79c0bc89a881))
* **deps:** update dependency prettier to v3.3.0 ([c2f087d](https://github.com/kelektiv/node-cron/commit/c2f087df04da5e3a723554f66a8134c10cc12ff4))
* **deps:** update dependency prettier to v3.3.1 ([9d705d5](https://github.com/kelektiv/node-cron/commit/9d705d5e6b434f1b095ce7592f1f591408509d0a))
* **deps:** update dependency prettier to v3.3.2 ([074ceba](https://github.com/kelektiv/node-cron/commit/074ceba66d7a3761e21310ff14024dcbf231c637))
* **deps:** update dependency prettier to v3.3.3 ([8dc9d1e](https://github.com/kelektiv/node-cron/commit/8dc9d1effadc0e33bcec69201ec376ea684d1586))
* **deps:** update dependency sinon to v17.0.2 ([fec3b54](https://github.com/kelektiv/node-cron/commit/fec3b541d278e91a3a0c91944c97292fbdbd6e13))
* **deps:** update dependency ts-jest to v29.1.3 ([958dc3d](https://github.com/kelektiv/node-cron/commit/958dc3d0a303432af52d9017c763a9322041156e))
* **deps:** update dependency ts-jest to v29.1.4 ([42bc711](https://github.com/kelektiv/node-cron/commit/42bc7114d35ce063bd4c63ee4f183690975c9026))
* **deps:** update dependency ts-jest to v29.1.5 ([eb5d897](https://github.com/kelektiv/node-cron/commit/eb5d897cdb5409950374a62866579c4cfcb5bf36))
* **deps:** update dependency ts-jest to v29.2.0 ([a6285d2](https://github.com/kelektiv/node-cron/commit/a6285d2a633df40ba4405899a31febea9c7c39b4))
* **deps:** update dependency ts-jest to v29.2.1 ([407ac3c](https://github.com/kelektiv/node-cron/commit/407ac3ccd5cae596464d20a432eec9038fb91a33))
* **deps:** update dependency ts-jest to v29.2.2 ([712f807](https://github.com/kelektiv/node-cron/commit/712f8074dc4dd52687360659847e2a96a3e0ef3f))
* **deps:** update dependency ts-jest to v29.2.3 ([7d99dc8](https://github.com/kelektiv/node-cron/commit/7d99dc8ce70d6ea0b36f79e3650e5babd79b48bf))
* **deps:** update dependency ts-jest to v29.2.4 ([89317c8](https://github.com/kelektiv/node-cron/commit/89317c8b5889119b922a13cd47fc63dd428c21e7))
* **deps:** update dependency ts-jest to v29.2.5 ([c3ab980](https://github.com/kelektiv/node-cron/commit/c3ab980f787a6b5cd20c1e1b1f1455b4b6de693e))
* **deps:** update dependency typescript to v5.4.5 ([a32d0d5](https://github.com/kelektiv/node-cron/commit/a32d0d557ea79e3f95371ca99cdfade3340bf0ac))
* **deps:** update dependency typescript to v5.5.2 ([b6001f0](https://github.com/kelektiv/node-cron/commit/b6001f0a00a9c80808d94b7faf2cba572f959f81))
* **deps:** update dependency typescript to v5.5.3 ([ce63267](https://github.com/kelektiv/node-cron/commit/ce63267438104f34b3663d56dc9afef08d1b4706))
* **deps:** update dependency typescript to v5.5.4 ([169eed7](https://github.com/kelektiv/node-cron/commit/169eed7883af7e7ab2516082db547f268ab3e473))
* **deps:** update dependency typescript to v5.6.2 ([a071dac](https://github.com/kelektiv/node-cron/commit/a071dac40dc088542309f4c20e0bbe2846f0dac3))
* **deps:** update dependency typescript to v5.6.3 ([1f99a83](https://github.com/kelektiv/node-cron/commit/1f99a832ce9cb8027429631b51f4cc258bb11863))
## [3.1.7](https://github.com/kelektiv/node-cron/compare/v3.1.6...v3.1.7) (2024-04-08)
### 🛠 Builds
* **deps:** update dependency [@types](https://github.com/types)/luxon to ~3.4.0 ([#831](https://github.com/kelektiv/node-cron/issues/831)) ([7c31bae](https://github.com/kelektiv/node-cron/commit/7c31bae6e3d6bd2a650c54a347f6cba5ad6fb9f5))
### ⚙️ Continuous Integrations
* **action:** prevent duplicate checks on Renovate PRs ([#784](https://github.com/kelektiv/node-cron/issues/784)) ([6b56a36](https://github.com/kelektiv/node-cron/commit/6b56a36281737c87b47e42ba1c8c134c394a1314))
* **action:** update actions/setup-node digest to 60edb5d ([#821](https://github.com/kelektiv/node-cron/issues/821)) ([f05b75e](https://github.com/kelektiv/node-cron/commit/f05b75eba1bd440685128877d946e1d9341b10dd))
* **action:** update actions/upload-artifact action to v4 ([#856](https://github.com/kelektiv/node-cron/issues/856)) ([46d6660](https://github.com/kelektiv/node-cron/commit/46d6660a87f6c79d79f996b1e24a194615ed0fcf))
* **action:** update amannn/action-semantic-pull-request digest to e9fabac ([#849](https://github.com/kelektiv/node-cron/issues/849)) ([d96457c](https://github.com/kelektiv/node-cron/commit/d96457c00ab5598ef9a64b955b5abe3f7d64d915))
* **action:** update github/codeql-action action to v2.22.6 ([#783](https://github.com/kelektiv/node-cron/issues/783)) [skip ci] ([687fd43](https://github.com/kelektiv/node-cron/commit/687fd435306a355d32e2dbad91f6a68020e73f43))
* **action:** update github/codeql-action action to v2.22.7 ([#787](https://github.com/kelektiv/node-cron/issues/787)) ([a0204d8](https://github.com/kelektiv/node-cron/commit/a0204d8f0a5bca8467289570dafa9643e233e30b))
* **action:** update github/codeql-action action to v2.22.8 ([#797](https://github.com/kelektiv/node-cron/issues/797)) ([323f48c](https://github.com/kelektiv/node-cron/commit/323f48c115398cd5925df4faffeef27bebc84b08))
* **action:** update github/codeql-action action to v3 ([#817](https://github.com/kelektiv/node-cron/issues/817)) ([69d2695](https://github.com/kelektiv/node-cron/commit/69d2695b5e32ec4a7f27a7bd4ba9d0dfa62cd120))
* **action:** update insurgent-lab/is-in-pr-action action to v0.1.4 ([#790](https://github.com/kelektiv/node-cron/issues/790)) ([8e85b13](https://github.com/kelektiv/node-cron/commit/8e85b1307ed452e94ec58bedc0b8c5d9d0ac7fd0))
* **action:** update insurgent-lab/is-in-pr-action action to v0.1.5 ([#798](https://github.com/kelektiv/node-cron/issues/798)) ([76751d2](https://github.com/kelektiv/node-cron/commit/76751d272e70a344e6ff0ba623936113dba9c256))
* **action:** update insurgent-lab/is-in-pr-action action to v0.2.0 ([#853](https://github.com/kelektiv/node-cron/issues/853)) ([cc3fcbd](https://github.com/kelektiv/node-cron/commit/cc3fcbd75d315585a05383acd93174802ecac034))
* **action:** update marocchino/sticky-pull-request-comment digest to 331f8f5 ([#850](https://github.com/kelektiv/node-cron/issues/850)) ([a477f08](https://github.com/kelektiv/node-cron/commit/a477f0838b5c89625793a2af4cd72a49cfacafc0))
* **action:** update step-security/harden-runner action to v2.6.1 ([#788](https://github.com/kelektiv/node-cron/issues/788)) [skip ci] ([2e5ca52](https://github.com/kelektiv/node-cron/commit/2e5ca52fea814e954da23cb7a6399bbbeed87431))
* **action:** update step-security/harden-runner action to v2.7.0 ([#846](https://github.com/kelektiv/node-cron/issues/846)) ([f1a8486](https://github.com/kelektiv/node-cron/commit/f1a84868a7746a6a2e49f7a6483f1dfb50ef0281))
* fix renovate skipping checks ([#796](https://github.com/kelektiv/node-cron/issues/796)) ([3b00555](https://github.com/kelektiv/node-cron/commit/3b005556cfe03d5e17da1af91357d46b8073691a))
### ♻️ Chores
* **deps:** lock file maintenance ([38979af](https://github.com/kelektiv/node-cron/commit/38979afadb9816a9a9b9c1c1f93a8c5801523cb8))
* **deps:** lock file maintenance ([dc5b205](https://github.com/kelektiv/node-cron/commit/dc5b2058e6d28b2c52c88efcc87489a8e0739cca))
* **deps:** lock file maintenance ([77ddb73](https://github.com/kelektiv/node-cron/commit/77ddb73e0dfb21449b23ec3fc53114cc1ca0eb9a))
* **deps:** lock file maintenance ([03eea6c](https://github.com/kelektiv/node-cron/commit/03eea6c16c8649fb960eba2f24651de438152e0d))
* **deps:** lock file maintenance ([94e8aac](https://github.com/kelektiv/node-cron/commit/94e8aace1a797fde0b1e83b20e4918f14bb36582))
* **deps:** lock file maintenance ([142c2d1](https://github.com/kelektiv/node-cron/commit/142c2d1ca8f421c867ed5754c3afb20cd56dd305))
* **deps:** lock file maintenance ([c70bd32](https://github.com/kelektiv/node-cron/commit/c70bd329c65c5a61e0392d591e268b424c4fa7df))
* **deps:** lock file maintenance ([e0931ca](https://github.com/kelektiv/node-cron/commit/e0931cae339733f22078574915227fe8dc7c9071))
* **deps:** lock file maintenance ([effe686](https://github.com/kelektiv/node-cron/commit/effe686e6754cbfccda69cca574df10625bf2617))
* **deps:** lock file maintenance ([#763](https://github.com/kelektiv/node-cron/issues/763)) ([5d17388](https://github.com/kelektiv/node-cron/commit/5d17388b20b2ec7aca780c1c91ae0eafda4594cb))
* **deps:** lock file maintenance ([#771](https://github.com/kelektiv/node-cron/issues/771)) ([cf3d5e8](https://github.com/kelektiv/node-cron/commit/cf3d5e8b197666a29468c8594b5a05a7442d9003))
* **deps:** lock file maintenance ([#781](https://github.com/kelektiv/node-cron/issues/781)) ([6a00c1e](https://github.com/kelektiv/node-cron/commit/6a00c1e2172bc9ae0b631b92ade7af041b3f50ef))
* **deps:** lock file maintenance ([#793](https://github.com/kelektiv/node-cron/issues/793)) ([bcbc778](https://github.com/kelektiv/node-cron/commit/bcbc77874a06742afd406d5e5ebfd9645409c0be))
* **deps:** lock file maintenance ([#804](https://github.com/kelektiv/node-cron/issues/804)) ([2e72c8f](https://github.com/kelektiv/node-cron/commit/2e72c8fa16c1b9263577b48cafdcb324c246d920))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v18.4.3 ([8c8acf7](https://github.com/kelektiv/node-cron/commit/8c8acf749aa573f24965e1d613ea168bcacfe600))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v18.4.4 ([2572023](https://github.com/kelektiv/node-cron/commit/25720237ca5105636820460ed357c54649f50f25))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v18.6.0 ([22e8a0f](https://github.com/kelektiv/node-cron/commit/22e8a0f15503a15d82eebd179572c64458f3d529))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v18.6.1 ([e34c9d1](https://github.com/kelektiv/node-cron/commit/e34c9d14ec8831855c8109f9a3e9eda9c9a0da05))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v1.8.0 ([689eea4](https://github.com/kelektiv/node-cron/commit/689eea47b04dbc9bac2e4699660c79487871b444))
* **deps:** update dependency [@fast-check](https://github.com/fast-check)/jest to v1.8.1 ([a6a120c](https://github.com/kelektiv/node-cron/commit/a6a120c7f47242d797f19b2e5f1ad251de7d6967))
* **deps:** update dependency [@insurgent](https://github.com/insurgent)/conventional-changelog-preset to v9.0.1 ([39ae9c1](https://github.com/kelektiv/node-cron/commit/39ae9c1c5bb7bd0cb145cc20839514d61e3c39b7))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/github to v9.2.4 ([be59173](https://github.com/kelektiv/node-cron/commit/be591738bc8a452d3be5d10a3050485518ca6e5e))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/github to v9.2.6 ([4c994df](https://github.com/kelektiv/node-cron/commit/4c994df2ad64c9efb1cd3ccc5f74ae4c5ec13ccc))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/npm to v11.0.1 ([#770](https://github.com/kelektiv/node-cron/issues/770)) ([72f9dea](https://github.com/kelektiv/node-cron/commit/72f9dea4ba8baf4ab01995b034a27eb488014c73))
* **deps:** update dependency [@semantic-release](https://github.com/semantic-release)/npm to v11.0.3 ([d62bc05](https://github.com/kelektiv/node-cron/commit/d62bc057663716b7e7a2341f866587e45f36e6ab))
* **deps:** update dependency [@types](https://github.com/types)/jest to v29.5.11 ([8fe499f](https://github.com/kelektiv/node-cron/commit/8fe499f8cb084560b279008c255cf722a6e17093))
* **deps:** update dependency [@types](https://github.com/types)/jest to v29.5.12 ([621f556](https://github.com/kelektiv/node-cron/commit/621f5566dc6feaf4be35a80bf4c37960ef892cf8))
* **deps:** update dependency [@types](https://github.com/types)/jest to v29.5.7 ([#765](https://github.com/kelektiv/node-cron/issues/765)) [skip ci] ([3b9b43d](https://github.com/kelektiv/node-cron/commit/3b9b43d4d797ed6c7d90c4f32c205679abcdb075))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.10.0 ([3111ecd](https://github.com/kelektiv/node-cron/commit/3111ecdd00e950c8d9bf292b9e61f4c27c4e7330))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.10.4 ([b0853e7](https://github.com/kelektiv/node-cron/commit/b0853e7a4f28bec7007d70b4ed0df6689d909523))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.10.5 ([35ee733](https://github.com/kelektiv/node-cron/commit/35ee733ca8a0cffcfecb4ce4f2e5aa20cfe09eed))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.10.7 ([603fdfa](https://github.com/kelektiv/node-cron/commit/603fdfa1b4ce38f116409dee572d0e82c61953fe))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.0 ([a1a38fe](https://github.com/kelektiv/node-cron/commit/a1a38fe898939c0cebbc27addf93907fe517a19c))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.13 ([c42b5e9](https://github.com/kelektiv/node-cron/commit/c42b5e933730cb2c0be507dbd374be499bc2e287))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.17 ([f37f31c](https://github.com/kelektiv/node-cron/commit/f37f31cfb407f30ebdeb35df333097dcbabd5bac))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.19 ([c3bdd6d](https://github.com/kelektiv/node-cron/commit/c3bdd6d72d67dc637a09c1e2f4513e4b444aa031))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.24 ([fb4a087](https://github.com/kelektiv/node-cron/commit/fb4a087cbe88c2bb78c36972c5c1f6eae7c93704))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.25 ([4b22794](https://github.com/kelektiv/node-cron/commit/4b22794efef010656334a7e90297d04fb03a4d0f))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.26 ([166563d](https://github.com/kelektiv/node-cron/commit/166563d17f67f7191e3df4c99a624e07214a1a77))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.27 ([8c14927](https://github.com/kelektiv/node-cron/commit/8c1492721c99e49f53d5abbd10e6917584edffeb))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.28 ([bf7efeb](https://github.com/kelektiv/node-cron/commit/bf7efeb152ec442c8a0c502c969fedba6b47af72))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.30 ([ed26da9](https://github.com/kelektiv/node-cron/commit/ed26da99a7bb6c60f055535826c03433239aa869))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.5 ([8838ae5](https://github.com/kelektiv/node-cron/commit/8838ae599f650a0098950e314682419405104417))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.11.8 ([006f6fc](https://github.com/kelektiv/node-cron/commit/006f6fc272cb69170a1ae4b2d52c63d849cc6bc2))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.2 ([f6bf108](https://github.com/kelektiv/node-cron/commit/f6bf10845dc76a4ef9768a424281b722752a737e))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.3 ([30648f8](https://github.com/kelektiv/node-cron/commit/30648f83d414c7f97b26913ba642df6182fc1601))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.12.4 ([7d5cf86](https://github.com/kelektiv/node-cron/commit/7d5cf86ffe7a89bdd96fe06049d9273354bdbb67))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.8.10 ([#768](https://github.com/kelektiv/node-cron/issues/768)) [skip ci] ([6a91b78](https://github.com/kelektiv/node-cron/commit/6a91b78445208236dd3c82102e7edec9cd48af4f))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.9.0 ([6d972d5](https://github.com/kelektiv/node-cron/commit/6d972d5d5f9eb6fac930722d781e1e89a9979ba7))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.9.1 ([1817d85](https://github.com/kelektiv/node-cron/commit/1817d85f70fddbd5238bc72032f7e635e1a2e007))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.9.2 ([a9fb08b](https://github.com/kelektiv/node-cron/commit/a9fb08b316f5045daa3737fe6f7cc50e3f9217d0))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.9.4 ([05124bb](https://github.com/kelektiv/node-cron/commit/05124bbd4db2a0ac18c69beaed7f2253d8e4ce31))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.9.5 ([a32ba3d](https://github.com/kelektiv/node-cron/commit/a32ba3d6797816828b5c3c162173af8abea074bc))
* **deps:** update dependency [@types](https://github.com/types)/sinon to v17 ([#774](https://github.com/kelektiv/node-cron/issues/774)) [skip ci] ([6ab97db](https://github.com/kelektiv/node-cron/commit/6ab97db986e4c09388653f9bc5deffd1855bd1ea))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.11.0 ([d41dfa3](https://github.com/kelektiv/node-cron/commit/d41dfa359cbd9c3128482d9815f5f2704528ec5a))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.12.0 ([bd2e981](https://github.com/kelektiv/node-cron/commit/bd2e981b595c55532d4951140dc08063edd22f5d))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.13.1 ([#806](https://github.com/kelektiv/node-cron/issues/806)) ([d696565](https://github.com/kelektiv/node-cron/commit/d696565fff32edf11f885938f5b9e8d8ea979e22))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.13.2 ([d614393](https://github.com/kelektiv/node-cron/commit/d6143937d8774d8e4f5dcf3fcb86b296e2811c29))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.9.1 ([#766](https://github.com/kelektiv/node-cron/issues/766)) [skip ci] ([4d2bfe6](https://github.com/kelektiv/node-cron/commit/4d2bfe6bf6029b497fee8e306816cd36113b9ee1))
* **deps:** update dependency chai to v4.4.1 ([cd26e74](https://github.com/kelektiv/node-cron/commit/cd26e749da0e81c6a037d0570e3a68b729540279))
* **deps:** update dependency eslint to v8.53.0 ([#773](https://github.com/kelektiv/node-cron/issues/773)) [skip ci] ([8dea8d7](https://github.com/kelektiv/node-cron/commit/8dea8d74cd6bb501bec86ba0fd145f73510c8b0d))
* **deps:** update dependency eslint to v8.54.0 ([ef4a99c](https://github.com/kelektiv/node-cron/commit/ef4a99c48b3538cb6c7dda458a5acd09d07674b7))
* **deps:** update dependency eslint to v8.55.0 ([f5578ac](https://github.com/kelektiv/node-cron/commit/f5578ac8aa6db18bbcf3cae3ac13b6e60a119e7b))
* **deps:** update dependency eslint-config-prettier to v9.1.0 ([ba1df8b](https://github.com/kelektiv/node-cron/commit/ba1df8b49858088256436e1a060ecd6bbef8537d))
* **deps:** update dependency eslint-plugin-jest to v27.6.0 ([#762](https://github.com/kelektiv/node-cron/issues/762)) ([615b06f](https://github.com/kelektiv/node-cron/commit/615b06f37dbf2f6fe513e4670cf718f631ae5fdd))
* **deps:** update dependency eslint-plugin-jest to v27.8.0 ([ca9c72d](https://github.com/kelektiv/node-cron/commit/ca9c72d0b9ee44cbb09efabebc616a18b7e5183d))
* **deps:** update dependency prettier to v3.1.1 ([f31bd3b](https://github.com/kelektiv/node-cron/commit/f31bd3be5789c6167e6c4e06c4145f63eb2d98fa))
* **deps:** update dependency semantic-release to v22.0.6 ([#767](https://github.com/kelektiv/node-cron/issues/767)) [skip ci] ([230291a](https://github.com/kelektiv/node-cron/commit/230291a3a1216b9aca0e50cb1d59cb7793fe1c5d))
* **deps:** update dependency semantic-release to v22.0.9 ([ac87eba](https://github.com/kelektiv/node-cron/commit/ac87ebaa31412e311de572745262791339f0151c))
* **deps:** update dependency sinon to v17.0.1 ([#769](https://github.com/kelektiv/node-cron/issues/769)) [skip ci] ([bf2bdfb](https://github.com/kelektiv/node-cron/commit/bf2bdfbab6221130b926c14ae128c0d24281fcda))
* **deps:** update dependency ts-jest to v29.1.2 ([6f8af23](https://github.com/kelektiv/node-cron/commit/6f8af2332c09edc880625eb8f3d83a41caab6d35))
* **deps:** update dependency typescript to v5.3.2 ([#802](https://github.com/kelektiv/node-cron/issues/802)) ([0f541a4](https://github.com/kelektiv/node-cron/commit/0f541a47463f17485db6fdbb23ab2b8704de209b))
* **deps:** update dependency typescript to v5.3.3 ([4f470c6](https://github.com/kelektiv/node-cron/commit/4f470c6d0ce046ade5b71012ce3b551e0561c6cc))
* **deps:** update dependency typescript to v5.4.2 ([98dfa32](https://github.com/kelektiv/node-cron/commit/98dfa32e15ec4c2591a1b916017fa703e59d3be3))
* **deps:** update dependency typescript to v5.4.3 ([412c453](https://github.com/kelektiv/node-cron/commit/412c453de53876b760e4ec4f27c339b409d762fd))
* **deps:** update dependency typescript to v5.4.4 ([6b172b1](https://github.com/kelektiv/node-cron/commit/6b172b13b893e3ca417b93bd6a5c1094526ad049))
* **deps:** update linters ([2c2fe1b](https://github.com/kelektiv/node-cron/commit/2c2fe1bb5c789a8d538e5103b05ed71f5b7601c0))
* **deps:** update linters ([66a470a](https://github.com/kelektiv/node-cron/commit/66a470af968eabd4014228f1ccb6c3c9ae006f28))
* **deps:** update linters ([3010a70](https://github.com/kelektiv/node-cron/commit/3010a70500d017e4ffb1f12d83b2abcb2ccf204f))
* **deps:** update linters ([f8609df](https://github.com/kelektiv/node-cron/commit/f8609df889d66596fc90ecdc4885c70f3414f4ca))
* **deps:** update linters ([8937be5](https://github.com/kelektiv/node-cron/commit/8937be5cfe722e1bd95a73c49cf28759b71aaf06))
* **deps:** update linters ([834e0f4](https://github.com/kelektiv/node-cron/commit/834e0f411cde6841178187c77618eecab583cae2))
* **deps:** update linters ([fe0d705](https://github.com/kelektiv/node-cron/commit/fe0d70532156249981c0ab47f14822ecfa80cce2))
* **deps:** update linters ([767ad39](https://github.com/kelektiv/node-cron/commit/767ad39a90ad6b55295cbb973adae508b08772bf))
* **deps:** update semantic-release related packages ([38096a9](https://github.com/kelektiv/node-cron/commit/38096a940a9ae089b478dc8177635120243b01bd))
* **deps:** update semantic-release related packages ([a5cd89d](https://github.com/kelektiv/node-cron/commit/a5cd89d450bfd9355e6b6aad5d9596cb2213e800))
* **deps:** update semantic-release related packages ([#772](https://github.com/kelektiv/node-cron/issues/772)) [skip ci] ([4a654a7](https://github.com/kelektiv/node-cron/commit/4a654a7b474da06f35a058a37e8e4d2f2609d8fd))
* **deps:** update semantic-release related packages ([#777](https://github.com/kelektiv/node-cron/issues/777)) ([898254c](https://github.com/kelektiv/node-cron/commit/898254c7a358863dd8e0afff4e24cf169552fbe9))
* **deps:** update tests ([eb417b6](https://github.com/kelektiv/node-cron/commit/eb417b69c578f4b5b15d376c9561ab5ac64647bb))
* **deps:** update tests ([0cdd4a3](https://github.com/kelektiv/node-cron/commit/0cdd4a330ef3b7aa6b871ef9c23588a94b2bf6a0))
* **deps:** update tests ([#800](https://github.com/kelektiv/node-cron/issues/800)) ([ea1a22b](https://github.com/kelektiv/node-cron/commit/ea1a22be10aa96ad17689ac2c9e424f4394234dd))
* reduce renovate updates noise ([#750](https://github.com/kelektiv/node-cron/issues/750)) ([661722f](https://github.com/kelektiv/node-cron/commit/661722f32020f5894bdcc24169116bad5974d1a3))
* reflect insurgentlab scope update in config files ([#785](https://github.com/kelektiv/node-cron/issues/785)) ([edf67d0](https://github.com/kelektiv/node-cron/commit/edf67d006fafc0e4785bcbd4148feb20cb7ae2f5))
## [3.1.6](https://github.com/kelektiv/node-cron/compare/v3.1.5...v3.1.6) (2023-10-29)
### 🐛 Bug Fixes
* revert runOnce breaking changes ([#760](https://github.com/kelektiv/node-cron/issues/760)) ([7cb53ec](https://github.com/kelektiv/node-cron/commit/7cb53ec9944b19ed5ba92b2466e73fc158ef1d11))
### ⚙️ Continuous Integrations
* **action:** update actions/checkout action to v4 ([#755](https://github.com/kelektiv/node-cron/issues/755)) ([d0d70c6](https://github.com/kelektiv/node-cron/commit/d0d70c67532b9a2563ed7a4273901f85b314d1b9))
* **action:** update github/codeql-action action to v2.22.4 ([#752](https://github.com/kelektiv/node-cron/issues/752)) ([04454c3](https://github.com/kelektiv/node-cron/commit/04454c34a5cbfcffb6938173393380840a7c8d75))
* **action:** update github/codeql-action action to v2.22.5 ([#758](https://github.com/kelektiv/node-cron/issues/758)) ([2dff183](https://github.com/kelektiv/node-cron/commit/2dff1838a6b8ee400ad721c7a41065ee73a42b8a))
* **action:** update ossf/scorecard-action action to v2.3.1 ([#754](https://github.com/kelektiv/node-cron/issues/754)) ([41d21f1](https://github.com/kelektiv/node-cron/commit/41d21f16b58dc76e48c81751c8782b6c6c1ac7ca))
### ♻️ Chores
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v18.2.0 ([#759](https://github.com/kelektiv/node-cron/issues/759)) ([4cb466e](https://github.com/kelektiv/node-cron/commit/4cb466e183016861098cb4252b48cb54fb0ea96d))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.8.8 ([#756](https://github.com/kelektiv/node-cron/issues/756)) ([361728e](https://github.com/kelektiv/node-cron/commit/361728ebf8bc6a3202001fccaf6661e9417054a1))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.8.9 ([#757](https://github.com/kelektiv/node-cron/issues/757)) ([e2b1bac](https://github.com/kelektiv/node-cron/commit/e2b1bac21b59b9bd02a9000ec1c885961d07e121))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.9.0 ([#753](https://github.com/kelektiv/node-cron/issues/753)) ([9cec04f](https://github.com/kelektiv/node-cron/commit/9cec04f1578f26f50d3e338ad3a9053ef74bbb01))
## [3.1.5](https://github.com/kelektiv/node-cron/compare/v3.1.4...v3.1.5) (2023-10-26)
### 🐛 Bug Fixes
* detect multiple zeros as an invalid step ([#743](https://github.com/kelektiv/node-cron/issues/743)) [skip ci] ([b0bf677](https://github.com/kelektiv/node-cron/commit/b0bf677ee7b7c322dbe2c9feb13257787edc4fb8))
* re-add runOnce property to CronJob ([#751](https://github.com/kelektiv/node-cron/issues/751)) ([a61d8c9](https://github.com/kelektiv/node-cron/commit/a61d8c95057b6055a2fe0f18896a098f5d0266e0))
### 📚 Documentation
* **readme:** API documentation overhaul ([#716](https://github.com/kelektiv/node-cron/issues/716)) [skip ci] ([23fb0a3](https://github.com/kelektiv/node-cron/commit/23fb0a383fc5dea2f677d69638a1c34ec49b6425))
### ⚙️ Continuous Integrations
* **action:** update actions/setup-node action to v4 ([#749](https://github.com/kelektiv/node-cron/issues/749)) ([ef850f3](https://github.com/kelektiv/node-cron/commit/ef850f32f0b429825e2bea59fedbf53fa0053894))
### ♻️ Chores
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v18 ([#747](https://github.com/kelektiv/node-cron/issues/747)) ([5ff1cf8](https://github.com/kelektiv/node-cron/commit/5ff1cf826b376b1c3a03003b771ce8ca96edfaf5))
* **deps:** update dependency sinon to v17 ([#748](https://github.com/kelektiv/node-cron/issues/748)) ([9d61ff9](https://github.com/kelektiv/node-cron/commit/9d61ff976371ebf93bcfedf8386ba4fe426dcac5))
* **deps:** update linters ([7bdc726](https://github.com/kelektiv/node-cron/commit/7bdc726e8960d89b489a648eb5918090c7ee01c9))
* improve ossf scorecard's score ([#715](https://github.com/kelektiv/node-cron/issues/715)) [skip ci] ([1284df4](https://github.com/kelektiv/node-cron/commit/1284df476ec7bbcbc6493ab38af4cb4d3542580b))
## [3.1.4](https://github.com/kelektiv/node-cron/compare/v3.1.3...v3.1.4) (2023-10-24)
### 🐛 Bug Fixes
* run once when actual date is given to setTime ([#740](https://github.com/kelektiv/node-cron/issues/740)) ([ee54dd5](https://github.com/kelektiv/node-cron/commit/ee54dd52956a9a203a72d4a38673bf0268cd6487))
### ⚙️ Continuous Integrations
* **action:** update actions/checkout action to v4 ([#735](https://github.com/kelektiv/node-cron/issues/735)) ([144ba67](https://github.com/kelektiv/node-cron/commit/144ba677cbafc16e0c2e9d5372561589715de536))
### ♻️ Chores
* **deps:** lock file maintenance ([#741](https://github.com/kelektiv/node-cron/issues/741)) ([6d94742](https://github.com/kelektiv/node-cron/commit/6d94742fe1c7959569e7c3b922a0cfee4143ba0f))
* **deps:** update dependency [@types](https://github.com/types)/jest to v29.5.6 ([#736](https://github.com/kelektiv/node-cron/issues/736)) ([57c0efa](https://github.com/kelektiv/node-cron/commit/57c0efafcd875fed2550d0bb7ee383ccd2fd4790))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.8.7 ([#737](https://github.com/kelektiv/node-cron/issues/737)) ([21c4065](https://github.com/kelektiv/node-cron/commit/21c4065399fb8eb8aa10a4cd1c14d42f175263eb))
* **deps:** update dependency [@typescript-eslint](https://github.com/typescript-eslint)/eslint-plugin to v6.8.0 ([#734](https://github.com/kelektiv/node-cron/issues/734)) ([12e7487](https://github.com/kelektiv/node-cron/commit/12e7487496f9e76bc11ba48fcb99a40bcdd8674f))
* **deps:** update tests ([#738](https://github.com/kelektiv/node-cron/issues/738)) ([3815e2a](https://github.com/kelektiv/node-cron/commit/3815e2a56560ec105322c9dee3b45027ea069c1b))
## [3.1.3](https://github.com/kelektiv/node-cron/compare/v3.1.2...v3.1.3) (2023-10-19)
### 🐛 Bug Fixes
* allow callbacks to return a promise ([#733](https://github.com/kelektiv/node-cron/issues/733)) ([8dd8b75](https://github.com/kelektiv/node-cron/commit/8dd8b754b69e2cbe503f344f2346a035cf5a3ec6))
### ⚙️ Continuous Integrations
* **renovate:** update configuration ([#732](https://github.com/kelektiv/node-cron/issues/732)) [skip ci] ([2ff9c6e](https://github.com/kelektiv/node-cron/commit/2ff9c6eb94fbc833c6a7fff30242e2b4b8367dc6))
## [3.1.2](https://github.com/kelektiv/node-cron/compare/v3.1.1...v3.1.2) (2023-10-19)
### 🛠 Builds
* **deps:** update dependency luxon to ~3.4.0 ([#730](https://github.com/kelektiv/node-cron/issues/730)) ([c3806c5](https://github.com/kelektiv/node-cron/commit/c3806c54574d2f1886272f0b6fc0742b84dcba03))
### ♻️ Chores
* **deps:** lock file maintenance ([#731](https://github.com/kelektiv/node-cron/issues/731)) ([b6bc715](https://github.com/kelektiv/node-cron/commit/b6bc715e20f48550b4265b90bd5a21b635ece14c))
* **deps:** pin dependencies ([#719](https://github.com/kelektiv/node-cron/issues/719)) [skip ci] ([5003745](https://github.com/kelektiv/node-cron/commit/5003745208f2312bfc41dd88b68520c00d72cf5c))
* **deps:** pin dependencies ([#720](https://github.com/kelektiv/node-cron/issues/720)) [skip ci] ([4f977ef](https://github.com/kelektiv/node-cron/commit/4f977efb245d0c8a4113ef979e92c90c4ce6b0ee))
* **deps:** pin dependencies ([#721](https://github.com/kelektiv/node-cron/issues/721)) [skip ci] ([60fbf7f](https://github.com/kelektiv/node-cron/commit/60fbf7fa9f34cb1a214673eb556aa62eab3b848b))
* **deps:** update dependency [@commitlint](https://github.com/commitlint)/cli to v17.8.0 ([#723](https://github.com/kelektiv/node-cron/issues/723)) [skip ci] ([a7a18cb](https://github.com/kelektiv/node-cron/commit/a7a18cbd8d550214377ff5c8d77f29952d2b91c7))
* **deps:** update dependency [@types](https://github.com/types)/node to v20.8.6 ([#724](https://github.com/kelektiv/node-cron/issues/724)) [skip ci] ([b5e4c9f](https://github.com/kelektiv/node-cron/commit/b5e4c9f463543f6d1ba2bc9eebbd5eb6f3d1b5ea))
* **deps:** update dependency sinon to v16 ([#726](https://github.com/kelektiv/node-cron/issues/726)) [skip ci] ([d114a12](https://github.com/kelektiv/node-cron/commit/d114a1291d4257a899150468e4736c594b542355))
* **deps:** update dependency typescript to v5.2.2 ([#729](https://github.com/kelektiv/node-cron/issues/729)) [skip ci] ([d1b267e](https://github.com/kelektiv/node-cron/commit/d1b267e6490347786e9aa77be6a1016598b968ea))
* **deps:** update linters ([#728](https://github.com/kelektiv/node-cron/issues/728)) [skip ci] ([9ab00e8](https://github.com/kelektiv/node-cron/commit/9ab00e8e2adac547017bfbe5b6d97d7bc9c6fb28))
* **deps:** update linters (major) ([#727](https://github.com/kelektiv/node-cron/issues/727)) [skip ci] ([a75418a](https://github.com/kelektiv/node-cron/commit/a75418aca0f51b98625979087aa86e166ac17c56))
* **deps:** update tests ([#722](https://github.com/kelektiv/node-cron/issues/722)) [skip ci] ([6b4c6fa](https://github.com/kelektiv/node-cron/commit/6b4c6fae750d005c3e30f12b868e4f01a3b99a68))
## [3.1.1](https://github.com/kelektiv/node-cron/compare/v3.1.0...v3.1.1) (2023-10-12)
### 🐛 Bug Fixes
* fix lastDate() value for intervals > 25 days ([#711](https://github.com/kelektiv/node-cron/issues/711)) ([141aa00](https://github.com/kelektiv/node-cron/commit/141aa00f55fa105d89df7e257d82c94ad2bb2b3a))
* fix object constructor typings & make OC generic type optional ([#712](https://github.com/kelektiv/node-cron/issues/712)) ([6536084](https://github.com/kelektiv/node-cron/commit/653608451caecd51f50884d83563c03c6c27bc54))
### 📚 Documentation
* **readme:** update nextDates documentation ([#702](https://github.com/kelektiv/node-cron/issues/702)) ([1ad2e22](https://github.com/kelektiv/node-cron/commit/1ad2e228f75bcaab3eb97a27665c06b7892678c5))
## [3.1.0](https://github.com/kelektiv/node-cron/compare/v3.0.0...v3.1.0) (2023-10-09)
### ✨ Features
* improve context, onTick & onComplete typings ([#705](https://github.com/kelektiv/node-cron/issues/705)) ([82c78d7](https://github.com/kelektiv/node-cron/commit/82c78d79594c2d1c1e36baa67ecd76c033a171e4))
### 🚨 Tests
* check at runtime that all tests call expect ([#706](https://github.com/kelektiv/node-cron/issues/706)) [skip ci] ([cc4e62f](https://github.com/kelektiv/node-cron/commit/cc4e62fd1fd713d4c8a324ba36c0caa8b0c364e9))
### ♻️ Chores
* **deps:** update semantic-release related packages ([#709](https://github.com/kelektiv/node-cron/issues/709)) [skip ci] ([b94a48a](https://github.com/kelektiv/node-cron/commit/b94a48a6b24e20c1f3a9c5109158ff359d048bac))
* reflect repository label changes ([#708](https://github.com/kelektiv/node-cron/issues/708)) ([85c9e18](https://github.com/kelektiv/node-cron/commit/85c9e18023aea907c10ca77bc92db7a8086f1b6b))
## [3.0.0](https://github.com/kelektiv/node-cron/compare/v2.4.4...v3.0.0) (2023-09-30)
### ⚠ Breaking changes
* `utcOffset` parameter no longer accepts a string
* `utcOffset` values between -60 and 60 are no longer
treated as hours
* providing both `timeZone` and `utcOffset` parameters
now throws an error
* removed `cron.job()` method in favor of `new CronJob(...args)` /
`CronJob.from(argsObject)`
* removed `cron.time()` method in favor of `new CronTime()`
* `CronJob`: constructor no longer accepts an object as its first and
only params. Use `CronJob.from(argsObject)` instead.
* `CronJob`: callbacks are now called in the order they were registered
* return empty array from nextDates when called without argument (#519)
* UNIX standard alignments (#667)
### ✨ Features
* expose useful types ([737b344](https://github.com/kelektiv/node-cron/commit/737b34482c47033f9affab4426a3201681f42e97))
* rework utcOffset parameter ([#699](https://github.com/kelektiv/node-cron/issues/699)) ([671e933](https://github.com/kelektiv/node-cron/commit/671e933d9107b1e4e1166ab681f9e14a8a3a7c16))
* UNIX standard alignments ([#667](https://github.com/kelektiv/node-cron/issues/667)) ([ff615f1](https://github.com/kelektiv/node-cron/commit/ff615f1592287262b7ebc95312cdac0f9c59d272))
### 🐛 Bug Fixes
* return empty array from nextDates when called without argument ([#519](https://github.com/kelektiv/node-cron/issues/519)) ([c2891ba](https://github.com/kelektiv/node-cron/commit/c2891bacbc0d88616b69449fc6237f716dfe4faf))
### 📦 Code Refactoring
* migrate to TypeScript ([#694](https://github.com/kelektiv/node-cron/issues/694)) ([2d77894](https://github.com/kelektiv/node-cron/commit/2d778942c523f8480051216b4ced46c1d2651153))
### 📚 Documentation
* **readme:** remove outdated informations ([#695](https://github.com/kelektiv/node-cron/issues/695)) ([b5ceaf1](https://github.com/kelektiv/node-cron/commit/b5ceaf16913f78ca8d4037594a86df61f116d08e))
### 🚨 Tests
* update new test for cron standard alignments ([4a406c1](https://github.com/kelektiv/node-cron/commit/4a406c1f7e7b77ec9c7433c61a4929a341bfe300))
### ♻️ Chores
* improve GitHub community standards ([#698](https://github.com/kelektiv/node-cron/issues/698)) ([6bdef77](https://github.com/kelektiv/node-cron/commit/6bdef779b813ee84c03b7c708176410aa24a8cfe))
* update contributors list ([dab3d69](https://github.com/kelektiv/node-cron/commit/dab3d6929ca47e22388a96eb92d43258b39b093a))
### 💎 Styles
* fix linting issues ([47e665f](https://github.com/kelektiv/node-cron/commit/47e665fb176addd0eb258d5aaff85c77e7f4b17f))
## [2.4.4](https://github.com/kelektiv/node-cron/compare/v2.4.3...v2.4.4) (2023-09-25)
### 🐛 Bug Fixes
* added fractional offset support ([#685](https://github.com/kelektiv/node-cron/issues/685)) ([ce78478](https://github.com/kelektiv/node-cron/commit/ce784784575b65bd75b8b1a4adda3d8fd42fe1c0))
## [2.4.3](https://github.com/kelektiv/node-cron/compare/v2.4.2...v2.4.3) (2023-08-26)
### 🐛 Bug Fixes
* fix range parsing when upper limit = 0 ([#687](https://github.com/kelektiv/node-cron/issues/687)) ([d96746f](https://github.com/kelektiv/node-cron/commit/d96746f7b8f357e565d1fad48c9f70d3d646da64))
### 🚨 Tests
* add TS types check ([#690](https://github.com/kelektiv/node-cron/issues/690)) ([f046016](https://github.com/kelektiv/node-cron/commit/f046016dc64438c4a12a4615a919b046d3a846de))
## [2.4.2](https://github.com/kelektiv/node-cron/compare/v2.4.1...v2.4.2) (2023-08-26)
### 🐛 Bug Fixes
* **deps:** update dependency luxon to v3.3.0 & add [@types](https://github.com/types)/luxon ([#689](https://github.com/kelektiv/node-cron/issues/689)) ([c95a449](https://github.com/kelektiv/node-cron/commit/c95a449121e440b82d391fc11f8dc148748f93ec)), closes [#688](https://github.com/kelektiv/node-cron/issues/688)
## [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
* add support for beta & maintenance releases ([#677](https://github.com/kelektiv/node-cron/issues/677)) ([c6fc842](https://github.com/kelektiv/node-cron/commit/c6fc8429e905b38b05ba428e0df4a0fea273614a))
* setup conventional commits & release automation ([#673](https://github.com/kelektiv/node-cron/issues/673)) ([c6f39ff](https://github.com/kelektiv/node-cron/commit/c6f39ff384041b7f91566fc935a9b961d453dd14))
### ♻️ 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)
### Added
- Logo!
- New test cases
### Fixed
- Linting issues
## [v2.3.0](https://github.com/kelektiv/node-cron/compare/v2.2.0...v2.3.0) (2023-03-14)
### Fixed
- Some small bugs
### Changed
- Refactored get next date function
## [v2.2.0](https://github.com/kelektiv/node-cron/compare/v2.1.0...v2.2.0) (2023-01-09)
### Changed
- Updated Luxon dependency
- Updated unit tests to be compatible with new Luxon version
## [v2.1.0](https://github.com/kelektiv/node-cron/compare/v2.0.0...v2.1.0) (2022-07-14)
### Changed
- "Maximum iterations" will direct the user to refer to a single canonical issue instead of creating a new one
## [v2.0.0](https://github.com/kelektiv/node-cron/compare/v1.8.2...v2.0.0) (2022-05-03)
- Upgrade vulnerable dependencies
- Move from moment.js to luxon (breaking change)
## [v1.8.2](https://github.com/kelektiv/node-cron/compare/v1.8.1...v1.8.2) (2020-01-24)
- Fix syntax parsing bug
## [v1.8.1](https://github.com/kelektiv/node-cron/compare/v1.8.0...v1.8.1) (2020-01-19)
- Revert TS definition defaulting to DefinitelyTyped definitions.
## [v1.8.0](https://github.com/kelektiv/node-cron/compare/v1.7.1...v1.8.0) (2020-01-19)
- GH-454 - Range upper limit should default to highest value when step is provided by Noah May <noahmouse2011@gmail.com> in d36dc9581f9f68580a2016b368f8002a9f1e357d
## [v1.7.1](https://github.com/kelektiv/node-cron/compare/v1.7.0...v1.7.1) (2019-04-26)
- GH-416 - Fix issue where next execution time is incorrect in some cases in Naoya Inada <naoina@kuune.org> in c08522ff80b3987843e9930c307b76d5fe38b5dc
## [v1.7.0](https://github.com/kelektiv/node-cron/compare/v1.6.0...v1.7.0) (2019-03-19)
- GH-408 - DST issue by Shua Talansky <shua@bitbean.com> in 1e971fd6dfa6ba4b0469d99dd64e6c31189d17d3 and 849a2467d16216a9dfa818c57cc26be6b6d0899b
## [v1.6.0](https://github.com/kelektiv/node-cron/compare/v1.5.1...v1.6.0) (2018-11-15)
- GH-393, GH-394 - Remove hard limit on max iters in favor of a timeout by Nick Campbell <nicholas.j.campbell@gmail.com> in 57632b0c06c56e82f40b740b8d7986be43842735
- GH-390 - better handling of real dates which are in the past by Nick Campbell <nicholas.j.campbell@gmail.com> in 7cbcc984aea6ec063e38829f68eb9bc0dfb1c775
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
https://discord.gg/yyKns29zch.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to cron <!-- omit in toc -->
First off, thanks for taking the time to contribute! ❤️
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉
> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
> - Star the project
> - Refer this project in your project's readme
> - Mention the project at local meetups and tell your friends/colleagues
> - Share the project on forums or social medias
> - Join the [Discord community](https://discord.gg/yyKns29zch)
## Table of Contents <!-- omit in toc -->
- [Code of conduct](#code-of-conduct)
- [I Have a Question](#i-have-a-question)
- [I Want To Contribute](#i-want-to-contribute)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Submitting a Pull Request](#submitting-a-pull-request)
- [Working With The Code](#working-with-the-code)
- [Coding Rules](#coding-rules)
- [Source Code](#source-code)
- [Commit Messages](#commit-messages)
- [Join The Project Team](#join-the-project-team)
## Code of Conduct
Help us keep `cron` open and inclusive. Please read and follow our [Code of conduct](CODE_OF_CONDUCT.md).
## I Have a Question
> If you want to ask a question, we assume that you have read the available [Documentation](https://github.com/kelektiv/node-cron#readme).
Before you ask a question, it is best to search for existing [Issues](https://github.com/search?q=repo%3Akelektiv%2Fnode-cron+&type=issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.
If you then still feel the need to ask a question and need clarification, we recommend you join the [Discord community](https://discord.gg/yyKns29zch)! We will take care to answer you as soon as possible.
## I Want To Contribute
> ### Legal Notice <!-- omit in toc -->
>
> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.
### Reporting Bugs
#### Before Submitting a Bug Report <!-- omit in toc -->
A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
- Make sure that you are using the latest version.
- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://github.com/kelektiv/node-cron#readme). If you are looking for support, you might want to check [this section](#i-have-a-question)).
- Perform a [search](https://github.com/search?q=repo%3Akelektiv%2Fnode-cron++label%3Atype%3Abug&type=issues) to see if the bug/error has already been reported. If it has, add a comment to the existing issue instead of opening a new one.
- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.
- Collect information about the bug:
- Stack trace (Traceback)
- OS and Version
- Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant.
- Possibly your input and the output
- Can you reliably reproduce the issue? Can you also reproduce it with older versions?
#### How Do I Submit a Good Bug Report? <!-- omit in toc -->
We use GitHub issues to track bugs and errors. If you run into an issue with the project:
- Open a [Bug report issue](https://github.com/kelektiv/node-cron/issues/new/choose). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
- Explain the behavior you would expect and the actual behavior.
- Please provide as much context as possible and describe the _reproduction steps_ that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
- Provide the information you collected in the previous section.
Once it's filed:
- The project team will label the issue accordingly.
- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `cannot reproduce`. Bugs with the `cannot reproduce` tag will not be addressed until they are reproduced.
- If the team is able to reproduce the issue, it will be marked `bug`, as well as possibly other tags, and the issue will be left to be [implemented by someone](#your-first-code-contribution).
### Suggesting Enhancements
This section guides you through submitting an enhancement suggestion for cron, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
#### Before Submitting an Enhancement <!-- omit in toc -->
- Make sure that you are using the latest version.
- Read the [documentation](https://github.com/kelektiv/node-cron#readme) carefully and find out if the functionality is already covered, maybe by an individual configuration.
- Perform a [search](https://github.com/search?q=repo%3Akelektiv%2Fnode-cron++label%3Atype%3Afeature&type=issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
#### How Do I Submit a Good Enhancement Suggestion? <!-- omit in toc -->
Enhancement suggestions are tracked as [GitHub issues](https://github.com/kelektiv/node-cron/issues).
- Open a [Feature request issue](https://github.com/kelektiv/node-cron/issues/new/choose).
- Use a **clear and descriptive title** for the issue to identify the suggestion.
- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
- **Explain why this enhancement would be useful** to most cron users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
### Submitting a Pull Request
Good pull requests, whether patches, improvements, or new features, are a fantastic help.
They should remain focused in scope and avoid containing unrelated commits.
**Please ask first** before embarking on any significant pull requests (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's maintainers might not want to merge into the project.
For ambitious tasks, open a [**draft** Pull Request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request#converting-a-pull-request-to-a-draft) as soon as possible, in order to get feedback and help from the maintainers and the community.
If you have never created a pull request before, welcome 🎉 😄.
[Here is a great tutorial](https://opensource.guide/how-to-contribute/#opening-a-pull-request) on how to send one :)
Here is a summary of the steps to follow:
1. [Set up the workspace](#set-up-the-workspace)
2. If you cloned a while ago, get the latest changes from upstream and update dependencies:
```bash
$ git checkout main
$ git pull upstream main
$ rm -rf node_modules
$ nvm use
$ npm install
```
3. Create a new topic branch (off the main project development branch) to contain your feature, change, or fix:
```bash
$ git checkout -b <topic-branch-name>
```
4. Make your code changes, following the [Coding Rules](#coding-rules)
5. Push your topic branch up to your fork:
```bash
$ git push origin <topic-branch-name>
```
6. [Open a Pull Request](https://help.github.com/articles/creating-a-pull-request/#creating-the-pull-request) with a clear title and description.
#### Do not force push to your pull request branch
Please do not force push to your PR's branch after you have created your PR, as doing so forces us to review the whole PR again.
This makes it harder for us to review your work because we don't know what has changed.
PRs will always be squashed by us when we merge your work.
Commit as many times as you need in your pull request branch, but please batch apply review suggestions.
If you're updating your PR branch from within the GitHub PR interface, use the default "Update branch" button.
This is the "Update with merge commit" option in the dropdown.
Force pushing a PR, or using the "Update with rebase" button is OK when you:
- make large changes on a PR which require a full review anyway
- bring the branch up-to-date with the target branch and incorporating the changes is more work than to create a new PR
#### Apply maintainer provided review suggestions
Maintainers can suggest changes while reviewing your pull request.
To apply these suggestions, please:
1. Batch the suggestions into a logical group by selecting the **Add suggestion to batch** button
1. Select the **Commit suggestions** button
Read the [GitHub docs, Applying suggested changes](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request#applying-suggested-changes) to learn more.
#### Resolve review comments instead of commenting
A maintainer can ask you to make changes, without giving you a _suggestion_ that you can apply.
In this case you should make the necessary changes.
Once you've done the work, resolve the conversation by selecting the **Resolve conversation** button in the PR overview.
Avoid posting comments like "I've done the work", or "Done".
Read the [GitHub Docs, resolving conversations](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#resolving-conversations) to learn more.
#### Re-requesting a review
Please do not ping your reviewer(s) by mentioning them in a new comment.
Instead, use the re-request review functionality.
Read more about this in the [GitHub docs, Re-requesting a review](https://docs.github.com/en/free-pro-team@latest/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request#re-requesting-a-review).
#### Discord collaboration with maintainers
The codebase can be difficult to navigate, especially for a first-time contributor.
We don't want you spending an hour trying to work out something that would take us only a minute to explain.
For that reason, you'll find a `#development` channel on our [Discord community](https://discord.gg/yyKns29zch),
dedicated to helping anyone who's working on or considering Pull Requests for `cron`.
### Working With The Code
#### Set up the workspace
[Fork](https://docs.github.com/en/get-started/quickstart/contributing-to-projects#forking-a-repository) the project, [clone](https://docs.github.com/en/get-started/quickstart/contributing-to-projects#cloning-a-fork) your fork, configure the remotes and install the dependencies:
```bash
# Clone your fork of the repo into the current directory
$ git clone git@github.com:<your-username>/node-cron.git # or https://github.com/<your-username>/node-cron.git for HTTPS
# Navigate to the newly cloned directory
$ cd node-cron
# Assign the original repo to a remote called "upstream"
$ git remote add upstream git@github.com:kelektiv/node-cron.git # or https://github.com/kelektiv/node-cron.git for HTTPS
# Switch your node version to the version defined by the project as the development version
# This step assumes you have already installed and configured https://github.com/nvm-sh/nvm
# You may need to run `nvm install` if you have not already installed the development node version
$ nvm use
# Install the dependencies
$ npm install
```
#### Lint
This repository uses [ESLint](https://eslint.org) and [Prettier](https://prettier.io) for linting and formatting.
Before pushing your code changes make sure there are no linting errors with `npm run lint`.
**Tips**:
- Most linting errors can be automatically fixed with `npm run lint:fix`.
- Install the [ESLint plugin](https://eslint.org/docs/latest/use/integrations) for your editor to see linting errors directly in your editor and automatically fix them on save.
#### Tests
This repository uses [Jest](https://jestjs.io) for writing and running tests.
Before pushing your code changes make sure all **tests pass** and the **coverage thresholds are met**:
```bash
$ npm run test
```
**Tips:**
- run a single test file with `npm run test -- <file path>`, for example `npm run test -- tests/crontime.test.ts`
- run a subset of test files with `npm run test -- <glob>`, for example `npm run test -- tests/*.test.ts`
- run a single test case with `npm run test -- -t '<test case name regex>'`, for example `npm run test -- -t 'should parse .*'`
- run in watch mode with `npm run test:watch` to automatically run a test case when you modify it or the associated source code (above tips also work with this command)
## Coding Rules
### Source Code
To ensure consistency and quality throughout the source code, all code modifications must have:
- No [linting](#lint) errors
- A [test](#tests) for every possible case introduced by your code change
- [Valid commit message(s)](#commit-messages)
- Documentation for new features
- Updated documentation for modified features
### Commit Messages
#### Atomic commits
If possible, make [atomic commits](https://en.wikipedia.org/wiki/Atomic_commit), which means:
- a commit should contain exactly one self-contained functional change
- a functional change should be contained in exactly one commit
- a commit should not create an inconsistent state (such as test errors, linting errors, partial fix, feature without documentation, etc...)
A complex feature can be broken down into multiple commits as long as each one maintains a consistent state and consists of a self-contained change.
#### Commit message format
Each commit message consists of a **header**, a **body** and a **footer**.
The header has a special format that includes a **type**, a **scope** and a **subject**:
```commit
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
The **header** is mandatory and the **scope** of the header is optional.
The **footer** can contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages).
#### Revert
If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit.
In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
#### Type
The type must be one of the following:
| Type | Title | Description |
| :--------: | ------------------------ | ----------------------------------------------------------------------------------------------------------- |
| `feat` | Features | A new feature |
| `fix` | Bug Fixes | A bug Fix |
| `docs` | Documentation | Documentation only changes |
| `style` | Styles | Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) |
| `refactor` | Code Refactoring | A code change that neither fixes a bug nor adds a feature |
| `perf` | Performance Improvements | A code change that improves performance |
| `test` | Tests | Adding missing tests or correcting existing tests |
| `build` | Builds | Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) |
| `ci` | Continuous Integrations | Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs) |
| `chore` | Chores | Other changes that don't modify src or test files |
| `revert` | Reverts | Reverts a previous commit |
#### Subject
The subject contains succinct description of the change:
- use the imperative, present tense: "change" not "changed" nor "changes"
- don't capitalize first letter
- no dot (.) at the end
#### Body
Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
The body should include the motivation for the change and contrast this with previous behavior.
#### Footer
The footer should contain any information about **Breaking Changes** and is also the place to reference GitHub issues that this commit **Closes**.
**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines.
The rest of the commit message is then used for this.
#### Examples
```commit
fix(pencil): stop graphite breaking when too much pressure applied
```
```commit
feat(pencil): add 'graphiteWidth' option
Fix #42
```
```commit
perf(pencil): remove graphiteWidth option
BREAKING CHANGE: The graphiteWidth option has been removed.
The default graphite width of 10mm is always used for performance reasons.
```
## Join The Project Team
This project is looking for help! If you're interested in helping with the project on a regular basis, please reach out to us on the [Discord community](https://discord.gg/yyKns29zch).
## Attribution <!-- omit in toc -->
This guide is based on the [**contributing-gen**](https://github.com/bttger/contributing-gen), [**semantic-release**'s `CONTRIBUTING.md`](https://github.com/semantic-release/semantic-release/blob/master/CONTRIBUTING.md) and [**renovate**'s `CONTRIBUTING.md`](https://github.com/renovatebot/renovate/blob/main/.github/contributing.md).
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright © 2017 Nicholas Campbell <nicholas.j.campbell@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
<p align="center">
<img src="logo.svg" alt="cron for Node.js logo" height="150">
<br />
<b>cron</b> is a robust tool for running jobs (functions or commands) on schedules defined using the cron syntax.
<br />
Perfect for tasks like data backups, notifications, and many more!
</p>
# Cron for Node.js
[](https://www.npmjs.com/package/cron)
[](https://www.npmjs.com/package/cron)
[](https://github.com/kelektiv/node-cron/actions/workflows/release.yml)
[](https://github.com/kelektiv/node-cron/actions/workflows/codeql.yml)
[](https://app.codecov.io/gh/kelektiv/node-cron)
[](https://github.com/kelektiv/node-cron/issues/718)
[](https://securityscorecards.dev/viewer/?uri=github.com/kelektiv/node-cron)
[](https://discord.gg/yyKns29zch)
## 🌟 Features
- execute a function whenever your scheduled job triggers
- execute a job external to the javascript process (like a system command) using `child_process`
- use a Date or Luxon DateTime object instead of cron syntax as the trigger for your callback
- use an additional slot for seconds (leaving it off will default to 0 and match the Unix behavior)
## 🚀 Installation
```bash
npm install cron
```
## Table of Contents
1. [Features](#-features)
2. [Installation](#-installation)
3. [Migrating](#-migrating)
4. [Basic Usage](#-basic-usage)
5. [Cron Patterns](#-cron-patterns)
- [Cron Syntax Overview](#-cron-patterns)
- [Supported Ranges](#supported-ranges)
6. [API](#-api)
- [Standalone Functions](#standalone-functions)
- [CronJob Class](#cronjob-class)
- [CronTime Class](#crontime-class)
7. [Gotchas](#-gotchas)
8. [Community](#-community)
- [Join the Community](#-community)
9. [Contributing](#-contributing)
- [General Contribution](#-contributing)
- [Submitting Bugs/Issues](#-submitting-bugsissues)
10. [Acknowledgements](#-acknowledgements)
11. [License](#-license)
## ⬆ Migrating
v4 dropped Node v16 and renamed the `job.running` property:
<details>
<summary>Migrating from v3 to v4</summary>
### Dropped Node version
Node v16 is no longer supported. Upgrade your Node installation to Node v18 or above
### Property renamed and now read-only
You can no longer set the `running` property (now `isActive`). It is read-only. To start or stop a cron job, use `job.start()` and `job.stop()`.
</details>
v3 introduced TypeScript and tighter Unix cron pattern alignment:
<details>
<summary>Migrating from v2 to v3</summary>
### Month & day-of-week indexing changes
- **Month Indexing:** Changed from `0-11` to `1-12`. So you need to increment all numeric months by 1.
- **Day-of-Week Indexing:** Support added for `7` as Sunday.
### Adjustments in `CronJob`
- The constructor no longer accepts an object as its first and only params. Use `CronJob.from(argsObject)` instead.
- Callbacks are now called in the order they were registered.
- `nextDates(count?: number)` now always returns an array (empty if no argument is provided). Use `nextDate()` instead for a single date.
### Removed methods
- removed `job()` method in favor of `new CronJob(...args)` / `CronJob.from(argsObject)`
- removed `time()` method in favor of `new CronTime()`
</details>
## 🛠 Basic Usage
```javascript
import { CronJob } from 'cron';
const job = new CronJob(
'* * * * * *', // cronTime
function () {
console.log('You will see this message every second');
}, // onTick
null, // onComplete
true, // start
'America/Los_Angeles' // timeZone
);
// job.start() is optional here because of the fourth parameter set to true.
```
```javascript
// equivalent job using the "from" static method, providing parameters as an object
const job = CronJob.from({
cronTime: '* * * * * *',
onTick: function () {
console.log('You will see this message every second');
},
start: true,
timeZone: 'America/Los_Angeles'
});
```
> **Note:** In the first example above, the fourth parameter to `CronJob()` starts the job automatically. If not provided or set to falsy, you must explicitly start the job using `job.start()`.
For more advanced examples, check the [examples directory](https://github.com/kelektiv/node-cron/tree/main/examples).
## ⏰ Cron Patterns
Cron patterns are the backbone of this library. Familiarize yourself with the syntax:
```
- `*` Asterisks: Any value
- `1-3,5` Ranges: Ranges and individual values
- `*/2` Steps: Every two units
```
Detailed patterns and explanations are available at [crontab.org](http://crontab.org). The examples in the link have five fields, and 1 minute as the finest granularity, but our cron scheduling supports an enhanced format with six fields, allowing for second-level precision. Tools like [crontab.guru](https://crontab.guru/) can help in constructing patterns but remember to account for the seconds field.
### Supported Ranges
Here's a quick reference to the UNIX Cron format this library uses, plus an added second field:
```
field allowed values
----- --------------
second 0-59
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
```
> Names can also be used for the 'month' and 'day of week' fields. Use the first three letters of the particular day or month (case does not matter). Ranges and lists of names are allowed.
> Examples: "mon,wed,fri", "jan-mar".
## 📖 API
### Standalone Functions
- `sendAt`: Indicates when a `CronTime` will execute (returns a Luxon `DateTime` object).
```javascript
import * as cron from 'cron';
const dt = cron.sendAt('0 0 * * *');
console.log(`The job would run at: ${dt.toISO()}`);
```
- `timeout`: Indicates the number of milliseconds in the future at which a `CronTime` will execute (returns a number).
```javascript
import * as cron from 'cron';
const timeout = cron.timeout('0 0 * * *');
console.log(`The job would run in ${timeout}ms`);
```
- `validateCronExpression`: Validates if a given cron expression is valid (returns an object with `valid` and `error` properties).
```javascript
import * as cron from 'cron';
const validation = cron.validateCronExpression('0 0 * * *');
console.log(`Is the cron expression valid? ${validation.valid}`);
if (!validation.valid) {
console.error(`Validation error: ${validation.error}`);
}
```
### CronJob Class
#### Constructor
`constructor(cronTime, onTick, onComplete, start, timeZone, context, runOnInit, utcOffset, unrefTimeout, waitForCompletion, errorHandler, name, threshold)`:
- `cronTime`: [REQUIRED] - The time to fire off your job. Can be cron syntax, a JS [`Date`](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) object or a Luxon [`DateTime`](https://moment.github.io/luxon/api-docs/index.html#datetime) object.
- `onTick`: [REQUIRED] - Function to execute at the specified time. If an `onComplete` callback was provided, `onTick` will receive it as an argument.
- `onComplete`: [OPTIONAL] - Invoked when the job is halted with `job.stop()`. It might also be triggered by `onTick` post its run.
- `start`: [OPTIONAL] - Determines if the job should commence before constructor exit. Default is `false`.
- `timeZone`: [OPTIONAL] - Sets the execution time zone. Default is local time. Check valid formats in the [Luxon documentation](https://github.com/moment/luxon/blob/master/docs/zones.md#specifying-a-zone).
- `context`: [OPTIONAL] - Execution context for the onTick method.
- `runOnInit`: [OPTIONAL] - Instantly triggers the `onTick` function post initialization. Default is `false`.
- `utcOffset`: [OPTIONAL] - Specifies time zone offset in minutes. Cannot co-exist with `timeZone`.
- `unrefTimeout`: [OPTIONAL] - Useful for controlling event loop behavior. More details [here](https://nodejs.org/api/timers.html#timers_timeout_unref).
- `waitForCompletion`: [OPTIONAL] - If `true`, no additional instances of the `onTick` callback function will run until the current onTick callback has completed. Any new scheduled executions that occur while the current callback is running will be skipped entirely. Default is `false`.
- `errorHandler`: [OPTIONAL] - Function to handle any exceptions that occur in the `onTick` method.
- `name`: [OPTIONAL] - Name of the job. Useful for identifying jobs in logs.
- `threshold`: [OPTIONAL] - Threshold in ms to control whether to execute or skip missed execution deadlines caused by slow or busy hardware. Execution delays within threshold will be executed immediately, and otherwise will be skipped. In both cases a warning will be printed to the console with the job name and cron expression. See [issue #962](https://github.com/kelektiv/node-cron/issues/962) for more information. Default is `250`.
#### Methods
- `from` (static): Create a new CronJob object providing arguments as an object. See argument names and descriptions above.
- `start`: Initiates the job.
- `stop`: Halts the job.
- `setTime`: Modifies the time for the `CronJob`. Parameter must be a `CronTime`.
- `lastDate`: Provides the last execution date.
- `nextDate`: Indicates the subsequent date that will activate an `onTick`.
- `nextDates(count)`: Supplies an array of upcoming dates that will initiate an `onTick`.
- `fireOnTick`: Allows modification of the `onTick` calling behavior.
- `addCallback`: Permits addition of `onTick` callbacks.
#### Properties
- `isActive`: [READ-ONLY] Indicates if a job is active (checking to see if the callback needs to be called).
- `isCallbackRunning`: [READ-ONLY] Indicates if a callback is currently executing.
```javascript
const job = new CronJob('* * * * * *', async () => {
console.log(job.isCallbackRunning); // true during callback execution
await someAsyncTask();
console.log(job.isCallbackRunning); // still true until callback completes
});
console.log(job.isCallbackRunning); // false
job.start();
console.log(job.isActive); // true
console.log(job.isCallbackRunning); // false
```
### CronTime Class
#### Constructor
`constructor(time, zone, utcOffset)`:
- `time`: [REQUIRED] - The time to initiate your job. Accepts cron syntax or a JS [Date](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) object.
- `zone`: [OPTIONAL] - Equivalent to `timeZone` from `CronJob` parameters.
- `utcOffset`: [OPTIONAL] - Analogous to `utcOffset` from `CronJob` parameters.
## 💢 Gotchas
- Both JS `Date` and Luxon `DateTime` objects don't guarantee millisecond precision due to computation delays. This module excludes millisecond precision for standard cron syntax but allows execution date specification through JS `Date` or Luxon `DateTime` objects. However, specifying a precise future execution time, such as adding a millisecond to the current time, may not always work due to these computation delays. It's observed that delays less than 4-5 ms might lead to inconsistencies. While we could limit all date granularity to seconds, we've chosen to allow greater precision but advise users of potential issues.
- Using arrow functions for `onTick` binds them to the parent's `this` context. As a result, they won't have access to the cronjob's `this` context. You can read a little more in issue [#47 (comment)](https://github.com/kelektiv/node-cron/issues/47#issuecomment-459762775).
## 🤝 Community
Join the [Discord server](https://discord.gg/yyKns29zch)! Here you can discuss issues and get help in a more casual forum than GitHub.
## 🌍 Contributing
This project is looking for help! If you're interested in helping with the project, please take a look at our [contributing documentation](https://github.com/kelektiv/node-cron/blob/main/CONTRIBUTING.md).
### 🐛 Submitting Bugs/Issues
Please have a look at our [contributing documentation](https://github.com/kelektiv/node-cron/blob/main/CONTRIBUTING.md), it contains all the information you need to know before submitting an issue.
## 🙏 Acknowledgements
This is a community effort project. In the truest sense, this project started as an open source project from [cron.js](http://github.com/padolsey/cron.js) and grew into something else. Other people have contributed code, time, and oversight to the project. At this point there are too many to name here so we'll just say thanks.
Special thanks to [Hiroki Horiuchi](https://github.com/horiuchi), [Lundarl Gholoi](https://github.com/winup) and [koooge](https://github.com/koooge) for their work on the [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) typings before they were imported in v2.4.0.
## ⚖ License
MIT
================================================
FILE: eslint.config.mjs
================================================
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import tseslint from 'typescript-eslint';
import globals from 'globals';
import tsParser from '@typescript-eslint/parser';
import jest from 'eslint-plugin-jest';
import js from '@eslint/js';
export default [
// using .mjs for module support as TypeScript Eslint configs are still experimental
{
name: 'Eslint config file',
files: ['eslint.config.mjs'],
// ...tseslint.configs.disableTypeChecked,
// ...js.configs.recommended,
languageOptions: {
sourceType: 'module',
parserOptions: {
// project: 'package.json'
}
}
},
{
name: 'general project rules',
files: ['**/*.ts'],
plugins: {
'@typescript-eslint': tseslint.plugin
},
languageOptions: {
globals: {
...globals.node
},
parser: tsParser,
ecmaVersion: 5,
sourceType: 'module',
parserOptions: {
project: 'tsconfig.json'
}
},
rules: {
// contains all of recommended, recommended-type-checked, and strict
...tseslint.configs.strictTypeChecked.rules,
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_'
}
],
'@typescript-eslint/naming-convention': [
'warn',
{
selector: ['typeLike'],
format: ['PascalCase']
},
{
selector: ['variableLike', 'function'],
format: ['camelCase'],
leadingUnderscore: 'allow'
},
{
selector: ['variable'],
format: ['camelCase', 'UPPER_CASE']
},
{
selector: 'variable',
types: ['boolean'],
format: ['PascalCase'],
prefix: ['is', 'should', 'has', 'can', 'did', 'was', 'will']
}
],
// this is set to warn because it wasn't caught before the eslint migration in 11/2024
'@typescript-eslint/restrict-template-expressions': 'warn',
'capitalized-comments': ['error', 'never']
}
},
{
name: 'test rules',
files: ['tests/**/*.ts'],
...jest.configs['flat/recommended'],
...jest.configs['flat/style'],
plugins: {
jest
},
rules: {
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/unbound-method': 'off',
'jest/no-done-callback': 'off'
}
},
// Prettier plugin which should be last
eslintPluginPrettierRecommended
];
================================================
FILE: examples/at_10_minutes.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('* 10 * * * *', function () {
const d = new Date();
console.log('At Ten Minutes:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/at_midnight.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('00 00 00 * * *', function () {
const d = new Date();
console.log('Midnight:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/basic.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('* * * * * *', function () {
const d = new Date();
console.log('Every second:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/complex_expr.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('* 4-22 * * 1-5', function () {
const d = new Date();
console.log('Every Minute Between hours 4-22, Monday through Friday:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/every_10_minutes.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('0 */10 * * * *', function () {
const d = new Date();
console.log('Every Tenth Minute:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/every_30_minutes_between_9_and_5.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('0 */30 9-17 * * *', function () {
const d = new Date();
console.log('Every 30 minutes between 9-17:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/get_next_runs.mjs
================================================
import { CronJob } from '../dist/index.js';
const job = new CronJob(
'0 * * * * *',
function () {
console.log('Date: ', new Date());
},
null,
true
);
console.log('System TZ next 5: ', job.nextDates(5));
const jobUTC = new CronJob(
'0 * * * * *',
function () {
console.log('Date: ', new Date());
},
null,
true,
'UTC'
);
console.log('UTC next 5: ', jobUTC.nextDates(5));
================================================
FILE: examples/in_the_past.mjs
================================================
import { CronJob } from '../dist/index.js';
// XXX: SEE README GOTCHAS ABOUT WHY THIS COULD BE IN THE PAST!
const d = new Date();
d.setMilliseconds(d.getMilliseconds() + 1);
console.log('Before job instantiation');
const job = new CronJob(
d,
() => {
const d2 = new Date();
console.log('Tick @:', d2);
},
() => {
console.log('complete');
}
);
console.log('After job instantiation');
job.start();
================================================
FILE: examples/is_crontime_valid.mjs
================================================
import { validateCronExpression } from '../dist/index.js';
console.log('is valid? ', validateCronExpression('NOT VALID').valid);
================================================
FILE: examples/is_job_running.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('* * * * * *', function () {
const d = new Date();
console.log('Every second:', d);
});
console.log('After job instantiation');
job.start();
console.log('is job active? ', job.isActive);
================================================
FILE: examples/long_running_on_tick.mjs
================================================
import { CronJob } from '../dist/index.js';
let isRunning = false;
console.log('Before job instantiation');
const job = new CronJob('* * * * * *', function () {
const d = new Date();
console.log('Check every second:', d, ', isRunning: ', isRunning);
if (!isRunning) {
isRunning = true;
setTimeout(function () {
console.log('Long running onTick complete:', new Date());
isRunning = false;
}, 3000);
console.log('setTimeout triggered:', new Date());
}
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/mon_to_fri_at_11_30.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('00 30 11 * * 1-5', function () {
const d = new Date();
console.log('onTick:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/multiple_jobs.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const job = new CronJob('*/5 * * * * *', function () {
const d = new Date();
console.log('First:', d);
});
const job2 = new CronJob('*/8 * * * * *', function () {
const d = new Date();
console.log('Second:', d);
});
console.log('After job instantiation');
job.start();
job2.start();
================================================
FILE: examples/object_param.mjs
================================================
import { CronJob } from '../dist/index.js';
let isRunning = false;
console.log('Before job instantiation');
const job = CronJob.from({
cronTime: '* * * * * *',
onTick: function () {
const d = new Date();
console.log('Check every second:', d, ', isRunning: ', isRunning);
if (!isRunning) {
isRunning = true;
setTimeout(function () {
console.log('Long running onTick complete:', new Date());
isRunning = false;
}, 3000);
console.log('setTimeout triggered:', new Date());
}
}
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/run_at_specific_date.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('Before job instantiation');
const date = new Date();
date.setSeconds(date.getSeconds() + 2);
const job = new CronJob(date, function () {
const d = new Date();
console.log('Specific date:', date, ', onTick at:', d);
});
console.log('After job instantiation');
job.start();
================================================
FILE: examples/time_dom_syntax_with_tz.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('first');
const job = new CronJob(
'0 0 9 4 * *',
function () {
console.log('message');
},
null,
true,
'America/Sao_Paulo'
);
console.log('second');
================================================
FILE: examples/utc_offset_syntax.mjs
================================================
import { CronJob } from '../dist/index.js';
console.log('first');
const job = new CronJob(
'0 0 9 4 * *',
function () {
console.log('message');
},
null,
true,
null,
null,
null,
-360 // UTC-6, represented in minutes
);
console.log('second');
================================================
FILE: jest.config.json
================================================
{
"testEnvironment": "node",
"transform": {
"^.+\\.(t|j)sx?$": "@swc/jest"
},
"collectCoverage": true,
"coverageThreshold": {
"global": {
"statements": 85,
"branches": 75,
"functions": 85,
"lines": 85
}
}
}
================================================
FILE: package.json
================================================
{
"name": "cron",
"description": "Cron jobs for your node",
"version": "4.4.0",
"author": "Brandon der Blätter <https://intcreator.com/> (https://github.com/intcreator)",
"funding": {
"type": "ko-fi",
"url": "https://ko-fi.com/intcreator"
},
"bugs": {
"url": "https://github.com/kelektiv/node-cron/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/kelektiv/node-cron.git"
},
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc -b tsconfig.build.json",
"lint:eslint": "eslint src/ tests/",
"lint:prettier": "prettier ./**/*.{json,md,yml} --check",
"lint": "npm run lint:eslint && npm run lint:prettier",
"lint:fix": "npm run lint:eslint -- --fix && npm run lint:prettier -- --write",
"test": "cross-env TZ='Europe/Paris' jest --coverage",
"test:watch": "cross-env TZ='Europe/Paris' jest --watch --coverage",
"test:fuzz": "cross-env TZ='Europe/Paris' jest --testMatch='**/*.fuzz.ts' --coverage=false --testTimeout=120000",
"prepare": "husky"
},
"dependencies": {
"@types/luxon": "~3.7.0",
"luxon": "~3.7.0"
},
"devDependencies": {
"@commitlint/cli": "20.4.3",
"@eslint/js": "9.39.4",
"@fast-check/jest": "2.1.1",
"@insurgent/commitlint-config": "20.0.0",
"@insurgent/conventional-changelog-preset": "10.0.0",
"@semantic-release/changelog": "6.0.3",
"@semantic-release/commit-analyzer": "13.0.1",
"@semantic-release/git": "10.0.1",
"@semantic-release/github": "12.0.6",
"@semantic-release/npm": "13.1.5",
"@semantic-release/release-notes-generator": "14.1.0",
"@swc/core": "1.15.18",
"@swc/jest": "0.2.39",
"@types/jest": "30.0.0",
"@types/node": "24.10.4",
"@types/sinon": "21.0.0",
"cross-env": "7.0.3",
"eslint": "8.57.1",
"eslint-config-prettier": "9.1.2",
"eslint-plugin-jest": "27.9.0",
"eslint-plugin-prettier": "5.5.5",
"husky": "9.1.7",
"jest": "30.2.0",
"lint-staged": "15.5.2",
"prettier": "3.8.1",
"semantic-release": "25.0.3",
"sinon": "21.0.2",
"typescript": "5.9.3",
"typescript-eslint": "7.18.0"
},
"keywords": [
"cron",
"node cron",
"node-cron",
"schedule",
"scheduler",
"cronjob",
"cron job"
],
"license": "MIT",
"contributors": [
"Nick Campbell <nicholas.j.campbell@gmail.com> (https://github.com/ncb000gt)",
"Pierre Cavin <me@sherlox.io> (https://github.com/sheerlox)",
"Romain Beauxis <toots@rastageeks.org> (https://github.com/toots)",
"James Padolsey <> (https://github.com/jamespadolsey)",
"Finn Herpich <fh@three-heads.de> (https://github.com/ErrorProne)",
"Clifton Cunningham <clifton.cunningham@gmail.com> (https://github.com/cliftonc)",
"Eric Abouaf <eric.abouaf@gmail.com> (https://github.com/neyric)",
"humanchimp <morphcham@gmail.com> (https://github.com/humanchimp)",
"Craig Condon <craig@spiceapps.com> (https://github.com/spiceapps)",
"Dan Bear <daniel@hulu.com> (https://github.com/danhbear)",
"Vadim Baryshev <vadimbaryshev@gmail.com> (https://github.com/baryshev)",
"Leandro Ferrari <lfthomaz@gmail.com> (https://github.com/lfthomaz)",
"Gregg Zigler <greggzigler@gmail.com> (https://github.com/greggzigler)",
"Jordan Abderrachid <jabderrachid@gmail.com> (https://github.com/jordanabderrachid)",
"Masakazu Matsushita <matsukaz@gmail.com> (matsukaz)",
"Christopher Lunt <me@kirisu.co.uk> (https://github.com/kirisu)"
],
"engines": {
"node": ">=18.x"
},
"files": [
"dist/**/*.js",
"dist/**/*.d.ts",
"CHANGELOG.md",
"LICENSE",
"README.md"
],
"lint-staged": {
"*.ts": "eslint src/ tests/ --fix",
"*.{json,md,yml}": "prettier ./**/*.{json,md,yml} --check --write"
}
}
================================================
FILE: src/constants.ts
================================================
export const CONSTRAINTS = Object.freeze({
second: [0, 59],
minute: [0, 59],
hour: [0, 23],
dayOfMonth: [1, 31],
month: [1, 12],
dayOfWeek: [0, 7]
} as const);
export const PARSE_DEFAULTS = Object.freeze({
second: '0',
minute: '*',
hour: '*',
dayOfMonth: '*',
month: '*',
dayOfWeek: '*'
} as const);
export const ALIASES = Object.freeze({
jan: 1,
feb: 2,
mar: 3,
apr: 4,
may: 5,
jun: 6,
jul: 7,
aug: 8,
sep: 9,
oct: 10,
nov: 11,
dec: 12,
sun: 0,
mon: 1,
tue: 2,
wed: 3,
thu: 4,
fri: 5,
sat: 6
} as const);
export const TIME_UNITS_MAP = Object.freeze({
SECOND: 'second',
MINUTE: 'minute',
HOUR: 'hour',
DAY_OF_MONTH: 'dayOfMonth',
MONTH: 'month',
DAY_OF_WEEK: 'dayOfWeek'
} as const);
export const TIME_UNITS = Object.freeze(Object.values(TIME_UNITS_MAP)) as [
'second',
'minute',
'hour',
'dayOfMonth',
'month',
'dayOfWeek'
];
export const TIME_UNITS_LEN: number = TIME_UNITS.length;
export const PRESETS = Object.freeze({
'@yearly': '0 0 0 1 1 *',
'@monthly': '0 0 0 1 * *',
'@weekly': '0 0 0 * * 0',
'@daily': '0 0 0 * * *',
'@hourly': '0 0 * * * *',
'@minutely': '0 * * * * *',
'@secondly': '* * * * * *',
'@weekdays': '0 0 0 * * 1-5',
'@weekends': '0 0 0 * * 0,6'
} as const);
export const RE_WILDCARDS = /\*/g;
export const RE_RANGE = /^(\d+)(?:-(\d+))?(?:\/(\d+))?$/g;
================================================
FILE: src/errors.ts
================================================
export class CronError extends Error {}
export class ExclusiveParametersError extends CronError {
constructor(param1: string, param2: string) {
super(`You can't specify both ${param1} and ${param2}`);
}
}
================================================
FILE: src/index.ts
================================================
import { DateTime } from 'luxon';
import { CronTime } from './time';
export { CronJob } from './job';
export { CronTime } from './time';
export {
CronCallback,
CronCommand,
CronContext,
CronJobParams,
CronOnCompleteCallback,
CronOnCompleteCommand,
Ranges,
TimeUnit
} from './types/cron.types';
export const sendAt = (cronTime: string | Date | DateTime): DateTime =>
new CronTime(cronTime).sendAt();
export const timeout = (cronTime: string | Date | DateTime): number =>
new CronTime(cronTime).getTimeout();
export const validateCronExpression = CronTime.validateCronExpression;
================================================
FILE: src/job.ts
================================================
import { spawn } from 'child_process';
import { CronError, ExclusiveParametersError } from './errors';
import { CronTime } from './time';
import {
CronCallback,
CronCommand,
CronContext,
CronJobParams,
CronOnCompleteCallback,
CronOnCompleteCommand,
WithOnComplete
} from './types/cron.types';
export class CronJob<OC extends CronOnCompleteCommand | null = null, C = null> {
cronTime: CronTime;
unrefTimeout = false;
lastExecution: Date | null = null;
runOnce = false;
context: CronContext<C>;
onComplete?: WithOnComplete<OC> extends true
? CronOnCompleteCallback
: undefined;
waitForCompletion = false;
errorHandler?: CronJobParams<OC, C>['errorHandler'];
name?: string; // optional job name for identification
threshold = 250; // default threshold in ms
private _isActive = false;
private _isCallbackRunning = false;
private _timeout?: NodeJS.Timeout;
private _callbacks: CronCallback<C, WithOnComplete<OC>>[] = [];
get isActive() {
return this._isActive;
}
get isCallbackRunning() {
return this._isCallbackRunning;
}
constructor(
cronTime: CronJobParams<OC, C>['cronTime'],
onTick: CronJobParams<OC, C>['onTick'],
onComplete?: CronJobParams<OC, C>['onComplete'],
start?: CronJobParams<OC, C>['start'],
timeZone?: CronJobParams<OC, C>['timeZone'],
context?: CronJobParams<OC, C>['context'],
runOnInit?: CronJobParams<OC, C>['runOnInit'],
utcOffset?: null,
unrefTimeout?: CronJobParams<OC, C>['unrefTimeout'],
waitForCompletion?: CronJobParams<OC, C>['waitForCompletion'],
errorHandler?: CronJobParams<OC, C>['errorHandler'],
name?: CronJobParams<OC, C>['name'],
threshold?: CronJobParams<OC, C>['threshold']
);
constructor(
cronTime: CronJobParams<OC, C>['cronTime'],
onTick: CronJobParams<OC, C>['onTick'],
onComplete?: CronJobParams<OC, C>['onComplete'],
start?: CronJobParams<OC, C>['start'],
timeZone?: null,
context?: CronJobParams<OC, C>['context'],
runOnInit?: CronJobParams<OC, C>['runOnInit'],
utcOffset?: CronJobParams<OC, C>['utcOffset'],
unrefTimeout?: CronJobParams<OC, C>['unrefTimeout'],
waitForCompletion?: CronJobParams<OC, C>['waitForCompletion'],
errorHandler?: CronJobParams<OC, C>['errorHandler'],
name?: CronJobParams<OC, C>['name'],
threshold?: CronJobParams<OC, C>['threshold']
);
constructor(
cronTime: CronJobParams<OC, C>['cronTime'],
onTick: CronJobParams<OC, C>['onTick'],
onComplete?: CronJobParams<OC, C>['onComplete'],
start?: CronJobParams<OC, C>['start'],
timeZone?: CronJobParams<OC, C>['timeZone'],
context?: CronJobParams<OC, C>['context'],
runOnInit?: CronJobParams<OC, C>['runOnInit'],
utcOffset?: CronJobParams<OC, C>['utcOffset'],
unrefTimeout?: CronJobParams<OC, C>['unrefTimeout'],
waitForCompletion?: CronJobParams<OC, C>['waitForCompletion'],
errorHandler?: CronJobParams<OC, C>['errorHandler'],
name?: CronJobParams<OC, C>['name'],
threshold?: CronJobParams<OC, C>['threshold']
) {
this.context = (context ?? this) as CronContext<C>;
this.waitForCompletion = Boolean(waitForCompletion);
this.errorHandler = errorHandler;
// runtime check for JS users
if (timeZone != null && utcOffset != null) {
throw new ExclusiveParametersError('timeZone', 'utcOffset');
}
if (timeZone != null) {
this.cronTime = new CronTime(cronTime, timeZone, null);
} else if (utcOffset != null) {
this.cronTime = new CronTime(cronTime, null, utcOffset);
} else {
this.cronTime = new CronTime(cronTime, timeZone, utcOffset);
}
if (unrefTimeout != null) {
this.unrefTimeout = unrefTimeout;
}
if (onComplete != null) {
// casting to the correct type since we just made sure that WithOnComplete<OC> = true
this.onComplete = this._fnWrap(
onComplete
) as WithOnComplete<OC> extends true ? CronOnCompleteCallback : undefined;
}
if (threshold != null) {
this.threshold = Math.abs(threshold);
}
if (name != null) {
this.name = name;
}
if (this.cronTime.realDate) {
this.runOnce = true;
}
this.addCallback(this._fnWrap(onTick));
if (runOnInit) {
this.lastExecution = new Date();
void this.fireOnTick();
}
if (start) this.start();
}
static from<OC extends CronOnCompleteCommand | null = null, C = null>(
params: CronJobParams<OC, C>
) {
// runtime check for JS users
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
if (params.timeZone != null && params.utcOffset != null) {
throw new ExclusiveParametersError('timeZone', 'utcOffset');
}
if (params.timeZone != null) {
return new CronJob<OC, C>(
params.cronTime,
params.onTick,
params.onComplete,
params.start,
params.timeZone,
params.context,
params.runOnInit,
params.utcOffset,
params.unrefTimeout,
params.waitForCompletion,
params.errorHandler,
params.name,
params.threshold
);
} else if (params.utcOffset != null) {
return new CronJob<OC, C>(
params.cronTime,
params.onTick,
params.onComplete,
params.start,
null,
params.context,
params.runOnInit,
params.utcOffset,
params.unrefTimeout,
params.waitForCompletion,
params.errorHandler,
params.name,
params.threshold
);
} else {
return new CronJob<OC, C>(
params.cronTime,
params.onTick,
params.onComplete,
params.start,
params.timeZone,
params.context,
params.runOnInit,
params.utcOffset,
params.unrefTimeout,
params.waitForCompletion,
params.errorHandler,
params.name,
params.threshold
);
}
}
private _fnWrap(cmd: CronCommand<C, boolean>): CronCallback<C, boolean> {
switch (typeof cmd) {
case 'function': {
return cmd;
}
case 'string': {
const [command, ...args] = cmd.split(' ');
return spawn.bind(undefined, command ?? cmd, args, {}) as () => void;
}
case 'object': {
return spawn.bind(
undefined,
cmd.command,
cmd.args ?? [],
cmd.options ?? {}
) as () => void;
}
}
}
addCallback(callback: CronCallback<C, WithOnComplete<OC>>) {
if (typeof callback === 'function') {
this._callbacks.push(callback);
}
}
setTime(time: CronTime) {
if (!(time instanceof CronTime)) {
throw new CronError('time must be an instance of CronTime.');
}
const wasRunning = this._isActive;
this.stop();
this.cronTime = time;
if (time.realDate) this.runOnce = true;
if (wasRunning) this.start();
}
nextDate() {
return this.cronTime.sendAt();
}
async fireOnTick() {
// skip job if previous callback is still running
if (this.waitForCompletion && this._isCallbackRunning) return;
this._isCallbackRunning = true;
// handle errors in synchronous and asynchronous callbacks
try {
for (const callback of this._callbacks) {
const result = callback.call(
this.context,
this.onComplete as WithOnComplete<OC> extends true
? CronOnCompleteCallback
: never
);
if (
result &&
typeof result === 'object' &&
typeof result.then === 'function'
) {
if (this.waitForCompletion) {
await result;
} else {
result.catch(error => {
if (this.errorHandler != null) this.errorHandler(error);
else console.error('[Cron] error in callback', error);
});
}
}
}
} catch (error) {
if (this.errorHandler != null) this.errorHandler(error);
else console.error('[Cron] error in callback', error);
} finally {
this._isCallbackRunning = false;
}
}
nextDates(i?: number) {
return this.cronTime.sendAt(i ?? 0);
}
start() {
if (this._isActive) return;
this._isActive = true;
const MAXDELAY = 2147483647; // the maximum number of milliseconds setTimeout will wait.
let timeout = this.cronTime.getTimeout();
let remaining = 0;
let startTime: number;
const setCronTimeout = (t: number) => {
startTime = Date.now();
// using Math.max to avoid Node warnings with negative timeouts
// see https://github.com/kelektiv/node-cron/issues/1000
this._timeout = setTimeout(callbackWrapper, Math.max(t, 1));
if (this.unrefTimeout && typeof this._timeout.unref === 'function') {
this._timeout.unref();
}
};
// the callback wrapper checks if it needs to sleep another period or not
// and does the real callback logic when it's time.
const callbackWrapper = () => {
const diff = startTime + timeout - Date.now();
if (diff > 0) {
let newTimeout = this.cronTime.getTimeout();
if (newTimeout > diff) {
newTimeout = diff;
}
remaining += newTimeout;
}
// if there is sleep time remaining, calculate how long and go to sleep
// again. This processing might make us miss the deadline by a few ms
// times the number of sleep sessions. Given a MAXDELAY of almost a
// month, this should be no issue.
if (remaining) {
if (remaining > MAXDELAY) {
remaining -= MAXDELAY;
timeout = MAXDELAY;
} else {
timeout = remaining;
remaining = 0;
}
setCronTimeout(timeout);
} else {
// we have arrived at the co
gitextract_9meia9mw/ ├── .commitlintrc ├── .editorconfig ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug.yaml │ │ └── feature.yaml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── SECURITY.md │ ├── renovate.json │ └── workflows/ │ ├── codeql.yml │ ├── lint_pr_title.yml │ ├── release.yml │ ├── scorecards.yml │ └── test.yml ├── .gitignore ├── .husky/ │ ├── commit-msg │ └── pre-commit ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .releaserc ├── .vscode/ │ └── launch.json ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── eslint.config.mjs ├── examples/ │ ├── at_10_minutes.mjs │ ├── at_midnight.mjs │ ├── basic.mjs │ ├── complex_expr.mjs │ ├── every_10_minutes.mjs │ ├── every_30_minutes_between_9_and_5.mjs │ ├── get_next_runs.mjs │ ├── in_the_past.mjs │ ├── is_crontime_valid.mjs │ ├── is_job_running.mjs │ ├── long_running_on_tick.mjs │ ├── mon_to_fri_at_11_30.mjs │ ├── multiple_jobs.mjs │ ├── object_param.mjs │ ├── run_at_specific_date.mjs │ ├── time_dom_syntax_with_tz.mjs │ └── utc_offset_syntax.mjs ├── jest.config.json ├── package.json ├── src/ │ ├── constants.ts │ ├── errors.ts │ ├── index.ts │ ├── job.ts │ ├── time.ts │ ├── types/ │ │ ├── cron.types.ts │ │ └── utils.ts │ └── utils.ts ├── tests/ │ ├── cron.fuzz.ts │ ├── cron.test.ts │ ├── crontime.test.ts │ └── threshold.test.ts ├── tsconfig.build.json └── tsconfig.json
SYMBOL INDEX (64 symbols across 7 files)
FILE: src/constants.ts
constant CONSTRAINTS (line 1) | const CONSTRAINTS = Object.freeze({
constant PARSE_DEFAULTS (line 9) | const PARSE_DEFAULTS = Object.freeze({
constant ALIASES (line 17) | const ALIASES = Object.freeze({
constant TIME_UNITS_MAP (line 38) | const TIME_UNITS_MAP = Object.freeze({
constant TIME_UNITS (line 46) | const TIME_UNITS = Object.freeze(Object.values(TIME_UNITS_MAP)) as [
constant TIME_UNITS_LEN (line 54) | const TIME_UNITS_LEN: number = TIME_UNITS.length;
constant PRESETS (line 55) | const PRESETS = Object.freeze({
constant RE_WILDCARDS (line 66) | const RE_WILDCARDS = /\*/g;
constant RE_RANGE (line 67) | const RE_RANGE = /^(\d+)(?:-(\d+))?(?:\/(\d+))?$/g;
FILE: src/errors.ts
class CronError (line 1) | class CronError extends Error {}
class ExclusiveParametersError (line 3) | class ExclusiveParametersError extends CronError {
method constructor (line 4) | constructor(param1: string, param2: string) {
FILE: src/job.ts
class CronJob (line 14) | class CronJob<OC extends CronOnCompleteCommand | null = null, C = null> {
method isActive (line 33) | get isActive() {
method isCallbackRunning (line 37) | get isCallbackRunning() {
method constructor (line 71) | constructor(
method from (line 137) | static from<OC extends CronOnCompleteCommand | null = null, C = null>(
method _fnWrap (line 197) | private _fnWrap(cmd: CronCommand<C, boolean>): CronCallback<C, boolean> {
method addCallback (line 220) | addCallback(callback: CronCallback<C, WithOnComplete<OC>>) {
method setTime (line 226) | setTime(time: CronTime) {
method nextDate (line 240) | nextDate() {
method fireOnTick (line 244) | async fireOnTick() {
method nextDates (line 283) | nextDates(i?: number) {
method start (line 287) | start() {
method lastDate (line 381) | lastDate() {
method _executeOnComplete (line 385) | private async _executeOnComplete() {
method _waitForJobCompletion (line 395) | private async _waitForJobCompletion() {
method stop (line 404) | stop() {
FILE: src/time.ts
type CustomZone (line 22) | type CustomZone = Zone & {
type CustomDateTime (line 27) | type CustomDateTime = Omit<DateTime, 'zone'> & {
class CronTime (line 31) | class CronTime {
method constructor (line 54) | constructor(
method validateCronExpression (line 92) | static validateCronExpression(cronExpression: string): {
method _getWeekDay (line 109) | private _getWeekDay(date: DateTime) {
method sendAt (line 118) | sendAt(i?: number): DateTime | DateTime[] {
method getTimeout (line 182) | getTimeout() {
method toString (line 189) | toString() {
method toJSON (line 196) | toJSON() {
method getNextDateFrom (line 218) | getNextDateFrom(
method _wcOrAll (line 398) | private _wcOrAll(unit: TimeUnit) {
method _hasAll (line 411) | private _hasAll(unit: TimeUnit) {
method _parse (line 437) | private _parse(source: string) {
method _parseField (line 486) | private _parseField(value: string, unit: TimeUnit) {
FILE: src/types/cron.types.ts
type BaseCronJobParams (line 7) | interface BaseCronJobParams<
type CronJobParams (line 24) | type CronJobParams<
type CronContext (line 39) | type CronContext<C> = C extends null ? CronJob : NonNullable<C>;
type CronCallback (line 41) | type CronCallback<C, WithOnCompleteBool extends boolean = false> = (
type CronOnCompleteCallback (line 46) | type CronOnCompleteCallback = () => void | Promise<void>;
type CronSystemCommand (line 48) | type CronSystemCommand =
type CronCommand (line 56) | type CronCommand<C, WithOnCompleteBool extends boolean = false> =
type CronOnCompleteCommand (line 60) | type CronOnCompleteCommand = CronOnCompleteCallback | CronSystemCommand;
type WithOnComplete (line 62) | type WithOnComplete<OC> = OC extends null ? false : true;
type TimeUnit (line 64) | type TimeUnit = (typeof TIME_UNITS_MAP)[keyof typeof TIME_UNITS_MAP];
type TimeUnitField (line 66) | type TimeUnitField<T extends TimeUnit> = Partial<
type Ranges (line 70) | interface Ranges {
type SecondRange (line 79) | type SecondRange = IntRange<
type MinuteRange (line 83) | type MinuteRange = IntRange<
type HourRange (line 87) | type HourRange = IntRange<
type DayOfMonthRange (line 91) | type DayOfMonthRange = IntRange<
type MonthRange (line 95) | type MonthRange = IntRange<
type DayOfWeekRange (line 99) | type DayOfWeekRange = IntRange<
FILE: src/types/utils.ts
type IntRange (line 1) | type IntRange<F extends number, T extends number> = Exclude<
type Enumerate (line 6) | type Enumerate<
FILE: tests/cron.fuzz.ts
function testCronJob (line 13) | function testCronJob(
Condensed preview — 59 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (304K chars).
[
{
"path": ".commitlintrc",
"chars": 54,
"preview": "{\n\t\"extends\": [\n\t\t\"@insurgent/commitlint-config\"\n\t]\n}\n"
},
{
"path": ".editorconfig",
"chars": 57,
"preview": "root = true\n\n[*.{js}]\nindent_style = tab\nindent_size = 2\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug.yaml",
"chars": 1688,
"preview": "name: Bug\ndescription: Report a bug\nbody:\n - type: textarea\n id: description\n attributes:\n label: Descriptio"
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yaml",
"chars": 809,
"preview": "name: Feature/improvement request\ndescription: Suggest new features or improvements\nlabels: ['type:feature']\nbody:\n - t"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1931,
"preview": "<!--- Provide a general summary of your changes in the Title above (following the Conventional Commits standard) -->\n<!-"
},
{
"path": ".github/SECURITY.md",
"chars": 1674,
"preview": "# Security Policy\n\n## Reporting a Vulnerability\n\n**Please do not report security vulnerabilities through public GitHub i"
},
{
"path": ".github/renovate.json",
"chars": 2526,
"preview": "{\n\t\"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n\t\"extends\": [\n\t\t\"config:recommended\",\n\t\t\":dependencyD"
},
{
"path": ".github/workflows/codeql.yml",
"chars": 2492,
"preview": "name: 'CodeQL'\n\non:\n push:\n branches: ['main']\n pull_request:\n # The branches below must be a subset of the bran"
},
{
"path": ".github/workflows/lint_pr_title.yml",
"chars": 1791,
"preview": "name: 'Lint PR title'\n\non:\n pull_request_target:\n types:\n - opened\n - edited\n - synchronize\n\npermissi"
},
{
"path": ".github/workflows/release.yml",
"chars": 1616,
"preview": "name: Release\n\non:\n push:\n branches:\n - main\n - beta\n - '+([0-9])?(.{+([0-9]),x}).x'\n\njobs:\n test:\n "
},
{
"path": ".github/workflows/scorecards.yml",
"chars": 3123,
"preview": "# This workflow uses actions that are not certified by GitHub. They are provided\n# by a third-party and are governed by "
},
{
"path": ".github/workflows/test.yml",
"chars": 2397,
"preview": "name: Test\n\non:\n push:\n branches:\n - renovate/** # branches generated by https://github.com/apps/renovate\n pul"
},
{
"path": ".gitignore",
"chars": 2096,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\nlerna-debug.log*\n.pnpm-debug.log*\n\n# Diagnostic reports"
},
{
"path": ".husky/commit-msg",
"chars": 167,
"preview": "# only run commitlint on main (for admins pushing directly to branch)\n[ \"$(git rev-parse --abbrev-ref HEAD)\" != \"main\" ]"
},
{
"path": ".husky/pre-commit",
"chars": 16,
"preview": "npx lint-staged\n"
},
{
"path": ".nvmrc",
"chars": 8,
"preview": "24.12.0\n"
},
{
"path": ".prettierignore",
"chars": 29,
"preview": "CHANGELOG.md\ndist/\ncoverage/\n"
},
{
"path": ".prettierrc",
"chars": 116,
"preview": "{\n\t\"arrowParens\": \"avoid\",\n\t\"endOfLine\": \"auto\",\n\t\"singleQuote\": true,\n\t\"trailingComma\": \"none\",\n\t\"useTabs\": true\n}\n"
},
{
"path": ".releaserc",
"chars": 1032,
"preview": "{\n\t\"repositoryUrl\": \"git@github.com:kelektiv/node-cron.git\",\n\t\"branches\": [\n\t\t\"main\",\n\t\t{\n\t\t\t\"name\": \"beta\",\n\t\t\t\"prerele"
},
{
"path": ".vscode/launch.json",
"chars": 366,
"preview": "{\n\t\"version\": \"1.0.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t\"type\": \"node\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"name\": \"Jest Debug\",\n\t\t\t\""
},
{
"path": "CHANGELOG.md",
"chars": 107698,
"preview": "## [4.4.0](https://github.com/kelektiv/node-cron/compare/v4.3.5...v4.4.0) (2025-12-09)\n\n### ✨ Features\n\n* update node ve"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5230,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
},
{
"path": "CONTRIBUTING.md",
"chars": 19770,
"preview": "# Contributing to cron <!-- omit in toc -->\n\nFirst off, thanks for taking the time to contribute! ❤️\n\nAll types of contr"
},
{
"path": "LICENSE",
"chars": 1113,
"preview": "The MIT License (MIT)\nCopyright © 2017 Nicholas Campbell <nicholas.j.campbell@gmail.com>\n\nPermission is hereby granted, "
},
{
"path": "README.md",
"chars": 13255,
"preview": "<p align=\"center\">\n <img src=\"logo.svg\" alt=\"cron for Node.js logo\" height=\"150\">\n <br />\n <b>cron</b> is a robust to"
},
{
"path": "eslint.config.mjs",
"chars": 2254,
"preview": "import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';\nimport tseslint from 'typescript-eslin"
},
{
"path": "examples/at_10_minutes.mjs",
"chars": 256,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('* 10 * * "
},
{
"path": "examples/at_midnight.mjs",
"chars": 252,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('00 00 00 "
},
{
"path": "examples/basic.mjs",
"chars": 253,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('* * * * *"
},
{
"path": "examples/complex_expr.mjs",
"chars": 298,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('* 4-22 * "
},
{
"path": "examples/every_10_minutes.mjs",
"chars": 262,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('0 */10 * "
},
{
"path": "examples/every_30_minutes_between_9_and_5.mjs",
"chars": 276,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('0 */30 9-"
},
{
"path": "examples/get_next_runs.mjs",
"chars": 388,
"preview": "import { CronJob } from '../dist/index.js';\n\nconst job = new CronJob(\n\t'0 * * * * *',\n\tfunction () {\n\t\tconsole.log('Date"
},
{
"path": "examples/in_the_past.mjs",
"chars": 409,
"preview": "import { CronJob } from '../dist/index.js';\n\n// XXX: SEE README GOTCHAS ABOUT WHY THIS COULD BE IN THE PAST!\nconst d = n"
},
{
"path": "examples/is_crontime_valid.mjs",
"chars": 130,
"preview": "import { validateCronExpression } from '../dist/index.js';\n\nconsole.log('is valid? ', validateCronExpression('NOT VALID'"
},
{
"path": "examples/is_job_running.mjs",
"chars": 299,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('* * * * *"
},
{
"path": "examples/long_running_on_tick.mjs",
"chars": 528,
"preview": "import { CronJob } from '../dist/index.js';\n\nlet isRunning = false;\nconsole.log('Before job instantiation');\nconst job ="
},
{
"path": "examples/mon_to_fri_at_11_30.mjs",
"chars": 252,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('00 30 11 "
},
{
"path": "examples/multiple_jobs.mjs",
"chars": 374,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst job = new CronJob('*/5 * * *"
},
{
"path": "examples/object_param.mjs",
"chars": 564,
"preview": "import { CronJob } from '../dist/index.js';\n\nlet isRunning = false;\nconsole.log('Before job instantiation');\nconst job ="
},
{
"path": "examples/run_at_specific_date.mjs",
"chars": 332,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('Before job instantiation');\nconst date = new Date();\ndate.setS"
},
{
"path": "examples/time_dom_syntax_with_tz.mjs",
"chars": 214,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('first');\nconst job = new CronJob(\n\t'0 0 9 4 * *',\n\tfunction ()"
},
{
"path": "examples/utc_offset_syntax.mjs",
"chars": 253,
"preview": "import { CronJob } from '../dist/index.js';\n\nconsole.log('first');\nconst job = new CronJob(\n\t'0 0 9 4 * *',\n\tfunction ()"
},
{
"path": "jest.config.json",
"chars": 231,
"preview": "{\n\t\"testEnvironment\": \"node\",\n\t\"transform\": {\n\t\t\"^.+\\\\.(t|j)sx?$\": \"@swc/jest\"\n\t},\n\t\"collectCoverage\": true,\n\t\"coverageT"
},
{
"path": "package.json",
"chars": 3624,
"preview": "{\n\t\"name\": \"cron\",\n\t\"description\": \"Cron jobs for your node\",\n\t\"version\": \"4.4.0\",\n\t\"author\": \"Brandon der Blätter <http"
},
{
"path": "src/constants.ts",
"chars": 1326,
"preview": "export const CONSTRAINTS = Object.freeze({\n\tsecond: [0, 59],\n\tminute: [0, 59],\n\thour: [0, 23],\n\tdayOfMonth: [1, 31],\n\tmo"
},
{
"path": "src/errors.ts",
"chars": 210,
"preview": "export class CronError extends Error {}\n\nexport class ExclusiveParametersError extends CronError {\n\tconstructor(param1: "
},
{
"path": "src/index.ts",
"chars": 593,
"preview": "import { DateTime } from 'luxon';\nimport { CronTime } from './time';\n\nexport { CronJob } from './job';\nexport { CronTime"
},
{
"path": "src/job.ts",
"chars": 11005,
"preview": "import { spawn } from 'child_process';\nimport { CronError, ExclusiveParametersError } from './errors';\nimport { CronTime"
},
{
"path": "src/time.ts",
"chars": 15520,
"preview": "import { DateTime, Zone } from 'luxon';\n\nimport {\n\tALIASES,\n\tCONSTRAINTS,\n\tPARSE_DEFAULTS,\n\tPRESETS,\n\tRE_RANGE,\n\tRE_WILD"
},
{
"path": "src/types/cron.types.ts",
"chars": 2678,
"preview": "import { SpawnOptions } from 'child_process';\nimport { DateTime } from 'luxon';\nimport { CONSTRAINTS, TIME_UNITS_MAP } f"
},
{
"path": "src/types/utils.ts",
"chars": 361,
"preview": "export type IntRange<F extends number, T extends number> = Exclude<\n\tEnumerate<T>,\n\tEnumerate<F, false>\n>;\n\ntype Enumera"
},
{
"path": "src/utils.ts",
"chars": 223,
"preview": "import { Ranges } from './types/cron.types';\n\nexport const getRecordKeys = <K extends Ranges[keyof Ranges]>(\n\trecord: Pa"
},
{
"path": "tests/cron.fuzz.ts",
"chars": 3281,
"preview": "/* eslint-disable jest/no-standalone-expect */\nimport { fc, test } from '@fast-check/jest';\nimport { CronJob } from '../"
},
{
"path": "tests/cron.test.ts",
"chars": 36261,
"preview": "import { DateTime } from 'luxon';\nimport sinon from 'sinon';\nimport { CronJob, CronTime } from '../src';\n\ndescribe('cron"
},
{
"path": "tests/crontime.test.ts",
"chars": 23254,
"preview": "import { DateTime } from 'luxon';\nimport sinon from 'sinon';\nimport { CronTime, validateCronExpression } from '../src';\n"
},
{
"path": "tests/threshold.test.ts",
"chars": 6091,
"preview": "import sinon from 'sinon';\nimport { CronJob } from '../src';\n\ndescribe('threshold behavior', () => {\n\tlet callback: jest"
},
{
"path": "tsconfig.build.json",
"chars": 96,
"preview": "{\n\t\"extends\": \"./tsconfig.json\",\n\t\"exclude\": [\"node_modules\", \"tests\", \"dist\", \"**/*spec.ts\"]\n}\n"
},
{
"path": "tsconfig.json",
"chars": 801,
"preview": "{\n\t\"compilerOptions\": {\n\t\t\"target\": \"ES2015\",\n\t\t\"module\": \"commonjs\",\n\t\t\"outDir\": \"./dist\",\n\t\t\"incremental\": true,\n\t\t\"de"
}
]
About this extraction
This page contains the full source code of the kelektiv/node-cron GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 59 files (277.5 KB), approximately 90.2k tokens, and a symbol index with 64 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.