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

API Integration Builder: Code Generation for External API Integration (Step 1 of 2)

This document provides a comprehensive, detailed, and professional output for the "Generate Code" step of your API Integration Builder workflow. The goal is to deliver clean, well-commented, and production-ready code that facilitates seamless integration with an external RESTful API.

For this deliverable, we have chosen Python as the programming language due to its versatility, rich ecosystem of libraries, and readability, making it an excellent choice for API integrations. We will demonstrate integration with a conceptual "Product Catalog API" to illustrate common API interaction patterns such as fetching data (GET) and creating new resources (POST).


1. Introduction to the Generated API Integration Code

This output provides a modular and robust Python codebase designed to interact with a typical RESTful API. It emphasizes best practices in API client design, error handling, configuration management, and readability.

The generated code will allow you to:

2. Core Concepts of API Integration

Before diving into the code, it's important to understand the fundamental concepts guiding this integration:

3. Generated Code Overview

The generated solution consists of three main Python files and a requirements.txt file:

  1. config.py: Stores environment-specific configurations like the API base URL and API key.
  2. api_client.py: Contains the core logic for interacting with the external API. This file defines a class (ProductCatalogAPIClient) that encapsulates all API calls, authentication, and basic error handling.
  3. main.py: An example script demonstrating how to use the ProductCatalogAPIClient to perform various operations and print the results.
  4. requirements.txt: Lists all necessary Python packages required to run the integration.

Conceptual Product Catalog API Endpoints:

4. Production-Ready Code

Below is the generated code, structured into its respective files.


requirements.txt

text • 28 chars
---

#### `api_client.py`

Sandboxed live preview

python

import requests

import logging

from typing import Dict, Any, List, Optional

Import configuration settings

from config import API_BASE_URL, API_KEY, LOGGING_LEVEL, LOG_FILE_PATH

--- Configure Logging ---

Create a logger instance

logger = logging.getLogger(__name__)

logger.setLevel(LOGGING_LEVEL)

Create console handler and set level

ch = logging.StreamHandler()

ch.setLevel(LOGGING_LEVEL)

Create file handler and set level

fh = logging.FileHandler(LOG_FILE_PATH)

fh.setLevel(LOGGING_LEVEL)

Create formatter

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

Add formatter to handlers

ch.setFormatter(formatter)

fh.setFormatter(formatter)

Add handlers to logger

if not logger.handlers: # Prevent adding handlers multiple times if module is reloaded

logger.addHandler(ch)

logger.addHandler(fh)

class APIIntegrationError(Exception):

"""Custom exception for API integration-specific errors."""

def __init__(self, message: str, status_code: Optional[int] = None, details: Any = None):

super().__init__(message)

self.status_code = status_code

self.details = details

class ProductCatalogAPIClient:

"""

A client for interacting with the Product Catalog API.

Encapsulates all API calls, authentication, and error handling.

"""

def __init__(self, base_url: str, api_key: str):

"""

Initializes the API client with the base URL and API key.

Args:

base_url (str): The base URL of the Product Catalog API (e.g., "https://api.example.com/v1").

api_key (str): The API key for authentication.

"""

if not base_url:

raise ValueError("API Base URL cannot be empty.")

if not api_key:

raise ValueError("API Key cannot be empty.")

self.base_url = base_url.rstrip('/') # Ensure no trailing slash for consistent URL building

self.api_key = api_key

self.session = requests.Session() # Use a session for connection pooling and persistent headers

self._setup_session_headers()

logger.info(f"ProductCatalogAPIClient initialized for base URL: {self.base_url}")

def _setup_session_headers(self):

"""Sets up common headers for the requests session."""

self.session.headers.update({

"Content-Type": "application/json",

"Accept": "application/json",

"X-API-Key": self.api_key, # Custom header for API Key authentication

"User-Agent": "ProductCatalogIntegration/1.0.0 (Python)"

})

logger.debug("Session headers configured.")

