@pondoknusa/log 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/file-channel.d.ts +11 -0
- package/dist/file-channel.d.ts.map +1 -0
- package/dist/file-channel.js +27 -0
- package/dist/file-channel.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/log-entry.d.ts +10 -0
- package/dist/log-entry.d.ts.map +1 -0
- package/dist/log-entry.js +12 -0
- package/dist/log-entry.js.map +1 -0
- package/dist/log-manager.d.ts +9 -0
- package/dist/log-manager.d.ts.map +1 -0
- package/dist/log-manager.js +37 -0
- package/dist/log-manager.js.map +1 -0
- package/dist/log-repository.d.ts +13 -0
- package/dist/log-repository.d.ts.map +1 -0
- package/dist/log-repository.js +24 -0
- package/dist/log-repository.js.map +1 -0
- package/dist/log.test.d.ts +2 -0
- package/dist/log.test.d.ts.map +1 -0
- package/dist/log.test.js +46 -0
- package/dist/log.test.js.map +1 -0
- package/dist/stack-channel.d.ts +11 -0
- package/dist/stack-channel.d.ts.map +1 -0
- package/dist/stack-channel.js +29 -0
- package/dist/stack-channel.js.map +1 -0
- package/dist/stdout-channel.d.ts +8 -0
- package/dist/stdout-channel.d.ts.map +1 -0
- package/dist/stdout-channel.js +16 -0
- package/dist/stdout-channel.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LogChannel, LogContext } from './types.js';
|
|
2
|
+
export declare class FileChannel implements LogChannel {
|
|
3
|
+
private readonly path;
|
|
4
|
+
constructor(path: string);
|
|
5
|
+
debug(message: string, context?: LogContext): void;
|
|
6
|
+
info(message: string, context?: LogContext): void;
|
|
7
|
+
warn(message: string, context?: LogContext): void;
|
|
8
|
+
error(message: string, context?: LogContext): void;
|
|
9
|
+
private write;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=file-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-channel.d.ts","sourceRoot":"","sources":["../src/file-channel.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,WAAY,YAAW,UAAU;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEzC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;YAIpC,KAAK;CASpB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { appendFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { formatLogEntry } from './log-entry.js';
|
|
4
|
+
export class FileChannel {
|
|
5
|
+
path;
|
|
6
|
+
constructor(path) {
|
|
7
|
+
this.path = path;
|
|
8
|
+
}
|
|
9
|
+
debug(message, context) {
|
|
10
|
+
void this.write('debug', message, context);
|
|
11
|
+
}
|
|
12
|
+
info(message, context) {
|
|
13
|
+
void this.write('info', message, context);
|
|
14
|
+
}
|
|
15
|
+
warn(message, context) {
|
|
16
|
+
void this.write('warn', message, context);
|
|
17
|
+
}
|
|
18
|
+
error(message, context) {
|
|
19
|
+
void this.write('error', message, context);
|
|
20
|
+
}
|
|
21
|
+
async write(level, message, context) {
|
|
22
|
+
await mkdir(dirname(this.path), { recursive: true });
|
|
23
|
+
const line = `${formatLogEntry(level, message, context)}\n`;
|
|
24
|
+
await appendFile(this.path, line, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=file-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-channel.js","sourceRoot":"","sources":["../src/file-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,KAAK,CACjB,KAA0C,EAC1C,OAAe,EACf,OAAoB;QAEpB,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC;QAC5D,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { FileChannelConfig, LogChannel, LogChannelConfig, LogConfig, LogContext, StackChannelConfig, StdoutChannelConfig, } from './types.js';
|
|
2
|
+
export { StdoutChannel } from './stdout-channel.js';
|
|
3
|
+
export { FileChannel } from './file-channel.js';
|
|
4
|
+
export { StackChannel } from './stack-channel.js';
|
|
5
|
+
export { LogManager } from './log-manager.js';
|
|
6
|
+
export { LogRepository } from './log-repository.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { StdoutChannel } from './stdout-channel.js';
|
|
2
|
+
export { FileChannel } from './file-channel.js';
|
|
3
|
+
export { StackChannel } from './stack-channel.js';
|
|
4
|
+
export { LogManager } from './log-manager.js';
|
|
5
|
+
export { LogRepository } from './log-repository.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LogContext } from './types.js';
|
|
2
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
3
|
+
export interface LogEntry {
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
message: string;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
context?: LogContext;
|
|
8
|
+
}
|
|
9
|
+
export declare function formatLogEntry(level: LogLevel, message: string, context?: LogContext): string;
|
|
10
|
+
//# sourceMappingURL=log-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-entry.d.ts","sourceRoot":"","sources":["../src/log-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,UAAU,GACnB,MAAM,CAYR"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function formatLogEntry(level, message, context) {
|
|
2
|
+
const entry = {
|
|
3
|
+
level,
|
|
4
|
+
message,
|
|
5
|
+
timestamp: new Date().toISOString(),
|
|
6
|
+
};
|
|
7
|
+
if (context && Object.keys(context).length > 0) {
|
|
8
|
+
entry.context = context;
|
|
9
|
+
}
|
|
10
|
+
return JSON.stringify(entry);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=log-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-entry.js","sourceRoot":"","sources":["../src/log-entry.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,cAAc,CAC5B,KAAe,EACf,OAAe,EACf,OAAoB;IAEpB,MAAM,KAAK,GAAa;QACtB,KAAK;QACL,OAAO;QACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/C,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LogChannel, LogConfig } from './types.js';
|
|
2
|
+
export declare class LogManager {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly channels;
|
|
5
|
+
constructor(config: LogConfig);
|
|
6
|
+
channel(name?: string): LogChannel;
|
|
7
|
+
private buildChannel;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=log-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-manager.d.ts","sourceRoot":"","sources":["../src/log-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAoB,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;gBAE7B,MAAM,EAAE,SAAS;IAE9C,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU;IAiBlC,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { FileChannel } from './file-channel.js';
|
|
2
|
+
import { StackChannel } from './stack-channel.js';
|
|
3
|
+
import { StdoutChannel } from './stdout-channel.js';
|
|
4
|
+
export class LogManager {
|
|
5
|
+
config;
|
|
6
|
+
channels = new Map();
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
channel(name) {
|
|
11
|
+
const channelName = name ?? this.config.default;
|
|
12
|
+
const existing = this.channels.get(channelName);
|
|
13
|
+
if (existing) {
|
|
14
|
+
return existing;
|
|
15
|
+
}
|
|
16
|
+
const config = this.config.channels[channelName];
|
|
17
|
+
if (!config) {
|
|
18
|
+
throw new Error(`Log channel [${channelName}] is not configured.`);
|
|
19
|
+
}
|
|
20
|
+
const channel = this.buildChannel(config);
|
|
21
|
+
this.channels.set(channelName, channel);
|
|
22
|
+
return channel;
|
|
23
|
+
}
|
|
24
|
+
buildChannel(config) {
|
|
25
|
+
switch (config.channel) {
|
|
26
|
+
case 'stdout':
|
|
27
|
+
return new StdoutChannel();
|
|
28
|
+
case 'file':
|
|
29
|
+
return new FileChannel(config.path);
|
|
30
|
+
case 'stack':
|
|
31
|
+
return new StackChannel(config.channels, (name) => this.channel(name));
|
|
32
|
+
default:
|
|
33
|
+
throw new Error('Unsupported log channel.');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=log-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-manager.js","sourceRoot":"","sources":["../src/log-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,OAAO,UAAU;IAGQ;IAFZ,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE1D,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAElD,OAAO,CAAC,IAAa;QACnB,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gBAAgB,WAAW,sBAAsB,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,YAAY,CAAC,MAAwB;QAC3C,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,QAAQ;gBACX,OAAO,IAAI,aAAa,EAAE,CAAC;YAC7B,KAAK,MAAM;gBACT,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,OAAO;gBACV,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LogManager } from './log-manager.js';
|
|
2
|
+
import type { LogChannel, LogContext } from './types.js';
|
|
3
|
+
export declare class LogRepository implements LogChannel {
|
|
4
|
+
private readonly manager;
|
|
5
|
+
private readonly channelName?;
|
|
6
|
+
constructor(manager: LogManager, channelName?: string | undefined);
|
|
7
|
+
private channel;
|
|
8
|
+
debug(message: string, context?: LogContext): void;
|
|
9
|
+
info(message: string, context?: LogContext): void;
|
|
10
|
+
warn(message: string, context?: LogContext): void;
|
|
11
|
+
error(message: string, context?: LogContext): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=log-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-repository.d.ts","sourceRoot":"","sources":["../src/log-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,aAAc,YAAW,UAAU;IAE5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBADZ,OAAO,EAAE,UAAU,EACnB,WAAW,CAAC,EAAE,MAAM,YAAA;IAGvC,OAAO,CAAC,OAAO;IAIf,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;CAGnD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class LogRepository {
|
|
2
|
+
manager;
|
|
3
|
+
channelName;
|
|
4
|
+
constructor(manager, channelName) {
|
|
5
|
+
this.manager = manager;
|
|
6
|
+
this.channelName = channelName;
|
|
7
|
+
}
|
|
8
|
+
channel() {
|
|
9
|
+
return this.manager.channel(this.channelName);
|
|
10
|
+
}
|
|
11
|
+
debug(message, context) {
|
|
12
|
+
this.channel().debug(message, context);
|
|
13
|
+
}
|
|
14
|
+
info(message, context) {
|
|
15
|
+
this.channel().info(message, context);
|
|
16
|
+
}
|
|
17
|
+
warn(message, context) {
|
|
18
|
+
this.channel().warn(message, context);
|
|
19
|
+
}
|
|
20
|
+
error(message, context) {
|
|
21
|
+
this.channel().error(message, context);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=log-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-repository.js","sourceRoot":"","sources":["../src/log-repository.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,aAAa;IAEL;IACA;IAFnB,YACmB,OAAmB,EACnB,WAAoB;QADpB,YAAO,GAAP,OAAO,CAAY;QACnB,gBAAW,GAAX,WAAW,CAAS;IACpC,CAAC;IAEI,OAAO;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.test.d.ts","sourceRoot":"","sources":["../src/log.test.ts"],"names":[],"mappings":""}
|
package/dist/log.test.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { LogManager, LogRepository, StdoutChannel } from './index.js';
|
|
3
|
+
describe('StdoutChannel', () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it('writes structured json to stdout', () => {
|
|
8
|
+
const spy = vi.spyOn(console, 'info').mockImplementation(() => { });
|
|
9
|
+
const channel = new StdoutChannel();
|
|
10
|
+
channel.info('hello', { userId: 1 });
|
|
11
|
+
expect(spy).toHaveBeenCalledOnce();
|
|
12
|
+
const line = spy.mock.calls[0]?.[0];
|
|
13
|
+
expect(typeof line).toBe('string');
|
|
14
|
+
const parsed = JSON.parse(line);
|
|
15
|
+
expect(parsed.level).toBe('info');
|
|
16
|
+
expect(parsed.message).toBe('hello');
|
|
17
|
+
expect(parsed.context).toEqual({ userId: 1 });
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('StackChannel', () => {
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
vi.restoreAllMocks();
|
|
23
|
+
});
|
|
24
|
+
it('forwards logs to every channel in the stack', () => {
|
|
25
|
+
const infoSpy = vi.spyOn(console, 'info').mockImplementation(() => { });
|
|
26
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
27
|
+
const manager = new LogManager({
|
|
28
|
+
default: 'stack',
|
|
29
|
+
channels: {
|
|
30
|
+
stdout: { channel: 'stdout' },
|
|
31
|
+
stack: { channel: 'stack', channels: ['stdout', 'stdout'] },
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const log = new LogRepository(manager, 'stack');
|
|
35
|
+
log.info('forwarded');
|
|
36
|
+
log.warn('caution', { code: 'WARN' });
|
|
37
|
+
expect(infoSpy).toHaveBeenCalledTimes(2);
|
|
38
|
+
expect(warnSpy).toHaveBeenCalledTimes(2);
|
|
39
|
+
const warnLine = warnSpy.mock.calls[0]?.[0];
|
|
40
|
+
const parsed = JSON.parse(warnLine);
|
|
41
|
+
expect(parsed.level).toBe('warn');
|
|
42
|
+
expect(parsed.message).toBe('caution');
|
|
43
|
+
expect(parsed.context).toEqual({ code: 'WARN' });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=log.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.test.js","sourceRoot":"","sources":["../src/log.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LogChannel, LogContext } from './types.js';
|
|
2
|
+
export declare class StackChannel implements LogChannel {
|
|
3
|
+
private readonly channelNames;
|
|
4
|
+
private readonly resolve;
|
|
5
|
+
constructor(channelNames: string[], resolve: (name: string) => LogChannel);
|
|
6
|
+
debug(message: string, context?: LogContext): void;
|
|
7
|
+
info(message: string, context?: LogContext): void;
|
|
8
|
+
warn(message: string, context?: LogContext): void;
|
|
9
|
+
error(message: string, context?: LogContext): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=stack-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-channel.d.ts","sourceRoot":"","sources":["../src/stack-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,YAAa,YAAW,UAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU;IAGxD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAMlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAMjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAMjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;CAKnD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class StackChannel {
|
|
2
|
+
channelNames;
|
|
3
|
+
resolve;
|
|
4
|
+
constructor(channelNames, resolve) {
|
|
5
|
+
this.channelNames = channelNames;
|
|
6
|
+
this.resolve = resolve;
|
|
7
|
+
}
|
|
8
|
+
debug(message, context) {
|
|
9
|
+
for (const name of this.channelNames) {
|
|
10
|
+
this.resolve(name).debug(message, context);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
info(message, context) {
|
|
14
|
+
for (const name of this.channelNames) {
|
|
15
|
+
this.resolve(name).info(message, context);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
warn(message, context) {
|
|
19
|
+
for (const name of this.channelNames) {
|
|
20
|
+
this.resolve(name).warn(message, context);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
error(message, context) {
|
|
24
|
+
for (const name of this.channelNames) {
|
|
25
|
+
this.resolve(name).error(message, context);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=stack-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-channel.js","sourceRoot":"","sources":["../src/stack-channel.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IAEJ;IACA;IAFnB,YACmB,YAAsB,EACtB,OAAqC;QADrC,iBAAY,GAAZ,YAAY,CAAU;QACtB,YAAO,GAAP,OAAO,CAA8B;IACrD,CAAC;IAEJ,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LogChannel, LogContext } from './types.js';
|
|
2
|
+
export declare class StdoutChannel implements LogChannel {
|
|
3
|
+
debug(message: string, context?: LogContext): void;
|
|
4
|
+
info(message: string, context?: LogContext): void;
|
|
5
|
+
warn(message: string, context?: LogContext): void;
|
|
6
|
+
error(message: string, context?: LogContext): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=stdout-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdout-channel.d.ts","sourceRoot":"","sources":["../src/stdout-channel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,aAAc,YAAW,UAAU;IAC9C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;CAGnD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { formatLogEntry } from './log-entry.js';
|
|
2
|
+
export class StdoutChannel {
|
|
3
|
+
debug(message, context) {
|
|
4
|
+
console.debug(formatLogEntry('debug', message, context));
|
|
5
|
+
}
|
|
6
|
+
info(message, context) {
|
|
7
|
+
console.info(formatLogEntry('info', message, context));
|
|
8
|
+
}
|
|
9
|
+
warn(message, context) {
|
|
10
|
+
console.warn(formatLogEntry('warn', message, context));
|
|
11
|
+
}
|
|
12
|
+
error(message, context) {
|
|
13
|
+
console.error(formatLogEntry('error', message, context));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=stdout-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdout-channel.js","sourceRoot":"","sources":["../src/stdout-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,OAAoB;QACxC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,OAAoB;QACzC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type LogContext = Record<string, unknown>;
|
|
2
|
+
export interface LogChannel {
|
|
3
|
+
debug(message: string, context?: LogContext): void;
|
|
4
|
+
info(message: string, context?: LogContext): void;
|
|
5
|
+
warn(message: string, context?: LogContext): void;
|
|
6
|
+
error(message: string, context?: LogContext): void;
|
|
7
|
+
}
|
|
8
|
+
export interface StdoutChannelConfig {
|
|
9
|
+
channel: 'stdout';
|
|
10
|
+
}
|
|
11
|
+
export interface FileChannelConfig {
|
|
12
|
+
channel: 'file';
|
|
13
|
+
path: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StackChannelConfig {
|
|
16
|
+
channel: 'stack';
|
|
17
|
+
channels: string[];
|
|
18
|
+
}
|
|
19
|
+
export type LogChannelConfig = StdoutChannelConfig | FileChannelConfig | StackChannelConfig;
|
|
20
|
+
export interface LogConfig {
|
|
21
|
+
default: string;
|
|
22
|
+
channels: Record<string, LogChannelConfig>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pondoknusa/log",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc -p tsconfig.json",
|
|
15
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=26"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^26.0.1"
|
|
25
|
+
},
|
|
26
|
+
"description": "Structured logging channels and repository for Pondoknusa",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/pondoknusa/pondoknusa.git",
|
|
31
|
+
"directory": "packages/log"
|
|
32
|
+
},
|
|
33
|
+
"publishConfig": {
|
|
34
|
+
"access": "public"
|
|
35
|
+
}
|
|
36
|
+
}
|