@pg-boss/dashboard 1.1.1 → 1.1.2

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.
Files changed (36) hide show
  1. package/build/client/assets/MenuTrigger-CoRd-BqL.js +1 -0
  2. package/build/client/assets/{_index-9fLquIe1.js → _index-BTx7NRR8.js} +1 -1
  3. package/build/client/assets/{badge-B5ZugmiV.js → badge-DBD4CzAv.js} +1 -1
  4. package/build/client/assets/{button-Djse56Dx.js → button-Ba8FWhqs.js} +1 -1
  5. package/build/client/assets/{chevron-down-B4tDL9Ah.js → chevron-down-CYa4FYmp.js} +1 -1
  6. package/build/client/assets/chunk-UVKPFVEO-YfSfkVr_.js +26 -0
  7. package/build/client/assets/{createLucideIcon-B0YqJFaz.js → createLucideIcon-Bt-yXILq.js} +1 -1
  8. package/build/client/assets/db-link-CU7IJqbq.js +1 -0
  9. package/build/client/assets/dialog-Dkx42Rkd.js +1 -0
  10. package/build/client/assets/{entry.client-Szv-xmaE.js → entry.client-DXZUROTm.js} +4 -4
  11. package/build/client/assets/{error-card-CXoOCvsg.js → error-card-D-uZRy_l.js} +1 -1
  12. package/build/client/assets/{filter-select-DXyBBVm8.js → filter-select-Tk_CBvrn.js} +1 -1
  13. package/build/client/assets/{index-x2yWco1W.js → index-DuhoQwUK.js} +1 -1
  14. package/build/client/assets/{jobs-CM6xcK-O.js → jobs-ouYjIGAi.js} +1 -1
  15. package/build/client/assets/manifest-72f6b3e9.js +1 -0
  16. package/build/client/assets/{pagination-C4yyCmBA.js → pagination-BItl293Q.js} +1 -1
  17. package/build/client/assets/{queues._index-Dn3ieC5d.js → queues._index-_ID9kaow.js} +1 -1
  18. package/build/client/assets/{queues._name-GrviLLx2.js → queues._name-DwdbQND-.js} +1 -1
  19. package/build/client/assets/{queues._name.jobs._jobId-s_wYs79w.js → queues._name.jobs._jobId-DrgG3VBb.js} +1 -1
  20. package/build/client/assets/{queues.create-Ch3Mqw52.js → queues.create-CmVW5UVm.js} +1 -1
  21. package/build/client/assets/{root-D0qqtdF7.js → root-DDqOT0vL.js} +1 -1
  22. package/build/client/assets/{schedules-DwnuuhxF.js → schedules-B6ixYsvz.js} +1 -1
  23. package/build/client/assets/{schedules._name._key-DJn-u3Cm.js → schedules._name._key-CXTVKoOc.js} +1 -1
  24. package/build/client/assets/{schedules.new-CQuE2Uhz.js → schedules.new-Dmasri9v.js} +1 -1
  25. package/build/client/assets/{send-DVfuC6NR.js → send-CqR34Z50.js} +1 -1
  26. package/build/client/assets/{table-CtSLyG7m.js → table-Au2E5mnP.js} +1 -1
  27. package/build/client/assets/useOpenInteractionType-mgYMZAa8.js +12 -0
  28. package/build/client/assets/{warnings-DqRQYomb.js → warnings-Dj3qacgN.js} +1 -1
  29. package/build/server/assets/server-build.js +115 -43
  30. package/package.json +14 -14
  31. package/build/client/assets/MenuTrigger-CEHCnGow.js +0 -1
  32. package/build/client/assets/chunk-LFPYN7LY-Cj1DJmJR.js +0 -26
  33. package/build/client/assets/db-link-DmvfwdX4.js +0 -1
  34. package/build/client/assets/dialog-CQzw3QVH.js +0 -1
  35. package/build/client/assets/manifest-acaa4b8e.js +0 -1
  36. package/build/client/assets/useOpenInteractionType-Ss_6xZdw.js +0 -12
@@ -1999,10 +1999,12 @@ function insertVersion(schema, version) {
1999
1999
  return `INSERT INTO ${schema}.version(version) VALUES ('${version}')`;
2000
2000
  }
