cursortoys 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateAssertions = validateAssertions;
4
+ exports.formatAssertionResults = formatAssertionResults;
5
+ /**
6
+ * Validates assertions against HTTP response
7
+ * @param assertions Array of assertions to validate
8
+ * @param response HTTP response result
9
+ * @returns Array of assertion results
10
+ */
11
+ function validateAssertions(assertions, response, headers) {
12
+ const results = [];
13
+ // Build response data structure
14
+ const responseData = {
15
+ status: response.statusCode,
16
+ headers: headers || {},
17
+ body: parseResponseBody(response.body),
18
+ };
19
+ for (const assertion of assertions) {
20
+ try {
21
+ const result = evaluateAssertion(assertion, responseData);
22
+ results.push(result);
23
+ }
24
+ catch (error) {
25
+ results.push({
26
+ assertion,
27
+ passed: false,
28
+ error: error instanceof Error ? error.message : String(error),
29
+ });
30
+ }
31
+ }
32
+ return results;
33
+ }
34
+ /**
35
+ * Parses response body to JSON if possible, otherwise returns raw string
36
+ * @param body Response body string
37
+ * @returns Parsed JSON object or raw string
38
+ */
39
+ function parseResponseBody(body) {
40
+ if (!body || body.trim() === '') {
41
+ return null;
42
+ }
43
+ try {
44
+ return JSON.parse(body);
45
+ }
46
+ catch {
47
+ return body;
48
+ }
49
+ }
50
+ /**
51
+ * Evaluates a single assertion
52
+ * @param assertion The assertion to evaluate
53
+ * @param responseData Response data
54
+ * @returns Assertion result
55
+ */
56
+ function evaluateAssertion(assertion, responseData) {
57
+ // Resolve the expression to get actual value
58
+ const actualValue = resolveExpression(assertion.expression, responseData);
59
+ // Evaluate based on operator
60
+ const passed = evaluateOperator(assertion.operator, actualValue, assertion.expected);
61
+ return {
62
+ assertion,
63
+ passed,
64
+ actualValue,
65
+ };
66
+ }
67
+ /**
68
+ * Resolves an expression like "res.status" or "res.body.userId" to its actual value
69
+ * @param expression Expression to resolve
70
+ * @param responseData Response data
71
+ * @returns Resolved value
72
+ */
73
+ function resolveExpression(expression, responseData) {
74
+ // Split expression by dots, but handle bracket notation too
75
+ // e.g., "res.body.users[0].name" -> ["res", "body", "users[0]", "name"]
76
+ const parts = expression.split('.');
77
+ let current = { res: responseData };
78
+ for (const part of parts) {
79
+ if (current === null || current === undefined) {
80
+ return undefined;
81
+ }
82
+ // Handle array indexing: "users[0]" -> access users then [0]
83
+ const arrayMatch = part.match(/^([^\[]+)\[(\d+)\]$/);
84
+ if (arrayMatch) {
85
+ const propName = arrayMatch[1];
86
+ const index = parseInt(arrayMatch[2], 10);
87
+ current = current[propName];
88
+ if (Array.isArray(current)) {
89
+ current = current[index];
90
+ }
91
+ else {
92
+ return undefined;
93
+ }
94
+ }
95
+ else {
96
+ current = current[part];
97
+ }
98
+ }
99
+ return current;
100
+ }
101
+ /**
102
+ * Evaluates operator against actual and expected values
103
+ * @param operator Assertion operator
104
+ * @param actual Actual value from response
105
+ * @param expected Expected value
106
+ * @returns true if assertion passes, false otherwise
107
+ */
108
+ function evaluateOperator(operator, actual, expected) {
109
+ switch (operator) {
110
+ // Comparison
111
+ case 'equals':
112
+ return actual === expected;
113
+ case 'notEquals':
114
+ return actual !== expected;
115
+ case 'gt':
116
+ return typeof actual === 'number' && typeof expected === 'number' && actual > expected;
117
+ case 'gte':
118
+ return typeof actual === 'number' && typeof expected === 'number' && actual >= expected;
119
+ case 'lt':
120
+ return typeof actual === 'number' && typeof expected === 'number' && actual < expected;
121
+ case 'lte':
122
+ return typeof actual === 'number' && typeof expected === 'number' && actual <= expected;
123
+ // String operations
124
+ case 'contains':
125
+ return typeof actual === 'string' && typeof expected === 'string' && actual.includes(expected);
126
+ case 'notContains':
127
+ return typeof actual === 'string' && typeof expected === 'string' && !actual.includes(expected);
128
+ case 'startsWith':
129
+ return typeof actual === 'string' && typeof expected === 'string' && actual.startsWith(expected);
130
+ case 'endsWith':
131
+ return typeof actual === 'string' && typeof expected === 'string' && actual.endsWith(expected);
132
+ case 'matches':
133
+ if (expected instanceof RegExp) {
134
+ return typeof actual === 'string' && expected.test(actual);
135
+ }
136
+ return false;
137
+ case 'notMatches':
138
+ if (expected instanceof RegExp) {
139
+ return typeof actual === 'string' && !expected.test(actual);
140
+ }
141
+ return false;
142
+ // Type checks
143
+ case 'isNull':
144
+ return actual === null;
145
+ case 'isNotNull':
146
+ return actual !== null;
147
+ case 'isEmpty':
148
+ if (typeof actual === 'string')
149
+ return actual === '';
150
+ if (Array.isArray(actual))
151
+ return actual.length === 0;
152
+ if (typeof actual === 'object' && actual !== null)
153
+ return Object.keys(actual).length === 0;
154
+ return false;
155
+ case 'isNotEmpty':
156
+ if (typeof actual === 'string')
157
+ return actual !== '';
158
+ if (Array.isArray(actual))
159
+ return actual.length > 0;
160
+ if (typeof actual === 'object' && actual !== null)
161
+ return Object.keys(actual).length > 0;
162
+ return false;
163
+ case 'isDefined':
164
+ return actual !== undefined && actual !== null;
165
+ case 'isUndefined':
166
+ return actual === undefined || actual === null;
167
+ // Value checks
168
+ case 'isTruthy':
169
+ return !!actual;
170
+ case 'isFalsy':
171
+ return !actual;
172
+ case 'isNumber':
173
+ return typeof actual === 'number' && !isNaN(actual);
174
+ case 'isString':
175
+ return typeof actual === 'string';
176
+ case 'isBoolean':
177
+ return typeof actual === 'boolean';
178
+ case 'isArray':
179
+ return Array.isArray(actual);
180
+ case 'isJson':
181
+ if (typeof actual === 'string') {
182
+ try {
183
+ JSON.parse(actual);
184
+ return true;
185
+ }
186
+ catch {
187
+ return false;
188
+ }
189
+ }
190
+ return typeof actual === 'object' && actual !== null;
191
+ // Other operations
192
+ case 'in':
193
+ if (Array.isArray(expected)) {
194
+ return expected.includes(actual);
195
+ }
196
+ return false;
197
+ case 'notIn':
198
+ if (Array.isArray(expected)) {
199
+ return !expected.includes(actual);
200
+ }
201
+ return false;
202
+ case 'between':
203
+ // Expected should be array with [min, max]
204
+ if (Array.isArray(expected) && expected.length === 2 && typeof actual === 'number') {
205
+ const [min, max] = expected;
206
+ return actual >= min && actual <= max;
207
+ }
208
+ return false;
209
+ case 'length':
210
+ if (typeof actual === 'string' || Array.isArray(actual)) {
211
+ return actual.length === expected;
212
+ }
213
+ return false;
214
+ default:
215
+ throw new Error(`Unknown operator: ${operator}`);
216
+ }
217
+ }
218
+ /**
219
+ * Formats assertion results as text for display
220
+ * @param results Assertion results
221
+ * @returns Formatted text
222
+ */
223
+ function formatAssertionResults(results) {
224
+ if (results.length === 0) {
225
+ return '';
226
+ }
227
+ let output = '';
228
+ for (const result of results) {
229
+ const symbol = result.passed ? '✓' : '✗';
230
+ const { expression, operator, expected } = result.assertion;
231
+ let line = ` ${symbol} ${expression} ${operator}`;
232
+ // Add expected value if operator needs it
233
+ if (!['isDefined', 'isUndefined', 'isNull', 'isNotNull', 'isEmpty', 'isNotEmpty',
234
+ 'isTruthy', 'isFalsy', 'isNumber', 'isString', 'isBoolean', 'isArray', 'isJson'].includes(operator)) {
235
+ line += ` ${formatValue(expected)}`;
236
+ }
237
+ // Add error or actual value if failed
238
+ if (!result.passed) {
239
+ if (result.error) {
240
+ line += ` (Error: ${result.error})`;
241
+ }
242
+ else if (result.actualValue !== undefined) {
243
+ line += ` (actual: ${formatValue(result.actualValue)})`;
244
+ }
245
+ }
246
+ output += line + '\n';
247
+ }
248
+ return output;
249
+ }
250
+ /**
251
+ * Formats a value for display
252
+ * @param value Value to format
253
+ * @returns Formatted string
254
+ */
255
+ function formatValue(value) {
256
+ if (value === null)
257
+ return 'null';
258
+ if (value === undefined)
259
+ return 'undefined';
260
+ if (value instanceof RegExp)
261
+ return value.toString();
262
+ if (typeof value === 'string')
263
+ return `"${value}"`;
264
+ if (typeof value === 'object')
265
+ return JSON.stringify(value);
266
+ return String(value);
267
+ }
268
+ //# sourceMappingURL=assertionValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertionValidator.js","sourceRoot":"","sources":["../src/assertionValidator.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,270 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const commander_1 = require("commander");
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const http_test_1 = require("./commands/http-test");
43
+ const skill_add_1 = require("./commands/skill-add");
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs"));
46
+ const program = new commander_1.Command();
47
+ program
48
+ .name('cursortoys')
49
+ .description('Command-line utilities for CursorToys - HTTP testing, automation, and productivity tools')
50
+ .version('0.2.0');
51
+ program
52
+ .command('http test')
53
+ .description('Run .req/.request files in the project http folder as tests')
54
+ .option('-p, --project <dir>', 'Project directory (default: cwd)')
55
+ .option('--base-folder <name>', 'Base folder name (default: cursor, or CURSORTOYS_BASE_FOLDER)')
56
+ .option('--environments-folder <name>', 'Environments subfolder (default: .environments)')
57
+ .option('-e, --env <name>', 'Environment to use (overrides # @env in file)')
58
+ .option('-t, --timeout <seconds>', 'Request timeout in seconds (default: 10)', '10')
59
+ .option('-f, --file <path>', 'Run a single .req/.request file')
60
+ .option('-V, --verbose', 'Show request and response for each test')
61
+ .option('--var <key=value>', 'Override variable (KEY=value); can be repeated', (v, acc) => {
62
+ acc = acc || [];
63
+ acc.push(v);
64
+ return acc;
65
+ }, [])
66
+ .action(async (_arg, opts) => {
67
+ const startTime = Date.now();
68
+ const timeout = parseInt(opts?.timeout ?? '10', 10);
69
+ const varOverrides = {};
70
+ if (Array.isArray(opts?.var)) {
71
+ for (const pair of opts.var) {
72
+ const eq = pair.indexOf('=');
73
+ if (eq > 0) {
74
+ const key = pair.substring(0, eq).trim();
75
+ const value = pair.substring(eq + 1).trim();
76
+ if (key)
77
+ varOverrides[key] = value;
78
+ }
79
+ }
80
+ }
81
+ // Function to display a test result in real-time
82
+ const displayResult = (r) => {
83
+ const shortPath = path.relative(process.cwd(), r.file);
84
+ const label = r.requestTotal != null && r.requestTotal > 1 && r.requestIndex != null
85
+ ? `${shortPath} (${r.requestIndex}/${r.requestTotal})`
86
+ : shortPath;
87
+ const status = r.statusCode > 0 ? `${r.statusCode} ${r.statusText}` : (r.error || r.statusText);
88
+ // Build assertion summary
89
+ const assertionSummary = r.assertionsTotal && r.assertionsTotal > 0
90
+ ? ` [${r.assertionsPassed}/${r.assertionsTotal} assertions]`
91
+ : '';
92
+ if (r.passed) {
93
+ console.log(' ' + chalk_1.default.green('✓') + ' ' + chalk_1.default.dim(label) + ' ' + chalk_1.default.gray(status) + chalk_1.default.gray(assertionSummary));
94
+ }
95
+ else {
96
+ console.log(' ' + chalk_1.default.red('✗') + ' ' + chalk_1.default.dim(label) + ' ' + chalk_1.default.red(status) + chalk_1.default.red(assertionSummary));
97
+ if (r.error) {
98
+ console.log(' ' + chalk_1.default.red(r.error));
99
+ }
100
+ }
101
+ // Show block title and line if available
102
+ if (r.blockTitle && r.blockLine) {
103
+ console.log(' ' + chalk_1.default.dim(`## ${r.blockTitle}`) + chalk_1.default.dim(` (line ${r.blockLine})`));
104
+ }
105
+ // Show assertion details if there are any
106
+ if (r.assertionResults && r.assertionResults.length > 0) {
107
+ for (const assertion of r.assertionResults) {
108
+ const symbol = assertion.passed ? chalk_1.default.green('✓') : chalk_1.default.red('✗');
109
+ const expr = assertion.assertion.expression;
110
+ const op = assertion.assertion.operator;
111
+ const exp = assertion.assertion.expected;
112
+ // Build the technical details (expression + operator + expected)
113
+ let technicalDetails = `${expr} ${op}`;
114
+ // Add expected value if needed
115
+ if (exp !== null && !['isDefined', 'isUndefined', 'isNull', 'isNotNull', 'isEmpty', 'isNotEmpty',
116
+ 'isTruthy', 'isFalsy', 'isNumber', 'isString', 'isBoolean', 'isArray', 'isJson'].includes(op)) {
117
+ const expStr = typeof exp === 'string' ? `"${exp}"` : String(exp);
118
+ technicalDetails += ` ${expStr}`;
119
+ }
120
+ // If there's a description, show it first, then the technical details
121
+ let displayText;
122
+ if (assertion.assertion.description) {
123
+ displayText = `${assertion.assertion.description}: ${technicalDetails}`;
124
+ }
125
+ else {
126
+ displayText = technicalDetails;
127
+ }
128
+ let line = ` ${symbol} ${displayText}`;
129
+ // Add actual value or error if failed
130
+ if (!assertion.passed) {
131
+ if (assertion.error) {
132
+ line += chalk_1.default.red(` (Error: ${assertion.error})`);
133
+ }
134
+ else if (assertion.actualValue !== undefined) {
135
+ const actualStr = typeof assertion.actualValue === 'string'
136
+ ? `"${assertion.actualValue}"`
137
+ : JSON.stringify(assertion.actualValue);
138
+ line += chalk_1.default.red(` (actual: ${actualStr})`);
139
+ }
140
+ }
141
+ console.log(line);
142
+ }
143
+ }
144
+ if (opts?.verbose && r.requestConfig) {
145
+ const c = r.requestConfig;
146
+ console.log(chalk_1.default.dim(' Request: ') + (c.method || 'GET') + ' ' + c.url);
147
+ if (c.headers && Object.keys(c.headers).length > 0) {
148
+ for (const [k, v] of Object.entries(c.headers)) {
149
+ console.log(chalk_1.default.dim(' ') + k + ': ' + v);
150
+ }
151
+ }
152
+ if (c.body) {
153
+ const bodyStr = typeof c.body === 'string' ? c.body : JSON.stringify(c.body);
154
+ console.log(chalk_1.default.dim(' Body: ') + (bodyStr.length > 200 ? bodyStr.slice(0, 200) + '...' : bodyStr));
155
+ }
156
+ console.log(chalk_1.default.dim(' Response: ') + r.statusCode + ' ' + r.statusText);
157
+ if (r.responseBody) {
158
+ const preview = r.responseBody.length > 300 ? r.responseBody.slice(0, 300) + '...' : r.responseBody;
159
+ console.log(chalk_1.default.dim(' Body: ') + preview.replace(/\n/g, '\n '));
160
+ }
161
+ console.log('');
162
+ }
163
+ };
164
+ const results = await (0, http_test_1.runHttpTest)({
165
+ project: opts?.project,
166
+ baseFolder: opts?.baseFolder,
167
+ environmentsFolder: opts?.environmentsFolder,
168
+ env: opts?.env,
169
+ timeout: isNaN(timeout) ? 10 : timeout,
170
+ file: opts?.file,
171
+ verbose: opts?.verbose,
172
+ varOverrides: Object.keys(varOverrides).length > 0 ? varOverrides : undefined,
173
+ onProgress: displayResult, // Display results in real-time
174
+ });
175
+ const passed = results.filter((r) => r.passed);
176
+ const failed = results.filter((r) => !r.passed);
177
+ const duration = ((Date.now() - startTime) / 1000).toFixed(2);
178
+ if (results.length === 0) {
179
+ if (opts?.file) {
180
+ console.log(chalk_1.default.red(' FAIL ') + chalk_1.default.dim('No file found at: ') + opts.file);
181
+ console.log('');
182
+ console.log(chalk_1.default.red('Tests: ') + chalk_1.default.red('0 total'));
183
+ console.log(chalk_1.default.dim(`Time: ${duration}s`));
184
+ }
185
+ else {
186
+ console.log(chalk_1.default.yellow(' No .req or .request files found in the http folder.'));
187
+ console.log(chalk_1.default.dim(`Time: ${duration}s`));
188
+ }
189
+ process.exit(1);
190
+ }
191
+ console.log('');
192
+ if (failed.length === 0) {
193
+ console.log(chalk_1.default.green('Tests: ') + chalk_1.default.green(`${passed.length} passed`) + chalk_1.default.dim(`, ${results.length} total`));
194
+ }
195
+ else {
196
+ console.log(chalk_1.default.red('Tests: ') +
197
+ (passed.length ? chalk_1.default.green(`${passed.length} passed`) + chalk_1.default.dim(', ') : '') +
198
+ chalk_1.default.red(`${failed.length} failed`) +
199
+ chalk_1.default.dim(`, ${results.length} total`));
200
+ }
201
+ console.log(chalk_1.default.dim(`Time: ${duration}s`));
202
+ process.exit(failed.length > 0 ? 1 : 0);
203
+ });
204
+ // Skill commands
205
+ const skillCommand = program
206
+ .command('skill')
207
+ .description('Manage AI agent skills');
208
+ skillCommand
209
+ .command('add <name>')
210
+ .description('Create a new skill file with a template')
211
+ .option('-d, --description <text>', 'Skill description')
212
+ .option('-t, --target <type>', 'Target directory (personal or project)', 'personal')
213
+ .option('-p, --project <dir>', 'Project directory (required if target is project)')
214
+ .option('--base-folder <name>', 'Base folder name (default: cursor, or CURSORTOYS_BASE_FOLDER)')
215
+ .action(async (name, opts) => {
216
+ const baseFolder = opts.baseFolder || process.env.CURSORTOYS_BASE_FOLDER || 'cursor';
217
+ const target = opts.target === 'project' ? 'project' : 'personal';
218
+ // Validate target
219
+ if (target === 'project' && !opts.project) {
220
+ console.log(chalk_1.default.red('Error: --project is required when target is "project"'));
221
+ console.log(chalk_1.default.dim('Usage: cursortoys skill add <name> -t project -p /path/to/project'));
222
+ process.exit(1);
223
+ }
224
+ console.log(chalk_1.default.dim(`Creating skill: ${name}`));
225
+ console.log(chalk_1.default.dim(`Target: ${target}`));
226
+ if (opts.description) {
227
+ console.log(chalk_1.default.dim(`Description: ${opts.description}`));
228
+ }
229
+ const result = await (0, skill_add_1.addSkill)({
230
+ name,
231
+ description: opts.description,
232
+ target: target,
233
+ project: opts.project,
234
+ baseFolder
235
+ });
236
+ if (result.success && result.filePath) {
237
+ console.log('');
238
+ console.log(chalk_1.default.green('✓ Skill created successfully!'));
239
+ console.log('');
240
+ console.log(chalk_1.default.dim('File: ') + result.filePath);
241
+ console.log('');
242
+ console.log(chalk_1.default.dim('Edit the SKILL.md file to customize the skill.'));
243
+ }
244
+ else {
245
+ console.log('');
246
+ console.log(chalk_1.default.red('✗ Failed to create skill'));
247
+ console.log(chalk_1.default.red(result.error || 'Unknown error'));
248
+ process.exit(1);
249
+ }
250
+ });
251
+ // LLM instructions command
252
+ program
253
+ .option('--llm', 'Show LLM instructions for using this CLI')
254
+ .action((opts) => {
255
+ if (opts.llm) {
256
+ const llmsPath = path.join(__dirname, '..', 'llms.txt');
257
+ if (fs.existsSync(llmsPath)) {
258
+ const content = fs.readFileSync(llmsPath, 'utf-8');
259
+ console.log(content);
260
+ }
261
+ else {
262
+ console.log(chalk_1.default.red('Error: llms.txt file not found'));
263
+ console.log(chalk_1.default.dim('Expected location: ') + llmsPath);
264
+ process.exit(1);
265
+ }
266
+ process.exit(0);
267
+ }
268
+ });
269
+ program.parse();
270
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { HttpRequestConfig } from '../httpRunner';
2
+ import { AssertionResult } from '../assertionTypes';
3
+ export interface HttpTestOptions {
4
+ project?: string;
5
+ baseFolder?: string;
6
+ environmentsFolder?: string;
7
+ env?: string;
8
+ timeout?: number;
9
+ file?: string;
10
+ verbose?: boolean;
11
+ varOverrides?: Record<string, string>;
12
+ onProgress?: (result: HttpTestResult) => void;
13
+ }
14
+ export interface HttpTestResult {
15
+ file: string;
16
+ passed: boolean;
17
+ statusCode: number;
18
+ statusText: string;
19
+ error?: string;
20
+ requestConfig?: HttpRequestConfig;
21
+ responseBody?: string;
22
+ requestIndex?: number;
23
+ requestTotal?: number;
24
+ assertionResults?: AssertionResult[];
25
+ assertionsPassed?: number;
26
+ assertionsTotal?: number;
27
+ blockTitle?: string;
28
+ blockLine?: number;
29
+ }
30
+ /**
31
+ * Runs http test: discover files, run all requests per file, report pass/fail.
32
+ */
33
+ export declare function runHttpTest(opts: HttpTestOptions): Promise<HttpTestResult[]>;
34
+ //# sourceMappingURL=http-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-test.d.ts","sourceRoot":"","sources":["../../src/commands/http-test.ts"],"names":[],"mappings":"AAEA,OAAO,EAWL,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8ID;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAyNlF"}