apx-toolkit
Version:
Automatically discover APIs and generate complete integration packages: code in 12 languages, TypeScript types, test suites, SDK packages, API documentation, mock servers, performance reports, and contract tests. Saves 2-4 weeks of work in seconds.
580 lines • 21.9 kB
JavaScript
/**
* Code Generator - Generate code snippets in multiple languages
* Makes the tool a developer's dream by providing ready-to-use code
*/
/**
* Generates code snippets for an API in multiple languages
*/
export function generateCodeSnippets(api) {
const snippets = [];
// Generate WebSocket-specific code if detected
if (api.isWebSocket) {
snippets.push(generateWebSocketTypeScriptSnippet(api));
snippets.push(generateWebSocketPythonSnippet(api));
snippets.push(generateWebSocketJavaScriptSnippet(api));
}
else if (api.isGraphQL) {
// Generate GraphQL-specific code if detected
snippets.push(generateGraphQLTypeScriptSnippet(api));
snippets.push(generateGraphQLPythonSnippet(api));
snippets.push(generateGraphQLJavaScriptSnippet(api));
}
else {
// Standard REST API code
snippets.push(generateTypeScriptSnippet(api));
snippets.push(generateJavaScriptSnippet(api));
snippets.push(generatePythonSnippet(api));
snippets.push(generateGoSnippet(api));
snippets.push(generateRustSnippet(api));
snippets.push(generateJavaSnippet(api));
snippets.push(generatePhpSnippet(api));
snippets.push(generateRubySnippet(api));
snippets.push(generateCurlSnippet(api));
snippets.push(generatePowerShellSnippet(api));
}
// Always include C# and Kotlin
snippets.push(generateCSharpSnippet(api));
snippets.push(generateKotlinSnippet(api));
return snippets;
}
function generateTypeScriptSnippet(api) {
const url = new URL(api.baseUrl);
let code = `// TypeScript/Node.js\n`;
code += `const response = await fetch('${api.baseUrl}'`;
// Add query params
const queryParams = buildQueryString(api);
if (queryParams) {
code += ` + '?${queryParams}'`;
}
code += `, {\n`;
code += ` method: '${api.method}',\n`;
// Add headers
if (Object.keys(api.headers).length > 0) {
code += ` headers: {\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` '${key}': '${value}',\n`;
}
code += ` },\n`;
}
// Add body for POST
if (api.method === 'POST' && api.body) {
code += ` body: JSON.stringify(${JSON.stringify(api.body, null, 2)}),\n`;
}
code += `});\n`;
code += `const data = await response.json();\n`;
code += `console.log(data);`;
return {
language: 'typescript',
code,
description: 'TypeScript/Node.js with fetch API',
};
}
function generateJavaScriptSnippet(api) {
const snippet = generateTypeScriptSnippet(api);
snippet.language = 'javascript';
snippet.code = snippet.code.replace('// TypeScript/Node.js', '// JavaScript/Node.js');
return snippet;
}
function generatePythonSnippet(api) {
const url = new URL(api.baseUrl);
let code = `# Python\n`;
code += `import requests\n\n`;
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `url = '${fullUrl}'\n`;
code += `headers = {\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` '${key}': '${value}',\n`;
}
code += `}\n\n`;
if (api.method === 'POST' && api.body) {
code += `payload = ${JSON.stringify(api.body, null, 2)}\n\n`;
code += `response = requests.${api.method.toLowerCase()}('${api.baseUrl}', headers=headers, json=payload)\n`;
}
else {
code += `response = requests.${api.method.toLowerCase()}('${fullUrl}', headers=headers)\n`;
}
code += `data = response.json()\n`;
code += `print(data)`;
return {
language: 'python',
code,
description: 'Python with requests library',
};
}
function generateGoSnippet(api) {
let code = `// Go\n`;
code += `package main\n\n`;
code += `import (\n`;
code += ` "bytes"\n`;
code += ` "encoding/json"\n`;
code += ` "fmt"\n`;
code += ` "net/http"\n`;
code += `)\n\n`;
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `func main() {\n`;
code += ` url := "${fullUrl}"\n\n`;
if (api.method === 'POST' && api.body) {
code += ` payload, _ := json.Marshal(${JSON.stringify(api.body)})\n`;
code += ` req, _ := http.NewRequest("${api.method}", url, bytes.NewBuffer(payload))\n`;
}
else {
code += ` req, _ := http.NewRequest("${api.method}", url, nil)\n`;
}
code += `\n // Set headers\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` req.Header.Set("${key}", "${value}")\n`;
}
code += `\n client := &http.Client{}\n`;
code += ` resp, _ := client.Do(req)\n`;
code += ` defer resp.Body.Close()\n\n`;
code += ` var data map[string]interface{}\n`;
code += ` json.NewDecoder(resp.Body).Decode(&data)\n`;
code += ` fmt.Println(data)\n`;
code += `}`;
return {
language: 'go',
code,
description: 'Go with net/http',
};
}
function generateRustSnippet(api) {
let code = `// Rust (requires reqwest and serde_json)\n`;
code += `use reqwest;\n`;
code += `use serde_json::json;\n\n`;
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `#[tokio::main]\n`;
code += `async fn main() -> Result<(), Box<dyn std::error::Error>> {\n`;
code += ` let client = reqwest::Client::new();\n\n`;
if (api.method === 'POST' && api.body) {
code += ` let payload = json!(${JSON.stringify(api.body)});\n\n`;
code += ` let res = client\n`;
code += ` .${api.method.toLowerCase()}("${api.baseUrl}")\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` .header("${key}", "${value}")\n`;
}
code += ` .json(&payload)\n`;
code += ` .send()\n`;
code += ` .await?;\n`;
}
else {
code += ` let res = client\n`;
code += ` .${api.method.toLowerCase()}("${fullUrl}")\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` .header("${key}", "${value}")\n`;
}
code += ` .send()\n`;
code += ` .await?;\n`;
}
code += `\n let data: serde_json::Value = res.json().await?;\n`;
code += ` println!("{:?}", data);\n\n`;
code += ` Ok(())\n`;
code += `}`;
return {
language: 'rust',
code,
description: 'Rust with reqwest',
};
}
function generateJavaSnippet(api) {
let code = `// Java (requires OkHttp)\n`;
code += `import okhttp3.*;\n`;
code += `import java.io.IOException;\n\n`;
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `public class ApiClient {\n`;
code += ` public static void main(String[] args) throws IOException {\n`;
code += ` OkHttpClient client = new OkHttpClient();\n\n`;
code += ` Request.Builder requestBuilder = new Request.Builder()\n`;
code += ` .url("${fullUrl}")\n`;
if (api.method === 'POST' && api.body) {
code += ` .post(RequestBody.create(\n`;
code += ` ${JSON.stringify(JSON.stringify(api.body))},\n`;
code += ` MediaType.parse("application/json")))\n`;
}
else {
code += ` .${api.method.toLowerCase()}()\n`;
}
for (const [key, value] of Object.entries(api.headers)) {
code += ` .addHeader("${key}", "${value}")\n`;
}
code += ` .build();\n\n`;
code += ` try (Response response = client.newCall(requestBuilder.build()).execute()) {\n`;
code += ` String data = response.body().string();\n`;
code += ` System.out.println(data);\n`;
code += ` }\n`;
code += ` }\n`;
code += `}`;
return {
language: 'java',
code,
description: 'Java with OkHttp',
};
}
function generatePhpSnippet(api) {
let code = `<?php\n`;
code += `// PHP with cURL\n\n`;
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `$url = '${fullUrl}';\n\n`;
code += `$headers = [\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` '${key}: ${value}',\n`;
}
code += `];\n\n`;
code += `$ch = curl_init($url);\n`;
code += `curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\n`;
code += `curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);\n`;
if (api.method === 'POST' && api.body) {
code += `curl_setopt($ch, CURLOPT_POST, true);\n`;
code += `curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(${JSON.stringify(api.body)}));\n`;
}
code += `\n$response = curl_exec($ch);\n`;
code += `curl_close($ch);\n\n`;
code += `$data = json_decode($response, true);\n`;
code += `print_r($data);\n`;
code += `?>`;
return {
language: 'php',
code,
description: 'PHP with cURL',
};
}
function generateRubySnippet(api) {
let code = `# Ruby (requires net/http and json)\n`;
code += `require 'net/http'\n`;
code += `require 'json'\n\n`;
const url = new URL(api.baseUrl);
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `uri = URI('${fullUrl}')\n\n`;
if (api.method === 'POST') {
code += `req = Net::HTTP::Post.new(uri)\n`;
if (api.body) {
code += `req.body = ${JSON.stringify(api.body)}.to_json\n`;
}
}
else {
code += `req = Net::HTTP::Get.new(uri)\n`;
}
code += `\n# Set headers\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += `req['${key}'] = '${value}'\n`;
}
code += `\nres = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|\n`;
code += ` http.request(req)\n`;
code += `end\n\n`;
code += `data = JSON.parse(res.body)\n`;
code += `puts data`;
return {
language: 'ruby',
code,
description: 'Ruby with net/http',
};
}
function generateCurlSnippet(api) {
let code = `# cURL\n`;
code += `curl -X ${api.method}`;
// Add headers
for (const [key, value] of Object.entries(api.headers)) {
code += ` \\\n -H "${key}: ${value}"`;
}
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
// Add body for POST
if (api.method === 'POST' && api.body) {
code += ` \\\n -d '${JSON.stringify(api.body)}'`;
code += ` \\\n -H "Content-Type: application/json"`;
}
code += ` \\\n "${fullUrl}"`;
return {
language: 'curl',
code,
description: 'cURL command',
};
}
function generatePowerShellSnippet(api) {
let code = `# PowerShell\n`;
const fullUrl = api.baseUrl + (api.queryParams ? '?' + buildQueryString(api) : '');
code += `$headers = @{\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` "${key}" = "${value}"\n`;
}
code += `}\n\n`;
if (api.method === 'POST' && api.body) {
code += `$body = ${JSON.stringify(api.body)} | ConvertTo-Json\n\n`;
code += `$response = Invoke-RestMethod -Uri "${api.baseUrl}" -Method ${api.method} -Headers $headers -Body $body -ContentType "application/json"\n`;
}
else {
code += `$response = Invoke-RestMethod -Uri "${fullUrl}" -Method ${api.method} -Headers $headers\n`;
}
code += `$response | ConvertTo-Json`;
return {
language: 'powershell',
code,
description: 'PowerShell with Invoke-RestMethod',
};
}
function buildQueryString(api) {
const params = [];
// Add query params
if (api.queryParams) {
for (const [key, value] of Object.entries(api.queryParams)) {
params.push(`${key}=${encodeURIComponent(String(value))}`);
}
}
// Add pagination params
if (api.paginationInfo) {
const paramName = api.paginationInfo.paramName || 'page';
const paramValue = api.paginationInfo.currentPage || api.paginationInfo.currentOffset || 1;
params.push(`${paramName}=${paramValue}`);
}
return params.join('&');
}
/**
* Generates GraphQL code snippets
*/
function generateGraphQLTypeScriptSnippet(api) {
let code = `// TypeScript/Node.js with GraphQL\n`;
code += `// Requires: npm install @apollo/client graphql\n\n`;
code += `import { ApolloClient, InMemoryCache, gql } from '@apollo/client';\n\n`;
code += `const client = new ApolloClient({\n`;
code += ` uri: '${api.baseUrl}',\n`;
code += ` cache: new InMemoryCache(),\n`;
if (Object.keys(api.headers).length > 0) {
code += ` headers: {\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` '${key}': '${value}',\n`;
}
code += ` },\n`;
}
code += `});\n\n`;
if (api.graphQLQuery) {
code += `const ${api.graphQLOperationName || 'QUERY'} = gql\`\n`;
code += api.graphQLQuery;
code += `\`;\n\n`;
code += `const { data } = await client.query({\n`;
code += ` query: ${api.graphQLOperationName || 'QUERY'},\n`;
if (api.body && typeof api.body === 'object' && 'variables' in api.body) {
code += ` variables: ${JSON.stringify(api.body.variables, null, 2)},\n`;
}
code += `});\n`;
code += `console.log(data);`;
}
else {
code += `// GraphQL query detected but not captured\n`;
code += `// Use Apollo Client to execute queries`;
}
return {
language: 'typescript',
code,
description: 'TypeScript with Apollo Client (GraphQL)',
};
}
function generateGraphQLPythonSnippet(api) {
let code = `# Python with GraphQL\n`;
code += `# Requires: pip install gql requests\n\n`;
code += `from gql import gql, Client\n`;
code += `from gql.transport.requests import RequestsHTTPTransport\n\n`;
code += `headers = {\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` '${key}': '${value}',\n`;
}
code += `}\n\n`;
code += `transport = RequestsHTTPTransport(\n`;
code += ` url='${api.baseUrl}',\n`;
code += ` headers=headers\n`;
code += `)\n\n`;
code += `client = Client(transport=transport, fetch_schema_from_transport=True)\n\n`;
if (api.graphQLQuery) {
code += `query = gql("""\n`;
code += api.graphQLQuery;
code += `""")\n\n`;
code += `result = client.execute(query`;
if (api.body && typeof api.body === 'object' && 'variables' in api.body) {
code += `, variable_values=${JSON.stringify(api.body.variables)}`;
}
code += `)\n`;
code += `print(result)`;
}
else {
code += `# GraphQL query detected but not captured\n`;
code += `# Use gql client to execute queries`;
}
return {
language: 'python',
code,
description: 'Python with gql library (GraphQL)',
};
}
function generateGraphQLJavaScriptSnippet(api) {
const snippet = generateGraphQLTypeScriptSnippet(api);
snippet.language = 'javascript';
snippet.code = snippet.code.replace('// TypeScript/Node.js', '// JavaScript/Node.js');
snippet.code = snippet.code.replace('import {', 'const {');
snippet.code = snippet.code.replace('} from', '} = require');
return snippet;
}
/**
* Generates C# code snippet
*/
function generateCSharpSnippet(api) {
let code = `// C# (.NET)\n`;
code += `using System;\n`;
code += `using System.Net.Http;\n`;
code += `using System.Text;\n`;
code += `using System.Text.Json;\n`;
code += `using System.Threading.Tasks;\n\n`;
code += `public class ApiClient\n`;
code += `{\n`;
code += ` private static readonly HttpClient client = new HttpClient();\n\n`;
code += ` public static async Task Main(string[] args)\n`;
code += ` {\n`;
if (api.method === 'GET') {
code += ` var request = new HttpRequestMessage(HttpMethod.Get, "${api.baseUrl}");\n`;
}
else {
code += ` var request = new HttpRequestMessage(HttpMethod.Post, "${api.baseUrl}");\n`;
if (api.body) {
code += ` var json = JsonSerializer.Serialize(${JSON.stringify(api.body)});\n`;
code += ` request.Content = new StringContent(json, Encoding.UTF8, "application/json");\n`;
}
}
code += `\n // Add headers\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` request.Headers.Add("${key}", "${value}");\n`;
}
code += `\n var response = await client.SendAsync(request);\n`;
code += ` var content = await response.Content.ReadAsStringAsync();\n`;
code += ` var data = JsonSerializer.Deserialize<object>(content);\n`;
code += ` Console.WriteLine(data);\n`;
code += ` }\n`;
code += `}`;
return {
language: 'csharp',
code,
description: 'C# with HttpClient (.NET)',
};
}
/**
* Generates Kotlin code snippet
*/
function generateKotlinSnippet(api) {
let code = `// Kotlin\n`;
code += `// Requires: implementation("com.squareup.okhttp3:okhttp:4.11.0")\n\n`;
code += `import okhttp3.*\n`;
code += `import java.io.IOException\n\n`;
code += `fun main() {\n`;
code += ` val client = OkHttpClient()\n\n`;
if (api.method === 'GET') {
code += ` val request = Request.Builder()\n`;
code += ` .url("${api.baseUrl}")\n`;
}
else {
code += ` val json = """${api.body ? JSON.stringify(api.body) : '{}'}""".trimIndent()\n`;
code += ` val body = RequestBody.create(\n`;
code += ` MediaType.parse("application/json; charset=utf-8"),\n`;
code += ` json\n`;
code += ` )\n\n`;
code += ` val request = Request.Builder()\n`;
code += ` .url("${api.baseUrl}")\n`;
code += ` .post(body)\n`;
}
code += ` .apply {\n`;
for (const [key, value] of Object.entries(api.headers)) {
code += ` addHeader("${key}", "${value}")\n`;
}
code += ` }\n`;
code += ` .build()\n\n`;
code += ` client.newCall(request).execute().use { response ->\n`;
code += ` val data = response.body?.string()\n`;
code += ` println(data)\n`;
code += ` }\n`;
code += `}`;
return {
language: 'kotlin',
code,
description: 'Kotlin with OkHttp',
};
}
/**
* Generates WebSocket code snippets
*/
function generateWebSocketTypeScriptSnippet(api) {
const url = api.webSocketUrl || api.url;
const protocols = api.webSocketProtocols && api.webSocketProtocols.length > 0
? api.webSocketProtocols[0]
: undefined;
let code = `// WebSocket Client Code\n`;
code += `// Auto-generated by APX\n\n`;
code += `const ws = new WebSocket('${url}'`;
if (protocols) {
code += `, '${protocols}'`;
}
code += `);\n\n`;
code += `ws.onopen = () => {\n`;
code += ` console.log('WebSocket connected');\n`;
code += ` // Send messages here\n`;
code += `};\n\n`;
code += `ws.onmessage = (event) => {\n`;
code += ` console.log('Message received:', event.data);\n`;
code += ` // Handle message\n`;
code += `};\n\n`;
code += `ws.onerror = (error) => {\n`;
code += ` console.error('WebSocket error:', error);\n`;
code += `};\n\n`;
code += `ws.onclose = () => {\n`;
code += ` console.log('WebSocket closed');\n`;
code += `};\n`;
return {
language: 'typescript',
code,
description: 'TypeScript WebSocket client',
};
}
function generateWebSocketPythonSnippet(api) {
const url = api.webSocketUrl || api.url;
const protocols = api.webSocketProtocols && api.webSocketProtocols.length > 0
? api.webSocketProtocols[0]
: undefined;
let code = `# WebSocket Client Code\n`;
code += `# Auto-generated by APX\n`;
code += `# Requires: pip install websockets\n\n`;
code += `import asyncio\n`;
code += `import websockets\n`;
code += `import json\n\n`;
code += `async def connect_websocket():\n`;
code += ` uri = '${url}'\n`;
code += ` async with websockets.connect(uri`;
if (protocols) {
code += `, subprotocols=['${protocols}']`;
}
code += `) as websocket:\n`;
code += ` print('WebSocket connected')\n`;
code += ` \n`;
code += ` async for message in websocket:\n`;
code += ` print(f'Message received: {message}')\n`;
code += ` # Handle message\n\n`;
code += `if __name__ == '__main__':\n`;
code += ` asyncio.run(connect_websocket())\n`;
return {
language: 'python',
code,
description: 'Python WebSocket client (websockets library)',
};
}
function generateWebSocketJavaScriptSnippet(api) {
const snippet = generateWebSocketTypeScriptSnippet(api);
snippet.language = 'javascript';
return snippet;
}
/**
* Generates code snippets for all discovered APIs
*/
export function generateAllCodeSnippets(apis) {
const result = {};
for (const api of apis) {
const url = new URL(api.baseUrl);
const key = api.isWebSocket
? `WS_${url.pathname || url.hostname}`
: `${api.method}_${url.pathname}`;
result[key] = generateCodeSnippets(api);
}
return result;
}
//# sourceMappingURL=code-generator.js.map