2001
2001
  function buildFetchParams(options) {
2002
- const { ignoreSingletons, ignoreGroups, groupConcurrency } = options;
2002
+ const { ignoreSingletons, ignoreGroups, groupConcurrency, minPriority, maxPriority } = options;
2003
2003
  const hasIgnoreSingletons = ignoreSingletons != null && ignoreSingletons.length > 0;
2004
2004
  const hasIgnoreGroups = ignoreGroups != null && ignoreGroups.length > 0;
2005
2005
  const hasGroupConcurrency = groupConcurrency != null;
2006
+ const hasMinPriority = minPriority != null;
2007
+ const hasMaxPriority = maxPriority != null;
2006
2008
  const groupConcurrencyConfig = hasGroupConcurrency ? typeof groupConcurrency === "number" ? { default: groupConcurrency } : groupConcurrency : null;
2007
2009
  const hasTiers = groupConcurrencyConfig?.tiers && Object.keys(groupConcurrencyConfig.tiers).length > 0;
2008
2010
  const values = [];
@@ -2011,6 +2013,8 @@ function buildFetchParams(options) {
2011
2013
  let ignoreGroupsParam = "";
2012
2014
  let defaultGroupLimitParam = "";
2013
2015
  let tiersParam = "";
2016
+ let minPriorityParam = "";
2017
+ let maxPriorityParam = "";
2014
2018
  if (hasIgnoreSingletons) {
2015
2019
  paramIndex++;
2016
2020
  ignoreSingletonsParam = `$${paramIndex}::text[]`;
@@ -2031,14 +2035,26 @@ function buildFetchParams(options) {
2031
2035
  values.push(JSON.stringify(groupConcurrencyConfig.tiers));
2032
2036
  }
2033
2037
  }
2034
- return { values, ignoreSingletonsParam, ignoreGroupsParam, defaultGroupLimitParam, tiersParam };
2038
+ if (hasMinPriority) {
2039
+ paramIndex++;
2040
+ minPriorityParam = `$${paramIndex}::int`;
2041
+ values.push(minPriority);
2042
+ }
2043
+ if (hasMaxPriority) {
2044
+ paramIndex++;
2045
+ maxPriorityParam = `$${paramIndex}::int`;
2046
+ values.push(maxPriority);
2047
+ }
2048
+ return { values, ignoreSingletonsParam, ignoreGroupsParam, defaultGroupLimitParam, tiersParam, minPriorityParam, maxPriorityParam };
2035
2049
  }
2036
2050
  function fetchNextJob(options) {
2037
- const { schema, table, name, policy, limit, includeMetadata, priority = true, orderByCreatedOn = true, ignoreStartAfter = false, groupConcurrency } = options;
2051
+ const { schema, table, name, policy, limit, includeMetadata, priority = true, orderByCreatedOn = true, ignoreStartAfter = false, groupConcurrency, minPriority, maxPriority } = options;
2038
2052
  const singletonFetch = limit > 1 && (policy === QUEUE_POLICIES.singleton || policy === QUEUE_POLICIES.stately);
2039
2053
  const hasIgnoreSingletons = options.ignoreSingletons != null && options.ignoreSingletons.length > 0;
2040
2054
  const hasIgnoreGroups = options.ignoreGroups != null && options.ignoreGroups.length > 0;
2041
2055
  const hasGroupConcurrency = groupConcurrency != null;
2056
+ const hasMinPriority = minPriority != null;
2057
+ const hasMaxPriority = maxPriority != null;
2042
2058
  const hasTiers = hasGroupConcurrency && typeof groupConcurrency === "object" && groupConcurrency.tiers && Object.keys(groupConcurrency.tiers).length > 0;
2043
2059
  const params = buildFetchParams(options);
2044
2060
  const whereConditions = [
@@ -2046,7 +2062,9 @@ function fetchNextJob(options) {
2046
2062
  `state < '${JOB_STATES.active}'`,
2047
2063
  !ignoreStartAfter ? "start_after < now()" : "",
2048
2064
  hasIgnoreSingletons ? `singleton_key <> ALL(${params.ignoreSingletonsParam})` : "",
2049
- hasIgnoreGroups ? `(group_id IS NULL OR group_id <> ALL(${params.ignoreGroupsParam}))` : ""
2065
+ hasIgnoreGroups ? `(group_id IS NULL OR group_id <> ALL(${params.ignoreGroupsParam}))` : "",
2066
+ hasMinPriority ? `priority >= ${params.minPriorityParam}` : "",
2067
+ hasMaxPriority ? `priority <= ${params.maxPriorityParam}` : ""
2050
2068
  ].filter(Boolean).join(" AND ");
2051
2069
  const selectCols = [
2052
2070
  "id",
@@ -2688,6 +2706,17 @@ function validateGroupConcurrencyValue(value, optionName) {
2688
2706
  }
2689
2707
  }
2690
2708
  }
2709
+ function validatePriorityRangeConfig(config) {
2710
+ if (config.minPriority !== void 0) {
2711
+ assert(Number.isInteger(config.minPriority), "minPriority must be an integer");
2712
+ }
2713
+ if (config.maxPriority !== void 0) {
2714
+ assert(Number.isInteger(config.maxPriority), "maxPriority must be an integer");
2715
+ }
2716
+ if (config.minPriority !== void 0 && config.maxPriority !== void 0) {
2717
+ assert(config.minPriority <= config.maxPriority, "minPriority must be <= maxPriority");
2718
+ }
2719
+ }
2691
2720
  function validateGroupConcurrencyConfig(config) {
2692
2721
  const hasGlobal = config.groupConcurrency != null;
2693
2722
  const hasLocal = config.localGroupConcurrency != null;
@@ -2741,6 +2770,7 @@ function checkWorkArgs(name, args) {
2741
2770
  assert(!("includeMetadata" in options) || typeof options.includeMetadata === "boolean", "includeMetadata must be a boolean");
2742
2771
  assert(!("priority" in options) || typeof options.priority === "boolean", "priority must be a boolean");
2743
2772
  assert(!("localConcurrency" in options) || Number.isInteger(options.localConcurrency) && options.localConcurrency >= 1, "localConcurrency must be an integer >= 1");
2773
+ validatePriorityRangeConfig(options);
2744
2774
  validateGroupConcurrencyConfig(options);
2745
2775
  validateHeartbeatRefreshConfig(options);
2746
2776
  return { options, callback };
@@ -2751,6 +2781,7 @@ function checkFetchArgs(name, options) {
2751
2781
  assert(!("includeMetadata" in options) || typeof options.includeMetadata === "boolean", "includeMetadata must be a boolean");
2752
2782
  assert(!("priority" in options) || typeof options.priority === "boolean", "priority must be a boolean");
2753
2783
  assert(!("ignoreStartAfter" in options) || typeof options.ignoreStartAfter === "boolean", "ignoreStartAfter must be a boolean");
2784
+ validatePriorityRangeConfig(options);
2754
2785
  }
2755
2786
  function getConfig(value) {
2756
2787
  assert(
@@ -3797,6 +3828,41 @@ class Contractor {
3797
3828
  await this.db.executeSql(commands);
3798
3829
  }
3799
3830
  }
3831
+ function unwrapSQLResult(result) {
3832
+ if (Array.isArray(result)) {
3833
+ return { rows: result.flatMap((i) => i.rows) };
3834
+ }
3835
+ return result;
3836
+ }
3837
+ function delay(ms, error, abortController) {
3838
+ const ac = abortController || new AbortController();
3839
+ const promise = new Promise((resolve, reject) => {
3840
+ setTimeout$1(ms, null, { signal: ac.signal }).then(() => {
3841
+ if (error) {
3842
+ reject(new Error(error));
3843
+ } else {
3844
+ resolve();
3845
+ }
3846
+ }).catch(resolve);
3847
+ });
3848
+ promise.abort = () => {
3849
+ if (!ac.signal.aborted) {
3850
+ ac.abort();
3851
+ }
3852
+ };
3853
+ return promise;
3854
+ }
3855
+ async function resolveWithinSeconds(promise, seconds, message, abortController) {
3856
+ const timeout = Math.max(1, seconds) * 1e3;
3857
+ const reject = delay(timeout, message, abortController);
3858
+ let result;
3859
+ try {
3860
+ result = await Promise.race([promise, reject]);
3861
+ } finally {
3862
+ reject.abort();
3863
+ }
3864
+ return result;
3865
+ }
3800
3866
  async function emitAndPersistWarning(ctx, type, message, data) {
3801
3867
  ctx.emitter.emit(ctx.warningEvent, { message, data });
3802
3868
  if (ctx.persistWarnings) {
@@ -3832,6 +3898,7 @@ class Timekeeper extends EventEmitter {
3832
3898
  cronMonitorInterval;
3833
3899
  skewMonitorInterval;
3834
3900
  timekeeping;
3901
+ _checkingSkew = false;
3835
3902
  clockSkew = 0;
3836
3903
  events = EVENTS;
3837
3904
  constructor(db, manager, config) {
@@ -3840,6 +3907,9 @@ class Timekeeper extends EventEmitter {
3840
3907
  this.config = config;
3841
3908
  this.manager = manager;
3842
3909
  }
3910
+ get checkingSkew() {
3911
+ return this._checkingSkew;
3912
+ }
3843
3913
  get warningContext() {
3844
3914
  return {
3845
3915
  emitter: this,
@@ -3877,13 +3947,20 @@ class Timekeeper extends EventEmitter {
3877
3947
  clearInterval(this.cronMonitorInterval);
3878
3948
  this.cronMonitorInterval = null;
3879
3949
  }
3950
+ while (this.timekeeping || this._checkingSkew) {
3951
+ await delay(10);
3952
+ }
3880
3953
  }
3881
3954
  async cacheClockSkew() {
3882
3955
  let skew = 0;
3956
+ this._checkingSkew = true;
3883
3957
  try {
3884
3958
  if (this.config.__test__force_clock_monitoring_error) {
3885
3959
  throw new Error(this.config.__test__force_clock_monitoring_error);
3886
3960
  }
3961
+ if (this.config.__test__delay_clock_skew_ms) {
3962
+ await delay(this.config.__test__delay_clock_skew_ms);
3963
+ }
3887
3964
  const { rows } = await this.db.executeSql(getTime());
3888
3965
  const local = Date.now();
3889
3966
  const dbTime = parseFloat(rows[0].time);
@@ -3901,6 +3978,7 @@ class Timekeeper extends EventEmitter {
3901
3978
  this.emit(this.events.error, err);
3902
3979
  } finally {
3903
3980
  this.clockSkew = skew;
3981
+ this._checkingSkew = false;
3904
3982
  }
3905
3983
  }
3906
3984
  async onCron() {
@@ -3970,41 +4048,6 @@ class Timekeeper extends EventEmitter {
3970
4048
  await this.db.executeSql(sql, [name, key]);
3971
4049
  }
3972
4050
  }
3973
- function unwrapSQLResult(result) {
3974
- if (Array.isArray(result)) {
3975
- return { rows: result.flatMap((i) => i.rows) };
3976
- }
3977
- return result;
3978
- }
3979
- function delay(ms, error, abortController) {
3980
- const ac = abortController || new AbortController();
3981
- const promise = new Promise((resolve, reject) => {
3982
- setTimeout$1(ms, null, { signal: ac.signal }).then(() => {
3983
- if (error) {
3984
- reject(new Error(error));
3985
- } else {
3986
- resolve();
3987
- }
3988
- }).catch(resolve);
3989
- });
3990
- promise.abort = () => {
3991
- if (!ac.signal.aborted) {
3992
- ac.abort();
3993
- }
3994
- };
3995
- return promise;
3996
- }
3997
- async function resolveWithinSeconds(promise, seconds, message, abortController) {
3998
- const timeout = Math.max(1, seconds) * 1e3;
3999
- const reject = delay(timeout, message, abortController);
4000
- let result;
4001
- try {
4002
- result = await Promise.race([promise, reject]);
4003
- } finally {
4004
- reject.abort();
4005
- }
4006
- return result;
4007
- }
4008
4051
  const WORKER_STATES = {
4009
4052
  created: "created",
4010
4053
  active: "active",
@@ -4436,7 +4479,9 @@ class Manager extends EventEmitter {
4436
4479
  localGroupConcurrency,
4437
4480
  groupConcurrency,
4438
4481
  orderByCreatedOn = true,
4439
- heartbeatRefreshSeconds
4482
+ heartbeatRefreshSeconds,
4483
+ minPriority,
4484
+ maxPriority
4440
4485
  } = options;
4441
4486
  if (localGroupConcurrency != null) {
4442
4487
  this.#storeLocalGroupConfig(name, localGroupConcurrency);
@@ -4445,7 +4490,7 @@ class Manager extends EventEmitter {
4445
4490
  const createWorker = (workerId) => {
4446
4491
  const fetch = () => {
4447
4492
  const ignoreGroups = localGroupConcurrency != null ? this.#getGroupsAtLocalCapacity(name) : void 0;
4448
- return this.fetch(name, { batchSize, includeMetadata, priority, orderByCreatedOn, groupConcurrency, ignoreGroups });
4493
+ return this.fetch(name, { batchSize, includeMetadata, priority, orderByCreatedOn, groupConcurrency, ignoreGroups, minPriority, maxPriority });
4449
4494
  };
4450
4495
  const onFetch = async (jobs2) => {
4451
4496
  if (!jobs2.length) return;
@@ -4994,6 +5039,9 @@ class Boss extends EventEmitter {
4994
5039
  WARNINGS.LARGE_QUEUE.size = config.warningQueueSize;
4995
5040
  }
4996
5041
  }
5042
+ get maintaining() {
5043
+ return !!this.#maintaining;
5044
+ }
4997
5045
  async start() {
4998
5046
  if (this.#stopped) {
4999
5047
  this.#stopping = false;
@@ -5009,6 +5057,9 @@ class Boss extends EventEmitter {
5009
5057
  this.#stopping = true;
5010
5058
  if (this.#superviseInterval) clearInterval(this.#superviseInterval);
5011
5059
  this.#stopped = true;
5060
+ while (this.#maintaining) {
5061
+ await delay(10);
5062
+ }
5012
5063
  }
5013
5064
  }
5014
5065
  get #warningContext() {
@@ -5046,6 +5097,9 @@ class Boss extends EventEmitter {
5046
5097
  throw new Error(this.#config.__test__throw_maint);
5047
5098
  }
5048
5099
  this.#maintaining = true;
5100
+ if (this.#config.__test__delay_maint_ms) {
5101
+ await delay(this.#config.__test__delay_maint_ms);
5102
+ }
5049
5103
  const queues = await this.#manager.getQueues();
5050
5104
  !this.#stopped && await this.supervise(queues);
5051
5105
  !this.#stopped && await this.#maintainWarnings();
@@ -5157,6 +5211,9 @@ class Bam extends EventEmitter {
5157
5211
  this.#stopped = true;
5158
5212
  this.#working = false;
5159
5213
  }
5214
+ get working() {
5215
+ return this.#working;
5216
+ }
5160
5217
  async start() {
5161
5218
  if (!this.#stopped) return;
5162
5219
  this.#stopped = false;
@@ -5173,6 +5230,9 @@ class Bam extends EventEmitter {
5173
5230
  clearInterval(this.#pollInterval);
5174
5231
  this.#pollInterval = void 0;
5175
5232
  }
5233
+ while (this.#working) {
5234
+ await delay(10);
5235
+ }
5176
5236
  }
5177
5237
  async #onPoll() {
5178
5238
  if (this.#stopped || this.#working || !this.#config.migrate) return;
@@ -5181,6 +5241,9 @@ class Bam extends EventEmitter {
5181
5241
  if (this.#config.__test__throw_bam) {
5182
5242
  throw new Error(this.#config.__test__throw_bam);
5183
5243
  }
5244
+ if (this.#config.__test__delay_bam_ms) {
5245
+ await delay(this.#config.__test__delay_bam_ms);
5246
+ }
5184
5247
  const sql = trySetBamTime(
5185
5248
  this.#config.schema,
5186
5249
  this.#config.bamIntervalSeconds
@@ -5483,6 +5546,15 @@ class PgBoss extends EventEmitter {
5483
5546
  getQueueStats(name) {
5484
5547
  return this.#manager.getQueueStats(name);
5485
5548
  }
5549
+ isMaintaining() {
5550
+ return this.#boss.maintaining;
5551
+ }
5552
+ isBamWorking() {
5553
+ return this.#bam.working;
5554
+ }
5555
+ isCheckingSkew() {
5556
+ return this.#timekeeper.checkingSkew;
5557
+ }
5486
5558
  supervise(name) {
5487
5559
  return this.#boss.supervise(name);
5488
5560
  }
@@ -9825,10 +9897,10 @@ const route11 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
9825
9897
  default: warnings,
9826
9898
  loader
9827
9899
  }, Symbol.toStringTag, { value: "Module" }));
9828
- const serverManifest = { "entry": { "module": "/assets/entry.client-Szv-xmaE.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/index-x2yWco1W.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/root-D0qqtdF7.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/index-x2yWco1W.js", "/assets/db-link-DmvfwdX4.js", "/assets/createLucideIcon-B0YqJFaz.js", "/assets/MenuTrigger-CEHCnGow.js", "/assets/useOpenInteractionType-Ss_6xZdw.js"], "css": ["/assets/root-Bpb4WtY4.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/_index": { "id": "routes/_index", "parentId": "root", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/_index-9fLquIe1.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/badge-B5ZugmiV.js", "/assets/table-CtSLyG7m.js", "/assets/error-card-CXoOCvsg.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/jobs": { "id": "routes/jobs", "parentId": "root", "path": "jobs", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/jobs-CM6xcK-O.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/badge-B5ZugmiV.js", "/assets/table-CtSLyG7m.js", "/assets/pagination-C4yyCmBA.js", "/assets/filter-select-DXyBBVm8.js", "/assets/error-card-CXoOCvsg.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues._index": { "id": "routes/queues._index", "parentId": "root", "path": "queues", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues._index-Dn3ieC5d.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/badge-B5ZugmiV.js", "/assets/filter-select-DXyBBVm8.js", "/assets/table-CtSLyG7m.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues.create": { "id": "routes/queues.create", "parentId": "root", "path": "queues/create", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues.create-Ch3Mqw52.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/chevron-down-B4tDL9Ah.js", "/assets/error-card-CXoOCvsg.js", "/assets/createLucideIcon-B0YqJFaz.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues.$name": { "id": "routes/queues.$name", "parentId": "root", "path": "queues/:name", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues._name-GrviLLx2.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/badge-B5ZugmiV.js", "/assets/table-CtSLyG7m.js", "/assets/pagination-C4yyCmBA.js", "/assets/filter-select-DXyBBVm8.js", "/assets/dialog-CQzw3QVH.js", "/assets/error-card-CXoOCvsg.js", "/assets/chevron-down-B4tDL9Ah.js", "/assets/createLucideIcon-B0YqJFaz.js", "/assets/MenuTrigger-CEHCnGow.js", "/assets/useOpenInteractionType-Ss_6xZdw.js", "/assets/index-x2yWco1W.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues.$name.jobs.$jobId": { "id": "routes/queues.$name.jobs.$jobId", "parentId": "root", "path": "queues/:name/jobs/:jobId", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues._name.jobs._jobId-s_wYs79w.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/badge-B5ZugmiV.js", "/assets/dialog-CQzw3QVH.js", "/assets/error-card-CXoOCvsg.js", "/assets/createLucideIcon-B0YqJFaz.js", "/assets/useOpenInteractionType-Ss_6xZdw.js", "/assets/index-x2yWco1W.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/schedules": { "id": "routes/schedules", "parentId": "root", "path": "schedules", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/schedules-DwnuuhxF.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/table-CtSLyG7m.js", "/assets/pagination-C4yyCmBA.js", "/assets/error-card-CXoOCvsg.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/schedules.$name.$key": { "id": "routes/schedules.$name.$key", "parentId": "root", "path": "schedules/:name/:key", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/schedules._name._key-DJn-u3Cm.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/dialog-CQzw3QVH.js", "/assets/error-card-CXoOCvsg.js", "/assets/createLucideIcon-B0YqJFaz.js", "/assets/useOpenInteractionType-Ss_6xZdw.js", "/assets/index-x2yWco1W.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/schedules.new": { "id": "routes/schedules.new", "parentId": "root", "path": "schedules/new", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/schedules.new-CQuE2Uhz.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/error-card-CXoOCvsg.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/send": { "id": "routes/send", "parentId": "root", "path": "send", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/send-DVfuC6NR.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/db-link-DmvfwdX4.js", "/assets/button-Djse56Dx.js", "/assets/error-card-CXoOCvsg.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/warnings": { "id": "routes/warnings", "parentId": "root", "path": "warnings", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/warnings-DqRQYomb.js", "imports": ["/assets/chunk-LFPYN7LY-Cj1DJmJR.js", "/assets/button-Djse56Dx.js", "/assets/badge-B5ZugmiV.js", "/assets/table-CtSLyG7m.js", "/assets/pagination-C4yyCmBA.js", "/assets/filter-select-DXyBBVm8.js", "/assets/error-card-CXoOCvsg.js", "/assets/db-link-DmvfwdX4.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 } }, "url": "/assets/manifest-acaa4b8e.js", "version": "acaa4b8e", "sri": void 0 };
9900
+ const serverManifest = { "entry": { "module": "/assets/entry.client-DXZUROTm.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/index-DuhoQwUK.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/root-DDqOT0vL.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/index-DuhoQwUK.js", "/assets/db-link-CU7IJqbq.js", "/assets/createLucideIcon-Bt-yXILq.js", "/assets/MenuTrigger-CoRd-BqL.js", "/assets/useOpenInteractionType-mgYMZAa8.js"], "css": ["/assets/root-Bpb4WtY4.css"], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/_index": { "id": "routes/_index", "parentId": "root", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/_index-BTx7NRR8.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/badge-DBD4CzAv.js", "/assets/table-Au2E5mnP.js", "/assets/error-card-D-uZRy_l.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/jobs": { "id": "routes/jobs", "parentId": "root", "path": "jobs", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/jobs-ouYjIGAi.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/badge-DBD4CzAv.js", "/assets/table-Au2E5mnP.js", "/assets/pagination-BItl293Q.js", "/assets/filter-select-Tk_CBvrn.js", "/assets/error-card-D-uZRy_l.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues._index": { "id": "routes/queues._index", "parentId": "root", "path": "queues", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues._index-_ID9kaow.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/badge-DBD4CzAv.js", "/assets/filter-select-Tk_CBvrn.js", "/assets/table-Au2E5mnP.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues.create": { "id": "routes/queues.create", "parentId": "root", "path": "queues/create", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues.create-CmVW5UVm.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/chevron-down-CYa4FYmp.js", "/assets/error-card-D-uZRy_l.js", "/assets/createLucideIcon-Bt-yXILq.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues.$name": { "id": "routes/queues.$name", "parentId": "root", "path": "queues/:name", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues._name-DwdbQND-.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/badge-DBD4CzAv.js", "/assets/table-Au2E5mnP.js", "/assets/pagination-BItl293Q.js", "/assets/filter-select-Tk_CBvrn.js", "/assets/dialog-Dkx42Rkd.js", "/assets/error-card-D-uZRy_l.js", "/assets/chevron-down-CYa4FYmp.js", "/assets/createLucideIcon-Bt-yXILq.js", "/assets/MenuTrigger-CoRd-BqL.js", "/assets/useOpenInteractionType-mgYMZAa8.js", "/assets/index-DuhoQwUK.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/queues.$name.jobs.$jobId": { "id": "routes/queues.$name.jobs.$jobId", "parentId": "root", "path": "queues/:name/jobs/:jobId", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/queues._name.jobs._jobId-DrgG3VBb.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/badge-DBD4CzAv.js", "/assets/dialog-Dkx42Rkd.js", "/assets/error-card-D-uZRy_l.js", "/assets/createLucideIcon-Bt-yXILq.js", "/assets/useOpenInteractionType-mgYMZAa8.js", "/assets/index-DuhoQwUK.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/schedules": { "id": "routes/schedules", "parentId": "root", "path": "schedules", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/schedules-B6ixYsvz.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/table-Au2E5mnP.js", "/assets/pagination-BItl293Q.js", "/assets/error-card-D-uZRy_l.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/schedules.$name.$key": { "id": "routes/schedules.$name.$key", "parentId": "root", "path": "schedules/:name/:key", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/schedules._name._key-CXTVKoOc.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/dialog-Dkx42Rkd.js", "/assets/error-card-D-uZRy_l.js", "/assets/createLucideIcon-Bt-yXILq.js", "/assets/useOpenInteractionType-mgYMZAa8.js", "/assets/index-DuhoQwUK.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/schedules.new": { "id": "routes/schedules.new", "parentId": "root", "path": "schedules/new", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/schedules.new-Dmasri9v.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/error-card-D-uZRy_l.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/send": { "id": "routes/send", "parentId": "root", "path": "send", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/send-CqR34Z50.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/db-link-CU7IJqbq.js", "/assets/button-Ba8FWhqs.js", "/assets/error-card-D-uZRy_l.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 }, "routes/warnings": { "id": "routes/warnings", "parentId": "root", "path": "warnings", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasClientMiddleware": false, "hasDefaultExport": true, "hasErrorBoundary": true, "module": "/assets/warnings-Dj3qacgN.js", "imports": ["/assets/chunk-UVKPFVEO-YfSfkVr_.js", "/assets/button-Ba8FWhqs.js", "/assets/badge-DBD4CzAv.js", "/assets/table-Au2E5mnP.js", "/assets/pagination-BItl293Q.js", "/assets/filter-select-Tk_CBvrn.js", "/assets/error-card-D-uZRy_l.js", "/assets/db-link-CU7IJqbq.js"], "css": [], "clientActionModule": void 0, "clientLoaderModule": void 0, "clientMiddlewareModule": void 0, "hydrateFallbackModule": void 0 } }, "url": "/assets/manifest-72f6b3e9.js", "version": "72f6b3e9", "sri": void 0 };
9829
9901
  const assetsBuildDirectory = "build/client";
9830
9902
  const basename = "/";
9831
- const future = { "unstable_optimizeDeps": false, "unstable_subResourceIntegrity": false, "unstable_trailingSlashAwareDataRequests": false, "unstable_previewServerPrerendering": false, "v8_middleware": false, "v8_splitRouteModules": false, "v8_viteEnvironmentApi": false };
9903
+ const future = { "unstable_optimizeDeps": false, "unstable_passThroughRequests": false, "unstable_subResourceIntegrity": false, "unstable_trailingSlashAwareDataRequests": false, "unstable_previewServerPrerendering": false, "v8_middleware": false, "v8_splitRouteModules": false, "v8_viteEnvironmentApi": false };
9832
9904
  const ssr = true;
9833
9905
  const isSpaMode = false;
9834
9906
  const prerender = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pg-boss/dashboard",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Web dashboard for monitoring and managing pg-boss job queues",
5
5
  "keywords": [
6
6
  "pg-boss",
@@ -41,35 +41,35 @@
41
41
  "ci": "npm run typecheck && npm run cover:frontend && cross-env DATABASE_URL=postgres://postgres:postgres@127.0.0.1:5432/pgboss npm run cover:server"
42
42
  },
43
43
  "dependencies": {
44
- "@base-ui/react": "^1.2.0",
45
- "@hono/node-server": "^1.19.9",
44
+ "@base-ui/react": "^1.3.0",
45
+ "@hono/node-server": "^1.19.12",
46
46
  "@react-router/node": "^7.13.0",
47
47
  "class-variance-authority": "^0.7.1",
48
48
  "clsx": "^2.1.1",
49
- "hono": "^4.12.3",
50
- "isbot": "^5.1.35",
49
+ "hono": "^4.12.9",
50
+ "isbot": "^5.1.36",
51
51
  "lucide-react": "^0.575.0",
52
- "pg": "^8.19.0",
53
- "pg-boss": "^12.13.0",
52
+ "pg": "^8.20.0",
53
+ "pg-boss": "^12.14.0",
54
54
  "react": "^19.2.4",
55
55
  "react-dom": "^19.2.4",
56
56
  "react-router": "^7.13.0",
57
- "react-router-hono-server": "^2.25.0",
57
+ "react-router-hono-server": "^2.25.2",
58
58
  "tailwind-merge": "^3.5.0"
59
59
  },
60
60
  "devDependencies": {
61
- "@react-router/dev": "^7.13.1",
62
- "@tailwindcss/vite": "^4.2.1",
61
+ "@react-router/dev": "^7.13.2",
62
+ "@tailwindcss/vite": "^4.2.2",
63
63
  "@testing-library/dom": "^10.4.1",
64
64
  "@testing-library/jest-dom": "^6.9.1",
65
65
  "@testing-library/react": "^16.3.2",
66
66
  "@testing-library/user-event": "^14.6.1",
67
- "@types/node": "^22.19.13",
68
- "@types/pg": "^8.16.0",
67
+ "@types/node": "^22.19.15",
68
+ "@types/pg": "^8.20.0",
69
69
  "@types/react": "^19.2.14",
70
70
  "@types/react-dom": "^19.2.3",
71
- "@vitejs/plugin-react": "^5.1.4",
72
- "@vitest/coverage-v8": "^4.0.18",
71
+ "@vitejs/plugin-react": "^5.2.0",
72
+ "@vitest/coverage-v8": "^4.1.2",
73
73
  "cross-env": "^10.1.0",
74
74
  "jsdom": "^28.1.0",
75
75
  "tailwindcss": "^4.1.18",