{"_id":"@bernierllc/job-scheduler","_rev":"17-5119664f3886c4495f72a9508e726bc4","name":"@bernierllc/job-scheduler","dist-tags":{"latest":"1.5.1"},"versions":{"1.0.0":{"name":"@bernierllc/job-scheduler","version":"1.0.0","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.0.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"b1ea36624efab07b72eeaa31a24276f6cba18e05","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.0.0.tgz","fileCount":10,"integrity":"sha512-sl4j0w6jBd2Id9P5QY/ju2voNfpSfjyUZoWmJUMAT9PkXAbGByX2qYa5Nom+HtWXm8RIcEAxw/PEuF61rbPTQg==","signatures":[{"sig":"MEUCIQC/LQEiRpqz7HUvj9TBzQOuji07hWKU4/yIsleRY6SEEQIgbMEU7z2ei3xeE4X//TEzZbcU4Rwqr8b6kDUMc20g03A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39721},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"4b93934556756c313746a7294fbf393101da41c4","scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.6.2","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"25.1.0","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"^1.0.1"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.0.0_1762381697537_0.34505341453521887","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bernierllc/job-scheduler","version":"1.0.1","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"f9699661a90ae9540bf3496fb1c929d25f98c5cd","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.0.1.tgz","fileCount":10,"integrity":"sha512-5yG26rJbcv91M94bCti0IZwiEfcjz8M8ILtZAzunOf8pogyz7M0XCNj41ESCYtjhvYngUNpbcF1rScVXUzFf4A==","signatures":[{"sig":"MEYCIQDQkvIna9ZcBUY63MaShaNpGB6kZqg1DyGQkNrwY3r5+wIhAKFUribj/OBz7Kok2S16nB9PFCKDtHEz1g3NKrgBQD5d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41237},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.0.1.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"_resolved":"/private/var/folders/r0/wspnzd1s18sfjy10ffyv2qxw0000gn/T/4e96b632ad5835e09db19c8f179eea62/bernierllc-job-scheduler-1.0.1.tgz","_integrity":"sha512-5yG26rJbcv91M94bCti0IZwiEfcjz8M8ILtZAzunOf8pogyz7M0XCNj41ESCYtjhvYngUNpbcF1rScVXUzFf4A==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.6.2","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"25.2.1","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"^1.0.1"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.0.1_1764636720004_0.5844784685228153","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/job-scheduler","version":"1.0.2","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"6b858a103115d03b9e4f10e3399790b4edce22a0","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.0.2.tgz","fileCount":10,"integrity":"sha512-19fJLTMa1awxGMhvUV3yijP2u6u6BmLpdPxWltLR61H2NCInHfEysoumOQnxpU0eNTq2H9ks6vtdxYlfZehsYw==","signatures":[{"sig":"MEYCIQDaxlvqxqR4QvrJWO/mE5TSLNxf3qRSa2VtvoRDXSb6fAIhAN/v40o+yxwNZ4lXHbi1w0EvTlXFr6d8Dc3oS5xVFrpG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41283},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.0.2.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/tmp/4fbdf4fba792c7ebf80490420d63e0cf/bernierllc-job-scheduler-1.0.2.tgz","_integrity":"sha512-19fJLTMa1awxGMhvUV3yijP2u6u6BmLpdPxWltLR61H2NCInHfEysoumOQnxpU0eNTq2H9ks6vtdxYlfZehsYw==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.7.0","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.19.6","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.0.4"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.0.2_1766449670092_0.19278867352425566","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/job-scheduler","version":"1.0.3","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.0.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"72ac13739746480308eb1f29c48e07d26c123360","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.0.3.tgz","fileCount":10,"integrity":"sha512-xUSU5/Bh+sNpVzSL4cA5hcpBvThr3zX/+VjY9gShlkmmacRJhjGl7wNPxrUISGbdPJO0J3kvQb169VhHeGgKbw==","signatures":[{"sig":"MEUCIQCACk/tjXqJ967SFfjB5hHF6gYwwdm3r3eD7QBCAlwtjQIgP/4yXFWvl0hWttZ//dV3fn2S9Vqpp1clUad8TM0I8MA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41283},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.0.3.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/tmp/cb7c4983bca2ee6d29e6e359547d77fa/bernierllc-job-scheduler-1.0.3.tgz","_integrity":"sha512-xUSU5/Bh+sNpVzSL4cA5hcpBvThr3zX/+VjY9gShlkmmacRJhjGl7wNPxrUISGbdPJO0J3kvQb169VhHeGgKbw==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.7.0","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.19.6","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.1.0"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.0.3_1766454417530_0.29783931368816874","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/job-scheduler","version":"1.2.0","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"cb664d7512db4b0f03e48da5c820f4c0a4ce962d","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.2.0.tgz","fileCount":10,"integrity":"sha512-/pLUL2UcT0WkCI+i7RPjuMD8H0krDsG735keoo/1Aw+k7n3a8g/fF/sn8f8QkLZxGFTOAwQdeuKPdkQXa3XnDQ==","signatures":[{"sig":"MEUCIGsdRwCfbF/WDnsRlRFAFJWEVMq8VBMGZh82zJvvp4ByAiEA9v6TsXX2P+XPibcMFFYdnQLEIN6jWH6Bn4QbOqisCZo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41341},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.19.6","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.3.0"},"publishConfig":{"access":"restricted","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.2.0_1767642443605_0.4889353424000975","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@bernierllc/job-scheduler","version":"1.2.2","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.2.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"99f33b8c98dba24a024d4981273b788d7ea2f884","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.2.2.tgz","fileCount":10,"integrity":"sha512-b5Wd1hjAuzoJs4n4xzDar3zcSaKq5/iYkAGG5iFGWt3nBJ1KTdfSeByuhZ76YjpXBcG8+3MzSQEUjZn0Qi0JtQ==","signatures":[{"sig":"MEQCIBSjimlV7dTA9T6+oTqNg+1m3uRyMiSaKe44KeZY4h79AiA8C9C45FrzP99+pWNWBRj2d1oqD1GKq3DvhRWGStHRUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41279},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.2.2.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.2.2.tgz","_integrity":"sha512-b5Wd1hjAuzoJs4n4xzDar3zcSaKq5/iYkAGG5iFGWt3nBJ1KTdfSeByuhZ76YjpXBcG8+3MzSQEUjZn0Qi0JtQ==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.11.0","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.20.0","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.3.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.2.2_1773163209331_0.2069476597598312","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@bernierllc/job-scheduler","version":"1.2.3","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.2.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"fc27015dbe766a3333c43119e6d20cd108016fed","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.2.3.tgz","fileCount":10,"integrity":"sha512-a3PBIQ5tDBVFahtlRa7eok7ihsT7CQklXDtccnTw/ubQk2hElx2uluwqf73MPlL2W5akl3X/sIRLFOXvUyVaHQ==","signatures":[{"sig":"MEUCIQDVLV0DHWxWUVpNqJ/FiJ1KEMRJGs4OisxFOjhAWvOt2QIgRdRxWp5IGP3twHXr+Eyp5kdm5NO7ZDv/J79raA7SQPs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41279},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.2.3.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.2.3.tgz","_integrity":"sha512-a3PBIQ5tDBVFahtlRa7eok7ihsT7CQklXDtccnTw/ubQk2hElx2uluwqf73MPlL2W5akl3X/sIRLFOXvUyVaHQ==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.14.1","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.20.2","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.4.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.2.3_1779133492696_0.48024725894798004","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@bernierllc/job-scheduler","version":"1.2.4","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.2.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"726842181739aa8a8662376f9893ea6410f0a54a","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.2.4.tgz","fileCount":10,"integrity":"sha512-L8tB3lVq8DamFxxrYdlDSuhRn5QBDr1cOmGgb3xzMTG9nW2efMADjGxhpu5X5YSoZwouo3CDHeRzSdkUWmQc0w==","signatures":[{"sig":"MEYCIQCEIEz6qxwtlcrH8SuBmEszACc3mU6LSal5g9pJyFtkeQIhALKKylPdd1mPah+wFkWbM4GICYt/mKXDttmeS8kMQ2bT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41279},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.2.4.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.2.4.tgz","_integrity":"sha512-L8tB3lVq8DamFxxrYdlDSuhRn5QBDr1cOmGgb3xzMTG9nW2efMADjGxhpu5X5YSoZwouo3CDHeRzSdkUWmQc0w==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.14.1","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.20.2","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.4.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.2.4_1779157239459_0.9202953652421442","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@bernierllc/job-scheduler","version":"1.2.5","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.2.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"f259af76f139302026783019f1369d3e1b58f499","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.2.5.tgz","fileCount":10,"integrity":"sha512-vq1HLVai7MgS/4zDPxWfV8tU0wRajpGJUP/3mbXWb2kzlA9d9/MEYB/Vb6Lqfw02MfhDgCLOPuYtdOJIHfPk1w==","signatures":[{"sig":"MEUCIAhrQfRzSBWZ4dk5dNQUZKFMWX/3n3MDVB3K50/zkltGAiEA+lvNv9jQuEnKiqhUd5O95PJvtK9BixfrjWWcYc7IT/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41279},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.2.5.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.2.5.tgz","_integrity":"sha512-vq1HLVai7MgS/4zDPxWfV8tU0wRajpGJUP/3mbXWb2kzlA9d9/MEYB/Vb6Lqfw02MfhDgCLOPuYtdOJIHfPk1w==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.14.1","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.20.2","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.4.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.2.5_1779221353942_0.949608317402135","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/job-scheduler","version":"1.4.0","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.4.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"ce8641ab1c432c38d06600a909dd2b149a52f1bc","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.4.0.tgz","fileCount":12,"integrity":"sha512-D9rm+FNsrKJAfpUQGBroUAUvr1SBjrCy4Hmz/izuqbCeNjv7A5fpPQZalYiiQCmqzFrDHGYtnhW1KvMxYaZ9uw==","signatures":[{"sig":"MEQCIHyceko19XQWv+Flu9s/9TbD0stDSJjtPK5F7iBHo1e9AiBtJqe2SCfCzk4/5bNwSpa2S/6qDkyU037uKm2Zsl7T5g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43044},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.4.0.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.4.0.tgz","_integrity":"sha512-D9rm+FNsrKJAfpUQGBroUAUvr1SBjrCy4Hmz/izuqbCeNjv7A5fpPQZalYiiQCmqzFrDHGYtnhW1KvMxYaZ9uw==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.14.1","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.20.2","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.6.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.4.0_1779241204933_0.3960467207363054","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bernierllc/job-scheduler","version":"1.5.0","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/job-scheduler@1.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"9d8b2d47e811647a6f1b669e224eecafcaf87aa9","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.5.0.tgz","fileCount":12,"integrity":"sha512-+wClJfSp1hLHIsPFPOKbfq/A/0vr5kLBNt2w5APohT9gRItTycz1oUERfxcHDSD1Ml8DvgivFAUUL//vjW2iDQ==","signatures":[{"sig":"MEQCIDRgvVYM87JveKVgC9FJpHm4FKUKEKoU9hWwACMHZQbLAiAq/uv9NAD0YhP8K32hbrn6+DTRdEnexniqBekCZtFMiA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":43044},"main":"dist/index.js","_from":"file:bernierllc-job-scheduler-1.5.0.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src __tests__ --ext .ts","test":"jest --watch","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.5.0.tgz","_integrity":"sha512-+wClJfSp1hLHIsPFPOKbfq/A/0vr5kLBNt2w5APohT9gRItTycz1oUERfxcHDSD1Ml8DvgivFAUUL//vjW2iDQ==","bernierllc":{"integration":{"neverhub":"optional"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/job-scheduler"},"_npmVersion":"11.14.1","description":"Cron-based job scheduling for recurring tasks with execution tracking","directories":{},"_nodeVersion":"20.20.2","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.7.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","eslint":"^8.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/job-scheduler_1.5.0_1779249950521_0.3288218003139034","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@bernierllc/job-scheduler","version":"1.5.1","description":"Cron-based job scheduling for recurring tasks with execution tracking","main":"dist/index.js","types":"dist/index.d.ts","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","dependencies":{"cron-parser":"^4.9.0","@bernierllc/logger":"1.7.1"},"devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.0.0","rimraf":"^5.0.0","ts-jest":"^29.0.0","typescript":"^5.0.0"},"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/core/job-scheduler"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"engines":{"node":">=16.0.0"},"bernierllc":{"integration":{"neverhub":"optional"}},"scripts":{"build":"tsc","prebuild":"npm run clean","clean":"rimraf dist","test":"jest --watch","test:watch":"jest --watch","test:coverage":"jest --coverage","test:run":"jest","lint":"eslint src __tests__ --ext .ts"},"_id":"@bernierllc/job-scheduler@1.5.1","_integrity":"sha512-zB53Q1eZnW6Iy8BlAYFHyL1LKrALeGurnEIDhzi6sBtkdiplwc1x63RdMnNOnOQsRDHEfGLe+fHx9FmvoeBb5A==","_resolved":"/home/runner/work/tools/tools/packages/core/job-scheduler/bernierllc-job-scheduler-1.5.1.tgz","_from":"file:bernierllc-job-scheduler-1.5.1.tgz","_nodeVersion":"24.18.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-zB53Q1eZnW6Iy8BlAYFHyL1LKrALeGurnEIDhzi6sBtkdiplwc1x63RdMnNOnOQsRDHEfGLe+fHx9FmvoeBb5A==","shasum":"09deaa61292e287be35b1be9236c35cc912c0560","tarball":"https://registry.npmjs.org/@bernierllc/job-scheduler/-/job-scheduler-1.5.1.tgz","fileCount":12,"unpackedSize":43044,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDG6036gVyPZo/kzSKdf3EhvsdZTW5WM+9OorYFoUbFFgIhAPVNLlYHqzypNK2ujCJvAcgsCraG/NhqkCozK1Q3O+Mh"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:33b006fd-2d22-4777-9896-40a2d94aa815"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/job-scheduler_1.5.1_1784015636442_0.5654075346256817"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-05T22:28:16.881Z","modified":"2026-07-14T07:53:56.678Z","1.0.0":"2025-11-05T22:28:17.745Z","1.0.1":"2025-12-02T00:52:00.195Z","1.0.2":"2025-12-23T00:27:50.218Z","1.0.3":"2025-12-23T01:46:57.663Z","1.2.0":"2026-01-05T19:47:23.746Z","1.2.2":"2026-03-10T17:20:09.496Z","1.2.3":"2026-05-18T19:44:52.863Z","1.2.4":"2026-05-19T02:20:39.615Z","1.2.5":"2026-05-19T20:09:14.096Z","1.4.0":"2026-05-20T01:40:05.080Z","1.5.0":"2026-05-20T04:05:50.667Z","1.5.1":"2026-07-14T07:53:56.574Z"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/job-scheduler#readme","keywords":["cron","scheduler","jobs","recurring","task","automation","core"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/core/job-scheduler"},"description":"Cron-based job scheduling for recurring tasks with execution tracking","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/job-scheduler\n\nCron-based job scheduling for recurring tasks with execution tracking and history.\n\n## Installation\n\n```bash\nnpm install @bernierllc/job-scheduler\n```\n\n## Features\n\n- **Cron Expression Support** - Schedule recurring jobs using standard cron syntax\n- **One-Time Scheduling** - Schedule jobs to run at specific dates/times\n- **Job Management** - Pause, resume, and cancel jobs\n- **Execution Tracking** - Complete history of job executions with success/failure status\n- **Retry Logic** - Automatic retry with configurable delay for failed jobs\n- **Statistics** - Job execution statistics including duration, success rate, and next run time\n- **TypeScript Support** - Full type definitions included\n- **Task Queue Integration** - Optional integration with @bernierllc/task-queue\n- **Structured Error Handling** - Consistent error responses using PackageResult pattern\n\n## Usage\n\n### Basic Recurring Job\n\n```typescript\nimport { createJobScheduler } from '@bernierllc/job-scheduler';\n\nconst scheduler = createJobScheduler();\n\n// Schedule a job to run every day at 9 AM\nconst result = scheduler.schedule('0 9 * * *', async () => {\n  console.log('Daily report generation');\n  // Your job logic here\n}, {\n  name: 'daily-report',\n  metadata: { source: 'reports' }\n});\n\nif (result.success) {\n  console.log('Job scheduled:', result.data?.getId());\n}\n```\n\n### One-Time Job\n\n```typescript\nimport { createJobScheduler } from '@bernierllc/job-scheduler';\n\nconst scheduler = createJobScheduler();\n\n// Schedule a job to run at specific time\nconst publishDate = new Date('2025-10-15T10:00:00Z');\nconst result = scheduler.scheduleAt(publishDate, async () => {\n  console.log('Publishing blog post');\n  // Your job logic here\n}, {\n  name: 'publish-post',\n  metadata: { postId: '12345' }\n});\n\nif (result.success) {\n  console.log('Job scheduled for:', publishDate.toISOString());\n}\n```\n\n### Job with Retry Logic\n\n```typescript\nconst result = scheduler.schedule('0 * * * *', async () => {\n  // Job that might fail\n  await processData();\n}, {\n  name: 'data-processor',\n  maxRetries: 3,\n  retryDelay: 5000 // 5 seconds\n});\n```\n\n### Managing Jobs\n\n```typescript\n// Pause a job\nscheduler.pause(jobId);\n\n// Resume a paused job\nscheduler.resume(jobId);\n\n// Cancel a job\nscheduler.cancel(jobId);\n\n// Cancel all jobs\nscheduler.cancelAll();\n```\n\n### Retrieving Jobs\n\n```typescript\n// Get specific job\nconst job = scheduler.getJob(jobId);\nconsole.log('Job status:', job?.getStatus());\n\n// Get all jobs\nconst allJobs = scheduler.getAllJobs();\nconsole.log('Total jobs:', allJobs.length);\n\n// Get jobs by status\nimport { JobStatus } from '@bernierllc/job-scheduler';\nconst activeJobs = scheduler.getJobsByStatus(JobStatus.SCHEDULED);\nconst pausedJobs = scheduler.getJobsByStatus(JobStatus.PAUSED);\n```\n\n### Job Statistics\n\n```typescript\n// Get statistics for specific job\nconst stats = scheduler.getJobStatistics(jobId);\nif (stats) {\n  console.log('Total executions:', stats.totalExecutions);\n  console.log('Successful:', stats.successfulExecutions);\n  console.log('Failed:', stats.failedExecutions);\n  console.log('Average duration:', stats.averageDuration, 'ms');\n  console.log('Last execution:', stats.lastExecution);\n  console.log('Next execution:', stats.nextExecution);\n}\n\n// Get overall scheduler statistics\nconst schedulerStats = scheduler.getSchedulerStatistics();\nconsole.log('Total jobs:', schedulerStats.totalJobs);\nconsole.log('Active jobs:', schedulerStats.activeJobs);\nconsole.log('Paused jobs:', schedulerStats.pausedJobs);\n```\n\n### Execution History\n\n```typescript\nconst job = scheduler.getJob(jobId);\nconst executions = job?.getExecutions();\n\nexecutions?.forEach(execution => {\n  console.log('Execution ID:', execution.executionId);\n  console.log('Start time:', execution.startTime);\n  console.log('Status:', execution.status);\n  console.log('Duration:', execution.duration, 'ms');\n  if (execution.error) {\n    console.log('Error:', execution.error);\n  }\n});\n```\n\n### Validate Cron Expression\n\n```typescript\nconst validation = scheduler.validateCronExpression('0 9 * * *');\nif (validation.success) {\n  console.log('Valid cron expression');\n} else {\n  console.error('Invalid:', validation.error);\n}\n```\n\n## Configuration\n\n```typescript\nimport { createJobScheduler } from '@bernierllc/job-scheduler';\n\nconst scheduler = createJobScheduler({\n  timezone: 'America/New_York',\n  maxConcurrentJobs: 10,\n  enableHistory: true,\n  historyRetention: 100,\n  enableTaskQueue: true,\n  taskQueueConfig: {\n    maxSize: 100,\n    priority: 1\n  }\n});\n```\n\n### Configuration Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `timezone` | string | `'UTC'` | Timezone for cron scheduling |\n| `maxConcurrentJobs` | number | `10` | Maximum concurrent jobs |\n| `enableHistory` | boolean | `true` | Enable execution history tracking |\n| `historyRetention` | number | `100` | Number of executions to retain |\n| `enableTaskQueue` | boolean | `false` | Enable task queue integration |\n| `taskQueueConfig` | object | - | Task queue configuration |\n\n## Cron Expression Format\n\nThe scheduler supports standard cron expressions:\n\n```\n┌───────────── second (optional, 0-59)\n│ ┌───────────── minute (0-59)\n│ │ ┌───────────── hour (0-23)\n│ │ │ ┌───────────── day of month (1-31)\n│ │ │ │ ┌───────────── month (1-12)\n│ │ │ │ │ ┌───────────── day of week (0-7, 0 and 7 are Sunday)\n│ │ │ │ │ │\n│ │ │ │ │ │\n* * * * * *\n```\n\n### Examples\n\n- `0 9 * * *` - Every day at 9:00 AM\n- `*/15 * * * *` - Every 15 minutes\n- `0 */2 * * *` - Every 2 hours\n- `0 9 * * 1` - Every Monday at 9:00 AM\n- `0 0 1 * *` - First day of every month at midnight\n- `* * * * * *` - Every second (with second precision)\n\n## API Reference\n\n### JobScheduler\n\nMain scheduler class for managing jobs.\n\n#### Methods\n\n- `schedule(cronExpression, handler, options?)` - Schedule recurring job\n- `scheduleAt(date, handler, options?)` - Schedule one-time job\n- `cancel(jobId)` - Cancel a job\n- `pause(jobId)` - Pause a job\n- `resume(jobId)` - Resume a paused job\n- `getJob(jobId)` - Get job by ID\n- `getAllJobs()` - Get all jobs\n- `getJobsByStatus(status)` - Filter jobs by status\n- `getJobStatistics(jobId)` - Get job statistics\n- `getSchedulerStatistics()` - Get overall statistics\n- `validateCronExpression(expression)` - Validate cron expression\n- `cancelAll()` - Cancel all jobs\n- `shutdown()` - Shutdown scheduler\n\n### ScheduledJob\n\nRepresents a scheduled job instance.\n\n#### Methods\n\n- `getId()` - Get job ID\n- `getName()` - Get job name\n- `getType()` - Get job type (recurring/one-time)\n- `getStatus()` - Get current status\n- `getConfig()` - Get job configuration\n- `getExecutions()` - Get execution history\n- `getStatistics()` - Get job statistics\n- `start()` - Start job execution\n- `pause()` - Pause job\n- `resume()` - Resume job\n- `cancel()` - Cancel job\n\n### Types\n\n```typescript\nenum JobStatus {\n  SCHEDULED = 'scheduled',\n  RUNNING = 'running',\n  PAUSED = 'paused',\n  COMPLETED = 'completed',\n  FAILED = 'failed',\n  CANCELLED = 'cancelled'\n}\n\nenum JobType {\n  RECURRING = 'recurring',\n  ONE_TIME = 'one-time'\n}\n\ninterface JobExecution {\n  executionId: string;\n  jobId: string;\n  startTime: Date;\n  endTime?: Date;\n  status: JobStatus;\n  error?: string;\n  duration?: number;\n}\n\ninterface JobStatistics {\n  totalExecutions: number;\n  successfulExecutions: number;\n  failedExecutions: number;\n  averageDuration: number;\n  lastExecution?: Date;\n  nextExecution?: Date;\n}\n\ninterface JobSchedulerResult<T = unknown> {\n  success: boolean;\n  data?: T;\n  error?: string;\n}\n```\n\n## Advanced Usage\n\n### Custom Job Names and Metadata\n\n```typescript\nconst result = scheduler.schedule('0 * * * *', handler, {\n  name: 'hourly-sync',\n  metadata: {\n    source: 'external-api',\n    priority: 'high',\n    owner: 'data-team'\n  }\n});\n\n// Access metadata later\nconst job = scheduler.getJob(result.data!.getId());\nconst config = job.getConfig();\nconsole.log('Metadata:', config.metadata);\n```\n\n### Monitoring Job Execution\n\n```typescript\nconst job = scheduler.getJob(jobId);\n\n// Check current status\nconsole.log('Status:', job.getStatus());\n\n// Get detailed statistics\nconst stats = job.getStatistics();\nconsole.log('Success rate:',\n  (stats.successfulExecutions / stats.totalExecutions * 100).toFixed(2) + '%'\n);\n\n// Get execution history\nconst executions = job.getExecutions();\nconst recentFailures = executions\n  .filter(e => e.status === JobStatus.FAILED)\n  .slice(-5);\n\nrecentFailures.forEach(failure => {\n  console.log('Failed at:', failure.startTime);\n  console.log('Error:', failure.error);\n});\n```\n\n### Graceful Shutdown\n\n```typescript\n// Cleanup on application shutdown\nprocess.on('SIGTERM', () => {\n  console.log('Shutting down scheduler...');\n  scheduler.shutdown();\n  process.exit(0);\n});\n```\n\n## Integration Status\n\n### Logger Integration\n**Status**: Integrated\n\n**Justification**: This package uses `@bernierllc/logger` for structured logging of job scheduling operations. Logs include job creation, execution start/completion, failures, retries, and scheduling events to help with debugging and monitoring job workflows.\n\n**Pattern**: Direct integration - logger is a required dependency for this package.\n\n### NeverHub Integration\n**Status**: Optional (recommended for job orchestration)\n\n**Justification**: While this package can function without NeverHub, it's highly recommended to integrate `@bernierllc/neverhub-adapter` for job orchestration and event publishing. Job schedulers often need to coordinate with other services, and NeverHub provides a service mesh for publishing job execution events that other services can subscribe to. However, the package is designed to work without NeverHub for simpler use cases.\n\n**Pattern**: Optional integration - package works without NeverHub, but NeverHub enhances job orchestration capabilities.\n\n**Example Integration**:\n```typescript\nimport { NeverHubAdapter } from '@bernierllc/neverhub-adapter';\nimport { JobScheduler } from '@bernierllc/job-scheduler';\n\nconst neverhub = new NeverHubAdapter({ service: 'job-scheduler' });\nconst scheduler = new JobScheduler({ /* config */ });\n\n// Publish job events to NeverHub\nscheduler.on('job:completed', async (job) => {\n  await neverhub.publish('job.completed', {\n    jobId: job.id,\n    jobType: job.type,\n    duration: job.duration,\n    timestamp: new Date()\n  });\n});\n```\n\n### Docs-Suite Integration\n**Status**: Ready\n\n**Format**: TypeDoc-compatible JSDoc comments are included throughout the source code. All public APIs are documented with examples and type information.\n\n## Error Handling\n\nAll operations return a `JobSchedulerResult` with structured error information:\n\n```typescript\nconst result = scheduler.schedule('invalid-cron', handler);\nif (!result.success) {\n  console.error('Scheduling failed:', result.error);\n  // Handle error appropriately\n}\n```\n\n## Dependencies\n\n- `@bernierllc/logger` - Logging functionality\n- `@bernierllc/task-queue` - Optional task queue integration\n- `cron-parser` - Cron expression parsing\n\n## See Also\n\n- [@bernierllc/cron-scheduler](../cron-scheduler) - Pure cron utilities\n- [@bernierllc/task-queue](../task-queue) - Task queue management\n- [@bernierllc/scheduler-service](../../service/scheduler-service) - High-level scheduling service\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n","readmeFilename":"README.md"}