@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.
@@ -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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=log.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.test.d.ts","sourceRoot":"","sources":["../src/log.test.ts"],"names":[],"mappings":""}
@@ -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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
+ }