@pg-boss/dashboard 1.1.3 → 1.2.0

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 (71) hide show
  1. package/README.md +28 -0
  2. package/bin/cli.js +2 -2
  3. package/build/client/assets/MenuTrigger-CkqlwCsV.js +1 -0
  4. package/build/client/assets/_index-CNX0dPQi.js +1 -0
  5. package/build/client/assets/badge-DFReduIj.js +1 -0
  6. package/build/client/assets/button-CafwM-5D.js +1 -0
  7. package/build/client/assets/check-BePyOaOM.js +1 -0
  8. package/build/client/assets/chevron-down-C8oENez_.js +1 -0
  9. package/build/client/assets/chevron-right-B0sTJmdc.js +1 -0
  10. package/build/client/assets/createLucideIcon-oZ0wXCaF.js +1 -0
  11. package/build/client/assets/db-link-DISwKBYZ.js +1 -0
  12. package/build/client/assets/dialog-IBPuwpas.js +1 -0
  13. package/build/client/assets/entry.client-6KjasuHH.js +9 -0
  14. package/build/client/assets/error-card-2aexlkmv.js +1 -0
  15. package/build/client/assets/filter-select-Dln9CAM3.js +1 -0
  16. package/build/client/assets/jobs-BjoGjnb0.js +1 -0
  17. package/build/client/assets/jsx-runtime-DcdjQ3vN.js +26 -0
  18. package/build/client/assets/manifest-e6a94de0.js +1 -0
  19. package/build/client/assets/pagination-5gEldBFM.js +1 -0
  20. package/build/client/assets/queues._index-BM3eKnSr.js +1 -0
  21. package/build/client/assets/queues._name-DSOGXBen.js +1 -0
  22. package/build/client/assets/queues._name.jobs._jobId-DKGu8NkE.js +1 -0
  23. package/build/client/assets/queues.create-BVR72i85.js +1 -0
  24. package/build/client/assets/react-dom-DQHA9Ik4.js +1 -0
  25. package/build/client/assets/root-Cvarn0sH.js +40 -0
  26. package/build/client/assets/root-D24FtLBP.css +2 -0
  27. package/build/client/assets/schedules-CE-hWC9e.js +1 -0
  28. package/build/client/assets/schedules._name._key-DT8Kg4jU.js +1 -0
  29. package/build/client/assets/schedules.new-bKRusXXO.js +1 -0
  30. package/build/client/assets/send-BaWw8x7J.js +1 -0
  31. package/build/client/assets/stat-card-y2feeHt0.js +1 -0
  32. package/build/client/assets/table-B5BEGV9S.js +1 -0
  33. package/build/client/assets/useOpenInteractionType-BGObzouY.js +1 -0
  34. package/build/client/assets/warnings-lzi34PdC.js +1 -0
  35. package/build/client/assets/x-EA6eZ1AP.js +1 -0
  36. package/build/server/index.js +10402 -28
  37. package/build/server.js +127 -0
  38. package/package.json +26 -26
  39. package/build/client/assets/MenuTrigger-BUdpY9vj.js +0 -1
  40. package/build/client/assets/_index-DXfER9RD.js +0 -1
  41. package/build/client/assets/badge-to3cY6Nn.js +0 -1
  42. package/build/client/assets/button-CudTDtZF.js +0 -1
  43. package/build/client/assets/chevron-down-ClrMXFFn.js +0 -1
  44. package/build/client/assets/chunk-EVOBXE3Y-CmKRT32p.js +0 -26
  45. package/build/client/assets/createLucideIcon-C5Bm8BOS.js +0 -1
  46. package/build/client/assets/db-link-BzIwSws3.js +0 -1
  47. package/build/client/assets/dialog-BBFR7NS6.js +0 -1
  48. package/build/client/assets/entry.client-B-bLoJqf.js +0 -13
  49. package/build/client/assets/error-card--OB_TuOC.js +0 -1
  50. package/build/client/assets/filter-select-07am_j5T.js +0 -1
  51. package/build/client/assets/index-By5u-yQ6.js +0 -1
  52. package/build/client/assets/jobs-Gp0x24mG.js +0 -1
  53. package/build/client/assets/manifest-560249af.js +0 -1
  54. package/build/client/assets/pagination-DCEs769S.js +0 -1
  55. package/build/client/assets/queues._index-DxMtAiK3.js +0 -1
  56. package/build/client/assets/queues._name-DqI0ZH4S.js +0 -1
  57. package/build/client/assets/queues._name.jobs._jobId-BEwVDYH6.js +0 -1
  58. package/build/client/assets/queues.create-aEr8z6Lt.js +0 -1
  59. package/build/client/assets/root-Bpb4WtY4.css +0 -1
  60. package/build/client/assets/root-Cubm0m9Y.js +0 -35
  61. package/build/client/assets/schedules-BacoSVY9.js +0 -1
  62. package/build/client/assets/schedules._name._key-zuc0HZqU.js +0 -1
  63. package/build/client/assets/schedules.new-CrK1w4GF.js +0 -1
  64. package/build/client/assets/send-wPFbslqy.js +0 -1
  65. package/build/client/assets/table-CV0K56fY.js +0 -1
  66. package/build/client/assets/useOpenInteractionType-C7OfDyTB.js +0 -1
  67. package/build/client/assets/warnings-DLjttltF.js +0 -1
  68. package/build/server/assets/auth.server-DgTIakNo.js +0 -17
  69. package/build/server/assets/config.server-CARiqCUE.js +0 -54
  70. package/build/server/assets/node-DzjK5u9i.js +0 -176
  71. package/build/server/assets/server-build.js +0 -10026
