@rvoh/psychic-workers 2.8.1 → 2.9.1

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.
@@ -36,13 +36,13 @@ export default class BaseBackgroundedModel extends Dream {
36
36
  * ```ts
37
37
  * await User.background('myMethod', 'abc', 123)
38
38
  * ```
39
- * though calling background must be awaited, the resolution of the promise
40
- * is an indication that the job was put in the queue, not that it has
41
- * completed.
39
+ * Outside automatic test invocation, awaiting `background` confirms that
40
+ * a run is queued or pending, not that the method has completed.
42
41
  *
43
- * NOTE: in test environments, psychic will immediately invoke the underlying
44
- * method, preventing you from needing to explicitly wait for queues to flush
45
- * before making assertions.
42
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
43
+ * the method immediately and awaits its completion.
44
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
45
+ * with `WorkerTestUtils.work()`.
46
46
  *
47
47
  * @param methodName - the name of the static method you wish to run in the background
48
48
  * @param args - a variadic list of arguments to be sent to your method
@@ -71,12 +71,13 @@ export default class BaseBackgroundedModel extends Dream {
71
71
  * ```ts
72
72
  * await User.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
73
73
  * ```
74
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
75
- * is an indication that a run is pending, not that it has completed.
74
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
75
+ * a run is queued or pending, not that the method has completed.
76
76
  *
77
- * NOTE: in test environments, psychic will immediately invoke the underlying
78
- * method, preventing you from needing to explicitly wait for queues to flush
79
- * before making assertions.
77
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
78
+ * the method immediately and awaits its completion, ignoring the delay.
79
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
80
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
80
81
  *
81
82
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
82
83
  *
@@ -110,12 +111,13 @@ export default class BaseBackgroundedModel extends Dream {
110
111
  * ```ts
111
112
  * await User.backgroundWith({ delay: { seconds: 30, jobId: 'my-unique-job-id' }, priority: 'urgent' }, 'myMethod', 'abc', 123)
112
113
  * ```
113
- * though calling backgroundWith must be awaited, the resolution of the promise
114
- * is an indication that a run is pending, not that it has completed.
114
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
115
+ * a run is queued or pending, not that the method has completed.
115
116
  *
116
- * NOTE: in test environments, psychic will immediately invoke the underlying
117
- * method, preventing you from needing to explicitly wait for queues to flush
118
- * before making assertions.
117
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
118
+ * the method immediately and awaits its completion, ignoring the delay.
119
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
120
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
119
121
  *
120
122
  * @param opts - options for backgrounding this job
121
123
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -150,13 +152,13 @@ export default class BaseBackgroundedModel extends Dream {
150
152
  * const user = await User.lastOrFail()
151
153
  * await user.background('myMethod', 'abc', 123)
152
154
  * ```
153
- * though calling background must be awaited, the resolution of the promise
154
- * is an indication that the job was put in the queue, not that it has
155
- * completed.
155
+ * Outside automatic test invocation, awaiting `background` confirms that
156
+ * a run is queued or pending, not that the method has completed.
156
157
  *
157
- * NOTE: in test environments, psychic will immediately invoke the underlying
158
- * method, preventing you from needing to explicitly wait for queues to flush
159
- * before making assertions.
158
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
159
+ * the method immediately and awaits its completion.
160
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
161
+ * with `WorkerTestUtils.work()`.
160
162
  *
161
163
  * @param methodName - the name of the instance method you wish to run in the background
162
164
  * @param args - a variadic list of arguments to be sent to your method
@@ -185,12 +187,13 @@ export default class BaseBackgroundedModel extends Dream {
185
187
  * const user = await User.lastOrFail()
186
188
  * await user.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
187
189
  * ```
188
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
189
- * is an indication that a run is pending, not that it has completed.
190
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
191
+ * a run is queued or pending, not that the method has completed.
190
192
  *
191
- * NOTE: in test environments, psychic will immediately invoke the underlying
192
- * method, preventing you from needing to explicitly wait for queues to flush
193
- * before making assertions.
193
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
194
+ * the method immediately and awaits its completion, ignoring the delay.
195
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
196
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
194
197
  *
195
198
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
196
199
  *
@@ -224,12 +227,13 @@ export default class BaseBackgroundedModel extends Dream {
224
227
  * const user = await User.lastOrFail()
225
228
  * await user.backgroundWith({ delay: { seconds: 30, jobId: 'my-unique-job-id' }, priority: 'urgent' }, 'myMethod', 'abc', 123)
226
229
  * ```
227
- * though calling backgroundWith must be awaited, the resolution of the promise
228
- * is an indication that a run is pending, not that it has completed.
230
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
231
+ * a run is queued or pending, not that the method has completed.
229
232
  *
230
- * NOTE: in test environments, psychic will immediately invoke the underlying
231
- * method, preventing you from needing to explicitly wait for queues to flush
232
- * before making assertions.
233
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
234
+ * the method immediately and awaits its completion, ignoring the delay.
235
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
236
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
233
237
  *
234
238
  * @param opts - options for backgrounding this job
235
239
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -47,13 +47,13 @@ export default class BaseBackgroundedService {
47
47
  * ```ts
48
48
  * await MyBackgroundableClass.background('myMethod', 'abc', 123)
49
49
  * ```
50
- * though calling background must be awaited, the resolution of the promise
51
- * is an indication that the job was put in the queue, not that it has
52
- * completed.
50
+ * Outside automatic test invocation, awaiting `background` confirms that
51
+ * a run is queued or pending, not that the method has completed.
53
52
  *
54
- * NOTE: in test environments, psychic will immediately invoke the underlying
55
- * method, preventing you from needing to explicitly wait for queues to flush
56
- * before making assertions.
53
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
54
+ * the method immediately and awaits its completion.
55
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
56
+ * with `WorkerTestUtils.work()`.
57
57
  *
58
58
  * @param methodName - the name of the static method you wish to run in the background
59
59
  * @param args - a variadic list of arguments to be sent to your method
@@ -82,12 +82,13 @@ export default class BaseBackgroundedService {
82
82
  * ```ts
83
83
  * await MyBackgroundableClass.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
84
84
  * ```
85
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
86
- * is an indication that a run is pending, not that it has completed.
85
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
86
+ * a run is queued or pending, not that the method has completed.
87
87
  *
88
- * NOTE: in test environments, psychic will immediately invoke the underlying
89
- * method, preventing you from needing to explicitly wait for queues to flush
90
- * before making assertions.
88
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
89
+ * the method immediately and awaits its completion, ignoring the delay.
90
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
91
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
91
92
  *
92
93
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
93
94
  *
@@ -126,12 +127,13 @@ export default class BaseBackgroundedService {
126
127
  * 123,
127
128
  * )
128
129
  * ```
129
- * though calling backgroundWith must be awaited, the resolution of the promise
130
- * is an indication that a run is pending, not that it has completed.
130
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
131
+ * a run is queued or pending, not that the method has completed.
131
132
  *
132
- * NOTE: in test environments, psychic will immediately invoke the underlying
133
- * method, preventing you from needing to explicitly wait for queues to flush
134
- * before making assertions.
133
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
134
+ * the method immediately and awaits its completion, ignoring the delay.
135
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
136
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
135
137
  *
136
138
  * @param opts - options for backgrounding this job
137
139
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -46,15 +46,20 @@ export default class BaseScheduledService {
46
46
  * ```ts
47
47
  * await MySchedulableClass.schedule('0 * * * *', 'myHourlyMethod', 'abc', 123)
48
48
  * ```
49
- * though calling background must be awaited, the resolution of the promise
50
- * is an indication that the job was put in the queue, not that it has
51
- * completed.
49
+ * The cron `pattern` is evaluated in UTC, independent of the worker
50
+ * process's time zone. For example, `'0 9 * * *'` runs daily at 09:00 UTC.
52
51
  *
53
- * NOTE: in test environments, psychic will immediately invoke the underlying
54
- * method, preventing you from needing to explicitly wait for queues to flush
55
- * before making assertions.
52
+ * Awaiting `schedule` confirms that the BullMQ job scheduler has been
53
+ * registered or updated in Redis. It does not invoke the method inline or
54
+ * wait for any scheduled run to complete. Independent queue workers may
55
+ * still execute scheduled runs asynchronously.
56
56
  *
57
- * @param pattern - A cron string representing the time interval you wish this to run on
57
+ * In tests, this registration behavior is the same under both
58
+ * `testInvocation: 'automatic'` and `testInvocation: 'manual'`. To exercise
59
+ * the scheduled job, call `WorkerTestUtils.workScheduled()`, or invoke the
60
+ * method directly to test its body.
61
+ *
62
+ * @param pattern - A cron string evaluated in UTC, representing the time interval you wish this to run on
58
63
  * @param methodName - the name of the static method you wish to run in the background
59
64
  * @param args - a variadic list of arguments to be sent to your method
60
65
  */
@@ -723,7 +723,7 @@ export class Background {
723
723
  * to be scheduled to run at a specified cron pattern
724
724
  *
725
725
  * @param ObjectClass - the class you wish to background
726
- * @param pattern - the cron string you wish to use to govern the scheduling for this job
726
+ * @param pattern - the cron string, evaluated in UTC, governing the scheduling for this job
727
727
  * @param method - the method you wish to background
728
728
  * @param globalName - the globalName of the class you are processing
729
729
  * @param args - (optional) a list of arguments to provide to your method when it is called
@@ -736,7 +736,7 @@ export class Background {
736
736
  const queueInstance = this.queueInstance(jobConfig);
737
737
  if (!queueInstance)
738
738
  throw new Error(`Missing queue for: ${jobConfig.queue?.toString()}`);
739
- await queueInstance.upsertJobScheduler(schedulerId, { pattern }, {
739
+ await queueInstance.upsertJobScheduler(schedulerId, { pattern, tz: 'UTC' }, {
740
740
  name: 'BackgroundJobQueueStaticJob',
741
741
  // the priority from the service's `backgroundJobConfig`, written where open-source
742
742
  // BullMQ reads it. Without it BullMQ enqueues every cron run at no priority at all,
@@ -43,12 +43,18 @@ export default class PsychicAppWorkers {
43
43
  /**
44
44
  * Returns the testInvocation option provided by the user
45
45
  *
46
- * when "automatic", any backgrounded job will be immediately
47
- * invoked during tests. This is the default behavior
46
+ * With "automatic" (the default), one-off backgrounded jobs invoke their
47
+ * methods immediately during tests, ignoring delays. The backgrounding call
48
+ * awaits the method's completion.
48
49
  *
49
- * when "manual", this will enable the dev to manually interact with
50
- * queues, enabling them to target jobs and run them at specific
51
- * code points.
50
+ * With "manual", one-off jobs are queued for explicit processing with
51
+ * `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` for delayed
52
+ * jobs, so tests can choose when to invoke them.
53
+ *
54
+ * Under either mode, `schedule()` registers or updates a scheduler in Redis
55
+ * without invoking the scheduled method inline. Use
56
+ * `WorkerTestUtils.workScheduled()` to exercise its dispatch, or invoke the
57
+ * method directly to test its body.
52
58
  */
53
59
  get testInvocation() {
54
60
  return this._testInvocation;
@@ -36,13 +36,13 @@ export default class BaseBackgroundedModel extends Dream {
36
36
  * ```ts
37
37
  * await User.background('myMethod', 'abc', 123)
38
38
  * ```
39
- * though calling background must be awaited, the resolution of the promise
40
- * is an indication that the job was put in the queue, not that it has
41
- * completed.
39
+ * Outside automatic test invocation, awaiting `background` confirms that
40
+ * a run is queued or pending, not that the method has completed.
42
41
  *
43
- * NOTE: in test environments, psychic will immediately invoke the underlying
44
- * method, preventing you from needing to explicitly wait for queues to flush
45
- * before making assertions.
42
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
43
+ * the method immediately and awaits its completion.
44
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
45
+ * with `WorkerTestUtils.work()`.
46
46
  *
47
47
  * @param methodName - the name of the static method you wish to run in the background
48
48
  * @param args - a variadic list of arguments to be sent to your method
@@ -71,12 +71,13 @@ export default class BaseBackgroundedModel extends Dream {
71
71
  * ```ts
72
72
  * await User.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
73
73
  * ```
74
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
75
- * is an indication that a run is pending, not that it has completed.
74
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
75
+ * a run is queued or pending, not that the method has completed.
76
76
  *
77
- * NOTE: in test environments, psychic will immediately invoke the underlying
78
- * method, preventing you from needing to explicitly wait for queues to flush
79
- * before making assertions.
77
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
78
+ * the method immediately and awaits its completion, ignoring the delay.
79
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
80
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
80
81
  *
81
82
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
82
83
  *
@@ -110,12 +111,13 @@ export default class BaseBackgroundedModel extends Dream {
110
111
  * ```ts
111
112
  * await User.backgroundWith({ delay: { seconds: 30, jobId: 'my-unique-job-id' }, priority: 'urgent' }, 'myMethod', 'abc', 123)
112
113
  * ```
113
- * though calling backgroundWith must be awaited, the resolution of the promise
114
- * is an indication that a run is pending, not that it has completed.
114
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
115
+ * a run is queued or pending, not that the method has completed.
115
116
  *
116
- * NOTE: in test environments, psychic will immediately invoke the underlying
117
- * method, preventing you from needing to explicitly wait for queues to flush
118
- * before making assertions.
117
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
118
+ * the method immediately and awaits its completion, ignoring the delay.
119
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
120
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
119
121
  *
120
122
  * @param opts - options for backgrounding this job
121
123
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -150,13 +152,13 @@ export default class BaseBackgroundedModel extends Dream {
150
152
  * const user = await User.lastOrFail()
151
153
  * await user.background('myMethod', 'abc', 123)
152
154
  * ```
153
- * though calling background must be awaited, the resolution of the promise
154
- * is an indication that the job was put in the queue, not that it has
155
- * completed.
155
+ * Outside automatic test invocation, awaiting `background` confirms that
156
+ * a run is queued or pending, not that the method has completed.
156
157
  *
157
- * NOTE: in test environments, psychic will immediately invoke the underlying
158
- * method, preventing you from needing to explicitly wait for queues to flush
159
- * before making assertions.
158
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
159
+ * the method immediately and awaits its completion.
160
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
161
+ * with `WorkerTestUtils.work()`.
160
162
  *
161
163
  * @param methodName - the name of the instance method you wish to run in the background
162
164
  * @param args - a variadic list of arguments to be sent to your method
@@ -185,12 +187,13 @@ export default class BaseBackgroundedModel extends Dream {
185
187
  * const user = await User.lastOrFail()
186
188
  * await user.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
187
189
  * ```
188
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
189
- * is an indication that a run is pending, not that it has completed.
190
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
191
+ * a run is queued or pending, not that the method has completed.
190
192
  *
191
- * NOTE: in test environments, psychic will immediately invoke the underlying
192
- * method, preventing you from needing to explicitly wait for queues to flush
193
- * before making assertions.
193
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
194
+ * the method immediately and awaits its completion, ignoring the delay.
195
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
196
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
194
197
  *
195
198
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
196
199
  *
@@ -224,12 +227,13 @@ export default class BaseBackgroundedModel extends Dream {
224
227
  * const user = await User.lastOrFail()
225
228
  * await user.backgroundWith({ delay: { seconds: 30, jobId: 'my-unique-job-id' }, priority: 'urgent' }, 'myMethod', 'abc', 123)
226
229
  * ```
227
- * though calling backgroundWith must be awaited, the resolution of the promise
228
- * is an indication that a run is pending, not that it has completed.
230
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
231
+ * a run is queued or pending, not that the method has completed.
229
232
  *
230
- * NOTE: in test environments, psychic will immediately invoke the underlying
231
- * method, preventing you from needing to explicitly wait for queues to flush
232
- * before making assertions.
233
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
234
+ * the method immediately and awaits its completion, ignoring the delay.
235
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
236
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
233
237
  *
234
238
  * @param opts - options for backgrounding this job
235
239
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -47,13 +47,13 @@ export default class BaseBackgroundedService {
47
47
  * ```ts
48
48
  * await MyBackgroundableClass.background('myMethod', 'abc', 123)
49
49
  * ```
50
- * though calling background must be awaited, the resolution of the promise
51
- * is an indication that the job was put in the queue, not that it has
52
- * completed.
50
+ * Outside automatic test invocation, awaiting `background` confirms that
51
+ * a run is queued or pending, not that the method has completed.
53
52
  *
54
- * NOTE: in test environments, psychic will immediately invoke the underlying
55
- * method, preventing you from needing to explicitly wait for queues to flush
56
- * before making assertions.
53
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
54
+ * the method immediately and awaits its completion.
55
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
56
+ * with `WorkerTestUtils.work()`.
57
57
  *
58
58
  * @param methodName - the name of the static method you wish to run in the background
59
59
  * @param args - a variadic list of arguments to be sent to your method
@@ -82,12 +82,13 @@ export default class BaseBackgroundedService {
82
82
  * ```ts
83
83
  * await MyBackgroundableClass.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
84
84
  * ```
85
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
86
- * is an indication that a run is pending, not that it has completed.
85
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
86
+ * a run is queued or pending, not that the method has completed.
87
87
  *
88
- * NOTE: in test environments, psychic will immediately invoke the underlying
89
- * method, preventing you from needing to explicitly wait for queues to flush
90
- * before making assertions.
88
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
89
+ * the method immediately and awaits its completion, ignoring the delay.
90
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
91
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
91
92
  *
92
93
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
93
94
  *
@@ -126,12 +127,13 @@ export default class BaseBackgroundedService {
126
127
  * 123,
127
128
  * )
128
129
  * ```
129
- * though calling backgroundWith must be awaited, the resolution of the promise
130
- * is an indication that a run is pending, not that it has completed.
130
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
131
+ * a run is queued or pending, not that the method has completed.
131
132
  *
132
- * NOTE: in test environments, psychic will immediately invoke the underlying
133
- * method, preventing you from needing to explicitly wait for queues to flush
134
- * before making assertions.
133
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
134
+ * the method immediately and awaits its completion, ignoring the delay.
135
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
136
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
135
137
  *
136
138
  * @param opts - options for backgrounding this job
137
139
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -46,15 +46,20 @@ export default class BaseScheduledService {
46
46
  * ```ts
47
47
  * await MySchedulableClass.schedule('0 * * * *', 'myHourlyMethod', 'abc', 123)
48
48
  * ```
49
- * though calling background must be awaited, the resolution of the promise
50
- * is an indication that the job was put in the queue, not that it has
51
- * completed.
49
+ * The cron `pattern` is evaluated in UTC, independent of the worker
50
+ * process's time zone. For example, `'0 9 * * *'` runs daily at 09:00 UTC.
52
51
  *
53
- * NOTE: in test environments, psychic will immediately invoke the underlying
54
- * method, preventing you from needing to explicitly wait for queues to flush
55
- * before making assertions.
52
+ * Awaiting `schedule` confirms that the BullMQ job scheduler has been
53
+ * registered or updated in Redis. It does not invoke the method inline or
54
+ * wait for any scheduled run to complete. Independent queue workers may
55
+ * still execute scheduled runs asynchronously.
56
56
  *
57
- * @param pattern - A cron string representing the time interval you wish this to run on
57
+ * In tests, this registration behavior is the same under both
58
+ * `testInvocation: 'automatic'` and `testInvocation: 'manual'`. To exercise
59
+ * the scheduled job, call `WorkerTestUtils.workScheduled()`, or invoke the
60
+ * method directly to test its body.
61
+ *
62
+ * @param pattern - A cron string evaluated in UTC, representing the time interval you wish this to run on
58
63
  * @param methodName - the name of the static method you wish to run in the background
59
64
  * @param args - a variadic list of arguments to be sent to your method
60
65
  */
@@ -723,7 +723,7 @@ export class Background {
723
723
  * to be scheduled to run at a specified cron pattern
724
724
  *
725
725
  * @param ObjectClass - the class you wish to background
726
- * @param pattern - the cron string you wish to use to govern the scheduling for this job
726
+ * @param pattern - the cron string, evaluated in UTC, governing the scheduling for this job
727
727
  * @param method - the method you wish to background
728
728
  * @param globalName - the globalName of the class you are processing
729
729
  * @param args - (optional) a list of arguments to provide to your method when it is called
@@ -736,7 +736,7 @@ export class Background {
736
736
  const queueInstance = this.queueInstance(jobConfig);
737
737
  if (!queueInstance)
738
738
  throw new Error(`Missing queue for: ${jobConfig.queue?.toString()}`);
739
- await queueInstance.upsertJobScheduler(schedulerId, { pattern }, {
739
+ await queueInstance.upsertJobScheduler(schedulerId, { pattern, tz: 'UTC' }, {
740
740
  name: 'BackgroundJobQueueStaticJob',
741
741
  // the priority from the service's `backgroundJobConfig`, written where open-source
742
742
  // BullMQ reads it. Without it BullMQ enqueues every cron run at no priority at all,
@@ -43,12 +43,18 @@ export default class PsychicAppWorkers {
43
43
  /**
44
44
  * Returns the testInvocation option provided by the user
45
45
  *
46
- * when "automatic", any backgrounded job will be immediately
47
- * invoked during tests. This is the default behavior
46
+ * With "automatic" (the default), one-off backgrounded jobs invoke their
47
+ * methods immediately during tests, ignoring delays. The backgrounding call
48
+ * awaits the method's completion.
48
49
  *
49
- * when "manual", this will enable the dev to manually interact with
50
- * queues, enabling them to target jobs and run them at specific
51
- * code points.
50
+ * With "manual", one-off jobs are queued for explicit processing with
51
+ * `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` for delayed
52
+ * jobs, so tests can choose when to invoke them.
53
+ *
54
+ * Under either mode, `schedule()` registers or updates a scheduler in Redis
55
+ * without invoking the scheduled method inline. Use
56
+ * `WorkerTestUtils.workScheduled()` to exercise its dispatch, or invoke the
57
+ * method directly to test its body.
52
58
  */
53
59
  get testInvocation() {
54
60
  return this._testInvocation;
@@ -31,13 +31,13 @@ export default class BaseBackgroundedModel extends Dream {
31
31
  * ```ts
32
32
  * await User.background('myMethod', 'abc', 123)
33
33
  * ```
34
- * though calling background must be awaited, the resolution of the promise
35
- * is an indication that the job was put in the queue, not that it has
36
- * completed.
34
+ * Outside automatic test invocation, awaiting `background` confirms that
35
+ * a run is queued or pending, not that the method has completed.
37
36
  *
38
- * NOTE: in test environments, psychic will immediately invoke the underlying
39
- * method, preventing you from needing to explicitly wait for queues to flush
40
- * before making assertions.
37
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
38
+ * the method immediately and awaits its completion.
39
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
40
+ * with `WorkerTestUtils.work()`.
41
41
  *
42
42
  * @param methodName - the name of the static method you wish to run in the background
43
43
  * @param args - a variadic list of arguments to be sent to your method
@@ -59,12 +59,13 @@ export default class BaseBackgroundedModel extends Dream {
59
59
  * ```ts
60
60
  * await User.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
61
61
  * ```
62
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
63
- * is an indication that a run is pending, not that it has completed.
62
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
63
+ * a run is queued or pending, not that the method has completed.
64
64
  *
65
- * NOTE: in test environments, psychic will immediately invoke the underlying
66
- * method, preventing you from needing to explicitly wait for queues to flush
67
- * before making assertions.
65
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
66
+ * the method immediately and awaits its completion, ignoring the delay.
67
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
68
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
68
69
  *
69
70
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
70
71
  *
@@ -89,12 +90,13 @@ export default class BaseBackgroundedModel extends Dream {
89
90
  * ```ts
90
91
  * await User.backgroundWith({ delay: { seconds: 30, jobId: 'my-unique-job-id' }, priority: 'urgent' }, 'myMethod', 'abc', 123)
91
92
  * ```
92
- * though calling backgroundWith must be awaited, the resolution of the promise
93
- * is an indication that a run is pending, not that it has completed.
93
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
94
+ * a run is queued or pending, not that the method has completed.
94
95
  *
95
- * NOTE: in test environments, psychic will immediately invoke the underlying
96
- * method, preventing you from needing to explicitly wait for queues to flush
97
- * before making assertions.
96
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
97
+ * the method immediately and awaits its completion, ignoring the delay.
98
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
99
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
98
100
  *
99
101
  * @param opts - options for backgrounding this job
100
102
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -118,13 +120,13 @@ export default class BaseBackgroundedModel extends Dream {
118
120
  * const user = await User.lastOrFail()
119
121
  * await user.background('myMethod', 'abc', 123)
120
122
  * ```
121
- * though calling background must be awaited, the resolution of the promise
122
- * is an indication that the job was put in the queue, not that it has
123
- * completed.
123
+ * Outside automatic test invocation, awaiting `background` confirms that
124
+ * a run is queued or pending, not that the method has completed.
124
125
  *
125
- * NOTE: in test environments, psychic will immediately invoke the underlying
126
- * method, preventing you from needing to explicitly wait for queues to flush
127
- * before making assertions.
126
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
127
+ * the method immediately and awaits its completion.
128
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
129
+ * with `WorkerTestUtils.work()`.
128
130
  *
129
131
  * @param methodName - the name of the instance method you wish to run in the background
130
132
  * @param args - a variadic list of arguments to be sent to your method
@@ -147,12 +149,13 @@ export default class BaseBackgroundedModel extends Dream {
147
149
  * const user = await User.lastOrFail()
148
150
  * await user.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
149
151
  * ```
150
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
151
- * is an indication that a run is pending, not that it has completed.
152
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
153
+ * a run is queued or pending, not that the method has completed.
152
154
  *
153
- * NOTE: in test environments, psychic will immediately invoke the underlying
154
- * method, preventing you from needing to explicitly wait for queues to flush
155
- * before making assertions.
155
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
156
+ * the method immediately and awaits its completion, ignoring the delay.
157
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
158
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
156
159
  *
157
160
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
158
161
  *
@@ -178,12 +181,13 @@ export default class BaseBackgroundedModel extends Dream {
178
181
  * const user = await User.lastOrFail()
179
182
  * await user.backgroundWith({ delay: { seconds: 30, jobId: 'my-unique-job-id' }, priority: 'urgent' }, 'myMethod', 'abc', 123)
180
183
  * ```
181
- * though calling backgroundWith must be awaited, the resolution of the promise
182
- * is an indication that a run is pending, not that it has completed.
184
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
185
+ * a run is queued or pending, not that the method has completed.
183
186
  *
184
- * NOTE: in test environments, psychic will immediately invoke the underlying
185
- * method, preventing you from needing to explicitly wait for queues to flush
186
- * before making assertions.
187
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
188
+ * the method immediately and awaits its completion, ignoring the delay.
189
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
190
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
187
191
  *
188
192
  * @param opts - options for backgrounding this job
189
193
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -39,13 +39,13 @@ export default class BaseBackgroundedService {
39
39
  * ```ts
40
40
  * await MyBackgroundableClass.background('myMethod', 'abc', 123)
41
41
  * ```
42
- * though calling background must be awaited, the resolution of the promise
43
- * is an indication that the job was put in the queue, not that it has
44
- * completed.
42
+ * Outside automatic test invocation, awaiting `background` confirms that
43
+ * a run is queued or pending, not that the method has completed.
45
44
  *
46
- * NOTE: in test environments, psychic will immediately invoke the underlying
47
- * method, preventing you from needing to explicitly wait for queues to flush
48
- * before making assertions.
45
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
46
+ * the method immediately and awaits its completion.
47
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
48
+ * with `WorkerTestUtils.work()`.
49
49
  *
50
50
  * @param methodName - the name of the static method you wish to run in the background
51
51
  * @param args - a variadic list of arguments to be sent to your method
@@ -67,12 +67,13 @@ export default class BaseBackgroundedService {
67
67
  * ```ts
68
68
  * await MyBackgroundableClass.backgroundWithDelay({ minutes: 5 }, 'myMethod', 'abc', 123)
69
69
  * ```
70
- * though calling backgroundWithDelay must be awaited, the resolution of the promise
71
- * is an indication that a run is pending, not that it has completed.
70
+ * Outside automatic test invocation, awaiting `backgroundWithDelay` confirms that
71
+ * a run is queued or pending, not that the method has completed.
72
72
  *
73
- * NOTE: in test environments, psychic will immediately invoke the underlying
74
- * method, preventing you from needing to explicitly wait for queues to flush
75
- * before making assertions.
73
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
74
+ * the method immediately and awaits its completion, ignoring the delay.
75
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
76
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
76
77
  *
77
78
  * @deprecated use `backgroundWith({ delay }, methodName, ...args)` instead. This method will be removed in a future major version.
78
79
  *
@@ -102,12 +103,13 @@ export default class BaseBackgroundedService {
102
103
  * 123,
103
104
  * )
104
105
  * ```
105
- * though calling backgroundWith must be awaited, the resolution of the promise
106
- * is an indication that a run is pending, not that it has completed.
106
+ * Outside automatic test invocation, awaiting `backgroundWith` confirms that
107
+ * a run is queued or pending, not that the method has completed.
107
108
  *
108
- * NOTE: in test environments, psychic will immediately invoke the underlying
109
- * method, preventing you from needing to explicitly wait for queues to flush
110
- * before making assertions.
109
+ * In tests with `testInvocation: 'automatic'` (the default), Psychic invokes
110
+ * the method immediately and awaits its completion, ignoring the delay.
111
+ * With `testInvocation: 'manual'`, the job is queued for explicit processing
112
+ * with `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` when delayed.
111
113
  *
112
114
  * @param opts - options for backgrounding this job
113
115
  * @param opts.delay - (optional) how long you want to hold off before allowing the job to run, given as at least one of `seconds`, `minutes`, `hours` or `days`, plus an optional `jobId` (a deduplication key) which debounces repeated calls into a single run
@@ -38,15 +38,20 @@ export default class BaseScheduledService {
38
38
  * ```ts
39
39
  * await MySchedulableClass.schedule('0 * * * *', 'myHourlyMethod', 'abc', 123)
40
40
  * ```
41
- * though calling background must be awaited, the resolution of the promise
42
- * is an indication that the job was put in the queue, not that it has
43
- * completed.
41
+ * The cron `pattern` is evaluated in UTC, independent of the worker
42
+ * process's time zone. For example, `'0 9 * * *'` runs daily at 09:00 UTC.
44
43
  *
45
- * NOTE: in test environments, psychic will immediately invoke the underlying
46
- * method, preventing you from needing to explicitly wait for queues to flush
47
- * before making assertions.
44
+ * Awaiting `schedule` confirms that the BullMQ job scheduler has been
45
+ * registered or updated in Redis. It does not invoke the method inline or
46
+ * wait for any scheduled run to complete. Independent queue workers may
47
+ * still execute scheduled runs asynchronously.
48
48
  *
49
- * @param pattern - A cron string representing the time interval you wish this to run on
49
+ * In tests, this registration behavior is the same under both
50
+ * `testInvocation: 'automatic'` and `testInvocation: 'manual'`. To exercise
51
+ * the scheduled job, call `WorkerTestUtils.workScheduled()`, or invoke the
52
+ * method directly to test its body.
53
+ *
54
+ * @param pattern - A cron string evaluated in UTC, representing the time interval you wish this to run on
50
55
  * @param methodName - the name of the static method you wish to run in the background
51
56
  * @param args - a variadic list of arguments to be sent to your method
52
57
  */
@@ -273,7 +273,7 @@ export declare class Background {
273
273
  * to be scheduled to run at a specified cron pattern
274
274
  *
275
275
  * @param ObjectClass - the class you wish to background
276
- * @param pattern - the cron string you wish to use to govern the scheduling for this job
276
+ * @param pattern - the cron string, evaluated in UTC, governing the scheduling for this job
277
277
  * @param method - the method you wish to background
278
278
  * @param globalName - the globalName of the class you are processing
279
279
  * @param args - (optional) a list of arguments to provide to your method when it is called
@@ -2,6 +2,5 @@ import { Env } from '@rvoh/dream';
2
2
  declare const EnvInternal: Env<{
3
3
  string: "NODE_ENV" | "PSYCHIC_CORE_DEVELOPMENT";
4
4
  integer: "VITEST_POOL_ID";
5
- boolean: "REALLY_TEST_BACKGROUND_QUEUE";
6
- }, "NODE_ENV" | "PSYCHIC_CORE_DEVELOPMENT", "VITEST_POOL_ID", "REALLY_TEST_BACKGROUND_QUEUE">;
5
+ }, "NODE_ENV" | "PSYCHIC_CORE_DEVELOPMENT", "VITEST_POOL_ID", never>;
7
6
  export default EnvInternal;
@@ -21,12 +21,18 @@ export default class PsychicAppWorkers {
21
21
  /**
22
22
  * Returns the testInvocation option provided by the user
23
23
  *
24
- * when "automatic", any backgrounded job will be immediately
25
- * invoked during tests. This is the default behavior
24
+ * With "automatic" (the default), one-off backgrounded jobs invoke their
25
+ * methods immediately during tests, ignoring delays. The backgrounding call
26
+ * awaits the method's completion.
26
27
  *
27
- * when "manual", this will enable the dev to manually interact with
28
- * queues, enabling them to target jobs and run them at specific
29
- * code points.
28
+ * With "manual", one-off jobs are queued for explicit processing with
29
+ * `WorkerTestUtils.work()`, or `WorkerTestUtils.workScheduled()` for delayed
30
+ * jobs, so tests can choose when to invoke them.
31
+ *
32
+ * Under either mode, `schedule()` registers or updates a scheduler in Redis
33
+ * without invoking the scheduled method inline. Use
34
+ * `WorkerTestUtils.workScheduled()` to exercise its dispatch, or invoke the
35
+ * method directly to test its body.
30
36
  */
31
37
  get testInvocation(): PsychicWorkersAppTestInvocationType;
32
38
  private _testInvocation;
@@ -53,7 +59,17 @@ export type PsychicWorkersHookEventType = 'workers:shutdown';
53
59
  export interface PsychicWorkersAppHooks {
54
60
  workerShutdown: (() => void | Promise<void>)[];
55
61
  }
56
- export interface BullMQNativeWorkerOptions extends WorkerOptions {
62
+ /**
63
+ * Native worker options omit `connection`: Psychic supplies the resolved
64
+ * queue-side worker connection when constructing each worker. A `connection`
65
+ * previously supplied here was ignored; deleting it preserves runtime behavior.
66
+ *
67
+ * To deliberately configure a worker's Redis/Cluster instance, use
68
+ * `nativeBullMQ.defaultQueueOptions.workerConnection`,
69
+ * `nativeBullMQ.namedQueueOptions[name].workerConnection`, or the app-wide
70
+ * `defaultWorkerConnection`. See {@link QueueOptionsWithConnectionInstance}.
71
+ */
72
+ export interface BullMQNativeWorkerOptions extends Omit<WorkerOptions, 'connection'> {
57
73
  group?: {
58
74
  id?: string;
59
75
  maxSize?: number;
@@ -91,6 +107,12 @@ export interface PsychicBackgroundNativeBullMQOptions extends PsychicBackgroundS
91
107
  * queue and worker connections.
92
108
  */
93
109
  defaultQueueConnection?: RedisOrRedisClusterConnection | undefined;
110
+ /**
111
+ * App-wide worker Redis/Cluster instance, used when
112
+ * `nativeBullMQ.defaultQueueOptions.workerConnection` is omitted. Named queues
113
+ * inherit that resolved default unless their own queue options provide a
114
+ * `workerConnection`. Worker-entry `connection` options are never used.
115
+ */
94
116
  defaultWorkerConnection?: RedisOrRedisClusterConnection | undefined;
95
117
  nativeBullMQ: {
96
118
  defaultQueueOptions?: QueueOptionsWithConnectionInstance;
@@ -141,6 +163,17 @@ export type QueueOptionsWithConnectionInstance = Omit<QueueOptions, 'connection'
141
163
  * queue and worker connections.
142
164
  */
143
165
  queueConnection?: RedisOrRedisClusterConnection | undefined;
166
+ /**
167
+ * Worker Redis/Cluster instance for this queue, not a plain BullMQ connection
168
+ * options object. In native mode a named queue's value takes precedence over
169
+ * `nativeBullMQ.defaultQueueOptions.workerConnection`, which takes precedence
170
+ * over the app-wide `defaultWorkerConnection`.
171
+ *
172
+ * This deliberately configures topology; do not move a formerly ignored
173
+ * worker-entry `connection` here just to migrate its literal. Delete that
174
+ * property to preserve behavior. Omit worker connections on producer-only
175
+ * processes; activating workers still requires a resolved instance.
176
+ */
144
177
  workerConnection?: RedisOrRedisClusterConnection | undefined;
145
178
  };
146
179
  export interface PsychicBackgroundSimpleOptions extends PsychicBackgroundSharedOptions {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "type": "module",
3
3
  "name": "@rvoh/psychic-workers",
4
4
  "description": "Background job system for Psychic applications",
5
- "version": "2.8.1",
5
+ "version": "2.9.1",
6
6
  "author": "RVO Health",
7
7
  "publishConfig": {
8
8
  "access": "public"
@@ -68,40 +68,41 @@
68
68
  "@koa/cors": "^5.0.0",
69
69
  "@koa/etag": "^5.0.2",
70
70
  "@koa/router": "^15.7.0",
71
- "@rvoh/dream": "^2.33.0",
72
- "@rvoh/dream-spec-helpers": "^2.3.0",
73
- "@rvoh/psychic": "^3.15.2",
74
- "@rvoh/psychic-spec-helpers": "^3.4.0",
71
+ "@rvoh/dream": "^2.41.0",
72
+ "@rvoh/dream-spec-helpers": "^2.4.0",
73
+ "@rvoh/psychic": "^3.18.1",
74
+ "@rvoh/psychic-spec-helpers": "^3.4.2",
75
75
  "@types/koa": "^3.0.3",
76
76
  "@types/koa-bodyparser": "^4.3.13",
77
77
  "@types/koa-conditional-get": "^2.0.4",
78
78
  "@types/koa-etag": "^3.0.4",
79
79
  "@types/koa__cors": "^5.0.1",
80
80
  "@types/koa__router": "^12.0.5",
81
- "@types/node": "^26.6.3",
82
- "@types/pg": "^8",
81
+ "@types/node": "^26.6.5",
82
+ "@types/pg": "^8.23.1",
83
83
  "@types/supertest": "^7.2.1",
84
- "@typescript-eslint/parser": "^8.70.1",
85
- "bullmq": "^5.64.0",
86
- "eslint": "^10.11.0",
87
- "ioredis": "^5.8.2",
84
+ "@typescript-eslint/parser": "^8.72.0",
85
+ "bullmq": "^5.81.5",
86
+ "eslint": "^10.13.0",
87
+ "ioredis": "^5.11.1",
88
88
  "koa": "^3.2.1",
89
89
  "koa-bodyparser": "^4.4.1",
90
90
  "koa-conditional-get": "^3.0.0",
91
- "kysely": "^0.29.6",
91
+ "kysely": "^0.29.7",
92
92
  "kysely-codegen": "~0.20.0",
93
93
  "luxon-jest-matchers": "^0.1.14",
94
94
  "openapi-typescript": "^7.13.0",
95
- "pg": "^8.23.0",
96
- "prettier": "^3.9.9",
97
- "supertest": "^7.3.0",
98
- "tslib": "^2.7.0",
95
+ "pg": "^8.23.1",
96
+ "prettier": "^3.9.10",
97
+ "puppeteer": "^25.16.0",
98
+ "supertest": "^7.3.1",
99
+ "tslib": "^2.8.1",
99
100
  "tsx": "^4.23.15",
100
101
  "typedoc": "^0.28.20",
101
102
  "typescript": "^5.9.3",
102
- "typescript-eslint": "^8.70.1",
103
- "vite": "^8.3.1",
104
- "vitest": "^5.0.2"
103
+ "typescript-eslint": "^8.72.0",
104
+ "vite": "^8.3.5",
105
+ "vitest": "^5.0.5"
105
106
  },
106
107
  "packageManager": "pnpm@12.14.0+sha512.c18ba6d87993d3d164cb5e8948f32b2c06ee854487e06cd8d86781342fb3e5bb4634367034711e86802baa9c37bea906ce1929ad08d70884c97d801df13389a6",
107
108
  "dependencies": {