@bull-board/cli 0.0.0 → 9.3.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 (57) hide show
  1. package/README.md +69 -0
  2. package/dist/auth.d.ts +5 -0
  3. package/dist/auth.js +29 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/bin.d.ts +2 -0
  6. package/dist/bin.js +69 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/config/file.d.ts +9 -0
  9. package/dist/config/file.js +82 -0
  10. package/dist/config/file.js.map +1 -0
  11. package/dist/config/flags.d.ts +77 -0
  12. package/dist/config/flags.js +29 -0
  13. package/dist/config/flags.js.map +1 -0
  14. package/dist/config/resolve.d.ts +7 -0
  15. package/dist/config/resolve.js +73 -0
  16. package/dist/config/resolve.js.map +1 -0
  17. package/dist/config/types.d.ts +36 -0
  18. package/dist/config/types.js +3 -0
  19. package/dist/config/types.js.map +1 -0
  20. package/dist/connectionState.d.ts +21 -0
  21. package/dist/connectionState.js +28 -0
  22. package/dist/connectionState.js.map +1 -0
  23. package/dist/describeError.d.ts +1 -0
  24. package/dist/describeError.js +12 -0
  25. package/dist/describeError.js.map +1 -0
  26. package/dist/diagnosticPage.d.ts +3 -0
  27. package/dist/diagnosticPage.js +150 -0
  28. package/dist/diagnosticPage.js.map +1 -0
  29. package/dist/discovery/index.d.ts +9 -0
  30. package/dist/discovery/index.js +63 -0
  31. package/dist/discovery/index.js.map +1 -0
  32. package/dist/discovery/scan.d.ts +2 -0
  33. package/dist/discovery/scan.js +12 -0
  34. package/dist/discovery/scan.js.map +1 -0
  35. package/dist/help.d.ts +1 -0
  36. package/dist/help.js +48 -0
  37. package/dist/help.js.map +1 -0
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.js +238 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/openBrowser.d.ts +1 -0
  42. package/dist/openBrowser.js +46 -0
  43. package/dist/openBrowser.js.map +1 -0
  44. package/dist/queueFactory.d.ts +15 -0
  45. package/dist/queueFactory.js +63 -0
  46. package/dist/queueFactory.js.map +1 -0
  47. package/dist/registry.d.ts +22 -0
  48. package/dist/registry.js +61 -0
  49. package/dist/registry.js.map +1 -0
  50. package/dist/server.d.ts +14 -0
  51. package/dist/server.js +34 -0
  52. package/dist/server.js.map +1 -0
  53. package/dist/unavailableGate.d.ts +8 -0
  54. package/dist/unavailableGate.js +37 -0
  55. package/dist/unavailableGate.js.map +1 -0
  56. package/package.json +57 -4
  57. package/index.js +0 -1
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createQueueFactory = createQueueFactory;
7
+ const bullAdapter_1 = require("@bull-board/api/bullAdapter");
8
+ const bullMQAdapter_1 = require("@bull-board/api/bullMQAdapter");
9
+ const bull_1 = __importDefault(require("bull"));
10
+ const bullmq_1 = require("bullmq");
11
+ const describeError_1 = require("./describeError");
12
+ function createQueueFactory({ client, readOnly, queueOptions, onWarning, }) {
13
+ let bullSubscriber;
14
+ function createQueue(discovered) {
15
+ var _a;
16
+ // QueueAdapterOptions.prefix is a display-name prefix, not the Redis key prefix.
17
+ const options = {
18
+ ...queueOptions[discovered.name],
19
+ readOnlyMode: readOnly || ((_a = queueOptions[discovered.name]) === null || _a === void 0 ? void 0 : _a.readOnlyMode) === true,
20
+ };
21
+ if (discovered.lib === 'bullmq') {
22
+ const queue = new bullmq_1.Queue(discovered.name, {
23
+ connection: client,
24
+ prefix: discovered.prefix,
25
+ // The dashboard only reads the queues it discovers, so it must not write their meta hash.
26
+ skipMetasUpdate: true,
27
+ });
28
+ queue.on('error', (error) => onWarning(`Queue "${discovered.name}" connection error: ${(0, describeError_1.describeError)(error)}`));
29
+ return {
30
+ adapter: new bullMQAdapter_1.BullMQAdapter(queue, options),
31
+ close: () => queue.close(),
32
+ };
33
+ }
34
+ const queue = new bull_1.default(discovered.name, {
35
+ prefix: discovered.prefix,
36
+ createClient: (type) => {
37
+ if (type === 'client')
38
+ return client;
39
+ // Bull rejects a subscriber that has enableReadyCheck or maxRetriesPerRequest set.
40
+ if (!bullSubscriber) {
41
+ bullSubscriber = client.duplicate({
42
+ enableReadyCheck: false,
43
+ maxRetriesPerRequest: null,
44
+ });
45
+ }
46
+ return bullSubscriber;
47
+ },
48
+ });
49
+ queue.on('error', (error) => onWarning(`Queue "${discovered.name}" connection error: ${(0, describeError_1.describeError)(error)}`));
50
+ return {
51
+ adapter: new bullAdapter_1.BullAdapter(queue, options),
52
+ close: () => queue.close(),
53
+ };
54
+ }
55
+ return {
56
+ createQueue,
57
+ close: async () => {
58
+ await (bullSubscriber === null || bullSubscriber === void 0 ? void 0 : bullSubscriber.quit());
59
+ bullSubscriber = undefined;
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=queueFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queueFactory.js","sourceRoot":"","sources":["../src/queueFactory.ts"],"names":[],"mappings":";;;;;AAsBA,gDAgEC;AAtFD,6DAA0D;AAC1D,iEAA8D;AAE9D,gDAA6B;AAC7B,mCAA8C;AAE9C,mDAAgD;AAgBhD,SAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,SAAS,GACQ;IACjB,IAAI,cAAiC,CAAC;IAEtC,SAAS,WAAW,CAAC,UAA2B;;QAC9C,iFAAiF;QACjF,MAAM,OAAO,GAAiC;YAC5C,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;YAChC,YAAY,EAAE,QAAQ,IAAI,CAAA,MAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,0CAAE,YAAY,MAAK,IAAI;SAC/E,CAAC;QAEF,IAAI,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,cAAW,CAAC,UAAU,CAAC,IAAI,EAAE;gBAC7C,UAAU,EAAE,MAAM;gBAClB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,0FAA0F;gBAC1F,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CACjC,SAAS,CAAC,UAAU,UAAU,CAAC,IAAI,uBAAuB,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE,CAAC,CAClF,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI,6BAAa,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC1C,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;aAC3B,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,cAAS,CAAC,UAAU,CAAC,IAAI,EAAE;YAC3C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE;gBACrB,IAAI,IAAI,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC;gBACrC,mFAAmF;gBACnF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC;wBAChC,gBAAgB,EAAE,KAAK;wBACvB,oBAAoB,EAAE,IAAI;qBAC3B,CAAC,CAAC;gBACL,CAAC;gBAED,OAAO,cAAc,CAAC;YACxB,CAAC;SACF,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CACjC,SAAS,CAAC,UAAU,UAAU,CAAC,IAAI,uBAAuB,IAAA,6BAAa,EAAC,KAAK,CAAC,EAAE,CAAC,CAClF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI,yBAAW,CAAC,KAAK,EAAE,OAAO,CAAC;YACxC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,WAAW;QACX,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,EAAE,CAAA,CAAC;YAC7B,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { BaseAdapter } from '@bull-board/api/baseAdapter';
2
+ import type { DiscoveredQueue } from './discovery';
3
+ export interface QueueHandle {
4
+ adapter: BaseAdapter;
5
+ close(): Promise<void>;
6
+ }
7
+ export interface BoardApi {
8
+ addQueue(adapter: BaseAdapter): void;
9
+ removeQueue(adapter: BaseAdapter | string): void;
10
+ }
11
+ export interface QueueRegistryDeps {
12
+ board: BoardApi;
13
+ createQueue(queue: DiscoveredQueue): QueueHandle;
14
+ onWarning(message: string): void;
15
+ }
16
+ export declare class QueueRegistry {
17
+ private readonly deps;
18
+ private readonly live;
19
+ constructor(deps: QueueRegistryDeps);
20
+ sync(discovered: DiscoveredQueue[]): Promise<void>;
21
+ close(): Promise<void>;
22
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueRegistry = void 0;
4
+ const keyOf = (queue) => `${queue.prefix}:${queue.name}`;
5
+ class QueueRegistry {
6
+ constructor(deps) {
7
+ this.deps = deps;
8
+ this.live = new Map();
9
+ }
10
+ async sync(discovered) {
11
+ // The board keys queues by bare name, so the same name under two prefixes would displace
12
+ // itself. First prefix wins.
13
+ const claimedNames = new Set();
14
+ const wanted = new Map();
15
+ for (const queue of discovered) {
16
+ if (claimedNames.has(queue.name)) {
17
+ this.deps.onWarning(`Skipping "${queue.name}" under prefix "${queue.prefix}": that queue name is already ` +
18
+ `served from another prefix.`);
19
+ continue;
20
+ }
21
+ claimedNames.add(queue.name);
22
+ wanted.set(keyOf(queue), queue);
23
+ }
24
+ for (const [key, queue] of wanted) {
25
+ if (this.live.has(key))
26
+ continue;
27
+ let handle;
28
+ try {
29
+ handle = this.deps.createQueue(queue);
30
+ }
31
+ catch (error) {
32
+ this.deps.onWarning(`Skipping "${queue.name}" under prefix "${queue.prefix}": ${error.message}`);
33
+ continue;
34
+ }
35
+ this.live.set(key, handle);
36
+ this.deps.board.addQueue(handle.adapter);
37
+ }
38
+ // oxlint-disable-next-line unicorn/no-useless-spread
39
+ for (const [key, handle] of [...this.live]) {
40
+ if (wanted.has(key))
41
+ continue;
42
+ this.deps.board.removeQueue(handle.adapter);
43
+ this.live.delete(key);
44
+ await handle.close().catch((error) => {
45
+ this.deps.onWarning(`Failed to close "${handle.adapter.getName()}": ${error.message}`);
46
+ });
47
+ }
48
+ }
49
+ async close() {
50
+ const handles = [...this.live.values()];
51
+ this.live.clear();
52
+ const results = await Promise.allSettled(handles.map((handle) => handle.close()));
53
+ for (const result of results) {
54
+ if (result.status === 'rejected') {
55
+ this.deps.onWarning(`Failed to close a queue on shutdown: ${result.reason}`);
56
+ }
57
+ }
58
+ }
59
+ }
60
+ exports.QueueRegistry = QueueRegistry;
61
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ExpressAdapter } from '@bull-board/express';
2
+ import { type Express } from 'express';
3
+ import type { CliConfig } from './config/types';
4
+ import type { ConnectionState } from './connectionState';
5
+ export interface RunningServer {
6
+ app: Express;
7
+ url: string;
8
+ close(): Promise<void>;
9
+ closeAllConnections(): void;
10
+ }
11
+ export declare function startServer(config: CliConfig, { serverAdapter, getConnectionState, }: {
12
+ serverAdapter: ExpressAdapter;
13
+ getConnectionState?: () => ConnectionState;
14
+ }): Promise<RunningServer>;
package/dist/server.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.startServer = startServer;
7
+ const express_1 = __importDefault(require("express"));
8
+ const auth_1 = require("./auth");
9
+ const unavailableGate_1 = require("./unavailableGate");
10
+ async function startServer(config, { serverAdapter, getConnectionState, }) {
11
+ const app = (0, express_1.default)();
12
+ if (config.auth) {
13
+ app.use((0, auth_1.basicAuth)(config.auth));
14
+ }
15
+ if (getConnectionState) {
16
+ app.get(unavailableGate_1.STATUS_PATH, (0, unavailableGate_1.statusHandler)(getConnectionState));
17
+ app.use((0, unavailableGate_1.unavailableGate)(getConnectionState, { apiPrefix: `${config.basePath}/api` }));
18
+ }
19
+ app.use(config.basePath || '/', serverAdapter.getRouter());
20
+ // Express registers this callback as both the 'listening' and the 'error' handler, so a
21
+ // failed bind arrives here rather than through a later .on('error').
22
+ const server = await new Promise((resolve, reject) => {
23
+ const listening = app.listen(config.port, config.host, (error) => error ? reject(error) : resolve(listening));
24
+ });
25
+ const address = server.address();
26
+ const port = typeof address === 'object' && address ? address.port : config.port;
27
+ return {
28
+ app,
29
+ url: `http://${config.host}:${port}${config.basePath}`,
30
+ close: () => new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve()))),
31
+ closeAllConnections: () => server.closeAllConnections(),
32
+ };
33
+ }
34
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAeA,kCAwCC;AArDD,sDAAgD;AAChD,iCAAmC;AAGnC,uDAAgF;AASzE,KAAK,UAAU,WAAW,CAC/B,MAAiB,EACjB,EACE,aAAa,EACb,kBAAkB,GAC4D;IAEhF,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IAEtB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,IAAA,gBAAS,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,6BAAW,EAAE,IAAA,+BAAa,EAAC,kBAAkB,CAAC,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,IAAA,iCAAe,EAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC;IAE3D,wFAAwF;IACxF,qEAAqE;IACrE,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CACvE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAEjF,OAAO;QACL,GAAG;QACH,GAAG,EAAE,UAAU,MAAM,CAAC,IAAI,IAAI,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE;QACtD,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAC7D;QACH,mBAAmB,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE;KACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RequestHandler } from 'express';
2
+ import { type ConnectionState } from './connectionState';
3
+ import { STATUS_PATH } from './diagnosticPage';
4
+ export { STATUS_PATH };
5
+ export declare function statusHandler(getState: () => ConnectionState): RequestHandler;
6
+ export declare function unavailableGate(getState: () => ConnectionState, { apiPrefix }: {
7
+ apiPrefix: string;
8
+ }): RequestHandler;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STATUS_PATH = void 0;
4
+ exports.statusHandler = statusHandler;
5
+ exports.unavailableGate = unavailableGate;
6
+ const connectionState_1 = require("./connectionState");
7
+ const diagnosticPage_1 = require("./diagnosticPage");
8
+ Object.defineProperty(exports, "STATUS_PATH", { enumerable: true, get: function () { return diagnosticPage_1.STATUS_PATH; } });
9
+ const JSON_UNAVAILABLE_BODY = {
10
+ error: { key: 'ERRORS.REDIS_UNAVAILABLE' },
11
+ code: 'REDIS_UNAVAILABLE',
12
+ };
13
+ const RETRY_AFTER_SECONDS = String(Math.ceil(connectionState_1.RETRY_INTERVAL_MS / 1000));
14
+ function statusHandler(getState) {
15
+ return (_req, res) => {
16
+ res.json(getState());
17
+ };
18
+ }
19
+ function unavailableGate(getState, { apiPrefix }) {
20
+ return (req, res, next) => {
21
+ if (getState().status === 'connected') {
22
+ next();
23
+ return;
24
+ }
25
+ res.setHeader('Retry-After', RETRY_AFTER_SECONDS);
26
+ if (req.path.startsWith(apiPrefix)) {
27
+ res.status(503).json(JSON_UNAVAILABLE_BODY);
28
+ return;
29
+ }
30
+ if (req.accepts('html')) {
31
+ res.status(503).type('html').send((0, diagnosticPage_1.renderDiagnosticPage)(getState()));
32
+ return;
33
+ }
34
+ res.status(503).json(JSON_UNAVAILABLE_BODY);
35
+ };
36
+ }
37
+ //# sourceMappingURL=unavailableGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unavailableGate.js","sourceRoot":"","sources":["../src/unavailableGate.ts"],"names":[],"mappings":";;;AAaA,sCAIC;AAED,0CAwBC;AA1CD,uDAA4E;AAC5E,qDAAqE;AAE5D,4FAFsB,4BAAW,OAEtB;AAEpB,MAAM,qBAAqB,GAAG;IAC5B,KAAK,EAAE,EAAE,GAAG,EAAE,0BAA0B,EAAE;IAC1C,IAAI,EAAE,mBAAmB;CAC1B,CAAC;AAEF,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAiB,GAAG,IAAI,CAAC,CAAC,CAAC;AAExE,SAAgB,aAAa,CAAC,QAA+B;IAC3D,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAC7B,QAA+B,EAC/B,EAAE,SAAS,EAAyB;IAEpC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACxB,IAAI,QAAQ,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACtC,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAElD,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAA,qCAAoB,EAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,60 @@
1
1
  {
2
2
  "name": "@bull-board/cli",
3
- "version": "0.0.0",
4
- "description": "Stub package for npm trusted publishing setup",
5
- "main": "index.js",
6
- "publishConfig": { "access": "public" }
3
+ "version": "9.3.0",
4
+ "description": "Run the bull-board dashboard against a Redis instance from the command line.",
5
+ "keywords": [
6
+ "bull",
7
+ "bull-board",
8
+ "bullmq",
9
+ "cli",
10
+ "dashboard",
11
+ "jobs",
12
+ "monitoring",
13
+ "queue",
14
+ "queue-dashboard",
15
+ "redis",
16
+ "standalone"
17
+ ],
18
+ "license": "MIT",
19
+ "author": "felixmosh",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/felixmosh/bull-board.git",
23
+ "directory": "packages/cli"
24
+ },
25
+ "bin": {
26
+ "bull-board": "dist/bin.js"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "main": "dist/index.js",
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "scripts": {
36
+ "build": "yarn clean && tsc && chmod +x dist/bin.js",
37
+ "clean": "rm -rf dist",
38
+ "test": "jest"
39
+ },
40
+ "dependencies": {
41
+ "@bull-board/api": "9.3.0",
42
+ "@bull-board/express": "9.3.0",
43
+ "bull": "^4.16.5",
44
+ "bullmq": "^5.80.9",
45
+ "express": "^5.2.1",
46
+ "ioredis": "^5.11.1"
47
+ },
48
+ "devDependencies": {
49
+ "@types/express": "^5.0.6",
50
+ "@types/jest": "^30.0.0",
51
+ "@types/supertest": "^6.0.3",
52
+ "jest": "^30.4.2",
53
+ "supertest": "^7.2.2",
54
+ "ts-jest": "^29.4.12",
55
+ "typescript": "^5.9.3"
56
+ },
57
+ "engines": {
58
+ "node": ">=20"
59
+ }
7
60
  }
package/index.js DELETED
@@ -1 +0,0 @@
1
- module.exports = {};