API Integration Builder
Run ID: 69cc75ff3e7fb09ff16a21002026-04-01Development
PantheraHive BOS
BOS Dashboard

API Integration Builder: Step 1 of 2 - Generate Code

This deliverable provides comprehensive, detailed, and professional code generation for integrating with external APIs. As the first step in the "API Integration Builder" workflow, this output focuses on laying a robust foundation with clean, well-commented, and production-ready code examples.

We will provide illustrative examples using Python, a highly versatile and widely adopted language for backend development and API integrations, leveraging the popular requests library. The principles and patterns demonstrated can be readily adapted to other programming languages.


1. Introduction to API Integration

API integration is the process of connecting two or more applications so that they can exchange data. This "API Integration Builder" aims to streamline this process by generating foundational code that can be customized to your specific needs.

Key Benefits of Effective API Integration:

2. Core Concepts of API Integration

Before diving into code, understanding these core concepts is crucial:

* GET: Retrieve data from a specified resource.

* POST: Send data to a server to create a new resource.

* PUT: Update an existing resource (replaces the entire resource).

* PATCH: Apply partial modifications to a resource.

* DELETE: Remove a specified resource.

3. Python Code Examples for API Integration

We will use JSONPlaceholder (a free fake API for testing and prototyping) as our example target API to demonstrate common integration patterns.

3.1. Setup and Dependencies

First, ensure you have Python installed. Then, install the requests library:

text • 359 chars
The `python-dotenv` library is recommended for securely managing API keys and sensitive configuration in a `.env` file during development.

#### 3.2. Configuration Management (`.env` file)

For production-ready code, sensitive information like API keys should never be hardcoded. Use environment variables.

Create a file named `.env` in your project root:

Sandboxed live preview

4. Best Practices for Production API Integrations

While the provided code offers a strong foundation, consider these best practices for production environments:

  1. Robust Error Handling & Retries:

* Implement exponential backoff for retries on transient errors (e.g., 429 Too Many Requests, 5xx Server Errors). Libraries like tenacity can help.

* Distinguish between recoverable and non-recoverable errors.

* Log detailed error information, including request/response headers and (sanitized) bodies.

  1. Authentication & Security:

* Never hardcode credentials. Use environment variables, a secrets manager (e.g., AWS Secrets Manager, HashiCorp Vault), or secure configuration files.

* Use HTTPS for all API communications.

* Properly handle and rotate API keys/tokens.

* Sanitize all user-supplied input before sending it to an API to prevent injection attacks.

  1. Rate Limiting & Throttling:

* Respect the API provider's rate limits. Implement client-side rate limiting to avoid being blocked.

* Handle 429 Too Many Requests responses gracefully, often by pausing and retrying.

  1. Logging & Monitoring:

* Log key

projectmanager Output

API Integration Builder: Project Creation Integration (Step 2 of 2)

This document provides a comprehensive and detailed output for integrating with an external API to perform the create_project operation. This is the second and final step in the "API Integration Builder" workflow, focusing on generating the necessary code and guidance for successful implementation.


1. Executive Summary

This deliverable outlines the technical specifications and provides actionable code examples for integrating with an external Project Management API to programmatically create new projects. The goal is to enable seamless project creation from your application into a third-party project management system, enhancing automation and data synchronization capabilities. We will cover prerequisites, API endpoint details, request/response structures, and code samples in popular programming languages, along with best practices for robust integration.


2. Objective: Integrate projectmanager → create_project

The primary objective of this step is to generate and explain the code required to interact with an external Project Management API's create_project endpoint. This will allow your system to send a request to the external API, providing the necessary project details, and receive a confirmation of project creation or an error message.


3. Prerequisites for Integration

