specrun 1.0.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.
@@ -0,0 +1,60 @@
1
+ export interface ServerConfig {
2
+ specsPath: string;
3
+ port?: number;
4
+ transportType?: "stdio" | "httpStream";
5
+ }
6
+ export interface AuthConfig {
7
+ [apiName: string]: {
8
+ type: "bearer" | "apiKey" | "basic";
9
+ token?: string;
10
+ username?: string;
11
+ password?: string;
12
+ headerName?: string;
13
+ };
14
+ }
15
+ export interface ParsedSpec {
16
+ apiName: string;
17
+ filePath: string;
18
+ spec: any;
19
+ tools: GeneratedTool[];
20
+ }
21
+ export interface GeneratedTool {
22
+ name: string;
23
+ description: string;
24
+ operationId?: string;
25
+ method: string;
26
+ path: string;
27
+ parameters: ToolParameter[];
28
+ requestBody?: any;
29
+ responses: any;
30
+ security?: any[];
31
+ baseUrl: string;
32
+ }
33
+ export interface ToolParameter {
34
+ name: string;
35
+ in: "path" | "query" | "header" | "cookie" | "body";
36
+ required: boolean;
37
+ schema: any;
38
+ description?: string;
39
+ }
40
+ export interface ToolExecutionContext {
41
+ apiName: string;
42
+ tool: GeneratedTool;
43
+ authConfig?: AuthConfig[string];
44
+ }
45
+ export interface ApiCallResult {
46
+ requestUrl: string;
47
+ requestBody: any | null;
48
+ response: {
49
+ status?: number | string;
50
+ body: any | null;
51
+ };
52
+ }
53
+ export interface RequestConfig {
54
+ url: string;
55
+ method: string;
56
+ headers: Record<string, string>;
57
+ params?: Record<string, any>;
58
+ data?: any;
59
+ }
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,OAAO,EAAE,MAAM,GAAG;QACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;QACpC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,SAAS,EAAE,GAAG,CAAC;IACf,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Using any types for OpenAPI to avoid dependency issues
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,yDAAyD"}
@@ -0,0 +1,6 @@
1
+ import { AuthConfig } from "../types";
2
+ export declare function ensureEnvKeysForSpecs(specsPath: string, specFiles: string[]): void;
3
+ export declare function loadAuthConfig(specsPath: string): AuthConfig;
4
+ export declare function applyAuthentication(headers: Record<string, string>, authConfig?: AuthConfig[string]): Record<string, string>;
5
+ export declare function getApiNameFromFile(filePath: string): string;
6
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAkCtC,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CA+CN;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAoE5D;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BxB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW3D"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureEnvKeysForSpecs = ensureEnvKeysForSpecs;
7
+ exports.loadAuthConfig = loadAuthConfig;
8
+ exports.applyAuthentication = applyAuthentication;
9
+ exports.getApiNameFromFile = getApiNameFromFile;
10
+ const dotenv_1 = require("dotenv");
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const ENV_PLACEHOLDER_COMMENT = "# SpecRun placeholders";
14
+ function getEnvPlaceholderValue(key) {
15
+ if (key.endsWith("_SERVER_URL")) {
16
+ return "";
17
+ }
18
+ if (key.endsWith("_BEARER_TOKEN")) {
19
+ return "";
20
+ }
21
+ return "";
22
+ }
23
+ function parseEnvKeys(envContent) {
24
+ const keys = new Set();
25
+ for (const line of envContent.split(/\r?\n/)) {
26
+ const trimmed = line.trim();
27
+ if (!trimmed || trimmed.startsWith("#")) {
28
+ continue;
29
+ }
30
+ const match = trimmed.match(/^([A-Z0-9_]+)\s*=/);
31
+ if (match) {
32
+ keys.add(match[1]);
33
+ }
34
+ }
35
+ return keys;
36
+ }
37
+ function ensureEnvKeysForSpecs(specsPath, specFiles) {
38
+ const envPath = path_1.default.join(specsPath, ".env");
39
+ const envContent = fs_1.default.existsSync(envPath)
40
+ ? fs_1.default.readFileSync(envPath, "utf8")
41
+ : "";
42
+ const existingKeys = parseEnvKeys(envContent);
43
+ const missingKeys = [];
44
+ for (const specFile of specFiles) {
45
+ const apiName = getApiNameFromFile(specFile);
46
+ if (!apiName) {
47
+ continue;
48
+ }
49
+ const envPrefix = apiName.toUpperCase();
50
+ const serverKey = `${envPrefix}_SERVER_URL`;
51
+ const bearerKey = `${envPrefix}_BEARER_TOKEN`;
52
+ if (!existingKeys.has(serverKey)) {
53
+ missingKeys.push(serverKey);
54
+ }
55
+ if (!existingKeys.has(bearerKey)) {
56
+ missingKeys.push(bearerKey);
57
+ }
58
+ }
59
+ if (missingKeys.length === 0) {
60
+ return;
61
+ }
62
+ const additions = [];
63
+ if (!envContent.includes(ENV_PLACEHOLDER_COMMENT)) {
64
+ additions.push(ENV_PLACEHOLDER_COMMENT);
65
+ }
66
+ for (const key of missingKeys) {
67
+ const value = getEnvPlaceholderValue(key);
68
+ additions.push(`${key}=${value}`);
69
+ }
70
+ const needsNewline = envContent.length > 0 && !envContent.endsWith("\n");
71
+ const prefix = envContent.length > 0 ? (needsNewline ? "\n" : "") : "";
72
+ const updatedContent = `${envContent}${prefix}${additions.join("\n")}\n`;
73
+ fs_1.default.writeFileSync(envPath, updatedContent, "utf8");
74
+ }
75
+ function loadAuthConfig(specsPath) {
76
+ // Load .env file from specs directory
77
+ const envPath = path_1.default.join(specsPath, ".env");
78
+ if (fs_1.default.existsSync(envPath)) {
79
+ // Ensure dotenv stays quiet to avoid breaking MCP stdio.
80
+ process.env.DOTENV_CONFIG_QUIET = "true";
81
+ (0, dotenv_1.config)({ path: envPath, override: true, debug: false });
82
+ }
83
+ const authConfig = {};
84
+ // Parse environment variables with naming convention {API_NAME}_API_KEY, etc.
85
+ for (const [key, value] of Object.entries(process.env)) {
86
+ if (!value)
87
+ continue;
88
+ // Match patterns like CARS_API_KEY, GITHUB_TOKEN, etc.
89
+ const apiKeyMatch = key.match(/^(.+)_API_KEY$/);
90
+ const tokenMatch = key.match(/^(.+)_TOKEN$/);
91
+ const bearerMatch = key.match(/^(.+)_BEARER_TOKEN$/);
92
+ const basicUserMatch = key.match(/^(.+)_USERNAME$/);
93
+ const basicPassMatch = key.match(/^(.+)_PASSWORD$/);
94
+ let apiName;
95
+ let authType;
96
+ let configKey;
97
+ if (apiKeyMatch) {
98
+ apiName = apiKeyMatch[1].toLowerCase();
99
+ authType = "apiKey";
100
+ configKey = "token";
101
+ }
102
+ else if (bearerMatch) {
103
+ apiName = bearerMatch[1].toLowerCase();
104
+ authType = "bearer";
105
+ configKey = "token";
106
+ }
107
+ else if (tokenMatch && !key.includes("BEARER")) {
108
+ apiName = tokenMatch[1].toLowerCase();
109
+ authType = "bearer";
110
+ configKey = "token";
111
+ }
112
+ else if (basicUserMatch) {
113
+ apiName = basicUserMatch[1].toLowerCase();
114
+ authType = "basic";
115
+ configKey = "username";
116
+ }
117
+ else if (basicPassMatch) {
118
+ apiName = basicPassMatch[1].toLowerCase();
119
+ authType = "basic";
120
+ configKey = "password";
121
+ }
122
+ if (apiName && authType && configKey) {
123
+ if (!authConfig[apiName]) {
124
+ authConfig[apiName] = { type: authType };
125
+ }
126
+ // Override type if more specific auth found
127
+ if (authType === "bearer" && authConfig[apiName].type !== "bearer") {
128
+ authConfig[apiName].type = authType;
129
+ }
130
+ authConfig[apiName][configKey] = value;
131
+ // Set default header name for API keys
132
+ if (authType === "apiKey" && !authConfig[apiName].headerName) {
133
+ authConfig[apiName].headerName = "X-API-Key";
134
+ }
135
+ }
136
+ }
137
+ return authConfig;
138
+ }
139
+ function applyAuthentication(headers, authConfig) {
140
+ if (!authConfig)
141
+ return headers;
142
+ const result = { ...headers };
143
+ switch (authConfig.type) {
144
+ case "bearer":
145
+ if (authConfig.token) {
146
+ result.Authorization = `Bearer ${authConfig.token}`;
147
+ }
148
+ break;
149
+ case "apiKey":
150
+ if (authConfig.token && authConfig.headerName) {
151
+ result[authConfig.headerName] = authConfig.token;
152
+ }
153
+ break;
154
+ case "basic":
155
+ if (authConfig.username && authConfig.password) {
156
+ const credentials = Buffer.from(`${authConfig.username}:${authConfig.password}`).toString("base64");
157
+ result.Authorization = `Basic ${credentials}`;
158
+ }
159
+ break;
160
+ }
161
+ return result;
162
+ }
163
+ function getApiNameFromFile(filePath) {
164
+ let fileName = path_1.default.basename(filePath, path_1.default.extname(filePath));
165
+ // Trim common OpenAPI/Swagger suffixes from base name.
166
+ fileName = fileName.replace(/([._-])(swagger|openapi)$/i, "");
167
+ // Normalize by replacing non-alphanumeric characters with underscores.
168
+ return fileName
169
+ .toLowerCase()
170
+ .replace(/[^a-z0-9]+/g, "_")
171
+ .replace(/^_+|_+$/g, "");
172
+ }
173
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ApiCallResult, ToolExecutionContext } from "../types";
2
+ export declare class HttpClient {
3
+ executeRequest(context: ToolExecutionContext, args: Record<string, any>): Promise<ApiCallResult>;
4
+ private buildRequestConfig;
5
+ private buildUrl;
6
+ private addHeaderParameters;
7
+ private buildQueryParameters;
8
+ private buildRequestBody;
9
+ private debugLogRequest;
10
+ private debugLogResponse;
11
+ private debugLogError;
12
+ private isHttpDebugEnabled;
13
+ private redactHeaders;
14
+ private appendDebugLog;
15
+ private buildRequestUrl;
16
+ }
17
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAiB,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG9E,qBAAa,UAAU;IACf,cAAc,CAClB,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACxB,OAAO,CAAC,aAAa,CAAC;IA2CzB,OAAO,CAAC,kBAAkB;IAgD1B,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,gBAAgB;IA2CxB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,eAAe;CAkCxB"}
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const auth_1 = require("./auth");
11
+ class HttpClient {
12
+ async executeRequest(context, args) {
13
+ let requestConfig = null;
14
+ try {
15
+ requestConfig = this.buildRequestConfig(context, args);
16
+ this.debugLogRequest(requestConfig);
17
+ const response = await (0, axios_1.default)(requestConfig);
18
+ this.debugLogResponse(response);
19
+ return {
20
+ requestUrl: this.buildRequestUrl(requestConfig),
21
+ requestBody: requestConfig.data ?? null,
22
+ response: {
23
+ status: response.status,
24
+ body: response.data ?? null,
25
+ },
26
+ };
27
+ }
28
+ catch (error) {
29
+ if (axios_1.default.isAxiosError(error)) {
30
+ this.debugLogError(error);
31
+ return {
32
+ requestUrl: requestConfig ? this.buildRequestUrl(requestConfig) : "",
33
+ requestBody: requestConfig?.data ?? null,
34
+ response: {
35
+ status: error.response?.status ?? "Unknown",
36
+ body: error.response?.data ?? null,
37
+ },
38
+ };
39
+ }
40
+ return {
41
+ requestUrl: requestConfig ? this.buildRequestUrl(requestConfig) : "",
42
+ requestBody: requestConfig?.data ?? null,
43
+ response: {
44
+ status: "Error",
45
+ body: {
46
+ error: error instanceof Error ? error.message : String(error),
47
+ },
48
+ },
49
+ };
50
+ }
51
+ }
52
+ buildRequestConfig(context, args) {
53
+ const { tool, authConfig } = context;
54
+ // Build URL with path parameters
55
+ const url = this.buildUrl(tool, args);
56
+ // Build headers
57
+ let headers = {
58
+ "User-Agent": "specrun/1.0.0",
59
+ Accept: "application/json",
60
+ };
61
+ // Apply authentication
62
+ headers = (0, auth_1.applyAuthentication)(headers, authConfig);
63
+ // Add header parameters
64
+ this.addHeaderParameters(tool, args, headers);
65
+ // Build query parameters
66
+ const params = this.buildQueryParameters(tool, args);
67
+ // Build request body
68
+ const data = this.buildRequestBody(tool, args);
69
+ if (data !== null && !headers["Content-Type"]) {
70
+ headers["Content-Type"] = "application/json";
71
+ }
72
+ const config = {
73
+ method: tool.method.toLowerCase(),
74
+ url,
75
+ headers,
76
+ timeout: 30000, // 30 second timeout
77
+ };
78
+ if (Object.keys(params).length > 0) {
79
+ config.params = params;
80
+ }
81
+ if (data !== null) {
82
+ config.data = data;
83
+ }
84
+ return config;
85
+ }
86
+ buildUrl(tool, args) {
87
+ let url = tool.baseUrl.replace(/\/$/, "") + tool.path;
88
+ // Replace path parameters
89
+ for (const param of tool.parameters) {
90
+ if (param.in === "path" && args[param.name] !== undefined) {
91
+ url = url.replace(`{${param.name}}`, encodeURIComponent(String(args[param.name])));
92
+ }
93
+ }
94
+ return url;
95
+ }
96
+ addHeaderParameters(tool, args, headers) {
97
+ for (const param of tool.parameters) {
98
+ if (param.in === "header" && args[param.name] !== undefined) {
99
+ headers[param.name] = String(args[param.name]);
100
+ }
101
+ }
102
+ }
103
+ buildQueryParameters(tool, args) {
104
+ const params = {};
105
+ for (const param of tool.parameters) {
106
+ if (param.in === "query" && args[param.name] !== undefined) {
107
+ params[param.name] = args[param.name];
108
+ }
109
+ }
110
+ return params;
111
+ }
112
+ buildRequestBody(tool, args) {
113
+ if (!tool.requestBody) {
114
+ const bodyParam = tool.parameters.find((param) => param.in === "body");
115
+ if (!bodyParam) {
116
+ return null;
117
+ }
118
+ if (args[bodyParam.name] !== undefined) {
119
+ return args[bodyParam.name];
120
+ }
121
+ if (args.body !== undefined) {
122
+ return args.body;
123
+ }
124
+ return null;
125
+ }
126
+ // Look for 'body' or 'requestBody' in args
127
+ if (args.body !== undefined) {
128
+ return args.body;
129
+ }
130
+ if (args.requestBody !== undefined) {
131
+ return args.requestBody;
132
+ }
133
+ // If no explicit body parameter, collect all non-parameter args
134
+ const bodyArgs = {};
135
+ const paramNames = new Set(tool.parameters.map((p) => p.name));
136
+ for (const [key, value] of Object.entries(args)) {
137
+ if (!paramNames.has(key)) {
138
+ bodyArgs[key] = value;
139
+ }
140
+ }
141
+ return Object.keys(bodyArgs).length > 0 ? bodyArgs : null;
142
+ }
143
+ debugLogRequest(config) {
144
+ if (!this.isHttpDebugEnabled())
145
+ return;
146
+ const safeHeaders = this.redactHeaders((config.headers || {}));
147
+ const payload = {
148
+ method: String(config.method || "").toUpperCase(),
149
+ url: config.url,
150
+ headers: safeHeaders,
151
+ params: config.params,
152
+ data: config.data,
153
+ };
154
+ this.appendDebugLog(`HTTP Request: ${JSON.stringify(payload, null, 2)}`);
155
+ }
156
+ debugLogResponse(response) {
157
+ if (!this.isHttpDebugEnabled())
158
+ return;
159
+ const payload = {
160
+ status: response.status,
161
+ statusText: response.statusText,
162
+ headers: this.redactHeaders(response.headers),
163
+ data: response.data,
164
+ };
165
+ this.appendDebugLog(`HTTP Response: ${JSON.stringify(payload, null, 2)}`);
166
+ }
167
+ debugLogError(error) {
168
+ if (!this.isHttpDebugEnabled())
169
+ return;
170
+ const payload = {
171
+ message: error.message,
172
+ status: error.response?.status,
173
+ statusText: error.response?.statusText,
174
+ headers: this.redactHeaders((error.response?.headers || {})),
175
+ data: error.response?.data,
176
+ };
177
+ this.appendDebugLog(`HTTP Error: ${JSON.stringify(payload, null, 2)}`);
178
+ }
179
+ isHttpDebugEnabled() {
180
+ const raw = process.env.SPECRUN_HTTP_DEBUG || process.env.SPECRUN_DEBUG_HTTP || "";
181
+ const value = String(raw).toLowerCase();
182
+ return value === "1" || value === "true" || value === "yes";
183
+ }
184
+ redactHeaders(headers) {
185
+ const redacted = { ...headers };
186
+ const redactKeys = ["authorization", "x-api-key"];
187
+ for (const key of Object.keys(redacted)) {
188
+ if (redactKeys.includes(key.toLowerCase())) {
189
+ redacted[key] = "[redacted]";
190
+ }
191
+ }
192
+ return redacted;
193
+ }
194
+ appendDebugLog(message) {
195
+ try {
196
+ const debugPath = path_1.default.join(__dirname, "../../debug.log");
197
+ fs_1.default.appendFileSync(debugPath, `${new Date().toISOString()}: ${message}\n`);
198
+ }
199
+ catch (e) { }
200
+ }
201
+ buildRequestUrl(config) {
202
+ const baseUrl = config.url || "";
203
+ const params = (config.params || {});
204
+ if (!baseUrl || Object.keys(params).length === 0) {
205
+ return baseUrl;
206
+ }
207
+ try {
208
+ const parsed = new URL(baseUrl);
209
+ for (const [key, value] of Object.entries(params)) {
210
+ if (value === undefined || value === null) {
211
+ continue;
212
+ }
213
+ if (Array.isArray(value)) {
214
+ for (const entry of value) {
215
+ parsed.searchParams.append(key, String(entry));
216
+ }
217
+ continue;
218
+ }
219
+ if (typeof value === "object") {
220
+ parsed.searchParams.append(key, JSON.stringify(value));
221
+ continue;
222
+ }
223
+ parsed.searchParams.append(key, String(value));
224
+ }
225
+ return parsed.toString();
226
+ }
227
+ catch {
228
+ return baseUrl;
229
+ }
230
+ }
231
+ }
232
+ exports.HttpClient = HttpClient;
233
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { ParsedSpec } from "../types";
2
+ export declare function parseOpenApiSpec(filePath: string): Promise<ParsedSpec | null>;
3
+ export declare function updateSpecServerUrls(specFiles: string[], env: NodeJS.ProcessEnv): void;
4
+ export declare function resolveServerUrl(apiName: string, env: NodeJS.ProcessEnv): string | null;
5
+ export declare function isOpenAPIFile(filePath: string): boolean;
6
+ //# sourceMappingURL=openapi-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-parser.d.ts","sourceRoot":"","sources":["../../src/utils/openapi-parser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAgC,MAAM,UAAU,CAAC;AAKpE,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA4B5B;AA0TD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,EACnB,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,IAAI,CAwBN;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,UAAU,GACrB,MAAM,GAAG,IAAI,CASf;AAmFD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuBvD"}