devink 1.0.0
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/LICENSE +21 -0
- package/README.md +143 -0
- package/dist/index.d.mts +79 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +141 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +136 -0
- package/dist/index.mjs.map +1 -0
- package/media/Devink.png +0 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 devink Authors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="media/Devink.png" alt="Devink Logo" width="400" />
|
|
3
|
+
<h1>devink</h1>
|
|
4
|
+
<p><strong>Fast, lightweight, professional terminal logger. Zero dependencies.</strong></p>
|
|
5
|
+
</div>
|
|
6
|
+
|
|
7
|
+
[](https://npmjs.com/package/devink)
|
|
8
|
+
[](https://github.com/user/devink/blob/main/LICENSE)
|
|
9
|
+
[](https://www.npmjs.com/package/devink)
|
|
10
|
+
[](https://bundlephobia.com/result?p=devink)
|
|
11
|
+
|
|
12
|
+
**Devink** is a production-grade, zero-dependency Node.js logging library featuring custom transports, graceful JSON serialization, a deep-merging theme system, and automatic ANSI color detection.
|
|
13
|
+
|
|
14
|
+
Designed specifically built for high-performance CLI tools, servers, and modern development environments. 🚀
|
|
15
|
+
|
|
16
|
+
## Highlights
|
|
17
|
+
|
|
18
|
+
- **Zero Dependencies**: Pure, self-contained raw ANSI escape engine (`NO_COLOR`, `FORCE_COLOR`, `TERM`, `isTTY` support).
|
|
19
|
+
- **Graceful Error Handling**: Bulletproof object stringification gracefully handles Circular JSON crashes.
|
|
20
|
+
- **Custom Transports**: Redirect logs to files, external services, or any custom stream easily.
|
|
21
|
+
- **Deep Theme System**: Merge your own styles tightly without overriding whole config structures.
|
|
22
|
+
- **Lightweight & Fast**: Extremely fast execution.
|
|
23
|
+
- **Modern Module Setup**: Full TypeScript compatibility, exporting ESM (`import`) and CommonJS (`require`).
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install devink
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { createLogger } from 'devink';
|
|
35
|
+
|
|
36
|
+
const logger = createLogger({ timestamps: true });
|
|
37
|
+
|
|
38
|
+
logger.success('Database connection established');
|
|
39
|
+
logger.info('Listening on port 3000');
|
|
40
|
+
logger.warn('Memory usage above 80%');
|
|
41
|
+
logger.error('Request failed', { status: 500 });
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Advanced Usage
|
|
45
|
+
|
|
46
|
+
### Custom Transports
|
|
47
|
+
|
|
48
|
+
Devink allows you to intercept output and route it to your own methods. No more hardcoded `console.log`.
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { createLogger } from 'devink';
|
|
52
|
+
import fs from 'fs';
|
|
53
|
+
|
|
54
|
+
const fileStream = fs.createWriteStream('./app.log', { flags: 'a' });
|
|
55
|
+
|
|
56
|
+
const logger = createLogger({
|
|
57
|
+
transport: {
|
|
58
|
+
// Override log execution logic
|
|
59
|
+
success: (...args) => fileStream.write(`[PASS] ${args.join(' ')}\n`),
|
|
60
|
+
error: (...args) => {
|
|
61
|
+
console.error(...args); // Keep console logging
|
|
62
|
+
fileStream.write(`[CRITICAL] ${args.join(' ')}\n`);
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
logger.success('User registered!'); // Goes straight to app.log
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Color Control
|
|
71
|
+
|
|
72
|
+
For environments where strict text formatting is required, Devink lets you disable ANSI explicitly.
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const logger = createLogger({
|
|
76
|
+
colors: false, // Instantly strips all ANSI escape codes
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
logger.info('This will definitely be plain text.');
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Deep Theming
|
|
83
|
+
|
|
84
|
+
Deep-merge your theme overrides seamlessly.
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { createLogger, ansi } from 'devink';
|
|
88
|
+
|
|
89
|
+
const customLogger = createLogger({
|
|
90
|
+
theme: {
|
|
91
|
+
// Colors text differently
|
|
92
|
+
warn: (msg) => ansi.magenta(ansi.bold(msg)),
|
|
93
|
+
prefix: {
|
|
94
|
+
// Overrides ONLY the success icon, preserving defaults for others
|
|
95
|
+
success: ansi.green('🚀 SUCCESS'),
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
customLogger.success('Payload deployed!');
|
|
101
|
+
customLogger.warn('Custom colored warning.');
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Safe Serialization
|
|
105
|
+
|
|
106
|
+
No more logging crashes from deep object introspection or circular references.
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const logger = createLogger();
|
|
110
|
+
|
|
111
|
+
const circularObj: any = {};
|
|
112
|
+
circularObj.self = circularObj;
|
|
113
|
+
|
|
114
|
+
// Doesn't throw! Gently recovers to '[Unserializable Object]'
|
|
115
|
+
logger.error('Error snapshot:', circularObj);
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## API Reference
|
|
119
|
+
|
|
120
|
+
### `createLogger(options?: LoggerOptions)`
|
|
121
|
+
|
|
122
|
+
Creates a new `Logger` instance.
|
|
123
|
+
|
|
124
|
+
#### `LoggerOptions`
|
|
125
|
+
|
|
126
|
+
| Option | Type | Default | Description |
|
|
127
|
+
| :----------- | :------------------- | :------------------ | :------------------------------------------------------- |
|
|
128
|
+
| `timestamps` | `boolean` | `false` | Prepends `[HH:MM:SS]` timestamp to every message. |
|
|
129
|
+
| `colors` | `boolean` | `true` | When `false`, all output will be stripped of ANSI codes. |
|
|
130
|
+
| `theme` | `Partial<Theme>` | `{}` | Deep partial override of color structures and prefixes. |
|
|
131
|
+
| `transport` | `Partial<Transport>` | `console.*` methods | Custom output handler for standard log layers. |
|
|
132
|
+
|
|
133
|
+
## Runtime Compatibility
|
|
134
|
+
|
|
135
|
+
- Node.js `^18.0.0` or newer
|
|
136
|
+
- Fully compatible with ESM & CommonJS
|
|
137
|
+
|
|
138
|
+
Built with ❤️ by **[Harry Mate](https://github.com/harrymate22)**.
|
|
139
|
+
🌟 If you find this library helpful, consider dropping a **Star** on GitHub and **[following me (@harrymate22)](https://github.com/harrymate22)** for more open-source tools!
|
|
140
|
+
|
|
141
|
+
## License
|
|
142
|
+
|
|
143
|
+
MIT © [harrymate22](https://github.com/harrymate22)
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
interface Theme {
|
|
2
|
+
success: (msg: string) => string;
|
|
3
|
+
error: (msg: string) => string;
|
|
4
|
+
warn: (msg: string) => string;
|
|
5
|
+
info: (msg: string) => string;
|
|
6
|
+
prefix: {
|
|
7
|
+
success: string;
|
|
8
|
+
error: string;
|
|
9
|
+
warn: string;
|
|
10
|
+
info: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
declare const defaultTheme: Theme;
|
|
14
|
+
|
|
15
|
+
interface Transport {
|
|
16
|
+
success: (...args: unknown[]) => void;
|
|
17
|
+
error: (...args: unknown[]) => void;
|
|
18
|
+
warn: (...args: unknown[]) => void;
|
|
19
|
+
info: (...args: unknown[]) => void;
|
|
20
|
+
}
|
|
21
|
+
interface LoggerOptions {
|
|
22
|
+
theme?: Partial<Theme>;
|
|
23
|
+
timestamps?: boolean;
|
|
24
|
+
colors?: boolean;
|
|
25
|
+
transport?: Partial<Transport>;
|
|
26
|
+
}
|
|
27
|
+
declare class Logger {
|
|
28
|
+
private theme;
|
|
29
|
+
private timestamps;
|
|
30
|
+
private colors;
|
|
31
|
+
private transport;
|
|
32
|
+
constructor(options?: LoggerOptions);
|
|
33
|
+
private getTimestamp;
|
|
34
|
+
private formatMessage;
|
|
35
|
+
private stripAnsi;
|
|
36
|
+
private output;
|
|
37
|
+
success(...message: unknown[]): void;
|
|
38
|
+
error(...message: unknown[]): void;
|
|
39
|
+
warn(...message: unknown[]): void;
|
|
40
|
+
info(...message: unknown[]): void;
|
|
41
|
+
}
|
|
42
|
+
declare const createLogger: (options?: LoggerOptions) => Logger;
|
|
43
|
+
|
|
44
|
+
declare const isColorSupported: string | boolean;
|
|
45
|
+
declare const format: (code: number, text: string) => string;
|
|
46
|
+
declare const reset: (text: string) => string;
|
|
47
|
+
declare const red: (text: string) => string;
|
|
48
|
+
declare const green: (text: string) => string;
|
|
49
|
+
declare const yellow: (text: string) => string;
|
|
50
|
+
declare const blue: (text: string) => string;
|
|
51
|
+
declare const magenta: (text: string) => string;
|
|
52
|
+
declare const cyan: (text: string) => string;
|
|
53
|
+
declare const white: (text: string) => string;
|
|
54
|
+
declare const gray: (text: string) => string;
|
|
55
|
+
declare const bold: (text: string) => string;
|
|
56
|
+
declare const dim: (text: string) => string;
|
|
57
|
+
declare const italic: (text: string) => string;
|
|
58
|
+
declare const underline: (text: string) => string;
|
|
59
|
+
|
|
60
|
+
declare const ansi_blue: typeof blue;
|
|
61
|
+
declare const ansi_bold: typeof bold;
|
|
62
|
+
declare const ansi_cyan: typeof cyan;
|
|
63
|
+
declare const ansi_dim: typeof dim;
|
|
64
|
+
declare const ansi_format: typeof format;
|
|
65
|
+
declare const ansi_gray: typeof gray;
|
|
66
|
+
declare const ansi_green: typeof green;
|
|
67
|
+
declare const ansi_isColorSupported: typeof isColorSupported;
|
|
68
|
+
declare const ansi_italic: typeof italic;
|
|
69
|
+
declare const ansi_magenta: typeof magenta;
|
|
70
|
+
declare const ansi_red: typeof red;
|
|
71
|
+
declare const ansi_reset: typeof reset;
|
|
72
|
+
declare const ansi_underline: typeof underline;
|
|
73
|
+
declare const ansi_white: typeof white;
|
|
74
|
+
declare const ansi_yellow: typeof yellow;
|
|
75
|
+
declare namespace ansi {
|
|
76
|
+
export { ansi_blue as blue, ansi_bold as bold, ansi_cyan as cyan, ansi_dim as dim, ansi_format as format, ansi_gray as gray, ansi_green as green, ansi_isColorSupported as isColorSupported, ansi_italic as italic, ansi_magenta as magenta, ansi_red as red, ansi_reset as reset, ansi_underline as underline, ansi_white as white, ansi_yellow as yellow };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { Logger, type LoggerOptions, type Theme, ansi, createLogger, defaultTheme };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
interface Theme {
|
|
2
|
+
success: (msg: string) => string;
|
|
3
|
+
error: (msg: string) => string;
|
|
4
|
+
warn: (msg: string) => string;
|
|
5
|
+
info: (msg: string) => string;
|
|
6
|
+
prefix: {
|
|
7
|
+
success: string;
|
|
8
|
+
error: string;
|
|
9
|
+
warn: string;
|
|
10
|
+
info: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
declare const defaultTheme: Theme;
|
|
14
|
+
|
|
15
|
+
interface Transport {
|
|
16
|
+
success: (...args: unknown[]) => void;
|
|
17
|
+
error: (...args: unknown[]) => void;
|
|
18
|
+
warn: (...args: unknown[]) => void;
|
|
19
|
+
info: (...args: unknown[]) => void;
|
|
20
|
+
}
|
|
21
|
+
interface LoggerOptions {
|
|
22
|
+
theme?: Partial<Theme>;
|
|
23
|
+
timestamps?: boolean;
|
|
24
|
+
colors?: boolean;
|
|
25
|
+
transport?: Partial<Transport>;
|
|
26
|
+
}
|
|
27
|
+
declare class Logger {
|
|
28
|
+
private theme;
|
|
29
|
+
private timestamps;
|
|
30
|
+
private colors;
|
|
31
|
+
private transport;
|
|
32
|
+
constructor(options?: LoggerOptions);
|
|
33
|
+
private getTimestamp;
|
|
34
|
+
private formatMessage;
|
|
35
|
+
private stripAnsi;
|
|
36
|
+
private output;
|
|
37
|
+
success(...message: unknown[]): void;
|
|
38
|
+
error(...message: unknown[]): void;
|
|
39
|
+
warn(...message: unknown[]): void;
|
|
40
|
+
info(...message: unknown[]): void;
|
|
41
|
+
}
|
|
42
|
+
declare const createLogger: (options?: LoggerOptions) => Logger;
|
|
43
|
+
|
|
44
|
+
declare const isColorSupported: string | boolean;
|
|
45
|
+
declare const format: (code: number, text: string) => string;
|
|
46
|
+
declare const reset: (text: string) => string;
|
|
47
|
+
declare const red: (text: string) => string;
|
|
48
|
+
declare const green: (text: string) => string;
|
|
49
|
+
declare const yellow: (text: string) => string;
|
|
50
|
+
declare const blue: (text: string) => string;
|
|
51
|
+
declare const magenta: (text: string) => string;
|
|
52
|
+
declare const cyan: (text: string) => string;
|
|
53
|
+
declare const white: (text: string) => string;
|
|
54
|
+
declare const gray: (text: string) => string;
|
|
55
|
+
declare const bold: (text: string) => string;
|
|
56
|
+
declare const dim: (text: string) => string;
|
|
57
|
+
declare const italic: (text: string) => string;
|
|
58
|
+
declare const underline: (text: string) => string;
|
|
59
|
+
|
|
60
|
+
declare const ansi_blue: typeof blue;
|
|
61
|
+
declare const ansi_bold: typeof bold;
|
|
62
|
+
declare const ansi_cyan: typeof cyan;
|
|
63
|
+
declare const ansi_dim: typeof dim;
|
|
64
|
+
declare const ansi_format: typeof format;
|
|
65
|
+
declare const ansi_gray: typeof gray;
|
|
66
|
+
declare const ansi_green: typeof green;
|
|
67
|
+
declare const ansi_isColorSupported: typeof isColorSupported;
|
|
68
|
+
declare const ansi_italic: typeof italic;
|
|
69
|
+
declare const ansi_magenta: typeof magenta;
|
|
70
|
+
declare const ansi_red: typeof red;
|
|
71
|
+
declare const ansi_reset: typeof reset;
|
|
72
|
+
declare const ansi_underline: typeof underline;
|
|
73
|
+
declare const ansi_white: typeof white;
|
|
74
|
+
declare const ansi_yellow: typeof yellow;
|
|
75
|
+
declare namespace ansi {
|
|
76
|
+
export { ansi_blue as blue, ansi_bold as bold, ansi_cyan as cyan, ansi_dim as dim, ansi_format as format, ansi_gray as gray, ansi_green as green, ansi_isColorSupported as isColorSupported, ansi_italic as italic, ansi_magenta as magenta, ansi_red as red, ansi_reset as reset, ansi_underline as underline, ansi_white as white, ansi_yellow as yellow };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { Logger, type LoggerOptions, type Theme, ansi, createLogger, defaultTheme };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __export = (target, all) => {
|
|
5
|
+
for (var name in all)
|
|
6
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// source/utils/ansi.ts
|
|
10
|
+
var ansi_exports = {};
|
|
11
|
+
__export(ansi_exports, {
|
|
12
|
+
blue: () => blue,
|
|
13
|
+
bold: () => bold,
|
|
14
|
+
cyan: () => cyan,
|
|
15
|
+
dim: () => dim,
|
|
16
|
+
format: () => format,
|
|
17
|
+
gray: () => gray,
|
|
18
|
+
green: () => green,
|
|
19
|
+
isColorSupported: () => isColorSupported,
|
|
20
|
+
italic: () => italic,
|
|
21
|
+
magenta: () => magenta,
|
|
22
|
+
red: () => red,
|
|
23
|
+
reset: () => reset,
|
|
24
|
+
underline: () => underline,
|
|
25
|
+
white: () => white,
|
|
26
|
+
yellow: () => yellow
|
|
27
|
+
});
|
|
28
|
+
var isColorSupported = !process.env.NO_COLOR && (process.env.FORCE_COLOR || process.stdout?.isTTY || process.env.TERM === "xterm-256color");
|
|
29
|
+
var format = (code, text) => {
|
|
30
|
+
if (!isColorSupported) return text;
|
|
31
|
+
return `\x1B[${code}m${text}\x1B[0m`;
|
|
32
|
+
};
|
|
33
|
+
var reset = (text) => format(0, text);
|
|
34
|
+
var red = (text) => format(31, text);
|
|
35
|
+
var green = (text) => format(32, text);
|
|
36
|
+
var yellow = (text) => format(33, text);
|
|
37
|
+
var blue = (text) => format(34, text);
|
|
38
|
+
var magenta = (text) => format(35, text);
|
|
39
|
+
var cyan = (text) => format(36, text);
|
|
40
|
+
var white = (text) => format(37, text);
|
|
41
|
+
var gray = (text) => format(90, text);
|
|
42
|
+
var bold = (text) => format(1, text);
|
|
43
|
+
var dim = (text) => format(2, text);
|
|
44
|
+
var italic = (text) => format(3, text);
|
|
45
|
+
var underline = (text) => format(4, text);
|
|
46
|
+
|
|
47
|
+
// source/theme.ts
|
|
48
|
+
var defaultTheme = {
|
|
49
|
+
success: (msg) => green(msg),
|
|
50
|
+
error: (msg) => red(bold(msg)),
|
|
51
|
+
warn: (msg) => yellow(msg),
|
|
52
|
+
info: (msg) => blue(msg),
|
|
53
|
+
prefix: {
|
|
54
|
+
success: green("\u2714"),
|
|
55
|
+
error: red("\u2716"),
|
|
56
|
+
warn: yellow("\u26A0"),
|
|
57
|
+
info: blue("\u2139")
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// source/logger.ts
|
|
62
|
+
var defaultTransport = {
|
|
63
|
+
success: console.log,
|
|
64
|
+
error: console.error,
|
|
65
|
+
warn: console.warn,
|
|
66
|
+
info: console.info
|
|
67
|
+
};
|
|
68
|
+
var Logger = class {
|
|
69
|
+
theme;
|
|
70
|
+
timestamps;
|
|
71
|
+
colors;
|
|
72
|
+
transport;
|
|
73
|
+
constructor(options = {}) {
|
|
74
|
+
this.theme = {
|
|
75
|
+
...defaultTheme,
|
|
76
|
+
...options.theme,
|
|
77
|
+
prefix: {
|
|
78
|
+
...defaultTheme.prefix,
|
|
79
|
+
...options.theme?.prefix
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
this.timestamps = options.timestamps ?? false;
|
|
83
|
+
this.colors = options.colors ?? true;
|
|
84
|
+
this.transport = { ...defaultTransport, ...options.transport };
|
|
85
|
+
}
|
|
86
|
+
getTimestamp() {
|
|
87
|
+
if (!this.timestamps) return "";
|
|
88
|
+
const now = /* @__PURE__ */ new Date();
|
|
89
|
+
const time = now.toISOString().split("T")[1]?.split(".")[0];
|
|
90
|
+
return gray(`[${time}] `);
|
|
91
|
+
}
|
|
92
|
+
formatMessage(message) {
|
|
93
|
+
return message.map((m) => {
|
|
94
|
+
if (typeof m === "string") return m;
|
|
95
|
+
try {
|
|
96
|
+
return JSON.stringify(m, null, 2);
|
|
97
|
+
} catch {
|
|
98
|
+
return "[Unserializable Object]";
|
|
99
|
+
}
|
|
100
|
+
}).join(" ");
|
|
101
|
+
}
|
|
102
|
+
stripAnsi(text) {
|
|
103
|
+
return text.replace(/\x1b\[[0-9;]*m/g, "");
|
|
104
|
+
}
|
|
105
|
+
output(level, formattedOutput) {
|
|
106
|
+
const finalOutput = this.colors ? formattedOutput : this.stripAnsi(formattedOutput);
|
|
107
|
+
this.transport[level](finalOutput);
|
|
108
|
+
}
|
|
109
|
+
success(...message) {
|
|
110
|
+
const msg = this.formatMessage(message);
|
|
111
|
+
this.output(
|
|
112
|
+
"success",
|
|
113
|
+
`${this.getTimestamp()}${this.theme.prefix.success} ${this.theme.success(msg)}`
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
error(...message) {
|
|
117
|
+
const msg = this.formatMessage(message);
|
|
118
|
+
this.output(
|
|
119
|
+
"error",
|
|
120
|
+
`${this.getTimestamp()}${this.theme.prefix.error} ${this.theme.error(msg)}`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
warn(...message) {
|
|
124
|
+
const msg = this.formatMessage(message);
|
|
125
|
+
this.output("warn", `${this.getTimestamp()}${this.theme.prefix.warn} ${this.theme.warn(msg)}`);
|
|
126
|
+
}
|
|
127
|
+
info(...message) {
|
|
128
|
+
const msg = this.formatMessage(message);
|
|
129
|
+
this.output("info", `${this.getTimestamp()}${this.theme.prefix.info} ${this.theme.info(msg)}`);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var createLogger = (options) => {
|
|
133
|
+
return new Logger(options);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
exports.Logger = Logger;
|
|
137
|
+
exports.ansi = ansi_exports;
|
|
138
|
+
exports.createLogger = createLogger;
|
|
139
|
+
exports.defaultTheme = defaultTheme;
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
141
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../source/utils/ansi.ts","../source/theme.ts","../source/logger.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const isColorSupported =\r\n !process.env.NO_COLOR &&\r\n (process.env.FORCE_COLOR || process.stdout?.isTTY || process.env.TERM === 'xterm-256color');\r\n\r\nexport const format = (code: number, text: string): string => {\r\n if (!isColorSupported) return text;\r\n return `\\x1b[${code}m${text}\\x1b[0m`;\r\n};\r\n\r\nexport const reset = (text: string): string => format(0, text);\r\nexport const red = (text: string): string => format(31, text);\r\nexport const green = (text: string): string => format(32, text);\r\nexport const yellow = (text: string): string => format(33, text);\r\nexport const blue = (text: string): string => format(34, text);\r\nexport const magenta = (text: string): string => format(35, text);\r\nexport const cyan = (text: string): string => format(36, text);\r\nexport const white = (text: string): string => format(37, text);\r\nexport const gray = (text: string): string => format(90, text);\r\n\r\nexport const bold = (text: string): string => format(1, text);\r\nexport const dim = (text: string): string => format(2, text);\r\nexport const italic = (text: string): string => format(3, text);\r\nexport const underline = (text: string): string => format(4, text);\r\n","import { red, green, yellow, blue, gray, bold } from './utils/ansi.js';\r\n\r\nexport interface Theme {\r\n success: (msg: string) => string;\r\n error: (msg: string) => string;\r\n warn: (msg: string) => string;\r\n info: (msg: string) => string;\r\n prefix: {\r\n success: string;\r\n error: string;\r\n warn: string;\r\n info: string;\r\n };\r\n}\r\n\r\nexport const defaultTheme: Theme = {\r\n success: (msg: string) => green(msg),\r\n error: (msg: string) => red(bold(msg)),\r\n warn: (msg: string) => yellow(msg),\r\n info: (msg: string) => blue(msg),\r\n prefix: {\r\n success: green('✔'),\r\n error: red('✖'),\r\n warn: yellow('⚠'),\r\n info: blue('ℹ'),\r\n },\r\n};\r\n","import { defaultTheme, type Theme } from './theme.js';\r\nimport { gray } from './utils/ansi.js';\r\n\r\nexport interface Transport {\r\n success: (...args: unknown[]) => void;\r\n error: (...args: unknown[]) => void;\r\n warn: (...args: unknown[]) => void;\r\n info: (...args: unknown[]) => void;\r\n}\r\n\r\nexport interface LoggerOptions {\r\n theme?: Partial<Theme>;\r\n timestamps?: boolean;\r\n colors?: boolean;\r\n transport?: Partial<Transport>;\r\n}\r\n\r\nconst defaultTransport: Transport = {\r\n success: console.log,\r\n error: console.error,\r\n warn: console.warn,\r\n info: console.info,\r\n};\r\n\r\nexport class Logger {\r\n private theme: Theme;\r\n private timestamps: boolean;\r\n private colors: boolean;\r\n private transport: Transport;\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n this.theme = {\r\n ...defaultTheme,\r\n ...options.theme,\r\n prefix: {\r\n ...defaultTheme.prefix,\r\n ...options.theme?.prefix,\r\n },\r\n };\r\n this.timestamps = options.timestamps ?? false;\r\n this.colors = options.colors ?? true;\r\n this.transport = { ...defaultTransport, ...options.transport };\r\n }\r\n\r\n private getTimestamp(): string {\r\n if (!this.timestamps) return '';\r\n const now = new Date();\r\n const time = now.toISOString().split('T')[1]?.split('.')[0];\r\n return gray(`[${time}] `);\r\n }\r\n\r\n private formatMessage(message: unknown[]): string {\r\n return message\r\n .map((m) => {\r\n if (typeof m === 'string') return m;\r\n try {\r\n return JSON.stringify(m, null, 2);\r\n } catch {\r\n return '[Unserializable Object]';\r\n }\r\n })\r\n .join(' ');\r\n }\r\n\r\n private stripAnsi(text: string): string {\r\n return text.replace(/\\x1b\\[[0-9;]*m/g, '');\r\n }\r\n\r\n private output(level: keyof Transport, formattedOutput: string): void {\r\n const finalOutput = this.colors ? formattedOutput : this.stripAnsi(formattedOutput);\r\n this.transport[level](finalOutput);\r\n }\r\n\r\n public success(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output(\r\n 'success',\r\n `${this.getTimestamp()}${this.theme.prefix.success} ${this.theme.success(msg)}`,\r\n );\r\n }\r\n\r\n public error(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output(\r\n 'error',\r\n `${this.getTimestamp()}${this.theme.prefix.error} ${this.theme.error(msg)}`,\r\n );\r\n }\r\n\r\n public warn(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output('warn', `${this.getTimestamp()}${this.theme.prefix.warn} ${this.theme.warn(msg)}`);\r\n }\r\n\r\n public info(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output('info', `${this.getTimestamp()}${this.theme.prefix.info} ${this.theme.info(msg)}`);\r\n }\r\n}\r\n\r\nexport const createLogger = (options?: LoggerOptions): Logger => {\r\n return new Logger(options);\r\n};\r\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __export = (target, all) => {
|
|
3
|
+
for (var name in all)
|
|
4
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// source/utils/ansi.ts
|
|
8
|
+
var ansi_exports = {};
|
|
9
|
+
__export(ansi_exports, {
|
|
10
|
+
blue: () => blue,
|
|
11
|
+
bold: () => bold,
|
|
12
|
+
cyan: () => cyan,
|
|
13
|
+
dim: () => dim,
|
|
14
|
+
format: () => format,
|
|
15
|
+
gray: () => gray,
|
|
16
|
+
green: () => green,
|
|
17
|
+
isColorSupported: () => isColorSupported,
|
|
18
|
+
italic: () => italic,
|
|
19
|
+
magenta: () => magenta,
|
|
20
|
+
red: () => red,
|
|
21
|
+
reset: () => reset,
|
|
22
|
+
underline: () => underline,
|
|
23
|
+
white: () => white,
|
|
24
|
+
yellow: () => yellow
|
|
25
|
+
});
|
|
26
|
+
var isColorSupported = !process.env.NO_COLOR && (process.env.FORCE_COLOR || process.stdout?.isTTY || process.env.TERM === "xterm-256color");
|
|
27
|
+
var format = (code, text) => {
|
|
28
|
+
if (!isColorSupported) return text;
|
|
29
|
+
return `\x1B[${code}m${text}\x1B[0m`;
|
|
30
|
+
};
|
|
31
|
+
var reset = (text) => format(0, text);
|
|
32
|
+
var red = (text) => format(31, text);
|
|
33
|
+
var green = (text) => format(32, text);
|
|
34
|
+
var yellow = (text) => format(33, text);
|
|
35
|
+
var blue = (text) => format(34, text);
|
|
36
|
+
var magenta = (text) => format(35, text);
|
|
37
|
+
var cyan = (text) => format(36, text);
|
|
38
|
+
var white = (text) => format(37, text);
|
|
39
|
+
var gray = (text) => format(90, text);
|
|
40
|
+
var bold = (text) => format(1, text);
|
|
41
|
+
var dim = (text) => format(2, text);
|
|
42
|
+
var italic = (text) => format(3, text);
|
|
43
|
+
var underline = (text) => format(4, text);
|
|
44
|
+
|
|
45
|
+
// source/theme.ts
|
|
46
|
+
var defaultTheme = {
|
|
47
|
+
success: (msg) => green(msg),
|
|
48
|
+
error: (msg) => red(bold(msg)),
|
|
49
|
+
warn: (msg) => yellow(msg),
|
|
50
|
+
info: (msg) => blue(msg),
|
|
51
|
+
prefix: {
|
|
52
|
+
success: green("\u2714"),
|
|
53
|
+
error: red("\u2716"),
|
|
54
|
+
warn: yellow("\u26A0"),
|
|
55
|
+
info: blue("\u2139")
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// source/logger.ts
|
|
60
|
+
var defaultTransport = {
|
|
61
|
+
success: console.log,
|
|
62
|
+
error: console.error,
|
|
63
|
+
warn: console.warn,
|
|
64
|
+
info: console.info
|
|
65
|
+
};
|
|
66
|
+
var Logger = class {
|
|
67
|
+
theme;
|
|
68
|
+
timestamps;
|
|
69
|
+
colors;
|
|
70
|
+
transport;
|
|
71
|
+
constructor(options = {}) {
|
|
72
|
+
this.theme = {
|
|
73
|
+
...defaultTheme,
|
|
74
|
+
...options.theme,
|
|
75
|
+
prefix: {
|
|
76
|
+
...defaultTheme.prefix,
|
|
77
|
+
...options.theme?.prefix
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
this.timestamps = options.timestamps ?? false;
|
|
81
|
+
this.colors = options.colors ?? true;
|
|
82
|
+
this.transport = { ...defaultTransport, ...options.transport };
|
|
83
|
+
}
|
|
84
|
+
getTimestamp() {
|
|
85
|
+
if (!this.timestamps) return "";
|
|
86
|
+
const now = /* @__PURE__ */ new Date();
|
|
87
|
+
const time = now.toISOString().split("T")[1]?.split(".")[0];
|
|
88
|
+
return gray(`[${time}] `);
|
|
89
|
+
}
|
|
90
|
+
formatMessage(message) {
|
|
91
|
+
return message.map((m) => {
|
|
92
|
+
if (typeof m === "string") return m;
|
|
93
|
+
try {
|
|
94
|
+
return JSON.stringify(m, null, 2);
|
|
95
|
+
} catch {
|
|
96
|
+
return "[Unserializable Object]";
|
|
97
|
+
}
|
|
98
|
+
}).join(" ");
|
|
99
|
+
}
|
|
100
|
+
stripAnsi(text) {
|
|
101
|
+
return text.replace(/\x1b\[[0-9;]*m/g, "");
|
|
102
|
+
}
|
|
103
|
+
output(level, formattedOutput) {
|
|
104
|
+
const finalOutput = this.colors ? formattedOutput : this.stripAnsi(formattedOutput);
|
|
105
|
+
this.transport[level](finalOutput);
|
|
106
|
+
}
|
|
107
|
+
success(...message) {
|
|
108
|
+
const msg = this.formatMessage(message);
|
|
109
|
+
this.output(
|
|
110
|
+
"success",
|
|
111
|
+
`${this.getTimestamp()}${this.theme.prefix.success} ${this.theme.success(msg)}`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
error(...message) {
|
|
115
|
+
const msg = this.formatMessage(message);
|
|
116
|
+
this.output(
|
|
117
|
+
"error",
|
|
118
|
+
`${this.getTimestamp()}${this.theme.prefix.error} ${this.theme.error(msg)}`
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
warn(...message) {
|
|
122
|
+
const msg = this.formatMessage(message);
|
|
123
|
+
this.output("warn", `${this.getTimestamp()}${this.theme.prefix.warn} ${this.theme.warn(msg)}`);
|
|
124
|
+
}
|
|
125
|
+
info(...message) {
|
|
126
|
+
const msg = this.formatMessage(message);
|
|
127
|
+
this.output("info", `${this.getTimestamp()}${this.theme.prefix.info} ${this.theme.info(msg)}`);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var createLogger = (options) => {
|
|
131
|
+
return new Logger(options);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
export { Logger, ansi_exports as ansi, createLogger, defaultTheme };
|
|
135
|
+
//# sourceMappingURL=index.mjs.map
|
|
136
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../source/utils/ansi.ts","../source/theme.ts","../source/logger.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const isColorSupported =\r\n !process.env.NO_COLOR &&\r\n (process.env.FORCE_COLOR || process.stdout?.isTTY || process.env.TERM === 'xterm-256color');\r\n\r\nexport const format = (code: number, text: string): string => {\r\n if (!isColorSupported) return text;\r\n return `\\x1b[${code}m${text}\\x1b[0m`;\r\n};\r\n\r\nexport const reset = (text: string): string => format(0, text);\r\nexport const red = (text: string): string => format(31, text);\r\nexport const green = (text: string): string => format(32, text);\r\nexport const yellow = (text: string): string => format(33, text);\r\nexport const blue = (text: string): string => format(34, text);\r\nexport const magenta = (text: string): string => format(35, text);\r\nexport const cyan = (text: string): string => format(36, text);\r\nexport const white = (text: string): string => format(37, text);\r\nexport const gray = (text: string): string => format(90, text);\r\n\r\nexport const bold = (text: string): string => format(1, text);\r\nexport const dim = (text: string): string => format(2, text);\r\nexport const italic = (text: string): string => format(3, text);\r\nexport const underline = (text: string): string => format(4, text);\r\n","import { red, green, yellow, blue, gray, bold } from './utils/ansi.js';\r\n\r\nexport interface Theme {\r\n success: (msg: string) => string;\r\n error: (msg: string) => string;\r\n warn: (msg: string) => string;\r\n info: (msg: string) => string;\r\n prefix: {\r\n success: string;\r\n error: string;\r\n warn: string;\r\n info: string;\r\n };\r\n}\r\n\r\nexport const defaultTheme: Theme = {\r\n success: (msg: string) => green(msg),\r\n error: (msg: string) => red(bold(msg)),\r\n warn: (msg: string) => yellow(msg),\r\n info: (msg: string) => blue(msg),\r\n prefix: {\r\n success: green('✔'),\r\n error: red('✖'),\r\n warn: yellow('⚠'),\r\n info: blue('ℹ'),\r\n },\r\n};\r\n","import { defaultTheme, type Theme } from './theme.js';\r\nimport { gray } from './utils/ansi.js';\r\n\r\nexport interface Transport {\r\n success: (...args: unknown[]) => void;\r\n error: (...args: unknown[]) => void;\r\n warn: (...args: unknown[]) => void;\r\n info: (...args: unknown[]) => void;\r\n}\r\n\r\nexport interface LoggerOptions {\r\n theme?: Partial<Theme>;\r\n timestamps?: boolean;\r\n colors?: boolean;\r\n transport?: Partial<Transport>;\r\n}\r\n\r\nconst defaultTransport: Transport = {\r\n success: console.log,\r\n error: console.error,\r\n warn: console.warn,\r\n info: console.info,\r\n};\r\n\r\nexport class Logger {\r\n private theme: Theme;\r\n private timestamps: boolean;\r\n private colors: boolean;\r\n private transport: Transport;\r\n\r\n constructor(options: LoggerOptions = {}) {\r\n this.theme = {\r\n ...defaultTheme,\r\n ...options.theme,\r\n prefix: {\r\n ...defaultTheme.prefix,\r\n ...options.theme?.prefix,\r\n },\r\n };\r\n this.timestamps = options.timestamps ?? false;\r\n this.colors = options.colors ?? true;\r\n this.transport = { ...defaultTransport, ...options.transport };\r\n }\r\n\r\n private getTimestamp(): string {\r\n if (!this.timestamps) return '';\r\n const now = new Date();\r\n const time = now.toISOString().split('T')[1]?.split('.')[0];\r\n return gray(`[${time}] `);\r\n }\r\n\r\n private formatMessage(message: unknown[]): string {\r\n return message\r\n .map((m) => {\r\n if (typeof m === 'string') return m;\r\n try {\r\n return JSON.stringify(m, null, 2);\r\n } catch {\r\n return '[Unserializable Object]';\r\n }\r\n })\r\n .join(' ');\r\n }\r\n\r\n private stripAnsi(text: string): string {\r\n return text.replace(/\\x1b\\[[0-9;]*m/g, '');\r\n }\r\n\r\n private output(level: keyof Transport, formattedOutput: string): void {\r\n const finalOutput = this.colors ? formattedOutput : this.stripAnsi(formattedOutput);\r\n this.transport[level](finalOutput);\r\n }\r\n\r\n public success(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output(\r\n 'success',\r\n `${this.getTimestamp()}${this.theme.prefix.success} ${this.theme.success(msg)}`,\r\n );\r\n }\r\n\r\n public error(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output(\r\n 'error',\r\n `${this.getTimestamp()}${this.theme.prefix.error} ${this.theme.error(msg)}`,\r\n );\r\n }\r\n\r\n public warn(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output('warn', `${this.getTimestamp()}${this.theme.prefix.warn} ${this.theme.warn(msg)}`);\r\n }\r\n\r\n public info(...message: unknown[]): void {\r\n const msg = this.formatMessage(message);\r\n this.output('info', `${this.getTimestamp()}${this.theme.prefix.info} ${this.theme.info(msg)}`);\r\n }\r\n}\r\n\r\nexport const createLogger = (options?: LoggerOptions): Logger => {\r\n return new Logger(options);\r\n};\r\n"]}
|
package/media/Devink.png
ADDED
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "devink",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Fast, lightweight, professional logger built with TypeScript. No dependencies.",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"media"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18.0.0"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"dev": "tsup --watch",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"lint": "eslint \"source/**/*.ts\"",
|
|
28
|
+
"format": "prettier --write \"source/**/*.ts\" \"tests/**/*.ts\" \"examples/**/*.ts\"",
|
|
29
|
+
"prepack": "npm run build"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"logger",
|
|
33
|
+
"logging",
|
|
34
|
+
"node-logger",
|
|
35
|
+
"typescript-logger",
|
|
36
|
+
"terminal-logger",
|
|
37
|
+
"ansi-colors",
|
|
38
|
+
"cli-logger",
|
|
39
|
+
"console-logger",
|
|
40
|
+
"structured-logger",
|
|
41
|
+
"zero-dependency"
|
|
42
|
+
],
|
|
43
|
+
"author": "",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@eslint/js": "^9.0.0",
|
|
47
|
+
"@types/node": "^20.0.0",
|
|
48
|
+
"eslint": "^9.0.0",
|
|
49
|
+
"eslint-config-prettier": "^9.1.0",
|
|
50
|
+
"globals": "^15.0.0",
|
|
51
|
+
"prettier": "^3.0.0",
|
|
52
|
+
"tsup": "^8.0.0",
|
|
53
|
+
"typescript": "^5.0.0",
|
|
54
|
+
"typescript-eslint": "^8.0.0",
|
|
55
|
+
"vitest": "^2.0.0"
|
|
56
|
+
}
|
|
57
|
+
}
|