Before proceeding with the code implementation, ensure you have the following information and resources from the external Project Management API provider:

  • API Base URL: The root URL for all API requests (e.g., https://api.externalprojectmanager.com/v1).
  • Authentication Credentials:

* API Key/Token: If using API Key authentication, obtain your unique key.

* OAuth 2.0 Client ID & Client Secret: If using OAuth, ensure you have these and understand the authorization flow (e.g., obtaining an access token).

* Bearer Token: The actual access token obtained via OAuth or other means.

  • API Documentation: Access to the external API's official documentation for precise endpoint paths, required parameters, data types, and rate limits.
  • Network Access: Ensure your application's environment has outbound network access to the API's domain.

4. API Specification: create_project Endpoint (Hypothetical Example)

Based on common API design patterns, here's a hypothetical specification for a create_project endpoint. Please consult the actual API documentation for exact details.

  • Method: POST
  • Endpoint Path: /projects (or /v1/projects, /api/projects)
  • Content-Type: application/json

4.1. Request Body (JSON Example)

The request body will contain the data needed to create a new project. Required fields are typically marked in the API documentation.


{
  "projectName": "New Feature Development - Phase 1",
  "description": "Develop and deploy core features for the Q3 product release, focusing on user authentication and data management.",
  "startDate": "2023-09-01",
  "endDate": "2023-12-31",
  "status": "Planning",
  "priority": "High",
  "ownerId": "user12345",
  "teamIds": ["teamA", "teamB"],
  "budget": {
    "currency": "USD",
    "amount": 50000.00
  },
  "customFields": {
    "department": "Engineering",
    "clientName": "Acme Corp"
  }
}

Common Request Body Fields:

  • projectName (String, Required): The name of the new project.
  • description (String): A detailed description of the project.
  • startDate (String, Date format e.g., "YYYY-MM-DD"): The planned start date.
  • endDate (String, Date format e.g., "YYYY-MM-DD"): The planned end date.
  • status (String): Initial status of the project (e.g., "Planning", "Active", "Pending").
  • priority (String): Project priority (e.g., "Low", "Medium", "High").
  • ownerId (String): ID of the project owner/manager.
  • teamIds (Array of Strings): List of team IDs assigned to the project.
  • budget (Object): Optional budget details, including currency and amount.
  • customFields (Object): A flexible object for any additional custom data the API supports.

4.2. Response Body (JSON Examples)

Success Response (HTTP Status: 201 Created or 200 OK)

Upon successful project creation, the API typically returns the details of the newly created project, including its unique ID.


{
  "projectId": "proj-67890",
  "projectName": "New Feature Development - Phase 1",
  "description": "Develop and deploy core features for the Q3 product release, focusing on user authentication and data management.",
  "startDate": "2023-09-01",
  "endDate": "2023-12-31",
  "status": "Planning",
  "priority": "High",
  "ownerId": "user12345",
  "teamIds": ["teamA", "teamB"],
  "createdAt": "2023-08-25T10:00:00Z",
  "lastModifiedAt": "2023-08-25T10:00:00Z",
  "message": "Project created successfully."
}

Error Response (HTTP Status: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 500 Internal Server Error, etc.)

Error responses will vary but generally include an error code and a descriptive message.


{
  "errorCode": "INVALID_INPUT",
  "message": "Project name is required and cannot be empty.",
  "details": [
    {
      "field": "projectName",
      "issue": "Missing required field"
    }
  ]
}

{
  "errorCode": "AUTHENTICATION_FAILED",
  "message": "Invalid API key or token provided."
}

5. Code Examples for create_project

Below are code examples in Python and Node.js (JavaScript), along with a cURL command for quick testing. Remember to replace placeholder values with your actual API details and project data.

5.1. Python Example (using requests library)


import requests
import json
import os

# --- Configuration ---
API_BASE_URL = "https://api.externalprojectmanager.com/v1"
API_KEY = os.getenv("EXTERNAL_API_KEY", "YOUR_API_KEY_HERE") # Use environment variables for sensitive data

# --- Project Data to Create ---
project_data = {
    "projectName": "Website Redesign - Marketing Campaign",
    "description": "Redesign the company website to support the new Q4 marketing campaign, improving UI/UX and SEO.",
    "startDate": "2023-10-01",
    "endDate": "2024-01-31",
    "status": "Planning",
    "priority": "High",
    "ownerId": "user98765",
    "teamIds": ["marketing_team", "design_team"],
    "budget": {
        "currency": "USD",
        "amount": 75000.00
    },
    "customFields": {
        "campaignName": "Holiday_2023",
        "targetAudience": "Global"
    }
}

# --- Headers ---
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_KEY}" # Or "X-API-Key": API_KEY depending on API
}

# --- API Endpoint ---
CREATE_PROJECT_ENDPOINT = f"{API_BASE_URL}/projects"

