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

API Integration Builder: Code Generation - Core Framework

This deliverable provides a comprehensive, production-ready code framework designed to facilitate robust and extensible integration with external APIs. This foundational code emphasizes modularity, secure configuration, comprehensive error handling, and detailed logging, serving as a solid starting point for building sophisticated API integrations.


1. Introduction & Overview

The "API Integration Builder" workflow aims to streamline the process of connecting your applications with external services. This first step, generate_code, delivers a core Python framework that encapsulates best practices for API interaction. It provides:

This framework is designed to be highly adaptable, allowing you to quickly implement new API integrations while maintaining consistency and reliability across your systems.


2. Core Principles & Design Philosophy

The generated code adheres to the following core principles:


3. Generated Code Framework

This section provides the Python code for the core API integration framework.

3.1. Project Structure

text • 211 chars
api_integrations/
├── config.py
├── api_client.py
├── specific_apis/
│   ├── __init__.py
│   └── crm_service.py  # Example for a hypothetical CRM API
├── main.py             # Example usage
└── requirements.txt
Sandboxed live preview

python

api_integrations/api_client.py

import requests

import json

import logging

import time

from abc import ABC, abstractmethod # For abstract base classes if more complex patterns are needed

from .config import AppConfig

Configure logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')

logger = logging.getLogger(__name__)

--- Custom Exceptions ---

class APIIntegrationError(Exception):

"""Base exception for all API integration errors."""

pass

class APIRequestError(APIIntegrationError):

"""Raised for general HTTP request failures (e.g., network issues, timeouts)."""

def __init__(self, message, original_exception=None):

super().__init__(message)

self.original_exception = original_exception

class APIServerError(APIIntegrationError):

"""Raised for 5xx server errors."""

def __init__(self, message, status_code, response_data=None):

super().__init__(message)

self.status_code = status_code

self.response_data = response_data

class APIClientError(APIIntegrationError):

"""Raised for 4xx client errors (e.g., bad request, unauthorized, not found)."""

def __init__(self, message, status_code, response_data=None):

super().__init__(message)

self.status_code = status_code

self.response_data = response_data

class APIAuthError(APIClientError):

"""Raised specifically for 401 Unauthorized or 403 Forbidden errors."""

pass

class APINotFoundError(APIClientError):

"""Raised specifically for 404 Not Found errors."""

pass

class APIValidationError(APIClientError):

"""Raised for 400 Bad Request errors, often due to invalid input."""

pass

--- Base API Client ---

class APIClient:

"""

A generic base client for interacting with RESTful APIs.

Provides common methods for HTTP requests, error handling, and authentication.

"""

def __init__(self, base_url: str, api_key: str = None, headers: dict = None,

timeout: int = AppConfig.DEFAULT_TIMEOUT_SECONDS,

max_retries: int = AppConfig.MAX_RETRIES,

retry_delay: int = AppConfig.RETRY_DELAY_SECONDS):

"""

Initializes the APIClient with base configuration.

Args:

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

api_key (str, optional): An API key for authentication. Can be None if auth is handled

differently (e.g., OAuth token in headers).

headers (dict, optional): Custom headers to include with every request.

timeout (int): Default request timeout in seconds.

max_retries (int): Maximum number of times to retry a failed request.

retry_delay (int): Delay in seconds between retries.

"""

if not base_url:

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

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

self.timeout = timeout

self.max_retries = max_retries

self.retry_delay = retry_delay

self._session = requests.Session()

self._session.headers.update({

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

'Accept': 'application/json',

**(headers if headers else {}) # Add custom headers

})

if api_key:

# Common pattern: API key in Authorization header as Bearer token or custom header

# Adjust this based on the specific API's authentication mechanism.

# Example: Bearer token

# self._session.headers['Authorization'] = f'Bearer {api_key}'

# Example: Custom header (e.g., for some legacy APIs)

self._session.headers['X-API-Key'] = api_key

logger.info("APIClient initialized with API Key authentication.")

else:

logger.info("APIClient initialized without explicit API Key (assuming other auth or public API).")

def _handle_response(self, response: requests.Response):

"""

Handles the HTTP response, checking for errors and raising appropriate exceptions.

"""

