@midwayjs/bull-board 3.0.0 → 3.0.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.
- package/dist/adapter.d.ts +27 -0
- package/dist/adapter.js +103 -0
- package/dist/board.middleware.d.ts +15 -0
- package/dist/board.middleware.js +144 -0
- package/dist/configuration.d.ts +2 -7
- package/dist/configuration.js +9 -33
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/package.json +6 -4
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AppControllerRoute, AppViewRoute, BullBoardQueues, ControllerHandlerReturnType, IServerAdapter } from '@bull-board/api/dist/typings/app';
|
|
2
|
+
export declare class MidwayAdapter implements IServerAdapter {
|
|
3
|
+
private basePath;
|
|
4
|
+
private bullBoardQueues;
|
|
5
|
+
private statics;
|
|
6
|
+
private viewPath;
|
|
7
|
+
private entryRoute;
|
|
8
|
+
private apiRoutes;
|
|
9
|
+
private staticCache;
|
|
10
|
+
setBasePath(path: string): MidwayAdapter;
|
|
11
|
+
setStaticPath(staticsRoute: string, staticsPath: string): MidwayAdapter;
|
|
12
|
+
setViewsPath(viewPath: string): MidwayAdapter;
|
|
13
|
+
setErrorHandler(handler: (error: Error) => ControllerHandlerReturnType): this;
|
|
14
|
+
setApiRoutes(routes: AppControllerRoute[]): MidwayAdapter;
|
|
15
|
+
setEntryRoute(routeDef: AppViewRoute): MidwayAdapter;
|
|
16
|
+
setQueues(bullBoardQueues: BullBoardQueues): MidwayAdapter;
|
|
17
|
+
getViewRoutes(): string[];
|
|
18
|
+
matchApiRoutes(method: string, url: string): AppControllerRoute;
|
|
19
|
+
getStaticRoutes(): string;
|
|
20
|
+
renderStatic(filename: any): Promise<any>;
|
|
21
|
+
renderView(filename: any): Promise<unknown>;
|
|
22
|
+
runAPI(route: any, params: any, query: any): Promise<{
|
|
23
|
+
status: any;
|
|
24
|
+
body: any;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MidwayAdapter = void 0;
|
|
4
|
+
const ejs = require("ejs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const core_1 = require("@midwayjs/core");
|
|
8
|
+
class MidwayAdapter {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.basePath = '';
|
|
11
|
+
this.staticCache = new Map();
|
|
12
|
+
}
|
|
13
|
+
setBasePath(path) {
|
|
14
|
+
this.basePath = path;
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
setStaticPath(staticsRoute, staticsPath) {
|
|
18
|
+
this.statics = { route: staticsRoute, path: staticsPath };
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
setViewsPath(viewPath) {
|
|
22
|
+
this.viewPath = viewPath;
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
setErrorHandler(handler) {
|
|
26
|
+
// this.errorHandler = handler;
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
setApiRoutes(routes) {
|
|
30
|
+
this.apiRoutes = routes;
|
|
31
|
+
this.apiRoutes.forEach(route => {
|
|
32
|
+
route.regexpPattern = core_1.PathToRegexpUtil.toRegexp(route.route);
|
|
33
|
+
});
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
setEntryRoute(routeDef) {
|
|
37
|
+
this.entryRoute = routeDef;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
setQueues(bullBoardQueues) {
|
|
41
|
+
this.bullBoardQueues = bullBoardQueues;
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
getViewRoutes() {
|
|
45
|
+
const { route } = this.entryRoute;
|
|
46
|
+
return Array.isArray(route) ? route : [route];
|
|
47
|
+
}
|
|
48
|
+
matchApiRoutes(method, url) {
|
|
49
|
+
return this.apiRoutes.find(route => {
|
|
50
|
+
if (route.method !== method.toLowerCase()) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return !!core_1.PathToRegexpUtil.match(route.regexpPattern)(url);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
getStaticRoutes() {
|
|
57
|
+
return this.statics.route;
|
|
58
|
+
}
|
|
59
|
+
async renderStatic(filename) {
|
|
60
|
+
filename = filename.replace(this.statics.route, '');
|
|
61
|
+
filename = (0, path_1.join)(this.statics.path, filename);
|
|
62
|
+
if (this.staticCache.has(filename)) {
|
|
63
|
+
return this.staticCache.get(filename);
|
|
64
|
+
}
|
|
65
|
+
let content = (0, fs_1.readFileSync)(filename, {
|
|
66
|
+
encoding: 'utf-8',
|
|
67
|
+
});
|
|
68
|
+
this.staticCache.set(filename, content);
|
|
69
|
+
return content;
|
|
70
|
+
}
|
|
71
|
+
async renderView(filename) {
|
|
72
|
+
const basePath = this.basePath.endsWith('/') ? this.basePath : `${this.basePath}/`;
|
|
73
|
+
if (filename === '/') {
|
|
74
|
+
filename = 'index.ejs';
|
|
75
|
+
}
|
|
76
|
+
filename = (0, path_1.join)(this.viewPath, filename);
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
ejs.renderFile(filename, { basePath, cache: true }, {
|
|
79
|
+
root: this.viewPath,
|
|
80
|
+
}, (err, result) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
reject(err);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
resolve(result);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async runAPI(route, params, query) {
|
|
91
|
+
const response = await route.handler({
|
|
92
|
+
queues: this.bullBoardQueues,
|
|
93
|
+
params,
|
|
94
|
+
query,
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
status: response.status || 200,
|
|
98
|
+
body: response.body
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.MidwayAdapter = MidwayAdapter;
|
|
103
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IMiddleware, IMidwayApplication, IMidwayContext, NextFunction } from '@midwayjs/core';
|
|
2
|
+
import * as bull from '@midwayjs/bull';
|
|
3
|
+
export declare class BoardMiddleware implements IMiddleware<IMidwayContext, NextFunction, unknown> {
|
|
4
|
+
framework: bull.Framework;
|
|
5
|
+
bullBoardConfig: {
|
|
6
|
+
basePath?: string;
|
|
7
|
+
adapterOptions?: any;
|
|
8
|
+
};
|
|
9
|
+
private basePath;
|
|
10
|
+
private serverAdapter;
|
|
11
|
+
init(): Promise<void>;
|
|
12
|
+
resolve(app: IMidwayApplication): (req: any, res: any, next: NextFunction) => Promise<any>;
|
|
13
|
+
static getName(): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=board.middleware.d.ts.map
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.BoardMiddleware = void 0;
|
|
13
|
+
const decorator_1 = require("@midwayjs/decorator");
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
const bull = require("@midwayjs/bull");
|
|
16
|
+
const api_1 = require("@bull-board/api");
|
|
17
|
+
const bullAdapter_1 = require("@bull-board/api/bullAdapter");
|
|
18
|
+
const adapter_1 = require("./adapter");
|
|
19
|
+
const MIME_MAP = {
|
|
20
|
+
'.html': 'text/html',
|
|
21
|
+
'.htm': 'text/html',
|
|
22
|
+
'.js': 'application/javascript',
|
|
23
|
+
'.css': 'text/css',
|
|
24
|
+
'.json': 'application/json',
|
|
25
|
+
'.png': 'image/png',
|
|
26
|
+
'.jpg': 'image/jpeg',
|
|
27
|
+
'.jpeg': 'image/jpeg',
|
|
28
|
+
'.gif': 'image/gif',
|
|
29
|
+
'.svg': 'image/svg+xml',
|
|
30
|
+
'.ico': 'image/x-icon',
|
|
31
|
+
'.ttf': 'application/x-font-ttf',
|
|
32
|
+
'.woff': 'application/font-woff',
|
|
33
|
+
'.woff2': 'application/font-woff2',
|
|
34
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
35
|
+
'.otf': 'application/x-font-opentype',
|
|
36
|
+
};
|
|
37
|
+
let BoardMiddleware = class BoardMiddleware {
|
|
38
|
+
async init() {
|
|
39
|
+
const queueList = this.framework.getQueueList();
|
|
40
|
+
const wrapQueues = queueList.map(queue => new bullAdapter_1.BullAdapter(queue));
|
|
41
|
+
this.basePath = this.bullBoardConfig.basePath;
|
|
42
|
+
this.serverAdapter = new adapter_1.MidwayAdapter();
|
|
43
|
+
(0, api_1.createBullBoard)({
|
|
44
|
+
queues: wrapQueues,
|
|
45
|
+
serverAdapter: this.serverAdapter,
|
|
46
|
+
});
|
|
47
|
+
this.serverAdapter.setBasePath(this.basePath);
|
|
48
|
+
}
|
|
49
|
+
resolve(app) {
|
|
50
|
+
if (app.getFrameworkType() === decorator_1.MidwayFrameworkType.WEB_EXPRESS) {
|
|
51
|
+
return async (req, res, next) => {
|
|
52
|
+
const pathname = req.path;
|
|
53
|
+
if (pathname.indexOf(this.basePath) === -1) {
|
|
54
|
+
return next();
|
|
55
|
+
}
|
|
56
|
+
const routePath = pathname.replace(this.basePath, '') || '/';
|
|
57
|
+
let content;
|
|
58
|
+
if (routePath.startsWith(this.serverAdapter.getStaticRoutes())) {
|
|
59
|
+
content = await this.serverAdapter.renderStatic(routePath);
|
|
60
|
+
}
|
|
61
|
+
else if (this.serverAdapter.getViewRoutes().indexOf(routePath) !== -1) {
|
|
62
|
+
content = await this.serverAdapter.renderView(routePath);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const matchRoute = this.serverAdapter.matchApiRoutes(req.method, routePath);
|
|
66
|
+
if (matchRoute) {
|
|
67
|
+
content = await this.serverAdapter.runAPI(matchRoute, req.params, req.query);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const ext = (0, path_1.extname)(pathname);
|
|
71
|
+
if (MIME_MAP[ext]) {
|
|
72
|
+
res.type(MIME_MAP[ext]);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
if (typeof content === 'object') {
|
|
76
|
+
res.type('application/json');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
res.type('text/html');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
res.send(content);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return async (ctx, next) => {
|
|
87
|
+
const pathname = ctx.path;
|
|
88
|
+
if (pathname.indexOf(this.basePath) === -1) {
|
|
89
|
+
return next();
|
|
90
|
+
}
|
|
91
|
+
const routePath = pathname.replace(this.basePath, '') || '/';
|
|
92
|
+
let content;
|
|
93
|
+
if (routePath.startsWith(this.serverAdapter.getStaticRoutes())) {
|
|
94
|
+
content = await this.serverAdapter.renderStatic(routePath);
|
|
95
|
+
}
|
|
96
|
+
else if (this.serverAdapter.getViewRoutes().indexOf(routePath) !== -1) {
|
|
97
|
+
content = await this.serverAdapter.renderView(routePath);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const matchRoute = this.serverAdapter.matchApiRoutes(ctx.method, routePath);
|
|
101
|
+
if (matchRoute) {
|
|
102
|
+
content = await this.serverAdapter.runAPI(matchRoute, ctx.params, ctx.query);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const ext = (0, path_1.extname)(pathname);
|
|
106
|
+
if (MIME_MAP[ext]) {
|
|
107
|
+
ctx.type = MIME_MAP[ext];
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
if (typeof content === 'object') {
|
|
111
|
+
ctx.type = 'application/json';
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
ctx.type = 'text/html';
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
ctx.body = content;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
static getName() {
|
|
122
|
+
return 'bull-board-ui';
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
__decorate([
|
|
126
|
+
(0, decorator_1.Inject)(),
|
|
127
|
+
__metadata("design:type", bull.Framework)
|
|
128
|
+
], BoardMiddleware.prototype, "framework", void 0);
|
|
129
|
+
__decorate([
|
|
130
|
+
(0, decorator_1.Config)('bullBoard'),
|
|
131
|
+
__metadata("design:type", Object)
|
|
132
|
+
], BoardMiddleware.prototype, "bullBoardConfig", void 0);
|
|
133
|
+
__decorate([
|
|
134
|
+
(0, decorator_1.Init)(),
|
|
135
|
+
__metadata("design:type", Function),
|
|
136
|
+
__metadata("design:paramtypes", []),
|
|
137
|
+
__metadata("design:returntype", Promise)
|
|
138
|
+
], BoardMiddleware.prototype, "init", null);
|
|
139
|
+
BoardMiddleware = __decorate([
|
|
140
|
+
(0, decorator_1.Provide)(),
|
|
141
|
+
(0, decorator_1.Scope)(decorator_1.ScopeEnum.Singleton)
|
|
142
|
+
], BoardMiddleware);
|
|
143
|
+
exports.BoardMiddleware = BoardMiddleware;
|
|
144
|
+
//# sourceMappingURL=board.middleware.js.map
|
package/dist/configuration.d.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { MidwayApplicationManager } from '@midwayjs/core';
|
|
1
|
+
import { MidwayApplicationManager, MidwayConfigService } from '@midwayjs/core';
|
|
3
2
|
export declare class BullBoardConfiguration {
|
|
4
|
-
framework: bull.Framework;
|
|
5
3
|
applicationManager: MidwayApplicationManager;
|
|
6
|
-
|
|
7
|
-
basePath?: string;
|
|
8
|
-
adapterOptions?: any;
|
|
9
|
-
};
|
|
4
|
+
configService: MidwayConfigService;
|
|
10
5
|
onReady(): Promise<void>;
|
|
11
6
|
}
|
|
12
7
|
//# sourceMappingURL=configuration.d.ts.map
|
package/dist/configuration.js
CHANGED
|
@@ -13,49 +13,25 @@ exports.BullBoardConfiguration = void 0;
|
|
|
13
13
|
const decorator_1 = require("@midwayjs/decorator");
|
|
14
14
|
const bull = require("@midwayjs/bull");
|
|
15
15
|
const core_1 = require("@midwayjs/core");
|
|
16
|
-
const
|
|
17
|
-
const bullAdapter_1 = require("@bull-board/api/bullAdapter");
|
|
18
|
-
const express_1 = require("@bull-board/express");
|
|
19
|
-
const koa_1 = require("@bull-board/koa");
|
|
16
|
+
const board_middleware_1 = require("./board.middleware");
|
|
20
17
|
let BullBoardConfiguration = class BullBoardConfiguration {
|
|
21
18
|
async onReady() {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (expressApp) {
|
|
27
|
-
const serverAdapter = new express_1.ExpressAdapter();
|
|
28
|
-
(0, api_1.createBullBoard)({
|
|
29
|
-
queues: wrapQueues,
|
|
30
|
-
serverAdapter,
|
|
19
|
+
const apps = this.applicationManager.getApplications(['express', 'egg', 'koa']);
|
|
20
|
+
if (apps.length) {
|
|
21
|
+
apps.forEach(app => {
|
|
22
|
+
app.useMiddleware(board_middleware_1.BoardMiddleware);
|
|
31
23
|
});
|
|
32
|
-
serverAdapter.setBasePath(basePath);
|
|
33
|
-
expressApp['originUse'](basePath, serverAdapter.getRouter());
|
|
34
|
-
}
|
|
35
|
-
const apps = this.applicationManager.getApplications(['egg', 'koa']);
|
|
36
|
-
for (const app of apps) {
|
|
37
|
-
const serverAdapter = new koa_1.KoaAdapter();
|
|
38
|
-
(0, api_1.createBullBoard)({
|
|
39
|
-
queues: wrapQueues,
|
|
40
|
-
serverAdapter,
|
|
41
|
-
});
|
|
42
|
-
serverAdapter.setBasePath(basePath);
|
|
43
|
-
await app.useMiddleware(serverAdapter.registerPlugin());
|
|
44
24
|
}
|
|
45
25
|
}
|
|
46
26
|
};
|
|
47
|
-
__decorate([
|
|
48
|
-
(0, decorator_1.Inject)(),
|
|
49
|
-
__metadata("design:type", bull.Framework)
|
|
50
|
-
], BullBoardConfiguration.prototype, "framework", void 0);
|
|
51
27
|
__decorate([
|
|
52
28
|
(0, decorator_1.Inject)(),
|
|
53
29
|
__metadata("design:type", core_1.MidwayApplicationManager)
|
|
54
30
|
], BullBoardConfiguration.prototype, "applicationManager", void 0);
|
|
55
31
|
__decorate([
|
|
56
|
-
(0, decorator_1.
|
|
57
|
-
__metadata("design:type",
|
|
58
|
-
], BullBoardConfiguration.prototype, "
|
|
32
|
+
(0, decorator_1.Inject)(),
|
|
33
|
+
__metadata("design:type", core_1.MidwayConfigService)
|
|
34
|
+
], BullBoardConfiguration.prototype, "configService", void 0);
|
|
59
35
|
BullBoardConfiguration = __decorate([
|
|
60
36
|
(0, decorator_1.Configuration)({
|
|
61
37
|
namespace: 'bull-board',
|
|
@@ -64,7 +40,7 @@ BullBoardConfiguration = __decorate([
|
|
|
64
40
|
{
|
|
65
41
|
default: {
|
|
66
42
|
bullBoard: {
|
|
67
|
-
basePath: 'ui',
|
|
43
|
+
basePath: '/ui',
|
|
68
44
|
adapterOptions: {
|
|
69
45
|
readOnlyMode: false,
|
|
70
46
|
},
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
17
|
exports.Configuration = void 0;
|
|
4
18
|
var configuration_1 = require("./configuration");
|
|
5
19
|
Object.defineProperty(exports, "Configuration", { enumerable: true, get: function () { return configuration_1.BullBoardConfiguration; } });
|
|
20
|
+
__exportStar(require("./board.middleware"), exports);
|
|
6
21
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midwayjs/bull-board",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "midway component for bull",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "index.d.ts",
|
|
@@ -26,13 +26,15 @@
|
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@midwayjs/core": "^3.4.13",
|
|
28
28
|
"@midwayjs/decorator": "^3.4.11",
|
|
29
|
+
"@midwayjs/koa": "^3.5.3",
|
|
30
|
+
"@midwayjs/express": "^3.5.3",
|
|
29
31
|
"@midwayjs/mock": "^3.4.13"
|
|
30
32
|
},
|
|
31
33
|
"dependencies": {
|
|
32
34
|
"@bull-board/api": "4.3.1",
|
|
33
|
-
"@bull-board/
|
|
34
|
-
"@bull
|
|
35
|
-
"
|
|
35
|
+
"@bull-board/ui": "4.3.1",
|
|
36
|
+
"@midwayjs/bull": "^3.0.3",
|
|
37
|
+
"ejs": "3.1.8"
|
|
36
38
|
},
|
|
37
39
|
"engines": {
|
|
38
40
|
"node": ">=12"
|