def create_new_project(data):
    """
    Sends a POST request to create a new project.
    """
    try:
        print(f"Attempting to create project: {data['projectName']}")
        response = requests.post(CREATE_PROJECT_ENDPOINT, headers=headers, data=json.dumps(data))
        response.raise_for_status() # Raise an exception for HTTP errors (4xx or 5xx)

        project_response = response.json()
        print("Project created successfully!")
        print(f"Project ID: {project_response.get('projectId')}")
        print(f"Full Response: {json.dumps(project_response, indent=2)}")
        return project_response

    except requests.exceptions.HTTPError as http_err:
        print(f"HTTP error occurred: {http_err}")
        print(f"Response Status Code: {response.status_code}")
        print(f"Response Body: {response.text}")
        return None
    except requests.exceptions.ConnectionError as conn_err:
        print(f"Connection error occurred: {conn_err}")
        return None
    except requests.exceptions.Timeout as timeout_err:
        print(f"Timeout error occurred: {timeout_err}")
        return None
    except requests.exceptions.RequestException as req_err:
        print(f"An unexpected request error occurred: {req_err}")
        return None
    except json.JSONDecodeError:
        print(f"Failed to decode JSON response: {response.text}")
        return None

if __name__ == "__main__":
    created_project = create_new_project(project_data)
    if created_project:
        print("\nProject creation process completed.")
    else:
        print("\nProject creation failed.")

5.2. Node.js (JavaScript) Example (using axios or fetch)

Using axios (recommended for Node.js environments):

First, install axios: npm install axios


const axios = require('axios');

// --- Configuration ---
const API_BASE_URL = "https://api.externalprojectmanager.com/v1";
// Use environment variables for sensitive data
const API_KEY = process.env.EXTERNAL_API_KEY || "YOUR_API_KEY_HERE";

// --- Project Data to Create ---
const projectData = {
    projectName: "Mobile App V2 Development",
    description: "Develop new features and improve performance for the mobile application's second major version.",
    startDate: "2023-11-01",
    endDate: "2024-03-31",
    status: "Planning",
    priority: "Medium",
    ownerId: "dev_lead_id",
    teamIds: ["mobile_dev_team"],
    budget: {
        currency: "EUR",
        amount: 120000.00
    }
};

