@elisra-devops/docgen-data-provider 1.140.0 → 1.142.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.
Files changed (74) hide show
  1. package/.github/workflows/ci.yml +2 -0
  2. package/bin/helpers/requestContext.d.ts +51 -0
  3. package/bin/helpers/requestContext.js +218 -0
  4. package/bin/helpers/requestContext.js.map +1 -0
  5. package/bin/helpers/tfs.d.ts +5 -0
  6. package/bin/helpers/tfs.js +24 -24
  7. package/bin/helpers/tfs.js.map +1 -1
  8. package/bin/modules/GitDataProvider.js +3 -2
  9. package/bin/modules/GitDataProvider.js.map +1 -1
  10. package/bin/modules/JfrogDataProvider.js +3 -2
  11. package/bin/modules/JfrogDataProvider.js.map +1 -1
  12. package/bin/modules/PipelinesDataProvider.js +5 -4
  13. package/bin/modules/PipelinesDataProvider.js.map +1 -1
  14. package/bin/modules/ResultDataProvider.js +32 -25
  15. package/bin/modules/ResultDataProvider.js.map +1 -1
  16. package/bin/modules/TestDataProvider.js +4 -3
  17. package/bin/modules/TestDataProvider.js.map +1 -1
  18. package/bin/modules/TicketsDataProvider.js +26 -22
  19. package/bin/modules/TicketsDataProvider.js.map +1 -1
  20. package/bin/tests/helpers/requestContext.test.d.ts +1 -0
  21. package/bin/tests/helpers/requestContext.test.js +165 -0
  22. package/bin/tests/helpers/requestContext.test.js.map +1 -0
  23. package/bin/tests/helpers/tfs.test.js +54 -0
  24. package/bin/tests/helpers/tfs.test.js.map +1 -1
  25. package/bin/tests/modules/JfrogDataProvider.test.js +4 -2
  26. package/bin/tests/modules/JfrogDataProvider.test.js.map +1 -1
  27. package/bin/tests/modules/ResultDataProvider.test.js +9 -3
  28. package/bin/tests/modules/ResultDataProvider.test.js.map +1 -1
  29. package/bin/tests/modules/gitDataProvider.test.js +1 -1
  30. package/bin/tests/modules/gitDataProvider.test.js.map +1 -1
  31. package/bin/tests/modules/pipelineDataProvider.test.js +1 -1
  32. package/bin/tests/modules/pipelineDataProvider.test.js.map +1 -1
  33. package/bin/tests/modules/testDataProvider.test.js +1 -1
  34. package/bin/tests/modules/testDataProvider.test.js.map +1 -1
  35. package/bin/tests/modules/ticketsDataProvider.test.js +2 -2
  36. package/bin/tests/modules/ticketsDataProvider.test.js.map +1 -1
  37. package/bin/tests/utils/logger.test.d.ts +1 -0
  38. package/bin/tests/utils/logger.test.js +332 -0
  39. package/bin/tests/utils/logger.test.js.map +1 -0
  40. package/bin/tests/utils/runContext.test.d.ts +1 -0
  41. package/bin/tests/utils/runContext.test.js +51 -0
  42. package/bin/tests/utils/runContext.test.js.map +1 -0
  43. package/bin/utils/logSink.d.ts +39 -0
  44. package/bin/utils/logSink.js +28 -0
  45. package/bin/utils/logSink.js.map +1 -0
  46. package/bin/utils/logger.d.ts +7 -0
  47. package/bin/utils/logger.js +266 -27
  48. package/bin/utils/logger.js.map +1 -1
  49. package/bin/utils/runContext.d.ts +8 -0
  50. package/bin/utils/runContext.js +12 -0
  51. package/bin/utils/runContext.js.map +1 -0
  52. package/eslint.config.mjs +40 -0
  53. package/package.json +8 -3
  54. package/src/helpers/requestContext.ts +222 -0
  55. package/src/helpers/tfs.ts +30 -24
  56. package/src/modules/GitDataProvider.ts +3 -2
  57. package/src/modules/JfrogDataProvider.ts +3 -2
  58. package/src/modules/PipelinesDataProvider.ts +5 -4
  59. package/src/modules/ResultDataProvider.ts +31 -25
  60. package/src/modules/TestDataProvider.ts +4 -3
  61. package/src/modules/TicketsDataProvider.ts +28 -26
  62. package/src/tests/helpers/requestContext.test.ts +202 -0
  63. package/src/tests/helpers/tfs.test.ts +86 -0
  64. package/src/tests/modules/JfrogDataProvider.test.ts +5 -2
  65. package/src/tests/modules/ResultDataProvider.test.ts +10 -3
  66. package/src/tests/modules/gitDataProvider.test.ts +2 -1
  67. package/src/tests/modules/pipelineDataProvider.test.ts +2 -1
  68. package/src/tests/modules/testDataProvider.test.ts +4 -1
  69. package/src/tests/modules/ticketsDataProvider.test.ts +2 -2
  70. package/src/tests/utils/logger.test.ts +381 -0
  71. package/src/tests/utils/runContext.test.ts +48 -0
  72. package/src/utils/logSink.ts +59 -0
  73. package/src/utils/logger.ts +269 -29
  74. package/src/utils/runContext.ts +25 -0
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const winston = require("winston");
4
+ const Transport = require("winston-transport");
5
+ const logger_1 = require("../../utils/logger");
6
+ const logSink_1 = require("../../utils/logSink");
7
+ const runContext_1 = require("../../utils/runContext");
8
+ const applyRedact = (info) => (0, logger_1.redact)().transform(Object.assign({}, info));
9
+ describe('logger redact format', () => {
10
+ test('scrubs a top-level token/password/secret regardless of key casing', () => {
11
+ const out = applyRedact({ level: 'info', message: 'x', token: 'abc', Password: 'p', SECRET: 's' });
12
+ expect(out.token).toBe('[REDACTED]');
13
+ expect(out.Password).toBe('[REDACTED]');
14
+ expect(out.SECRET).toBe('[REDACTED]');
15
+ });
16
+ test('scrubs nested config.auth.password and config.headers.Authorization — the AxiosError.toJSON() leak', () => {
17
+ // This is the exact shape that was leaking via logger.error(JSON.stringify(error))
18
+ // in TicketsDataProvider.ts on ADO batch work-item failures.
19
+ const axiosLikeError = {
20
+ message: 'Request failed',
21
+ config: {
22
+ auth: { username: '', password: 'super-secret-pat' },
23
+ headers: { Authorization: 'Bearer abc.def.ghi' },
24
+ },
25
+ };
26
+ const out = applyRedact({ level: 'error', message: 'error populating workitems array', err: axiosLikeError });
27
+ expect(out.err.config.auth.password).toBe('[REDACTED]');
28
+ expect(out.err.config.headers.Authorization).toBe('[REDACTED]');
29
+ expect(out.err.message).toBe('Request failed');
30
+ });
31
+ test('leaves non-sensitive fields untouched', () => {
32
+ const out = applyRedact({ level: 'info', message: 'ok', project: 'Cube-ADCS', docType: 'SVD' });
33
+ expect(out.project).toBe('Cube-ADCS');
34
+ expect(out.docType).toBe('SVD');
35
+ });
36
+ test('never throws on a circular object', () => {
37
+ const circular = { name: 'x' };
38
+ circular.self = circular;
39
+ expect(() => applyRedact({ level: 'info', message: 'x', circular })).not.toThrow();
40
+ });
41
+ test('never throws and passes info through on null/undefined meta', () => {
42
+ expect(() => applyRedact({ level: 'info', message: 'x', meta: null })).not.toThrow();
43
+ expect(() => applyRedact({ level: 'info', message: 'x', meta: undefined })).not.toThrow();
44
+ });
45
+ });
46
+ // A capturing transport + the exact JSON format chain logger.ts uses (errors -> timestamp ->
47
+ // redact -> splat -> json), so these tests exercise the real pipeline, not just redact() alone.
48
+ class CaptureTransport extends Transport {
49
+ constructor() {
50
+ super(...arguments);
51
+ this.lines = [];
52
+ }
53
+ log(info, callback) {
54
+ var _a;
55
+ this.lines.push(JSON.parse((_a = info[Symbol.for('message')]) !== null && _a !== void 0 ? _a : JSON.stringify(info)));
56
+ callback();
57
+ }
58
+ }
59
+ function makeTestLogger() {
60
+ const capture = new CaptureTransport();
61
+ const logger = winston.createLogger({
62
+ level: 'silly',
63
+ format: winston.format.combine(winston.format.errors({ stack: true }), winston.format.timestamp(), (0, logger_1.redact)(), winston.format.splat(), winston.format.json()),
64
+ transports: [capture],
65
+ });
66
+ return { logger, capture };
67
+ }
68
+ describe('logger pipeline — errors({stack:true})', () => {
69
+ test('logger.error(err) (single-arg Error) still produces a non-empty message and a stack', () => {
70
+ // This is the regression errors({stack:true}) exists to prevent: without it, winston's
71
+ // single-arg path makes `info` *be* the Error, and message/stack are non-enumerable, so
72
+ // json() would emit {"level":"error","timestamp":"…"} — content-free.
73
+ const { logger, capture } = makeTestLogger();
74
+ logger.error(new Error('boom'));
75
+ expect(capture.lines).toHaveLength(1);
76
+ expect(capture.lines[0].message).toBe('boom');
77
+ expect(typeof capture.lines[0].stack).toBe('string');
78
+ expect(capture.lines[0].stack.length).toBeGreaterThan(0);
79
+ });
80
+ });
81
+ describe('logger pipeline — hostile inputs never throw', () => {
82
+ test.each([
83
+ ['null', null],
84
+ ['undefined', undefined],
85
+ ['NaN', NaN],
86
+ ['a circular object', (() => { const c = { a: 1 }; c.self = c; return c; })()],
87
+ ['an object with a throwing getter', { get boom() { throw new Error('nope'); } }],
88
+ ['a BigInt', BigInt(9007199254740993)],
89
+ ['a Symbol', Symbol('x')],
90
+ ['an Error with no message', new Error()],
91
+ ['a 10MB string', 'x'.repeat(10 * 1024 * 1024)],
92
+ ])('logger.error(%s) does not throw', (_label, value) => {
93
+ const { logger } = makeTestLogger();
94
+ expect(() => logger.error(value)).not.toThrow();
95
+ });
96
+ });
97
+ describe('DiagnosticsTransport (Phase 6a)', () => {
98
+ function makeDiagnosticsLogger() {
99
+ const capture = new CaptureTransport();
100
+ const logger = winston.createLogger({
101
+ level: 'silly',
102
+ format: winston.format.combine(winston.format.errors({ stack: true }), winston.format.timestamp(), (0, logger_1.redact)(), winston.format.splat(), winston.format.json()),
103
+ transports: [capture, new logger_1.DiagnosticsTransport()],
104
+ });
105
+ return { logger, capture };
106
+ }
107
+ test('pushes warn/error records to whatever sink is installed', () => {
108
+ var _a, _b;
109
+ const events = [];
110
+ const sink = { push: (e) => events.push(e) };
111
+ (0, logSink_1.installLogSink)(sink);
112
+ const { logger } = makeDiagnosticsLogger();
113
+ logger.warn('a stable warning');
114
+ logger.error('a stable error', Object.assign(new Error('boom'), { code: 'ECONN' }));
115
+ expect(events).toHaveLength(2);
116
+ expect(events[0].level).toBe('warn');
117
+ expect((_a = events[1].err) === null || _a === void 0 ? void 0 : _a.code).toBe('ECONN');
118
+ expect((_b = events[1].err) === null || _b === void 0 ? void 0 : _b.stack).toEqual(expect.any(String));
119
+ });
120
+ test('does not push info/debug records', () => {
121
+ const events = [];
122
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
123
+ const { logger } = makeDiagnosticsLogger();
124
+ logger.info('not interesting to the dashboard');
125
+ expect(events).toHaveLength(0);
126
+ });
127
+ test('a throwing sink cannot break the log call', () => {
128
+ (0, logSink_1.installLogSink)({
129
+ push: () => {
130
+ throw new Error('sink is down');
131
+ },
132
+ });
133
+ const { logger } = makeDiagnosticsLogger();
134
+ expect(() => logger.error('still must not throw')).not.toThrow();
135
+ });
136
+ test.each([
137
+ ['null', null],
138
+ ['undefined', undefined],
139
+ ['NaN', NaN],
140
+ ['a circular object', (() => { const c = { a: 1 }; c.self = c; return c; })()],
141
+ ['an object with a throwing getter', { get boom() { throw new Error('nope'); } }],
142
+ ['a BigInt', BigInt(9007199254740993)],
143
+ ['a Symbol', Symbol('x')],
144
+ ['an Error with no message', new Error()],
145
+ ['a 10MB string', 'x'.repeat(10 * 1024 * 1024)],
146
+ ])('logger.error(%s) with a sink installed does not throw', (_label, value) => {
147
+ (0, logSink_1.installLogSink)({ push: () => undefined });
148
+ const { logger } = makeDiagnosticsLogger();
149
+ expect(() => logger.error(value)).not.toThrow();
150
+ });
151
+ });
152
+ describe('DiagnosticsTransport request context', () => {
153
+ function makeLogger() {
154
+ return winston.createLogger({
155
+ level: 'silly',
156
+ format: winston.format.combine(winston.format.errors({ stack: true }), winston.format.timestamp(), (0, logger_1.redact)(), winston.format.splat(), winston.format.json()),
157
+ transports: [new logger_1.DiagnosticsTransport()],
158
+ });
159
+ }
160
+ test('persists an annotated error\'s request as event.context, however the call site words its message', () => {
161
+ const events = [];
162
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
163
+ const err = Object.assign(new Error('Request failed with status code 404'), {
164
+ adoRequest: { method: 'GET', url: 'https://dev.azure.com/org/_apis/x', status: 404, attempt: 1, responseExcerpt: 'nope' },
165
+ });
166
+ makeLogger().error(err); // the bare-error shape (3 call sites) — no stable message at all
167
+ expect(events[0].context).toEqual({
168
+ method: 'GET',
169
+ url: 'https://dev.azure.com/org/_apis/x',
170
+ status: 404,
171
+ attempt: 1,
172
+ responseExcerpt: 'nope',
173
+ });
174
+ });
175
+ test('also works for the stable-message + error shape and for the explicit meta shape', () => {
176
+ const events = [];
177
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
178
+ const logger = makeLogger();
179
+ const ctx = { method: 'POST', url: 'https://h/wiql', requestBody: '{"query":"q"}' };
180
+ logger.error('Failed querying work items', Object.assign(new Error('boom'), { adoRequest: ctx }));
181
+ logger.error('ADO request failed', { message: 'boom', stack: 'at x', adoRequest: ctx });
182
+ expect(events[0].context).toEqual(ctx);
183
+ expect(events[1].context).toEqual(ctx);
184
+ });
185
+ test('an event with no request context has no context field', () => {
186
+ const events = [];
187
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
188
+ makeLogger().error('plain failure', new Error('boom'));
189
+ expect(events[0].context).toBeUndefined();
190
+ });
191
+ test('re-validates the shape at the transport: unknown keys, wrong types and oversize values are dropped or bounded', () => {
192
+ const events = [];
193
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
194
+ const err = Object.assign(new Error('x'), {
195
+ adoRequest: {
196
+ method: 'GET',
197
+ url: 'u'.repeat(5000),
198
+ status: 'not-a-number',
199
+ attempt: 2,
200
+ requestBody: 'b'.repeat(5000),
201
+ secretHeader: 'Bearer abc',
202
+ },
203
+ });
204
+ makeLogger().error('m', err);
205
+ const ctx = events[0].context;
206
+ expect(ctx.url.length).toBe(1000);
207
+ expect(ctx.requestBody.length).toBe(2000);
208
+ expect(ctx.status).toBeUndefined();
209
+ expect(ctx.attempt).toBe(2);
210
+ expect(ctx).not.toHaveProperty('secretHeader');
211
+ });
212
+ });
213
+ describe('text format request suffix', () => {
214
+ // The default (LOG_FORMAT unset) prints only the message — without this the URL would never
215
+ // reach stdout for a record whose own message doesn't carry it. A stream transport on the
216
+ // real logger receives the already-formatted line, independent of how jest wires console.
217
+ test('appends the request to the printed line when the error carries one, and never throws', () => {
218
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
219
+ const logger = require('../../utils/logger').default;
220
+ const { Writable } = require('stream');
221
+ const lines = [];
222
+ const sink = new winston.transports.Stream({
223
+ stream: new Writable({
224
+ write(chunk, _enc, cb) {
225
+ lines.push(chunk.toString());
226
+ cb();
227
+ },
228
+ }),
229
+ });
230
+ logger.add(sink);
231
+ try {
232
+ const err = Object.assign(new Error('Request failed with status code 404'), {
233
+ adoRequest: { method: 'GET', url: 'https://dev.azure.com/org/_apis/x', status: 404 },
234
+ });
235
+ expect(() => logger.error('Failed fetching', err)).not.toThrow();
236
+ expect(() => logger.error('odd', Object.assign(new Error('e'), { adoRequest: { url: 123 } }))).not.toThrow();
237
+ }
238
+ finally {
239
+ logger.remove(sink);
240
+ }
241
+ const joined = lines.join('');
242
+ expect(joined).toContain('[GET https://dev.azure.com/org/_apis/x -> 404]');
243
+ expect(joined).toContain('Failed fetching');
244
+ });
245
+ });
246
+ describe('textFormat safety (regression)', () => {
247
+ // The hostile-input matrix above exercises makeTestLogger()'s json() pipeline — it never
248
+ // touched the real singleton logger's text-format branch (LOG_FORMAT's default), which is
249
+ // where a Symbol message crashed: a template literal's implicit ToString throws on a Symbol,
250
+ // and this formatter sits with no try/catch around it.
251
+ test('logger.error(Symbol) does not throw through the real default-exported logger', () => {
252
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
253
+ const logger = require('../../utils/logger').default;
254
+ expect(() => logger.error(Symbol('x'))).not.toThrow();
255
+ });
256
+ });
257
+ describe('DiagnosticsTransport capture policy (Phase 6b)', () => {
258
+ function makeDiagnosticsLogger() {
259
+ const capture = new CaptureTransport();
260
+ const logger = winston.createLogger({
261
+ level: 'silly',
262
+ format: winston.format.combine(winston.format.errors({ stack: true }), winston.format.timestamp(), (0, logger_1.redact)(), winston.format.splat(), winston.format.json()),
263
+ transports: [capture, new logger_1.DiagnosticsTransport()],
264
+ });
265
+ return { logger, capture };
266
+ }
267
+ test('normal mode (no captureMode) does not persist debug/info', () => {
268
+ const events = [];
269
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
270
+ const { logger } = makeDiagnosticsLogger();
271
+ runContext_1.runContextStore.run({ runId: 'run-1' }, () => {
272
+ logger.debug('a debug line');
273
+ logger.info('an info line');
274
+ });
275
+ expect(events).toHaveLength(0);
276
+ });
277
+ test('verbose mode persists debug and info', () => {
278
+ const events = [];
279
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
280
+ const { logger } = makeDiagnosticsLogger();
281
+ runContext_1.runContextStore.run({ runId: 'run-2', captureMode: 'verbose' }, () => {
282
+ logger.debug('a debug line');
283
+ logger.info('an info line');
284
+ });
285
+ expect(events).toHaveLength(2);
286
+ expect(events[0].retainPending).toBeUndefined();
287
+ });
288
+ test('warn/error persist regardless of capture mode', () => {
289
+ const events = [];
290
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
291
+ const { logger } = makeDiagnosticsLogger();
292
+ runContext_1.runContextStore.run({ runId: 'run-3' }, () => {
293
+ logger.warn('a warning');
294
+ logger.error('an error');
295
+ });
296
+ expect(events).toHaveLength(2);
297
+ });
298
+ test('retain-on-failure persists debug/info tagged retainPending: true', () => {
299
+ const events = [];
300
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
301
+ const { logger } = makeDiagnosticsLogger();
302
+ runContext_1.runContextStore.run({ runId: 'run-4', captureMode: 'retain-on-failure' }, () => {
303
+ logger.debug('a debug line');
304
+ });
305
+ expect(events).toHaveLength(1);
306
+ expect(events[0].retainPending).toBe(true);
307
+ });
308
+ test('retain-on-failure does not tag warn/error as retainPending', () => {
309
+ const events = [];
310
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
311
+ const { logger } = makeDiagnosticsLogger();
312
+ runContext_1.runContextStore.run({ runId: 'run-5', captureMode: 'retain-on-failure' }, () => {
313
+ logger.error('an error');
314
+ });
315
+ expect(events).toHaveLength(1);
316
+ expect(events[0].retainPending).toBeUndefined();
317
+ });
318
+ test('a concurrent normal-mode run is unaffected by a sibling verbose run', () => {
319
+ const events = [];
320
+ (0, logSink_1.installLogSink)({ push: (e) => events.push(e) });
321
+ const { logger } = makeDiagnosticsLogger();
322
+ runContext_1.runContextStore.run({ runId: 'verbose-run', captureMode: 'verbose' }, () => {
323
+ logger.debug('verbose debug');
324
+ });
325
+ runContext_1.runContextStore.run({ runId: 'normal-run' }, () => {
326
+ logger.debug('normal debug');
327
+ });
328
+ expect(events).toHaveLength(1);
329
+ expect(events[0].message).toBe('verbose debug');
330
+ });
331
+ });
332
+ //# sourceMappingURL=logger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.test.js","sourceRoot":"","sources":["../../../src/tests/utils/logger.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const winston = require("winston");
4
+ const Transport = require("winston-transport");
5
+ const logger_1 = require("../../utils/logger");
6
+ const runContext_1 = require("../../utils/runContext");
7
+ class CaptureTransport extends Transport {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.lines = [];
11
+ }
12
+ log(info, callback) {
13
+ var _a;
14
+ this.lines.push(JSON.parse((_a = info[Symbol.for('message')]) !== null && _a !== void 0 ? _a : JSON.stringify(info)));
15
+ callback();
16
+ }
17
+ }
18
+ function makeTestLogger() {
19
+ const capture = new CaptureTransport();
20
+ const logger = winston.createLogger({
21
+ level: 'silly',
22
+ format: winston.format.combine((0, logger_1.withRunContext)(), winston.format.json()),
23
+ transports: [capture],
24
+ });
25
+ return { logger, capture };
26
+ }
27
+ describe('withRunContext', () => {
28
+ test('is a no-op when the store was never populated', () => {
29
+ const { logger, capture } = makeTestLogger();
30
+ logger.info('outside any run');
31
+ expect(capture.lines[0].runId).toBeUndefined();
32
+ });
33
+ test('stamps runId onto every log emitted inside store.run(...)', () => {
34
+ const { logger, capture } = makeTestLogger();
35
+ runContext_1.runContextStore.run({ runId: 'run-123' }, () => {
36
+ logger.info('inside the run');
37
+ });
38
+ logger.info('outside again');
39
+ expect(capture.lines[0].runId).toBe('run-123');
40
+ expect(capture.lines[1].runId).toBeUndefined();
41
+ });
42
+ test('async work started inside the run keeps the runId across the await boundary', async () => {
43
+ const { logger, capture } = makeTestLogger();
44
+ await runContext_1.runContextStore.run({ runId: 'run-async' }, async () => {
45
+ await new Promise((resolve) => setTimeout(resolve, 0));
46
+ logger.info('after await');
47
+ });
48
+ expect(capture.lines[0].runId).toBe('run-async');
49
+ });
50
+ });
51
+ //# sourceMappingURL=runContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runContext.test.js","sourceRoot":"","sources":["../../../src/tests/utils/runContext.test.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AACnC,+CAAgD;AAChD,+CAAoD;AACpD,uDAAyD;AAEzD,MAAM,gBAAiB,SAAQ,SAAS;IAAxC;;QACE,UAAK,GAA8B,EAAE,CAAC;IAKxC,CAAC;IAJC,GAAG,CAAC,IAA6B,EAAE,QAAoB;;QACrD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAC,IAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,mCAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1F,QAAQ,EAAE,CAAC;IACb,CAAC;CACF;AACD,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;QAClC,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAA,uBAAc,GAAE,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvE,UAAU,EAAE,CAAC,OAAO,CAAC;KACtB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC7C,4BAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE;YAC7C,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC7C,MAAM,4BAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare const CONTEXT_LIMITS: {
2
+ readonly method: 10;
3
+ readonly url: 1000;
4
+ readonly requestBody: 2000;
5
+ readonly responseExcerpt: 300;
6
+ };
7
+ export interface DiagnosticEvent {
8
+ ts: string;
9
+ level: string;
10
+ service: string;
11
+ version: string;
12
+ runId?: string;
13
+ docType?: string;
14
+ step?: string;
15
+ contentControlType?: string;
16
+ contentControlTitle?: string;
17
+ project?: string;
18
+ userId?: string;
19
+ message: string;
20
+ err?: {
21
+ message: string;
22
+ code?: string;
23
+ stack?: string;
24
+ };
25
+ context?: {
26
+ method?: string;
27
+ url?: string;
28
+ status?: number;
29
+ attempt?: number;
30
+ requestBody?: string;
31
+ responseExcerpt?: string;
32
+ };
33
+ retainPending?: boolean;
34
+ }
35
+ export interface LogSink {
36
+ push(event: DiagnosticEvent): void;
37
+ }
38
+ export declare function getLogSink(): LogSink | undefined;
39
+ export declare function installLogSink(sink: LogSink): void;
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONTEXT_LIMITS = void 0;
4
+ exports.getLogSink = getLogSink;
5
+ exports.installLogSink = installLogSink;
6
+ // The one queryable-error-store event shape, emitted by DiagnosticsTransport (logger.ts).
7
+ // This package never installs a sink itself — it only reads whatever the host process
8
+ // (docgen-content-control's index.ts) installed. err stays narrow — {message, code, stack}.
9
+ // `context` is the one deliberate exception to "no extra-fields bucket": a sanitized
10
+ // description of the failed outbound request (method, url, status, attempt, request-body
11
+ // summary, response excerpt) — without it a 404 in the dashboard can't be traced to the call
12
+ // that produced it. A fixed, allowlisted shape, not a free-form bag.
13
+ // Bounds for DiagnosticEvent.context. Single source for this package (requestContext.ts and the
14
+ // logger transport); docgen-api-gate's DiagnosticsController.sanitizeContext re-validates at
15
+ // ingest with its own copy — keep the two in step.
16
+ exports.CONTEXT_LIMITS = { method: 10, url: 1000, requestBody: 2000, responseExcerpt: 300 };
17
+ // Symbol.for so this package's copy converges on the same installed sink as
18
+ // docgen-content-control's (the host process this package runs inside) and
19
+ // docgen-dg-skins-package's, the same reasoning as runContext.ts's AsyncLocalStorage. A
20
+ // never-populated sink is a harmless no-op — this package only reads it, never installs one.
21
+ const KEY = Symbol.for('elisradevops.docgen.logSink');
22
+ function getLogSink() {
23
+ return globalThis[KEY];
24
+ }
25
+ function installLogSink(sink) {
26
+ globalThis[KEY] = sink;
27
+ }
28
+ //# sourceMappingURL=logSink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logSink.js","sourceRoot":"","sources":["../../src/utils/logSink.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;AAoDb,gCAEC;AAED,wCAEC;AAxDD,0FAA0F;AAC1F,sFAAsF;AACtF,4FAA4F;AAC5F,qFAAqF;AACrF,yFAAyF;AACzF,6FAA6F;AAC7F,qEAAqE;AACrE,gGAAgG;AAChG,6FAA6F;AAC7F,mDAAmD;AACtC,QAAA,cAAc,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAW,CAAC;AAkC1G,4EAA4E;AAC5E,2EAA2E;AAC3E,wFAAwF;AACxF,6FAA6F;AAC7F,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAEtD,SAAgB,UAAU;IACxB,OAAQ,UAAsC,CAAC,GAAG,CAAwB,CAAC;AAC7E,CAAC;AAED,SAAgB,cAAc,CAAC,IAAa;IACzC,UAAsC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACtD,CAAC"}
@@ -1,3 +1,10 @@
1
1
  import * as winston from 'winston';
2
+ import * as Transport from 'winston-transport';
2
3
  declare let logger: winston.Logger;
4
+ export declare const withRunContext: winston.Logform.FormatWrap;
5
+ export declare function redactValue(value: unknown, depth?: number, seen?: WeakSet<object>): unknown;
6
+ export declare const redact: winston.Logform.FormatWrap;
7
+ export declare class DiagnosticsTransport extends Transport {
8
+ log(info: Record<string, unknown>, callback: () => void): void;
9
+ }
3
10
  export default logger;