@emdzej/bimmerz-logger 0.1.2 → 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/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@emdzej/bimmerz-logger",
3
- "version": "0.1.2",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "Shared structured logger for the bimmerz family — pino-shape API, hierarchical categories, runtime-mutable config, pluggable sinks. No env reads, isomorphic (Node + browser), tree-shake-friendly.",
6
+ "license": "PolyForm-Noncommercial-1.0.0",
6
7
  "main": "dist/index.js",
7
8
  "types": "dist/index.d.ts",
8
9
  "exports": {
@@ -21,20 +22,20 @@
21
22
  "dist"
22
23
  ],
23
24
  "dependencies": {
24
- "pino": "^9.0.0",
25
- "pino-pretty": "^11.0.0"
25
+ "pino": "^10.3.1",
26
+ "pino-pretty": "^13.1.3"
26
27
  },
27
28
  "devDependencies": {
28
29
  "@types/node": "^22.13.1",
29
30
  "typescript": "^5.7.3",
30
- "vitest": "^2.1.8"
31
+ "vitest": "^5.0.1"
31
32
  },
32
33
  "publishConfig": {
33
34
  "access": "public"
34
35
  },
35
36
  "repository": {
36
37
  "type": "git",
37
- "url": "https://github.com/emdzej/bimmerz.git",
38
+ "url": "https://github.com/emdzej/bimmerz-core.git",
38
39
  "directory": "packages/logger"
39
40
  },
