@superblocksteam/telemetry 2.0.83-next.1
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/LICENSE.txt +87 -0
- package/README.md +155 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/init.d.ts +75 -0
- package/dist/browser/init.d.ts.map +1 -0
- package/dist/browser/init.js +169 -0
- package/dist/browser/init.js.map +1 -0
- package/dist/browser/resilient-exporter.d.ts +43 -0
- package/dist/browser/resilient-exporter.d.ts.map +1 -0
- package/dist/browser/resilient-exporter.js +88 -0
- package/dist/browser/resilient-exporter.js.map +1 -0
- package/dist/common/contracts/tier2-traces.d.ts +75 -0
- package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist/common/contracts/tier2-traces.js +186 -0
- package/dist/common/contracts/tier2-traces.js.map +1 -0
- package/dist/common/deployment-type.d.ts +18 -0
- package/dist/common/deployment-type.d.ts.map +1 -0
- package/dist/common/deployment-type.js +30 -0
- package/dist/common/deployment-type.js.map +1 -0
- package/dist/common/guardrails.d.ts +116 -0
- package/dist/common/guardrails.d.ts.map +1 -0
- package/dist/common/guardrails.js +189 -0
- package/dist/common/guardrails.js.map +1 -0
- package/dist/common/index.d.ts +16 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +32 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/log-sanitizer.d.ts +78 -0
- package/dist/common/log-sanitizer.d.ts.map +1 -0
- package/dist/common/log-sanitizer.js +340 -0
- package/dist/common/log-sanitizer.js.map +1 -0
- package/dist/common/policy-evaluator.d.ts +103 -0
- package/dist/common/policy-evaluator.d.ts.map +1 -0
- package/dist/common/policy-evaluator.js +200 -0
- package/dist/common/policy-evaluator.js.map +1 -0
- package/dist/common/resource.d.ts +62 -0
- package/dist/common/resource.d.ts.map +1 -0
- package/dist/common/resource.js +106 -0
- package/dist/common/resource.js.map +1 -0
- package/dist/common/tier-hints.d.ts +182 -0
- package/dist/common/tier-hints.d.ts.map +1 -0
- package/dist/common/tier-hints.js +209 -0
- package/dist/common/tier-hints.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/forbidden-attributes.d.ts +149 -0
- package/dist/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist/lint/forbidden-attributes.js +214 -0
- package/dist/lint/forbidden-attributes.js.map +1 -0
- package/dist/lint/index.d.ts +9 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +16 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/llmobs/index.d.ts +22 -0
- package/dist/llmobs/index.d.ts.map +1 -0
- package/dist/llmobs/index.js +29 -0
- package/dist/llmobs/index.js.map +1 -0
- package/dist/llmobs/tier1-exporter.d.ts +146 -0
- package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist/llmobs/tier1-exporter.js +196 -0
- package/dist/llmobs/tier1-exporter.js.map +1 -0
- package/dist/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist/llmobs/tier2-summarizer.js +650 -0
- package/dist/llmobs/tier2-summarizer.js.map +1 -0
- package/dist/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist/node/exporters/resilient-exporter.js +129 -0
- package/dist/node/exporters/resilient-exporter.js.map +1 -0
- package/dist/node/index.d.ts +11 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +24 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/init.d.ts +75 -0
- package/dist/node/init.d.ts.map +1 -0
- package/dist/node/init.js +245 -0
- package/dist/node/init.js.map +1 -0
- package/dist/node/log-processor.d.ts +83 -0
- package/dist/node/log-processor.d.ts.map +1 -0
- package/dist/node/log-processor.js +266 -0
- package/dist/node/log-processor.js.map +1 -0
- package/dist/node/metrics-client.d.ts +66 -0
- package/dist/node/metrics-client.d.ts.map +1 -0
- package/dist/node/metrics-client.js +193 -0
- package/dist/node/metrics-client.js.map +1 -0
- package/dist/node/traced-socket.d.ts +76 -0
- package/dist/node/traced-socket.d.ts.map +1 -0
- package/dist/node/traced-socket.js +261 -0
- package/dist/node/traced-socket.js.map +1 -0
- package/dist/testing/in-memory-exporter.d.ts +179 -0
- package/dist/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist/testing/in-memory-exporter.js +254 -0
- package/dist/testing/in-memory-exporter.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +19 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-init.d.ts +80 -0
- package/dist/testing/test-init.d.ts.map +1 -0
- package/dist/testing/test-init.js +144 -0
- package/dist/testing/test-init.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/policy.d.ts +92 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +125 -0
- package/dist/types/policy.js.map +1 -0
- package/dist-esm/browser/index.d.ts +8 -0
- package/dist-esm/browser/index.d.ts.map +1 -0
- package/dist-esm/browser/index.js +9 -0
- package/dist-esm/browser/index.js.map +1 -0
- package/dist-esm/browser/init.d.ts +75 -0
- package/dist-esm/browser/init.d.ts.map +1 -0
- package/dist-esm/browser/init.js +162 -0
- package/dist-esm/browser/init.js.map +1 -0
- package/dist-esm/browser/resilient-exporter.d.ts +43 -0
- package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/browser/resilient-exporter.js +84 -0
- package/dist-esm/browser/resilient-exporter.js.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts +75 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.js +178 -0
- package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
- package/dist-esm/common/deployment-type.d.ts +18 -0
- package/dist-esm/common/deployment-type.d.ts.map +1 -0
- package/dist-esm/common/deployment-type.js +27 -0
- package/dist-esm/common/deployment-type.js.map +1 -0
- package/dist-esm/common/guardrails.d.ts +116 -0
- package/dist-esm/common/guardrails.d.ts.map +1 -0
- package/dist-esm/common/guardrails.js +179 -0
- package/dist-esm/common/guardrails.js.map +1 -0
- package/dist-esm/common/index.d.ts +16 -0
- package/dist-esm/common/index.d.ts.map +1 -0
- package/dist-esm/common/index.js +16 -0
- package/dist-esm/common/index.js.map +1 -0
- package/dist-esm/common/log-sanitizer.d.ts +78 -0
- package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/log-sanitizer.js +331 -0
- package/dist-esm/common/log-sanitizer.js.map +1 -0
- package/dist-esm/common/policy-evaluator.d.ts +103 -0
- package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
- package/dist-esm/common/policy-evaluator.js +196 -0
- package/dist-esm/common/policy-evaluator.js.map +1 -0
- package/dist-esm/common/resource.d.ts +62 -0
- package/dist-esm/common/resource.d.ts.map +1 -0
- package/dist-esm/common/resource.js +100 -0
- package/dist-esm/common/resource.js.map +1 -0
- package/dist-esm/common/tier-hints.d.ts +182 -0
- package/dist-esm/common/tier-hints.d.ts.map +1 -0
- package/dist-esm/common/tier-hints.js +199 -0
- package/dist-esm/common/tier-hints.js.map +1 -0
- package/dist-esm/index.d.ts +43 -0
- package/dist-esm/index.d.ts.map +1 -0
- package/dist-esm/index.js +53 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
- package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist-esm/lint/forbidden-attributes.js +209 -0
- package/dist-esm/lint/forbidden-attributes.js.map +1 -0
- package/dist-esm/lint/index.d.ts +9 -0
- package/dist-esm/lint/index.d.ts.map +1 -0
- package/dist-esm/lint/index.js +9 -0
- package/dist-esm/lint/index.js.map +1 -0
- package/dist-esm/llmobs/index.d.ts +22 -0
- package/dist-esm/llmobs/index.d.ts.map +1 -0
- package/dist-esm/llmobs/index.js +22 -0
- package/dist-esm/llmobs/index.js.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.js +190 -0
- package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.js +646 -0
- package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.js +125 -0
- package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
- package/dist-esm/node/index.d.ts +11 -0
- package/dist-esm/node/index.d.ts.map +1 -0
- package/dist-esm/node/index.js +11 -0
- package/dist-esm/node/index.js.map +1 -0
- package/dist-esm/node/init.d.ts +75 -0
- package/dist-esm/node/init.d.ts.map +1 -0
- package/dist-esm/node/init.js +239 -0
- package/dist-esm/node/init.js.map +1 -0
- package/dist-esm/node/log-processor.d.ts +83 -0
- package/dist-esm/node/log-processor.d.ts.map +1 -0
- package/dist-esm/node/log-processor.js +261 -0
- package/dist-esm/node/log-processor.js.map +1 -0
- package/dist-esm/node/metrics-client.d.ts +66 -0
- package/dist-esm/node/metrics-client.d.ts.map +1 -0
- package/dist-esm/node/metrics-client.js +189 -0
- package/dist-esm/node/metrics-client.js.map +1 -0
- package/dist-esm/node/traced-socket.d.ts +76 -0
- package/dist-esm/node/traced-socket.d.ts.map +1 -0
- package/dist-esm/node/traced-socket.js +257 -0
- package/dist-esm/node/traced-socket.js.map +1 -0
- package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
- package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist-esm/testing/in-memory-exporter.js +248 -0
- package/dist-esm/testing/in-memory-exporter.js.map +1 -0
- package/dist-esm/testing/index.d.ts +8 -0
- package/dist-esm/testing/index.d.ts.map +1 -0
- package/dist-esm/testing/index.js +8 -0
- package/dist-esm/testing/index.js.map +1 -0
- package/dist-esm/testing/test-init.d.ts +80 -0
- package/dist-esm/testing/test-init.d.ts.map +1 -0
- package/dist-esm/testing/test-init.js +137 -0
- package/dist-esm/testing/test-init.js.map +1 -0
- package/dist-esm/types/index.d.ts +40 -0
- package/dist-esm/types/index.d.ts.map +1 -0
- package/dist-esm/types/index.js +7 -0
- package/dist-esm/types/index.js.map +1 -0
- package/dist-esm/types/policy.d.ts +92 -0
- package/dist-esm/types/policy.d.ts.map +1 -0
- package/dist-esm/types/policy.js +122 -0
- package/dist-esm/types/policy.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In-Memory Exporters for Testing
|
|
4
|
+
*
|
|
5
|
+
* These exporters capture telemetry data in memory for assertion in tests.
|
|
6
|
+
* No external connections are made.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.InMemoryLogExporter = exports.InMemoryMetricExporter = exports.InMemorySpanExporter = void 0;
|
|
10
|
+
const core_1 = require("@opentelemetry/core");
|
|
11
|
+
/**
|
|
12
|
+
* In-memory span exporter for testing.
|
|
13
|
+
* Captures all exported spans for assertion.
|
|
14
|
+
*/
|
|
15
|
+
class InMemorySpanExporter {
|
|
16
|
+
spans = [];
|
|
17
|
+
stopped = false;
|
|
18
|
+
/**
|
|
19
|
+
* Export spans to in-memory storage.
|
|
20
|
+
*/
|
|
21
|
+
export(spans, resultCallback) {
|
|
22
|
+
if (this.stopped) {
|
|
23
|
+
resultCallback({ code: core_1.ExportResultCode.FAILED });
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.spans.push(...spans);
|
|
27
|
+
resultCallback({ code: core_1.ExportResultCode.SUCCESS });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Shutdown the exporter.
|
|
31
|
+
*/
|
|
32
|
+
shutdown() {
|
|
33
|
+
this.stopped = true;
|
|
34
|
+
return Promise.resolve();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Force flush (no-op for in-memory).
|
|
38
|
+
*/
|
|
39
|
+
forceFlush() {
|
|
40
|
+
return Promise.resolve();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get all captured spans.
|
|
44
|
+
*/
|
|
45
|
+
getSpans() {
|
|
46
|
+
return [...this.spans];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the number of captured spans.
|
|
50
|
+
*/
|
|
51
|
+
getSpanCount() {
|
|
52
|
+
return this.spans.length;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clear captured spans.
|
|
56
|
+
*/
|
|
57
|
+
reset() {
|
|
58
|
+
this.spans = [];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Find spans by name.
|
|
62
|
+
*
|
|
63
|
+
* @param name - Span name to search for
|
|
64
|
+
* @returns Matching spans
|
|
65
|
+
*/
|
|
66
|
+
findSpansByName(name) {
|
|
67
|
+
return this.spans.filter((s) => s.name === name);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Find spans by name pattern (regex).
|
|
71
|
+
*
|
|
72
|
+
* @param pattern - Regex pattern to match span names
|
|
73
|
+
* @returns Matching spans
|
|
74
|
+
*/
|
|
75
|
+
findSpansByPattern(pattern) {
|
|
76
|
+
return this.spans.filter((s) => pattern.test(s.name));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Find spans with a specific attribute value.
|
|
80
|
+
*
|
|
81
|
+
* @param key - Attribute key
|
|
82
|
+
* @param value - Attribute value (or regex for pattern matching)
|
|
83
|
+
* @returns Matching spans
|
|
84
|
+
*/
|
|
85
|
+
findSpansByAttribute(key, value) {
|
|
86
|
+
return this.spans.filter((s) => {
|
|
87
|
+
const attr = s.attributes[key];
|
|
88
|
+
if (attr === undefined)
|
|
89
|
+
return false;
|
|
90
|
+
if (value instanceof RegExp) {
|
|
91
|
+
return value.test(String(attr));
|
|
92
|
+
}
|
|
93
|
+
return attr === value;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Assert no spans have a specific attribute value.
|
|
98
|
+
* Useful for ensuring Tier 1 data doesn't leak.
|
|
99
|
+
*
|
|
100
|
+
* @param key - Attribute key
|
|
101
|
+
* @param value - Forbidden attribute value (or regex pattern)
|
|
102
|
+
* @throws Error if forbidden attribute is found
|
|
103
|
+
*/
|
|
104
|
+
assertNoAttribute(key, value) {
|
|
105
|
+
for (const span of this.spans) {
|
|
106
|
+
const attr = span.attributes[key];
|
|
107
|
+
if (attr === undefined)
|
|
108
|
+
continue;
|
|
109
|
+
const matches = value instanceof RegExp ? value.test(String(attr)) : attr === value;
|
|
110
|
+
if (matches) {
|
|
111
|
+
throw new Error(`Found forbidden attribute ${key}=${String(attr)} on span "${span.name}"`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Assert all spans have a required attribute.
|
|
117
|
+
*
|
|
118
|
+
* @param key - Attribute key
|
|
119
|
+
* @throws Error if any span is missing the attribute
|
|
120
|
+
*/
|
|
121
|
+
assertAllHaveAttribute(key) {
|
|
122
|
+
for (const span of this.spans) {
|
|
123
|
+
if (span.attributes[key] === undefined) {
|
|
124
|
+
throw new Error(`Span "${span.name}" is missing required attribute "${key}"`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get span names for debugging.
|
|
130
|
+
*/
|
|
131
|
+
getSpanNames() {
|
|
132
|
+
return this.spans.map((s) => s.name);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.InMemorySpanExporter = InMemorySpanExporter;
|
|
136
|
+
/**
|
|
137
|
+
* In-memory metric exporter for testing.
|
|
138
|
+
*/
|
|
139
|
+
class InMemoryMetricExporter {
|
|
140
|
+
metrics = [];
|
|
141
|
+
/**
|
|
142
|
+
* Export metrics to in-memory storage.
|
|
143
|
+
*/
|
|
144
|
+
export(metrics) {
|
|
145
|
+
this.metrics.push(...metrics);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get all captured metrics.
|
|
149
|
+
*/
|
|
150
|
+
getMetrics() {
|
|
151
|
+
return [...this.metrics];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Find metrics by name.
|
|
155
|
+
*
|
|
156
|
+
* @param name - Metric name
|
|
157
|
+
* @returns Matching metrics
|
|
158
|
+
*/
|
|
159
|
+
findMetricsByName(name) {
|
|
160
|
+
return this.metrics.filter((m) => m.name === name);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Clear captured metrics.
|
|
164
|
+
*/
|
|
165
|
+
reset() {
|
|
166
|
+
this.metrics = [];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Assert no metrics have a specific label value.
|
|
170
|
+
*
|
|
171
|
+
* @param labelKey - Label key
|
|
172
|
+
* @param value - Forbidden value
|
|
173
|
+
* @throws Error if forbidden label is found
|
|
174
|
+
*/
|
|
175
|
+
assertNoLabel(labelKey, value) {
|
|
176
|
+
for (const metric of this.metrics) {
|
|
177
|
+
for (const dp of metric.dataPoints) {
|
|
178
|
+
const label = dp.attributes[labelKey];
|
|
179
|
+
if (label === undefined)
|
|
180
|
+
continue;
|
|
181
|
+
const matches = value instanceof RegExp ? value.test(String(label)) : label === value;
|
|
182
|
+
if (matches) {
|
|
183
|
+
throw new Error(`Found forbidden label ${labelKey}=${String(label)} on metric "${metric.name}"`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.InMemoryMetricExporter = InMemoryMetricExporter;
|
|
190
|
+
/**
|
|
191
|
+
* In-memory log exporter for testing.
|
|
192
|
+
*/
|
|
193
|
+
class InMemoryLogExporter {
|
|
194
|
+
logs = [];
|
|
195
|
+
/**
|
|
196
|
+
* Export logs to in-memory storage.
|
|
197
|
+
*/
|
|
198
|
+
export(logs) {
|
|
199
|
+
this.logs.push(...logs);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Get all captured logs.
|
|
203
|
+
*/
|
|
204
|
+
getLogs() {
|
|
205
|
+
return [...this.logs];
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Find logs by severity.
|
|
209
|
+
*
|
|
210
|
+
* @param severityNumber - Severity level (e.g., 9 for INFO, 13 for WARN, 17 for ERROR)
|
|
211
|
+
* @returns Matching logs
|
|
212
|
+
*/
|
|
213
|
+
findLogsBySeverity(severityNumber) {
|
|
214
|
+
return this.logs.filter((l) => l.severityNumber === severityNumber);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Find logs containing text.
|
|
218
|
+
*
|
|
219
|
+
* @param text - Text to search for in log body
|
|
220
|
+
* @returns Matching logs
|
|
221
|
+
*/
|
|
222
|
+
findLogsContaining(text) {
|
|
223
|
+
return this.logs.filter((l) => {
|
|
224
|
+
if (l.body === undefined)
|
|
225
|
+
return false;
|
|
226
|
+
const bodyStr = String(l.body);
|
|
227
|
+
return text instanceof RegExp ? text.test(bodyStr) : bodyStr.includes(text);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Clear captured logs.
|
|
232
|
+
*/
|
|
233
|
+
reset() {
|
|
234
|
+
this.logs = [];
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Assert no logs contain sensitive data.
|
|
238
|
+
*
|
|
239
|
+
* @param pattern - Pattern to check for (forbidden content)
|
|
240
|
+
* @throws Error if forbidden content is found
|
|
241
|
+
*/
|
|
242
|
+
assertNoLogContains(pattern) {
|
|
243
|
+
for (const log of this.logs) {
|
|
244
|
+
if (log.body === undefined)
|
|
245
|
+
continue;
|
|
246
|
+
const bodyStr = String(log.body);
|
|
247
|
+
if (pattern.test(bodyStr)) {
|
|
248
|
+
throw new Error(`Found forbidden content in log: ${bodyStr.slice(0, 100)}...`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.InMemoryLogExporter = InMemoryLogExporter;
|
|
254
|
+
//# sourceMappingURL=in-memory-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-exporter.js","sourceRoot":"","sources":["../../src/testing/in-memory-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* In-memory exporters and test helpers for telemetry assertions.
|
|
5
|
+
*/
|
|
6
|
+
export { InMemorySpanExporter, InMemoryMetricExporter, InMemoryLogExporter, type CapturedMetric, type CapturedLogRecord, } from './in-memory-exporter.js';
|
|
7
|
+
export { initTestTelemetry, getTestTelemetryInstance, resetTestTelemetry, getTestTracer, withTestSpan, type TestTelemetryInstance, } from './test-init.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Testing Utilities
|
|
4
|
+
*
|
|
5
|
+
* In-memory exporters and test helpers for telemetry assertions.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.withTestSpan = exports.getTestTracer = exports.resetTestTelemetry = exports.getTestTelemetryInstance = exports.initTestTelemetry = exports.InMemoryLogExporter = exports.InMemoryMetricExporter = exports.InMemorySpanExporter = void 0;
|
|
9
|
+
var in_memory_exporter_js_1 = require("./in-memory-exporter.js");
|
|
10
|
+
Object.defineProperty(exports, "InMemorySpanExporter", { enumerable: true, get: function () { return in_memory_exporter_js_1.InMemorySpanExporter; } });
|
|
11
|
+
Object.defineProperty(exports, "InMemoryMetricExporter", { enumerable: true, get: function () { return in_memory_exporter_js_1.InMemoryMetricExporter; } });
|
|
12
|
+
Object.defineProperty(exports, "InMemoryLogExporter", { enumerable: true, get: function () { return in_memory_exporter_js_1.InMemoryLogExporter; } });
|
|
13
|
+
var test_init_js_1 = require("./test-init.js");
|
|
14
|
+
Object.defineProperty(exports, "initTestTelemetry", { enumerable: true, get: function () { return test_init_js_1.initTestTelemetry; } });
|
|
15
|
+
Object.defineProperty(exports, "getTestTelemetryInstance", { enumerable: true, get: function () { return test_init_js_1.getTestTelemetryInstance; } });
|
|
16
|
+
Object.defineProperty(exports, "resetTestTelemetry", { enumerable: true, get: function () { return test_init_js_1.resetTestTelemetry; } });
|
|
17
|
+
Object.defineProperty(exports, "getTestTracer", { enumerable: true, get: function () { return test_init_js_1.getTestTracer; } });
|
|
18
|
+
Object.defineProperty(exports, "withTestSpan", { enumerable: true, get: function () { return test_init_js_1.withTestSpan; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iEAMiC;AAL/B,6HAAA,oBAAoB,OAAA;AACpB,+HAAA,sBAAsB,OAAA;AACtB,4HAAA,mBAAmB,OAAA;AAKrB,+CAOwB;AANtB,iHAAA,iBAAiB,OAAA;AACjB,wHAAA,wBAAwB,OAAA;AACxB,kHAAA,kBAAkB,OAAA;AAClB,6GAAA,aAAa,OAAA;AACb,4GAAA,YAAY,OAAA"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Telemetry Initialization
|
|
3
|
+
*
|
|
4
|
+
* Initialize telemetry for testing with in-memory exporters.
|
|
5
|
+
* No external connections are made.
|
|
6
|
+
*/
|
|
7
|
+
import { trace } from "@opentelemetry/api";
|
|
8
|
+
import { InMemorySpanExporter, InMemoryMetricExporter, InMemoryLogExporter } from "./in-memory-exporter.js";
|
|
9
|
+
import { TelemetryPolicyEvaluator } from "../common/policy-evaluator.js";
|
|
10
|
+
import type { BaseTelemetryConfig } from "../types/index.js";
|
|
11
|
+
/**
|
|
12
|
+
* Test telemetry instance with in-memory exporters.
|
|
13
|
+
*/
|
|
14
|
+
export interface TestTelemetryInstance {
|
|
15
|
+
/** In-memory span exporter */
|
|
16
|
+
spanExporter: InMemorySpanExporter;
|
|
17
|
+
/** In-memory metric exporter */
|
|
18
|
+
metricExporter: InMemoryMetricExporter;
|
|
19
|
+
/** In-memory log exporter */
|
|
20
|
+
logExporter: InMemoryLogExporter;
|
|
21
|
+
/** Policy evaluator */
|
|
22
|
+
policyEvaluator: TelemetryPolicyEvaluator;
|
|
23
|
+
/** Reset all exporters (call in beforeEach) */
|
|
24
|
+
reset: () => void;
|
|
25
|
+
/** Shutdown (call in afterAll) */
|
|
26
|
+
shutdown: () => Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize telemetry for testing.
|
|
30
|
+
*
|
|
31
|
+
* Uses in-memory exporters, no external connections.
|
|
32
|
+
* Call once per test file, use reset() in beforeEach.
|
|
33
|
+
*
|
|
34
|
+
* @param config - Optional test configuration
|
|
35
|
+
* @returns Test telemetry instance
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* import { initTestTelemetry } from '@superblocksteam/telemetry/testing';
|
|
40
|
+
*
|
|
41
|
+
* describe('MyService', () => {
|
|
42
|
+
* const { spanExporter, reset } = initTestTelemetry();
|
|
43
|
+
*
|
|
44
|
+
* beforeEach(() => reset());
|
|
45
|
+
*
|
|
46
|
+
* it('creates expected spans', async () => {
|
|
47
|
+
* // ... test code ...
|
|
48
|
+
* expect(spanExporter.getSpans()).toHaveLength(1);
|
|
49
|
+
* });
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function initTestTelemetry(config?: Partial<BaseTelemetryConfig>): TestTelemetryInstance;
|
|
54
|
+
/**
|
|
55
|
+
* Get the test telemetry instance.
|
|
56
|
+
*
|
|
57
|
+
* @throws Error if not initialized
|
|
58
|
+
*/
|
|
59
|
+
export declare function getTestTelemetryInstance(): TestTelemetryInstance;
|
|
60
|
+
/**
|
|
61
|
+
* Reset the test telemetry (for cleanup between test files).
|
|
62
|
+
*/
|
|
63
|
+
export declare function resetTestTelemetry(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Get a tracer for tests.
|
|
66
|
+
*
|
|
67
|
+
* @param name - Tracer name
|
|
68
|
+
* @returns Tracer instance
|
|
69
|
+
*/
|
|
70
|
+
export declare function getTestTracer(name?: string): ReturnType<typeof trace.getTracer>;
|
|
71
|
+
/**
|
|
72
|
+
* Run a function within a test span.
|
|
73
|
+
* Useful for testing span creation.
|
|
74
|
+
*
|
|
75
|
+
* @param name - Span name
|
|
76
|
+
* @param fn - Function to run
|
|
77
|
+
* @returns Function result
|
|
78
|
+
*/
|
|
79
|
+
export declare function withTestSpan<T>(name: string, fn: () => Promise<T> | T): Promise<T>;
|
|
80
|
+
//# sourceMappingURL=test-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-init.d.ts","sourceRoot":"","sources":["../../src/testing/test-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,YAAY,EAAE,oBAAoB,CAAC;IACnC,gCAAgC;IAChC,cAAc,EAAE,sBAAsB,CAAC;IACvC,6BAA6B;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,uBAAuB;IACvB,eAAe,EAAE,wBAAwB,CAAC;IAC1C,+CAA+C;IAC/C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAeD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,qBAAqB,CA2CvB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,CAOhE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIxD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,SAAS,GACZ,UAAU,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,CAEpC;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CASZ"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test Telemetry Initialization
|
|
4
|
+
*
|
|
5
|
+
* Initialize telemetry for testing with in-memory exporters.
|
|
6
|
+
* No external connections are made.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.initTestTelemetry = initTestTelemetry;
|
|
10
|
+
exports.getTestTelemetryInstance = getTestTelemetryInstance;
|
|
11
|
+
exports.resetTestTelemetry = resetTestTelemetry;
|
|
12
|
+
exports.getTestTracer = getTestTracer;
|
|
13
|
+
exports.withTestSpan = withTestSpan;
|
|
14
|
+
const api_1 = require("@opentelemetry/api");
|
|
15
|
+
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
16
|
+
const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
|
|
17
|
+
const context_async_hooks_1 = require("@opentelemetry/context-async-hooks");
|
|
18
|
+
const core_1 = require("@opentelemetry/core");
|
|
19
|
+
const in_memory_exporter_js_1 = require("./in-memory-exporter.js");
|
|
20
|
+
const resource_js_1 = require("../common/resource.js");
|
|
21
|
+
const policy_evaluator_js_1 = require("../common/policy-evaluator.js");
|
|
22
|
+
const policy_js_1 = require("../types/policy.js");
|
|
23
|
+
// Singleton for tests
|
|
24
|
+
let testInstance;
|
|
25
|
+
let tracerProvider;
|
|
26
|
+
/**
|
|
27
|
+
* Default test configuration.
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULT_TEST_CONFIG = {
|
|
30
|
+
serviceName: "test-service",
|
|
31
|
+
serviceVersion: "0.0.0-test",
|
|
32
|
+
environment: "test",
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Initialize telemetry for testing.
|
|
36
|
+
*
|
|
37
|
+
* Uses in-memory exporters, no external connections.
|
|
38
|
+
* Call once per test file, use reset() in beforeEach.
|
|
39
|
+
*
|
|
40
|
+
* @param config - Optional test configuration
|
|
41
|
+
* @returns Test telemetry instance
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* import { initTestTelemetry } from '@superblocksteam/telemetry/testing';
|
|
46
|
+
*
|
|
47
|
+
* describe('MyService', () => {
|
|
48
|
+
* const { spanExporter, reset } = initTestTelemetry();
|
|
49
|
+
*
|
|
50
|
+
* beforeEach(() => reset());
|
|
51
|
+
*
|
|
52
|
+
* it('creates expected spans', async () => {
|
|
53
|
+
* // ... test code ...
|
|
54
|
+
* expect(spanExporter.getSpans()).toHaveLength(1);
|
|
55
|
+
* });
|
|
56
|
+
* });
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
function initTestTelemetry(config) {
|
|
60
|
+
if (testInstance) {
|
|
61
|
+
return testInstance;
|
|
62
|
+
}
|
|
63
|
+
const mergedConfig = { ...DEFAULT_TEST_CONFIG, ...config };
|
|
64
|
+
const resource = (0, resource_js_1.buildResource)(mergedConfig);
|
|
65
|
+
const spanExporter = new in_memory_exporter_js_1.InMemorySpanExporter();
|
|
66
|
+
const metricExporter = new in_memory_exporter_js_1.InMemoryMetricExporter();
|
|
67
|
+
const logExporter = new in_memory_exporter_js_1.InMemoryLogExporter();
|
|
68
|
+
const policyEvaluator = new policy_evaluator_js_1.TelemetryPolicyEvaluator(policy_js_1.CLOUD_DEFAULT_POLICY);
|
|
69
|
+
// Create provider with span processors in constructor (OTEL v2.x API)
|
|
70
|
+
tracerProvider = new sdk_trace_node_1.NodeTracerProvider({
|
|
71
|
+
resource,
|
|
72
|
+
spanProcessors: [new sdk_trace_base_1.SimpleSpanProcessor(spanExporter)],
|
|
73
|
+
});
|
|
74
|
+
// Register the provider
|
|
75
|
+
tracerProvider.register({
|
|
76
|
+
propagator: new core_1.W3CTraceContextPropagator(),
|
|
77
|
+
contextManager: new context_async_hooks_1.AsyncLocalStorageContextManager(),
|
|
78
|
+
});
|
|
79
|
+
testInstance = {
|
|
80
|
+
spanExporter,
|
|
81
|
+
metricExporter,
|
|
82
|
+
logExporter,
|
|
83
|
+
policyEvaluator,
|
|
84
|
+
reset: () => {
|
|
85
|
+
spanExporter.reset();
|
|
86
|
+
metricExporter.reset();
|
|
87
|
+
logExporter.reset();
|
|
88
|
+
},
|
|
89
|
+
shutdown: async () => {
|
|
90
|
+
await tracerProvider?.shutdown();
|
|
91
|
+
testInstance = undefined;
|
|
92
|
+
tracerProvider = undefined;
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
return testInstance;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the test telemetry instance.
|
|
99
|
+
*
|
|
100
|
+
* @throws Error if not initialized
|
|
101
|
+
*/
|
|
102
|
+
function getTestTelemetryInstance() {
|
|
103
|
+
if (!testInstance) {
|
|
104
|
+
throw new Error("[TestTelemetry] Not initialized. Call initTestTelemetry() first.");
|
|
105
|
+
}
|
|
106
|
+
return testInstance;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Reset the test telemetry (for cleanup between test files).
|
|
110
|
+
*/
|
|
111
|
+
async function resetTestTelemetry() {
|
|
112
|
+
if (testInstance) {
|
|
113
|
+
await testInstance.shutdown();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get a tracer for tests.
|
|
118
|
+
*
|
|
119
|
+
* @param name - Tracer name
|
|
120
|
+
* @returns Tracer instance
|
|
121
|
+
*/
|
|
122
|
+
function getTestTracer(name = "test") {
|
|
123
|
+
return api_1.trace.getTracer(name);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Run a function within a test span.
|
|
127
|
+
* Useful for testing span creation.
|
|
128
|
+
*
|
|
129
|
+
* @param name - Span name
|
|
130
|
+
* @param fn - Function to run
|
|
131
|
+
* @returns Function result
|
|
132
|
+
*/
|
|
133
|
+
async function withTestSpan(name, fn) {
|
|
134
|
+
const tracer = getTestTracer();
|
|
135
|
+
return tracer.startActiveSpan(name, async (span) => {
|
|
136
|
+
try {
|
|
137
|
+
return await fn();
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
span.end();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=test-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-init.js","sourceRoot":"","sources":["../../src/testing/test-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Types
|
|
3
|
+
*
|
|
4
|
+
* Re-exports policy types and config interfaces.
|
|
5
|
+
*/
|
|
6
|
+
export * from './policy.js';
|
|
7
|
+
/**
|
|
8
|
+
* Base configuration for telemetry initialization.
|
|
9
|
+
*/
|
|
10
|
+
export interface BaseTelemetryConfig {
|
|
11
|
+
/** Service name (e.g., 'superblocks-server') */
|
|
12
|
+
serviceName: string;
|
|
13
|
+
/** Service version (e.g., '1.0.0') */
|
|
14
|
+
serviceVersion: string;
|
|
15
|
+
/** Deployment environment (e.g., 'production', 'staging', 'development') */
|
|
16
|
+
environment: string;
|
|
17
|
+
/** Additional resource attributes */
|
|
18
|
+
resourceAttributes?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Node.js specific telemetry configuration.
|
|
22
|
+
*/
|
|
23
|
+
export interface NodeTelemetryConfig extends BaseTelemetryConfig {
|
|
24
|
+
/** OTLP collector URL (e.g., http://localhost:4318) */
|
|
25
|
+
otlpUrl?: string;
|
|
26
|
+
/** OpenTelemetry instrumentations to enable */
|
|
27
|
+
instrumentations?: unknown[];
|
|
28
|
+
/** Whether to enable metrics collection */
|
|
29
|
+
metricsEnabled?: boolean;
|
|
30
|
+
/** Whether to enable log collection */
|
|
31
|
+
logsEnabled?: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Browser specific telemetry configuration.
|
|
35
|
+
*/
|
|
36
|
+
export interface BrowserTelemetryConfig extends BaseTelemetryConfig {
|
|
37
|
+
/** OTLP traces endpoint URL */
|
|
38
|
+
otlpUrl: string;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IAEvB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IAEpB,qCAAqC;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC9D,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;IAE7B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Telemetry Types
|
|
4
|
+
*
|
|
5
|
+
* Re-exports policy types and config interfaces.
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
__exportStar(require("./policy.js"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,8CAA4B"}
|