{"_id":"@bernierllc/cron-scheduler","_rev":"9-79d78082512cadf9ab1f658333297596","name":"@bernierllc/cron-scheduler","dist-tags":{"latest":"1.3.0"},"versions":{"1.0.1":{"name":"@bernierllc/cron-scheduler","version":"1.0.1","keywords":["cron","scheduler","jobs","timing","atomic","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/cron-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/cron-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"bf0b0b76d5f05ad5dfd333e0114afaab6942665e","tarball":"https://registry.npmjs.org/@bernierllc/cron-scheduler/-/cron-scheduler-1.0.1.tgz","fileCount":23,"integrity":"sha512-lnhRoaXhCIVniv7psNoGDZzY9iwvpcaGcR5/1F3kGEHt1jfjqxzsvy4ti33V/L7ixz20Z/cl7WMTwxSYFP8Swg==","signatures":[{"sig":"MEUCIFByIX04T5vjTZZ8x1LXMip+mom2QZvBOrgTUfIH0hHsAiEA3U21ievKJyAmDu4xpk9tEcvyyhLIT0bwApP2G2mycoI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112110},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"a70dfbcf7ae00e80f00762605daaf34f3e31dfb6","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/cron-scheduler"},"_npmVersion":"11.4.2","description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","directories":{},"_nodeVersion":"24.4.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/cron-scheduler_1.0.1_1756768743862_0.08404411763822273","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bernierllc/cron-scheduler","version":"1.0.3","keywords":["cron","scheduler","jobs","timing","atomic","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/cron-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/cron-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"feee6248a7a825fa905725feeba63cd77977211e","tarball":"https://registry.npmjs.org/@bernierllc/cron-scheduler/-/cron-scheduler-1.0.3.tgz","fileCount":23,"integrity":"sha512-33bkbLlUwqrxbV3gt/45oiDgo1TqjPQ8hXAuPqgnY6grKZ2DGx2KsV5ErOv6huXuz2Ge1dKUmvcKhm/Z5TqO2Q==","signatures":[{"sig":"MEYCIQCdkGcRDQQYYv6cshj+pETYqnSXCZV5M9jS1gKxB6l9bgIhAP78rZJUDpPgSWz/Z1W9obbsfyfRSNzKPdN992/mPbrA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112214},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"683786f5b043d9a96c9f49ed1f04f9dccd79eed3","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b34eaf6a-5ffe-4ccc-93a2-18787be0a8c9"}},"repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/cron-scheduler"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","directories":{},"_nodeVersion":"20.19.6","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/cron-scheduler_1.0.3_1767644237976_0.6239225876197163","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bernierllc/cron-scheduler","version":"1.0.4","keywords":["cron","scheduler","jobs","timing","atomic","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/cron-scheduler@1.0.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/cron-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"c8d85d9ed36d3093d7506a7b08a36df3052fb732","tarball":"https://registry.npmjs.org/@bernierllc/cron-scheduler/-/cron-scheduler-1.0.4.tgz","fileCount":23,"integrity":"sha512-lb3tVVy7G/s+CYDegWiMHlNBLM9Z5BfV54ic5BFQmyFBVn1MqGL8YdqoxveVceew6ezuln0Nr7PUH8MoO+dk/Q==","signatures":[{"sig":"MEQCIBHlr6bkRI8XnFWU0ARQ8McCIgovo5wwdPMTmQZkLWEUAiBswMll3PmSNX56dPAv+dumtqP1Lt/MvhXCqOIO/Iq+Og==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112152},"main":"dist/index.js","_from":"file:bernierllc-cron-scheduler-1.0.4.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b34eaf6a-5ffe-4ccc-93a2-18787be0a8c9"}},"_resolved":"/tmp/8dbd2f3c0412556cb40c6ca2f6c40b16/bernierllc-cron-scheduler-1.0.4.tgz","_integrity":"sha512-lb3tVVy7G/s+CYDegWiMHlNBLM9Z5BfV54ic5BFQmyFBVn1MqGL8YdqoxveVceew6ezuln0Nr7PUH8MoO+dk/Q==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/cron-scheduler"},"_npmVersion":"11.11.0","description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","directories":{},"_nodeVersion":"20.20.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/cron-scheduler_1.0.4_1773077986558_0.4438918519641697","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bernierllc/cron-scheduler","version":"1.0.5","keywords":["cron","scheduler","jobs","timing","atomic","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/cron-scheduler@1.0.5","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/cron-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"dd9ed0c0fe81185790ca6f5a272ee329e8c96602","tarball":"https://registry.npmjs.org/@bernierllc/cron-scheduler/-/cron-scheduler-1.0.5.tgz","fileCount":23,"integrity":"sha512-jT/TLVhf6ycyd1/NEmmA4NiUF+cSWSrjMtfLwKPMCwYgwUDp2dRF7enfpET7rO7nA6gCyWzEh/idaYo0X3Snbg==","signatures":[{"sig":"MEQCIGMwPFHMnXlp+4UJO6VX51S3Ps8kMJyvMCJ+gjWOYZOXAiBvVczGOFVHvg2rxquoIy80RvEavrvCXg+C9DD1/ZoNKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112152},"main":"dist/index.js","_from":"file:bernierllc-cron-scheduler-1.0.5.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b34eaf6a-5ffe-4ccc-93a2-18787be0a8c9"}},"_resolved":"/tmp/e1d1560b2f6cee8b8b66e1f6f4812c35/bernierllc-cron-scheduler-1.0.5.tgz","_integrity":"sha512-jT/TLVhf6ycyd1/NEmmA4NiUF+cSWSrjMtfLwKPMCwYgwUDp2dRF7enfpET7rO7nA6gCyWzEh/idaYo0X3Snbg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/cron-scheduler"},"_npmVersion":"11.11.0","description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","directories":{},"_nodeVersion":"20.20.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/cron-scheduler_1.0.5_1773081154718_0.18187594314778943","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/cron-scheduler","version":"1.2.0","keywords":["cron","scheduler","jobs","timing","atomic","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/cron-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/cron-scheduler#readme","bugs":{"url":"https://github.com/bernierllc/tools/issues"},"dist":{"shasum":"956716a493b48a8cab001aef890294a19b5fc092","tarball":"https://registry.npmjs.org/@bernierllc/cron-scheduler/-/cron-scheduler-1.2.0.tgz","fileCount":27,"integrity":"sha512-vw12hx40+weIYQ5TtNjExIhYeKQn4RhIQmmzCgucq73cETn0YOIMmwkU5XIDf5m+gAsG78l7bc4RPAApS/8ITg==","signatures":[{"sig":"MEUCIQCX/N2/VP406f+DKQunfjdpfS5pxrybdTUw2NqQHi6fAAIgA5jAheFy1mL/4N3e62fKHXdNgkkLpXIkmuWCysYEo3s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115514},"main":"dist/index.js","_from":"file:bernierllc-cron-scheduler-1.2.0.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","prebuild":"npm run clean","test:run":"jest --passWithNoTests","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b34eaf6a-5ffe-4ccc-93a2-18787be0a8c9"}},"_resolved":"/home/runner/work/tools/tools/packages/core/cron-scheduler/bernierllc-cron-scheduler-1.2.0.tgz","_integrity":"sha512-vw12hx40+weIYQ5TtNjExIhYeKQn4RhIQmmzCgucq73cETn0YOIMmwkU5XIDf5m+gAsG78l7bc4RPAApS/8ITg==","repository":{"url":"git+https://github.com/bernierllc/tools.git","type":"git","directory":"packages/core/cron-scheduler"},"_npmVersion":"11.14.1","description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","directories":{},"_nodeVersion":"20.20.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/cron-scheduler_1.2.0_1779241070582_0.13497147194305237","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bernierllc/cron-scheduler","version":"1.3.0","description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","main":"dist/index.js","types":"dist/index.d.ts","keywords":["cron","scheduler","jobs","timing","atomic","core"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","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/cron-scheduler"},"bugs":{"url":"https://github.com/bernierllc/tools/issues"},"homepage":"https://github.com/bernierllc/tools/tree/main/packages/core/cron-scheduler#readme","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"engines":{"node":">=16.0.0"},"scripts":{"build":"tsc","prebuild":"npm run clean","clean":"rimraf dist","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:run":"jest --passWithNoTests","lint":"eslint src --ext .ts"},"_id":"@bernierllc/cron-scheduler@1.3.0","_integrity":"sha512-uJAry0rPbGkUAykPLmQdYDn5XOmOKYnB8XF2MSMWncct8eSjH7Kdb6dJwre/0Giy3D6Xh0TQl3iElBUeppr2XA==","_resolved":"/home/runner/work/tools/tools/packages/core/cron-scheduler/bernierllc-cron-scheduler-1.3.0.tgz","_from":"file:bernierllc-cron-scheduler-1.3.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-uJAry0rPbGkUAykPLmQdYDn5XOmOKYnB8XF2MSMWncct8eSjH7Kdb6dJwre/0Giy3D6Xh0TQl3iElBUeppr2XA==","shasum":"e768e4772c724f8a60d21730df2153ece63cb931","tarball":"https://registry.npmjs.org/@bernierllc/cron-scheduler/-/cron-scheduler-1.3.0.tgz","fileCount":27,"unpackedSize":115514,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEma6k15f8PM9JXog01aOSHAS0GE4gV5I5OhnKgLCiCKAiAjSsqQIckRtNKLEn4gbUHzs1g/Yujd/fRzKIzNQmfHVA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b34eaf6a-5ffe-4ccc-93a2-18787be0a8c9"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cron-scheduler_1.3.0_1779249813206_0.3634207743337412"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-01T23:19:03.781Z","modified":"2026-05-20T04:03:33.507Z","1.0.1":"2025-09-01T23:19:04.054Z","1.0.3":"2026-01-05T20:17:18.117Z","1.0.4":"2026-03-09T17:39:46.709Z","1.0.5":"2026-03-09T18:32:34.877Z","1.2.0":"2026-05-20T01:37:50.721Z","1.3.0":"2026-05-20T04:03:33.365Z"},"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/cron-scheduler#readme","keywords":["cron","scheduler","jobs","timing","atomic","core"],"repository":{"type":"git","url":"git+https://github.com/bernierllc/tools.git","directory":"packages/core/cron-scheduler"},"description":"Pure cron job scheduling utilities with advanced pattern parsing and validation","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/cron-scheduler\n\nPure cron job scheduling utilities with advanced pattern parsing and validation.\n\n## Installation\n\n```bash\nnpm install @bernierllc/cron-scheduler\n```\n\n## Features\n\n- **Advanced Pattern Parsing**: Comprehensive cron pattern validation with detailed error reporting\n- **Timezone Support**: Schedule jobs in any timezone\n- **Job Management**: Start, pause, stop, and monitor scheduled jobs\n- **Event System**: Listen to job lifecycle events\n- **Fluent Builder**: Create cron patterns using an intuitive API\n- **Time Constraints**: Support for start/end times and maximum run counts\n- **Human Descriptions**: Generate readable descriptions of cron patterns\n\n## Usage\n\n### Basic Scheduling\n\n```typescript\nimport { CronScheduler, JobStatus } from '@bernierllc/cron-scheduler';\n\nconst scheduler = new CronScheduler();\n\n// Schedule a job\nconst jobInfo = scheduler.schedule(\n  'my-job',\n  '0 9 * * 1-5', // Monday to Friday at 9:00 AM\n  () => {\n    console.log('Good morning! Time to work.');\n  }\n);\n\nconsole.log(`Job ${jobInfo.id} scheduled for next run: ${jobInfo.nextRun}`);\n```\n\n### Advanced Job Options\n\n```typescript\nscheduler.schedule(\n  'report-job',\n  '0 18 * * 5', // Every Friday at 6:00 PM\n  async () => {\n    await generateWeeklyReport();\n  },\n  {\n    timezone: 'America/New_York',\n    start: new Date('2024-01-01'),\n    end: new Date('2024-12-31'),\n    maxRuns: 52, // Run for one year\n    immediate: false\n  }\n);\n```\n\n### Job Management\n\n```typescript\n// Get job information\nconst jobInfo = scheduler.getJobInfo('my-job');\nconsole.log(`Status: ${jobInfo.status}, Run count: ${jobInfo.runCount}`);\n\n// Control jobs\nscheduler.pause('my-job');\nscheduler.start('my-job');\nscheduler.stop('my-job');\n\n// Get jobs by status\nconst runningJobs = scheduler.getJobsByStatus(JobStatus.RUNNING);\nconst allJobs = scheduler.getAllJobs();\n```\n\n### Fluent Schedule Builder\n\n```typescript\nimport { schedule } from '@bernierllc/cron-scheduler';\n\n// Every 15 minutes\nconst pattern1 = schedule().every(15).minutes().build();\n// Result: \"0 */15 * * *\"\n\n// Daily at 9:30 AM\nconst pattern2 = schedule().at('9:30').daily().build();\n// Result: \"30 9 * * *\"\n\n// Weekly on Monday, Wednesday, Friday at 2:00 PM\nconst pattern3 = schedule()\n  .at('2:00 PM')\n  .on(['monday', 'wednesday', 'friday'])\n  .build();\n// Result: \"0 14 * * 1,3,5\"\n\n// Every 2 hours between 8 AM and 6 PM\nconst pattern4 = schedule()\n  .between('8:00', '18:00')\n  .every(2)\n  .hours()\n  .build();\n// Result: \"0 8-18 */2 * *\"\n```\n\n### Pattern Validation\n\n```typescript\nimport { CronPatternParser, validation } from '@bernierllc/cron-scheduler';\n\n// Validate a pattern\nconst result = CronPatternParser.validate('0 9 * * 1-5');\nif (result.isValid) {\n  console.log('Pattern is valid');\n} else {\n  console.log('Errors:', result.errors);\n  console.log('Warnings:', result.warnings);\n}\n\n// Quick validation helpers\nconsole.log(validation.isValid('*/5 * * * *')); // true\nconsole.log(validation.getErrors('60 * * * *')); // ['Value out of range...']\n```\n\n### Human-Readable Descriptions\n\n```typescript\nimport { ScheduleDescriptor } from '@bernierllc/cron-scheduler';\n\nconst description = ScheduleDescriptor.describe('0 9 * * 1-5');\nconsole.log(description.summary); // \"Runs daily at 9:00 AM on Monday-Friday\"\nconsole.log(description.detailed); // \"This job runs daily at 9:00 AM on weekdays\"\n```\n\n### Event Handling\n\n```typescript\n// Listen to job events\nscheduler.onJobEvent('my-job', (event) => {\n  console.log(`Job ${event.jobId}: ${event.type} at ${event.timestamp}`);\n});\n\n// Global error handler\nscheduler.onError((error) => {\n  console.error('Job execution failed:', error);\n});\n```\n\n### Common Patterns\n\n```typescript\nimport { commonPatterns } from '@bernierllc/cron-scheduler';\n\nscheduler.schedule('backup', commonPatterns.dailyAt2AM, backupDatabase);\nscheduler.schedule('cleanup', commonPatterns.weeklyMondayAt9AM, cleanupLogs);\nscheduler.schedule('report', commonPatterns.monthlyFirstMondayAt9AM, generateReport);\n```\n\n## API Reference\n\n### CronScheduler\n\nMain scheduler class for managing cron jobs.\n\n#### Methods\n\n- `schedule(id, pattern, callback, options?)` - Schedule a new job\n- `getJobInfo(id)` - Get information about a job\n- `getAllJobs()` - Get all scheduled jobs\n- `getJobsByStatus(status)` - Get jobs by status\n- `start(id)` - Start a paused job\n- `pause(id)` - Pause a running job\n- `stop(id)` - Stop and remove a job\n- `stopAll()` - Stop all jobs\n- `getNextRun(pattern, timezone?)` - Calculate next run time\n- `getUpcomingRuns(pattern, count?, timezone?)` - Get upcoming executions\n- `onJobEvent(jobId, callback)` - Listen to job events\n- `onError(handler)` - Set global error handler\n\n### CronPatternParser\n\nStatic utilities for parsing and validating cron patterns.\n\n#### Methods\n\n- `parse(pattern)` - Parse pattern into structured format\n- `validate(pattern)` - Validate pattern with error reporting\n- `normalize(pattern)` - Normalize pattern format\n\n### Schedule Builder\n\nFluent interface for building cron patterns.\n\n#### Methods\n\n- `every(interval)` - Set interval frequency\n- `at(time)` - Set specific time\n- `on(dayOrDate)` - Set specific day/date\n- `between(start, end)` - Set time range\n- `build()` - Generate cron pattern\n\n## Types\n\n### JobStatus\n\n```typescript\nenum JobStatus {\n  SCHEDULED = 'scheduled',\n  RUNNING = 'running',\n  PAUSED = 'paused',\n  STOPPED = 'stopped',\n  COMPLETED = 'completed',\n  FAILED = 'failed'\n}\n```\n\n### CronJobOptions\n\n```typescript\ninterface CronJobOptions {\n  timezone?: string;\n  start?: Date | string;\n  end?: Date | string;\n  maxRuns?: number;\n  immediate?: boolean;\n  runOnInit?: boolean;\n}\n```\n\n### ScheduledJobInfo\n\n```typescript\ninterface ScheduledJobInfo {\n  id: string;\n  pattern: string;\n  nextRun: Date | null;\n  lastRun: Date | null;\n  runCount: number;\n  status: JobStatus;\n  timezone: string;\n  metadata?: Record<string, any>;\n}\n```\n\n## Error Handling\n\nThe scheduler provides comprehensive error handling:\n\n```typescript\n// Pattern validation errors\ntry {\n  scheduler.schedule('job', 'invalid-pattern', callback);\n} catch (error) {\n  console.error('Invalid pattern:', error.message);\n}\n\n// Runtime errors\nscheduler.onError(async (error) => {\n  await logError(error);\n  await notifyAdmin(error);\n});\n```\n\n## Testing\n\n```bash\nnpm test\nnpm run test:coverage\nnpm run test:watch\n```\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.","readmeFilename":"README.md"}