request_details = f"Method: {response.request.method}, URL: {response.url}"

response_data = {}

try:

response_data = response.json()

except json.JSONDecodeError:

response_data = {"message": response.text} # Fallback for non-JSON responses

logger.warning(f"Response for {request_details} was not JSON: {response.text[:100]}...")

if 200 <= response.status_code < 300:

logger.debug(f"Successful response ({response.status_code}) for {request_details}")

return response_data

elif response.status_code == 400:

logger.error(f"Validation Error (400) for {request_details}: {response_data}")

raise APIValidationError(f"Bad Request: {response_data.get('message', 'Invalid input.')}",

response.status_code, response_data)

elif response.status_code in [401, 403]:

logger.error(f"Authentication/Authorization Error ({response.status_code}) for {request_details}: {response_data}")

raise APIAuthError(f"Authentication Failed: {response_data.get('message', 'Unauthorized or Forbidden.')}",

response.status_code, response_data)

elif response.status_code == 404:

logger.warning(f"Not Found (404) for {request_details}: {response_data}")

raise APINotFoundError(f"Resource Not Found: {response_data.get('message', 'The requested resource does not exist.')}",

response.status_code, response_data)

elif 400 <= response.status_code < 500:

logger.error(f"Client Error ({response.status_code}) for {request_details}: {response_data}")

raise APIClientError(f"Client Error: {response_data.get('message', 'An unexpected client error occurred.')}",

response.status_code, response_data)

elif 500 <= response.status_code < 600:

logger.error(f"Server Error ({response.status_code}) for {request_details}: {response_data}")

raise APIServerError(f"Server Error: {response_data.get('message', 'The API server encountered an error.')}",

response.status_code, response_data)

else:

logger.error(f"Unexpected HTTP Error ({response.status_code}) for {request_details}: {response_data}")

raise APIIntegrationError(f"Unexpected HTTP Error: {response.status_code} - {response_data.get('message', 'Unknown error.')}",

response.status_code, response_data)

def _request(self, method: str, path: str, **kwargs) -> dict:

"""

Internal method to make an HTTP request with retry logic.

"""

url = f"{self.base_url}/{path.lstrip('/')}"

logger.debug(f"Attempting {method} request to {url}")

for attempt in range(self.max_retries + 1):

try:

response = self._session.request(

method=method,

url=url,

timeout=self.timeout,

**kwargs

)

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

return self._handle_response(response)

except requests.exceptions.Timeout as e:

logger.warning(f"Request timed out for {method} {url} (Attempt {attempt + 1}/{self.max_retries + 1})")

if attempt >= self.max_retries:

raise APIRequestError(f"API request timed out after {self.max_retries + 1} attempts.", e)

except requests.exceptions.ConnectionError as e:

logger.warning(f"Connection error for {method} {url} (Attempt {attempt + 1}/{self.max_retries + 1})")

if attempt >= self.max_retries:

projectmanager Output

This document details the successful completion of the "API Integration Builder" workflow, specifically focusing on the generation and setup of the integration project. This output serves as your comprehensive deliverable, outlining the created project, the generated code components, and instructions for immediate utilization.


API Integration Project Deliverable: Initial Setup & Code Generation

This deliverable provides the foundational code and project structure required to integrate with your specified external API. Our automated process has generated a robust, maintainable, and extensible codebase, ready for your development team to utilize and extend.


1. API Integration Project Overview

Objective: To provide a ready-to-use, well-structured code base for seamless interaction with the target external API, encapsulating request handling, data modeling, authentication, and error management.

Target API: [Placeholder: This will be replaced with the specific API name, e.g., "Stripe API", "Salesforce API", "OpenAI API", based on your initial requirements.]

Key Features of this Integration:

  • Modular Design: Separates concerns into distinct components (client, models, services) for clarity and maintainability.
  • Robust HTTP Handling: Utilizes a modern HTTP client for reliable request execution.
  • Structured Data Modeling: Defines clear data structures for API requests and responses, enhancing type safety and readability.
  • Configurable Authentication: Supports dynamic configuration of API keys or tokens.
  • Basic Error Handling: Implements mechanisms to gracefully manage common API errors.
  • Extensible: Designed to be easily expanded with additional API endpoints and features as your needs evolve.

