@push.rocks/smartlog 3.0.9 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_source_interactive/index.d.ts +137 -0
- package/dist_ts_source_interactive/index.js +345 -0
- package/dist_ts_source_interactive/smartlog-source-interactive.plugins.d.ts +5 -0
- package/dist_ts_source_interactive/smartlog-source-interactive.plugins.js +8 -0
- package/package.json +7 -9
- package/readme.md +73 -1
- package/readme.plan.md +101 -0
- package/ts/00_commitinfo_data.ts +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartlog',
|
|
6
|
-
version: '3.
|
|
6
|
+
version: '3.1.2',
|
|
7
7
|
description: 'A minimalistic, distributed, and extensible logging tool supporting centralized log management.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLGlHQUFpRztDQUMvRyxDQUFBIn0=
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
declare const spinnerFrames: {
|
|
2
|
+
dots: string[];
|
|
3
|
+
line: string[];
|
|
4
|
+
star: string[];
|
|
5
|
+
simple: string[];
|
|
6
|
+
};
|
|
7
|
+
declare const colors: {
|
|
8
|
+
black: string;
|
|
9
|
+
red: string;
|
|
10
|
+
green: string;
|
|
11
|
+
yellow: string;
|
|
12
|
+
blue: string;
|
|
13
|
+
magenta: string;
|
|
14
|
+
cyan: string;
|
|
15
|
+
white: string;
|
|
16
|
+
gray: string;
|
|
17
|
+
reset: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* A class for creating interactive spinners
|
|
21
|
+
* Automatically handles non-interactive environments
|
|
22
|
+
*/
|
|
23
|
+
export declare class SmartlogSourceInteractive {
|
|
24
|
+
private textContent;
|
|
25
|
+
private currentFrame;
|
|
26
|
+
private interval;
|
|
27
|
+
private started;
|
|
28
|
+
private spinnerStyle;
|
|
29
|
+
private color;
|
|
30
|
+
private frames;
|
|
31
|
+
private frameInterval;
|
|
32
|
+
private interactive;
|
|
33
|
+
constructor();
|
|
34
|
+
/**
|
|
35
|
+
* Sets the text for the spinner and starts it if not already started
|
|
36
|
+
*/
|
|
37
|
+
text(textArg: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Starts the spinner animation
|
|
40
|
+
*/
|
|
41
|
+
private start;
|
|
42
|
+
/**
|
|
43
|
+
* Renders the current frame of the spinner
|
|
44
|
+
*/
|
|
45
|
+
private renderFrame;
|
|
46
|
+
/**
|
|
47
|
+
* Stops the spinner
|
|
48
|
+
*/
|
|
49
|
+
stop(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Marks the spinner as successful and optionally displays a success message
|
|
52
|
+
*/
|
|
53
|
+
finishSuccess(textArg?: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Marks the spinner as failed and optionally displays a failure message
|
|
56
|
+
*/
|
|
57
|
+
finishFail(textArg?: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Marks the current spinner as successful and starts a new one
|
|
60
|
+
*/
|
|
61
|
+
successAndNext(textArg: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Marks the current spinner as failed and starts a new one
|
|
64
|
+
*/
|
|
65
|
+
failAndNext(textArg: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Sets the spinner style
|
|
68
|
+
*/
|
|
69
|
+
setSpinnerStyle(style: keyof typeof spinnerFrames): this;
|
|
70
|
+
/**
|
|
71
|
+
* Sets the spinner color
|
|
72
|
+
*/
|
|
73
|
+
setColor(colorName: keyof typeof colors): this;
|
|
74
|
+
/**
|
|
75
|
+
* Sets the animation speed in milliseconds
|
|
76
|
+
*/
|
|
77
|
+
setSpeed(ms: number): this;
|
|
78
|
+
/**
|
|
79
|
+
* Gets the current started state
|
|
80
|
+
*/
|
|
81
|
+
isStarted(): boolean;
|
|
82
|
+
}
|
|
83
|
+
export interface IProgressBarOptions {
|
|
84
|
+
total: number;
|
|
85
|
+
width?: number;
|
|
86
|
+
complete?: string;
|
|
87
|
+
incomplete?: string;
|
|
88
|
+
renderThrottle?: number;
|
|
89
|
+
clear?: boolean;
|
|
90
|
+
showEta?: boolean;
|
|
91
|
+
showPercent?: boolean;
|
|
92
|
+
showCount?: boolean;
|
|
93
|
+
}
|
|
94
|
+
export declare class SmartlogProgressBar {
|
|
95
|
+
private total;
|
|
96
|
+
private current;
|
|
97
|
+
private width;
|
|
98
|
+
private completeChar;
|
|
99
|
+
private incomplete;
|
|
100
|
+
private renderThrottle;
|
|
101
|
+
private clear;
|
|
102
|
+
private showEta;
|
|
103
|
+
private showPercent;
|
|
104
|
+
private showCount;
|
|
105
|
+
private color;
|
|
106
|
+
private startTime;
|
|
107
|
+
private lastRenderTime;
|
|
108
|
+
private interactive;
|
|
109
|
+
private lastLoggedPercent;
|
|
110
|
+
private logThreshold;
|
|
111
|
+
constructor(options: IProgressBarOptions);
|
|
112
|
+
/**
|
|
113
|
+
* Update the progress bar to a specific value
|
|
114
|
+
*/
|
|
115
|
+
update(value: number): this;
|
|
116
|
+
/**
|
|
117
|
+
* Increment the progress bar by a value
|
|
118
|
+
*/
|
|
119
|
+
increment(value?: number): this;
|
|
120
|
+
/**
|
|
121
|
+
* Mark the progress bar as complete
|
|
122
|
+
*/
|
|
123
|
+
complete(): this;
|
|
124
|
+
/**
|
|
125
|
+
* Set the color of the progress bar
|
|
126
|
+
*/
|
|
127
|
+
setColor(colorName: keyof typeof colors): this;
|
|
128
|
+
/**
|
|
129
|
+
* Render the progress bar
|
|
130
|
+
*/
|
|
131
|
+
private render;
|
|
132
|
+
}
|
|
133
|
+
export declare class SmartlogSourceOra extends SmartlogSourceInteractive {
|
|
134
|
+
get oraInstance(): any;
|
|
135
|
+
set oraInstance(value: any);
|
|
136
|
+
}
|
|
137
|
+
export {};
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import * as plugins from './smartlog-source-interactive.plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Utility to detect if the environment is interactive
|
|
4
|
+
* Checks for TTY capability and common CI environment variables
|
|
5
|
+
*/
|
|
6
|
+
const isInteractive = () => {
|
|
7
|
+
try {
|
|
8
|
+
return Boolean(
|
|
9
|
+
// Check TTY capability
|
|
10
|
+
process.stdout && process.stdout.isTTY &&
|
|
11
|
+
// Additional checks for non-interactive environments
|
|
12
|
+
!('CI' in process.env) &&
|
|
13
|
+
!process.env.GITHUB_ACTIONS &&
|
|
14
|
+
!process.env.JENKINS_URL &&
|
|
15
|
+
!process.env.GITLAB_CI &&
|
|
16
|
+
!process.env.TRAVIS &&
|
|
17
|
+
!process.env.CIRCLECI &&
|
|
18
|
+
process.env.TERM !== 'dumb');
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
// If any error occurs (e.g., in browser environments without process),
|
|
22
|
+
// assume a non-interactive environment to be safe
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
// Helper to log messages in non-interactive mode
|
|
27
|
+
const logMessage = (message, prefix = '') => {
|
|
28
|
+
if (prefix) {
|
|
29
|
+
console.log(`${prefix} ${message}`);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(message);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
// Spinner frames and styles
|
|
36
|
+
const spinnerFrames = {
|
|
37
|
+
dots: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],
|
|
38
|
+
line: ['|', '/', '-', '\\'],
|
|
39
|
+
star: ['✶', '✸', '✹', '✺', '✹', '✷'],
|
|
40
|
+
simple: ['-', '\\', '|', '/']
|
|
41
|
+
};
|
|
42
|
+
// Color names mapping to ANSI color codes
|
|
43
|
+
const colors = {
|
|
44
|
+
black: '\u001b[30m',
|
|
45
|
+
red: '\u001b[31m',
|
|
46
|
+
green: '\u001b[32m',
|
|
47
|
+
yellow: '\u001b[33m',
|
|
48
|
+
blue: '\u001b[34m',
|
|
49
|
+
magenta: '\u001b[35m',
|
|
50
|
+
cyan: '\u001b[36m',
|
|
51
|
+
white: '\u001b[37m',
|
|
52
|
+
gray: '\u001b[90m',
|
|
53
|
+
reset: '\u001b[0m'
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* A class for creating interactive spinners
|
|
57
|
+
* Automatically handles non-interactive environments
|
|
58
|
+
*/
|
|
59
|
+
export class SmartlogSourceInteractive {
|
|
60
|
+
constructor() {
|
|
61
|
+
this.textContent = 'loading';
|
|
62
|
+
this.currentFrame = 0;
|
|
63
|
+
this.interval = null;
|
|
64
|
+
this.started = false;
|
|
65
|
+
this.spinnerStyle = 'dots';
|
|
66
|
+
this.color = 'cyan';
|
|
67
|
+
this.frameInterval = 80;
|
|
68
|
+
this.frames = spinnerFrames[this.spinnerStyle];
|
|
69
|
+
this.interactive = isInteractive();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Sets the text for the spinner and starts it if not already started
|
|
73
|
+
*/
|
|
74
|
+
text(textArg) {
|
|
75
|
+
this.textContent = textArg;
|
|
76
|
+
if (!this.interactive) {
|
|
77
|
+
// In non-interactive mode, just log the message with a loading indicator
|
|
78
|
+
logMessage(textArg, '[Loading]');
|
|
79
|
+
this.started = true;
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!this.started) {
|
|
83
|
+
this.started = true;
|
|
84
|
+
this.start();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.renderFrame();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Starts the spinner animation
|
|
92
|
+
*/
|
|
93
|
+
start() {
|
|
94
|
+
if (!this.interactive) {
|
|
95
|
+
return; // No animation in non-interactive mode
|
|
96
|
+
}
|
|
97
|
+
if (this.interval) {
|
|
98
|
+
clearInterval(this.interval);
|
|
99
|
+
}
|
|
100
|
+
this.renderFrame();
|
|
101
|
+
this.interval = setInterval(() => {
|
|
102
|
+
this.currentFrame = (this.currentFrame + 1) % this.frames.length;
|
|
103
|
+
this.renderFrame();
|
|
104
|
+
}, this.frameInterval);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Renders the current frame of the spinner
|
|
108
|
+
*/
|
|
109
|
+
renderFrame() {
|
|
110
|
+
if (!this.started || !this.interactive)
|
|
111
|
+
return;
|
|
112
|
+
const frame = this.frames[this.currentFrame];
|
|
113
|
+
const colorCode = colors[this.color];
|
|
114
|
+
const resetCode = colors.reset;
|
|
115
|
+
// Only use ANSI escape codes in interactive mode
|
|
116
|
+
process.stdout.write('\r\x1b[2K'); // Clear the current line
|
|
117
|
+
process.stdout.write(`${colorCode}${frame}${resetCode} ${this.textContent}`);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Stops the spinner
|
|
121
|
+
*/
|
|
122
|
+
stop() {
|
|
123
|
+
// Always clear the interval even in non-interactive mode
|
|
124
|
+
// This prevents memory leaks in tests and long-running applications
|
|
125
|
+
if (this.interval) {
|
|
126
|
+
clearInterval(this.interval);
|
|
127
|
+
this.interval = null;
|
|
128
|
+
}
|
|
129
|
+
if (!this.interactive) {
|
|
130
|
+
return; // No need to clear the line in non-interactive mode
|
|
131
|
+
}
|
|
132
|
+
process.stdout.write('\r\x1b[2K'); // Clear the current line
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Marks the spinner as successful and optionally displays a success message
|
|
136
|
+
*/
|
|
137
|
+
finishSuccess(textArg) {
|
|
138
|
+
const message = textArg || this.textContent;
|
|
139
|
+
// Always stop the spinner first to clean up intervals
|
|
140
|
+
this.stop();
|
|
141
|
+
if (!this.interactive) {
|
|
142
|
+
logMessage(message, '[Success]');
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const successSymbol = colors.green + '✓' + colors.reset;
|
|
146
|
+
process.stdout.write(`${successSymbol} ${message}\n`);
|
|
147
|
+
}
|
|
148
|
+
this.started = false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Marks the spinner as failed and optionally displays a failure message
|
|
152
|
+
*/
|
|
153
|
+
finishFail(textArg) {
|
|
154
|
+
const message = textArg || this.textContent;
|
|
155
|
+
// Always stop the spinner first to clean up intervals
|
|
156
|
+
this.stop();
|
|
157
|
+
if (!this.interactive) {
|
|
158
|
+
logMessage(message, '[Failed]');
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
const failSymbol = colors.red + '✗' + colors.reset;
|
|
162
|
+
process.stdout.write(`${failSymbol} ${message}\n`);
|
|
163
|
+
}
|
|
164
|
+
this.started = false;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Marks the current spinner as successful and starts a new one
|
|
168
|
+
*/
|
|
169
|
+
successAndNext(textArg) {
|
|
170
|
+
this.finishSuccess();
|
|
171
|
+
this.text(textArg);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Marks the current spinner as failed and starts a new one
|
|
175
|
+
*/
|
|
176
|
+
failAndNext(textArg) {
|
|
177
|
+
this.finishFail();
|
|
178
|
+
this.text(textArg);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Sets the spinner style
|
|
182
|
+
*/
|
|
183
|
+
setSpinnerStyle(style) {
|
|
184
|
+
this.spinnerStyle = style;
|
|
185
|
+
this.frames = spinnerFrames[style];
|
|
186
|
+
return this;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Sets the spinner color
|
|
190
|
+
*/
|
|
191
|
+
setColor(colorName) {
|
|
192
|
+
if (colorName in colors) {
|
|
193
|
+
this.color = colorName;
|
|
194
|
+
}
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Sets the animation speed in milliseconds
|
|
199
|
+
*/
|
|
200
|
+
setSpeed(ms) {
|
|
201
|
+
this.frameInterval = ms;
|
|
202
|
+
if (this.started) {
|
|
203
|
+
this.stop();
|
|
204
|
+
this.start();
|
|
205
|
+
}
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Gets the current started state
|
|
210
|
+
*/
|
|
211
|
+
isStarted() {
|
|
212
|
+
return this.started;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
export class SmartlogProgressBar {
|
|
216
|
+
constructor(options) {
|
|
217
|
+
this.current = 0;
|
|
218
|
+
this.color = 'green';
|
|
219
|
+
this.startTime = null;
|
|
220
|
+
this.lastRenderTime = 0;
|
|
221
|
+
this.lastLoggedPercent = 0;
|
|
222
|
+
this.logThreshold = 10; // Log every 10% in non-interactive mode
|
|
223
|
+
this.total = options.total;
|
|
224
|
+
this.width = options.width || 30;
|
|
225
|
+
this.completeChar = options.complete || '█';
|
|
226
|
+
this.incomplete = options.incomplete || '░';
|
|
227
|
+
this.renderThrottle = options.renderThrottle || 16;
|
|
228
|
+
this.clear = options.clear !== undefined ? options.clear : false;
|
|
229
|
+
this.showEta = options.showEta !== undefined ? options.showEta : true;
|
|
230
|
+
this.showPercent = options.showPercent !== undefined ? options.showPercent : true;
|
|
231
|
+
this.showCount = options.showCount !== undefined ? options.showCount : true;
|
|
232
|
+
this.interactive = isInteractive();
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Update the progress bar to a specific value
|
|
236
|
+
*/
|
|
237
|
+
update(value) {
|
|
238
|
+
if (this.startTime === null) {
|
|
239
|
+
this.startTime = Date.now();
|
|
240
|
+
}
|
|
241
|
+
this.current = Math.min(value, this.total);
|
|
242
|
+
if (!this.interactive) {
|
|
243
|
+
// In non-interactive mode, log progress at certain thresholds
|
|
244
|
+
const percent = Math.floor((this.current / this.total) * 100);
|
|
245
|
+
const currentThreshold = Math.floor(percent / this.logThreshold) * this.logThreshold;
|
|
246
|
+
if (currentThreshold > this.lastLoggedPercent || percent === 100) {
|
|
247
|
+
this.lastLoggedPercent = currentThreshold;
|
|
248
|
+
logMessage(`Progress: ${percent}% (${this.current}/${this.total})`);
|
|
249
|
+
}
|
|
250
|
+
return this;
|
|
251
|
+
}
|
|
252
|
+
// Throttle rendering to avoid excessive updates in interactive mode
|
|
253
|
+
const now = Date.now();
|
|
254
|
+
if (now - this.lastRenderTime < this.renderThrottle) {
|
|
255
|
+
return this;
|
|
256
|
+
}
|
|
257
|
+
this.lastRenderTime = now;
|
|
258
|
+
this.render();
|
|
259
|
+
return this;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Increment the progress bar by a value
|
|
263
|
+
*/
|
|
264
|
+
increment(value = 1) {
|
|
265
|
+
return this.update(this.current + value);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Mark the progress bar as complete
|
|
269
|
+
*/
|
|
270
|
+
complete() {
|
|
271
|
+
this.update(this.total);
|
|
272
|
+
if (!this.interactive) {
|
|
273
|
+
logMessage(`Completed: 100% (${this.total}/${this.total})`);
|
|
274
|
+
return this;
|
|
275
|
+
}
|
|
276
|
+
if (this.clear) {
|
|
277
|
+
process.stdout.write('\r\x1b[2K');
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
process.stdout.write('\n');
|
|
281
|
+
}
|
|
282
|
+
return this;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Set the color of the progress bar
|
|
286
|
+
*/
|
|
287
|
+
setColor(colorName) {
|
|
288
|
+
if (colorName in colors) {
|
|
289
|
+
this.color = colorName;
|
|
290
|
+
}
|
|
291
|
+
return this;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Render the progress bar
|
|
295
|
+
*/
|
|
296
|
+
render() {
|
|
297
|
+
if (!this.interactive) {
|
|
298
|
+
return; // Don't render in non-interactive mode
|
|
299
|
+
}
|
|
300
|
+
// Calculate percent complete
|
|
301
|
+
const percent = Math.floor((this.current / this.total) * 100);
|
|
302
|
+
const completeLength = Math.round((this.current / this.total) * this.width);
|
|
303
|
+
const incompleteLength = this.width - completeLength;
|
|
304
|
+
// Build the progress bar
|
|
305
|
+
const completePart = colors[this.color] + this.completeChar.repeat(completeLength) + colors.reset;
|
|
306
|
+
const incompletePart = this.incomplete.repeat(incompleteLength);
|
|
307
|
+
const progressBar = `[${completePart}${incompletePart}]`;
|
|
308
|
+
// Calculate ETA if needed
|
|
309
|
+
let etaStr = '';
|
|
310
|
+
if (this.showEta && this.startTime !== null && this.current > 0) {
|
|
311
|
+
const elapsed = (Date.now() - this.startTime) / 1000;
|
|
312
|
+
const rate = this.current / elapsed;
|
|
313
|
+
const remaining = Math.max(0, this.total - this.current);
|
|
314
|
+
const eta = Math.round(remaining / rate);
|
|
315
|
+
const mins = Math.floor(eta / 60);
|
|
316
|
+
const secs = eta % 60;
|
|
317
|
+
etaStr = ` eta: ${mins}m${secs}s`;
|
|
318
|
+
}
|
|
319
|
+
// Build additional information
|
|
320
|
+
const percentStr = this.showPercent ? ` ${percent}%` : '';
|
|
321
|
+
const countStr = this.showCount ? ` ${this.current}/${this.total}` : '';
|
|
322
|
+
// Clear the line and render
|
|
323
|
+
process.stdout.write('\r\x1b[2K');
|
|
324
|
+
process.stdout.write(`${progressBar}${percentStr}${countStr}${etaStr}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// For backward compatibility with 'source-ora' module
|
|
328
|
+
export class SmartlogSourceOra extends SmartlogSourceInteractive {
|
|
329
|
+
// Add a stub for the oraInstance property for backward compatibility
|
|
330
|
+
get oraInstance() {
|
|
331
|
+
// Use public methods instead of accessing private properties
|
|
332
|
+
const instance = this;
|
|
333
|
+
return {
|
|
334
|
+
get text() { return ''; }, // We can't access private textContent directly
|
|
335
|
+
start: () => instance.text(''), // This starts the spinner
|
|
336
|
+
stop: () => instance.stop(),
|
|
337
|
+
succeed: (text) => instance.finishSuccess(text),
|
|
338
|
+
fail: (text) => instance.finishFail(text)
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
set oraInstance(value) {
|
|
342
|
+
// No-op, just for compatibility
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zb3VyY2VfaW50ZXJhY3RpdmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQ0FBMEMsQ0FBQztBQUVwRTs7O0dBR0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDekIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPO1FBQ1osdUJBQXVCO1FBQ3ZCLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBRXRDLHFEQUFxRDtZQUNyRCxDQUFDLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDdEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWM7WUFDM0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVc7WUFDeEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVM7WUFDdEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07WUFDbkIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7WUFDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCx1RUFBdUU7UUFDdkUsa0RBQWtEO1FBQ2xELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLGlEQUFpRDtBQUNqRCxNQUFNLFVBQVUsR0FBRyxDQUFDLE9BQWUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDbEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN0QyxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxD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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// pushrocks scope
|
|
2
|
+
import * as smartlogInterfaces from '../dist_ts_interfaces/index.js';
|
|
3
|
+
import * as consolecolor from '@push.rocks/consolecolor';
|
|
4
|
+
export { smartlogInterfaces, consolecolor };
|
|
5
|
+
// node.js internal
|
|
6
|
+
import { stdout, stderr } from 'process';
|
|
7
|
+
export { stdout, stderr };
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRsb2ctc291cmNlLWludGVyYWN0aXZlLnBsdWdpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19zb3VyY2VfaW50ZXJhY3RpdmUvc21hcnRsb2ctc291cmNlLWludGVyYWN0aXZlLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0JBQWtCO0FBQ2xCLE9BQU8sS0FBSyxrQkFBa0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEtBQUssWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsQ0FBQztBQUU1QyxtQkFBbUI7QUFDbkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartlog",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A minimalistic, distributed, and extensible logging tool supporting centralized log management.",
|
|
6
6
|
"keywords": [
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
},
|
|
26
26
|
"./context": "./dist_ts_context/index.js",
|
|
27
27
|
"./interfaces": "./dist_ts_interfaces/index.js",
|
|
28
|
-
"./source-
|
|
28
|
+
"./source-interactive": "./dist_ts_source_interactive/index.js",
|
|
29
29
|
"./destination-clickhouse": "./dist_ts_destination_clickhouse/index.js",
|
|
30
30
|
"./destination-devtools": "./dist_ts_destination_devtools/index.js",
|
|
31
31
|
"./destination-file": "./dist_ts_destination_file/index.js",
|
|
@@ -36,12 +36,11 @@
|
|
|
36
36
|
"author": "Lossless GmbH",
|
|
37
37
|
"license": "MIT",
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@git.zone/tsbuild": "^2.
|
|
39
|
+
"@git.zone/tsbuild": "^2.5.1",
|
|
40
40
|
"@git.zone/tsbundle": "^2.2.5",
|
|
41
41
|
"@git.zone/tsrun": "^1.3.3",
|
|
42
|
-
"@git.zone/tstest": "^1.0
|
|
43
|
-
"@
|
|
44
|
-
"@types/node": "^22.15.17"
|
|
42
|
+
"@git.zone/tstest": "^1.7.0",
|
|
43
|
+
"@types/node": "^22.15.18"
|
|
45
44
|
},
|
|
46
45
|
"dependencies": {
|
|
47
46
|
"@api.global/typedrequest-interfaces": "^3.0.19",
|
|
@@ -53,8 +52,7 @@
|
|
|
53
52
|
"@push.rocks/smartpromise": "^4.2.3",
|
|
54
53
|
"@push.rocks/smarttime": "^4.1.1",
|
|
55
54
|
"@push.rocks/webrequest": "^3.0.37",
|
|
56
|
-
"@tsclass/tsclass": "^9.2.0"
|
|
57
|
-
"ora": "^8.2.0"
|
|
55
|
+
"@tsclass/tsclass": "^9.2.0"
|
|
58
56
|
},
|
|
59
57
|
"files": [
|
|
60
58
|
"ts/**/*",
|
|
@@ -81,7 +79,7 @@
|
|
|
81
79
|
"url": "https://code.foss.global/push.rocks/smartlog/issues"
|
|
82
80
|
},
|
|
83
81
|
"scripts": {
|
|
84
|
-
"test": "(tstest test
|
|
82
|
+
"test": "(tstest test/**/*.ts --verbose)",
|
|
85
83
|
"build": "(tsbuild tsfolders --allowimplicitany && tsbundle npm)",
|
|
86
84
|
"format": "(gitzone format)",
|
|
87
85
|
"buildDocs": "tsdoc"
|
package/readme.md
CHANGED
|
@@ -60,6 +60,78 @@ defaultLogger.log('warn', 'This is a warning message using the default logger');
|
|
|
60
60
|
|
|
61
61
|
This is particularly helpful for simple applications or for initial project setup.
|
|
62
62
|
|
|
63
|
+
### Interactive Console Features
|
|
64
|
+
|
|
65
|
+
Smartlog provides interactive console features through the `@push.rocks/smartlog/source-interactive` module:
|
|
66
|
+
|
|
67
|
+
#### Spinners
|
|
68
|
+
|
|
69
|
+
Use spinners to show progress for operations:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { SmartlogSourceInteractive } from '@push.rocks/smartlog/source-interactive';
|
|
73
|
+
|
|
74
|
+
const spinner = new SmartlogSourceInteractive();
|
|
75
|
+
spinner.text('Loading data...');
|
|
76
|
+
|
|
77
|
+
// Later, when the operation completes:
|
|
78
|
+
spinner.finishSuccess('Data loaded successfully!');
|
|
79
|
+
// Or if it fails:
|
|
80
|
+
spinner.finishFail('Failed to load data');
|
|
81
|
+
|
|
82
|
+
// You can chain operations:
|
|
83
|
+
spinner.text('Connecting to server');
|
|
84
|
+
spinner.successAndNext('Fetching records');
|
|
85
|
+
spinner.successAndNext('Processing data');
|
|
86
|
+
spinner.finishSuccess('All done!');
|
|
87
|
+
|
|
88
|
+
// Customize appearance:
|
|
89
|
+
spinner.setSpinnerStyle('line'); // 'dots', 'line', 'star', or 'simple'
|
|
90
|
+
spinner.setColor('green'); // 'red', 'green', 'yellow', 'blue', etc.
|
|
91
|
+
spinner.setSpeed(100); // Animation speed in milliseconds
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### Progress Bars
|
|
95
|
+
|
|
96
|
+
Create progress bars for tracking operation progress:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { SmartlogProgressBar } from '@push.rocks/smartlog/source-interactive';
|
|
100
|
+
|
|
101
|
+
const progressBar = new SmartlogProgressBar({
|
|
102
|
+
total: 100, // Total number of items
|
|
103
|
+
width: 40, // Width of the progress bar
|
|
104
|
+
complete: '█', // Character for completed section
|
|
105
|
+
incomplete: '░', // Character for incomplete section
|
|
106
|
+
showEta: true, // Show estimated time remaining
|
|
107
|
+
showPercent: true, // Show percentage
|
|
108
|
+
showCount: true // Show count (e.g., "50/100")
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Update progress
|
|
112
|
+
progressBar.update(50); // Set to 50% progress
|
|
113
|
+
|
|
114
|
+
// Or increment
|
|
115
|
+
progressBar.increment(10); // Increase by 10 units
|
|
116
|
+
|
|
117
|
+
// Change color
|
|
118
|
+
progressBar.setColor('blue');
|
|
119
|
+
|
|
120
|
+
// Complete the progress bar
|
|
121
|
+
progressBar.update(100); // or progressBar.complete();
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Non-Interactive Environments
|
|
125
|
+
|
|
126
|
+
Both spinners and progress bars automatically detect non-interactive environments (CI/CD, piped output, non-TTY) and provide fallback text-based output:
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
[Loading] Loading data...
|
|
130
|
+
Progress: 50% (50/100)
|
|
131
|
+
Progress: 100% (100/100)
|
|
132
|
+
[Success] Data loaded successfully!
|
|
133
|
+
```
|
|
134
|
+
|
|
63
135
|
### Extending With Log Destinations
|
|
64
136
|
|
|
65
137
|
One of the core strengths of `@push.rocks/smartlog` is its ability to work with multiple log destinations, enabling you to log messages not just to the console but also to external logging services or custom destinations.
|
|
@@ -121,4 +193,4 @@ Registered at District court Bremen HRB 35230 HB, Germany
|
|
|
121
193
|
|
|
122
194
|
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
|
|
123
195
|
|
|
124
|
-
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
|
196
|
+
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.
|
package/readme.plan.md
CHANGED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Smartlog Interactive Console Features Plan
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document outlines the plan for enhancing the console output capabilities of `@push.rocks/smartlog` by creating a comprehensive interactive console module. This involves renaming the current `ts_source_ora` module to `ts_source_interactive`, implementing our own spinner functionality (removing the ora dependency), and adding new features like progress bars and other interactive elements.
|
|
6
|
+
|
|
7
|
+
## Implementation Steps
|
|
8
|
+
|
|
9
|
+
### 1. Rename and Restructure
|
|
10
|
+
|
|
11
|
+
- Rename directory from `ts_source_ora` to `ts_source_interactive`
|
|
12
|
+
- Update all imports, exports, and references
|
|
13
|
+
- Update package.json exports to reflect new module name
|
|
14
|
+
- Maintain backward compatibility through proper export paths
|
|
15
|
+
|
|
16
|
+
### 2. Custom Spinner Implementation
|
|
17
|
+
|
|
18
|
+
- Create a native spinner implementation to replace ora dependency
|
|
19
|
+
- Implement spinner frames and animation timing
|
|
20
|
+
- Maintain API compatibility with current spinner methods:
|
|
21
|
+
- `text(textArg)` - Set text and start spinner
|
|
22
|
+
- `stop()` - Stop the spinner
|
|
23
|
+
- `finishSuccess(textArg?)` - Mark as succeeded
|
|
24
|
+
- `finishFail(textArg?)` - Mark as failed
|
|
25
|
+
- `successAndNext(textArg)` - Success and start new spinner
|
|
26
|
+
- `failAndNext(textArg)` - Fail and start new spinner
|
|
27
|
+
- Add spinner customization options (speed, frames, colors)
|
|
28
|
+
|
|
29
|
+
### 3. Progress Bar Implementation
|
|
30
|
+
|
|
31
|
+
- Create a progress bar component with the following features:
|
|
32
|
+
- Configurable width and style
|
|
33
|
+
- Percentage display
|
|
34
|
+
- ETA calculation
|
|
35
|
+
- Current/total value display
|
|
36
|
+
- Custom formatting
|
|
37
|
+
- Theming support
|
|
38
|
+
- Methods for incrementing and updating
|
|
39
|
+
|
|
40
|
+
### 4. Additional Interactive Features
|
|
41
|
+
|
|
42
|
+
- Add indeterminate progress indicator
|
|
43
|
+
- Add multi-line status display
|
|
44
|
+
- Add table formatting for structured data
|
|
45
|
+
- Add interactive prompts/confirmations
|
|
46
|
+
|
|
47
|
+
### 5. Testing
|
|
48
|
+
|
|
49
|
+
- Update existing tests to work with new implementation
|
|
50
|
+
- Add tests for new progress bar functionality
|
|
51
|
+
- Add tests for additional interactive features
|
|
52
|
+
- Ensure consistent behavior across platforms
|
|
53
|
+
|
|
54
|
+
### 6. Documentation
|
|
55
|
+
|
|
56
|
+
- Update README with examples of new features
|
|
57
|
+
- Add API documentation for all new methods
|
|
58
|
+
- Include usage examples
|
|
59
|
+
|
|
60
|
+
## Implementation Details
|
|
61
|
+
|
|
62
|
+
### Progress Bar API
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// Creating a progress bar
|
|
66
|
+
const progressBar = new SmartlogProgressBar({
|
|
67
|
+
total: 100,
|
|
68
|
+
width: 40,
|
|
69
|
+
complete: '=',
|
|
70
|
+
incomplete: ' ',
|
|
71
|
+
renderThrottle: 100, // ms
|
|
72
|
+
clearOnComplete: false,
|
|
73
|
+
showEta: true
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Updating a progress bar
|
|
77
|
+
progressBar.update(50); // Update to 50%
|
|
78
|
+
progressBar.increment(10); // Increment by 10
|
|
79
|
+
progressBar.complete(); // Mark as complete
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Spinner API (maintains compatibility)
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// Current API (to be maintained)
|
|
86
|
+
const spinner = new SmartlogSourceInteractive();
|
|
87
|
+
spinner.text('Loading data');
|
|
88
|
+
spinner.finishSuccess('Data loaded successfully');
|
|
89
|
+
|
|
90
|
+
// New additions
|
|
91
|
+
spinner.setSpinnerStyle('dots'); // Change spinner style
|
|
92
|
+
spinner.setColor('green'); // Change color
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Benefits
|
|
96
|
+
|
|
97
|
+
- Remove external dependency (ora) for better control and smaller bundle size
|
|
98
|
+
- Provide more interactive console features for improved user experience
|
|
99
|
+
- Maintain consistent API styling across all smartlog modules
|
|
100
|
+
- Improve testability with custom implementation
|
|
101
|
+
- Enable more advanced terminal interactions
|