40
41
  "scripts": {
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=logger.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.test.d.ts","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":""}
@@ -1,199 +0,0 @@
1
- import { afterEach, describe, expect, it } from 'vitest';
2
- import { configureLogger, getLogger, getLoggerConfig } from './logger.js';
3
- import { resolveLevel } from './categories.js';
4
- import { levelPasses } from './levels.js';
5
- import { bufferSink } from './sinks/buffer.js';
6
- import { multiSink } from './sinks/multi.js';
7
- import { nullSink } from './sinks/null.js';
8
- /** Reset to a known state after each test so tests don't leak config. */
9
- afterEach(() => {
10
- configureLogger({ level: 'info', categories: {}, sink: nullSink() });
11
- });
12
- describe('levelPasses', () => {
13
- it('matches pino ordering', () => {
14
- expect(levelPasses('debug', 'info')).toBe(false);
15
- expect(levelPasses('info', 'info')).toBe(true);
16
- expect(levelPasses('error', 'info')).toBe(true);
17
- });
18
- it('silent blocks everything', () => {
19
- expect(levelPasses('fatal', 'silent')).toBe(false);
20
- expect(levelPasses('trace', 'silent')).toBe(false);
21
- });
22
- });
23
- describe('resolveLevel hierarchy', () => {
24
- const rules = { EDIABASX: 'debug', 'EDIABASX.parser': 'trace', INPAX: 'info' };
25
- it('returns fallback for null category', () => {
26
- expect(resolveLevel(null, rules, 'warn')).toBe('warn');
27
- });
28
- it('uses exact match when present', () => {
29
- expect(resolveLevel('EDIABASX', rules, 'warn')).toBe('debug');
30
- });
31
- it('walks up dot segments', () => {
32
- expect(resolveLevel('EDIABASX.parser.lexer', rules, 'warn')).toBe('trace');
33
- expect(resolveLevel('EDIABASX.runner', rules, 'warn')).toBe('debug');
34
- });
35
- it('falls back when no segment matches', () => {
36
- expect(resolveLevel('OTHER.subsystem', rules, 'warn')).toBe('warn');
37
- });
38
- it('ignores rules with bad level values', () => {
39
- expect(resolveLevel('FOO', { FOO: 'bogus' }, 'warn')).toBe('warn');
40
- });
41
- });
42
- describe('Logger basic dispatch', () => {
43
- it('emits records at or above the threshold', () => {
44
- const buf = bufferSink();
45
- configureLogger({ level: 'info', sink: buf });
46
- const log = getLogger();
47
- log.debug('skipped');
48
- log.info('kept');
49
- log.warn('kept too');
50
- const recs = buf.snapshot();
51
- expect(recs.map((r) => r.msg)).toEqual(['kept', 'kept too']);
52
- expect(recs[0]?.level).toBe('info');
53
- });
54
- it('attaches bindings when called with (obj, msg)', () => {
55
- const buf = bufferSink();
56
- configureLogger({ level: 'trace', sink: buf });
57
- getLogger('A').info({ id: 7, tag: 'x' }, 'with bindings');
58
- expect(buf.snapshot()[0]).toMatchObject({
59
- level: 'info',
60
- category: 'A',
61
- bindings: { id: 7, tag: 'x' },
62
- msg: 'with bindings',
63
- });
64
- });
65
- it('emits empty bindings when called with (msg) only', () => {
66
- const buf = bufferSink();
67
- configureLogger({ level: 'trace', sink: buf });
68
- getLogger().info('bare');
69
- expect(buf.snapshot()[0]?.bindings).toEqual({});
70
- });
71
- it('attaches a `time` epoch ms', () => {
72
- const buf = bufferSink();
73
- configureLogger({ level: 'trace', sink: buf });
74
- const before = Date.now();
75
- getLogger().info('t');
76
- const after = Date.now();
77
- const rec = buf.snapshot()[0];
78
- expect(rec.time).toBeGreaterThanOrEqual(before);
79
- expect(rec.time).toBeLessThanOrEqual(after);
80
- });
81
- });
82
- describe('Logger category resolution', () => {
83
- it('applies per-category levels', () => {
84
- const buf = bufferSink();
85
- configureLogger({
86
- level: 'warn',
87
- categories: { EDIABASX: 'debug' },
88
- sink: buf,
89
- });
90
- getLogger('EDIABASX').debug('kept');
91
- getLogger('INPAX').debug('dropped');
92
- getLogger().debug('dropped too');
93
- expect(buf.snapshot().map((r) => r.msg)).toEqual(['kept']);
94
- });
95
- it('hierarchical override beats parent', () => {
96
- const buf = bufferSink();
97
- configureLogger({
98
- level: 'warn',
99
- categories: { EDIABASX: 'debug', 'EDIABASX.parser': 'trace' },
100
- sink: buf,
101
- });
102
- getLogger('EDIABASX.parser').trace('kept');
103
- getLogger('EDIABASX.runner').trace('dropped');
104
- expect(buf.snapshot().map((r) => r.msg)).toEqual(['kept']);
105
- });
106
- it('logger.level reflects the live effective threshold', () => {
107
- configureLogger({ level: 'warn', categories: { FOO: 'trace' } });
108
- expect(getLogger('FOO').level).toBe('trace');
109
- expect(getLogger('BAR').level).toBe('warn');
110
- });
111
- });
112
- describe('runtime reconfigure', () => {
113
- it('affects existing logger handles', () => {
114
- const buf = bufferSink();
115
- configureLogger({ level: 'info', sink: buf });
116
- const log = getLogger('X');
117
- log.debug('dropped #1');
118
- configureLogger({ level: 'debug' });
119
- log.debug('kept after reconfigure');
120
- expect(buf.snapshot().map((r) => r.msg)).toEqual(['kept after reconfigure']);
121
- });
122
- it('partial reconfigure merges with existing config', () => {
123
- configureLogger({ level: 'error', categories: { A: 'debug' } });
124
- configureLogger({ level: 'info' }); // categories should remain
125
- const cfg = getLoggerConfig();
126
- expect(cfg.level).toBe('info');
127
- expect(cfg.categories).toEqual({ A: 'debug' });
128
- });
129
- it('explicit empty categories clears overrides', () => {
130
- configureLogger({ level: 'warn', categories: { A: 'debug' } });
131
- configureLogger({ categories: {} });
132
- expect(getLoggerConfig().categories).toEqual({});
133
- });
134
- });
135
- describe('child loggers', () => {
136
- it('carry permanent bindings on every call', () => {
137
- const buf = bufferSink();
138
- configureLogger({ level: 'trace', sink: buf });
139
- const log = getLogger('X').child({ tenant: 'acme' });
140
- log.info('one');
141
- log.info({ extra: 1 }, 'two');
142
- expect(buf.snapshot().map((r) => r.bindings)).toEqual([
143
- { tenant: 'acme' },
144
- { tenant: 'acme', extra: 1 },
145
- ]);
146
- });
147
- it('call-binding overrides child binding on key conflict', () => {
148
- const buf = bufferSink();
149
- configureLogger({ level: 'trace', sink: buf });
150
- const log = getLogger().child({ tenant: 'acme' });
151
- log.info({ tenant: 'override' }, 'x');
152
- expect(buf.snapshot()[0]?.bindings).toEqual({ tenant: 'override' });
153
- });
154
- it('child inherits category + level resolution', () => {
155
- configureLogger({ level: 'warn', categories: { Y: 'trace' } });
156
- const log = getLogger('Y').child({ a: 1 });
157
- expect(log.level).toBe('trace');
158
- });
159
- });
160
- describe('bufferSink', () => {
161
- it('keeps records up to capacity', () => {
162
- const buf = bufferSink({ capacity: 3 });
163
- configureLogger({ level: 'trace', sink: buf });
164
- for (let i = 0; i < 5; i++)
165
- getLogger().info(`m${i}`);
166
- expect(buf.snapshot().map((r) => r.msg)).toEqual(['m2', 'm3', 'm4']);
167
- expect(buf.size()).toBe(3);
168
- });
169
- it('clear() empties the buffer', () => {
170
- const buf = bufferSink();
171
- configureLogger({ level: 'trace', sink: buf });
172
- getLogger().info('a');
173
- buf.clear();
174
- expect(buf.size()).toBe(0);
175
- expect(buf.snapshot()).toEqual([]);
176
- });
177
- });
178
- describe('multiSink', () => {
179
- it('fans out to every wrapped sink', () => {
180
- const a = bufferSink();
181
- const b = bufferSink();
182
- configureLogger({ level: 'trace', sink: multiSink(a, b) });
183
- getLogger().info('hi');
184
- expect(a.snapshot().map((r) => r.msg)).toEqual(['hi']);
185
- expect(b.snapshot().map((r) => r.msg)).toEqual(['hi']);
186
- });
187
- it('isolates failing sinks from healthy ones', () => {
188
- const angry = {
189
- write() {
190
- throw new Error('boom');
191
- },
192
- };
193
- const calm = bufferSink();
194
- configureLogger({ level: 'trace', sink: multiSink(angry, calm) });
195
- expect(() => getLogger().info('hi')).not.toThrow();
196
- expect(calm.snapshot().map((r) => r.msg)).toEqual(['hi']);
197
- });
198
- });
199
- //# sourceMappingURL=logger.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../src/logger.test.ts"],"names":[],"mappings":"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"}