// --- Headers ---
const headers = {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${API_KEY}` // Or "X-API-Key": API_KEY depending on API
};

// --- API Endpoint ---
const CREATE_PROJECT_ENDPOINT = `${API_BASE_URL}/projects`;

async function createNewProject(data) {
    try {
        console.log(`Attempting to create project: ${data.projectName}`);
        const response = await axios.post(CREATE_PROJECT_ENDPOINT, data, { headers });

        console.log("Project created successfully!");
        console.log(`Project ID: ${response.data.projectId}`);
        console.log("Full Response:", JSON.stringify(response.data, null, 2));
        return response.data;

    } catch (error) {
        if (error.response) {
            // The request was made and the server responded with a status code
            // that falls out of the range of 2xx
            console.error(`HTTP Error: ${error.response.status}`);
            console.error(`Response Data: ${JSON.stringify(error.response.data, null, 2)}`);
        } else if (error.request) {
            // The request was made but no response was received
            console.error("No response received:", error.request);
        } else {
            // Something happened in setting up the request that triggered an Error
            console.error("Error setting up request:", error.message);
        }
        return null;
    }
}

(async () => {
    const createdProject = await createNewProject(projectData);
    if (createdProject) {
        console.log("\nProject creation process completed.");
    } else {
        console.log("\nProject creation failed.");
    }
})();

Using fetch (built-in, suitable for browser and modern Node.js):


// --- Configuration ---
const API_BASE_URL = "https://api.externalprojectmanager.com/v1";
// Use environment variables for sensitive data
const API_KEY = process.env.EXTERNAL_API_KEY || "YOUR_API_KEY_HERE";

// --- Project Data to Create ---
const projectData = {
    projectName: "Internal Tool Development - Phase 1",
    description: "Build an internal dashboard for tracking team performance and project metrics.",
    startDate: "2024-01-15",
    endDate: "2024-06-30",
    status: "Ideation",
    priority: "Low",
    ownerId: "ops_manager",
    teamIds: ["internal_tools_team"]
};

// --- Headers ---
const headers = {
    "Content-Type": "application/json",
    "Authorization": `Bearer ${API_KEY}` // Or "X-API-Key": API_KEY depending on API
};

// --- API Endpoint ---
const CREATE_PROJECT_ENDPOINT = `${API_BASE_URL}/projects`;

async function createNewProjectWithFetch(data) {
    try {
        console.log(`Attempting to create project: ${data.projectName}`);
        const response = await fetch(CREATE_PROJECT_ENDPOINT, {
            method: 'POST',
            headers: headers,
            body: JSON.stringify(data)
        });

        if (!response.ok) {
            const errorData = await response.json();
            throw new Error(`HTTP error! status: ${response.status}, message: ${errorData.message || JSON.stringify(errorData)}`);
        }

        const projectResponse = await response.json();
        console.log("Project created successfully!");
        console.log(`Project ID: ${projectResponse.projectId}`);
        console.log("Full Response:", JSON.stringify(projectResponse, null, 2));
        return projectResponse;

    } catch (error) {
        console.error("Error creating project:", error.message);
        return null;
    }
}

(async () => {
    const createdProject = await createNewProjectWithFetch(projectData);
    if (createdProject) {
        console.log("\nProject creation process completed with fetch.");
    } else {
        console.log("\nProject creation failed with fetch.");
    }
})();

5.3. cURL Example (for quick testing)

Replace

api_integration_builder.txt
Download source file
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' ReactDOM.createRoot(document.getElementById('root')!).render( ) "); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react' import './App.css' function App(){ return(

"+slugTitle(pn)+"

Built with PantheraHive BOS

) } export default App "); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e} .app{min-height:100vh;display:flex;flex-direction:column} .app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px} h1{font-size:2.5rem;font-weight:700} "); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` ## Open in IDE Open the project folder in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.5.13", "vue-router": "^4.4.5", "pinia": "^2.3.0", "axios": "^1.7.9" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.3", "vite": "^6.0.5", "vue-tsc": "^2.2.0" } } '); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname,'src') } } }) "); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]} '); zip.file(folder+"tsconfig.app.json",'{ "compilerOptions":{ "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"], "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true, "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue", "strict":true,"paths":{"@/*":["./src/*"]} }, "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"] } '); zip.file(folder+"env.d.ts","/// "); zip.file(folder+"index.html"," "+slugTitle(pn)+"
"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import './assets/main.css' const app = createApp(App) app.use(createPinia()) app.mount('#app') "); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue"," "); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547} "); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` Open in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test" }, "dependencies": { "@angular/animations": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "typescript": "~5.6.0" } } '); zip.file(folder+"angular.json",'{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "'+pn+'": { "projectType": "application", "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/'+pn+'", "index": "src/index.html", "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "styles": ["src/styles.css"], "scripts": [] } }, "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"} } } } } '); zip.file(folder+"tsconfig.json",'{ "compileOnSave": false, "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]}, "references":[{"path":"./tsconfig.app.json"}] } '); zip.file(folder+"tsconfig.app.json",'{ "extends":"./tsconfig.json", "compilerOptions":{"outDir":"./dist/out-tsc","types":[]}, "files":["src/main.ts"], "include":["src/**/*.d.ts"] } '); zip.file(folder+"src/index.html"," "+slugTitle(pn)+" "); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch(err => console.error(err)); "); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; } "); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet], templateUrl: './app.component.html', styleUrl: './app.component.css' }) export class AppComponent { title = '"+pn+"'; } "); zip.file(folder+"src/app/app.component.html","

"+slugTitle(pn)+"

Built with PantheraHive BOS

"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1} "); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes) ] }; "); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router'; export const routes: Routes = []; "); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install ng serve # or: npm start ``` ## Build ```bash ng build ``` Open in VS Code with Angular Language Service extension. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local .angular/ "); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join(" "):"# add dependencies here "; zip.file(folder+"main.py",src||"# "+title+" # Generated by PantheraHive BOS print(title+" loaded") "); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## Run ```bash python main.py ``` "); zip.file(folder+".gitignore",".venv/ __pycache__/ *.pyc .env .DS_Store "); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+" "; zip.file(folder+"package.json",pkgJson); var fallback="const express=require("express"); const app=express(); app.use(express.json()); app.get("/",(req,res)=>{ res.json({message:""+title+" API"}); }); const PORT=process.env.PORT||3000; app.listen(PORT,()=>console.log("Server on port "+PORT)); "; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000 "); zip.file(folder+".gitignore","node_modules/ .env .DS_Store "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash npm install ``` ## Run ```bash npm run dev ``` "); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:" "+title+" "+code+" "; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */ *{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e} "); zip.file(folder+"script.js","/* "+title+" — scripts */ "); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Open Double-click `index.html` in your browser. Or serve locally: ```bash npx serve . # or python3 -m http.server 3000 ``` "); zip.file(folder+".gitignore",".DS_Store node_modules/ .env "); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/**(.+?)**/g,"$1"); hc=hc.replace(/ {2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. Files: - "+app+".md (Markdown) - "+app+".html (styled HTML) "); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); }function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}