@@ -1 +0,0 @@
1
- import{A as f,B as N,t as P,p as a}from"./chunk-EVOBXE3Y-CmKRT32p.js";import{C as u,a as T,b,c as w}from"./button-CudTDtZF.js";import{B as C}from"./badge-to3cY6Nn.js";import{T as S,a as E,b as l,c as o,d as W,e as r}from"./table-CV0K56fY.js";import{P as B}from"./pagination-DCEs769S.js";import{F as R}from"./filter-select-07am_j5T.js";import{E as k}from"./error-card--OB_TuOC.js";import{o as A,p as _,q as D,W as F,b as I}from"./db-link-BzIwSws3.js";const M=N(function(){return a.jsx(k,{title:"Failed to load warnings",backTo:{href:"/",label:"Back to Dashboard"}})}),V=f(function({loaderData:p}){const{warnings:d,totalCount:x,page:i,totalPages:m,typeFilter:c}=p,[h,g]=P(),j=(e,s)=>{const n=new URLSearchParams(h);s?n.set(e,s):n.delete(e),n.delete("page"),g(n)},y=e=>{const s=new URLSearchParams(h);s.set("page",e.toString()),g(s)};return a.jsxs("div",{className:"space-y-6",children:[a.jsxs("div",{children:[a.jsx("h1",{className:"text-2xl font-bold text-gray-900 dark:text-gray-100",children:"Warnings"}),a.jsxs("p",{className:"mt-1 text-sm text-gray-500 dark:text-gray-400",children:[x.toLocaleString()," warning",x!==1?"s":""," recorded"]})]}),a.jsxs(u,{children:[a.jsxs(T,{className:"flex flex-row items-center justify-between",children:[a.jsx(b,{children:"Warning History"}),a.jsx(R,{value:c,options:A,onChange:e=>j("type",e)})]}),a.jsx(w,{className:"p-0",children:a.jsxs(S,{children:[a.jsx(E,{children:a.jsxs(l,{children:[a.jsx(o,{children:"Type"}),a.jsx(o,{children:"Message"}),a.jsx(o,{children:"Details"}),a.jsx(o,{children:"Time"})]})}),a.jsx(W,{children:d.length===0?a.jsx(l,{children:a.jsx(r,{className:"text-center text-gray-500 dark:text-gray-400 py-8",colSpan:4,children:c?`No ${c.replace("_"," ")} warnings found`:"No warnings recorded. Enable persistWarnings in pg-boss config to capture warnings."})}):d.map(e=>a.jsxs(l,{children:[a.jsx(r,{children:a.jsx(L,{type:e.type})}),a.jsx(r,{className:"text-gray-900 dark:text-gray-100 max-w-md truncate",children:e.message}),a.jsx(r,{className:"font-mono text-xs text-gray-500 dark:text-gray-400 max-w-xs truncate",children:_(e.data)}),a.jsx(r,{className:"text-gray-500 dark:text-gray-400 whitespace-nowrap",children:D(new Date(e.createdOn))})]},e.id))})]})}),a.jsx(B,{page:i,totalPages:m,hasNextPage:i<m,hasPrevPage:i>1,onPageChange:y})]})]})});function L({type:t}){return a.jsx(C,{variant:I[t],size:"sm",children:F[t]})}export{M as ErrorBoundary,V as default};
@@ -1,17 +0,0 @@
1
- import { basicAuth } from "hono/basic-auth";
2
- function configureAuth(app) {
3
- const username = process.env.PGBOSS_DASHBOARD_AUTH_USERNAME;
4
- const password = process.env.PGBOSS_DASHBOARD_AUTH_PASSWORD;
5
- if (username && !password) {
6
- throw new Error("PGBOSS_DASHBOARD_AUTH_PASSWORD is required when PGBOSS_DASHBOARD_AUTH_USERNAME is set");
7
- }
8
- if (!username && password) {
9
- throw new Error("PGBOSS_DASHBOARD_AUTH_USERNAME is required when PGBOSS_DASHBOARD_AUTH_PASSWORD is set");
10
- }
11
- if (username && password) {
12
- app.use(basicAuth({ username, password }));
13
- }
14
- }
15
- export {
16
- configureAuth as c
17
- };
@@ -1,54 +0,0 @@
1
- const SEPARATOR = "|";
2
- const DEFAULT_SCHEMA = "pgboss";
3
- function parseDatabaseConfig() {
4
- const dbUrlEnv = process.env.DATABASE_URL || "postgres://localhost/pgboss";
5
- const schemaEnv = process.env.PGBOSS_SCHEMA || DEFAULT_SCHEMA;
6
- const urlParts = dbUrlEnv.split(SEPARATOR).map((s) => s.trim()).filter(Boolean);
7
- const schemaParts = schemaEnv.split(SEPARATOR).map((s) => s.trim()).filter(Boolean);
8
- return urlParts.map((part, index) => {
9
- const equalsIndex = part.indexOf("=");
10
- let name;
11
- let url;
12
- const protocolIndex = part.indexOf("://");
13
- if (equalsIndex > 0 && (protocolIndex === -1 || equalsIndex < protocolIndex)) {
14
- name = part.substring(0, equalsIndex).trim();
15
- url = part.substring(equalsIndex + 1).trim();
16
- } else {
17
- url = part;
18
- name = extractDatabaseName(url) || `Database ${index + 1}`;
19
- }
20
- const schema = schemaParts[index] || DEFAULT_SCHEMA;
21
- const id = generateId(name, index);
22
- return { id, name, url, schema };
23
- });
24
- }
25
- function extractDatabaseName(url) {
26
- try {
27
- const match = url.match(/\/([^/?]+)(?:\?|$)/);
28
- if (match) {
29
- return match[1];
30
- }
31
- return null;
32
- } catch {
33
- return null;
34
- }
35
- }
36
- function generateId(name, index) {
37
- const sanitized = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
38
- return sanitized || `db-${index}`;
39
- }
40
- function findDatabaseById(configs, id) {
41
- if (!id) return configs[0] || null;
42
- return configs.find((c) => c.id === id) || configs[0] || null;
43
- }
44
- let cachedConfig = null;
45
- function getDatabaseConfigs() {
46
- if (!cachedConfig) {
47
- cachedConfig = parseDatabaseConfig();
48
- }
49
- return cachedConfig;
50
- }
51
- export {
52
- findDatabaseById as f,
53
- getDatabaseConfigs as g
54
- };
@@ -1,176 +0,0 @@
1
- import { createMiddleware } from "hono/factory";
2
- import { serve } from "@hono/node-server";
3
- import { serveStatic } from "@hono/node-server/serve-static";
4
- import { Hono } from "hono";
5
- import { logger } from "hono/logger";
6
- import { createRequestHandler } from "react-router";
7
- var defaultWebSocket = {
8
- upgradeWebSocket: (() => {
9
- }),
10
- injectWebSocket: (server) => server
11
- };
12
- async function createWebSocket({ app, enabled }) {
13
- if (!enabled) {
14
- return defaultWebSocket;
15
- }
16
- process.env.NODE_ENV === "development" ? "development" : "production";
17
- {
18
- const { createNodeWebSocket } = await import("@hono/node-ws");
19
- const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app });
20
- return {
21
- upgradeWebSocket,
22
- injectWebSocket(server) {
23
- injectWebSocket(server);
24
- return server;
25
- }
26
- };
27
- }
28
- }
29
- function cleanUpgradeListeners(httpServer) {
30
- const upgradeListeners = httpServer.listeners("upgrade").filter((listener) => listener.name !== "hmrServerWsListener");
31
- for (const listener of upgradeListeners) {
32
- httpServer.removeListener(
33
- "upgrade",
34
- /* @ts-expect-error - we don't care */
35
- listener
36
- );
37
- }
38
- }
39
- function patchUpgradeListener(httpServer) {
40
- const upgradeListeners = httpServer.listeners("upgrade").filter((listener) => listener.name !== "hmrServerWsListener");
41
- for (const listener of upgradeListeners) {
42
- httpServer.removeListener(
43
- "upgrade",
44
- /* @ts-expect-error - we don't care */
45
- listener
46
- );
47
- httpServer.on("upgrade", (request, ...rest) => {
48
- if (request.headers["sec-websocket-protocol"] === "vite-hmr") {
49
- return;
50
- }
51
- return listener(request, ...rest);
52
- });
53
- }
54
- }
55
- function bindIncomingRequestSocketInfo() {
56
- return createMiddleware((c, next) => {
57
- c.env.server = {
58
- incoming: {
59
- socket: {
60
- remoteAddress: c.req.raw.headers.get("x-remote-address") || void 0,
61
- remotePort: Number(c.req.raw.headers.get("x-remote-port")) || void 0,
62
- remoteFamily: c.req.raw.headers.get("x-remote-family") || void 0
63
- }
64
- }
65
- };
66
- return next();
67
- });
68
- }
69
- async function importBuild() {
70
- return await import(
71
- // @ts-expect-error - Virtual module provided by React Router at build time
72
- "./server-build.js"
73
- );
74
- }
75
- function getBuildMode() {
76
- return process.env.NODE_ENV === "development" ? "development" : "production";
77
- }
78
- function cache(seconds) {
79
- return createMiddleware(async (c, next) => {
80
- if (!c.req.path.match(/\.[a-zA-Z0-9]+$/) || c.req.path.endsWith(".data")) {
81
- return next();
82
- }
83
- await next();
84
- if (!c.res.ok || c.res.headers.has("cache-control")) {
85
- return;
86
- }
87
- c.res.headers.set("cache-control", `public, max-age=${seconds}`);
88
- });
89
- }
90
- async function createHonoServer(options) {
91
- const startTime = Date.now();
92
- const build = await importBuild();
93
- const basename = "/";
94
- const mergedOptions = {
95
- ...options,
96
- listeningListener: options?.listeningListener || ((info) => {
97
- console.log(`🚀 Server started on port ${info.port}`);
98
- console.log(`🌍 http://127.0.0.1:${info.port}`);
99
- console.log(`🏎️ Server started in ${Date.now() - startTime}ms`);
100
- }),
101
- port: options?.port || Number(process.env.PORT) || 3e3,
102
- defaultLogger: options?.defaultLogger ?? true,
103
- overrideGlobalObjects: options?.overrideGlobalObjects ?? false
104
- };
105
- const mode = getBuildMode();
106
- const PRODUCTION = mode === "production";
107
- const clientBuildPath = `${"build"}/client`;
108
- const app = new Hono(mergedOptions.app);
109
- const { upgradeWebSocket, injectWebSocket } = await createWebSocket({
110
- app,
111
- enabled: mergedOptions.useWebSocket ?? false
112
- });
113
- if (!PRODUCTION) {
114
- app.use(bindIncomingRequestSocketInfo());
115
- }
116
- await mergedOptions.beforeAll?.(app);
117
- app.use(
118
- `/${"assets"}/*`,
119
- cache(60 * 60 * 24 * 365),
120
- // 1 year
121
- serveStatic({ root: clientBuildPath, ...mergedOptions.serveStaticOptions?.clientAssets })
122
- );
123
- app.use(
124
- "*",
125
- cache(60 * 60),
126
- // 1 hour
127
- serveStatic({ root: PRODUCTION ? clientBuildPath : "./public", ...mergedOptions.serveStaticOptions?.publicAssets })
128
- );
129
- if (mergedOptions.defaultLogger) {
130
- app.use("*", logger());
131
- }
132
- if (mergedOptions.useWebSocket) {
133
- await mergedOptions.configure(app, { upgradeWebSocket });
134
- } else {
135
- await mergedOptions.configure?.(app);
136
- }
137
- const reactRouterApp = new Hono({
138
- strict: false
139
- });
140
- reactRouterApp.use((c, next) => {
141
- return createMiddleware(async (c2) => {
142
- const requestHandler = createRequestHandler(build, mode);
143
- const loadContext = mergedOptions.getLoadContext?.(c2, { build, mode });
144
- return requestHandler(c2.req.raw, loadContext instanceof Promise ? await loadContext : loadContext);
145
- })(c, next);
146
- });
147
- app.route(`${basename}`, reactRouterApp);
148
- {
149
- app.route(`${basename}.data`, reactRouterApp);
150
- }
151
- if (PRODUCTION) {
152
- const server = serve(
153
- {
154
- ...app,
155
- ...mergedOptions.customNodeServer,
156
- port: mergedOptions.port,
157
- overrideGlobalObjects: mergedOptions.overrideGlobalObjects,
158
- hostname: mergedOptions.hostname
159
- },
160
- mergedOptions.listeningListener
161
- );
162
- mergedOptions.onServe?.(server);
163
- injectWebSocket(server);
164
- } else if (globalThis.__viteDevServer?.httpServer) {
165
- const httpServer = globalThis.__viteDevServer.httpServer;
166
- cleanUpgradeListeners(httpServer);
167
- mergedOptions.onServe?.(httpServer);
168
- injectWebSocket(httpServer);
169
- patchUpgradeListener(httpServer);
170
- console.log("🚧 Dev server started");
171
- }
172
- return app;
173
- }
174
- export {
175
- createHonoServer as c
176
- };