@qodalis/cli-server-logs 1.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/README.md +24 -0
- package/esm2022/lib/cli-server-logs.module.mjs +19 -0
- package/esm2022/lib/processors/cli-logs-command-processor.mjs +115 -0
- package/esm2022/public-api.mjs +5 -0
- package/esm2022/qodalis-cli-server-logs.mjs +5 -0
- package/fesm2022/qodalis-cli-server-logs.mjs +141 -0
- package/fesm2022/qodalis-cli-server-logs.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/cli-server-logs.module.d.ts +6 -0
- package/lib/processors/cli-logs-command-processor.d.ts +16 -0
- package/package.json +44 -0
- package/public-api.d.ts +1 -0
- package/umd/index.js +181 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# ServerLogs
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project server-logs` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project server-logs`.
|
|
8
|
+
> Note: Don't forget to add `--project server-logs` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build server-logs` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build server-logs`, go to the dist folder `cd dist/server-logs` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test server-logs` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { resolveCommandProcessorProvider } from '@qodalis/angular-cli';
|
|
3
|
+
import { CliLogsCommandProcessor } from './processors/cli-logs-command-processor';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class CliServerLogsModule {
|
|
6
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
7
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule }); }
|
|
8
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)] }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
declarations: [],
|
|
14
|
+
imports: [],
|
|
15
|
+
exports: [],
|
|
16
|
+
providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)],
|
|
17
|
+
}]
|
|
18
|
+
}] });
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXNlcnZlci1sb2dzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZlci1sb2dzL3NyYy9saWIvY2xpLXNlcnZlci1sb2dzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQVFsRixNQUFNLE9BQU8sbUJBQW1COytHQUFuQixtQkFBbUI7Z0hBQW5CLG1CQUFtQjtnSEFBbkIsbUJBQW1CLGFBRmpCLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQzs7NEZBRTVELG1CQUFtQjtrQkFOL0IsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsU0FBUyxFQUFFLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztpQkFDeEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbW1hbmRQcm9jZXNzb3JQcm92aWRlciB9IGZyb20gJ0Bxb2RhbGlzL2FuZ3VsYXItY2xpJztcbmltcG9ydCB7IENsaUxvZ3NDb21tYW5kUHJvY2Vzc29yIH0gZnJvbSAnLi9wcm9jZXNzb3JzL2NsaS1sb2dzLWNvbW1hbmQtcHJvY2Vzc29yJztcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtdLFxuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIHByb3ZpZGVyczogW3Jlc29sdmVDb21tYW5kUHJvY2Vzc29yUHJvdmlkZXIoQ2xpTG9nc0NvbW1hbmRQcm9jZXNzb3IpXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xpU2VydmVyTG9nc01vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as signalR from '@microsoft/signalr';
|
|
3
|
+
import { highlightTextWithBg, toQueryString, DefaultLibraryAuthor, } from '@qodalis/angular-cli';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
const levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];
|
|
6
|
+
export class CliLogsCommandProcessor {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.command = 'logs';
|
|
9
|
+
this.description = 'Show live logs';
|
|
10
|
+
this.processors = [];
|
|
11
|
+
this.parameters = [
|
|
12
|
+
{
|
|
13
|
+
name: 'pattern',
|
|
14
|
+
type: 'string',
|
|
15
|
+
description: 'The regex pattern to search for in the logs',
|
|
16
|
+
required: false,
|
|
17
|
+
validator: (value) => {
|
|
18
|
+
const isValid = this.isValidRegex(value);
|
|
19
|
+
return {
|
|
20
|
+
valid: isValid,
|
|
21
|
+
message: isValid
|
|
22
|
+
? undefined
|
|
23
|
+
: 'Invalid regex pattern provided',
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'level',
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'The log level to filter by, e.g. ' + levels.join(', '),
|
|
31
|
+
required: false,
|
|
32
|
+
validator: (value) => {
|
|
33
|
+
const isValid = levels.includes(value);
|
|
34
|
+
return {
|
|
35
|
+
valid: isValid,
|
|
36
|
+
message: isValid
|
|
37
|
+
? undefined
|
|
38
|
+
: 'Invalid log level provided, must be one of: ' +
|
|
39
|
+
levels.join(', '),
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
this.author = DefaultLibraryAuthor;
|
|
45
|
+
this.processors?.push({
|
|
46
|
+
command: 'live',
|
|
47
|
+
description: this.description,
|
|
48
|
+
parameters: this.parameters,
|
|
49
|
+
processCommand: this.processCommand.bind(this),
|
|
50
|
+
writeDescription: this.writeDescription.bind(this),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async processCommand(command, context) {
|
|
54
|
+
let qs = '?';
|
|
55
|
+
if (Object.keys(command.args).length > 0) {
|
|
56
|
+
qs += toQueryString(command.args);
|
|
57
|
+
}
|
|
58
|
+
this.hubConnection = new signalR.HubConnectionBuilder()
|
|
59
|
+
.withUrl('/loghub' + qs)
|
|
60
|
+
.build();
|
|
61
|
+
await this.hubConnection
|
|
62
|
+
.start()
|
|
63
|
+
.then(() => {
|
|
64
|
+
console.log('SignalR connection started');
|
|
65
|
+
context.writer.writeWarning('Connected to live logs');
|
|
66
|
+
if (qs.length) {
|
|
67
|
+
Object.keys(command.args).forEach((key) => {
|
|
68
|
+
context.writer.writeWarning(`Filtering logs by: ${key}=${command.args[key]}`);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
let firstLog = true;
|
|
72
|
+
let index = 0;
|
|
73
|
+
this.hubConnection.on('log', (log) => {
|
|
74
|
+
if (firstLog) {
|
|
75
|
+
context.writer.writeln('');
|
|
76
|
+
}
|
|
77
|
+
context.writer.writeln(`\x1b[33m${++index}\x1b[0m. ` +
|
|
78
|
+
(command.args['pattern']
|
|
79
|
+
? highlightTextWithBg(log, new RegExp(command.args['pattern'], 'g'))
|
|
80
|
+
: log));
|
|
81
|
+
firstLog = false;
|
|
82
|
+
});
|
|
83
|
+
const subscription = context.onAbort.subscribe(() => {
|
|
84
|
+
this.hubConnection.stop();
|
|
85
|
+
context.writer.writeWarning('Disconnected from live logs');
|
|
86
|
+
subscription.unsubscribe();
|
|
87
|
+
});
|
|
88
|
+
})
|
|
89
|
+
.catch((err) => {
|
|
90
|
+
console.error('Error starting SignalR connection:', err);
|
|
91
|
+
context.writer.writeError('Failed to connect to live logs');
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
writeDescription(context) {
|
|
95
|
+
context.writer.writeln('Show live logs');
|
|
96
|
+
}
|
|
97
|
+
isValidRegex(pattern) {
|
|
98
|
+
try {
|
|
99
|
+
new RegExp(pattern);
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
107
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, providedIn: 'root' }); }
|
|
108
|
+
}
|
|
109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, decorators: [{
|
|
110
|
+
type: Injectable,
|
|
111
|
+
args: [{
|
|
112
|
+
providedIn: 'root',
|
|
113
|
+
}]
|
|
114
|
+
}], ctorParameters: function () { return []; } });
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWxvZ3MtY29tbWFuZC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2ZXItbG9ncy9zcmMvbGliL3Byb2Nlc3NvcnMvY2xpLWxvZ3MtY29tbWFuZC1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFDSCxtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLG9CQUFvQixHQUN2QixNQUFNLHNCQUFzQixDQUFDOztBQVM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFLaEYsTUFBTSxPQUFPLHVCQUF1QjtJQStDaEM7UUE5Q0EsWUFBTyxHQUFHLE1BQU0sQ0FBQztRQUVqQixnQkFBVyxHQUF3QixnQkFBZ0IsQ0FBQztRQUVwRCxlQUFVLEdBQXdDLEVBQUUsQ0FBQztRQUVyRCxlQUFVLEdBQWtEO1lBQ3hEO2dCQUNJLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw2Q0FBNkM7Z0JBQzFELFFBQVEsRUFBRSxLQUFLO2dCQUNmLFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO29CQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QyxPQUFPO3dCQUNILEtBQUssRUFBRSxPQUFPO3dCQUNkLE9BQU8sRUFBRSxPQUFPOzRCQUNaLENBQUMsQ0FBQyxTQUFTOzRCQUNYLENBQUMsQ0FBQyxnQ0FBZ0M7cUJBQ3pDLENBQUM7Z0JBQ04sQ0FBQzthQUNKO1lBQ0Q7Z0JBQ0ksSUFBSSxFQUFFLE9BQU87Z0JB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QUFDLENBQ2pCLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFFM0QsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBNkI7UUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sWUFBWSxDQUFDLE9BQWU7UUFDaEMsSUFBSTtZQUNBLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQzsrR0FoSVEsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FGcEIsTUFBTTs7NEZBRVQsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIHNpZ25hbFIgZnJvbSAnQG1pY3Jvc29mdC9zaWduYWxyJztcbmltcG9ydCB7XG4gICAgaGlnaGxpZ2h0VGV4dFdpdGhCZyxcbiAgICB0b1F1ZXJ5U3RyaW5nLFxuICAgIERlZmF1bHRMaWJyYXJ5QXV0aG9yLFxufSBmcm9tICdAcW9kYWxpcy9hbmd1bGFyLWNsaSc7XG5pbXBvcnQge1xuICAgIENsaVByb2Nlc3NDb21tYW5kLFxuICAgIElDbGlDb21tYW5kQXV0aG9yLFxuICAgIElDbGlDb21tYW5kUGFyYW1ldGVyRGVzY3JpcHRvcixcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvcixcbiAgICBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuXG5jb25zdCBsZXZlbHMgPSBbJ3ZlcmJvc2UnLCAnZGVidWcnLCAnaW5mb3JtYXRpb24nLCAnd2FybmluZycsICdlcnJvcicsICdmYXRhbCddO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDbGlMb2dzQ29tbWFuZFByb2Nlc3NvciBpbXBsZW1lbnRzIElDbGlDb21tYW5kUHJvY2Vzc29yIHtcbiAgICBjb21tYW5kID0gJ2xvZ3MnO1xuXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQgPSAnU2hvdyBsaXZlIGxvZ3MnO1xuXG4gICAgcHJvY2Vzc29ycz86IElDbGlDb21tYW5kUHJvY2Vzc29yW10gfCB1bmRlZmluZWQgPSBbXTtcblxuICAgIHBhcmFtZXRlcnM/OiBJQ2xpQ29tbWFuZFBhcmFtZXRlckRlc2NyaXB0b3JbXSB8IHVuZGVmaW5lZCA9IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3BhdHRlcm4nLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSByZWdleCBwYXR0ZXJuIHRvIHNlYXJjaCBmb3IgaW4gdGhlIGxvZ3MnLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLmlzVmFsaWRSZWdleCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGlzVmFsaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGlzVmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdJbnZhbGlkIHJlZ2V4IHBhdHRlcm4gcHJvdmlkZWQnLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnbGV2ZWwnLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAnVGhlIGxvZyBsZXZlbCB0byBmaWx0ZXIgYnksIGUuZy4gJyArIGxldmVscy5qb2luKCcsICcpLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgdmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSBsZXZlbHMuaW5jbHVkZXModmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IGlzVmFsaWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGlzVmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdJbnZhbGlkIGxvZyBsZXZlbCBwcm92aWRlZCwgbXVzdCBiZSBvbmUgb2Y6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMuam9pbignLCAnKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICBdO1xuXG4gICAgYXV0aG9yPzogSUNsaUNvbW1hbmRBdXRob3IgfCB1bmRlZmluZWQgPSBEZWZhdWx0TGlicmFyeUF1dGhvcjtcblxuICAgIHByaXZhdGUgaHViQ29ubmVjdGlvbiE6IHNpZ25hbFIuSHViQ29ubmVjdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NvcnM/LnB1c2goe1xuICAgICAgICAgICAgY29tbWFuZDogJ2xpdmUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBwcm9jZXNzQ29tbWFuZDogdGhpcy5wcm9jZXNzQ29tbWFuZC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgd3JpdGVEZXNjcmlwdGlvbjogdGhpcy53cml0ZURlc2NyaXB0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NDb21tYW5kKFxuICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBxcyA9ICc/JztcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbW1hbmQuYXJncykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcXMgKz0gdG9RdWVyeVN0cmluZyhjb21tYW5kLmFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5odWJDb25uZWN0aW9uID0gbmV3IHNpZ25hbFIuSHViQ29ubmVjdGlvbkJ1aWxkZXIoKVxuICAgICAgICAgICAgLndpdGhVcmwoJy9sb2dodWInICsgcXMpXG4gICAgICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmh1YkNvbm5lY3Rpb25cbiAgICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpZ25hbFIgY29ubmVjdGlvbiBzdGFydGVkJyk7XG5cbiAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVdhcm5pbmcoJ0Nvbm5lY3RlZCB0byBsaXZlIGxvZ3MnKTtcbiAgICAgICAgICAgICAgICBpZiAocXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbW1hbmQuYXJncykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVdhcm5pbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEZpbHRlcmluZyBsb2dzIGJ5OiAke2tleX09JHtjb21tYW5kLmFyZ3Nba2V5XX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0TG9nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5odWJDb25uZWN0aW9uLm9uKCdsb2cnLCAobG9nOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TG9nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFx4MWJbMzNtJHsrK2luZGV4fVxceDFiWzBtLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tbWFuZC5hcmdzWydwYXR0ZXJuJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBoaWdobGlnaHRUZXh0V2l0aEJnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoY29tbWFuZC5hcmdzWydwYXR0ZXJuJ10sICdnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxvZyksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0TG9nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBjb250ZXh0Lm9uQWJvcnQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5odWJDb25uZWN0aW9uLnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVXYXJuaW5nKCdEaXNjb25uZWN0ZWQgZnJvbSBsaXZlIGxvZ3MnKTtcblxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIFNpZ25hbFIgY29ubmVjdGlvbjonLCBlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IHRvIGxpdmUgbG9ncycpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgd3JpdGVEZXNjcmlwdGlvbihjb250ZXh0OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IHZvaWQge1xuICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKCdTaG93IGxpdmUgbG9ncycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZFJlZ2V4KHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of server-logs
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/cli-server-logs.module';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NlcnZlci1sb2dzL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygc2VydmVyLWxvZ3NcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jbGktc2VydmVyLWxvZ3MubW9kdWxlJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW9kYWxpcy1jbGktc2VydmVyLWxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9zZXJ2ZXItbG9ncy9zcmMvcW9kYWxpcy1jbGktc2VydmVyLWxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
+
import { DefaultLibraryAuthor, toQueryString, highlightTextWithBg, resolveCommandProcessorProvider } from '@qodalis/angular-cli';
|
|
4
|
+
import * as signalR from '@microsoft/signalr';
|
|
5
|
+
|
|
6
|
+
const levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];
|
|
7
|
+
class CliLogsCommandProcessor {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.command = 'logs';
|
|
10
|
+
this.description = 'Show live logs';
|
|
11
|
+
this.processors = [];
|
|
12
|
+
this.parameters = [
|
|
13
|
+
{
|
|
14
|
+
name: 'pattern',
|
|
15
|
+
type: 'string',
|
|
16
|
+
description: 'The regex pattern to search for in the logs',
|
|
17
|
+
required: false,
|
|
18
|
+
validator: (value) => {
|
|
19
|
+
const isValid = this.isValidRegex(value);
|
|
20
|
+
return {
|
|
21
|
+
valid: isValid,
|
|
22
|
+
message: isValid
|
|
23
|
+
? undefined
|
|
24
|
+
: 'Invalid regex pattern provided',
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'level',
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'The log level to filter by, e.g. ' + levels.join(', '),
|
|
32
|
+
required: false,
|
|
33
|
+
validator: (value) => {
|
|
34
|
+
const isValid = levels.includes(value);
|
|
35
|
+
return {
|
|
36
|
+
valid: isValid,
|
|
37
|
+
message: isValid
|
|
38
|
+
? undefined
|
|
39
|
+
: 'Invalid log level provided, must be one of: ' +
|
|
40
|
+
levels.join(', '),
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
this.author = DefaultLibraryAuthor;
|
|
46
|
+
this.processors?.push({
|
|
47
|
+
command: 'live',
|
|
48
|
+
description: this.description,
|
|
49
|
+
parameters: this.parameters,
|
|
50
|
+
processCommand: this.processCommand.bind(this),
|
|
51
|
+
writeDescription: this.writeDescription.bind(this),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async processCommand(command, context) {
|
|
55
|
+
let qs = '?';
|
|
56
|
+
if (Object.keys(command.args).length > 0) {
|
|
57
|
+
qs += toQueryString(command.args);
|
|
58
|
+
}
|
|
59
|
+
this.hubConnection = new signalR.HubConnectionBuilder()
|
|
60
|
+
.withUrl('/loghub' + qs)
|
|
61
|
+
.build();
|
|
62
|
+
await this.hubConnection
|
|
63
|
+
.start()
|
|
64
|
+
.then(() => {
|
|
65
|
+
console.log('SignalR connection started');
|
|
66
|
+
context.writer.writeWarning('Connected to live logs');
|
|
67
|
+
if (qs.length) {
|
|
68
|
+
Object.keys(command.args).forEach((key) => {
|
|
69
|
+
context.writer.writeWarning(`Filtering logs by: ${key}=${command.args[key]}`);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
let firstLog = true;
|
|
73
|
+
let index = 0;
|
|
74
|
+
this.hubConnection.on('log', (log) => {
|
|
75
|
+
if (firstLog) {
|
|
76
|
+
context.writer.writeln('');
|
|
77
|
+
}
|
|
78
|
+
context.writer.writeln(`\x1b[33m${++index}\x1b[0m. ` +
|
|
79
|
+
(command.args['pattern']
|
|
80
|
+
? highlightTextWithBg(log, new RegExp(command.args['pattern'], 'g'))
|
|
81
|
+
: log));
|
|
82
|
+
firstLog = false;
|
|
83
|
+
});
|
|
84
|
+
const subscription = context.onAbort.subscribe(() => {
|
|
85
|
+
this.hubConnection.stop();
|
|
86
|
+
context.writer.writeWarning('Disconnected from live logs');
|
|
87
|
+
subscription.unsubscribe();
|
|
88
|
+
});
|
|
89
|
+
})
|
|
90
|
+
.catch((err) => {
|
|
91
|
+
console.error('Error starting SignalR connection:', err);
|
|
92
|
+
context.writer.writeError('Failed to connect to live logs');
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
writeDescription(context) {
|
|
96
|
+
context.writer.writeln('Show live logs');
|
|
97
|
+
}
|
|
98
|
+
isValidRegex(pattern) {
|
|
99
|
+
try {
|
|
100
|
+
new RegExp(pattern);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
108
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, providedIn: 'root' }); }
|
|
109
|
+
}
|
|
110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, decorators: [{
|
|
111
|
+
type: Injectable,
|
|
112
|
+
args: [{
|
|
113
|
+
providedIn: 'root',
|
|
114
|
+
}]
|
|
115
|
+
}], ctorParameters: function () { return []; } });
|
|
116
|
+
|
|
117
|
+
class CliServerLogsModule {
|
|
118
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
119
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule }); }
|
|
120
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)] }); }
|
|
121
|
+
}
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, decorators: [{
|
|
123
|
+
type: NgModule,
|
|
124
|
+
args: [{
|
|
125
|
+
declarations: [],
|
|
126
|
+
imports: [],
|
|
127
|
+
exports: [],
|
|
128
|
+
providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)],
|
|
129
|
+
}]
|
|
130
|
+
}] });
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
* Public API Surface of server-logs
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Generated bundle index. Do not edit.
|
|
138
|
+
*/
|
|
139
|
+
|
|
140
|
+
export { CliServerLogsModule };
|
|
141
|
+
//# sourceMappingURL=qodalis-cli-server-logs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qodalis-cli-server-logs.mjs","sources":["../../../projects/server-logs/src/lib/processors/cli-logs-command-processor.ts","../../../projects/server-logs/src/lib/cli-server-logs.module.ts","../../../projects/server-logs/src/public-api.ts","../../../projects/server-logs/src/qodalis-cli-server-logs.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as signalR from '@microsoft/signalr';\nimport {\n highlightTextWithBg,\n toQueryString,\n DefaultLibraryAuthor,\n} from '@qodalis/angular-cli';\nimport {\n CliProcessCommand,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\n\nconst levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CliLogsCommandProcessor implements ICliCommandProcessor {\n command = 'logs';\n\n description?: string | undefined = 'Show live logs';\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n parameters?: ICliCommandParameterDescriptor[] | undefined = [\n {\n name: 'pattern',\n type: 'string',\n description: 'The regex pattern to search for in the logs',\n required: false,\n validator: (value: string) => {\n const isValid = this.isValidRegex(value);\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid regex pattern provided',\n };\n },\n },\n {\n name: 'level',\n type: 'string',\n description:\n 'The log level to filter by, e.g. ' + levels.join(', '),\n required: false,\n validator: (value: string) => {\n const isValid = levels.includes(value);\n\n return {\n valid: isValid,\n message: isValid\n ? undefined\n : 'Invalid log level provided, must be one of: ' +\n levels.join(', '),\n };\n },\n },\n ];\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n private hubConnection!: signalR.HubConnection;\n\n constructor() {\n this.processors?.push({\n command: 'live',\n description: this.description,\n parameters: this.parameters,\n processCommand: this.processCommand.bind(this),\n writeDescription: this.writeDescription.bind(this),\n });\n }\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n let qs = '?';\n if (Object.keys(command.args).length > 0) {\n qs += toQueryString(command.args);\n }\n\n this.hubConnection = new signalR.HubConnectionBuilder()\n .withUrl('/loghub' + qs)\n .build();\n\n await this.hubConnection\n .start()\n .then(() => {\n console.log('SignalR connection started');\n\n context.writer.writeWarning('Connected to live logs');\n if (qs.length) {\n Object.keys(command.args).forEach((key) => {\n context.writer.writeWarning(\n `Filtering logs by: ${key}=${command.args[key]}`,\n );\n });\n }\n\n let firstLog = true;\n let index = 0;\n\n this.hubConnection.on('log', (log: string) => {\n if (firstLog) {\n context.writer.writeln('');\n }\n\n context.writer.writeln(\n `\\x1b[33m${++index}\\x1b[0m. ` +\n (command.args['pattern']\n ? highlightTextWithBg(\n log,\n new RegExp(command.args['pattern'], 'g'),\n )\n : log),\n );\n firstLog = false;\n });\n\n const subscription = context.onAbort.subscribe(() => {\n this.hubConnection.stop();\n context.writer.writeWarning('Disconnected from live logs');\n\n subscription.unsubscribe();\n });\n })\n .catch((err) => {\n console.error('Error starting SignalR connection:', err);\n context.writer.writeError('Failed to connect to live logs');\n });\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show live logs');\n }\n\n private isValidRegex(pattern: string): boolean {\n try {\n new RegExp(pattern);\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { resolveCommandProcessorProvider } from '@qodalis/angular-cli';\nimport { CliLogsCommandProcessor } from './processors/cli-logs-command-processor';\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: [],\n providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)],\n})\nexport class CliServerLogsModule {}\n","/*\n * Public API Surface of server-logs\n */\n\nexport * from './lib/cli-server-logs.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
export declare class CliServerLogsModule {
|
|
3
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CliServerLogsModule, never>;
|
|
4
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CliServerLogsModule, never, never, never>;
|
|
5
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<CliServerLogsModule>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CliProcessCommand, ICliCommandAuthor, ICliCommandParameterDescriptor, ICliCommandProcessor, ICliExecutionContext } from '@qodalis/cli-core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class CliLogsCommandProcessor implements ICliCommandProcessor {
|
|
4
|
+
command: string;
|
|
5
|
+
description?: string | undefined;
|
|
6
|
+
processors?: ICliCommandProcessor[] | undefined;
|
|
7
|
+
parameters?: ICliCommandParameterDescriptor[] | undefined;
|
|
8
|
+
author?: ICliCommandAuthor | undefined;
|
|
9
|
+
private hubConnection;
|
|
10
|
+
constructor();
|
|
11
|
+
processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
|
|
12
|
+
writeDescription(context: ICliExecutionContext): void;
|
|
13
|
+
private isValidRegex;
|
|
14
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CliLogsCommandProcessor, never>;
|
|
15
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CliLogsCommandProcessor>;
|
|
16
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qodalis/cli-server-logs",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "An Angular CLI extension for generating and validating GUIDs.",
|
|
5
|
+
"author": "Nicolae Lupei, Qodalis Solutions",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/qodalis-solutions/qodalis-angular-cli"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://qodalis.com",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"angular",
|
|
14
|
+
"cli",
|
|
15
|
+
"qodalis",
|
|
16
|
+
"terminal"
|
|
17
|
+
],
|
|
18
|
+
"umd": "./umd/index.js",
|
|
19
|
+
"unpkg": "./umd/index.js",
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"@angular/common": "^16.2.0",
|
|
22
|
+
"@angular/core": "^16.2.0"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"tslib": "^2.3.0",
|
|
26
|
+
"@qodalis/cli-core": "^0.0.1",
|
|
27
|
+
"@qodalis/angular-cli": "^1.0.10",
|
|
28
|
+
"@microsoft/signalr": "^8.0.7"
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"module": "fesm2022/qodalis-cli-server-logs.mjs",
|
|
32
|
+
"typings": "index.d.ts",
|
|
33
|
+
"exports": {
|
|
34
|
+
"./package.json": {
|
|
35
|
+
"default": "./package.json"
|
|
36
|
+
},
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./index.d.ts",
|
|
39
|
+
"esm2022": "./esm2022/qodalis-cli-server-logs.mjs",
|
|
40
|
+
"esm": "./esm2022/qodalis-cli-server-logs.mjs",
|
|
41
|
+
"default": "./fesm2022/qodalis-cli-server-logs.mjs"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/cli-server-logs.module';
|
package/umd/index.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('@angular/core'), require('@microsoft/signalr'), require('@qodalis/angular-cli')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['@angular/core', '@microsoft/signalr', '@qodalis/angular-cli'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.core, global.signalR, global.angularCli));
|
|
5
|
+
})(this, (function (core, signalR, angularCli) { 'use strict';
|
|
6
|
+
|
|
7
|
+
function _interopNamespaceDefault(e) {
|
|
8
|
+
var n = Object.create(null);
|
|
9
|
+
if (e) {
|
|
10
|
+
Object.keys(e).forEach(function (k) {
|
|
11
|
+
if (k !== 'default') {
|
|
12
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return e[k]; }
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
n.default = e;
|
|
21
|
+
return Object.freeze(n);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var signalR__namespace = /*#__PURE__*/_interopNamespaceDefault(signalR);
|
|
25
|
+
|
|
26
|
+
/******************************************************************************
|
|
27
|
+
Copyright (c) Microsoft Corporation.
|
|
28
|
+
|
|
29
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
30
|
+
purpose with or without fee is hereby granted.
|
|
31
|
+
|
|
32
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
33
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
34
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
35
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
36
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
37
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
38
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
39
|
+
***************************************************************************** */
|
|
40
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
function __decorate(decorators, target, key, desc) {
|
|
44
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
45
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
46
|
+
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;
|
|
47
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
51
|
+
var e = new Error(message);
|
|
52
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];
|
|
56
|
+
let CliLogsCommandProcessor = class CliLogsCommandProcessor {
|
|
57
|
+
constructor() {
|
|
58
|
+
this.command = 'logs';
|
|
59
|
+
this.description = 'Show live logs';
|
|
60
|
+
this.processors = [];
|
|
61
|
+
this.parameters = [
|
|
62
|
+
{
|
|
63
|
+
name: 'pattern',
|
|
64
|
+
type: 'string',
|
|
65
|
+
description: 'The regex pattern to search for in the logs',
|
|
66
|
+
required: false,
|
|
67
|
+
validator: (value) => {
|
|
68
|
+
const isValid = this.isValidRegex(value);
|
|
69
|
+
return {
|
|
70
|
+
valid: isValid,
|
|
71
|
+
message: isValid
|
|
72
|
+
? undefined
|
|
73
|
+
: 'Invalid regex pattern provided',
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'level',
|
|
79
|
+
type: 'string',
|
|
80
|
+
description: 'The log level to filter by, e.g. ' + levels.join(', '),
|
|
81
|
+
required: false,
|
|
82
|
+
validator: (value) => {
|
|
83
|
+
const isValid = levels.includes(value);
|
|
84
|
+
return {
|
|
85
|
+
valid: isValid,
|
|
86
|
+
message: isValid
|
|
87
|
+
? undefined
|
|
88
|
+
: 'Invalid log level provided, must be one of: ' +
|
|
89
|
+
levels.join(', '),
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
];
|
|
94
|
+
this.author = angularCli.DefaultLibraryAuthor;
|
|
95
|
+
this.processors?.push({
|
|
96
|
+
command: 'live',
|
|
97
|
+
description: this.description,
|
|
98
|
+
parameters: this.parameters,
|
|
99
|
+
processCommand: this.processCommand.bind(this),
|
|
100
|
+
writeDescription: this.writeDescription.bind(this),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async processCommand(command, context) {
|
|
104
|
+
let qs = '?';
|
|
105
|
+
if (Object.keys(command.args).length > 0) {
|
|
106
|
+
qs += angularCli.toQueryString(command.args);
|
|
107
|
+
}
|
|
108
|
+
this.hubConnection = new signalR__namespace.HubConnectionBuilder()
|
|
109
|
+
.withUrl('/loghub' + qs)
|
|
110
|
+
.build();
|
|
111
|
+
await this.hubConnection
|
|
112
|
+
.start()
|
|
113
|
+
.then(() => {
|
|
114
|
+
console.log('SignalR connection started');
|
|
115
|
+
context.writer.writeWarning('Connected to live logs');
|
|
116
|
+
if (qs.length) {
|
|
117
|
+
Object.keys(command.args).forEach((key) => {
|
|
118
|
+
context.writer.writeWarning(`Filtering logs by: ${key}=${command.args[key]}`);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
let firstLog = true;
|
|
122
|
+
let index = 0;
|
|
123
|
+
this.hubConnection.on('log', (log) => {
|
|
124
|
+
if (firstLog) {
|
|
125
|
+
context.writer.writeln('');
|
|
126
|
+
}
|
|
127
|
+
context.writer.writeln(`\x1b[33m${++index}\x1b[0m. ` +
|
|
128
|
+
(command.args['pattern']
|
|
129
|
+
? angularCli.highlightTextWithBg(log, new RegExp(command.args['pattern'], 'g'))
|
|
130
|
+
: log));
|
|
131
|
+
firstLog = false;
|
|
132
|
+
});
|
|
133
|
+
const subscription = context.onAbort.subscribe(() => {
|
|
134
|
+
this.hubConnection.stop();
|
|
135
|
+
context.writer.writeWarning('Disconnected from live logs');
|
|
136
|
+
subscription.unsubscribe();
|
|
137
|
+
});
|
|
138
|
+
})
|
|
139
|
+
.catch((err) => {
|
|
140
|
+
console.error('Error starting SignalR connection:', err);
|
|
141
|
+
context.writer.writeError('Failed to connect to live logs');
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
writeDescription(context) {
|
|
145
|
+
context.writer.writeln('Show live logs');
|
|
146
|
+
}
|
|
147
|
+
isValidRegex(pattern) {
|
|
148
|
+
try {
|
|
149
|
+
new RegExp(pattern);
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
CliLogsCommandProcessor = __decorate([
|
|
158
|
+
core.Injectable({
|
|
159
|
+
providedIn: 'root',
|
|
160
|
+
})
|
|
161
|
+
], CliLogsCommandProcessor);
|
|
162
|
+
|
|
163
|
+
if (typeof window !== 'undefined') {
|
|
164
|
+
const module = {
|
|
165
|
+
processors: [new CliLogsCommandProcessor()],
|
|
166
|
+
dependencies: [
|
|
167
|
+
{
|
|
168
|
+
name: 'signalR',
|
|
169
|
+
version: 'latest',
|
|
170
|
+
url: 'https://unpkg.com/@microsoft/signalr@8.0.7/dist/browser/signalr.js',
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
module.Injectable = () => { };
|
|
175
|
+
window['server-logs'] = module;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.log('window is undefined');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
}));
|