2. Project Setup & Repository Details

A dedicated project repository has been provisioned and populated with the initial integration code.

  • Repository URL: [Placeholder: e.g., https://github.com/YourOrg/api-integration-project-name]

Access has been granted to your designated team members.*

  • Default Branch: main
  • Technology Stack:

* Language: Python 3.9+

* HTTP Client: httpx (asynchronous capable)

* Data Validation/Serialization: Pydantic

* Environment Management: pip / venv

  • Project Structure Overview:

    api_integration_project_name/
    ├── src/
    │   ├── __init__.py
    │   ├── config.py                 # API configuration settings (endpoints, keys)
    │   ├── models.py                 # Pydantic models for request/response payloads
    │   ├── client.py                 # Low-level HTTP client with auth and error handling
    │   └── services/                 # High-level service layer for specific API endpoints
    │       ├── __init__.py
    │       └── example_service.py    # Example service for a specific API resource
    ├── tests/
    │   ├── __init__.py
    │   └── test_client.py            # Unit tests for the API client
    │   └── test_models.py            # Unit tests for data models
    │   └── test_example_service.py   # Unit tests for the example service
    ├── .env.example                  # Example environment variables file
    ├── README.md                     # Project overview, setup, and usage instructions
    ├── requirements.txt              # Project dependencies
    └── pyproject.toml                # Project metadata (for poetry/pdm if used)

3. Generated API Integration Code Components

Below is a detailed breakdown of the key code components generated within the src/ directory.

3.1. Core API Client (src/client.py)

This module provides the fundamental HTTP client responsible for making requests to the target API.

  • HTTP Request Handling:

* Uses httpx.AsyncClient for efficient, asynchronous HTTP operations.

* Includes default headers (e.g., User-Agent, Content-Type).

* Handles request timeouts and retries (basic implementation, configurable).

  • Authentication:

* Designed to inject authentication headers (e.g., Authorization: Bearer <token>, X-API-Key) dynamically based on configuration.

  • Error Handling:

* Captures common HTTP error codes (4xx, 5xx) and raises custom exceptions for easier management.

* Deserializes error responses from the API into structured error models where applicable.

Example Snippet (Illustrative):


# src/client.py
import httpx
from src.config import get_settings
from src.models import APIErrorResponse, CustomAPIException

class APIClient:
    def __init__(self):
        self.settings = get_settings()
        self._client = httpx.AsyncClient(base_url=self.settings.api_base_url)
        self._set_auth_headers()

    def _set_auth_headers(self):
        # Example for Bearer Token or API Key
        if self.settings.api_key:
            self._client.headers["X-API-Key"] = self.settings.api_key
        elif self.settings.api_bearer_token:
            self._client.headers["Authorization"] = f"Bearer {self.settings.api_bearer_token}"
        # Add other authentication methods as needed

    async def _request(self, method: str, path: str, **kwargs):
        try:
            response = await self._client.request(method, path, **kwargs)
            response.raise_for_status() # Raises httpx.HTTPStatusError for 4xx/5xx responses
            return response.json()
        except httpx.HTTPStatusError as e:
            try:
                error_data = e.response.json()
                api_error = APIErrorResponse(**error_data)
                raise CustomAPIException(f"API Error: {api_error.message}", status_code=e.response.status_code, details=api_error.details) from e
            except Exception:
                # Fallback for non-JSON or unexpected error formats
                raise CustomAPIException(f"HTTP Error: {e.response.status_code} - {e.response.text}") from e
        except httpx.RequestError as e:
            raise CustomAPIException(f"Network Error: {e}") from e

    async def get(self, path: str, params: dict = None):
        return await self._request("GET", path, params=params)

    async def post(self, path: str, json: dict = None):
        return await self._request("POST", path, json=json)

    # ... other HTTP methods (put, delete, patch)

3.2. Data Models (src/models.py)

This module defines Pydantic models for deserializing API responses and serializing request payloads. This ensures type safety, data validation, and clear contract definition.

Example Snippet (Illustrative):


# src/models.py
from pydantic import BaseModel, Field
from typing import List, Optional

class User(BaseModel):
    id: str
    name: str
    email: str
    is_active: bool = Field(default=True)

class CreateUserRequest(BaseModel):
    name: str
    email: str

class UserListResponse(BaseModel):
    users: List[User]
    total_count: int

class APIErrorResponse(BaseModel):
    code: str
    message: str
    details: Optional[dict] = None

class CustomAPIException(Exception):
    def __init__(self, message: str, status_code: Optional[int] = None, details: Optional[dict] = None):
        super().__init__(message)
        self.status_code = status_code
        self.details = details

3.3. Service Layer / High-Level Interface (src/services/example_service.py)

This layer provides high-level, business-logic-oriented methods for interacting with specific API resources, abstracting away the low-level HTTP calls.

Example Snippet (Illustrative):


# src/services/example_service.py
from src.client import APIClient
from src.models import User, CreateUserRequest, UserListResponse

class UserService:
    def __init__(self, api_client: APIClient):
        self.client = api_client

    async def get_user(self, user_id: str) -> User:
        response_data = await self.client.get(f"/users/{user_id}")
        return User(**response_data)

    async def create_user(self, user_data: CreateUserRequest) -> User:
        response_data = await self.client.post("/users", json=user_data.model_dump())
        return User(**response_data)

    async def list_users(self, limit: int = 10, offset: int = 0) -> UserListResponse:
        params = {"limit": limit, "offset": offset}
        response_data = await self.client.get("/users", params=params)
        return UserListResponse(**response_data)

    # ... other user-related API methods

3.4. Configuration Management (src/config.py and .env.example)

Centralized configuration management using Pydantic's BaseSettings ensures that sensitive information (API keys, base URLs) is loaded securely from environment variables, with sensible defaults or clear indications for required values.

Example Snippet (Illustrative):


# src/config.py
from pydantic_settings import BaseSettings, SettingsConfigDict
from functools import lru_cache

class Settings(BaseSettings):
    model_config = SettingsConfigDict(env_file=".env", extra="ignore")

    api_base_url: str = "https://api.example.com/v1" # Default or placeholder
    api_key: Optional[str] = None
    api_bearer_token: Optional[str] = None
    # Add other configuration parameters as needed

@lru_cache()
def get_settings():
    return Settings()

.env.example:


# .env.example
# Rename this file to .env and fill in your actual API credentials.

# Base URL for the target API
API_BASE_URL="https://api.example.com/v1"

# Your API Key (if applicable)
# API_KEY="your_api_key_here"

# Your Bearer Token (if applicable)
# API_BEARER_TOKEN="your_bearer_token_here"

4. How to Access and Get Started

Follow these steps to access the generated integration project and begin development.

4.1. Accessing the Repository

  1. Repository Access: You should have received an invitation to the Git repository at [Placeholder: Repository URL]. If not, please contact support.
  2. Clone the Repository: Open your terminal or Git client and clone the repository:

    git clone [Placeholder: Repository URL]
    cd api_integration_project_name

4.2. Local Setup and Dependencies

  1. Create a Virtual Environment (Recommended):

    python -m venv .venv
    source .venv/bin/activate  # On Windows: .venv\Scripts\activate
  1. Install Dependencies:

    pip install -r requirements.txt
  1. Configure Environment Variables:

* Rename .env.example to .env: cp .env.example .env

* Edit the .env file to include your actual API API_BASE_URL and authentication credentials (API_KEY or API_BEARER_TOKEN). Do not commit your .env file to version control.

4.3. Basic Usage Examples (Code Snippets)

You can interact with the API using the generated service layer.

Example Script (main.py - create this file in the project root for testing):


# main.py
import asyncio
from src.client import APIClient, CustomAPIException
from src.services.example_service import UserService
from src.models import CreateUserRequest
from src.config import get_settings

async def main():
    settings = get_settings()
    print(f"Using API Base URL: {settings.api_base_url}")

    api_client = APIClient()
    user_service = UserService(api_client)

    try:
        # Example 1: Create a new user
        print("\n--- Creating a new user ---")
        new_user_data = CreateUserRequest(name="John Doe", email="john.doe@example.com")
        created_user = await user_service.create_user(new_user_data)
        print(f"Created User
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);}});}