autotel 4.0.0 → 4.2.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 +26 -1
- package/dist/auto.cjs +2 -2
- package/dist/auto.js +1 -1
- package/dist/correlation-id.cjs +1 -1
- package/dist/correlation-id.js +1 -1
- package/dist/decorators.cjs +1 -1
- package/dist/decorators.js +1 -1
- package/dist/{event-Dlqr4ZNL.cjs → event-BhHREDJk.cjs} +3 -3
- package/dist/{event-Dlqr4ZNL.cjs.map → event-BhHREDJk.cjs.map} +1 -1
- package/dist/{event-_58ryBjh.js → event-ByBTV9M2.js} +3 -3
- package/dist/{event-_58ryBjh.js.map → event-ByBTV9M2.js.map} +1 -1
- package/dist/event.cjs +1 -1
- package/dist/event.js +1 -1
- package/dist/{functional-BGkT8J-h.js → functional-DtI0u4vx.js} +19 -19
- package/dist/functional-DtI0u4vx.js.map +1 -0
- package/dist/{functional-C4CzoVrX.cjs → functional-zpzNLhky.cjs} +4 -4
- package/dist/{functional-C4CzoVrX.cjs.map → functional-zpzNLhky.cjs.map} +1 -1
- package/dist/functional.cjs +1 -1
- package/dist/functional.js +1 -1
- package/dist/http.cjs +1 -1
- package/dist/http.js +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -5
- package/dist/{init-DJQOdVlN.d.ts → init-B7u-DjxM.d.ts} +57 -2
- package/dist/init-B7u-DjxM.d.ts.map +1 -0
- package/dist/{init-DvapOXCc.cjs → init-BX7AmFRl.cjs} +40 -21
- package/dist/init-BX7AmFRl.cjs.map +1 -0
- package/dist/{init-Ch6t7MNI.js → init-D-jnNMix.js} +39 -20
- package/dist/init-D-jnNMix.js.map +1 -0
- package/dist/{init-CNp-ee80.d.cts → init-DSrRmVnz.d.cts} +57 -2
- package/dist/init-DSrRmVnz.d.cts.map +1 -0
- package/dist/instrumentation.cjs +1 -1
- package/dist/instrumentation.js +1 -1
- package/dist/logger-D3Ej3DII.js +446 -0
- package/dist/logger-D3Ej3DII.js.map +1 -0
- package/dist/logger-thMPLpOG.cjs +487 -0
- package/dist/logger-thMPLpOG.cjs.map +1 -0
- package/dist/logger.cjs +8 -236
- package/dist/logger.js +2 -204
- package/dist/messaging.cjs +1 -1
- package/dist/messaging.js +1 -1
- package/dist/semantic-helpers.cjs +1 -1
- package/dist/semantic-helpers.js +1 -1
- package/dist/{track-3HY4NGV-.cjs → track-D59FfpL0.cjs} +2 -2
- package/dist/{track-3HY4NGV-.cjs.map → track-D59FfpL0.cjs.map} +1 -1
- package/dist/{track-nsKVy-pj.js → track-wc0HafS_.js} +6 -6
- package/dist/track-wc0HafS_.js.map +1 -0
- package/dist/webhook.cjs +1 -1
- package/dist/webhook.js +1 -1
- package/dist/workflow-distributed.cjs +1 -1
- package/dist/workflow-distributed.js +1 -1
- package/dist/workflow.cjs +1 -1
- package/dist/workflow.js +1 -1
- package/dist/{yaml-config-B3dQ82GR.cjs → yaml-config-Ck2uB0Dp.cjs} +2 -1
- package/dist/yaml-config-Ck2uB0Dp.cjs.map +1 -0
- package/dist/yaml-config.cjs +1 -1
- package/dist/yaml-config.d.cts +7 -1
- package/dist/yaml-config.d.cts.map +1 -1
- package/dist/yaml-config.d.ts +7 -1
- package/dist/yaml-config.d.ts.map +1 -1
- package/dist/yaml-config.js +1 -0
- package/dist/yaml-config.js.map +1 -1
- package/package.json +1 -2
- package/skills/autotel-core/SKILL.md +2 -0
- package/skills/autotel-instrumentation/SKILL.md +25 -0
- package/skills/debug-missing-spans/SKILL.md +3 -1
- package/skills/migrate-to-autotel/SKILL.md +24 -23
- package/skills/review-otel-patterns/SKILL.md +5 -4
- package/dist/functional-BGkT8J-h.js.map +0 -1
- package/dist/init-CNp-ee80.d.cts.map +0 -1
- package/dist/init-Ch6t7MNI.js.map +0 -1
- package/dist/init-DJQOdVlN.d.ts.map +0 -1
- package/dist/init-DvapOXCc.cjs.map +0 -1
- package/dist/logger.cjs.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/track-nsKVy-pj.js.map +0 -1
- package/dist/yaml-config-B3dQ82GR.cjs.map +0 -1
- package/src/attribute-redacting-processor.test.ts +0 -763
- package/src/attribute-redacting-processor.ts +0 -621
- package/src/attributes/attachers.ts +0 -161
- package/src/attributes/builders.ts +0 -529
- package/src/attributes/domains.ts +0 -42
- package/src/attributes/index.ts +0 -81
- package/src/attributes/registry.ts +0 -323
- package/src/attributes/types.ts +0 -211
- package/src/attributes/utils.ts +0 -64
- package/src/attributes/validators.ts +0 -266
- package/src/attributes.test.ts +0 -292
- package/src/auto.ts +0 -67
- package/src/autotel-logger.test.ts +0 -548
- package/src/autotel-logger.ts +0 -364
- package/src/baggage-span-processor.test.ts +0 -202
- package/src/baggage-span-processor.ts +0 -100
- package/src/business-baggage.test.ts +0 -500
- package/src/business-baggage.ts +0 -669
- package/src/circuit-breaker.test.ts +0 -341
- package/src/circuit-breaker.ts +0 -184
- package/src/config.test.ts +0 -94
- package/src/config.ts +0 -172
- package/src/correlated-events.test.ts +0 -151
- package/src/correlated-events.ts +0 -47
- package/src/correlation-id.test.ts +0 -163
- package/src/correlation-id.ts +0 -206
- package/src/db.test.ts +0 -252
- package/src/db.ts +0 -447
- package/src/decorators.test.ts +0 -153
- package/src/decorators.ts +0 -188
- package/src/define-event.test.ts +0 -41
- package/src/define-event.ts +0 -58
- package/src/devtools.ts +0 -60
- package/src/drain-pipeline.test.ts +0 -68
- package/src/drain-pipeline.ts +0 -199
- package/src/drain-toolkit.test.ts +0 -113
- package/src/drain-toolkit.ts +0 -129
- package/src/enricher-toolkit.test.ts +0 -67
- package/src/enricher-toolkit.ts +0 -79
- package/src/enrichers.test.ts +0 -150
- package/src/enrichers.ts +0 -145
- package/src/env-config.test.ts +0 -323
- package/src/env-config.ts +0 -309
- package/src/error-catalog.test.ts +0 -133
- package/src/error-catalog.ts +0 -262
- package/src/event-queue.test.ts +0 -864
- package/src/event-queue.ts +0 -699
- package/src/event-subscriber.ts +0 -262
- package/src/event-testing.ts +0 -197
- package/src/event.test.ts +0 -1104
- package/src/event.ts +0 -988
- package/src/events-config.ts +0 -235
- package/src/exporters.ts +0 -165
- package/src/filtering-span-processor.test.ts +0 -281
- package/src/filtering-span-processor.ts +0 -111
- package/src/flatten-attributes.test.ts +0 -76
- package/src/flatten-attributes.ts +0 -80
- package/src/functional.strict-types.typecheck.ts +0 -53
- package/src/functional.test.ts +0 -1464
- package/src/functional.ts +0 -2539
- package/src/functional.types.test.ts +0 -135
- package/src/hook.mjs +0 -15
- package/src/http.test.ts +0 -485
- package/src/http.ts +0 -424
- package/src/index.ts +0 -433
- package/src/init-auto-redactor.test.ts +0 -53
- package/src/init-redactor.test.ts +0 -8
- package/src/init.customization.test.ts +0 -594
- package/src/init.integrations.test.ts +0 -399
- package/src/init.openllmetry.test.ts +0 -194
- package/src/init.protocol.test.ts +0 -215
- package/src/init.ts +0 -2312
- package/src/instrumentation.test.ts +0 -108
- package/src/instrumentation.ts +0 -319
- package/src/logger.test.ts +0 -125
- package/src/logger.ts +0 -341
- package/src/messaging-adapters.test.ts +0 -595
- package/src/messaging-adapters.ts +0 -583
- package/src/messaging-testing.test.ts +0 -573
- package/src/messaging-testing.ts +0 -935
- package/src/messaging.test.ts +0 -1646
- package/src/messaging.ts +0 -2245
- package/src/metric-helpers.ts +0 -47
- package/src/metric-testing.ts +0 -197
- package/src/metric.ts +0 -446
- package/src/metrics.test.ts +0 -241
- package/src/node-require.ts +0 -123
- package/src/operation-context.ts +0 -93
- package/src/parse-error.test.ts +0 -73
- package/src/parse-error.ts +0 -112
- package/src/posthog-logs.test.ts +0 -115
- package/src/posthog-logs.ts +0 -77
- package/src/pretty-console-exporter.test.ts +0 -545
- package/src/pretty-console-exporter.ts +0 -413
- package/src/pretty-log-formatter.test.ts +0 -123
- package/src/pretty-log-formatter.ts +0 -210
- package/src/processors/canonical-log-line-processor.test.ts +0 -523
- package/src/processors/canonical-log-line-processor.ts +0 -396
- package/src/processors.ts +0 -152
- package/src/rate-limiter.test.ts +0 -199
- package/src/rate-limiter.ts +0 -98
- package/src/redact-values.test.ts +0 -90
- package/src/redact-values.ts +0 -34
- package/src/register.ts +0 -37
- package/src/request-logger.test.ts +0 -545
- package/src/request-logger.ts +0 -342
- package/src/sampling.test.ts +0 -1060
- package/src/sampling.ts +0 -737
- package/src/security-schema.test.ts +0 -45
- package/src/security-schema.ts +0 -107
- package/src/semantic-conventions.ts +0 -15
- package/src/semantic-helpers.test.ts +0 -226
- package/src/semantic-helpers.ts +0 -438
- package/src/shutdown.test.ts +0 -364
- package/src/shutdown.ts +0 -246
- package/src/span-name-normalizer.test.ts +0 -377
- package/src/span-name-normalizer.ts +0 -213
- package/src/stable-hash.ts +0 -27
- package/src/structured-error.test.ts +0 -191
- package/src/structured-error.ts +0 -157
- package/src/stub.integration.test.ts +0 -361
- package/src/tail-sampling-processor.test.ts +0 -230
- package/src/tail-sampling-processor.ts +0 -55
- package/src/test-span-collector.test.ts +0 -234
- package/src/test-span-collector.ts +0 -150
- package/src/testing.ts +0 -705
- package/src/trace-context.test.ts +0 -73
- package/src/trace-context.ts +0 -567
- package/src/trace-helpers.new.test.ts +0 -278
- package/src/trace-helpers.test.ts +0 -290
- package/src/trace-helpers.ts +0 -710
- package/src/trace-hybrid.test.ts +0 -42
- package/src/trace-hybrid.ts +0 -37
- package/src/tracer-provider.test.ts +0 -183
- package/src/tracer-provider.ts +0 -266
- package/src/track.test.ts +0 -154
- package/src/track.ts +0 -216
- package/src/validate.test.ts +0 -287
- package/src/validate.ts +0 -307
- package/src/validation-attributes.ts +0 -43
- package/src/validation.test.ts +0 -330
- package/src/validation.ts +0 -246
- package/src/variable-name-inference.test.ts +0 -178
- package/src/variable-name-inference.ts +0 -242
- package/src/webhook.test.ts +0 -649
- package/src/webhook.ts +0 -637
- package/src/workflow-distributed.test.ts +0 -786
- package/src/workflow-distributed.ts +0 -916
- package/src/workflow.async-safety.integration.test.ts +0 -345
- package/src/workflow.test.ts +0 -647
- package/src/workflow.ts +0 -810
- package/src/yaml-config.test.ts +0 -337
- package/src/yaml-config.ts +0 -342
|
@@ -1,500 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
createSafeBaggageSchema,
|
|
4
|
-
BusinessBaggage,
|
|
5
|
-
type BaggageError,
|
|
6
|
-
} from './business-baggage';
|
|
7
|
-
|
|
8
|
-
// Mock OpenTelemetry propagation API
|
|
9
|
-
vi.mock('@opentelemetry/api', () => {
|
|
10
|
-
const baggageStore = new Map<string, { value: string }>();
|
|
11
|
-
|
|
12
|
-
return {
|
|
13
|
-
context: {
|
|
14
|
-
active: vi.fn(() => ({})),
|
|
15
|
-
},
|
|
16
|
-
propagation: {
|
|
17
|
-
getBaggage: vi.fn(() => ({
|
|
18
|
-
getEntry: (key: string) => baggageStore.get(key),
|
|
19
|
-
getAllEntries: () =>
|
|
20
|
-
[...baggageStore.entries()].map(([k, v]) => [k, v]),
|
|
21
|
-
setEntry: vi.fn((key: string, entry: { value: string }) => {
|
|
22
|
-
baggageStore.set(key, entry);
|
|
23
|
-
return {
|
|
24
|
-
getEntry: (k: string) => baggageStore.get(k),
|
|
25
|
-
getAllEntries: () =>
|
|
26
|
-
[...baggageStore.entries()].map(([k, v]) => [k, v]),
|
|
27
|
-
setEntry: vi.fn(),
|
|
28
|
-
removeEntry: vi.fn(),
|
|
29
|
-
};
|
|
30
|
-
}),
|
|
31
|
-
removeEntry: vi.fn((key: string) => {
|
|
32
|
-
baggageStore.delete(key);
|
|
33
|
-
return {
|
|
34
|
-
getEntry: (k: string) => baggageStore.get(k),
|
|
35
|
-
getAllEntries: () => [...baggageStore.entries()],
|
|
36
|
-
setEntry: vi.fn(),
|
|
37
|
-
removeEntry: vi.fn(),
|
|
38
|
-
};
|
|
39
|
-
}),
|
|
40
|
-
})),
|
|
41
|
-
createBaggage: vi.fn(() => ({
|
|
42
|
-
getEntry: () => {},
|
|
43
|
-
getAllEntries: () => [],
|
|
44
|
-
setEntry: vi.fn((key: string, entry: { value: string }) => {
|
|
45
|
-
baggageStore.set(key, entry);
|
|
46
|
-
return {
|
|
47
|
-
getEntry: (k: string) => baggageStore.get(k),
|
|
48
|
-
getAllEntries: () => [...baggageStore.entries()],
|
|
49
|
-
setEntry: vi.fn(),
|
|
50
|
-
removeEntry: vi.fn(),
|
|
51
|
-
};
|
|
52
|
-
}),
|
|
53
|
-
removeEntry: vi.fn(),
|
|
54
|
-
})),
|
|
55
|
-
setBaggage: vi.fn(() => ({})),
|
|
56
|
-
inject: vi.fn((ctx, headers) => {
|
|
57
|
-
headers['traceparent'] = '00-abc-def-01';
|
|
58
|
-
for (const [k, v] of baggageStore.entries()) {
|
|
59
|
-
headers[k] = v.value;
|
|
60
|
-
}
|
|
61
|
-
}),
|
|
62
|
-
extract: vi.fn(() => ({})),
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('Business Baggage', () => {
|
|
68
|
-
beforeEach(() => {
|
|
69
|
-
vi.clearAllMocks();
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe('createSafeBaggageSchema', () => {
|
|
73
|
-
it('should create a schema with string fields', () => {
|
|
74
|
-
const schema = createSafeBaggageSchema({
|
|
75
|
-
orderId: { type: 'string' },
|
|
76
|
-
customerId: { type: 'string' },
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
expect(schema).toBeDefined();
|
|
80
|
-
expect(schema.get).toBeDefined();
|
|
81
|
-
expect(schema.set).toBeDefined();
|
|
82
|
-
expect(schema.getValue).toBeDefined();
|
|
83
|
-
expect(schema.setValue).toBeDefined();
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('should create a schema with number fields', () => {
|
|
87
|
-
const schema = createSafeBaggageSchema({
|
|
88
|
-
amount: { type: 'number' },
|
|
89
|
-
quantity: { type: 'number' },
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
expect(schema).toBeDefined();
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it('should create a schema with boolean fields', () => {
|
|
96
|
-
const schema = createSafeBaggageSchema({
|
|
97
|
-
debug: { type: 'boolean' },
|
|
98
|
-
premium: { type: 'boolean' },
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
expect(schema).toBeDefined();
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('should create a schema with enum fields', () => {
|
|
105
|
-
const schema = createSafeBaggageSchema({
|
|
106
|
-
priority: { type: 'enum', values: ['low', 'normal', 'high'] as const },
|
|
107
|
-
status: {
|
|
108
|
-
type: 'enum',
|
|
109
|
-
values: ['pending', 'active', 'done'] as const,
|
|
110
|
-
},
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
expect(schema).toBeDefined();
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('should support field with maxLength', () => {
|
|
117
|
-
const schema = createSafeBaggageSchema({
|
|
118
|
-
description: { type: 'string', maxLength: 50 },
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
expect(schema).toBeDefined();
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it('should support field with hash option', () => {
|
|
125
|
-
const schema = createSafeBaggageSchema({
|
|
126
|
-
userId: { type: 'string', hash: true },
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
expect(schema).toBeDefined();
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('should support field with defaultValue', () => {
|
|
133
|
-
const schema = createSafeBaggageSchema({
|
|
134
|
-
region: { type: 'string', defaultValue: 'us-east-1' },
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
const values = schema.get();
|
|
138
|
-
expect(values.region).toBe('us-east-1');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('should support custom validation', () => {
|
|
142
|
-
const onError = vi.fn();
|
|
143
|
-
const schema = createSafeBaggageSchema(
|
|
144
|
-
{
|
|
145
|
-
code: {
|
|
146
|
-
type: 'string',
|
|
147
|
-
validate: (value) =>
|
|
148
|
-
typeof value === 'string' && value.length === 6,
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
{ onError },
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
expect(schema).toBeDefined();
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
describe('SafeBaggageOptions', () => {
|
|
159
|
-
it('should respect maxKeyLength', () => {
|
|
160
|
-
const onError = vi.fn();
|
|
161
|
-
const schema = createSafeBaggageSchema(
|
|
162
|
-
{
|
|
163
|
-
someVeryLongKeyNameThatExceedsLimit: { type: 'string' },
|
|
164
|
-
},
|
|
165
|
-
{ maxKeyLength: 10, onError },
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
schema.set(undefined, { someVeryLongKeyNameThatExceedsLimit: 'value' });
|
|
169
|
-
expect(onError).toHaveBeenCalledWith(
|
|
170
|
-
expect.objectContaining({ type: 'key_length' }),
|
|
171
|
-
);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('should respect maxValueLength', () => {
|
|
175
|
-
const onError = vi.fn();
|
|
176
|
-
const schema = createSafeBaggageSchema(
|
|
177
|
-
{
|
|
178
|
-
message: { type: 'string' },
|
|
179
|
-
},
|
|
180
|
-
{ maxValueLength: 10, onError },
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
schema.set(undefined, { message: 'a'.repeat(50) });
|
|
184
|
-
expect(onError).toHaveBeenCalledWith(
|
|
185
|
-
expect.objectContaining({ type: 'value_length' }),
|
|
186
|
-
);
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it('should use prefix for keys', () => {
|
|
190
|
-
const schema = createSafeBaggageSchema(
|
|
191
|
-
{
|
|
192
|
-
userId: { type: 'string' },
|
|
193
|
-
},
|
|
194
|
-
{ prefix: 'app' },
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
// The prefix is applied internally
|
|
198
|
-
expect(schema).toBeDefined();
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('should detect PII when redactPII is enabled', () => {
|
|
202
|
-
const onError = vi.fn();
|
|
203
|
-
const schema = createSafeBaggageSchema(
|
|
204
|
-
{
|
|
205
|
-
contact: { type: 'string' },
|
|
206
|
-
},
|
|
207
|
-
{ redactPII: true, onError },
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
schema.set(undefined, { contact: 'user@example.com' });
|
|
211
|
-
expect(onError).toHaveBeenCalledWith(
|
|
212
|
-
expect.objectContaining({ type: 'pii' }),
|
|
213
|
-
);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it('should hash high-cardinality values when enabled', () => {
|
|
217
|
-
const schema = createSafeBaggageSchema(
|
|
218
|
-
{
|
|
219
|
-
requestId: { type: 'string' },
|
|
220
|
-
},
|
|
221
|
-
{ hashHighCardinality: true },
|
|
222
|
-
);
|
|
223
|
-
|
|
224
|
-
// UUID-like values should be hashed
|
|
225
|
-
schema.set(undefined, {
|
|
226
|
-
requestId: '550e8400-e29b-41d4-a716-446655440000',
|
|
227
|
-
});
|
|
228
|
-
expect(schema).toBeDefined();
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
it('should reject keys not in allowedKeys whitelist', () => {
|
|
232
|
-
expect(() =>
|
|
233
|
-
createSafeBaggageSchema(
|
|
234
|
-
{
|
|
235
|
-
notAllowed: { type: 'string' },
|
|
236
|
-
},
|
|
237
|
-
{ allowedKeys: ['allowed'] },
|
|
238
|
-
),
|
|
239
|
-
).toThrow('not in allowedKeys whitelist');
|
|
240
|
-
});
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
describe('Schema validation', () => {
|
|
244
|
-
it('should validate string type', () => {
|
|
245
|
-
const onError = vi.fn();
|
|
246
|
-
const schema = createSafeBaggageSchema(
|
|
247
|
-
{
|
|
248
|
-
name: { type: 'string' },
|
|
249
|
-
},
|
|
250
|
-
{ onError },
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
// Number passed for string field should trigger validation error
|
|
254
|
-
schema.set(undefined, { name: 123 as unknown as string });
|
|
255
|
-
expect(onError).toHaveBeenCalledWith(
|
|
256
|
-
expect.objectContaining({ type: 'validation' }),
|
|
257
|
-
);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it('should validate number type', () => {
|
|
261
|
-
const onError = vi.fn();
|
|
262
|
-
const schema = createSafeBaggageSchema(
|
|
263
|
-
{
|
|
264
|
-
count: { type: 'number' },
|
|
265
|
-
},
|
|
266
|
-
{ onError },
|
|
267
|
-
);
|
|
268
|
-
|
|
269
|
-
schema.set(undefined, { count: 'not-a-number' as unknown as number });
|
|
270
|
-
expect(onError).toHaveBeenCalledWith(
|
|
271
|
-
expect.objectContaining({ type: 'validation' }),
|
|
272
|
-
);
|
|
273
|
-
});
|
|
274
|
-
|
|
275
|
-
it('should validate boolean type', () => {
|
|
276
|
-
const onError = vi.fn();
|
|
277
|
-
const schema = createSafeBaggageSchema(
|
|
278
|
-
{
|
|
279
|
-
enabled: { type: 'boolean' },
|
|
280
|
-
},
|
|
281
|
-
{ onError },
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
schema.set(undefined, { enabled: 'true' as unknown as boolean });
|
|
285
|
-
expect(onError).toHaveBeenCalledWith(
|
|
286
|
-
expect.objectContaining({ type: 'validation' }),
|
|
287
|
-
);
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
it('should validate enum values', () => {
|
|
291
|
-
const onError = vi.fn();
|
|
292
|
-
const schema = createSafeBaggageSchema(
|
|
293
|
-
{
|
|
294
|
-
priority: { type: 'enum', values: ['low', 'high'] as const },
|
|
295
|
-
},
|
|
296
|
-
{ onError },
|
|
297
|
-
);
|
|
298
|
-
|
|
299
|
-
schema.set(undefined, { priority: 'invalid' as 'low' | 'high' });
|
|
300
|
-
expect(onError).toHaveBeenCalledWith(
|
|
301
|
-
expect.objectContaining({ type: 'validation' }),
|
|
302
|
-
);
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
it('should handle required fields', () => {
|
|
306
|
-
const onError = vi.fn();
|
|
307
|
-
const schema = createSafeBaggageSchema(
|
|
308
|
-
{
|
|
309
|
-
requiredField: { type: 'string', required: true },
|
|
310
|
-
},
|
|
311
|
-
{ onError },
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
schema.set(undefined, { requiredField: undefined as unknown as string });
|
|
315
|
-
expect(onError).toHaveBeenCalledWith(
|
|
316
|
-
expect.objectContaining({
|
|
317
|
-
type: 'validation',
|
|
318
|
-
message: expect.stringContaining('missing'),
|
|
319
|
-
}),
|
|
320
|
-
);
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
describe('BusinessBaggage', () => {
|
|
325
|
-
it('should be a pre-configured schema', () => {
|
|
326
|
-
expect(BusinessBaggage).toBeDefined();
|
|
327
|
-
expect(BusinessBaggage.get).toBeDefined();
|
|
328
|
-
expect(BusinessBaggage.set).toBeDefined();
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
it('should have tenantId field', () => {
|
|
332
|
-
const values = BusinessBaggage.get();
|
|
333
|
-
expect('tenantId' in values || values.tenantId === undefined).toBe(true);
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
it('should have userId field (hashed)', () => {
|
|
337
|
-
BusinessBaggage.set(undefined, { userId: 'user-123' });
|
|
338
|
-
// userId is hashed, so we can't directly verify the value
|
|
339
|
-
expect(BusinessBaggage).toBeDefined();
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
it('should have priority field with enum values', () => {
|
|
343
|
-
BusinessBaggage.set(undefined, { priority: 'high' });
|
|
344
|
-
expect(BusinessBaggage).toBeDefined();
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
it('should have channel field with enum values', () => {
|
|
348
|
-
BusinessBaggage.set(undefined, { channel: 'api' });
|
|
349
|
-
expect(BusinessBaggage).toBeDefined();
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
it('should have correlationId field', () => {
|
|
353
|
-
BusinessBaggage.set(undefined, { correlationId: 'corr-123' });
|
|
354
|
-
expect(BusinessBaggage).toBeDefined();
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it('should have workflowId field', () => {
|
|
358
|
-
BusinessBaggage.set(undefined, { workflowId: 'wf-123' });
|
|
359
|
-
expect(BusinessBaggage).toBeDefined();
|
|
360
|
-
});
|
|
361
|
-
|
|
362
|
-
it('should have region field', () => {
|
|
363
|
-
BusinessBaggage.set(undefined, { region: 'us-east-1' });
|
|
364
|
-
expect(BusinessBaggage).toBeDefined();
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it('should use biz prefix', () => {
|
|
368
|
-
// The BusinessBaggage is configured with prefix: 'biz'
|
|
369
|
-
expect(BusinessBaggage).toBeDefined();
|
|
370
|
-
});
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
describe('Schema methods', () => {
|
|
374
|
-
it('getValue should return single field value', () => {
|
|
375
|
-
const schema = createSafeBaggageSchema({
|
|
376
|
-
userId: { type: 'string', defaultValue: 'default-user' },
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
const value = schema.getValue('userId');
|
|
380
|
-
expect(value).toBe('default-user');
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
it('setValue should set single field value', () => {
|
|
384
|
-
const schema = createSafeBaggageSchema({
|
|
385
|
-
userId: { type: 'string' },
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
schema.setValue('userId', 'user-456');
|
|
389
|
-
expect(schema).toBeDefined();
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
it('clear should remove all schema values', () => {
|
|
393
|
-
const schema = createSafeBaggageSchema({
|
|
394
|
-
key1: { type: 'string' },
|
|
395
|
-
key2: { type: 'string' },
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
schema.set(undefined, { key1: 'value1', key2: 'value2' });
|
|
399
|
-
schema.clear();
|
|
400
|
-
expect(schema).toBeDefined();
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
it('toHeaders should return propagation headers', () => {
|
|
404
|
-
const schema = createSafeBaggageSchema({
|
|
405
|
-
userId: { type: 'string' },
|
|
406
|
-
});
|
|
407
|
-
|
|
408
|
-
const headers = schema.toHeaders();
|
|
409
|
-
expect(headers).toBeDefined();
|
|
410
|
-
expect(typeof headers).toBe('object');
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
it('fromHeaders should restore baggage from headers', () => {
|
|
414
|
-
const schema = createSafeBaggageSchema({
|
|
415
|
-
userId: { type: 'string' },
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
schema.fromHeaders({ traceparent: '00-abc-def-01', userId: 'user-123' });
|
|
419
|
-
expect(schema).toBeDefined();
|
|
420
|
-
});
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
describe('BaggageError types', () => {
|
|
424
|
-
it('should report validation errors', () => {
|
|
425
|
-
const errors: BaggageError[] = [];
|
|
426
|
-
const schema = createSafeBaggageSchema(
|
|
427
|
-
{
|
|
428
|
-
count: { type: 'number' },
|
|
429
|
-
},
|
|
430
|
-
{ onError: (e) => errors.push(e) },
|
|
431
|
-
);
|
|
432
|
-
|
|
433
|
-
schema.set(undefined, { count: 'invalid' as unknown as number });
|
|
434
|
-
expect(errors.some((e) => e.type === 'validation')).toBe(true);
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
it('should report key_length errors', () => {
|
|
438
|
-
const errors: BaggageError[] = [];
|
|
439
|
-
const schema = createSafeBaggageSchema(
|
|
440
|
-
{
|
|
441
|
-
veryLongKeyName: { type: 'string' },
|
|
442
|
-
},
|
|
443
|
-
{ maxKeyLength: 5, onError: (e) => errors.push(e) },
|
|
444
|
-
);
|
|
445
|
-
|
|
446
|
-
schema.set(undefined, { veryLongKeyName: 'value' });
|
|
447
|
-
expect(errors.some((e) => e.type === 'key_length')).toBe(true);
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
it('should report value_length errors', () => {
|
|
451
|
-
const errors: BaggageError[] = [];
|
|
452
|
-
const schema = createSafeBaggageSchema(
|
|
453
|
-
{
|
|
454
|
-
short: { type: 'string' },
|
|
455
|
-
},
|
|
456
|
-
{ maxValueLength: 5, onError: (e) => errors.push(e) },
|
|
457
|
-
);
|
|
458
|
-
|
|
459
|
-
schema.set(undefined, { short: 'this is too long' });
|
|
460
|
-
expect(errors.some((e) => e.type === 'value_length')).toBe(true);
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
it('should report pii errors when redactPII is enabled', () => {
|
|
464
|
-
const errors: BaggageError[] = [];
|
|
465
|
-
const schema = createSafeBaggageSchema(
|
|
466
|
-
{
|
|
467
|
-
email: { type: 'string' },
|
|
468
|
-
},
|
|
469
|
-
{ redactPII: true, onError: (e) => errors.push(e) },
|
|
470
|
-
);
|
|
471
|
-
|
|
472
|
-
schema.set(undefined, { email: 'test@example.com' });
|
|
473
|
-
expect(errors.some((e) => e.type === 'pii')).toBe(true);
|
|
474
|
-
});
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
describe('Hash function', () => {
|
|
478
|
-
it('should produce consistent hashes', () => {
|
|
479
|
-
const schema = createSafeBaggageSchema({
|
|
480
|
-
id: { type: 'string', hash: true },
|
|
481
|
-
});
|
|
482
|
-
|
|
483
|
-
// Multiple sets with same value should be consistent
|
|
484
|
-
// (internal hash function is deterministic)
|
|
485
|
-
schema.set(undefined, { id: 'same-value' });
|
|
486
|
-
schema.set(undefined, { id: 'same-value' });
|
|
487
|
-
expect(schema).toBeDefined();
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
it('should produce different hashes for different values', () => {
|
|
491
|
-
const schema = createSafeBaggageSchema({
|
|
492
|
-
id: { type: 'string', hash: true },
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
schema.set(undefined, { id: 'value-1' });
|
|
496
|
-
schema.set(undefined, { id: 'value-2' });
|
|
497
|
-
expect(schema).toBeDefined();
|
|
498
|
-
});
|
|
499
|
-
});
|
|
500
|
-
});
|