@ooneex/logger 0.0.1 → 0.3.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/README.md +434 -0
- package/dist/index.d.ts +62 -49
- package/dist/index.js +19 -21
- package/dist/index.js.map +7 -6
- package/package.json +13 -7
- package/dist/ooneex-logger-0.0.1.tgz +0 -0
package/README.md
CHANGED
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
# @ooneex/logger
|
|
2
|
+
|
|
3
|
+
A structured logging service for TypeScript applications with console and database output support. This package provides customizable log levels, colorized terminal output, SQLite persistence, and seamless integration with the Ooneex dependency injection container.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
✅ **Multiple Outputs** - Terminal (console) and SQLite database logging
|
|
14
|
+
|
|
15
|
+
✅ **Colorized Output** - Beautiful, color-coded terminal logs with ANSI colors
|
|
16
|
+
|
|
17
|
+
✅ **Log Levels** - Support for ERROR, WARN, INFO, DEBUG, LOG, and SUCCESS levels
|
|
18
|
+
|
|
19
|
+
✅ **Exception Support** - Log full exception details including stack traces
|
|
20
|
+
|
|
21
|
+
✅ **Customizable Display** - Toggle timestamps, log levels, arrows, and symbols
|
|
22
|
+
|
|
23
|
+
✅ **Container Integration** - Works seamlessly with dependency injection
|
|
24
|
+
|
|
25
|
+
✅ **Structured Data** - Attach custom data to log entries
|
|
26
|
+
|
|
27
|
+
✅ **Query Logs** - Search and filter logs from SQLite database
|
|
28
|
+
|
|
29
|
+
## Installation
|
|
30
|
+
|
|
31
|
+
### Bun
|
|
32
|
+
```bash
|
|
33
|
+
bun add @ooneex/logger
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### pnpm
|
|
37
|
+
```bash
|
|
38
|
+
pnpm add @ooneex/logger
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Yarn
|
|
42
|
+
```bash
|
|
43
|
+
yarn add @ooneex/logger
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### npm
|
|
47
|
+
```bash
|
|
48
|
+
npm install @ooneex/logger
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Usage
|
|
52
|
+
|
|
53
|
+
### Terminal Logger
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { TerminalLogger } from '@ooneex/logger';
|
|
57
|
+
|
|
58
|
+
const logger = new TerminalLogger();
|
|
59
|
+
await logger.init();
|
|
60
|
+
|
|
61
|
+
// Basic logging
|
|
62
|
+
logger.info('Application started');
|
|
63
|
+
logger.success('User created successfully');
|
|
64
|
+
logger.warn('Cache is nearly full');
|
|
65
|
+
logger.error('Failed to connect to database');
|
|
66
|
+
logger.debug('Processing request', { requestId: '123' });
|
|
67
|
+
logger.log('General log message');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Logging with Data
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
import { TerminalLogger } from '@ooneex/logger';
|
|
74
|
+
|
|
75
|
+
const logger = new TerminalLogger();
|
|
76
|
+
|
|
77
|
+
logger.info('User logged in', {
|
|
78
|
+
userId: 'user-123',
|
|
79
|
+
email: 'user@example.com',
|
|
80
|
+
ip: '192.168.1.1'
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
logger.warn('Rate limit approaching', {
|
|
84
|
+
current: 95,
|
|
85
|
+
limit: 100,
|
|
86
|
+
resetIn: '5 minutes'
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Logging Exceptions
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { TerminalLogger } from '@ooneex/logger';
|
|
94
|
+
import { Exception } from '@ooneex/exception';
|
|
95
|
+
|
|
96
|
+
const logger = new TerminalLogger();
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
throw new Exception('Database connection failed', {
|
|
100
|
+
status: 500,
|
|
101
|
+
data: { host: 'localhost', port: 5432 }
|
|
102
|
+
});
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (error instanceof Exception) {
|
|
105
|
+
logger.error(error);
|
|
106
|
+
// Logs: message, status, data, and formatted stack trace
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### SQLite Logger
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { SqliteLogger } from '@ooneex/logger';
|
|
115
|
+
|
|
116
|
+
const logger = new SqliteLogger({
|
|
117
|
+
filename: './logs.db'
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
await logger.init();
|
|
121
|
+
|
|
122
|
+
// Logs are persisted to SQLite database
|
|
123
|
+
logger.info('Application started', {
|
|
124
|
+
version: '1.0.0',
|
|
125
|
+
environment: 'production'
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
logger.error('Critical error occurred', {
|
|
129
|
+
module: 'payment',
|
|
130
|
+
errorCode: 'PAY_001'
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Customizing Output
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
import { TerminalLogger } from '@ooneex/logger';
|
|
138
|
+
|
|
139
|
+
const logger = new TerminalLogger();
|
|
140
|
+
|
|
141
|
+
// Minimal output (no arrow, timestamp, or level)
|
|
142
|
+
logger.info('Clean message', {}, {
|
|
143
|
+
showArrow: false,
|
|
144
|
+
showTimestamp: false,
|
|
145
|
+
showLevel: false
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
// Use symbols instead of text levels
|
|
149
|
+
logger.success('Task completed', {}, {
|
|
150
|
+
useSymbol: true // Shows ✔ instead of [SUCCESS]
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## API Reference
|
|
155
|
+
|
|
156
|
+
### Classes
|
|
157
|
+
|
|
158
|
+
#### `TerminalLogger`
|
|
159
|
+
|
|
160
|
+
Console-based logger with colorized output.
|
|
161
|
+
|
|
162
|
+
**Constructor:**
|
|
163
|
+
```typescript
|
|
164
|
+
new TerminalLogger()
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Methods:**
|
|
168
|
+
|
|
169
|
+
##### `init(): Promise<void>`
|
|
170
|
+
|
|
171
|
+
Initializes the logger. Call before logging.
|
|
172
|
+
|
|
173
|
+
##### `error(message: string | IException, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void`
|
|
174
|
+
|
|
175
|
+
Logs an error message or exception. Outputs to stderr.
|
|
176
|
+
|
|
177
|
+
**Parameters:**
|
|
178
|
+
- `message` - Error message string or Exception object
|
|
179
|
+
- `data` - Optional data to attach to the log
|
|
180
|
+
- `options` - Display options
|
|
181
|
+
|
|
182
|
+
##### `warn(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void`
|
|
183
|
+
|
|
184
|
+
Logs a warning message.
|
|
185
|
+
|
|
186
|
+
##### `info(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void`
|
|
187
|
+
|
|
188
|
+
Logs an informational message.
|
|
189
|
+
|
|
190
|
+
##### `debug(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void`
|
|
191
|
+
|
|
192
|
+
Logs a debug message.
|
|
193
|
+
|
|
194
|
+
##### `log(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void`
|
|
195
|
+
|
|
196
|
+
Logs a general message.
|
|
197
|
+
|
|
198
|
+
##### `success(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void`
|
|
199
|
+
|
|
200
|
+
Logs a success message.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
#### `SqliteLogger`
|
|
205
|
+
|
|
206
|
+
SQLite-based logger for persistent log storage.
|
|
207
|
+
|
|
208
|
+
**Constructor:**
|
|
209
|
+
```typescript
|
|
210
|
+
new SqliteLogger(options?: Bun.SQL.SQLiteOptions)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Methods:**
|
|
214
|
+
|
|
215
|
+
Same interface as `TerminalLogger`, plus database query capabilities through `LogsRepository`.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
#### `LogsRepository`
|
|
220
|
+
|
|
221
|
+
Repository for querying stored logs.
|
|
222
|
+
|
|
223
|
+
**Methods:**
|
|
224
|
+
|
|
225
|
+
##### `findByCriteria(criteria: FindByCriteriaType): Promise<FindByResultType>`
|
|
226
|
+
|
|
227
|
+
Search logs with filters.
|
|
228
|
+
|
|
229
|
+
**Parameters:**
|
|
230
|
+
- `criteria.level` - Filter by log level
|
|
231
|
+
- `criteria.userId` - Filter by user ID
|
|
232
|
+
- `criteria.email` - Filter by email
|
|
233
|
+
- `criteria.status` - Filter by HTTP status
|
|
234
|
+
- `criteria.method` - Filter by HTTP method
|
|
235
|
+
- `criteria.path` - Filter by request path
|
|
236
|
+
- `criteria.page` - Pagination page number
|
|
237
|
+
- `criteria.limit` - Results per page
|
|
238
|
+
|
|
239
|
+
**Example:**
|
|
240
|
+
```typescript
|
|
241
|
+
const result = await logsRepository.findByCriteria({
|
|
242
|
+
level: ELogLevel.ERROR,
|
|
243
|
+
limit: 50,
|
|
244
|
+
page: 1
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
console.log(result.logs); // Array of log entries
|
|
248
|
+
console.log(result.total); // Total matching logs
|
|
249
|
+
console.log(result.totalPages); // Total pages
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### Interfaces
|
|
253
|
+
|
|
254
|
+
#### `ILogger`
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
interface ILogger<Data = Record<string, ScalarType>> {
|
|
258
|
+
init: () => Promise<void> | void;
|
|
259
|
+
error: (message: string | IException, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
260
|
+
warn: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
261
|
+
info: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
262
|
+
debug: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
263
|
+
log: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
264
|
+
success: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Types
|
|
269
|
+
|
|
270
|
+
#### `LoggerOptionsType`
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
type LoggerOptionsType = {
|
|
274
|
+
showArrow?: boolean; // Show -> prefix (default: true)
|
|
275
|
+
showTimestamp?: boolean; // Show timestamp (default: true)
|
|
276
|
+
showLevel?: boolean; // Show [LEVEL] tag (default: true)
|
|
277
|
+
useSymbol?: boolean; // Use symbols like ✔, ✖ instead of text (default: false)
|
|
278
|
+
};
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
#### `LoggerClassType`
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
type LoggerClassType =
|
|
285
|
+
| (new (...args: unknown[]) => ILogger)
|
|
286
|
+
| (new (options?: Bun.SQL.SQLiteOptions) => ILogger<LogsEntity>);
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Enums
|
|
290
|
+
|
|
291
|
+
#### `ELogLevel`
|
|
292
|
+
|
|
293
|
+
| Value | Description |
|
|
294
|
+
|-------|-------------|
|
|
295
|
+
| `ERROR` | Error level logs |
|
|
296
|
+
| `WARN` | Warning level logs |
|
|
297
|
+
| `INFO` | Informational logs |
|
|
298
|
+
| `DEBUG` | Debug level logs |
|
|
299
|
+
| `LOG` | General logs |
|
|
300
|
+
| `SUCCESS` | Success level logs |
|
|
301
|
+
|
|
302
|
+
## Advanced Usage
|
|
303
|
+
|
|
304
|
+
### Integration with Ooneex App
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
import { App } from '@ooneex/app';
|
|
308
|
+
import { TerminalLogger, SqliteLogger } from '@ooneex/logger';
|
|
309
|
+
|
|
310
|
+
const app = new App({
|
|
311
|
+
loggers: [TerminalLogger, SqliteLogger],
|
|
312
|
+
// ... other config
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
await app.run();
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Using in Controllers
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
import { Route } from '@ooneex/routing';
|
|
322
|
+
import type { IController, ContextType } from '@ooneex/controller';
|
|
323
|
+
|
|
324
|
+
@Route.http({
|
|
325
|
+
name: 'api.users.create',
|
|
326
|
+
path: '/api/users',
|
|
327
|
+
method: 'POST',
|
|
328
|
+
description: 'Create user'
|
|
329
|
+
})
|
|
330
|
+
class UserCreateController implements IController {
|
|
331
|
+
public async index(context: ContextType): Promise<IResponse> {
|
|
332
|
+
const { logger } = context;
|
|
333
|
+
|
|
334
|
+
logger.info('Creating user', { email: context.payload.email });
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
const user = await this.createUser(context.payload);
|
|
338
|
+
logger.success('User created', { userId: user.id });
|
|
339
|
+
return context.response.json({ user });
|
|
340
|
+
} catch (error) {
|
|
341
|
+
logger.error(error as IException);
|
|
342
|
+
throw error;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Custom Logger Implementation
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
import { type ILogger, type LoggerOptionsType } from '@ooneex/logger';
|
|
352
|
+
import type { ScalarType } from '@ooneex/types';
|
|
353
|
+
import type { IException } from '@ooneex/exception';
|
|
354
|
+
|
|
355
|
+
class CloudLogger implements ILogger {
|
|
356
|
+
public async init(): Promise<void> {
|
|
357
|
+
// Initialize cloud logging service
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
public async error(
|
|
361
|
+
message: string | IException,
|
|
362
|
+
data?: Record<string, ScalarType>,
|
|
363
|
+
options?: LoggerOptionsType
|
|
364
|
+
): Promise<void> {
|
|
365
|
+
await this.sendToCloud('ERROR', message, data);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Implement other methods...
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
### Decorator Registration
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
import { decorator } from '@ooneex/logger';
|
|
376
|
+
import { container } from '@ooneex/container';
|
|
377
|
+
|
|
378
|
+
@decorator.logger()
|
|
379
|
+
class CustomLogger implements ILogger {
|
|
380
|
+
// Implementation
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Logger is automatically registered with container
|
|
384
|
+
const logger = container.get(CustomLogger);
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## Log Output Format
|
|
388
|
+
|
|
389
|
+
### Terminal Output Example
|
|
390
|
+
|
|
391
|
+
```
|
|
392
|
+
-> 2024-01-15 10:30:45 [INFO] Application started
|
|
393
|
+
version: 1.0.0
|
|
394
|
+
environment: production
|
|
395
|
+
|
|
396
|
+
-> 2024-01-15 10:30:46 [SUCCESS] Database connected
|
|
397
|
+
host: localhost
|
|
398
|
+
database: myapp
|
|
399
|
+
|
|
400
|
+
-> 2024-01-15 10:31:00 [ERROR] Request failed
|
|
401
|
+
status: 500
|
|
402
|
+
path: /api/users
|
|
403
|
+
Stack Trace:
|
|
404
|
+
1. processRequest
|
|
405
|
+
at /app/src/server.ts:42:15
|
|
406
|
+
2. handleError
|
|
407
|
+
at /app/src/middleware.ts:28:10
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
## License
|
|
411
|
+
|
|
412
|
+
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
|
413
|
+
|
|
414
|
+
## Contributing
|
|
415
|
+
|
|
416
|
+
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
|
|
417
|
+
|
|
418
|
+
### Development Setup
|
|
419
|
+
|
|
420
|
+
1. Clone the repository
|
|
421
|
+
2. Install dependencies: `bun install`
|
|
422
|
+
3. Run tests: `bun run test`
|
|
423
|
+
4. Build the project: `bun run build`
|
|
424
|
+
|
|
425
|
+
### Guidelines
|
|
426
|
+
|
|
427
|
+
- Write tests for new features
|
|
428
|
+
- Follow the existing code style
|
|
429
|
+
- Update documentation for API changes
|
|
430
|
+
- Ensure all tests pass before submitting PR
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
Made with ❤️ by the Ooneex team
|
package/dist/index.d.ts
CHANGED
|
@@ -1,27 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
declare class LogsDatabase implements IDatabase {
|
|
3
|
-
private client;
|
|
4
|
-
private options;
|
|
5
|
-
constructor(options?: Bun.SQL.SQLiteOptions);
|
|
6
|
-
getClient(): Bun.SQL;
|
|
7
|
-
open(): Promise<void>;
|
|
8
|
-
createTable(): Promise<void>;
|
|
9
|
-
dropTable(): Promise<void>;
|
|
10
|
-
close(): Promise<void>;
|
|
11
|
-
drop(): Promise<void>;
|
|
12
|
-
}
|
|
13
|
-
import { ExceptionStackFrameType } from "@ooneex/exception";
|
|
14
|
-
import { HttpMethodType as HttpMethodType2, ScalarType as ScalarType2 } from "@ooneex/types";
|
|
1
|
+
import { EContainerScope } from "@ooneex/container";
|
|
15
2
|
import { IException } from "@ooneex/exception";
|
|
3
|
+
import { HttpMethodType as HttpMethodType2, ScalarType as ScalarType2 } from "@ooneex/types";
|
|
4
|
+
import { ExceptionStackFrameType } from "@ooneex/exception";
|
|
16
5
|
import { HttpMethodType, ScalarType } from "@ooneex/types";
|
|
6
|
+
declare class LogsEntity {
|
|
7
|
+
id?: string;
|
|
8
|
+
level?: LevelType;
|
|
9
|
+
message?: string;
|
|
10
|
+
date: Date;
|
|
11
|
+
userId?: string;
|
|
12
|
+
email?: string;
|
|
13
|
+
lastName?: string;
|
|
14
|
+
firstName?: string;
|
|
15
|
+
status?: number;
|
|
16
|
+
exceptionName?: string;
|
|
17
|
+
stackTrace?: ExceptionStackFrameType[];
|
|
18
|
+
ip?: string;
|
|
19
|
+
method?: HttpMethodType;
|
|
20
|
+
path?: string;
|
|
21
|
+
userAgent?: string;
|
|
22
|
+
referer?: string;
|
|
23
|
+
params?: Record<string, ScalarType>;
|
|
24
|
+
payload?: Record<string, unknown>;
|
|
25
|
+
queries?: Record<string, ScalarType>;
|
|
26
|
+
}
|
|
17
27
|
type LoggerClassType = (new (...args: unknown[]) => ILogger) | (new (options?: Bun.SQL.SQLiteOptions) => ILogger<LogsEntity>);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
type LoggerOptionsType = {
|
|
29
|
+
showArrow?: boolean;
|
|
30
|
+
showTimestamp?: boolean;
|
|
31
|
+
showLevel?: boolean;
|
|
32
|
+
useSymbol?: boolean;
|
|
33
|
+
};
|
|
34
|
+
interface ILogger<Data = Record<string, ScalarType2>> {
|
|
35
|
+
init: () => Promise<void> | void;
|
|
36
|
+
error: (message: string | IException, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
37
|
+
warn: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
38
|
+
info: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
39
|
+
debug: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
40
|
+
log: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
41
|
+
success: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;
|
|
25
42
|
}
|
|
26
43
|
declare enum ELogLevel {
|
|
27
44
|
ERROR = "ERROR",
|
|
@@ -40,7 +57,7 @@ type FindByCriteriaType = {
|
|
|
40
57
|
firstName?: string;
|
|
41
58
|
status?: number;
|
|
42
59
|
exceptionName?: string;
|
|
43
|
-
method?:
|
|
60
|
+
method?: HttpMethodType2;
|
|
44
61
|
path?: string;
|
|
45
62
|
page?: number;
|
|
46
63
|
limit?: number;
|
|
@@ -52,26 +69,20 @@ type FindByResultType = {
|
|
|
52
69
|
limit: number;
|
|
53
70
|
totalPages: number;
|
|
54
71
|
};
|
|
55
|
-
declare
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
path?: string;
|
|
70
|
-
userAgent?: string;
|
|
71
|
-
referer?: string;
|
|
72
|
-
params?: Record<string, ScalarType2>;
|
|
73
|
-
payload?: Record<string, unknown>;
|
|
74
|
-
queries?: Record<string, ScalarType2>;
|
|
72
|
+
declare const decorator: {
|
|
73
|
+
logger: (scope?: EContainerScope) => (target: LoggerClassType) => void;
|
|
74
|
+
};
|
|
75
|
+
import { IDatabase } from "@ooneex/database";
|
|
76
|
+
declare class LogsDatabase implements IDatabase {
|
|
77
|
+
private client;
|
|
78
|
+
private options;
|
|
79
|
+
constructor(options?: Bun.SQL.SQLiteOptions);
|
|
80
|
+
getClient(): Bun.SQL;
|
|
81
|
+
open(): Promise<void>;
|
|
82
|
+
createTable(): Promise<void>;
|
|
83
|
+
dropTable(): Promise<void>;
|
|
84
|
+
close(): Promise<void>;
|
|
85
|
+
drop(): Promise<void>;
|
|
75
86
|
}
|
|
76
87
|
declare class LogsRepository {
|
|
77
88
|
private db;
|
|
@@ -99,12 +110,14 @@ import { ScalarType as ScalarType3 } from "@ooneex/types";
|
|
|
99
110
|
declare class TerminalLogger implements ILogger {
|
|
100
111
|
private colorizeText;
|
|
101
112
|
private getLevelColor;
|
|
113
|
+
private getLevelSymbol;
|
|
102
114
|
private writeToConsole;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
init(): Promise<void>;
|
|
116
|
+
error(message: string | IException3, data?: Record<string, ScalarType3>, options?: LoggerOptionsType): void;
|
|
117
|
+
warn(message: string, data?: Record<string, ScalarType3>, options?: LoggerOptionsType): void;
|
|
118
|
+
info(message: string, data?: Record<string, ScalarType3>, options?: LoggerOptionsType): void;
|
|
119
|
+
debug(message: string, data?: Record<string, ScalarType3>, options?: LoggerOptionsType): void;
|
|
120
|
+
log(message: string, data?: Record<string, ScalarType3>, options?: LoggerOptionsType): void;
|
|
121
|
+
success(message: string, data?: Record<string, ScalarType3>, options?: LoggerOptionsType): void;
|
|
109
122
|
}
|
|
110
|
-
export { TerminalLogger, SqliteLogger, LogsRepository, LogsEntity, LogsDatabase, LoggerClassType, LevelType, ILogger, FindByResultType, FindByCriteriaType, ELogLevel };
|
|
123
|
+
export { decorator, TerminalLogger, SqliteLogger, LogsRepository, LogsEntity, LogsDatabase, LoggerOptionsType, LoggerClassType, LevelType, ILogger, FindByResultType, FindByCriteriaType, ELogLevel };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{DatabaseException as
|
|
2
|
+
import{container as E,EContainerScope as q}from"@ooneex/container";var f={logger:(y=q.Singleton)=>{return(S)=>{E.add(S,y)}}};import{DatabaseException as D}from"@ooneex/database";class K{client;options;constructor(y){let S=y?.filename||Bun.env.LOGS_DATABASE_PATH||"";if(!S)throw new D("No database filename provided. Please set LOGS_DATABASE_PATH environment variable or provide a filename in the options.");this.options={filename:S,readonly:!1,create:!0,readwrite:!0,strict:!0,safeIntegers:!1,...y,adapter:"sqlite"}}getClient(){if(!this.client)try{this.client=new Bun.SQL(this.options)}catch(y){throw new D(y.message)}return this.client}async open(){this.getClient()}async createTable(){let y=this.getClient();try{await y`PRAGMA foreign_keys = ON`,await y`PRAGMA journal_mode = WAL`,await y`PRAGMA integrity_check`,await y`
|
|
3
3
|
CREATE TABLE IF NOT EXISTS logs (
|
|
4
4
|
id TEXT PRIMARY KEY,
|
|
5
5
|
level TEXT NOT NULL,
|
|
@@ -27,36 +27,34 @@ import{DatabaseException as Q}from"@ooneex/database";class ${client;options;cons
|
|
|
27
27
|
domain TEXT,
|
|
28
28
|
hostname TEXT
|
|
29
29
|
)
|
|
30
|
-
`,await
|
|
30
|
+
`,await y`CREATE INDEX IF NOT EXISTS idx_logs_level ON logs(level)`,await y`CREATE INDEX IF NOT EXISTS idx_logs_user_id ON logs(userId)`}catch(S){throw new D("Failed to open log database connection")}}async dropTable(){let y=this.getClient();try{await y`DROP TABLE IF EXISTS logs`}catch(S){throw new D("Failed to drop log tables")}}async close(){try{await this.client?.close(),this.client=void 0}catch(y){throw new D("Failed to close log database connection")}}async drop(){}}class X{id;level;message;date=new Date;userId;email;lastName;firstName;status;exceptionName;stackTrace;ip;method;path;userAgent;referer;params;payload;queries}import{deserialize as N,serialize as Y}from"bun:jsc";import{random as z}from"@ooneex/utils";var{sql:U}=globalThis.Bun;class Z{db;constructor(y){this.db=y}async create(y){let S=this.db.getClient(),T={...y,id:z.nanoid(15),date:y.date.toISOString(),stackTrace:y.stackTrace?Y(y.stackTrace):null,params:y.params?Y(y.params):null,payload:y.payload?Y(y.payload):null,queries:y.queries?Y(y.queries):null},[O]=await S`
|
|
31
31
|
INSERT INTO logs ${U(T)}
|
|
32
32
|
RETURNING *
|
|
33
|
-
`;return await this.db.close(),
|
|
33
|
+
`;return await this.db.close(),O}async find(y){let S=this.db.getClient(),[T]=await S`
|
|
34
34
|
SELECT * FROM logs
|
|
35
|
-
WHERE id = ${
|
|
35
|
+
WHERE id = ${y}
|
|
36
36
|
LIMIT 1
|
|
37
|
-
`;if(!T)return await this.db.close(),null;let
|
|
37
|
+
`;if(!T)return await this.db.close(),null;let O={...T,date:new Date(T.date),stackTrace:T.stackTrace?N(T.stackTrace):void 0,params:T.params?N(T.params):void 0,payload:T.payload?N(T.payload):void 0,queries:T.queries?N(T.queries):void 0};return await this.db.close(),O}async findBy(y){let S=this.db.getClient(),T=[];if(y.level!==void 0)T.push(U`level = ${y.level}`);if(y.userId!==void 0)T.push(U`userId = ${y.userId}`);if(y.email!==void 0)T.push(U`email = ${y.email}`);if(y.lastName!==void 0)T.push(U`lastName = ${y.lastName}`);if(y.firstName!==void 0)T.push(U`firstName = ${y.firstName}`);if(y.status!==void 0)T.push(U`status = ${y.status}`);if(y.exceptionName!==void 0)T.push(U`exceptionName = ${y.exceptionName}`);if(y.method!==void 0)T.push(U`method = ${y.method}`);if(y.path!==void 0)T.push(U`path = ${y.path}`);let O=y.limit||100,R=y.page||1,L=(R-1)*O;if(T.length===0){let[P]=await S`SELECT COUNT(*) as total FROM logs`,Q=(await S`
|
|
38
38
|
SELECT * FROM logs
|
|
39
39
|
ORDER BY date DESC
|
|
40
|
-
LIMIT ${
|
|
41
|
-
OFFSET ${
|
|
42
|
-
`).map((
|
|
40
|
+
LIMIT ${O}
|
|
41
|
+
OFFSET ${L}
|
|
42
|
+
`).map((I)=>({...I,date:new Date(I.date),stackTrace:I.stackTrace?N(I.stackTrace):void 0,params:I.params?N(I.params):void 0,payload:I.payload?N(I.payload):void 0,queries:I.queries?N(I.queries):void 0})),$=P.total,V=Math.ceil($/O),J={logs:Q,total:$,page:R,limit:O,totalPages:V};return await this.db.close(),J}let F=T.reduce((P,x,Q)=>{if(Q===0)return x;return U`${P} AND ${x}`}),[_]=await S`
|
|
43
43
|
SELECT COUNT(*) as total
|
|
44
44
|
FROM logs
|
|
45
45
|
WHERE ${F}
|
|
46
|
-
`,
|
|
46
|
+
`,j=(await S`
|
|
47
47
|
SELECT * FROM logs
|
|
48
48
|
WHERE ${F}
|
|
49
49
|
ORDER BY date DESC
|
|
50
|
-
LIMIT ${
|
|
51
|
-
OFFSET ${
|
|
52
|
-
`).map((
|
|
53
|
-
`);
|
|
54
|
-
${
|
|
55
|
-
${
|
|
56
|
-
${
|
|
57
|
-
at ${
|
|
58
|
-
`,S==="FATAL"||S==="ERROR")process.stderr.write(`${y}
|
|
59
|
-
`);else process.stdout.write(`${y}
|
|
60
|
-
`)}error(p,S){if(typeof p==="string")this.writeToConsole({level:"ERROR",message:p,...S&&{data:S}});else{let T={...p.data,...S};if(p.status)T.status=p.status;let R=p.stackToJson();this.writeToConsole({level:p.name,message:p.message,data:T,...R&&{stackTrace:R},date:p.date})}}warn(p,S){this.writeToConsole({level:"WARN",message:p,...S&&{data:S}})}info(p,S){this.writeToConsole({level:"INFO",message:p,...S&&{data:S}})}debug(p,S){this.writeToConsole({level:"DEBUG",message:p,...S&&{data:S}})}log(p,S){this.writeToConsole({level:"LOG",message:p,...S&&{data:S}})}success(p,S){this.writeToConsole({level:"SUCCESS",message:p,...S&&{data:S}})}}var v;((F)=>{F.ERROR="ERROR";F.WARN="WARN";F.INFO="INFO";F.DEBUG="DEBUG";F.LOG="LOG";F.SUCCESS="SUCCESS"})(v||={});export{J as TerminalLogger,V as SqliteLogger,Y as LogsRepository,K as LogsEntity,$ as LogsDatabase,v as ELogLevel};
|
|
50
|
+
LIMIT ${O}
|
|
51
|
+
OFFSET ${L}
|
|
52
|
+
`).map((P)=>({...P,date:new Date(P.date),params:P.params?N(P.params):void 0,payload:P.payload?N(P.payload):void 0,queries:P.queries?N(P.queries):void 0})),G=_.total,H=Math.ceil(G/O),A={logs:j,total:G,page:R,limit:O,totalPages:H};return await this.db.close(),A}}class C{db;repository;constructor(y){this.db=new K(y),this.repository=new Z(this.db)}async init(){await this.db.open(),await this.db.createTable()}error(y,S){if(typeof y==="string")this.writeLog("ERROR",{message:y,...S&&{data:S}});else this.writeLog("ERROR",{exception:y})}warn(y,S){this.writeLog("WARN",{message:y,...S&&{data:S}})}info(y,S){this.writeLog("INFO",{message:y,...S&&{data:S}})}debug(y,S){this.writeLog("DEBUG",{message:y,...S&&{data:S}})}log(y,S){this.writeLog("LOG",{message:y,...S&&{data:S}})}success(y,S){this.writeLog("SUCCESS",{message:y,...S&&{data:S}})}writeLog(y,S){let{message:T,data:O,exception:R}=S||{},L=new X;if(L.level=y,T)L.message=T;else if(R?.message)L.message=R.message;if(L.date=R?.date||new Date,O?.userId!==void 0)L.userId=O.userId;if(O?.email!==void 0)L.email=O.email;if(O?.lastName!==void 0)L.lastName=O.lastName;if(O?.firstName!==void 0)L.firstName=O.firstName;if(R?.status!==void 0)L.status=R.status;else if(O?.status!==void 0)L.status=O.status;if(R?.name!==void 0)L.exceptionName=R.name;let F=R?.stackToJson();if(F!==void 0&&F!==null)L.stackTrace=F;if(O?.ip!==void 0)L.ip=O.ip;if(O?.method!==void 0)L.method=O.method;if(O?.path!==void 0)L.path=O.path;if(O?.userAgent!==void 0)L.userAgent=O.userAgent;if(O?.referer!==void 0)L.referer=O.referer;if(O?.params!==void 0)L.params=O.params;if(O?.payload!==void 0)L.payload=O.payload;if(O?.queries!==void 0)L.queries=O.queries;this.repository.create(L)}}class k{colorizeText(y,S){let T=Bun.color(S,"ansi"),O="\x1B[0m";return T?`${T}${y}\x1B[0m`:y}getLevelColor(y){return{ERROR:"#FF3B30",WARN:"#FFCC00",INFO:"#007AFF",DEBUG:"#8E8E93",LOG:"#8E8E93",SUCCESS:"#00C851"}[y.toUpperCase()]||"white"}getLevelSymbol(y){return{ERROR:"\u2716",WARN:"\u26A0",INFO:"\u2139",DEBUG:"\u2699",LOG:"\u25CF",SUCCESS:"\u2714"}[y.toUpperCase()]||"\u25CF"}writeToConsole(y){let{level:S,message:T,date:O,data:R,stackTrace:L,showArrow:F=!0,showTimestamp:_=!0,showLevel:h=!0,useSymbol:j=!1}=y,G=S.endsWith("Exception")?"ERROR":S,H=this.getLevelColor(G),A=O||new Date,P=`${A.getFullYear()}-${String(A.getMonth()+1).padStart(2,"0")}-${String(A.getDate()).padStart(2,"0")} ${String(A.getHours()).padStart(2,"0")}:${String(A.getMinutes()).padStart(2,"0")}:${String(A.getSeconds()).padStart(2,"0")}`,x=_?`${this.colorizeText(P,"#B2BEB5")} `:"",Q=F?`${this.colorizeText("->",H)} `:"",$=j?this.getLevelSymbol(G):`[${S}]`,V=h?`${this.colorizeText($,H)} `:"",J=this.colorizeText(T,H),I=`${Q}${x}${V}${J}`;if(R&&Object.keys(R).length>0){let b=Object.entries(R).filter(([B])=>B!=="stackTrace").map(([B,W])=>{let M=typeof W==="string"?"#69E502":typeof W==="number"?"#FFE809":"#D3D3D3",u=this.colorizeText(String(W),M);return`${this.colorizeText(B,"#79B")}: ${u}`});if(b.length>0){let B=b.join(`
|
|
53
|
+
`);I+=`
|
|
54
|
+
${B}`}}if(L&&Array.isArray(L)&&L.length>0){let b=this.colorizeText("Stack Trace:","#FF6B6B");I+=`
|
|
55
|
+
${b}`,L.forEach((B,W)=>{let M=this.colorizeText(` ${W+1}.`,"#B2BEB5"),u=B.functionName?this.colorizeText(B.functionName,"#FFD93D"):this.colorizeText("<anonymous>","#8E8E93"),v=B.fileName?this.colorizeText(B.fileName,"#6BCF7F"):"",w=B.lineNumber?this.colorizeText(`:${B.lineNumber}${B.columnNumber?`:${B.columnNumber}`:""}`,"#B2BEB5"):"";if(I+=`
|
|
56
|
+
${M} ${u}`,v)I+=`
|
|
57
|
+
at ${v}${w}`})}if(I+=`
|
|
58
|
+
`,S==="FATAL"||S==="ERROR")process.stderr.write(`${I}`);else process.stdout.write(`${I}`)}async init(){}error(y,S,T){if(typeof y==="string")this.writeToConsole({level:"ERROR",message:y,...S&&{data:S},...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}});else{let O={...y.data,...S};if(y.status)O.status=y.status;let R=y.stackToJson();this.writeToConsole({level:y.name,message:y.message,data:O,...R&&{stackTrace:R},date:y.date,...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}})}}warn(y,S,T){this.writeToConsole({level:"WARN",message:y,...S&&{data:S},...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}})}info(y,S,T){this.writeToConsole({level:"INFO",message:y,...S&&{data:S},...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}})}debug(y,S,T){this.writeToConsole({level:"DEBUG",message:y,...S&&{data:S},...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}})}log(y,S,T){this.writeToConsole({level:"LOG",message:y,...S&&{data:S},...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}})}success(y,S,T){this.writeToConsole({level:"SUCCESS",message:y,...S&&{data:S},...T?.showArrow!==void 0&&{showArrow:T.showArrow},...T?.showTimestamp!==void 0&&{showTimestamp:T.showTimestamp},...T?.showLevel!==void 0&&{showLevel:T.showLevel},...T?.useSymbol!==void 0&&{useSymbol:T.useSymbol}})}}var m;((F)=>{F.ERROR="ERROR";F.WARN="WARN";F.INFO="INFO";F.DEBUG="DEBUG";F.LOG="LOG";F.SUCCESS="SUCCESS"})(m||={});export{f as decorator,k as TerminalLogger,C as SqliteLogger,Z as LogsRepository,X as LogsEntity,K as LogsDatabase,m as ELogLevel};
|
|
61
59
|
|
|
62
|
-
//# debugId=
|
|
60
|
+
//# debugId=09267DB0F42C699464756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["src/LogsDatabase.ts", "src/LogsEntity.ts", "src/LogsRepository.ts", "src/SqliteLogger.ts", "src/TerminalLogger.ts", "src/types.ts"],
|
|
3
|
+
"sources": ["src/decorators.ts", "src/LogsDatabase.ts", "src/LogsEntity.ts", "src/LogsRepository.ts", "src/SqliteLogger.ts", "src/TerminalLogger.ts", "src/types.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
+
"import { container, EContainerScope } from \"@ooneex/container\";\nimport type { LoggerClassType } from \"./types\";\n\nexport const decorator = {\n logger: (scope: EContainerScope = EContainerScope.Singleton) => {\n return (target: LoggerClassType): void => {\n container.add(target, scope);\n };\n },\n};\n",
|
|
5
6
|
"import { DatabaseException, type IDatabase } from \"@ooneex/database\";\n\nexport class LogsDatabase implements IDatabase {\n private client: Bun.SQL | undefined;\n private options: Bun.SQL.SQLiteOptions;\n\n constructor(options?: Bun.SQL.SQLiteOptions) {\n const fileName = options?.filename || Bun.env.LOGS_DATABASE_PATH || \"\";\n\n if (!fileName) {\n throw new DatabaseException(\n \"No database filename provided. Please set LOGS_DATABASE_PATH environment variable or provide a filename in the options.\",\n );\n }\n\n this.options = {\n filename: fileName,\n readonly: false,\n create: true,\n readwrite: true,\n strict: true,\n safeIntegers: false,\n ...options,\n adapter: \"sqlite\",\n };\n }\n\n public getClient(): Bun.SQL {\n if (!this.client) {\n try {\n this.client = new Bun.SQL(this.options);\n } catch (error) {\n throw new DatabaseException((error as Error).message);\n }\n }\n\n return this.client;\n }\n\n public async open(): Promise<void> {\n this.getClient();\n }\n\n public async createTable(): Promise<void> {\n const sql = this.getClient();\n\n try {\n await sql`PRAGMA foreign_keys = ON`;\n await sql`PRAGMA journal_mode = WAL`;\n await sql`PRAGMA integrity_check`;\n\n // Create logs table if it doesn't exist\n await sql`\n CREATE TABLE IF NOT EXISTS logs (\n id TEXT PRIMARY KEY,\n level TEXT NOT NULL,\n message TEXT,\n date TEXT NOT NULL,\n userId TEXT,\n email TEXT,\n lastName TEXT,\n firstName TEXT,\n status INTEGER,\n exceptionName TEXT,\n stackTrace TEXT,\n ip TEXT,\n method TEXT,\n path TEXT,\n userAgent TEXT,\n referer TEXT,\n params TEXT,\n payload TEXT,\n queries TEXT,\n protocol TEXT,\n host TEXT,\n port INTEGER,\n subdomain TEXT,\n domain TEXT,\n hostname TEXT\n )\n `;\n\n // Create indexes for better query performance\n await sql`CREATE INDEX IF NOT EXISTS idx_logs_level ON logs(level)`;\n await sql`CREATE INDEX IF NOT EXISTS idx_logs_user_id ON logs(userId)`;\n } catch (_e) {\n throw new DatabaseException(\"Failed to open log database connection\");\n }\n }\n\n public async dropTable(): Promise<void> {\n const sql = this.getClient();\n\n try {\n await sql`DROP TABLE IF EXISTS logs`;\n } catch (_e) {\n throw new DatabaseException(\"Failed to drop log tables\");\n }\n }\n\n public async close(): Promise<void> {\n try {\n await this.client?.close();\n this.client = undefined as Bun.SQL | undefined;\n } catch (_e) {\n throw new DatabaseException(\"Failed to close log database connection\");\n }\n }\n\n public async drop(): Promise<void> {}\n}\n",
|
|
6
7
|
"import type { ExceptionStackFrameType } from \"@ooneex/exception\";\nimport type { HttpMethodType, ScalarType } from \"@ooneex/types\";\nimport type { LevelType } from \"./types\";\n\nexport class LogsEntity {\n id?: string;\n level?: LevelType;\n message?: string;\n date: Date = new Date();\n userId?: string;\n email?: string;\n lastName?: string;\n firstName?: string;\n status?: number;\n exceptionName?: string;\n stackTrace?: ExceptionStackFrameType[];\n ip?: string;\n method?: HttpMethodType;\n path?: string;\n userAgent?: string;\n referer?: string;\n params?: Record<string, ScalarType>;\n payload?: Record<string, unknown>;\n queries?: Record<string, ScalarType>;\n}\n",
|
|
7
8
|
"import { deserialize, serialize } from \"bun:jsc\";\nimport { random } from \"@ooneex/utils\";\nimport { sql } from \"bun\";\nimport type { LogsDatabase } from \"./LogsDatabase\";\nimport type { LogsEntity } from \"./LogsEntity\";\nimport type { FindByCriteriaType, FindByResultType } from \"./types\";\n\ntype RawLogRecordType = {\n id: string;\n level: string;\n message?: string;\n date: string;\n userId?: string;\n email?: string;\n lastName?: string;\n firstName?: string;\n status?: number;\n exceptionName?: string;\n stackTrace?: Buffer;\n ip?: string;\n method?: string;\n path?: string;\n userAgent?: string;\n referer?: string;\n params?: Buffer;\n payload?: Buffer;\n queries?: Buffer;\n};\n\nexport class LogsRepository {\n constructor(private db: LogsDatabase) {}\n\n public async create(log: LogsEntity): Promise<LogsEntity> {\n const client = this.db.getClient();\n\n const data = {\n ...log,\n id: random.nanoid(15),\n date: log.date.toISOString(),\n stackTrace: log.stackTrace ? serialize(log.stackTrace) : null,\n params: log.params ? serialize(log.params) : null,\n payload: log.payload ? serialize(log.payload) : null,\n queries: log.queries ? serialize(log.queries) : null,\n };\n\n const [newLog] = await client`\n INSERT INTO logs ${sql(data)}\n RETURNING *\n `;\n\n await this.db.close();\n\n return newLog as LogsEntity;\n }\n\n public async find(id: string): Promise<LogsEntity | null> {\n const client = this.db.getClient();\n\n const [log] = await client`\n SELECT * FROM logs\n WHERE id = ${id}\n LIMIT 1\n `;\n\n if (!log) {\n await this.db.close();\n return null;\n }\n\n const result = {\n ...log,\n date: new Date(log.date),\n stackTrace: log.stackTrace ? deserialize(log.stackTrace) : undefined,\n params: log.params ? deserialize(log.params) : undefined,\n payload: log.payload ? deserialize(log.payload) : undefined,\n queries: log.queries ? deserialize(log.queries) : undefined,\n };\n\n await this.db.close();\n\n return result;\n }\n\n public async findBy(criteria: FindByCriteriaType): Promise<FindByResultType> {\n const client = this.db.getClient();\n\n // Build WHERE conditions using SQL fragments\n const whereConditions: unknown[] = [];\n\n if (criteria.level !== undefined) {\n whereConditions.push(sql`level = ${criteria.level}`);\n }\n\n if (criteria.userId !== undefined) {\n whereConditions.push(sql`userId = ${criteria.userId}`);\n }\n\n if (criteria.email !== undefined) {\n whereConditions.push(sql`email = ${criteria.email}`);\n }\n\n if (criteria.lastName !== undefined) {\n whereConditions.push(sql`lastName = ${criteria.lastName}`);\n }\n\n if (criteria.firstName !== undefined) {\n whereConditions.push(sql`firstName = ${criteria.firstName}`);\n }\n\n if (criteria.status !== undefined) {\n whereConditions.push(sql`status = ${criteria.status}`);\n }\n\n if (criteria.exceptionName !== undefined) {\n whereConditions.push(sql`exceptionName = ${criteria.exceptionName}`);\n }\n\n if (criteria.method !== undefined) {\n whereConditions.push(sql`method = ${criteria.method}`);\n }\n\n if (criteria.path !== undefined) {\n whereConditions.push(sql`path = ${criteria.path}`);\n }\n\n // Handle pagination\n const limit = criteria.limit || 100; // Default limit of 100\n const page = criteria.page || 1; // Default to page 1\n const offset = (page - 1) * limit;\n\n // If no criteria provided, get all records with pagination\n if (whereConditions.length === 0) {\n const [countResult] = await client`SELECT COUNT(*) as total FROM logs`;\n const logs = await client`\n SELECT * FROM logs\n ORDER BY date DESC\n LIMIT ${limit}\n OFFSET ${offset}\n `;\n\n const transformedLogs = logs.map((log: RawLogRecordType) => ({\n ...log,\n date: new Date(log.date),\n stackTrace: log.stackTrace ? deserialize(log.stackTrace) : undefined,\n params: log.params ? deserialize(log.params) : undefined,\n payload: log.payload ? deserialize(log.payload) : undefined,\n queries: log.queries ? deserialize(log.queries) : undefined,\n })) as LogsEntity[];\n\n const total = countResult.total;\n const totalPages = Math.ceil(total / limit);\n\n const result = {\n logs: transformedLogs,\n total,\n page,\n limit,\n totalPages,\n };\n\n await this.db.close();\n\n return result;\n }\n\n // Build the WHERE clause by joining fragments with AND\n const whereClause = whereConditions.reduce((acc, condition, index) => {\n if (index === 0) {\n return condition;\n }\n return sql`${acc} AND ${condition}`;\n });\n\n // Get total count for pagination\n const [countResult] = await client`\n SELECT COUNT(*) as total\n FROM logs\n WHERE ${whereClause}\n `;\n\n // Execute the query with proper SQL fragment composition and pagination\n const logs = await client`\n SELECT * FROM logs\n WHERE ${whereClause}\n ORDER BY date DESC\n LIMIT ${limit}\n OFFSET ${offset}\n `;\n\n // Transform and deserialize results\n const transformedLogs = logs.map((log: RawLogRecordType) => ({\n ...log,\n date: new Date(log.date),\n params: log.params ? deserialize(log.params) : undefined,\n payload: log.payload ? deserialize(log.payload) : undefined,\n queries: log.queries ? deserialize(log.queries) : undefined,\n }));\n\n const total = countResult.total;\n const totalPages = Math.ceil(total / limit);\n\n const result = {\n logs: transformedLogs,\n total,\n page,\n limit,\n totalPages,\n };\n\n await this.db.close();\n\n return result;\n }\n}\n",
|
|
8
|
-
"import type { IException } from \"@ooneex/exception\";\
|
|
9
|
-
"import type { ExceptionStackFrameType, IException } from \"@ooneex/exception\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport type { ILogger } from \"./types\";\n\ninterface WriteToConsoleConfig {\n level: string;\n message: string;\n date?: Date;\n data?: Record<string, ScalarType>;\n stackTrace?: ExceptionStackFrameType[];\n}\n\nexport class TerminalLogger implements ILogger {\n private colorizeText(text: string, color: string): string {\n const ansiColor = Bun.color(color, \"ansi\");\n const resetAnsi = \"\\u001b[0m\";\n return ansiColor ? `${ansiColor}${text}${resetAnsi}` : text;\n }\n\n private getLevelColor(level: string): string {\n const colorMap: Record<string, string> = {\n ERROR: \"#FF3B30\",\n WARN: \"#FFCC00\",\n INFO: \"#007AFF\",\n DEBUG: \"#8E8E93\",\n LOG: \"#8E8E93\",\n SUCCESS: \"#00C851\",\n };\n\n return colorMap[level.toUpperCase()] || \"white\";\n }\n\n private writeToConsole(config: WriteToConsoleConfig): void {\n const {
|
|
10
|
-
"import type { IException } from \"@ooneex/exception\";\nimport type { HttpMethodType, ScalarType } from \"@ooneex/types\";\nimport type { LogsEntity } from \"./LogsEntity\";\n\nexport type LoggerClassType =\n | (new (\n ...args: unknown[]\n ) => ILogger)\n | (new (\n options?: Bun.SQL.SQLiteOptions,\n ) => ILogger<LogsEntity>);\n\nexport interface ILogger<Data = Record<string, ScalarType>> {\n error: (message: string | IException, data?: Data) => Promise<void> | void;\n warn: (message: string, data?: Data) => Promise<void> | void;\n info: (message: string, data?: Data) => Promise<void> | void;\n debug: (message: string, data?: Data) => Promise<void> | void;\n log: (message: string, data?: Data) => Promise<void> | void;\n success: (message: string, data?: Data) => Promise<void> | void;\n}\n\nexport enum ELogLevel {\n ERROR = \"ERROR\",\n WARN = \"WARN\",\n INFO = \"INFO\",\n DEBUG = \"DEBUG\",\n LOG = \"LOG\",\n SUCCESS = \"SUCCESS\",\n}\n\nexport type LevelType = `${ELogLevel}`;\n\nexport type FindByCriteriaType = {\n level?: ELogLevel;\n userId?: string;\n email?: string;\n lastName?: string;\n firstName?: string;\n status?: number;\n exceptionName?: string;\n method?: HttpMethodType;\n path?: string;\n page?: number;\n limit?: number;\n};\n\nexport type FindByResultType = {\n logs: LogsEntity[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n};\n"
|
|
9
|
+
"import type { IException } from \"@ooneex/exception\";\nimport { LogsDatabase } from \"./LogsDatabase\";\nimport { LogsEntity } from \"./LogsEntity\";\nimport { LogsRepository } from \"./LogsRepository\";\nimport type { ILogger, LevelType } from \"./types\";\n\nexport class SqliteLogger implements ILogger<LogsEntity> {\n private db: LogsDatabase;\n private repository: LogsRepository;\n\n constructor(options?: Bun.SQL.SQLiteOptions) {\n this.db = new LogsDatabase(options);\n this.repository = new LogsRepository(this.db);\n }\n\n public async init(): Promise<void> {\n await this.db.open();\n await this.db.createTable();\n }\n\n public error(message: string | IException, data?: LogsEntity): void {\n if (typeof message === \"string\") {\n this.writeLog(\"ERROR\", {\n message,\n ...(data && { data }),\n });\n } else {\n this.writeLog(\"ERROR\", {\n exception: message,\n });\n }\n }\n\n public warn(message: string, data?: LogsEntity): void {\n this.writeLog(\"WARN\", {\n message,\n ...(data && { data }),\n });\n }\n\n public info(message: string, data?: LogsEntity): void {\n this.writeLog(\"INFO\", {\n message,\n ...(data && { data }),\n });\n }\n\n public debug(message: string, data?: LogsEntity): void {\n this.writeLog(\"DEBUG\", {\n message,\n ...(data && { data }),\n });\n }\n\n public log(message: string, data?: LogsEntity): void {\n this.writeLog(\"LOG\", {\n message,\n ...(data && { data }),\n });\n }\n\n public success(message: string, data?: LogsEntity): void {\n this.writeLog(\"SUCCESS\", {\n message,\n ...(data && { data }),\n });\n }\n\n private writeLog(\n level: LevelType,\n config?: {\n message?: string;\n data?: LogsEntity;\n exception?: IException;\n },\n ): void {\n const { message, data, exception } = config || {};\n\n const logEntry = new LogsEntity();\n logEntry.level = level;\n if (message) logEntry.message = message;\n else if (exception?.message) logEntry.message = exception.message;\n logEntry.date = exception?.date || new Date();\n if (data?.userId !== undefined) logEntry.userId = data.userId;\n if (data?.email !== undefined) logEntry.email = data.email;\n if (data?.lastName !== undefined) logEntry.lastName = data.lastName;\n if (data?.firstName !== undefined) logEntry.firstName = data.firstName;\n if (exception?.status !== undefined) {\n logEntry.status = exception.status;\n } else if (data?.status !== undefined) {\n logEntry.status = data.status;\n }\n if (exception?.name !== undefined) logEntry.exceptionName = exception.name;\n const stackTrace = exception?.stackToJson();\n if (stackTrace !== undefined && stackTrace !== null) logEntry.stackTrace = stackTrace;\n if (data?.ip !== undefined) logEntry.ip = data.ip;\n if (data?.method !== undefined) logEntry.method = data.method;\n if (data?.path !== undefined) logEntry.path = data.path;\n if (data?.userAgent !== undefined) logEntry.userAgent = data.userAgent;\n if (data?.referer !== undefined) logEntry.referer = data.referer;\n if (data?.params !== undefined) logEntry.params = data.params;\n if (data?.payload !== undefined) logEntry.payload = data.payload;\n if (data?.queries !== undefined) logEntry.queries = data.queries;\n\n // Save to database asynchronously\n this.repository.create(logEntry);\n }\n}\n",
|
|
10
|
+
"import type { ExceptionStackFrameType, IException } from \"@ooneex/exception\";\nimport type { ScalarType } from \"@ooneex/types\";\nimport type { ILogger, LoggerOptionsType } from \"./types\";\n\ninterface WriteToConsoleConfig {\n level: string;\n message: string;\n date?: Date;\n data?: Record<string, ScalarType>;\n stackTrace?: ExceptionStackFrameType[];\n showArrow?: boolean;\n showTimestamp?: boolean;\n showLevel?: boolean;\n useSymbol?: boolean;\n}\n\nexport class TerminalLogger implements ILogger {\n private colorizeText(text: string, color: string): string {\n const ansiColor = Bun.color(color, \"ansi\");\n const resetAnsi = \"\\u001b[0m\";\n return ansiColor ? `${ansiColor}${text}${resetAnsi}` : text;\n }\n\n private getLevelColor(level: string): string {\n const colorMap: Record<string, string> = {\n ERROR: \"#FF3B30\",\n WARN: \"#FFCC00\",\n INFO: \"#007AFF\",\n DEBUG: \"#8E8E93\",\n LOG: \"#8E8E93\",\n SUCCESS: \"#00C851\",\n };\n\n return colorMap[level.toUpperCase()] || \"white\";\n }\n\n private getLevelSymbol(level: string): string {\n const symbolMap: Record<string, string> = {\n ERROR: \"✖\",\n WARN: \"⚠\",\n INFO: \"ℹ\",\n DEBUG: \"⚙\",\n LOG: \"●\",\n SUCCESS: \"✔\",\n };\n\n return symbolMap[level.toUpperCase()] || \"●\";\n }\n\n private writeToConsole(config: WriteToConsoleConfig): void {\n const {\n level,\n message,\n date,\n data,\n stackTrace,\n showArrow = true,\n showTimestamp = true,\n showLevel = true,\n useSymbol = false,\n } = config;\n const normalizedLevel = level.endsWith(\"Exception\") ? \"ERROR\" : level;\n const color = this.getLevelColor(normalizedLevel);\n\n const now = date || new Date();\n const formattedTime = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")} ${String(now.getHours()).padStart(2, \"0\")}:${String(now.getMinutes()).padStart(2, \"0\")}:${String(now.getSeconds()).padStart(2, \"0\")}`;\n const timestamp = showTimestamp ? `${this.colorizeText(formattedTime, \"#B2BEB5\")} ` : \"\";\n const arrow = showArrow ? `${this.colorizeText(\"->\", color)} ` : \"\";\n const levelDisplay = useSymbol ? this.getLevelSymbol(normalizedLevel) : `[${level}]`;\n const colorizedLevel = showLevel ? `${this.colorizeText(levelDisplay, color)} ` : \"\";\n const colorizedMessage = this.colorizeText(message, color);\n\n let logMessage = `${arrow}${timestamp}${colorizedLevel}${colorizedMessage}`;\n\n if (data && Object.keys(data).length > 0) {\n const dataEntries = Object.entries(data)\n .filter(([key]) => key !== \"stackTrace\") // Exclude stackTrace from regular data display\n .map(([key, value]) => {\n const valueColor = typeof value === \"string\" ? \"#69E502\" : typeof value === \"number\" ? \"#FFE809\" : \"#D3D3D3\";\n const colorizedValue = this.colorizeText(String(value), valueColor);\n return `${this.colorizeText(key, \"#79B\")}: ${colorizedValue}`;\n });\n\n if (dataEntries.length > 0) {\n const colorizedData = dataEntries.join(\"\\n\");\n logMessage += `\\n${colorizedData}`;\n }\n }\n\n // Add formatted stack trace if available\n if (stackTrace && Array.isArray(stackTrace) && stackTrace.length > 0) {\n const stackHeader = this.colorizeText(\"Stack Trace:\", \"#FF6B6B\");\n logMessage += `\\n${stackHeader}`;\n\n stackTrace.forEach((frame, index) => {\n const frameNumber = this.colorizeText(` ${index + 1}.`, \"#B2BEB5\");\n const functionName = frame.functionName\n ? this.colorizeText(frame.functionName, \"#FFD93D\")\n : this.colorizeText(\"<anonymous>\", \"#8E8E93\");\n const fileName = frame.fileName ? this.colorizeText(frame.fileName, \"#6BCF7F\") : \"\";\n const lineCol = frame.lineNumber\n ? this.colorizeText(`:${frame.lineNumber}${frame.columnNumber ? `:${frame.columnNumber}` : \"\"}`, \"#B2BEB5\")\n : \"\";\n\n logMessage += `\\n${frameNumber} ${functionName}`;\n if (fileName) {\n logMessage += `\\n at ${fileName}${lineCol}`;\n }\n });\n }\n\n logMessage += \"\\n\";\n\n // Write to stderr for error levels, stdout for others\n if (level === \"FATAL\" || level === \"ERROR\") {\n process.stderr.write(`${logMessage}`);\n } else {\n process.stdout.write(`${logMessage}`);\n }\n }\n\n public async init(): Promise<void> {}\n\n public error(message: string | IException, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void {\n if (typeof message === \"string\") {\n this.writeToConsole({\n level: \"ERROR\",\n message,\n ...(data && { data }),\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n } else {\n // Handle IException object\n const exceptionData: Record<string, ScalarType> = {\n ...(message.data as Record<string, ScalarType>),\n ...(data as Record<string, ScalarType>),\n };\n\n if (message.status) {\n exceptionData.status = message.status;\n }\n\n // Get stack trace as structured data for better formatting\n const stackJson = message.stackToJson();\n this.writeToConsole({\n level: message.name,\n message: message.message,\n data: exceptionData,\n ...(stackJson && { stackTrace: stackJson }),\n date: message.date,\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n }\n }\n\n public warn(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void {\n this.writeToConsole({\n level: \"WARN\",\n message,\n ...(data && { data }),\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n }\n\n public info(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void {\n this.writeToConsole({\n level: \"INFO\",\n message,\n ...(data && { data }),\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n }\n\n public debug(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void {\n this.writeToConsole({\n level: \"DEBUG\",\n message,\n ...(data && { data }),\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n }\n\n public log(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void {\n this.writeToConsole({\n level: \"LOG\",\n message,\n ...(data && { data }),\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n }\n\n public success(message: string, data?: Record<string, ScalarType>, options?: LoggerOptionsType): void {\n this.writeToConsole({\n level: \"SUCCESS\",\n message,\n ...(data && { data }),\n ...(options?.showArrow !== undefined && { showArrow: options.showArrow }),\n ...(options?.showTimestamp !== undefined && { showTimestamp: options.showTimestamp }),\n ...(options?.showLevel !== undefined && { showLevel: options.showLevel }),\n ...(options?.useSymbol !== undefined && { useSymbol: options.useSymbol }),\n });\n }\n}\n",
|
|
11
|
+
"import type { IException } from \"@ooneex/exception\";\nimport type { HttpMethodType, ScalarType } from \"@ooneex/types\";\nimport type { LogsEntity } from \"./LogsEntity\";\n\nexport type LoggerClassType =\n | (new (\n ...args: unknown[]\n ) => ILogger)\n | (new (\n options?: Bun.SQL.SQLiteOptions,\n ) => ILogger<LogsEntity>);\n\nexport type LoggerOptionsType = {\n showArrow?: boolean;\n showTimestamp?: boolean;\n showLevel?: boolean;\n useSymbol?: boolean;\n};\n\nexport interface ILogger<Data = Record<string, ScalarType>> {\n init: () => Promise<void> | void;\n error: (message: string | IException, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;\n warn: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;\n info: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;\n debug: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;\n log: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;\n success: (message: string, data?: Data, options?: LoggerOptionsType) => Promise<void> | void;\n}\n\nexport enum ELogLevel {\n ERROR = \"ERROR\",\n WARN = \"WARN\",\n INFO = \"INFO\",\n DEBUG = \"DEBUG\",\n LOG = \"LOG\",\n SUCCESS = \"SUCCESS\",\n}\n\nexport type LevelType = `${ELogLevel}`;\n\nexport type FindByCriteriaType = {\n level?: ELogLevel;\n userId?: string;\n email?: string;\n lastName?: string;\n firstName?: string;\n status?: number;\n exceptionName?: string;\n method?: HttpMethodType;\n path?: string;\n page?: number;\n limit?: number;\n};\n\nexport type FindByResultType = {\n logs: LogsEntity[];\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n};\n"
|
|
11
12
|
],
|
|
12
|
-
"mappings": "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
|
|
13
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "09267DB0F42C699464756E2164756E21",
|
|
14
15
|
"names": []
|
|
15
16
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ooneex/logger",
|
|
3
|
-
"description": "",
|
|
4
|
-
"version": "0.0
|
|
3
|
+
"description": "Structured logging service with console and database output support, container integration, and customizable log levels",
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
@@ -25,18 +25,24 @@
|
|
|
25
25
|
"test": "bun test tests",
|
|
26
26
|
"build": "bunup",
|
|
27
27
|
"lint": "tsgo --noEmit && bunx biome lint",
|
|
28
|
-
"publish
|
|
29
|
-
"publish:pack": "bun pm pack --destination ./dist",
|
|
30
|
-
"publish:dry": "bun publish --dry-run"
|
|
28
|
+
"publish": "bun publish --access public || true"
|
|
31
29
|
},
|
|
32
30
|
"dependencies": {
|
|
31
|
+
"@ooneex/container": "0.0.2",
|
|
33
32
|
"@ooneex/database": "0.0.1",
|
|
34
33
|
"@ooneex/utils": "0.0.8"
|
|
35
34
|
},
|
|
36
35
|
"devDependencies": {
|
|
37
36
|
"@ooneex/exception": "0.0.1",
|
|
38
|
-
"@ooneex/http-status": "0.0.1",
|
|
39
37
|
"@ooneex/types": "0.0.1"
|
|
40
38
|
},
|
|
41
|
-
"
|
|
39
|
+
"keywords": [
|
|
40
|
+
"bun",
|
|
41
|
+
"debug",
|
|
42
|
+
"logger",
|
|
43
|
+
"logging",
|
|
44
|
+
"logs",
|
|
45
|
+
"ooneex",
|
|
46
|
+
"typescript"
|
|
47
|
+
]
|
|
42
48
|
}
|
|
Binary file
|