@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 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
+ ![Bun](https://img.shields.io/badge/Bun-Compatible-orange?style=flat-square&logo=bun)
6
+ ![Deno](https://img.shields.io/badge/Deno-Compatible-blue?style=flat-square&logo=deno)
7
+ ![Node.js](https://img.shields.io/badge/Node.js-Compatible-green?style=flat-square&logo=node.js)
8
+ ![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue?style=flat-square&logo=typescript)
9
+ ![MIT License](https://img.shields.io/badge/License-MIT-yellow?style=flat-square)
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 { IDatabase } from "@ooneex/database";
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
- interface ILogger<Data = Record<string, ScalarType>> {
19
- error: (message: string | IException, data?: Data) => Promise<void> | void;
20
- warn: (message: string, data?: Data) => Promise<void> | void;
21
- info: (message: string, data?: Data) => Promise<void> | void;
22
- debug: (message: string, data?: Data) => Promise<void> | void;
23
- log: (message: string, data?: Data) => Promise<void> | void;
24
- success: (message: string, data?: Data) => Promise<void> | void;
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?: HttpMethodType;
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 class LogsEntity {
56
- id?: string;
57
- level?: LevelType;
58
- message?: string;
59
- date: Date;
60
- userId?: string;
61
- email?: string;
62
- lastName?: string;
63
- firstName?: string;
64
- status?: number;
65
- exceptionName?: string;
66
- stackTrace?: ExceptionStackFrameType[];
67
- ip?: string;
68
- method?: HttpMethodType2;
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
- error(message: string | IException3, data?: Record<string, ScalarType3>): void;
104
- warn(message: string, data?: Record<string, ScalarType3>): void;
105
- info(message: string, data?: Record<string, ScalarType3>): void;
106
- debug(message: string, data?: Record<string, ScalarType3>): void;
107
- log(message: string, data?: Record<string, ScalarType3>): void;
108
- success(message: string, data?: Record<string, ScalarType3>): void;
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 Q}from"@ooneex/database";class ${client;options;constructor(p){let S=p?.filename||Bun.env.LOGS_DATABASE_PATH||"";if(!S)throw new Q("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,...p,adapter:"sqlite"}}getClient(){if(!this.client)try{this.client=new Bun.SQL(this.options)}catch(p){throw new Q(p.message)}return this.client}async open(){this.getClient()}async createTable(){let p=this.getClient();try{await p`PRAGMA foreign_keys = ON`,await p`PRAGMA journal_mode = WAL`,await p`PRAGMA integrity_check`,await p`
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 p`CREATE INDEX IF NOT EXISTS idx_logs_level ON logs(level)`,await p`CREATE INDEX IF NOT EXISTS idx_logs_user_id ON logs(userId)`}catch(S){throw new Q("Failed to open log database connection")}}async dropTable(){let p=this.getClient();try{await p`DROP TABLE IF EXISTS logs`}catch(S){throw new Q("Failed to drop log tables")}}async close(){try{await this.client?.close(),this.client=void 0}catch(p){throw new Q("Failed to close log database connection")}}async drop(){}}class K{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 X}from"bun:jsc";import{random as M}from"@ooneex/utils";var{sql:U}=globalThis.Bun;class Y{db;constructor(p){this.db=p}async create(p){let S=this.db.getClient(),T={...p,id:M.nanoid(15),date:p.date.toISOString(),stackTrace:p.stackTrace?X(p.stackTrace):null,params:p.params?X(p.params):null,payload:p.payload?X(p.payload):null,queries:p.queries?X(p.queries):null},[R]=await S`
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(),R}async find(p){let S=this.db.getClient(),[T]=await S`
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 = ${p}
35
+ WHERE id = ${y}
36
36
  LIMIT 1
37
- `;if(!T)return await this.db.close(),null;let R={...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(),R}async findBy(p){let S=this.db.getClient(),T=[];if(p.level!==void 0)T.push(U`level = ${p.level}`);if(p.userId!==void 0)T.push(U`userId = ${p.userId}`);if(p.email!==void 0)T.push(U`email = ${p.email}`);if(p.lastName!==void 0)T.push(U`lastName = ${p.lastName}`);if(p.firstName!==void 0)T.push(U`firstName = ${p.firstName}`);if(p.status!==void 0)T.push(U`status = ${p.status}`);if(p.exceptionName!==void 0)T.push(U`exceptionName = ${p.exceptionName}`);if(p.method!==void 0)T.push(U`method = ${p.method}`);if(p.path!==void 0)T.push(U`path = ${p.path}`);let R=p.limit||100,B=p.page||1,I=(B-1)*R;if(T.length===0){let[y]=await S`SELECT COUNT(*) as total FROM logs`,O=(await S`
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 ${R}
41
- OFFSET ${I}
42
- `).map((P)=>({...P,date:new Date(P.date),stackTrace:P.stackTrace?N(P.stackTrace):void 0,params:P.params?N(P.params):void 0,payload:P.payload?N(P.payload):void 0,queries:P.queries?N(P.queries):void 0})),H=y.total,L=Math.ceil(H/R),D={logs:O,total:H,page:B,limit:R,totalPages:L};return await this.db.close(),D}let F=T.reduce((y,G,O)=>{if(O===0)return G;return U`${y} AND ${G}`}),[A]=await S`
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
- `,Z=(await S`
46
+ `,j=(await S`
47
47
  SELECT * FROM logs
48
48
  WHERE ${F}
49
49
  ORDER BY date DESC
50
- LIMIT ${R}
51
- OFFSET ${I}
52
- `).map((y)=>({...y,date:new Date(y.date),params:y.params?N(y.params):void 0,payload:y.payload?N(y.payload):void 0,queries:y.queries?N(y.queries):void 0})),W=A.total,_=Math.ceil(W/R),j={logs:Z,total:W,page:B,limit:R,totalPages:_};return await this.db.close(),j}}class V{db;repository;constructor(p){this.db=new $(p),this.repository=new Y(this.db)}async init(){await this.db.open(),await this.db.createTable()}error(p,S){if(typeof p==="string")this.writeLog("ERROR",{message:p,...S&&{data:S}});else this.writeLog("ERROR",{exception:p})}warn(p,S){this.writeLog("WARN",{message:p,...S&&{data:S}})}info(p,S){this.writeLog("INFO",{message:p,...S&&{data:S}})}debug(p,S){this.writeLog("DEBUG",{message:p,...S&&{data:S}})}log(p,S){this.writeLog("LOG",{message:p,...S&&{data:S}})}success(p,S){this.writeLog("SUCCESS",{message:p,...S&&{data:S}})}writeLog(p,S){let{message:T,data:R,exception:B}=S||{},I=new K;if(I.level=p,T)I.message=T;else if(B?.message)I.message=B.message;if(I.date=B?.date||new Date,R?.userId!==void 0)I.userId=R.userId;if(R?.email!==void 0)I.email=R.email;if(R?.lastName!==void 0)I.lastName=R.lastName;if(R?.firstName!==void 0)I.firstName=R.firstName;if(B?.status!==void 0)I.status=B.status;else if(R?.status!==void 0)I.status=R.status;if(B?.name!==void 0)I.exceptionName=B.name;let F=B?.stackToJson();if(F!==void 0&&F!==null)I.stackTrace=F;if(R?.ip!==void 0)I.ip=R.ip;if(R?.method!==void 0)I.method=R.method;if(R?.path!==void 0)I.path=R.path;if(R?.userAgent!==void 0)I.userAgent=R.userAgent;if(R?.referer!==void 0)I.referer=R.referer;if(R?.params!==void 0)I.params=R.params;if(R?.payload!==void 0)I.payload=R.payload;if(R?.queries!==void 0)I.queries=R.queries;this.repository.create(I)}}class J{colorizeText(p,S){let T=Bun.color(S,"ansi"),R="\x1B[0m";return T?`${T}${p}\x1B[0m`:p}getLevelColor(p){return{ERROR:"#FF3B30",WARN:"#FFCC00",INFO:"#007AFF",DEBUG:"#8E8E93",LOG:"#8E8E93",SUCCESS:"#00C851"}[p.toUpperCase()]||"white"}writeToConsole(p){let{level:S,message:T,date:R,data:B,stackTrace:I}=p,F=this.getLevelColor(S.endsWith("Exception")?"ERROR":S),A=R||new Date,x=`${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")}`,Z=this.colorizeText(x,"#B2BEB5"),W=this.colorizeText("->",F),_=this.colorizeText(`[${S}]`,F),j=this.colorizeText(T,F),y=`${W} ${Z} ${_} ${j}`;if(B&&Object.keys(B).length>0){let G=Object.entries(B).filter(([O])=>O!=="stackTrace").map(([O,H])=>{let L=typeof H==="string"?"#69E502":typeof H==="number"?"#FFE809":"#D3D3D3",D=this.colorizeText(String(H),L);return`${this.colorizeText(O,"#79B")}: ${D}`});if(G.length>0){let O=G.join(`
53
- `);y+=`
54
- ${O}`}}if(I&&Array.isArray(I)&&I.length>0){let G=this.colorizeText("Stack Trace:","#FF6B6B");y+=`
55
- ${G}`,I.forEach((O,H)=>{let L=this.colorizeText(` ${H+1}.`,"#B2BEB5"),D=O.functionName?this.colorizeText(O.functionName,"#FFD93D"):this.colorizeText("<anonymous>","#8E8E93"),P=O.fileName?this.colorizeText(O.fileName,"#6BCF7F"):"",b=O.lineNumber?this.colorizeText(`:${O.lineNumber}${O.columnNumber?`:${O.columnNumber}`:""}`,"#B2BEB5"):"";if(y+=`
56
- ${L} ${D}`,P)y+=`
57
- at ${P}${b}`})}if(y+=`
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=C2DA7C9F5241E39364756E2164756E21
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\";\n\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",
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 { level, message, date, data, stackTrace } = config;\n const color = this.getLevelColor(level.endsWith(\"Exception\") ? \"ERROR\" : level);\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 = this.colorizeText(formattedTime, \"#B2BEB5\");\n const arrow = this.colorizeText(\"->\", color);\n const colorizedLevel = this.colorizeText(`[${level}]`, 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`);\n } else {\n process.stdout.write(`${logMessage}\\n`);\n }\n }\n\n public error(message: string | IException, data?: Record<string, ScalarType>): void {\n if (typeof message === \"string\") {\n this.writeToConsole({\n level: \"ERROR\",\n message,\n ...(data && { data }),\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 });\n }\n }\n\n public warn(message: string, data?: Record<string, ScalarType>): void {\n this.writeToConsole({\n level: \"WARN\",\n message,\n ...(data && { data }),\n });\n }\n\n public info(message: string, data?: Record<string, ScalarType>): void {\n this.writeToConsole({\n level: \"INFO\",\n message,\n ...(data && { data }),\n });\n }\n\n public debug(message: string, data?: Record<string, ScalarType>): void {\n this.writeToConsole({\n level: \"DEBUG\",\n message,\n ...(data && { data }),\n });\n }\n\n public log(message: string, data?: Record<string, ScalarType>): void {\n this.writeToConsole({\n level: \"LOG\",\n message,\n ...(data && { data }),\n });\n }\n\n public success(message: string, data?: Record<string, ScalarType>): void {\n this.writeToConsole({\n level: \"SUCCESS\",\n message,\n ...(data && { data }),\n });\n }\n}\n",
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": "C2DA7C9F5241E39364756E2164756E21",
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.1",
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:prod": "bun publish --tolerate-republish --access public",
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
- "peerDependencies": {}
39
+ "keywords": [
40
+ "bun",
41
+ "debug",
42
+ "logger",
43
+ "logging",
44
+ "logs",
45
+ "ooneex",
46
+ "typescript"
47
+ ]
42
48
  }
Binary file