mcp4openapi 0.3.1 → 0.3.3
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 +7 -0
- package/dist/src/core/cli-config.d.ts.map +1 -1
- package/dist/src/core/cli-config.js +2 -0
- package/dist/src/core/cli-config.js.map +1 -1
- package/dist/src/core/index.d.ts.map +1 -1
- package/dist/src/core/index.js +18 -3
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/index.js +0 -0
- package/dist/src/profile/profile-allowlist.d.ts +18 -0
- package/dist/src/profile/profile-allowlist.d.ts.map +1 -0
- package/dist/src/profile/profile-allowlist.js +68 -0
- package/dist/src/profile/profile-allowlist.js.map +1 -0
- package/dist/src/profile/profile-registry.d.ts +5 -0
- package/dist/src/profile/profile-registry.d.ts.map +1 -1
- package/dist/src/profile/profile-registry.js +38 -14
- package/dist/src/profile/profile-registry.js.map +1 -1
- package/package.json +2 -2
- package/profiles/gitlab/developer-profile-oauth.json +243 -41
- package/profiles/gitlab/developer-profile-oauth.test.json +1009 -5
- package/profiles/gitlab/openapi.yaml +1419 -164
- package/profiles/gitlab/profile-optimized-oauth.json +785 -0
- package/profiles/gitlab/profile-optimized-oauth.test.json +1566 -0
- package/profiles/grafana/openapi.json +28078 -0
- package/profiles/grafana/profile.json +1083 -0
- package/profiles/grafana/profile.test.json +235 -0
- package/profiles/mattermost/openapi.yaml +27434 -0
- package/profiles/mattermost/profile.json +463 -0
- package/profiles/mattermost/profile.test.json +607 -0
- package/profiles/n8n/profile-optimized.json +1002 -364
- package/profiles/n8n/profile-optimized.test.json +43 -43
- package/dist/src/argument-normalizer.d.ts +0 -5
- package/dist/src/argument-normalizer.d.ts.map +0 -1
- package/dist/src/argument-normalizer.js +0 -61
- package/dist/src/argument-normalizer.js.map +0 -1
- package/dist/src/cli-config.d.ts +0 -9
- package/dist/src/cli-config.d.ts.map +0 -1
- package/dist/src/cli-config.js +0 -111
- package/dist/src/cli-config.js.map +0 -1
- package/dist/src/composite-executor.d.ts +0 -77
- package/dist/src/composite-executor.d.ts.map +0 -1
- package/dist/src/composite-executor.js +0 -193
- package/dist/src/composite-executor.js.map +0 -1
- package/dist/src/constants.d.ts +0 -85
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -85
- package/dist/src/constants.js.map +0 -1
- package/dist/src/dag-executor.d.ts +0 -49
- package/dist/src/dag-executor.d.ts.map +0 -1
- package/dist/src/dag-executor.js +0 -138
- package/dist/src/dag-executor.js.map +0 -1
- package/dist/src/errors.d.ts +0 -59
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js +0 -119
- package/dist/src/errors.js.map +0 -1
- package/dist/src/filtering.d.ts +0 -19
- package/dist/src/filtering.d.ts.map +0 -1
- package/dist/src/filtering.js +0 -292
- package/dist/src/filtering.js.map +0 -1
- package/dist/src/http-client-factory.d.ts +0 -62
- package/dist/src/http-client-factory.d.ts.map +0 -1
- package/dist/src/http-client-factory.js +0 -133
- package/dist/src/http-client-factory.js.map +0 -1
- package/dist/src/http-transport-config.d.ts +0 -6
- package/dist/src/http-transport-config.d.ts.map +0 -1
- package/dist/src/http-transport-config.js +0 -47
- package/dist/src/http-transport-config.js.map +0 -1
- package/dist/src/http-transport.d.ts +0 -316
- package/dist/src/http-transport.d.ts.map +0 -1
- package/dist/src/http-transport.js +0 -2412
- package/dist/src/http-transport.js.map +0 -1
- package/dist/src/interceptors.d.ts +0 -116
- package/dist/src/interceptors.d.ts.map +0 -1
- package/dist/src/interceptors.js +0 -392
- package/dist/src/interceptors.js.map +0 -1
- package/dist/src/jsonrpc-validator.d.ts +0 -27
- package/dist/src/jsonrpc-validator.d.ts.map +0 -1
- package/dist/src/jsonrpc-validator.js +0 -58
- package/dist/src/jsonrpc-validator.js.map +0 -1
- package/dist/src/logger.d.ts +0 -59
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -177
- package/dist/src/logger.js.map +0 -1
- package/dist/src/mcp-server-manager.d.ts +0 -20
- package/dist/src/mcp-server-manager.d.ts.map +0 -1
- package/dist/src/mcp-server-manager.js +0 -38
- package/dist/src/mcp-server-manager.js.map +0 -1
- package/dist/src/mcp-server.d.ts +0 -203
- package/dist/src/mcp-server.d.ts.map +0 -1
- package/dist/src/mcp-server.js +0 -1369
- package/dist/src/mcp-server.js.map +0 -1
- package/dist/src/metrics.d.ts +0 -97
- package/dist/src/metrics.d.ts.map +0 -1
- package/dist/src/metrics.js +0 -273
- package/dist/src/metrics.js.map +0 -1
- package/dist/src/naming-warnings.d.ts +0 -23
- package/dist/src/naming-warnings.d.ts.map +0 -1
- package/dist/src/naming-warnings.js +0 -83
- package/dist/src/naming-warnings.js.map +0 -1
- package/dist/src/naming.d.ts +0 -58
- package/dist/src/naming.d.ts.map +0 -1
- package/dist/src/naming.js +0 -510
- package/dist/src/naming.js.map +0 -1
- package/dist/src/oauth-provider.d.ts +0 -131
- package/dist/src/oauth-provider.d.ts.map +0 -1
- package/dist/src/oauth-provider.js +0 -836
- package/dist/src/oauth-provider.js.map +0 -1
- package/dist/src/openapi-parser.d.ts +0 -70
- package/dist/src/openapi-parser.d.ts.map +0 -1
- package/dist/src/openapi-parser.js +0 -436
- package/dist/src/openapi-parser.js.map +0 -1
- package/dist/src/profile-loader.d.ts +0 -78
- package/dist/src/profile-loader.d.ts.map +0 -1
- package/dist/src/profile-loader.js +0 -483
- package/dist/src/profile-loader.js.map +0 -1
- package/dist/src/profile-registry.d.ts +0 -18
- package/dist/src/profile-registry.d.ts.map +0 -1
- package/dist/src/profile-registry.js +0 -26
- package/dist/src/profile-registry.js.map +0 -1
- package/dist/src/profile-resolver.d.ts +0 -19
- package/dist/src/profile-resolver.d.ts.map +0 -1
- package/dist/src/profile-resolver.js +0 -167
- package/dist/src/profile-resolver.js.map +0 -1
- package/dist/src/proxy-executor.d.ts +0 -86
- package/dist/src/proxy-executor.d.ts.map +0 -1
- package/dist/src/proxy-executor.js +0 -497
- package/dist/src/proxy-executor.js.map +0 -1
- package/dist/src/schema-validator.d.ts +0 -30
- package/dist/src/schema-validator.d.ts.map +0 -1
- package/dist/src/schema-validator.js +0 -128
- package/dist/src/schema-validator.js.map +0 -1
- package/dist/src/startup-profile.d.ts +0 -17
- package/dist/src/startup-profile.d.ts.map +0 -1
- package/dist/src/startup-profile.js +0 -30
- package/dist/src/startup-profile.js.map +0 -1
- package/dist/src/startup-validation.d.ts +0 -11
- package/dist/src/startup-validation.d.ts.map +0 -1
- package/dist/src/startup-validation.js +0 -21
- package/dist/src/startup-validation.js.map +0 -1
- package/dist/src/tool-filter.d.ts +0 -65
- package/dist/src/tool-filter.d.ts.map +0 -1
- package/dist/src/tool-filter.js +0 -471
- package/dist/src/tool-filter.js.map +0 -1
- package/dist/src/tool-generator.d.ts +0 -67
- package/dist/src/tool-generator.d.ts.map +0 -1
- package/dist/src/tool-generator.js +0 -182
- package/dist/src/tool-generator.js.map +0 -1
- package/dist/src/validation-utils.d.ts +0 -49
- package/dist/src/validation-utils.d.ts.map +0 -1
- package/dist/src/validation-utils.js +0 -138
- package/dist/src/validation-utils.js.map +0 -1
- package/profiles/gitlab/developer-profile.json +0 -1508
- package/profiles/gitlab/developer-profile.test.json +0 -3432
package/dist/src/interceptors.js
DELETED
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTTP interceptors for auth, rate limiting, retry, etc.
|
|
3
|
-
*
|
|
4
|
-
* Why interceptor pattern: Separates cross-cutting concerns (auth, retry)
|
|
5
|
-
* from business logic (API calls). Each interceptor is independently testable.
|
|
6
|
-
*/
|
|
7
|
-
import { TIME, HTTP_STATUS } from './constants.js';
|
|
8
|
-
import { AuthenticationError, AuthorizationError, ConfigurationError, NetworkError, RateLimitError, } from './errors.js';
|
|
9
|
-
import { isSafePropertyName } from './validation-utils.js';
|
|
10
|
-
export class InterceptorChain {
|
|
11
|
-
constructor(config, authToken) {
|
|
12
|
-
this.config = config;
|
|
13
|
-
this.authToken = authToken;
|
|
14
|
-
this.interceptors = [];
|
|
15
|
-
this.buildChain();
|
|
16
|
-
}
|
|
17
|
-
buildChain() {
|
|
18
|
-
if (this.config.auth) {
|
|
19
|
-
this.interceptors.push(this.createAuthInterceptor());
|
|
20
|
-
}
|
|
21
|
-
if (this.config.rate_limit) {
|
|
22
|
-
this.interceptors.push(this.createRateLimitInterceptor());
|
|
23
|
-
}
|
|
24
|
-
if (this.config.retry) {
|
|
25
|
-
this.interceptors.push(this.createRetryInterceptor());
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Auth interceptor: adds auth header/query from env or session token
|
|
30
|
-
*
|
|
31
|
-
* Why env-based: Keeps secrets out of config files. Config defines WHERE
|
|
32
|
-
* to get the token, runtime provides the value.
|
|
33
|
-
*
|
|
34
|
-
* Supports:
|
|
35
|
-
* - bearer: Standard HTTP Authorization: Bearer <token>
|
|
36
|
-
* - query: API key in URL (?api_key=<token>)
|
|
37
|
-
* - custom-header: Custom header (e.g., X-API-Key: <token>)
|
|
38
|
-
*
|
|
39
|
-
* Note: For multi-auth, uses the primary (first/lowest priority) non-OAuth config.
|
|
40
|
-
* OAuth is handled separately in HTTP transport, not in InterceptorChain.
|
|
41
|
-
*/
|
|
42
|
-
createAuthInterceptor() {
|
|
43
|
-
const authConfigRaw = this.config.auth;
|
|
44
|
-
// Handle multi-auth: get primary non-OAuth config
|
|
45
|
-
const authConfigs = Array.isArray(authConfigRaw) ? authConfigRaw : [authConfigRaw];
|
|
46
|
-
const sortedConfigs = authConfigs.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
47
|
-
// Find first non-OAuth config (OAuth handled by HTTP transport)
|
|
48
|
-
const authConfig = sortedConfigs.find(c => c.type !== 'oauth');
|
|
49
|
-
if (!authConfig) {
|
|
50
|
-
throw new ConfigurationError('Only OAuth authentication configured. OAuth requires HTTP transport for the authorization flow (redirects, callbacks). Add a token-based auth config or use HTTP transport.');
|
|
51
|
-
}
|
|
52
|
-
if (authConfig.type === 'oauth') {
|
|
53
|
-
throw new ConfigurationError('OAuth authentication not supported in InterceptorChain (use HTTP transport OAuth flow)');
|
|
54
|
-
}
|
|
55
|
-
const envVarName = authConfig.value_from_env;
|
|
56
|
-
if (!envVarName) {
|
|
57
|
-
throw new ConfigurationError('Auth configuration missing value_from_env');
|
|
58
|
-
}
|
|
59
|
-
const token = this.authToken || process.env[envVarName];
|
|
60
|
-
if (!token) {
|
|
61
|
-
throw new AuthenticationError(`Auth token not found. Expected in environment variable: ${envVarName} or passed to constructor`);
|
|
62
|
-
}
|
|
63
|
-
return async (ctx, next) => {
|
|
64
|
-
if (authConfig.type === 'bearer') {
|
|
65
|
-
ctx.headers['Authorization'] = `Bearer ${token}`;
|
|
66
|
-
}
|
|
67
|
-
else if (authConfig.type === 'query' && authConfig.query_param) {
|
|
68
|
-
const url = new URL(ctx.url);
|
|
69
|
-
url.searchParams.set(authConfig.query_param, token);
|
|
70
|
-
ctx.url = url.toString();
|
|
71
|
-
}
|
|
72
|
-
else if (authConfig.type === 'custom-header' && authConfig.header_name) {
|
|
73
|
-
if (!isSafePropertyName(authConfig.header_name)) {
|
|
74
|
-
throw new ConfigurationError(`Invalid header name: ${authConfig.header_name}`);
|
|
75
|
-
}
|
|
76
|
-
// nosemgrep: javascript.express.security.audit.remote-property-injection.remote-property-injection
|
|
77
|
-
ctx.headers[authConfig.header_name] = token;
|
|
78
|
-
}
|
|
79
|
-
return next();
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Rate limiter: token bucket algorithm with per-endpoint overrides
|
|
84
|
-
*
|
|
85
|
-
* Why token bucket: Allows bursts while enforcing average rate. Better UX
|
|
86
|
-
* than strict per-request delays.
|
|
87
|
-
*
|
|
88
|
-
* Supports per-endpoint overrides via operationId matching.
|
|
89
|
-
*/
|
|
90
|
-
createRateLimitInterceptor() {
|
|
91
|
-
const config = this.config.rate_limit;
|
|
92
|
-
// Global token bucket state
|
|
93
|
-
const globalTokensPerMs = config.max_requests_per_minute / TIME.MS_PER_MINUTE;
|
|
94
|
-
let globalTokens = config.max_requests_per_minute;
|
|
95
|
-
let globalLastRefill = Date.now();
|
|
96
|
-
// Per-endpoint token buckets (operationId -> bucket state)
|
|
97
|
-
const endpointBuckets = new Map();
|
|
98
|
-
// Initialize per-endpoint buckets
|
|
99
|
-
if (config.overrides) {
|
|
100
|
-
for (const [operationId, override] of Object.entries(config.overrides)) {
|
|
101
|
-
endpointBuckets.set(operationId, {
|
|
102
|
-
tokensPerMs: override.max_requests_per_minute / TIME.MS_PER_MINUTE,
|
|
103
|
-
tokens: override.max_requests_per_minute,
|
|
104
|
-
lastRefill: Date.now(),
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return async (ctx, next) => {
|
|
109
|
-
const now = Date.now();
|
|
110
|
-
// Choose appropriate bucket: per-endpoint override or global
|
|
111
|
-
let bucket = {
|
|
112
|
-
tokensPerMs: globalTokensPerMs,
|
|
113
|
-
tokens: globalTokens,
|
|
114
|
-
lastRefill: globalLastRefill,
|
|
115
|
-
};
|
|
116
|
-
if (ctx.operationId && endpointBuckets.has(ctx.operationId)) {
|
|
117
|
-
bucket = endpointBuckets.get(ctx.operationId);
|
|
118
|
-
}
|
|
119
|
-
// Refill tokens for the chosen bucket
|
|
120
|
-
const elapsed = now - bucket.lastRefill;
|
|
121
|
-
const maxTokens = bucket.tokensPerMs * TIME.MS_PER_MINUTE; // Convert back to max tokens
|
|
122
|
-
bucket.tokens = Math.min(maxTokens, bucket.tokens + elapsed * bucket.tokensPerMs);
|
|
123
|
-
bucket.lastRefill = now;
|
|
124
|
-
// Check if we need to wait
|
|
125
|
-
if (bucket.tokens < 1) {
|
|
126
|
-
const waitMs = (1 - bucket.tokens) / bucket.tokensPerMs;
|
|
127
|
-
await new Promise(resolve => setTimeout(resolve, waitMs));
|
|
128
|
-
bucket.tokens = 0;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
bucket.tokens -= 1;
|
|
132
|
-
}
|
|
133
|
-
// Update global state if using global bucket
|
|
134
|
-
if (!ctx.operationId || !endpointBuckets.has(ctx.operationId)) {
|
|
135
|
-
globalTokens = bucket.tokens;
|
|
136
|
-
globalLastRefill = bucket.lastRefill;
|
|
137
|
-
}
|
|
138
|
-
return next();
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Retry interceptor: exponential backoff
|
|
143
|
-
*
|
|
144
|
-
* Why exponential: Reduces server load during outages. Linear backoff
|
|
145
|
-
* can cause thundering herd on recovery.
|
|
146
|
-
*/
|
|
147
|
-
createRetryInterceptor() {
|
|
148
|
-
const config = this.config.retry;
|
|
149
|
-
return async (ctx, next) => {
|
|
150
|
-
let lastError;
|
|
151
|
-
for (let attempt = 0; attempt < config.max_attempts; attempt++) {
|
|
152
|
-
try {
|
|
153
|
-
const response = await next();
|
|
154
|
-
// Check if we should retry based on status
|
|
155
|
-
if (config.retry_on_status.includes(response.status) && attempt < config.max_attempts - 1) {
|
|
156
|
-
const backoffMs = config.backoff_ms[attempt] || config.backoff_ms[config.backoff_ms.length - 1];
|
|
157
|
-
await new Promise(resolve => setTimeout(resolve, backoffMs));
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
return response;
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
164
|
-
if (attempt < config.max_attempts - 1) {
|
|
165
|
-
const backoffMs = config.backoff_ms[attempt] || config.backoff_ms[config.backoff_ms.length - 1];
|
|
166
|
-
await new Promise(resolve => setTimeout(resolve, backoffMs));
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
throw lastError || new Error('All retry attempts failed');
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
async execute(ctx, finalHandler) {
|
|
174
|
-
let index = 0;
|
|
175
|
-
const next = async () => {
|
|
176
|
-
if (index >= this.interceptors.length) {
|
|
177
|
-
return finalHandler();
|
|
178
|
-
}
|
|
179
|
-
const interceptor = this.interceptors[index++];
|
|
180
|
-
return interceptor(ctx, next);
|
|
181
|
-
};
|
|
182
|
-
return next();
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Extract auth credentials (headers + query params) without making a request
|
|
186
|
-
*
|
|
187
|
-
* Why separate: ProxyDownloadExecutor needs auth for direct fetch calls,
|
|
188
|
-
* but can't use InterceptorChain (fetch doesn't go through chain).
|
|
189
|
-
* This extracts the same credentials the chain would apply.
|
|
190
|
-
*
|
|
191
|
-
* Returns:
|
|
192
|
-
* - Bearer auth: { headers: { Authorization: 'Bearer token' }, queryParams: undefined }
|
|
193
|
-
* - Custom-header auth: { headers: { 'X-API-Key': 'token' }, queryParams: undefined }
|
|
194
|
-
* - Query auth: { headers: {}, queryParams: { key: 'api_key', value: 'token' } }
|
|
195
|
-
* - No auth: { headers: {}, queryParams: undefined }
|
|
196
|
-
*/
|
|
197
|
-
getAuthCredentials() {
|
|
198
|
-
if (!this.config.auth) {
|
|
199
|
-
return { headers: {} };
|
|
200
|
-
}
|
|
201
|
-
const authConfigRaw = this.config.auth;
|
|
202
|
-
// Handle multi-auth: get primary non-OAuth config
|
|
203
|
-
const authConfigs = Array.isArray(authConfigRaw) ? authConfigRaw : [authConfigRaw];
|
|
204
|
-
const sortedConfigs = authConfigs.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
205
|
-
// Find first non-OAuth config (OAuth handled separately in HTTP transport)
|
|
206
|
-
const authConfig = sortedConfigs.find(c => c.type !== 'oauth');
|
|
207
|
-
if (!authConfig || authConfig.type === 'oauth') {
|
|
208
|
-
return { headers: {} };
|
|
209
|
-
}
|
|
210
|
-
const envVarName = authConfig.value_from_env;
|
|
211
|
-
if (!envVarName) {
|
|
212
|
-
return { headers: {} };
|
|
213
|
-
}
|
|
214
|
-
// Use session token first, then environment variable
|
|
215
|
-
const token = this.authToken || process.env[envVarName];
|
|
216
|
-
if (!token) {
|
|
217
|
-
return { headers: {} };
|
|
218
|
-
}
|
|
219
|
-
const credentials = { headers: {} };
|
|
220
|
-
if (authConfig.type === 'bearer') {
|
|
221
|
-
credentials.headers['Authorization'] = `Bearer ${token}`;
|
|
222
|
-
}
|
|
223
|
-
else if (authConfig.type === 'custom-header' && authConfig.header_name) {
|
|
224
|
-
if (!isSafePropertyName(authConfig.header_name)) {
|
|
225
|
-
return { headers: {} }; // Skip unsafe header name
|
|
226
|
-
}
|
|
227
|
-
credentials.headers[authConfig.header_name] = token;
|
|
228
|
-
}
|
|
229
|
-
else if (authConfig.type === 'query' && authConfig.query_param) {
|
|
230
|
-
credentials.queryParams = {
|
|
231
|
-
key: authConfig.query_param,
|
|
232
|
-
value: token
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
return credentials;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* HTTP client with interceptor support
|
|
240
|
-
*/
|
|
241
|
-
export class HttpClient {
|
|
242
|
-
constructor(baseUrl, interceptors) {
|
|
243
|
-
this.baseUrl = baseUrl;
|
|
244
|
-
this.interceptors = interceptors;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Get base URL (for testing)
|
|
248
|
-
*/
|
|
249
|
-
getBaseUrl() {
|
|
250
|
-
return this.baseUrl;
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Get interceptors config (for testing)
|
|
254
|
-
*/
|
|
255
|
-
getInterceptorsConfig() {
|
|
256
|
-
return this.interceptors.config;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Get auth credentials (headers and query params) for direct HTTP calls
|
|
260
|
-
* Used by ProxyDownloadExecutor for authenticated file downloads
|
|
261
|
-
*/
|
|
262
|
-
getAuthCredentials() {
|
|
263
|
-
return this.interceptors.getAuthCredentials();
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Serialize parameters including arrays
|
|
267
|
-
*
|
|
268
|
-
* Why different formats: APIs use different conventions for array parameters.
|
|
269
|
-
* Rails/GitLab: scope[]=value, PHP: scope[0]=value, Express: scope=value (repeat)
|
|
270
|
-
*/
|
|
271
|
-
serializeParams(params, format) {
|
|
272
|
-
const searchParams = new URLSearchParams();
|
|
273
|
-
for (const [key, value] of Object.entries(params)) {
|
|
274
|
-
if (Array.isArray(value)) {
|
|
275
|
-
switch (format) {
|
|
276
|
-
case 'brackets':
|
|
277
|
-
value.forEach(item => searchParams.append(`${key}[]`, String(item)));
|
|
278
|
-
break;
|
|
279
|
-
case 'indices':
|
|
280
|
-
value.forEach((item, i) => searchParams.append(`${key}[${i}]`, String(item)));
|
|
281
|
-
break;
|
|
282
|
-
case 'repeat':
|
|
283
|
-
value.forEach(item => searchParams.append(key, String(item)));
|
|
284
|
-
break;
|
|
285
|
-
case 'comma':
|
|
286
|
-
searchParams.append(key, value.map(String).join(','));
|
|
287
|
-
break;
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
else {
|
|
291
|
-
searchParams.append(key, String(value));
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return searchParams;
|
|
295
|
-
}
|
|
296
|
-
async request(method, path, options = {}) {
|
|
297
|
-
let url = this.baseUrl + path;
|
|
298
|
-
// Add query parameters with proper array handling
|
|
299
|
-
if (options.params && Object.keys(options.params).length > 0) {
|
|
300
|
-
const arrayFormat = this.interceptors.config.array_format || 'repeat';
|
|
301
|
-
const searchParams = this.serializeParams(options.params, arrayFormat);
|
|
302
|
-
url += '?' + searchParams.toString();
|
|
303
|
-
}
|
|
304
|
-
const timeoutMs = this.interceptors.config.timeout_ms || 60000; // Default 60s
|
|
305
|
-
const controller = new AbortController();
|
|
306
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
307
|
-
const ctx = {
|
|
308
|
-
method,
|
|
309
|
-
url,
|
|
310
|
-
headers: {
|
|
311
|
-
'Content-Type': 'application/json',
|
|
312
|
-
...options.headers,
|
|
313
|
-
},
|
|
314
|
-
body: options.body,
|
|
315
|
-
operationId: options.operationId,
|
|
316
|
-
signal: controller.signal,
|
|
317
|
-
};
|
|
318
|
-
try {
|
|
319
|
-
return await this.interceptors.execute(ctx, async () => {
|
|
320
|
-
// Why no body for GET/HEAD: HTTP spec forbids request body for these methods
|
|
321
|
-
const fetchOptions = {
|
|
322
|
-
method: ctx.method,
|
|
323
|
-
headers: ctx.headers,
|
|
324
|
-
signal: ctx.signal,
|
|
325
|
-
};
|
|
326
|
-
if (ctx.method !== 'GET' && ctx.method !== 'HEAD' && ctx.body) {
|
|
327
|
-
if (ctx.body instanceof FormData) {
|
|
328
|
-
// FormData: let fetch set Content-Type with boundary automatically
|
|
329
|
-
delete ctx.headers['Content-Type'];
|
|
330
|
-
fetchOptions.body = ctx.body;
|
|
331
|
-
}
|
|
332
|
-
else if (ctx.body instanceof Blob || ctx.body instanceof ArrayBuffer) {
|
|
333
|
-
// Binary data: keep existing Content-Type or use octet-stream
|
|
334
|
-
if (!ctx.headers['Content-Type']) {
|
|
335
|
-
ctx.headers['Content-Type'] = 'application/octet-stream';
|
|
336
|
-
}
|
|
337
|
-
fetchOptions.body = ctx.body;
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
// JSON (default)
|
|
341
|
-
fetchOptions.body = JSON.stringify(ctx.body);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
const response = await fetch(ctx.url, fetchOptions);
|
|
345
|
-
const body = response.headers.get('content-type')?.includes('application/json')
|
|
346
|
-
? await response.json()
|
|
347
|
-
: await response.text();
|
|
348
|
-
const responseContext = {
|
|
349
|
-
status: response.status,
|
|
350
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
351
|
-
body,
|
|
352
|
-
};
|
|
353
|
-
// Why throw on non-2xx: Allows caller to handle errors with try/catch
|
|
354
|
-
// Use structured errors for better client handling
|
|
355
|
-
if (response.status < HTTP_STATUS.OK || response.status >= HTTP_STATUS.MULTIPLE_CHOICES) {
|
|
356
|
-
// Extract error message from response body (common formats)
|
|
357
|
-
let errorMessage = `HTTP ${response.status}`;
|
|
358
|
-
if (typeof body === 'object' && body !== null) {
|
|
359
|
-
const errorObj = body;
|
|
360
|
-
errorMessage = (errorObj.error_description || errorObj.error || errorObj.message || errorMessage);
|
|
361
|
-
}
|
|
362
|
-
else if (typeof body === 'string' && body.length > 0) {
|
|
363
|
-
errorMessage = body;
|
|
364
|
-
}
|
|
365
|
-
// Throw specific error types based on HTTP status
|
|
366
|
-
if (response.status === HTTP_STATUS.UNAUTHORIZED) {
|
|
367
|
-
throw new AuthenticationError(errorMessage, { statusCode: response.status });
|
|
368
|
-
}
|
|
369
|
-
else if (response.status === HTTP_STATUS.FORBIDDEN) {
|
|
370
|
-
throw new AuthorizationError(errorMessage);
|
|
371
|
-
}
|
|
372
|
-
else if (response.status === HTTP_STATUS.TOO_MANY_REQUESTS) {
|
|
373
|
-
const retryAfter = response.headers.get('retry-after');
|
|
374
|
-
throw new RateLimitError(errorMessage, retryAfter ? parseInt(retryAfter, 10) : undefined);
|
|
375
|
-
}
|
|
376
|
-
else if (response.status === HTTP_STATUS.NOT_FOUND) {
|
|
377
|
-
throw new NetworkError(`Resource not found: ${errorMessage}`, response.status);
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
// Generic network error for other status codes (includes 5xx)
|
|
381
|
-
throw new NetworkError(errorMessage, response.status, { body });
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
return responseContext;
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
finally {
|
|
388
|
-
clearTimeout(timeoutId);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
//# sourceMappingURL=interceptors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interceptors.js","sourceRoot":"","sources":["../../src/interceptors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA2B3D,MAAM,OAAO,gBAAgB;IAG3B,YAAmB,MAAyB,EAAU,SAAkB;QAArD,WAAM,GAAN,MAAM,CAAmB;QAAU,cAAS,GAAT,SAAS,CAAS;QAFhE,iBAAY,GAAoB,EAAE,CAAC;QAGzC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,qBAAqB;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAK,CAAC;QAExC,kDAAkD;QAClD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACnF,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAExF,gEAAgE;QAChE,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAE/D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,kBAAkB,CAC1B,6KAA6K,CAC9K,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,kBAAkB,CAC1B,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,kBAAkB,CAAC,2CAA2C,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,mBAAmB,CAC3B,2DAA2D,UAAU,2BAA2B,CACjG,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YACnD,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBACjE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC7B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAChD,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,mGAAmG;gBACnG,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;YAC9C,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;;OAOG;IACK,0BAA0B;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAW,CAAC;QAEvC,4BAA4B;QAC5B,MAAM,iBAAiB,GAAG,MAAM,CAAC,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9E,IAAI,YAAY,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAClD,IAAI,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAElC,2DAA2D;QAC3D,MAAM,eAAe,GAAG,IAAI,GAAG,EAI3B,CAAC;QAEL,kCAAkC;QAClC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvE,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE;oBAC/B,WAAW,EAAE,QAAQ,CAAC,uBAAuB,GAAG,IAAI,CAAC,aAAa;oBAClE,MAAM,EAAE,QAAQ,CAAC,uBAAuB;oBACxC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,6DAA6D;YAC7D,IAAI,MAAM,GAAG;gBACX,WAAW,EAAE,iBAAiB;gBAC9B,MAAM,EAAE,YAAY;gBACpB,UAAU,EAAE,gBAAgB;aAC7B,CAAC;YAEF,IAAI,GAAG,CAAC,WAAW,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5D,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC;YACjD,CAAC;YAED,sCAAsC;YACtC,MAAM,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,6BAA6B;YAExF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAClF,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;YAExB,2BAA2B;YAC3B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC;gBACxD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC1D,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACrB,CAAC;YAED,6CAA6C;YAC7C,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9D,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC7B,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC;YACvC,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,sBAAsB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC;QAElC,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,SAA4B,CAAC;YAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC/D,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;oBAE9B,2CAA2C;oBAC3C,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;wBAC1F,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAChG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;wBAC7D,SAAS;oBACX,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAEtE,IAAI,OAAO,GAAG,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;wBACtC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAChG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC5D,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB,EAAE,YAA4C;QAC7E,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,KAAK,IAA8B,EAAE;YAChD,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBACtC,OAAO,YAAY,EAAE,CAAC;YACxB,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,OAAO,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,kBAAkB;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAEvC,kDAAkD;QAClD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACnF,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QAExF,2EAA2E;QAC3E,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAE/D,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,qDAAqD;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,WAAW,GAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAErD,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;QAC3D,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YACzE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAChD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,0BAA0B;YACpD,CAAC;YACD,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC;QACtD,CAAC;aAAM,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YACjE,WAAW,CAAC,WAAW,GAAG;gBACxB,GAAG,EAAE,UAAU,CAAC,WAAW;gBAC3B,KAAK,EAAE,KAAK;aACb,CAAC;QACJ,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IAIrB,YACE,OAAe,EACf,YAA8B;QAE9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACK,eAAe,CACrB,MAAyC,EACzC,MAAmD;QAEnD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,QAAQ,MAAM,EAAE,CAAC;oBACf,KAAK,UAAU;wBACb,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACrE,MAAM;oBACR,KAAK,SAAS;wBACZ,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC9E,MAAM;oBACR,KAAK,QAAQ;wBACX,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAC9D,MAAM;oBACR,KAAK,OAAO;wBACV,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;wBACtD,MAAM;gBACV,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,IAAY,EAAE,UAKxC,EAAE;QACJ,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAE9B,kDAAkD;QAClD,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC;YACtE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACvE,GAAG,IAAI,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,cAAc;QAC9E,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAElE,MAAM,GAAG,GAAmB;YAC1B,MAAM;YACN,GAAG;YACH,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO,CAAC,OAAO;aACnB;YACD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;gBACrD,6EAA6E;gBAC7E,MAAM,YAAY,GAAgB;oBAChC,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC;gBAEF,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC9D,IAAI,GAAG,CAAC,IAAI,YAAY,QAAQ,EAAE,CAAC;wBACjC,mEAAmE;wBACnE,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;wBACnC,YAAY,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;oBAC/B,CAAC;yBAAM,IAAI,GAAG,CAAC,IAAI,YAAY,IAAI,IAAI,GAAG,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;wBACvE,8DAA8D;wBAC9D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;4BACjC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,0BAA0B,CAAC;wBAC3D,CAAC;wBACD,YAAY,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACN,iBAAiB;wBACjB,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC/C,CAAC;gBACH,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBAEpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;oBAC7E,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE;oBACvB,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAE1B,MAAM,eAAe,GAAG;oBACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBACvD,IAAI;iBACL,CAAC;gBAEF,sEAAsE;gBACtE,mDAAmD;gBACnD,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;oBACxF,4DAA4D;oBAC5D,IAAI,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBAC9C,MAAM,QAAQ,GAAG,IAA+B,CAAC;wBACjD,YAAY,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAW,CAAC;oBAC9G,CAAC;yBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvD,YAAY,GAAG,IAAI,CAAC;oBACtB,CAAC;oBAED,kDAAkD;oBAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,YAAY,EAAE,CAAC;wBACjD,MAAM,IAAI,mBAAmB,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC/E,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;wBACrD,MAAM,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAC;oBAC7C,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,iBAAiB,EAAE,CAAC;wBAC7D,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBACvD,MAAM,IAAI,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;oBAC5F,CAAC;yBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;wBACrD,MAAM,IAAI,YAAY,CAAC,uBAAuB,YAAY,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACjF,CAAC;yBAAM,CAAC;wBACN,8DAA8D;wBAC9D,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;gBAED,OAAO,eAAe,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON-RPC message validation utilities
|
|
3
|
-
*
|
|
4
|
-
* Why: Eliminates code duplication between http-transport.ts and mcp-server.ts
|
|
5
|
-
* These functions validate JSON-RPC 2.0 message types used in MCP protocol.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Check if message is an initialize request
|
|
9
|
-
*/
|
|
10
|
-
export declare function isInitializeRequest(message: unknown): boolean;
|
|
11
|
-
/**
|
|
12
|
-
* Check if message is a tool call request
|
|
13
|
-
*/
|
|
14
|
-
export declare function isToolCallRequest(message: unknown): boolean;
|
|
15
|
-
/**
|
|
16
|
-
* Check if message is a tools/list request
|
|
17
|
-
*/
|
|
18
|
-
export declare function isToolsListRequest(message: unknown): boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Check if message is a valid JSON-RPC request object
|
|
21
|
-
*/
|
|
22
|
-
export declare function isJsonRpcRequest(message: unknown): boolean;
|
|
23
|
-
/**
|
|
24
|
-
* Check if message is a valid JSON-RPC response object
|
|
25
|
-
*/
|
|
26
|
-
export declare function isJsonRpcResponse(message: unknown): boolean;
|
|
27
|
-
//# sourceMappingURL=jsonrpc-validator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc-validator.d.ts","sourceRoot":"","sources":["../../src/jsonrpc-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAI5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAS1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAS3D"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON-RPC message validation utilities
|
|
3
|
-
*
|
|
4
|
-
* Why: Eliminates code duplication between http-transport.ts and mcp-server.ts
|
|
5
|
-
* These functions validate JSON-RPC 2.0 message types used in MCP protocol.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Check if message is an initialize request
|
|
9
|
-
*/
|
|
10
|
-
export function isInitializeRequest(message) {
|
|
11
|
-
if (typeof message !== 'object' || message === null)
|
|
12
|
-
return false;
|
|
13
|
-
const req = message;
|
|
14
|
-
return req.method === 'initialize';
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Check if message is a tool call request
|
|
18
|
-
*/
|
|
19
|
-
export function isToolCallRequest(message) {
|
|
20
|
-
if (typeof message !== 'object' || message === null)
|
|
21
|
-
return false;
|
|
22
|
-
const req = message;
|
|
23
|
-
return req.method === 'tools/call';
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Check if message is a tools/list request
|
|
27
|
-
*/
|
|
28
|
-
export function isToolsListRequest(message) {
|
|
29
|
-
if (typeof message !== 'object' || message === null)
|
|
30
|
-
return false;
|
|
31
|
-
const req = message;
|
|
32
|
-
return req.method === 'tools/list';
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Check if message is a valid JSON-RPC request object
|
|
36
|
-
*/
|
|
37
|
-
export function isJsonRpcRequest(message) {
|
|
38
|
-
if (typeof message !== 'object' || message === null)
|
|
39
|
-
return false;
|
|
40
|
-
const req = message;
|
|
41
|
-
return (typeof req.jsonrpc === 'string' &&
|
|
42
|
-
req.jsonrpc === '2.0' &&
|
|
43
|
-
typeof req.method === 'string' &&
|
|
44
|
-
'id' in req);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Check if message is a valid JSON-RPC response object
|
|
48
|
-
*/
|
|
49
|
-
export function isJsonRpcResponse(message) {
|
|
50
|
-
if (typeof message !== 'object' || message === null)
|
|
51
|
-
return false;
|
|
52
|
-
const resp = message;
|
|
53
|
-
return (typeof resp.jsonrpc === 'string' &&
|
|
54
|
-
resp.jsonrpc === '2.0' &&
|
|
55
|
-
'id' in resp &&
|
|
56
|
-
('result' in resp || 'error' in resp));
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=jsonrpc-validator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc-validator.js","sourceRoot":"","sources":["../../src/jsonrpc-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,OAAO,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,OAAO,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,OAAO,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,OAAO,CACL,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,GAAG,CAAC,OAAO,KAAK,KAAK;QACrB,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,IAAI,IAAI,GAAG,CACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,IAAI,GAAG,OAAkC,CAAC;IAChD,OAAO,CACL,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;QAChC,IAAI,CAAC,OAAO,KAAK,KAAK;QACtB,IAAI,IAAI,IAAI;QACZ,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,CACtC,CAAC;AACJ,CAAC"}
|
package/dist/src/logger.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger interfaces and implementations
|
|
3
|
-
*
|
|
4
|
-
* Why: Replaces console.error with structured, level-based logging.
|
|
5
|
-
* Enables production-ready logging with context and proper error handling.
|
|
6
|
-
*
|
|
7
|
-
* Security: Profile-aware token redaction prevents sensitive data leakage.
|
|
8
|
-
*/
|
|
9
|
-
import type { AuthInterceptor } from './types/profile.js';
|
|
10
|
-
/**
|
|
11
|
-
* Sanitize log message to prevent log injection
|
|
12
|
-
* Replaces newlines with escaped string representation
|
|
13
|
-
*/
|
|
14
|
-
export declare function sanitizeLogMessage(message: string): string;
|
|
15
|
-
export declare enum LogLevel {
|
|
16
|
-
DEBUG = 0,
|
|
17
|
-
INFO = 1,
|
|
18
|
-
WARN = 2,
|
|
19
|
-
ERROR = 3,
|
|
20
|
-
SILENT = 4
|
|
21
|
-
}
|
|
22
|
-
export interface Logger {
|
|
23
|
-
debug(message: string, context?: Record<string, unknown>): void;
|
|
24
|
-
info(message: string, context?: Record<string, unknown>): void;
|
|
25
|
-
warn(message: string, context?: Record<string, unknown>): void;
|
|
26
|
-
error(message: string, error?: Error, context?: Record<string, unknown>): void;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Default logger - writes to stderr, respects MCP4_LOG_LEVEL env var
|
|
30
|
-
*
|
|
31
|
-
* Security: Redacts auth tokens based on profile configuration
|
|
32
|
-
*/
|
|
33
|
-
export declare class ConsoleLogger implements Logger {
|
|
34
|
-
private level;
|
|
35
|
-
private authConfig?;
|
|
36
|
-
constructor(level?: LogLevel, authConfig?: AuthInterceptor);
|
|
37
|
-
debug(message: string, context?: Record<string, unknown>): void;
|
|
38
|
-
info(message: string, context?: Record<string, unknown>): void;
|
|
39
|
-
warn(message: string, context?: Record<string, unknown>): void;
|
|
40
|
-
error(message: string, error?: Error, context?: Record<string, unknown>): void;
|
|
41
|
-
private write;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Structured JSON logger for production
|
|
45
|
-
*
|
|
46
|
-
* Why: Machine-readable logs for log aggregation systems (ELK, Splunk, etc.)
|
|
47
|
-
* Security: Redacts auth tokens based on profile configuration
|
|
48
|
-
*/
|
|
49
|
-
export declare class JsonLogger implements Logger {
|
|
50
|
-
private level;
|
|
51
|
-
private authConfig?;
|
|
52
|
-
constructor(level?: LogLevel, authConfig?: AuthInterceptor);
|
|
53
|
-
debug(message: string, context?: Record<string, unknown>): void;
|
|
54
|
-
info(message: string, context?: Record<string, unknown>): void;
|
|
55
|
-
warn(message: string, context?: Record<string, unknown>): void;
|
|
56
|
-
error(message: string, error?: Error, context?: Record<string, unknown>): void;
|
|
57
|
-
private write;
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=logger.d.ts.map
|
package/dist/src/logger.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA8C1D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAwCD,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,MAAM,IAAI;CACX;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAChF;AAED;;;;GAIG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,UAAU,CAAC,CAAkB;gBAEzB,KAAK,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,eAAe;IAK1D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAW9E,OAAO,CAAC,KAAK;CAOd;AAED;;;;;GAKG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,UAAU,CAAC,CAAkB;gBAEzB,KAAK,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,eAAe;IAK1D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAM9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU9E,OAAO,CAAC,KAAK;CAUd"}
|