def _make_request(self, method: str, endpoint: str, params: Optional[Dict[str, Any]] = None, json_data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:

"""

Internal helper method to make an HTTP request and handle common responses.

Args:

method (str): The HTTP method (e.g., "GET", "POST").

endpoint (str): The API endpoint (e.g., "/products").

params (Optional[Dict[str, Any]]): Dictionary of URL query parameters.

json_data (Optional[Dict[str, Any]]): Dictionary of JSON data to send in the request body.

Returns:

Dict[str, Any]: The JSON response from the API.

Raises:

APIIntegrationError: If the request fails or returns an error status code.

"""

url = f"{self.base_url}{endpoint}"

logger.debug(f"Making {method} request to: {url} with params: {params}, data: {json_data}")

try:

response = self.session.request(method, url, params=params, json=json_data, timeout=10)

response.raise_for_status() # Raises HTTPError for bad responses (4xx or 5xx)

logger.debug(f"Received successful response (Status: {response.status_code}) from {url}")

# Attempt to parse JSON response. Some successful responses might have no body.

if response.text:

return response.json()

return {} # Return empty dict for responses with no content (e.g., 204 No Content)

except requests.exceptions.HTTPError as e:

status_code = e.response.status_code

error_details = None

try:

error_details = e.response.json()

except requests.exceptions.JSONDecodeError:

error_details = e.response.text # Fallback to raw text if not JSON

logger.error(f"HTTP Error {status_code} for {method} {url}: {error_details}")

raise APIIntegrationError(

f"API request failed with status {status_code}",

status_code=status_code,

details=error_details

) from e

except requests.exceptions.ConnectionError as e:

logger.error(f"Connection Error for {method} {url}: {e}")

raise APIIntegrationError(f"Failed to connect to the API: {e}", details=str(e)) from e

except requests.exceptions.Timeout as e:

logger.error(f"Timeout Error for {method} {url}: {e}")

raise APIIntegrationError(f"API request timed out: {e}", details=str(e)) from e

except requests.exceptions.RequestException as e:

logger.error(f"An unexpected Request Error occurred for {method} {url}: {e}")

raise APIIntegrationError(f"An unexpected request error occurred: {e}", details=str(e)) from e

except Exception as e:

logger.critical(f"An unhandled error occurred during API request for {method} {url}: {e}")

raise APIIntegrationError(f"An unknown error occurred: {e}", details=str(e)) from e

def get_products(self, limit: int = 10, skip: int = 0) -> List[Dict[str, Any]]:

"""

Retrieves a list of products from the API.

Args:

limit (int): The maximum number of products to return (default: 10).

skip (int): The number of products to skip for pagination (default: 0).

Returns:

List[Dict[str, Any]]: A list of product dictionaries.

"""

endpoint = "/products"

params = {"limit": limit, "skip": skip}

logger.info(f"Fetching products with limit={limit}, skip={skip}")

response_data = self._make_request("GET", endpoint, params=params)

return response_data.get("products", []) # Assuming the API returns a 'products' key

def get_product_by_id(self, product_id: str) -> Dict[str, Any]:

"""

Retrieves a single product by its ID.

Args:

product_id (str): The unique identifier of the product.

Returns:

Dict[str, Any]: The product dictionary.

Raises:

APIIntegrationError: If the product is not found or other API error occurs.

"""

if not product_id:

raise ValueError("Product ID cannot be empty.")

endpoint = f"/products/{product_id}"

logger.info(f"Fetching product with ID: {product_id}")

return self._make_request("GET", endpoint)

def create_product(self, product_data: Dict[str, Any]) -> Dict[str, Any]:

"""

Creates a new product in the API.

Args:

product_data (Dict[str, Any]): A dictionary containing the product details.

Example: {"name": "New Widget", "price": 29.99, "category": "Electronics"}

Returns:

Dict[str, Any]: The newly created product object, including its ID.

"""

if not product_data:

raise ValueError("Product data cannot be empty for creation.")

endpoint = "/products"

logger.info(f"Creating new product with data: {product_data}")

return self._make_request("POST", endpoint, json_data=product_data)

# You can add more methods here for other API operations (e.g., update_product, delete_product)

# def update_product(self, product_id: str, product_data: Dict[str, Any]) -> Dict[str, Any]:

# endpoint = f"/products/{product_id}"

# return self._make_request("PUT", endpoint, json_data=product_data)

# def delete_product(self, product_id: str) -> None:

# endpoint = f"/products/{product_id}"

# self._make_

projectmanager Output

API Integration Builder - Project Creation (projectmanager → create_project)

Workflow Step: 2 of 2

This deliverable provides a comprehensive guide and code examples for integrating with an external Project Management System (PMS) API to programmatically create new projects. This is a critical step in automating project initiation workflows, ensuring consistency and reducing manual effort.


1. Overview of Project Creation API Integration

The goal of this integration is to enable your system to interact with a third-party Project Management System (e.g., Jira, Asana, Trello, Monday.com, custom internal PMS) and create a new project entry through its API. This involves sending a structured request with project details and handling the system's response.

Key Objectives:

  • Programmatic Project Creation: Automatically initiate projects in the PMS based on triggers from your internal systems.
  • Data Consistency: Ensure all required project attributes are accurately transferred.
  • Workflow Automation: Reduce manual data entry and streamline the project setup process.

2. Essential API Integration Components for create_project

To successfully create a project via an external API, the following components are typically required:

2.1. API Endpoint Structure

  • Method: POST
  • URL: This will be specific to the PMS API. It usually follows a pattern like:

* https://api.externalpms.com/v1/projects

* https://your-pms-instance.com/api/projects

Example:* For a hypothetical PMS, it might be https://api.projectmanagerpro.com/v2/workspaces/{workspace_id}/projects

2.2. Request Payload (JSON Body)

The POST request will typically carry a JSON payload containing all the necessary details for the new project. Common fields include:

  • name (string, required): The title or name of the project.
  • description (string, optional): A detailed description of the project.
  • startDate (string, optional): The planned start date of the project (e.g., "YYYY-MM-DD").
  • endDate (string, optional): The planned end date of the project (e.g., "YYYY-MM-DD").
  • ownerId / managerId (string, optional): The ID of the user responsible for the project.
  • status (string, optional): Initial status of the project (e.g., "Active", "Planning", "On Hold").
  • teamMembers (array of strings, optional): IDs of initial team members.
  • customFields (object, optional): Any additional custom fields defined in the PMS.

Example JSON Request Body:


{
  "name": "PantheraHive Q3 Marketing Campaign",
  "description": "Develop and launch a comprehensive marketing campaign for Q3 product releases.",
  "startDate": "2023-07-01",
  "endDate": "2023-09-30",
  "ownerId": "usr_abc123def456",
  "status": "Planning",
  "teamMembers": [
    "usr_abc123def456",
    "usr_ghi789jkl012"
  ],
  "customFields": {
    "budget_allocated": 75000,
    "priority": "High"
  }
}

2.3. Authentication

Secure access to the API is paramount. Common authentication methods include:

  • API Key: A unique key passed in the request header or as a query parameter.

Header Example:* Authorization: Api-Key YOUR_API_KEY

  • Bearer Token (OAuth 2.0): An access token obtained through an OAuth flow, typically passed in the Authorization header.

Header Example:* Authorization: Bearer YOUR_ACCESS_TOKEN

  • Basic Authentication: Username and password encoded and passed in the Authorization header.

Recommendation: Use environment variables or a secure configuration management system to store API keys and tokens, never hardcode them directly into your application.

2.4. Response Handling

After sending the request, your system must handle the API's response:

  • Success (HTTP Status 200 OK / 201 Created):

* The API will typically return a JSON object containing the newly created project's details, including its unique ID (projectId).

Example Response:*


        {
          "id": "proj_xyz789abc012",
          "name": "PantheraHive Q3 Marketing Campaign",
          "description": "...",
          "status": "Planning",
          "createdAt": "2023-06-15T10:00:00Z"
        }
  • Error (HTTP Status 4xx / 5xx):

* 400 Bad Request: Invalid request payload (e.g., missing required fields, incorrect data types).

* 401 Unauthorized: Missing or invalid authentication credentials.

* 403 Forbidden: Authenticated but not authorized to perform the action.

* 404 Not Found: The endpoint or a referenced resource (e.g., workspace_id) does not exist.

* 429 Too Many Requests: Rate limit exceeded.

* 500 Internal Server Error: An unexpected error on the PMS server.

Error responses usually include a JSON body with an error message and/or code for debugging.*


3. Code Implementation Example (Python)

This example demonstrates how to integrate with a hypothetical Project Management System API using Python's requests library.

3.1. Prerequisites

  • Python 3.x
  • requests library: Install via pip install requests

3.2. Configuration

Store your API details securely. For this example, we'll use placeholder variables.


import requests
import os
import json

# --- Configuration ---
# Base URL for the external Project Management System API
PMS_API_BASE_URL = os.getenv("PMS_API_BASE_URL", "https://api.projectmanagerpro.com/v2")

# Your API Key or Bearer Token (securely retrieved from environment variables)
# Example for API Key:
PMS_API_KEY = os.getenv("PMS_API_KEY", "YOUR_SECURE_API_KEY_HERE")
# Example for Bearer Token:
# PMS_BEARER_TOKEN = os.getenv("PMS_BEARER_TOKEN", "YOUR_SECURE_BEARER_TOKEN_HERE")

# Identifier for the workspace/organization where projects should be created
# This might be needed in the URL or payload, depending on the API.
WORKSPACE_ID = os.getenv("PMS_WORKSPACE_ID", "your_workspace_id_example")

3.3. Project Creation Function


def create_project(project_data: dict) -> dict:
    """
    Creates a new project in the external Project Management System.

    Args:
        project_data (dict): A dictionary containing the project's details.
                             Example: {
                                "name": "New Project",
                                "description": "...",
                                "startDate": "YYYY-MM-DD",
                                "ownerId": "usr_id"
                             }

    Returns:
        dict: A dictionary containing the newly created project's ID and details
              on success, or an error dictionary on failure.
    """
    endpoint = f"{PMS_API_BASE_URL}/workspaces/{WORKSPACE_ID}/projects"
    
    headers = {
        "Content-Type": "application/json",
        # Use either API Key or Bearer Token based on your PMS API
        "Authorization": f"Api-Key {PMS_API_KEY}" # For API Key authentication
        # "Authorization": f"Bearer {PMS_BEARER_TOKEN}" # For Bearer Token authentication
    }

    try:
        print(f"Attempting to create project: {project_data.get('name')}...")
        response = requests.post(endpoint, headers=headers, json=project_data, timeout=10)
        response.raise_for_status()  # Raise an HTTPError for bad responses (4xx or 5xx)

        response_json = response.json()
        print(f"Project '{project_data.get('name')}' created successfully!")
        print(f"New Project ID: {response_json.get('id')}")
        return {
            "status": "success",
            "project_id": response_json.get('id'),
            "details": response_json
        }

    except requests.exceptions.HTTPError as http_err:
        print(f"HTTP error occurred: {http_err}")
        print(f"Response Status Code: {response.status_code}")
        try:
            error_details = response.json()
            print(f"Error Details: {json.dumps(error_details, indent=2)}")
            return {
                "status": "error",
                "message": f"API responded with status {response.status_code}: {error_details.get('message', 'No specific message provided.')}",
                "details": error_details,
                "status_code": response.status_code
            }
        except json.JSONDecodeError:
            print(f"Could not parse error response as JSON: {response.text}")
            return {
                "status": "error",
                "message": f"API responded with status {response.status_code}. Raw response: {response.text}",
                "status_code": response.status_code
            }
    except requests.exceptions.ConnectionError as conn_err:
        print(f"Connection error occurred: {conn_err}")
        return {
            "status": "error",
            "message": f"Network connection error: {conn_err}"
        }
    except requests.exceptions.Timeout as timeout_err:
        print(f"Request timed out: {timeout_err}")
        return {
            "status": "error",
            "message": f"Request to PMS API timed out: {timeout_err}"
        }
    except requests.exceptions.RequestException as req_err:
        print(f"An unexpected request error occurred: {req_err}")
        return {
            "status": "error",
            "message": f"An unexpected error occurred during the API request: {req_err}"
        }
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
        return {
            "status": "error",
            "message": f"An unforeseen error occurred: {e}"
        }

3.4. Example Usage


if __name__ == "__main__":
    # Example project data
    new_project_data = {
        "name": "PantheraHive AI Integration Phase 1",
        "description": "Initiate the first phase of AI integration across core PantheraHive services.",
        "startDate": "2023-08-01",
        "endDate": "2023-12-31",
        "ownerId": "
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);}});}