@qodalis/cli-server-logs 1.0.7 → 2.0.0-beta.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/package.json +16 -31
- package/public-api.d.mts +22 -0
- package/public-api.d.ts +22 -1
- package/public-api.js +265 -0
- package/public-api.js.map +1 -0
- package/public-api.mjs +262 -0
- package/public-api.mjs.map +1 -0
- package/umd/cli-entrypoint.global.js +2941 -0
- package/README.md +0 -33
- package/esm2022/lib/cli-server-logs.module.mjs +0 -19
- package/esm2022/lib/processors/cli-logs-command-processor.mjs +0 -171
- package/esm2022/lib/version.mjs +0 -3
- package/esm2022/public-api.mjs +0 -5
- package/esm2022/qodalis-cli-server-logs.mjs +0 -5
- package/fesm2022/qodalis-cli-server-logs.mjs +0 -200
- package/fesm2022/qodalis-cli-server-logs.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/cli-server-logs.module.d.ts +0 -6
- package/lib/processors/cli-logs-command-processor.d.ts +0 -19
- package/lib/version.d.ts +0 -1
- package/umd/index.js +0 -226
package/README.md
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Cli extension
|
|
2
|
-
|
|
3
|
-
The `@qodalis/cli-server-logs` package is a CLI extension designed to provide seamless server log management and analysis capabilities for the Qodalis CLI.
|
|
4
|
-
|
|
5
|
-
# Features
|
|
6
|
-
|
|
7
|
-
View Logs: Fetch and display server logs directly in the CLI.
|
|
8
|
-
Filter Logs: Apply filters based on date, severity, or keywords.
|
|
9
|
-
Download Logs: Download logs to a local file for further analysis.
|
|
10
|
-
Integration: Integrates seamlessly with Qodalis CLI for server monitoring.
|
|
11
|
-
|
|
12
|
-
# Installation
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
packages add @qodalis/cli-server-logs
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
This command downloads and registers the extension for use within the CLI environment.
|
|
19
|
-
|
|
20
|
-
# Usage
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
server-logs live
|
|
24
|
-
server-logs live --level=error
|
|
25
|
-
server-logs live --file # on Ctrl + C the logs are downloaded in a file
|
|
26
|
-
server-logs live --pattern=text-to-search # supports regex
|
|
27
|
-
|
|
28
|
-
server-logs --help # for more options
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
# Dependencies
|
|
32
|
-
|
|
33
|
-
This extension is dependent on a server which use signalR as a transport layer.
|
|
@@ -1,19 +0,0 @@
|
|
|
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
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as signalR from '@microsoft/signalr';
|
|
3
|
-
import { CliForegroundColor, DefaultLibraryAuthor, highlightTextWithBg, toQueryString, } from '@qodalis/cli-core';
|
|
4
|
-
import { LIBRARY_VERSION } from '../version';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];
|
|
7
|
-
export class CliLogsCommandProcessor {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.command = 'server-logs';
|
|
10
|
-
this.description = 'Show live logs';
|
|
11
|
-
this.processors = [];
|
|
12
|
-
this.metadata = {
|
|
13
|
-
requireServer: true,
|
|
14
|
-
icon: '📜',
|
|
15
|
-
};
|
|
16
|
-
this.parameters = [
|
|
17
|
-
{
|
|
18
|
-
name: 'pattern',
|
|
19
|
-
type: 'string',
|
|
20
|
-
description: 'The regex pattern to search for in the logs',
|
|
21
|
-
required: false,
|
|
22
|
-
validator: (value) => {
|
|
23
|
-
const isValid = this.isValidRegex(value);
|
|
24
|
-
return {
|
|
25
|
-
valid: isValid,
|
|
26
|
-
message: isValid
|
|
27
|
-
? undefined
|
|
28
|
-
: 'Invalid regex pattern provided',
|
|
29
|
-
};
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: 'level',
|
|
34
|
-
type: 'string',
|
|
35
|
-
description: 'The log level to filter by, e.g. ' + levels.join(', '),
|
|
36
|
-
required: false,
|
|
37
|
-
validator: (value) => {
|
|
38
|
-
const isValid = levels.includes(value);
|
|
39
|
-
return {
|
|
40
|
-
valid: isValid,
|
|
41
|
-
message: isValid
|
|
42
|
-
? undefined
|
|
43
|
-
: 'Invalid log level provided, must be one of: ' +
|
|
44
|
-
levels.join(', '),
|
|
45
|
-
};
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
name: 'server',
|
|
50
|
-
type: 'string',
|
|
51
|
-
description: 'The server to connect to, e.g. "http://localhost:5000"',
|
|
52
|
-
required: false,
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
name: 'hub',
|
|
56
|
-
type: 'string',
|
|
57
|
-
description: 'The hub to connect to, e.g. "loghub" (default) or "loghub2"',
|
|
58
|
-
required: false,
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: 'file',
|
|
62
|
-
type: 'boolean',
|
|
63
|
-
description: 'Export logs to a file',
|
|
64
|
-
required: false,
|
|
65
|
-
},
|
|
66
|
-
];
|
|
67
|
-
this.author = DefaultLibraryAuthor;
|
|
68
|
-
this.version = LIBRARY_VERSION;
|
|
69
|
-
this.processors?.push({
|
|
70
|
-
command: 'live',
|
|
71
|
-
description: this.description,
|
|
72
|
-
parameters: this.parameters,
|
|
73
|
-
processCommand: this.processCommand.bind(this),
|
|
74
|
-
writeDescription: this.writeDescription.bind(this),
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
async processCommand(command, context) {
|
|
78
|
-
let qs = '?';
|
|
79
|
-
const args = this.excludeKeys(command.args, ['server', 'hub', 'file']);
|
|
80
|
-
if (Object.keys(args).length > 0) {
|
|
81
|
-
qs += toQueryString(args);
|
|
82
|
-
}
|
|
83
|
-
const hub = command.args['hub'] || 'loghub';
|
|
84
|
-
let server = command.args['server'] || '';
|
|
85
|
-
server = server.replace(/\/+$/, '');
|
|
86
|
-
const url = `${server}/${hub}${qs}`;
|
|
87
|
-
console.log('Connecting to:', url);
|
|
88
|
-
this.hubConnection = new signalR.HubConnectionBuilder()
|
|
89
|
-
.withUrl(url)
|
|
90
|
-
.build();
|
|
91
|
-
const buffer = [];
|
|
92
|
-
await this.hubConnection
|
|
93
|
-
.start()
|
|
94
|
-
.then(() => {
|
|
95
|
-
console.log('SignalR connection started');
|
|
96
|
-
context.writer.writeWarning('Connected to live logs');
|
|
97
|
-
if (qs.length) {
|
|
98
|
-
Object.keys(args).forEach((key) => {
|
|
99
|
-
context.writer.writeWarning(`Filtering logs by: ${key}=${command.args[key]}`);
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
let firstLog = true;
|
|
103
|
-
let index = 0;
|
|
104
|
-
this.hubConnection.on('log', (log) => {
|
|
105
|
-
if (firstLog) {
|
|
106
|
-
context.writer.writeln();
|
|
107
|
-
}
|
|
108
|
-
buffer.push(log);
|
|
109
|
-
context.writer.writeln(`\x1b[33m${++index}\x1b[0m. ` +
|
|
110
|
-
(command.args['pattern']
|
|
111
|
-
? highlightTextWithBg(log, new RegExp(command.args['pattern'], 'g'))
|
|
112
|
-
: log));
|
|
113
|
-
firstLog = false;
|
|
114
|
-
});
|
|
115
|
-
const subscription = context.onAbort.subscribe(() => {
|
|
116
|
-
this.hubConnection.stop();
|
|
117
|
-
context.writer.writeWarning('Disconnected from live logs');
|
|
118
|
-
if (command.args['file']) {
|
|
119
|
-
const filename = `logs-${new Date().toISOString()}.txt`;
|
|
120
|
-
context.writer.writeToFile(filename, buffer.join('\n'));
|
|
121
|
-
}
|
|
122
|
-
subscription.unsubscribe();
|
|
123
|
-
});
|
|
124
|
-
})
|
|
125
|
-
.catch((err) => {
|
|
126
|
-
console.error('Error starting SignalR connection:', err);
|
|
127
|
-
context.writer.writeError('Failed to connect to live logs');
|
|
128
|
-
context.writer.writeError(err?.toString());
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
writeDescription(context) {
|
|
132
|
-
const { writer } = context;
|
|
133
|
-
writer.writeln('Stream live server logs via SignalR');
|
|
134
|
-
writer.writeln();
|
|
135
|
-
writer.writeln('📋 Usage:');
|
|
136
|
-
writer.writeln(` ${writer.wrapInColor('server-logs', CliForegroundColor.Cyan)} Start streaming`);
|
|
137
|
-
writer.writeln(` ${writer.wrapInColor('server-logs --level=error', CliForegroundColor.Cyan)} Filter by level`);
|
|
138
|
-
writer.writeln(` ${writer.wrapInColor('server-logs --pattern="Exception"', CliForegroundColor.Cyan)} Filter by regex`);
|
|
139
|
-
writer.writeln(` ${writer.wrapInColor('server-logs --server=http://localhost:5000', CliForegroundColor.Cyan)} Custom server`);
|
|
140
|
-
writer.writeln();
|
|
141
|
-
writer.writeln(`⚙️ Options:`);
|
|
142
|
-
writer.writeln(` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`);
|
|
143
|
-
writer.writeln(` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`);
|
|
144
|
-
writer.writeln(` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server URL to connect to`);
|
|
145
|
-
writer.writeln(` ${writer.wrapInColor('--hub', CliForegroundColor.Yellow)} Hub name (default: loghub)`);
|
|
146
|
-
writer.writeln(` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`);
|
|
147
|
-
writer.writeln();
|
|
148
|
-
writer.writeln(`💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`);
|
|
149
|
-
}
|
|
150
|
-
excludeKeys(record, keysToExclude) {
|
|
151
|
-
return Object.fromEntries(Object.entries(record).filter(([key]) => !keysToExclude.includes(key)));
|
|
152
|
-
}
|
|
153
|
-
isValidRegex(pattern) {
|
|
154
|
-
try {
|
|
155
|
-
new RegExp(pattern);
|
|
156
|
-
return true;
|
|
157
|
-
}
|
|
158
|
-
catch (e) {
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
163
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, providedIn: 'root' }); }
|
|
164
|
-
}
|
|
165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, decorators: [{
|
|
166
|
-
type: Injectable,
|
|
167
|
-
args: [{
|
|
168
|
-
providedIn: 'root',
|
|
169
|
-
}]
|
|
170
|
-
}], ctorParameters: function () { return []; } });
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWxvZ3MtY29tbWFuZC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZXJ2ZXItbG9ncy9zcmMvbGliL3Byb2Nlc3NvcnMvY2xpLWxvZ3MtY29tbWFuZC1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssT0FBTyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFDSCxrQkFBa0IsRUFHbEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUtuQixhQUFhLEdBQ2hCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFFN0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBS2hGLE1BQU0sT0FBTyx1QkFBdUI7SUEwRWhDO1FBekVBLFlBQU8sR0FBRyxhQUFhLENBQUM7UUFFeEIsZ0JBQVcsR0FBd0IsZ0JBQWdCLENBQUM7UUFFcEQsZUFBVSxHQUF3QyxFQUFFLENBQUM7UUFFckQsYUFBUSxHQUFzQztZQUMxQyxhQUFhLEVBQUUsSUFBSTtZQUNuQixJQUFJLEVBQUUsSUFBSTtTQUNiLENBQUM7UUFFRixlQUFVLEdBQWtEO1lBQ3hEO2dCQUNJLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw2Q0FBNkM7Z0JBQzFELFFBQVEsRUFBRSxLQUFLO2dCQUNmLFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO29CQUN6QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QyxPQUFPO3dCQUNILEtBQUssRUFBRSxPQUFP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LENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQztRQUN6SCxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFTyxXQUFXLENBQ2YsTUFBUyxFQUNULGFBQXVCO1FBRXZCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQ3pCLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUMxQyxDQUNVLENBQUM7SUFDcEIsQ0FBQztJQUVPLFlBQVksQ0FBQyxPQUFlO1FBQ2hDLElBQUk7WUFDQSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQztTQUNmO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7K0dBNU1RLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRnBCLE1BQU07OzRGQUVULHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgKiBhcyBzaWduYWxSIGZyb20gJ0BtaWNyb3NvZnQvc2lnbmFscic7XG5pbXBvcnQge1xuICAgIENsaUZvcmVncm91bmRDb2xvcixcbiAgICBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICBDbGlQcm9jZXNzb3JNZXRhZGF0YSxcbiAgICBEZWZhdWx0TGlicmFyeUF1dGhvcixcbiAgICBoaWdobGlnaHRUZXh0V2l0aEJnLFxuICAgIElDbGlDb21tYW5kQXV0aG9yLFxuICAgIElDbGlDb21tYW5kUGFyYW1ldGVyRGVzY3JpcHRvcixcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvcixcbiAgICBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICB0b1F1ZXJ5U3RyaW5nLFxufSBmcm9tICdAcW9kYWxpcy9jbGktY29yZSc7XG5pbXBvcnQgeyBMSUJSQVJZX1ZFUlNJT04gfSBmcm9tICcuLi92ZXJzaW9uJztcblxuY29uc3QgbGV2ZWxzID0gWyd2ZXJib3NlJywgJ2RlYnVnJywgJ2luZm9ybWF0aW9uJywgJ3dhcm5pbmcnLCAnZXJyb3InLCAnZmF0YWwnXTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ2xpTG9nc0NvbW1hbmRQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ2xpQ29tbWFuZFByb2Nlc3NvciB7XG4gICAgY29tbWFuZCA9ICdzZXJ2ZXItbG9ncyc7XG5cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IHVuZGVmaW5lZCA9ICdTaG93IGxpdmUgbG9ncyc7XG5cbiAgICBwcm9jZXNzb3JzPzogSUNsaUNvbW1hbmRQcm9jZXNzb3JbXSB8IHVuZGVmaW5lZCA9IFtdO1xuXG4gICAgbWV0YWRhdGE/OiBDbGlQcm9jZXNzb3JNZXRhZGF0YSB8IHVuZGVmaW5lZCA9IHtcbiAgICAgICAgcmVxdWlyZVNlcnZlcjogdHJ1ZSxcbiAgICAgICAgaWNvbjogJ/Cfk5wnLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzPzogSUNsaUNvbW1hbmRQYXJhbWV0ZXJEZXNjcmlwdG9yW10gfCB1bmRlZmluZWQgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdwYXR0ZXJuJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcmVnZXggcGF0dGVybiB0byBzZWFyY2ggZm9yIGluIHRoZSBsb2dzJyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy5pc1ZhbGlkUmVnZXgodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBpc1ZhbGlkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpc1ZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnSW52YWxpZCByZWdleCBwYXR0ZXJuIHByb3ZpZGVkJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2xldmVsJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgJ1RoZSBsb2cgbGV2ZWwgdG8gZmlsdGVyIGJ5LCBlLmcuICcgKyBsZXZlbHMuam9pbignLCAnKSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gbGV2ZWxzLmluY2x1ZGVzKHZhbHVlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiBpc1ZhbGlkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpc1ZhbGlkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnSW52YWxpZCBsb2cgbGV2ZWwgcHJvdmlkZWQsIG11c3QgYmUgb25lIG9mOiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLmpvaW4oJywgJyksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAnVGhlIHNlcnZlciB0byBjb25uZWN0IHRvLCBlLmcuIFwiaHR0cDovL2xvY2FsaG9zdDo1MDAwXCInLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnaHViJyxcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgJ1RoZSBodWIgdG8gY29ubmVjdCB0bywgZS5nLiBcImxvZ2h1YlwiIChkZWZhdWx0KSBvciBcImxvZ2h1YjJcIicsXG4gICAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdmaWxlJyxcbiAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRXhwb3J0IGxvZ3MgdG8gYSBmaWxlJyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICBdO1xuXG4gICAgYXV0aG9yPzogSUNsaUNvbW1hbmRBdXRob3IgfCB1bmRlZmluZWQgPSBEZWZhdWx0TGlicmFyeUF1dGhvcjtcblxuICAgIHZlcnNpb24gPSBMSUJSQVJZX1ZFUlNJT047XG5cbiAgICBwcml2YXRlIGh1YkNvbm5lY3Rpb24hOiBzaWduYWxSLkh1YkNvbm5lY3Rpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzb3JzPy5wdXNoKHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdsaXZlJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgcHJvY2Vzc0NvbW1hbmQ6IHRoaXMucHJvY2Vzc0NvbW1hbmQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHdyaXRlRGVzY3JpcHRpb246IHRoaXMud3JpdGVEZXNjcmlwdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBwcm9jZXNzQ29tbWFuZChcbiAgICAgICAgY29tbWFuZDogQ2xpUHJvY2Vzc0NvbW1hbmQsXG4gICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgcXMgPSAnPyc7XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuZXhjbHVkZUtleXMoY29tbWFuZC5hcmdzLCBbJ3NlcnZlcicsICdodWInLCAnZmlsZSddKTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYXJncykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcXMgKz0gdG9RdWVyeVN0cmluZyhhcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh1YiA9IGNvbW1hbmQuYXJnc1snaHViJ10gfHwgJ2xvZ2h1Yic7XG5cbiAgICAgICAgbGV0IHNlcnZlciA9IGNvbW1hbmQuYXJnc1snc2VydmVyJ10gfHwgJyc7XG4gICAgICAgIHNlcnZlciA9IHNlcnZlci5yZXBsYWNlKC9cXC8rJC8sICcnKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtzZXJ2ZXJ9LyR7aHVifSR7cXN9YDtcblxuICAgICAgICBjb25zb2xlLmxvZygnQ29ubmVjdGluZyB0bzonLCB1cmwpO1xuXG4gICAgICAgIHRoaXMuaHViQ29ubmVjdGlvbiA9IG5ldyBzaWduYWxSLkh1YkNvbm5lY3Rpb25CdWlsZGVyKClcbiAgICAgICAgICAgIC53aXRoVXJsKHVybClcbiAgICAgICAgICAgIC5idWlsZCgpO1xuXG4gICAgICAgIGNvbnN0IGJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBhd2FpdCB0aGlzLmh1YkNvbm5lY3Rpb25cbiAgICAgICAgICAgIC5zdGFydCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1NpZ25hbFIgY29ubmVjdGlvbiBzdGFydGVkJyk7XG5cbiAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZVdhcm5pbmcoJ0Nvbm5lY3RlZCB0byBsaXZlIGxvZ3MnKTtcbiAgICAgICAgICAgICAgICBpZiAocXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGFyZ3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVXYXJuaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBGaWx0ZXJpbmcgbG9ncyBieTogJHtrZXl9PSR7Y29tbWFuZC5hcmdzW2tleV19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBmaXJzdExvZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIHRoaXMuaHViQ29ubmVjdGlvbi5vbignbG9nJywgKGxvZzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdExvZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVsbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2gobG9nKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LndyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFxceDFiWzMzbSR7KytpbmRleH1cXHgxYlswbS4gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbW1hbmQuYXJnc1sncGF0dGVybiddXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaGlnaGxpZ2h0VGV4dFdpdGhCZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGNvbW1hbmQuYXJnc1sncGF0dGVybiddLCAnZycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsb2cpLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBmaXJzdExvZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY29udGV4dC5vbkFib3J0LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaHViQ29ubmVjdGlvbi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlV2FybmluZygnRGlzY29ubmVjdGVkIGZyb20gbGl2ZSBsb2dzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuYXJnc1snZmlsZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGBsb2dzLSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfS50eHRgO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC53cml0ZXIud3JpdGVUb0ZpbGUoZmlsZW5hbWUsIGJ1ZmZlci5qb2luKCdcXG4nKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN0YXJ0aW5nIFNpZ25hbFIgY29ubmVjdGlvbjonLCBlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IHRvIGxpdmUgbG9ncycpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlRXJyb3IoZXJyPy50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHdyaXRlRGVzY3JpcHRpb24oY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB3cml0ZXIgfSA9IGNvbnRleHQ7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKCdTdHJlYW0gbGl2ZSBzZXJ2ZXIgbG9ncyB2aWEgU2lnbmFsUicpO1xuICAgICAgICB3cml0ZXIud3JpdGVsbigpO1xuICAgICAgICB3cml0ZXIud3JpdGVsbign8J+TiyBVc2FnZTonKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3NlcnZlci1sb2dzJywgQ2xpRm9yZWdyb3VuZENvbG9yLkN5YW4pfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydCBzdHJlYW1pbmdgKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJ3NlcnZlci1sb2dzIC0tbGV2ZWw9ZXJyb3InLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9ICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyIGJ5IGxldmVsYCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzZXJ2ZXItbG9ncyAtLXBhdHRlcm49XCJFeGNlcHRpb25cIicsIENsaUZvcmVncm91bmRDb2xvci5DeWFuKX0gICAgICAgICAgICAgICAgRmlsdGVyIGJ5IHJlZ2V4YCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCdzZXJ2ZXItbG9ncyAtLXNlcnZlcj1odHRwOi8vbG9jYWxob3N0OjUwMDAnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9ICAgICAgIEN1c3RvbSBzZXJ2ZXJgKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYOKame+4jyAgT3B0aW9uczpgKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYCAgJHt3cml0ZXIud3JhcEluQ29sb3IoJy0tbGV2ZWwnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0gICAgICBMb2cgbGV2ZWw6IHZlcmJvc2UsIGRlYnVnLCBpbmZvcm1hdGlvbiwgd2FybmluZywgZXJyb3IsIGZhdGFsYCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCctLXBhdHRlcm4nLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0gICAgUmVnZXggcGF0dGVybiB0byBoaWdobGlnaHQgbWF0Y2hlc2ApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignLS1zZXJ2ZXInLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0gICAgIFNlcnZlciBVUkwgdG8gY29ubmVjdCB0b2ApO1xuICAgICAgICB3cml0ZXIud3JpdGVsbihgICAke3dyaXRlci53cmFwSW5Db2xvcignLS1odWInLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0gICAgICAgIEh1YiBuYW1lIChkZWZhdWx0OiBsb2dodWIpYCk7XG4gICAgICAgIHdyaXRlci53cml0ZWxuKGAgICR7d3JpdGVyLndyYXBJbkNvbG9yKCctLWZpbGUnLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KX0gICAgICAgRXhwb3J0IGxvZ3MgdG8gYSBmaWxlIG9uIGRpc2Nvbm5lY3RgKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oKTtcbiAgICAgICAgd3JpdGVyLndyaXRlbG4oYPCfkqEgUHJlc3MgJHt3cml0ZXIud3JhcEluQ29sb3IoJ0N0cmwrQycsIENsaUZvcmVncm91bmRDb2xvci5ZZWxsb3cpfSB0byBzdG9wIHN0cmVhbWluZ2ApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXhjbHVkZUtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICAgICAgICByZWNvcmQ6IFQsXG4gICAgICAgIGtleXNUb0V4Y2x1ZGU6IHN0cmluZ1tdLFxuICAgICk6IFBhcnRpYWw8VD4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKFtrZXldKSA9PiAha2V5c1RvRXhjbHVkZS5pbmNsdWRlcyhrZXkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSBhcyBQYXJ0aWFsPFQ+O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZFJlZ2V4KHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbmV3IFJlZ0V4cChwYXR0ZXJuKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
package/esm2022/lib/version.mjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// Automatically generated during build
|
|
2
|
-
export const LIBRARY_VERSION = '1.0.7';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NlcnZlci1sb2dzL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSx1Q0FBdUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLy8gQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZHVyaW5nIGJ1aWxkXG5leHBvcnQgY29uc3QgTElCUkFSWV9WRVJTSU9OID0gJzEuMC43JztcbiAgIl19
|
package/esm2022/public-api.mjs
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of server-logs
|
|
3
|
-
*/
|
|
4
|
-
export * from './lib/cli-server-logs.module';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NlcnZlci1sb2dzL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygc2VydmVyLWxvZ3NcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jbGktc2VydmVyLWxvZ3MubW9kdWxlJztcbiJdfQ==
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public-api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicW9kYWxpcy1jbGktc2VydmVyLWxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9zZXJ2ZXItbG9ncy9zcmMvcW9kYWxpcy1jbGktc2VydmVyLWxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, NgModule } from '@angular/core';
|
|
3
|
-
import { resolveCommandProcessorProvider } from '@qodalis/angular-cli';
|
|
4
|
-
import * as signalR from '@microsoft/signalr';
|
|
5
|
-
import { DefaultLibraryAuthor, toQueryString, highlightTextWithBg, CliForegroundColor } from '@qodalis/cli-core';
|
|
6
|
-
|
|
7
|
-
// Automatically generated during build
|
|
8
|
-
const LIBRARY_VERSION = '1.0.7';
|
|
9
|
-
|
|
10
|
-
const levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];
|
|
11
|
-
class CliLogsCommandProcessor {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.command = 'server-logs';
|
|
14
|
-
this.description = 'Show live logs';
|
|
15
|
-
this.processors = [];
|
|
16
|
-
this.metadata = {
|
|
17
|
-
requireServer: true,
|
|
18
|
-
icon: '📜',
|
|
19
|
-
};
|
|
20
|
-
this.parameters = [
|
|
21
|
-
{
|
|
22
|
-
name: 'pattern',
|
|
23
|
-
type: 'string',
|
|
24
|
-
description: 'The regex pattern to search for in the logs',
|
|
25
|
-
required: false,
|
|
26
|
-
validator: (value) => {
|
|
27
|
-
const isValid = this.isValidRegex(value);
|
|
28
|
-
return {
|
|
29
|
-
valid: isValid,
|
|
30
|
-
message: isValid
|
|
31
|
-
? undefined
|
|
32
|
-
: 'Invalid regex pattern provided',
|
|
33
|
-
};
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: 'level',
|
|
38
|
-
type: 'string',
|
|
39
|
-
description: 'The log level to filter by, e.g. ' + levels.join(', '),
|
|
40
|
-
required: false,
|
|
41
|
-
validator: (value) => {
|
|
42
|
-
const isValid = levels.includes(value);
|
|
43
|
-
return {
|
|
44
|
-
valid: isValid,
|
|
45
|
-
message: isValid
|
|
46
|
-
? undefined
|
|
47
|
-
: 'Invalid log level provided, must be one of: ' +
|
|
48
|
-
levels.join(', '),
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
name: 'server',
|
|
54
|
-
type: 'string',
|
|
55
|
-
description: 'The server to connect to, e.g. "http://localhost:5000"',
|
|
56
|
-
required: false,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
name: 'hub',
|
|
60
|
-
type: 'string',
|
|
61
|
-
description: 'The hub to connect to, e.g. "loghub" (default) or "loghub2"',
|
|
62
|
-
required: false,
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
name: 'file',
|
|
66
|
-
type: 'boolean',
|
|
67
|
-
description: 'Export logs to a file',
|
|
68
|
-
required: false,
|
|
69
|
-
},
|
|
70
|
-
];
|
|
71
|
-
this.author = DefaultLibraryAuthor;
|
|
72
|
-
this.version = LIBRARY_VERSION;
|
|
73
|
-
this.processors?.push({
|
|
74
|
-
command: 'live',
|
|
75
|
-
description: this.description,
|
|
76
|
-
parameters: this.parameters,
|
|
77
|
-
processCommand: this.processCommand.bind(this),
|
|
78
|
-
writeDescription: this.writeDescription.bind(this),
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
async processCommand(command, context) {
|
|
82
|
-
let qs = '?';
|
|
83
|
-
const args = this.excludeKeys(command.args, ['server', 'hub', 'file']);
|
|
84
|
-
if (Object.keys(args).length > 0) {
|
|
85
|
-
qs += toQueryString(args);
|
|
86
|
-
}
|
|
87
|
-
const hub = command.args['hub'] || 'loghub';
|
|
88
|
-
let server = command.args['server'] || '';
|
|
89
|
-
server = server.replace(/\/+$/, '');
|
|
90
|
-
const url = `${server}/${hub}${qs}`;
|
|
91
|
-
console.log('Connecting to:', url);
|
|
92
|
-
this.hubConnection = new signalR.HubConnectionBuilder()
|
|
93
|
-
.withUrl(url)
|
|
94
|
-
.build();
|
|
95
|
-
const buffer = [];
|
|
96
|
-
await this.hubConnection
|
|
97
|
-
.start()
|
|
98
|
-
.then(() => {
|
|
99
|
-
console.log('SignalR connection started');
|
|
100
|
-
context.writer.writeWarning('Connected to live logs');
|
|
101
|
-
if (qs.length) {
|
|
102
|
-
Object.keys(args).forEach((key) => {
|
|
103
|
-
context.writer.writeWarning(`Filtering logs by: ${key}=${command.args[key]}`);
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
let firstLog = true;
|
|
107
|
-
let index = 0;
|
|
108
|
-
this.hubConnection.on('log', (log) => {
|
|
109
|
-
if (firstLog) {
|
|
110
|
-
context.writer.writeln();
|
|
111
|
-
}
|
|
112
|
-
buffer.push(log);
|
|
113
|
-
context.writer.writeln(`\x1b[33m${++index}\x1b[0m. ` +
|
|
114
|
-
(command.args['pattern']
|
|
115
|
-
? highlightTextWithBg(log, new RegExp(command.args['pattern'], 'g'))
|
|
116
|
-
: log));
|
|
117
|
-
firstLog = false;
|
|
118
|
-
});
|
|
119
|
-
const subscription = context.onAbort.subscribe(() => {
|
|
120
|
-
this.hubConnection.stop();
|
|
121
|
-
context.writer.writeWarning('Disconnected from live logs');
|
|
122
|
-
if (command.args['file']) {
|
|
123
|
-
const filename = `logs-${new Date().toISOString()}.txt`;
|
|
124
|
-
context.writer.writeToFile(filename, buffer.join('\n'));
|
|
125
|
-
}
|
|
126
|
-
subscription.unsubscribe();
|
|
127
|
-
});
|
|
128
|
-
})
|
|
129
|
-
.catch((err) => {
|
|
130
|
-
console.error('Error starting SignalR connection:', err);
|
|
131
|
-
context.writer.writeError('Failed to connect to live logs');
|
|
132
|
-
context.writer.writeError(err?.toString());
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
writeDescription(context) {
|
|
136
|
-
const { writer } = context;
|
|
137
|
-
writer.writeln('Stream live server logs via SignalR');
|
|
138
|
-
writer.writeln();
|
|
139
|
-
writer.writeln('📋 Usage:');
|
|
140
|
-
writer.writeln(` ${writer.wrapInColor('server-logs', CliForegroundColor.Cyan)} Start streaming`);
|
|
141
|
-
writer.writeln(` ${writer.wrapInColor('server-logs --level=error', CliForegroundColor.Cyan)} Filter by level`);
|
|
142
|
-
writer.writeln(` ${writer.wrapInColor('server-logs --pattern="Exception"', CliForegroundColor.Cyan)} Filter by regex`);
|
|
143
|
-
writer.writeln(` ${writer.wrapInColor('server-logs --server=http://localhost:5000', CliForegroundColor.Cyan)} Custom server`);
|
|
144
|
-
writer.writeln();
|
|
145
|
-
writer.writeln(`⚙️ Options:`);
|
|
146
|
-
writer.writeln(` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`);
|
|
147
|
-
writer.writeln(` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`);
|
|
148
|
-
writer.writeln(` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server URL to connect to`);
|
|
149
|
-
writer.writeln(` ${writer.wrapInColor('--hub', CliForegroundColor.Yellow)} Hub name (default: loghub)`);
|
|
150
|
-
writer.writeln(` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`);
|
|
151
|
-
writer.writeln();
|
|
152
|
-
writer.writeln(`💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`);
|
|
153
|
-
}
|
|
154
|
-
excludeKeys(record, keysToExclude) {
|
|
155
|
-
return Object.fromEntries(Object.entries(record).filter(([key]) => !keysToExclude.includes(key)));
|
|
156
|
-
}
|
|
157
|
-
isValidRegex(pattern) {
|
|
158
|
-
try {
|
|
159
|
-
new RegExp(pattern);
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
catch (e) {
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
167
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, providedIn: 'root' }); }
|
|
168
|
-
}
|
|
169
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliLogsCommandProcessor, decorators: [{
|
|
170
|
-
type: Injectable,
|
|
171
|
-
args: [{
|
|
172
|
-
providedIn: 'root',
|
|
173
|
-
}]
|
|
174
|
-
}], ctorParameters: function () { return []; } });
|
|
175
|
-
|
|
176
|
-
class CliServerLogsModule {
|
|
177
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
178
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule }); }
|
|
179
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)] }); }
|
|
180
|
-
}
|
|
181
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliServerLogsModule, decorators: [{
|
|
182
|
-
type: NgModule,
|
|
183
|
-
args: [{
|
|
184
|
-
declarations: [],
|
|
185
|
-
imports: [],
|
|
186
|
-
exports: [],
|
|
187
|
-
providers: [resolveCommandProcessorProvider(CliLogsCommandProcessor)],
|
|
188
|
-
}]
|
|
189
|
-
}] });
|
|
190
|
-
|
|
191
|
-
/*
|
|
192
|
-
* Public API Surface of server-logs
|
|
193
|
-
*/
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Generated bundle index. Do not edit.
|
|
197
|
-
*/
|
|
198
|
-
|
|
199
|
-
export { CliServerLogsModule };
|
|
200
|
-
//# sourceMappingURL=qodalis-cli-server-logs.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"qodalis-cli-server-logs.mjs","sources":["../../../projects/server-logs/src/lib/version.ts","../../../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":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '1.0.7';\n ","import { Injectable } from '@angular/core';\nimport * as signalR from '@microsoft/signalr';\nimport {\n CliForegroundColor,\n CliProcessCommand,\n CliProcessorMetadata,\n DefaultLibraryAuthor,\n highlightTextWithBg,\n ICliCommandAuthor,\n ICliCommandParameterDescriptor,\n ICliCommandProcessor,\n ICliExecutionContext,\n toQueryString,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\n\nconst levels = ['verbose', 'debug', 'information', 'warning', 'error', 'fatal'];\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CliLogsCommandProcessor implements ICliCommandProcessor {\n command = 'server-logs';\n\n description?: string | undefined = 'Show live logs';\n\n processors?: ICliCommandProcessor[] | undefined = [];\n\n metadata?: CliProcessorMetadata | undefined = {\n requireServer: true,\n icon: '📜',\n };\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 name: 'server',\n type: 'string',\n description:\n 'The server to connect to, e.g. \"http://localhost:5000\"',\n required: false,\n },\n {\n name: 'hub',\n type: 'string',\n description:\n 'The hub to connect to, e.g. \"loghub\" (default) or \"loghub2\"',\n required: false,\n },\n {\n name: 'file',\n type: 'boolean',\n description: 'Export logs to a file',\n required: false,\n },\n ];\n\n author?: ICliCommandAuthor | undefined = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\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\n const args = this.excludeKeys(command.args, ['server', 'hub', 'file']);\n\n if (Object.keys(args).length > 0) {\n qs += toQueryString(args);\n }\n\n const hub = command.args['hub'] || 'loghub';\n\n let server = command.args['server'] || '';\n server = server.replace(/\\/+$/, '');\n\n const url = `${server}/${hub}${qs}`;\n\n console.log('Connecting to:', url);\n\n this.hubConnection = new signalR.HubConnectionBuilder()\n .withUrl(url)\n .build();\n\n const buffer: string[] = [];\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(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 buffer.push(log);\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 if (command.args['file']) {\n const filename = `logs-${new Date().toISOString()}.txt`;\n context.writer.writeToFile(filename, buffer.join('\\n'));\n }\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 context.writer.writeError(err?.toString());\n });\n }\n\n writeDescription(context: ICliExecutionContext): void {\n const { writer } = context;\n writer.writeln('Stream live server logs via SignalR');\n writer.writeln();\n writer.writeln('📋 Usage:');\n writer.writeln(` ${writer.wrapInColor('server-logs', CliForegroundColor.Cyan)} Start streaming`);\n writer.writeln(` ${writer.wrapInColor('server-logs --level=error', CliForegroundColor.Cyan)} Filter by level`);\n writer.writeln(` ${writer.wrapInColor('server-logs --pattern=\"Exception\"', CliForegroundColor.Cyan)} Filter by regex`);\n writer.writeln(` ${writer.wrapInColor('server-logs --server=http://localhost:5000', CliForegroundColor.Cyan)} Custom server`);\n writer.writeln();\n writer.writeln(`⚙️ Options:`);\n writer.writeln(` ${writer.wrapInColor('--level', CliForegroundColor.Yellow)} Log level: verbose, debug, information, warning, error, fatal`);\n writer.writeln(` ${writer.wrapInColor('--pattern', CliForegroundColor.Yellow)} Regex pattern to highlight matches`);\n writer.writeln(` ${writer.wrapInColor('--server', CliForegroundColor.Yellow)} Server URL to connect to`);\n writer.writeln(` ${writer.wrapInColor('--hub', CliForegroundColor.Yellow)} Hub name (default: loghub)`);\n writer.writeln(` ${writer.wrapInColor('--file', CliForegroundColor.Yellow)} Export logs to a file on disconnect`);\n writer.writeln();\n writer.writeln(`💡 Press ${writer.wrapInColor('Ctrl+C', CliForegroundColor.Yellow)} to stop streaming`);\n }\n\n private excludeKeys<T extends Record<string, any>>(\n record: T,\n keysToExclude: string[],\n ): Partial<T> {\n return Object.fromEntries(\n Object.entries(record).filter(\n ([key]) => !keysToExclude.includes(key),\n ),\n ) as Partial<T>;\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
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { CliProcessCommand, CliProcessorMetadata, 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
|
-
metadata?: CliProcessorMetadata | undefined;
|
|
8
|
-
parameters?: ICliCommandParameterDescriptor[] | undefined;
|
|
9
|
-
author?: ICliCommandAuthor | undefined;
|
|
10
|
-
version: string;
|
|
11
|
-
private hubConnection;
|
|
12
|
-
constructor();
|
|
13
|
-
processCommand(command: CliProcessCommand, context: ICliExecutionContext): Promise<void>;
|
|
14
|
-
writeDescription(context: ICliExecutionContext): void;
|
|
15
|
-
private excludeKeys;
|
|
16
|
-
private isValidRegex;
|
|
17
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<CliLogsCommandProcessor, never>;
|
|
18
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<CliLogsCommandProcessor>;
|
|
19
|
-
}
|
package/lib/version.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const LIBRARY_VERSION = "1.0.7";
|