@warlock.js/scheduler 4.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,178 @@
1
+ import type { Job } from "./job";
2
+ import type { SchedulerEvents } from "./types";
3
+ /**
4
+ * Type-safe event emitter interface for Scheduler events
5
+ */
6
+ interface TypedEventEmitter<TEvents extends Record<string, unknown[]>> {
7
+ on<K extends keyof TEvents>(event: K, listener: (...args: TEvents[K]) => void): this;
8
+ once<K extends keyof TEvents>(event: K, listener: (...args: TEvents[K]) => void): this;
9
+ off<K extends keyof TEvents>(event: K, listener: (...args: TEvents[K]) => void): this;
10
+ emit<K extends keyof TEvents>(event: K, ...args: TEvents[K]): boolean;
11
+ }
12
+ declare const Scheduler_base: new () => TypedEventEmitter<SchedulerEvents>;
13
+ /**
14
+ * Scheduler class manages and executes scheduled jobs.
15
+ *
16
+ * Features:
17
+ * - Event-based observability
18
+ * - Parallel or sequential job execution
19
+ * - Drift compensation for accurate timing
20
+ * - Graceful shutdown with job draining
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const scheduler = new Scheduler();
25
+ *
26
+ * scheduler.on('job:error', (jobName, error) => {
27
+ * logger.error(`Job ${jobName} failed:`, error);
28
+ * });
29
+ *
30
+ * scheduler
31
+ * .addJob(cleanupJob)
32
+ * .addJob(reportJob)
33
+ * .runInParallel(true)
34
+ * .start();
35
+ *
36
+ * // Graceful shutdown
37
+ * process.on('SIGTERM', () => scheduler.shutdown());
38
+ * ```
39
+ */
40
+ export declare class Scheduler extends Scheduler_base implements TypedEventEmitter<SchedulerEvents> {
41
+ /**
42
+ * List of registered jobs
43
+ */
44
+ private _jobs;
45
+ /**
46
+ * Reference to the current timeout for stopping
47
+ */
48
+ private _timeoutId;
49
+ /**
50
+ * Tick interval in milliseconds (how often to check for due jobs)
51
+ */
52
+ private _tickInterval;
53
+ /**
54
+ * Whether to run due jobs in parallel
55
+ */
56
+ private _runInParallel;
57
+ /**
58
+ * Maximum concurrent jobs when running in parallel
59
+ */
60
+ private _maxConcurrency;
61
+ /**
62
+ * Flag indicating scheduler is shutting down
63
+ */
64
+ private _isShuttingDown;
65
+ /**
66
+ * Returns true if the scheduler is currently running
67
+ */
68
+ get isRunning(): boolean;
69
+ /**
70
+ * Returns the number of registered jobs
71
+ */
72
+ get jobCount(): number;
73
+ /**
74
+ * Add a job to the scheduler
75
+ *
76
+ * @param job - Job instance to schedule
77
+ * @returns this for chaining
78
+ */
79
+ addJob(job: Job): this;
80
+ /**
81
+ * Add multiple jobs to the scheduler
82
+ *
83
+ * @param jobs - Array of Job instances
84
+ * @returns this for chaining
85
+ */
86
+ addJobs(jobs: Job[]): this;
87
+ /**
88
+ * Remove a job from the scheduler by name
89
+ *
90
+ * @param jobName - Name of the job to remove
91
+ * @returns true if job was found and removed
92
+ */
93
+ removeJob(jobName: string): boolean;
94
+ /**
95
+ * Get a job by name
96
+ *
97
+ * @param jobName - Name of the job to find
98
+ * @returns Job instance or undefined
99
+ */
100
+ getJob(jobName: string): Job | undefined;
101
+ /**
102
+ * Get all registered jobs
103
+ *
104
+ * @returns Array of registered jobs (readonly)
105
+ */
106
+ list(): readonly Job[];
107
+ /**
108
+ * Set the tick interval (how often to check for due jobs)
109
+ *
110
+ * @param ms - Interval in milliseconds (minimum 100ms)
111
+ * @returns this for chaining
112
+ */
113
+ runEvery(ms: number): this;
114
+ /**
115
+ * Configure whether jobs should run in parallel
116
+ *
117
+ * @param parallel - Enable parallel execution
118
+ * @param maxConcurrency - Maximum concurrent jobs (default: 10)
119
+ * @returns this for chaining
120
+ */
121
+ runInParallel(parallel: boolean, maxConcurrency?: number): this;
122
+ /**
123
+ * Start the scheduler
124
+ *
125
+ * @throws Error if scheduler is already running
126
+ */
127
+ start(): void;
128
+ /**
129
+ * Stop the scheduler immediately
130
+ *
131
+ * Note: This does not wait for running jobs to complete.
132
+ * Use shutdown() for graceful termination.
133
+ */
134
+ stop(): void;
135
+ /**
136
+ * Gracefully shutdown the scheduler
137
+ *
138
+ * Stops scheduling new jobs and waits for currently running jobs to complete.
139
+ *
140
+ * @param timeout - Maximum time to wait for jobs (default: 30000ms)
141
+ * @returns Promise that resolves when shutdown is complete
142
+ */
143
+ shutdown(timeout?: number): Promise<void>;
144
+ /**
145
+ * Schedule the next tick
146
+ */
147
+ private _scheduleTick;
148
+ /**
149
+ * Execute a scheduler tick - check and run due jobs
150
+ */
151
+ private _tick;
152
+ /**
153
+ * Run jobs sequentially
154
+ */
155
+ private _runJobsSequentially;
156
+ /**
157
+ * Run jobs in parallel with concurrency limit
158
+ */
159
+ private _runJobsInParallel;
160
+ /**
161
+ * Run a single job and emit events
162
+ */
163
+ private _runJob;
164
+ }
165
+ /**
166
+ * Default scheduler instance for simple use cases
167
+ *
168
+ * @example
169
+ * ```typescript
170
+ * import { scheduler, job } from "@warlock.js/scheduler";
171
+ *
172
+ * scheduler.addJob(job("cleanup", cleanupFn).daily());
173
+ * scheduler.start();
174
+ * ```
175
+ */
176
+ export declare const scheduler: Scheduler;
177
+ export {};
178
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1D;;GAEG;AACH,UAAU,iBAAiB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IACnE,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IACtF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACvE;wCA8BoC,kBAAkB,eAAe,CAAC;AA5BvE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,SACX,SAAQ,cACR,YAAW,iBAAiB,CAAC,eAAe,CAAC;IAM7C;;OAEG;IACH,OAAO,CAAC,KAAK,CAAa;IAE1B;;OAEG;IACH,OAAO,CAAC,UAAU,CAA+B;IAEjD;;OAEG;IACH,OAAO,CAAC,aAAa,CAAQ;IAE7B;;OAEG;IACH,OAAO,CAAC,cAAc,CAAS;IAE/B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAM;IAE7B;;OAEG;IACH,OAAO,CAAC,eAAe,CAAS;IAMhC;;OAEG;IACH,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED;;OAEG;IACH,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAMD;;;;;OAKG;IACI,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAK7B;;;;;OAKG;IACI,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAKjC;;;;;OAKG;IACI,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAS1C;;;;;OAKG;IACI,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAI/C;;;;OAIG;IACI,IAAI,IAAI,SAAS,GAAG,EAAE;IAI7B;;;;;OAKG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQjC;;;;;;OAMG;IACI,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,SAAK,GAAG,IAAI;IAUlE;;;;OAIG;IACI,KAAK,IAAI,IAAI;IAoBpB;;;;;OAKG;IACI,IAAI,IAAI,IAAI;IASnB;;;;;;;OAOG;IACU,QAAQ,CAAC,OAAO,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrD;;OAEG;IACH,OAAO,CAAC,aAAa;IAiBrB;;OAEG;YACW,KAAK;IAyBnB;;OAEG;YACW,oBAAoB;IAOlC;;OAEG;YACW,kBAAkB;IAchC;;OAEG;YACW,OAAO;CAatB;AAMD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,WAAkB,CAAC"}
@@ -0,0 +1,305 @@
1
+ import {EventEmitter}from'events';/**
2
+ * Scheduler class manages and executes scheduled jobs.
3
+ *
4
+ * Features:
5
+ * - Event-based observability
6
+ * - Parallel or sequential job execution
7
+ * - Drift compensation for accurate timing
8
+ * - Graceful shutdown with job draining
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const scheduler = new Scheduler();
13
+ *
14
+ * scheduler.on('job:error', (jobName, error) => {
15
+ * logger.error(`Job ${jobName} failed:`, error);
16
+ * });
17
+ *
18
+ * scheduler
19
+ * .addJob(cleanupJob)
20
+ * .addJob(reportJob)
21
+ * .runInParallel(true)
22
+ * .start();
23
+ *
24
+ * // Graceful shutdown
25
+ * process.on('SIGTERM', () => scheduler.shutdown());
26
+ * ```
27
+ */
28
+ class Scheduler extends EventEmitter {
29
+ // ─────────────────────────────────────────────────────────────────────────────
30
+ // Private Properties
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ /**
33
+ * List of registered jobs
34
+ */
35
+ _jobs = [];
36
+ /**
37
+ * Reference to the current timeout for stopping
38
+ */
39
+ _timeoutId = null;
40
+ /**
41
+ * Tick interval in milliseconds (how often to check for due jobs)
42
+ */
43
+ _tickInterval = 1000;
44
+ /**
45
+ * Whether to run due jobs in parallel
46
+ */
47
+ _runInParallel = false;
48
+ /**
49
+ * Maximum concurrent jobs when running in parallel
50
+ */
51
+ _maxConcurrency = 10;
52
+ /**
53
+ * Flag indicating scheduler is shutting down
54
+ */
55
+ _isShuttingDown = false;
56
+ // ─────────────────────────────────────────────────────────────────────────────
57
+ // Public Getters
58
+ // ─────────────────────────────────────────────────────────────────────────────
59
+ /**
60
+ * Returns true if the scheduler is currently running
61
+ */
62
+ get isRunning() {
63
+ return this._timeoutId !== null;
64
+ }
65
+ /**
66
+ * Returns the number of registered jobs
67
+ */
68
+ get jobCount() {
69
+ return this._jobs.length;
70
+ }
71
+ // ─────────────────────────────────────────────────────────────────────────────
72
+ // Configuration Methods (Fluent API)
73
+ // ─────────────────────────────────────────────────────────────────────────────
74
+ /**
75
+ * Add a job to the scheduler
76
+ *
77
+ * @param job - Job instance to schedule
78
+ * @returns this for chaining
79
+ */
80
+ addJob(job) {
81
+ this._jobs.push(job);
82
+ return this;
83
+ }
84
+ /**
85
+ * Add multiple jobs to the scheduler
86
+ *
87
+ * @param jobs - Array of Job instances
88
+ * @returns this for chaining
89
+ */
90
+ addJobs(jobs) {
91
+ this._jobs.push(...jobs);
92
+ return this;
93
+ }
94
+ /**
95
+ * Remove a job from the scheduler by name
96
+ *
97
+ * @param jobName - Name of the job to remove
98
+ * @returns true if job was found and removed
99
+ */
100
+ removeJob(jobName) {
101
+ const index = this._jobs.findIndex((j) => j.name === jobName);
102
+ if (index !== -1) {
103
+ this._jobs.splice(index, 1);
104
+ return true;
105
+ }
106
+ return false;
107
+ }
108
+ /**
109
+ * Get a job by name
110
+ *
111
+ * @param jobName - Name of the job to find
112
+ * @returns Job instance or undefined
113
+ */
114
+ getJob(jobName) {
115
+ return this._jobs.find((j) => j.name === jobName);
116
+ }
117
+ /**
118
+ * Get all registered jobs
119
+ *
120
+ * @returns Array of registered jobs (readonly)
121
+ */
122
+ list() {
123
+ return this._jobs;
124
+ }
125
+ /**
126
+ * Set the tick interval (how often to check for due jobs)
127
+ *
128
+ * @param ms - Interval in milliseconds (minimum 100ms)
129
+ * @returns this for chaining
130
+ */
131
+ runEvery(ms) {
132
+ if (ms < 100) {
133
+ throw new Error("Tick interval must be at least 100ms");
134
+ }
135
+ this._tickInterval = ms;
136
+ return this;
137
+ }
138
+ /**
139
+ * Configure whether jobs should run in parallel
140
+ *
141
+ * @param parallel - Enable parallel execution
142
+ * @param maxConcurrency - Maximum concurrent jobs (default: 10)
143
+ * @returns this for chaining
144
+ */
145
+ runInParallel(parallel, maxConcurrency = 10) {
146
+ this._runInParallel = parallel;
147
+ this._maxConcurrency = maxConcurrency;
148
+ return this;
149
+ }
150
+ // ─────────────────────────────────────────────────────────────────────────────
151
+ // Lifecycle Methods
152
+ // ─────────────────────────────────────────────────────────────────────────────
153
+ /**
154
+ * Start the scheduler
155
+ *
156
+ * @throws Error if scheduler is already running
157
+ */
158
+ start() {
159
+ if (this.isRunning) {
160
+ throw new Error("Scheduler is already running.");
161
+ }
162
+ if (this._jobs.length === 0) {
163
+ throw new Error("Cannot start scheduler with no jobs.");
164
+ }
165
+ // Prepare all jobs (calculate initial next run times)
166
+ for (const job of this._jobs) {
167
+ job.prepare();
168
+ }
169
+ this._isShuttingDown = false;
170
+ this._scheduleTick();
171
+ this.emit("scheduler:started");
172
+ }
173
+ /**
174
+ * Stop the scheduler immediately
175
+ *
176
+ * Note: This does not wait for running jobs to complete.
177
+ * Use shutdown() for graceful termination.
178
+ */
179
+ stop() {
180
+ if (this._timeoutId) {
181
+ clearTimeout(this._timeoutId);
182
+ this._timeoutId = null;
183
+ }
184
+ this.emit("scheduler:stopped");
185
+ }
186
+ /**
187
+ * Gracefully shutdown the scheduler
188
+ *
189
+ * Stops scheduling new jobs and waits for currently running jobs to complete.
190
+ *
191
+ * @param timeout - Maximum time to wait for jobs (default: 30000ms)
192
+ * @returns Promise that resolves when shutdown is complete
193
+ */
194
+ async shutdown(timeout = 30000) {
195
+ this._isShuttingDown = true;
196
+ this.stop();
197
+ // Get all currently running jobs
198
+ const runningJobs = this._jobs.filter((j) => j.isRunning);
199
+ if (runningJobs.length > 0) {
200
+ // Wait for jobs to complete or timeout
201
+ await Promise.race([
202
+ Promise.all(runningJobs.map((j) => j.waitForCompletion())),
203
+ new Promise((resolve) => setTimeout(resolve, timeout)),
204
+ ]);
205
+ }
206
+ }
207
+ // ─────────────────────────────────────────────────────────────────────────────
208
+ // Private Methods
209
+ // ─────────────────────────────────────────────────────────────────────────────
210
+ /**
211
+ * Schedule the next tick
212
+ */
213
+ _scheduleTick() {
214
+ if (this._isShuttingDown)
215
+ return;
216
+ const startTime = Date.now();
217
+ // Use setImmediate for first tick to allow event handlers to be registered
218
+ this._timeoutId = setTimeout(async () => {
219
+ await this._tick();
220
+ // Calculate time spent and adjust next tick for drift compensation
221
+ const elapsed = Date.now() - startTime;
222
+ Math.max(this._tickInterval - elapsed, 0);
223
+ this._scheduleTick();
224
+ }, this._tickInterval);
225
+ }
226
+ /**
227
+ * Execute a scheduler tick - check and run due jobs
228
+ */
229
+ async _tick() {
230
+ this.emit("scheduler:tick", new Date());
231
+ // Find jobs that should run
232
+ const dueJobs = this._jobs.filter((job) => {
233
+ if (!job.shouldRun())
234
+ return false;
235
+ // Skip if overlap prevention is enabled and job is running
236
+ if (job.isRunning) {
237
+ this.emit("job:skip", job.name, "Job is already running");
238
+ return false;
239
+ }
240
+ return true;
241
+ });
242
+ if (dueJobs.length === 0)
243
+ return;
244
+ if (this._runInParallel) {
245
+ await this._runJobsInParallel(dueJobs);
246
+ }
247
+ else {
248
+ await this._runJobsSequentially(dueJobs);
249
+ }
250
+ }
251
+ /**
252
+ * Run jobs sequentially
253
+ */
254
+ async _runJobsSequentially(jobs) {
255
+ for (const job of jobs) {
256
+ if (this._isShuttingDown)
257
+ break;
258
+ await this._runJob(job);
259
+ }
260
+ }
261
+ /**
262
+ * Run jobs in parallel with concurrency limit
263
+ */
264
+ async _runJobsInParallel(jobs) {
265
+ // Simple batching for concurrency control
266
+ const batches = [];
267
+ for (let i = 0; i < jobs.length; i += this._maxConcurrency) {
268
+ batches.push(jobs.slice(i, i + this._maxConcurrency));
269
+ }
270
+ for (const batch of batches) {
271
+ if (this._isShuttingDown)
272
+ break;
273
+ await Promise.allSettled(batch.map((job) => this._runJob(job)));
274
+ }
275
+ }
276
+ /**
277
+ * Run a single job and emit events
278
+ */
279
+ async _runJob(job) {
280
+ this.emit("job:start", job.name);
281
+ const result = await job.run();
282
+ if (result.success) {
283
+ this.emit("job:complete", job.name, result);
284
+ }
285
+ else {
286
+ this.emit("job:error", job.name, result.error);
287
+ }
288
+ return result;
289
+ }
290
+ }
291
+ // ─────────────────────────────────────────────────────────────────────────────
292
+ // Default Export
293
+ // ─────────────────────────────────────────────────────────────────────────────
294
+ /**
295
+ * Default scheduler instance for simple use cases
296
+ *
297
+ * @example
298
+ * ```typescript
299
+ * import { scheduler, job } from "@warlock.js/scheduler";
300
+ *
301
+ * scheduler.addJob(job("cleanup", cleanupFn).daily());
302
+ * scheduler.start();
303
+ * ```
304
+ */
305
+ const scheduler = new Scheduler();export{Scheduler,scheduler};//# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sources":["../src/scheduler.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
package/esm/types.d.ts ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Time unit types for scheduling intervals
3
+ */
4
+ export type TimeType = "second" | "minute" | "hour" | "day" | "week" | "month" | "year";
5
+ /**
6
+ * Days of the week (lowercase for consistency)
7
+ */
8
+ export type Day = "sunday" | "monday" | "tuesday" | "wednesday" | "thursday" | "friday" | "saturday";
9
+ /**
10
+ * Job interval configuration
11
+ */
12
+ export type JobIntervals = {
13
+ /** Day of week or day of month */
14
+ day?: Day | number;
15
+ /** Time of day in HH:mm format */
16
+ time?: string;
17
+ /** Recurring interval configuration */
18
+ every?: {
19
+ type?: TimeType;
20
+ value?: number;
21
+ };
22
+ };
23
+ /**
24
+ * Result of a job execution
25
+ */
26
+ export type JobResult = {
27
+ /** Whether the job completed successfully */
28
+ success: boolean;
29
+ /** Execution duration in milliseconds */
30
+ duration: number;
31
+ /** Error if the job failed */
32
+ error?: unknown;
33
+ /** Number of retry attempts made */
34
+ retries?: number;
35
+ };
36
+ /**
37
+ * Job execution status
38
+ */
39
+ export type JobStatus = "idle" | "running" | "completed" | "failed";
40
+ /**
41
+ * Retry configuration for jobs
42
+ */
43
+ export type RetryConfig = {
44
+ /** Maximum number of retry attempts */
45
+ maxRetries: number;
46
+ /** Delay between retries in milliseconds */
47
+ delay: number;
48
+ /** Backoff multiplier for exponential backoff */
49
+ backoffMultiplier?: number;
50
+ };
51
+ /**
52
+ * Scheduler event types for observability
53
+ */
54
+ export type SchedulerEvents = {
55
+ "job:start": [jobName: string];
56
+ "job:complete": [jobName: string, result: JobResult];
57
+ "job:error": [jobName: string, error: unknown];
58
+ "job:skip": [jobName: string, reason: string];
59
+ "scheduler:started": [];
60
+ "scheduler:stopped": [];
61
+ "scheduler:tick": [timestamp: Date];
62
+ };
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAExF;;GAEG;AACH,MAAM,MAAM,GAAG,GACX,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,kCAAkC;IAClC,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC;IACnB,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,mBAAmB,EAAE,EAAE,CAAC;IACxB,mBAAmB,EAAE,EAAE,CAAC;IACxB,gBAAgB,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;CACrC,CAAC"}
package/esm/utils.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Day } from "./types";
2
+ export declare function parseWeekDayNumber(day: Day): number;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE9B,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,UAU1C"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@warlock.js/scheduler",
3
+ "version": "4.0.28",
4
+ "description": "A simple scheduler package to run jobs in scheduled times",
5
+ "main": "./cjs/index.js",
6
+ "dependencies": {
7
+ "dayjs": "^1.11.19"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/warlockjs/scheduler"
12
+ },
13
+ "keywords": [
14
+ "warlock.js",
15
+ "scheduler",
16
+ "job",
17
+ "cron",
18
+ "time",
19
+ "date",
20
+ "interval",
21
+ "timer",
22
+ "delay",
23
+ "timeout"
24
+ ],
25
+ "author": "hassanzohdy",
26
+ "license": "MIT",
27
+ "module": "./esm/index.js",
28
+ "typings": "./cjs/index.d.ts"
29
+ }