@qodalis/cli-server-plugin-admin 1.0.0-beta.1 → 1.0.0-beta.12
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/README.md +177 -0
- package/dashboard/assets/index-CThBrI8x.js +248 -0
- package/dashboard/assets/index-SAFC7f6i.css +32 -0
- package/dashboard/assets/wasm/qodalis_cli_wasm_bg.wasm +0 -0
- package/dashboard/index.html +14 -0
- package/dist/auth/auth-controller.d.ts +5 -1
- package/dist/auth/auth-controller.d.ts.map +1 -1
- package/dist/auth/auth-controller.js +35 -5
- package/dist/auth/auth-controller.js.map +1 -1
- package/dist/auth/auth-middleware.d.ts +2 -1
- package/dist/auth/auth-middleware.d.ts.map +1 -1
- package/dist/auth/auth-middleware.js +35 -1
- package/dist/auth/auth-middleware.js.map +1 -1
- package/dist/auth/auth-provider.d.ts +33 -0
- package/dist/auth/auth-provider.d.ts.map +1 -0
- package/dist/auth/auth-provider.js +16 -0
- package/dist/auth/auth-provider.js.map +1 -0
- package/dist/auth/jwt-service.d.ts +12 -2
- package/dist/auth/jwt-service.d.ts.map +1 -1
- package/dist/auth/jwt-service.js +11 -2
- package/dist/auth/jwt-service.js.map +1 -1
- package/dist/cli-admin-builder.d.ts +42 -9
- package/dist/cli-admin-builder.d.ts.map +1 -1
- package/dist/cli-admin-builder.js +71 -49
- package/dist/cli-admin-builder.js.map +1 -1
- package/dist/controllers/plugins-controller.d.ts.map +1 -1
- package/dist/controllers/plugins-controller.js +1 -2
- package/dist/controllers/plugins-controller.js.map +1 -1
- package/dist/controllers/status-controller.d.ts +1 -0
- package/dist/controllers/status-controller.d.ts.map +1 -1
- package/dist/controllers/status-controller.js.map +1 -1
- package/dist/controllers/ws-clients-controller.d.ts +1 -0
- package/dist/controllers/ws-clients-controller.d.ts.map +1 -1
- package/dist/controllers/ws-clients-controller.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/services/admin-config.d.ts +15 -3
- package/dist/services/admin-config.d.ts.map +1 -1
- package/dist/services/admin-config.js +15 -3
- package/dist/services/admin-config.js.map +1 -1
- package/dist/services/admin-theme.d.ts +31 -0
- package/dist/services/admin-theme.d.ts.map +1 -0
- package/dist/services/admin-theme.js +94 -0
- package/dist/services/admin-theme.js.map +1 -0
- package/dist/services/dashboard-dir.d.ts +10 -0
- package/dist/services/dashboard-dir.d.ts.map +1 -0
- package/dist/services/dashboard-dir.js +51 -0
- package/dist/services/dashboard-dir.js.map +1 -0
- package/dist/services/log-ring-buffer.d.ts +6 -0
- package/dist/services/log-ring-buffer.d.ts.map +1 -1
- package/dist/services/log-ring-buffer.js +13 -0
- package/dist/services/log-ring-buffer.js.map +1 -1
- package/dist/services/module-registry.d.ts +12 -7
- package/dist/services/module-registry.d.ts.map +1 -1
- package/dist/services/module-registry.js +22 -10
- package/dist/services/module-registry.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveDashboardDir = resolveDashboardDir;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
/**
|
|
7
|
+
* The plugin's package root: the nearest directory with a package.json,
|
|
8
|
+
* whether this code runs compiled (dist/) or from source (tsx, vitest).
|
|
9
|
+
*/
|
|
10
|
+
function findPackageRoot(moduleDir) {
|
|
11
|
+
let dir = (0, path_1.resolve)(moduleDir);
|
|
12
|
+
for (let i = 0; i < 3; i++) {
|
|
13
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(dir, 'package.json')))
|
|
14
|
+
return dir;
|
|
15
|
+
dir = (0, path_1.dirname)(dir);
|
|
16
|
+
}
|
|
17
|
+
return (0, path_1.resolve)(moduleDir);
|
|
18
|
+
}
|
|
19
|
+
function resolveNpmDashboard() {
|
|
20
|
+
try {
|
|
21
|
+
const pkgPath = require.resolve('@qodalis/cli-server-dashboard/package.json');
|
|
22
|
+
return (0, path_1.join)((0, path_1.dirname)(pkgPath), 'dist');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null; // Package not installed
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the dashboard dist directory. Looks for:
|
|
30
|
+
* 1. The explicitly set path
|
|
31
|
+
* 2. The sibling cli-server-dashboard repo (development), so a fresh build is served
|
|
32
|
+
* 3. The dashboard bundled into this package (copy-dashboard)
|
|
33
|
+
* 4. ../cli-server-dashboard/dist relative to the working directory
|
|
34
|
+
* 5. @qodalis/cli-server-dashboard/dist (npm package)
|
|
35
|
+
*/
|
|
36
|
+
function resolveDashboardDir(explicitDir, moduleDir = __dirname, cwd = process.cwd()) {
|
|
37
|
+
const root = findPackageRoot(moduleDir);
|
|
38
|
+
const candidates = [
|
|
39
|
+
explicitDir,
|
|
40
|
+
(0, path_1.resolve)(root, '..', '..', '..', 'cli-server-dashboard', 'dist'),
|
|
41
|
+
(0, path_1.join)(root, 'dashboard'),
|
|
42
|
+
(0, path_1.resolve)(cwd, '..', 'cli-server-dashboard', 'dist'),
|
|
43
|
+
resolveNpmDashboard(),
|
|
44
|
+
];
|
|
45
|
+
for (const dir of candidates) {
|
|
46
|
+
if (dir && (0, fs_1.existsSync)((0, path_1.join)(dir, 'index.html')))
|
|
47
|
+
return (0, path_1.resolve)(dir);
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=dashboard-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-dir.js","sourceRoot":"","sources":["../../services/dashboard-dir.ts"],"names":[],"mappings":";;AAiCA,kDAkBC;AAnDD,2BAAgC;AAChC,+BAA8C;AAE9C;;;GAGG;AACH,SAAS,eAAe,CAAC,SAAiB;IACtC,IAAI,GAAG,GAAG,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACtD,GAAG,GAAG,IAAA,cAAO,EAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB;IACxB,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAC9E,OAAO,IAAA,WAAI,EAAC,IAAA,cAAO,EAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC,CAAC,wBAAwB;IACzC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,mBAAmB,CAC/B,WAAoB,EACpB,YAAoB,SAAS,EAC7B,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG;QACf,WAAW;QACX,IAAA,cAAO,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,CAAC;QAC/D,IAAA,WAAI,EAAC,IAAI,EAAE,WAAW,CAAC;QACvB,IAAA,cAAO,EAAC,GAAG,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,CAAC;QAClD,mBAAmB,EAAE;KACxB,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO,IAAA,cAAO,EAAC,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Circular buffer capturing application logs for the admin dashboard.
|
|
3
3
|
*/
|
|
4
|
+
/** A single log entry captured by the ring buffer. */
|
|
4
5
|
export interface LogEntry {
|
|
5
6
|
timestamp: string;
|
|
6
7
|
level: 'INFO' | 'WARN' | 'ERROR' | 'DEBUG';
|
|
7
8
|
message: string;
|
|
8
9
|
source: string;
|
|
9
10
|
}
|
|
11
|
+
/** Filtering and pagination parameters for querying the log buffer. */
|
|
10
12
|
export interface LogQueryParams {
|
|
11
13
|
level?: string;
|
|
12
14
|
search?: string;
|
|
13
15
|
limit?: number;
|
|
14
16
|
offset?: number;
|
|
15
17
|
}
|
|
18
|
+
/** Result of a log buffer query, including matched entries and total count. */
|
|
16
19
|
export interface LogQueryResult {
|
|
17
20
|
entries: LogEntry[];
|
|
18
21
|
total: number;
|
|
19
22
|
}
|
|
23
|
+
/** Replaces values that look like secrets (see {@link SECRET_PATTERN}) with `[REDACTED]`. */
|
|
24
|
+
export declare function redactSecrets(message: string): string;
|
|
20
25
|
export declare class LogRingBuffer {
|
|
21
26
|
private readonly _buffer;
|
|
22
27
|
private readonly _capacity;
|
|
@@ -27,6 +32,7 @@ export declare class LogRingBuffer {
|
|
|
27
32
|
private _origWarn?;
|
|
28
33
|
private _origError?;
|
|
29
34
|
constructor(capacity?: number);
|
|
35
|
+
/** Set the function used to broadcast new log entries (e.g. via WebSocket). */
|
|
30
36
|
setBroadcastFn(fn: (message: Record<string, unknown>) => void): void;
|
|
31
37
|
/**
|
|
32
38
|
* Add a log entry to the buffer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-ring-buffer.d.ts","sourceRoot":"","sources":["../../services/log-ring-buffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAC,CAA6C;IAElE,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAsB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAuB;gBAE9B,QAAQ,SAAO;IAK3B,cAAc,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI;IAIpE;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"log-ring-buffer.d.ts","sourceRoot":"","sources":["../../services/log-ring-buffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACjB;AAQD,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAC,CAA6C;IAElE,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAsB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAuB;gBAE9B,QAAQ,SAAO;IAK3B,+EAA+E;IAC/E,cAAc,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI;IAIpE;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAkB3B;;OAEG;IACH,KAAK,CAAC,MAAM,GAAE,cAAmB,GAAG,cAAc;IAqBlD;;OAEG;IACH,OAAO,CAAC,MAAM;IAWd;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAoCxB;;OAEG;IACH,cAAc,IAAI,IAAI;CAKzB"}
|
|
@@ -4,6 +4,16 @@
|
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.LogRingBuffer = void 0;
|
|
7
|
+
exports.redactSecrets = redactSecrets;
|
|
8
|
+
/**
|
|
9
|
+
* Matches a secret written after a `password`/`secret`/`token` label
|
|
10
|
+
* (`password: x`, `token=x`, `password for user "root": x`).
|
|
11
|
+
*/
|
|
12
|
+
const SECRET_PATTERN = /\b((?:password|passwd|secret|token)\b(?:\s+for\s+user\s+"[^"]*")?\s*[:=]\s*)("[^"]*"|'[^']*'|\S+)/gi;
|
|
13
|
+
/** Replaces values that look like secrets (see {@link SECRET_PATTERN}) with `[REDACTED]`. */
|
|
14
|
+
function redactSecrets(message) {
|
|
15
|
+
return message.replace(SECRET_PATTERN, '$1[REDACTED]');
|
|
16
|
+
}
|
|
7
17
|
class LogRingBuffer {
|
|
8
18
|
_buffer;
|
|
9
19
|
_capacity;
|
|
@@ -17,6 +27,7 @@ class LogRingBuffer {
|
|
|
17
27
|
this._capacity = capacity;
|
|
18
28
|
this._buffer = new Array(capacity);
|
|
19
29
|
}
|
|
30
|
+
/** Set the function used to broadcast new log entries (e.g. via WebSocket). */
|
|
20
31
|
setBroadcastFn(fn) {
|
|
21
32
|
this._broadcastFn = fn;
|
|
22
33
|
}
|
|
@@ -24,6 +35,8 @@ class LogRingBuffer {
|
|
|
24
35
|
* Add a log entry to the buffer.
|
|
25
36
|
*/
|
|
26
37
|
push(entry) {
|
|
38
|
+
// Safety net: entries are served to the dashboard and broadcast to sockets
|
|
39
|
+
entry.message = redactSecrets(entry.message);
|
|
27
40
|
entry.level = entry.level.toUpperCase();
|
|
28
41
|
this._buffer[this._head] = entry;
|
|
29
42
|
this._head = (this._head + 1) % this._capacity;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-ring-buffer.js","sourceRoot":"","sources":["../../services/log-ring-buffer.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"log-ring-buffer.js","sourceRoot":"","sources":["../../services/log-ring-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ICliModule, ICliCommandProcessor } from '@qodalis/cli-server-abstractions';
|
|
1
|
+
import { ICliModule, ICliCommandProcessor, ICliProcessorFilter } from '@qodalis/cli-server-abstractions';
|
|
2
2
|
/**
|
|
3
3
|
* Provides information about a tracked module for the admin dashboard.
|
|
4
4
|
*/
|
|
@@ -30,24 +30,29 @@ export interface IBuilderLike {
|
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Tracks registered CLI modules and allows toggling them on/off.
|
|
33
|
+
* Implements {@link ICliProcessorFilter} to block execution of processors belonging to disabled modules.
|
|
33
34
|
*/
|
|
34
|
-
export declare class ModuleRegistry {
|
|
35
|
+
export declare class ModuleRegistry implements ICliProcessorFilter {
|
|
35
36
|
private readonly _tracked;
|
|
37
|
+
private readonly _processorToModuleId;
|
|
36
38
|
private readonly _registry;
|
|
37
39
|
private readonly _builder;
|
|
38
40
|
constructor(registry: IRegistryLike, builder: IBuilderLike);
|
|
41
|
+
/**
|
|
42
|
+
* Determines whether the given command processor is allowed to execute.
|
|
43
|
+
* Returns false when the processor belongs to a disabled module.
|
|
44
|
+
*/
|
|
45
|
+
isAllowed(processor: ICliCommandProcessor): boolean;
|
|
39
46
|
/**
|
|
40
47
|
* List all tracked modules with their current status.
|
|
41
48
|
*/
|
|
42
49
|
list(): ModuleInfo[];
|
|
43
50
|
/**
|
|
44
51
|
* Toggle a module's enabled/disabled state.
|
|
45
|
-
* When disabled,
|
|
46
|
-
* When enabled, they are re-registered.
|
|
52
|
+
* When disabled, processors are blocked at execution time via the filter.
|
|
53
|
+
* When enabled, they are re-registered if needed.
|
|
47
54
|
*/
|
|
48
|
-
toggle(id: string):
|
|
49
|
-
warning?: string;
|
|
50
|
-
}) | undefined;
|
|
55
|
+
toggle(id: string): ModuleInfo | undefined;
|
|
51
56
|
private moduleId;
|
|
52
57
|
private toInfo;
|
|
53
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-registry.d.ts","sourceRoot":"","sources":["../../services/module-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"module-registry.d.ts","sourceRoot":"","sources":["../../services/module-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEzG;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAQD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;;GAGG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA2C;IAChF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY;IAkB1D;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,oBAAoB,GAAG,OAAO;IAUnD;;OAEG;IACH,IAAI,IAAI,UAAU,EAAE;IAepB;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAgB1C,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;CAcjB"}
|
|
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ModuleRegistry = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Tracks registered CLI modules and allows toggling them on/off.
|
|
6
|
+
* Implements {@link ICliProcessorFilter} to block execution of processors belonging to disabled modules.
|
|
6
7
|
*/
|
|
7
8
|
class ModuleRegistry {
|
|
8
9
|
_tracked = new Map();
|
|
10
|
+
_processorToModuleId = new Map();
|
|
9
11
|
_registry;
|
|
10
12
|
_builder;
|
|
11
13
|
constructor(registry, builder) {
|
|
@@ -19,7 +21,23 @@ class ModuleRegistry {
|
|
|
19
21
|
enabled: true,
|
|
20
22
|
processors: [...mod.processors],
|
|
21
23
|
});
|
|
24
|
+
for (const processor of mod.processors) {
|
|
25
|
+
this._processorToModuleId.set(processor, id);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Determines whether the given command processor is allowed to execute.
|
|
31
|
+
* Returns false when the processor belongs to a disabled module.
|
|
32
|
+
*/
|
|
33
|
+
isAllowed(processor) {
|
|
34
|
+
const moduleId = this._processorToModuleId.get(processor);
|
|
35
|
+
if (!moduleId) {
|
|
36
|
+
// Processor is not part of any tracked module — allow by default
|
|
37
|
+
return true;
|
|
22
38
|
}
|
|
39
|
+
const tracked = this._tracked.get(moduleId);
|
|
40
|
+
return tracked ? tracked.enabled : true;
|
|
23
41
|
}
|
|
24
42
|
/**
|
|
25
43
|
* List all tracked modules with their current status.
|
|
@@ -40,27 +58,21 @@ class ModuleRegistry {
|
|
|
40
58
|
}
|
|
41
59
|
/**
|
|
42
60
|
* Toggle a module's enabled/disabled state.
|
|
43
|
-
* When disabled,
|
|
44
|
-
* When enabled, they are re-registered.
|
|
61
|
+
* When disabled, processors are blocked at execution time via the filter.
|
|
62
|
+
* When enabled, they are re-registered if needed.
|
|
45
63
|
*/
|
|
46
64
|
toggle(id) {
|
|
47
65
|
const tracked = this._tracked.get(id);
|
|
48
66
|
if (!tracked)
|
|
49
67
|
return undefined;
|
|
50
68
|
tracked.enabled = !tracked.enabled;
|
|
51
|
-
let warning;
|
|
52
69
|
if (tracked.enabled) {
|
|
53
|
-
// Re-register processors
|
|
70
|
+
// Re-register processors in case they were removed
|
|
54
71
|
for (const processor of tracked.processors) {
|
|
55
72
|
this._registry.register(processor);
|
|
56
73
|
}
|
|
57
74
|
}
|
|
58
|
-
|
|
59
|
-
// We can't "unregister" from the current CliCommandRegistry directly
|
|
60
|
-
// since it only has register(). We track the state but processors remain active.
|
|
61
|
-
warning = 'Module state tracked but command unregistration is not yet supported. Processors remain active.';
|
|
62
|
-
}
|
|
63
|
-
return { ...this.toInfo(tracked), warning };
|
|
75
|
+
return this.toInfo(tracked);
|
|
64
76
|
}
|
|
65
77
|
moduleId(mod) {
|
|
66
78
|
return mod.name.toLowerCase().replace(/\s+/g, '-');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-registry.js","sourceRoot":"","sources":["../../services/module-registry.ts"],"names":[],"mappings":";;;AAwCA
|
|
1
|
+
{"version":3,"file":"module-registry.js","sourceRoot":"","sources":["../../services/module-registry.ts"],"names":[],"mappings":"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"}
|