@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 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,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@qodalis/cli-server-logs" />
5
+ export * from './public-api';
@@ -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
+ }
@@ -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
+ }));