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.
- package/LICENSE.md +21 -0
- package/README.md +319 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +123 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +38 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +537 -0
- package/dist/prompts.js.map +1 -0
- package/dist/server.d.ts +38 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +305 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +43 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +249 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth.d.ts +6 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +173 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/http-client.d.ts +17 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +233 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/openapi-parser.d.ts +6 -0
- package/dist/utils/openapi-parser.d.ts.map +1 -0
- package/dist/utils/openapi-parser.js +398 -0
- package/dist/utils/openapi-parser.js.map +1 -0
- package/package.json +62 -0
- package/specs/.env +20 -0
- package/specs/cars.swagger.json +105 -0
- package/specs/github.yaml +164 -0
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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":";;;;;;AAAA,kDAAiE;AACjE,4CAAoB;AACpB,gDAAwB;AAExB,iCAA6C;AAE7C,MAAa,UAAU;IACrB,KAAK,CAAC,cAAc,CAClB,OAA6B,EAC7B,IAAyB;QAEzB,IAAI,aAAa,GAA8B,IAAI,CAAC;QACpD,IAAI,CAAC;YACH,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC,aAAa,CAAC,CAAC;YAE5C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAEhC,OAAO;gBACL,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;gBAC/C,WAAW,EAAE,aAAa,CAAC,IAAI,IAAI,IAAI;gBACvC,QAAQ,EAAE;oBACR,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI;iBAC5B;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO;oBACL,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;oBACpE,WAAW,EAAE,aAAa,EAAE,IAAI,IAAI,IAAI;oBACxC,QAAQ,EAAE;wBACR,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,SAAS;wBAC3C,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI;qBACnC;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;gBACpE,WAAW,EAAE,aAAa,EAAE,IAAI,IAAI,IAAI;gBACxC,QAAQ,EAAE;oBACR,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE;wBACJ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC9D;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,kBAAkB,CACxB,OAA6B,EAC7B,IAAyB;QAEzB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAErC,iCAAiC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEtC,gBAAgB;QAChB,IAAI,OAAO,GAA2B;YACpC,YAAY,EAAE,eAAe;YAC7B,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,uBAAuB;QACvB,OAAO,GAAG,IAAA,0BAAmB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEnD,wBAAwB;QACxB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE9C,yBAAyB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAErD,qBAAqB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC/C,CAAC;QAED,MAAM,MAAM,GAAuB;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAS;YACxC,GAAG;YACH,OAAO;YACP,OAAO,EAAE,KAAK,EAAE,oBAAoB;SACrC,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,QAAQ,CAAC,IAAmB,EAAE,IAAyB;QAC7D,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAEtD,0BAA0B;QAC1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1D,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,IAAI,KAAK,CAAC,IAAI,GAAG,EACjB,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,mBAAmB,CACzB,IAAmB,EACnB,IAAyB,EACzB,OAA+B;QAE/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC5D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,oBAAoB,CAC1B,IAAmB,EACnB,IAAyB;QAEzB,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CACtB,IAAmB,EACnB,IAAyB;QAEzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;YACvE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;YACnB,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QAED,gEAAgE;QAChE,MAAM,QAAQ,GAAwB,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,CAAC;IAEO,eAAe,CAAC,MAA0B;QAChD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAAE,OAAO;QAEvC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CACpC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAA2B,CACjD,CAAC;QAEF,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;YACjD,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAEO,gBAAgB,CAAC,QAAuB;QAC9C,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAAE,OAAO;QAEvC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAiC,CAAC;YACvE,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEO,aAAa,CAAC,KAAU;QAC9B,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAAE,OAAO;QAEvC,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM;YAC9B,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU;YACtC,OAAO,EAAE,IAAI,CAAC,aAAa,CACzB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAA2B,CAC1D;YACD,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI;SAC3B,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAEO,kBAAkB;QACxB,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC;IAC9D,CAAC;IAEO,aAAa,CACnB,OAA+B;QAE/B,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAElD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC3C,QAAQ,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,cAAc,CAAC,OAAe;QACpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YAC1D,YAAE,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,MAA0B;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAA4B,CAAC;QAChE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAC1C,SAAS;gBACX,CAAC;gBAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;wBAC1B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjD,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;oBACvD,SAAS;gBACX,CAAC;gBAED,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,CAAC;YAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAnSD,gCAmSC"}
|
|
@@ -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"}
|