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

Project: API Integration Builder

Step 1 of 2: Generate Code for API Integration (collab → generate_code)

This document provides a comprehensive, professional, and production-ready code template for integrating with external RESTful APIs. It is designed to be highly customizable and includes best practices for robustness, error handling, and maintainability.


1. Overview

This deliverable focuses on generating the foundational code for interacting with an external API. We've chosen Python due to its widespread adoption in backend and integration tasks, coupled with the requests library, which is the de-facto standard for HTTP communication. The provided code demonstrates a robust client for a typical RESTful API, covering common operations like GET, POST, PUT, and DELETE, along with essential features such as error handling, retries, and logging.

Key Deliverables:


2. Core Principles for Robust API Integration

Before diving into the code, it's crucial to understand the principles that underpin reliable API integrations:


3. Example: Python API Client for a RESTful Service (JSONPlaceholder)

For this example, we'll build a client for [JSONPlaceholder](https://jsonplaceholder.typicode.com/), a free online REST API that provides fake data for testing and prototyping. This allows us to demonstrate a full range of API interactions without requiring actual credentials or an external service setup.

3.1. Overview of the Example

3.2. Prerequisites

Before running the code, ensure you have Python installed and the necessary libraries:

text • 41 chars
#### 3.3. Python Code: `api_client.py`

Sandboxed live preview

python

import requests

import logging

import os

from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type

--- Configuration ---

It's best practice to load sensitive or environment-specific configuration

from environment variables or a dedicated configuration management system.

BASE_URL = os.getenv("API_BASE_URL", "https://jsonplaceholder.typicode.com")

API_KEY = os.getenv("API_KEY", "YOUR_API_KEY_HERE") # Replace with actual API key if needed

AUTH_TOKEN = os.getenv("AUTH_TOKEN", "YOUR_BEARER_TOKEN_HERE") # Replace with actual token if using Bearer Auth

--- Logging Setup ---

Configure logging to output to console and/or file

logging.basicConfig(

level=logging.INFO,

format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',

handlers=[

logging.StreamHandler(), # Output to console

# logging.FileHandler("api_client.log") # Uncomment to also log to a file

]

)

logger = logging.getLogger(__name__)

--- Custom Exception for API Errors ---

class APIError(Exception):

"""Custom exception for API-related errors."""

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

super().__init__(message)

self.status_code = status_code

self.response_data = response_data

logger.error(f"API Error: {message} | Status: {status_code} | Response: {response_data}")

--- API Client Class ---

class APIClient:

"""

A robust and reusable client for interacting with a RESTful API.

Handles common HTTP methods, authentication, error handling, and retries.

"""

def __init__(self, base_url: str, api_key: str = None, auth_token: str = None,

default_headers: dict = None, timeout: int = 30):

"""

Initializes the APIClient.

Args:

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

api_key (str, optional): An API key for authentication. Defaults to None.

auth_token (str, optional): A Bearer token for authentication. Defaults to None.

default_headers (dict, optional): Default headers to send with every request.

Defaults to {'Content-Type': 'application/json'}.

timeout (int, optional): Default request timeout in seconds. Defaults to 30.

"""

self.base_url = base_url

self.timeout = timeout

self.session = requests.Session() # Use a session for connection pooling and cookie persistence

self.headers = {

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

'Accept': 'application/json'

}

if default_headers:

self.headers.update(default_headers)

if api_key:

# Example: API Key in a custom header

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

logger.info("API Key configured for authentication.")

if auth_token:

# Example: Bearer Token in Authorization header

self.headers['Authorization'] = f'Bearer {auth_token}'

logger.info("Bearer Token configured for authentication.")

self.session.headers.update(self.headers)

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

@retry(

wait=wait_exponential(multiplier=1, min=4, max=10), # Wait 2^x * multiplier seconds between retries

stop=stop_after_attempt(5), # Stop after 5 attempts

retry=retry_if_exception_type(

(requests.exceptions.ConnectionError, requests.exceptions.Timeout)

),

reraise=True # Re-raise the last exception if all retries fail

)

def _request(self, method: str, endpoint: str, params: dict = None, data=None, json=None,

headers: dict = None, **kwargs):

"""

Internal helper method to make an HTTP request with retry logic.

Args:

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

endpoint (str): The API endpoint (e.g., '/posts').

params (dict, optional): Dictionary of query parameters.

data: Request body for POST/PUT (e.g., form data).

json: Request body for POST/PUT (e.g., JSON data).

headers (dict, optional): Additional headers for this specific request.

**kwargs: Additional arguments to pass to requests.request().

Returns:

requests.Response: The HTTP response object.

Raises:

APIError: If the API returns an error status code (4xx, 5xx).

requests.exceptions.RequestException: For network-related issues after retries.

"""

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

request_headers = self.session.headers.copy()

if headers:

request_headers.update(headers)

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

logger.debug(f"Headers: {request_headers}")

logger.debug(f"Params: {params}")

logger.debug(f"JSON data: {json}")

logger.debug(f"Form data: {data}")

try:

response = self.session.request(

method,

url,

params=params,

data=data,

json=json,

headers=request_headers,

timeout=self.timeout,

**kwargs

)

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

logger.info(f"Successfully {method} request to {endpoint}. Status: {response.status_code}")

return response

except requests.exceptions.HTTPError as e:

status_code = e.response.status_code

response_data = e.response.json() if e.response.headers.get('Content-Type') == 'application/json' else e.response.text

message = f"API request failed with status {status_code} for {url}"

if status_code == 401:

message = "Authentication failed. Check your API key/token."

elif status_code == 403:

message = "Authorization failed. You do not have permission."

elif status_code == 404:

message = "Resource not found."

elif status_code == 429:

message = "Rate limit exceeded. Please try again later."

# Optionally, implement a delay here based on 'Retry-After' header

raise APIError(message, status_code, response_data) from e

except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:

logger.warning(f"Network error or timeout during request to {url}: {e}. Retrying...")

raise # tenacity will catch this and retry

except requests.exceptions.RequestException as e:

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

def get(self, endpoint: str, params: dict = None, headers: dict = None) -> dict:

"""Sends a GET request."""

response = self._request('GET', endpoint, params=params, headers=headers)

return response.json()

def post(self, endpoint: str, data=None, json=None, headers: dict = None) -> dict:

"""Sends a POST request."""

response = self._request('POST', endpoint, data=data, json=json, headers=headers)

return response.json()

def put(self, endpoint: str, data=None, json=None, headers: dict = None) -> dict:

"""Sends a PUT request."""

response = self._request('PUT', endpoint, data=data, json=json, headers=headers)

return response.json()

def delete(self, endpoint: str, headers: dict = None) -> dict:

"""Sends a DELETE request."""

response = self._request('DELETE', endpoint, headers=headers)

# DELETE often returns empty body or a simple confirmation message

return {} if not response.content else response.json()

--- Example Usage ---

if __name__ == "__main__":

# Initialize the client (using environment variables for configuration)

# For demonstration, we'll pass directly if env vars are not set

client = APIClient(

base_url=BASE_URL,

api_key=API_KEY if API_KEY != "YOUR_API_KEY_HERE" else None,

auth_token=AUTH_TOKEN if AUTH_TOKEN != "YOUR_BEARER_TOKEN_HERE" else None

)

print("\n--- Testing API Client ---")

# 1. GET Request: Fetch all posts

print("\n--- GET /posts ---")

try:

posts = client.get("/posts")

print(f"Fetched {len(posts)} posts. First post title: {posts[0]['title']}")

except APIError as e:

print(f"Error fetching posts: {e}")

except Exception as e:

print(f"An unexpected error occurred: {e}")

# 2. GET Request: Fetch a single post

print("\n--- GET /posts/1 ---")

try:

single_post = client.get("/posts/1")

print(f"Fetched post 1: {single_post['

projectmanager Output

API Integration Project Initiation: [External API Name] Integration

This document outlines the foundational steps and key considerations for initiating a new project focused on integrating with an external API. This deliverable serves as the project definition and setup guide, ensuring a structured approach to development, testing, and deployment.


1. Project Overview

  • Project Name: [Your Internal System Name] - [External API Name] Integration
  • Project ID: [Auto-generated Project ID, e.g., P-API-001]
  • Objective: To seamlessly integrate [Your Internal System Name] with [External API Name] to enable [specific business functionality, e.g., real-time data synchronization, automated task execution, enhanced user experience].
  • Scope:

* In-Scope:

* Design and development of a robust, scalable, and secure integration layer.

* Implementation of [Number] key API endpoints: [List specific endpoints, e.g., User Management, Order Creation, Data Retrieval].

* Data mapping and transformation between [Your Internal System Name] and [External API Name] data models.

* Comprehensive error handling, retry mechanisms, and logging.

* Unit, integration, and end-to-end testing of the integration.

* Deployment to development, staging, and production environments.

* Monitoring and alerting setup for integration health.

* Out-of-Scope:

* Significant modifications to core [Your Internal System Name] business logic unrelated to this integration.

* Integration with other external APIs not specified.

* Development of a new user interface unless directly required for integration management.

  • Key Deliverables:

* Detailed API Integration Design Document.

* Functional, tested, and deployable integration code.

* Automated test suite for the integration.

* Deployment scripts and configuration.

* Operational monitoring dashboards and alerts.

* Technical documentation (API usage, setup guides, troubleshooting).

  • Success Criteria:

* Successful execution of [Number] key transactions/data flows per day/hour.

* Average response time for API calls below [X] milliseconds.

* Error rate for API calls below [Y]%.

* Seamless data consistency between systems as per defined SLAs.

* Positive feedback from stakeholders on new functionality enabled by the integration.


2. External API Details

  • API Provider: [Name of the company/service providing the API]
  • API Name: [Specific name of the API, e.g., Stripe Payments API, Salesforce CRM API]
  • API Documentation Link: [URL to the official API documentation]
  • Key Endpoints for Integration:

* [Endpoint 1 URL/Purpose, e.g., GET /users - retrieve user profiles]

* [Endpoint 2 URL/Purpose, e.g., POST /orders - create new orders]

* [Endpoint 3 URL/Purpose, e.g., PUT /products/{id} - update product details]

(Add more as needed)*

  • Authentication Method: [e.g., OAuth 2.0, API Key, JWT, Basic Auth]

Details:* [Specific grant types, token endpoints, key management considerations]

  • Rate Limits: [e.g., 100 requests/minute, 10,000 requests/day]
  • Data Formats: [e.g., JSON, XML]

3. Integration Requirements & Strategy

  • Integration Type: [e.g., Real-time, Batch, Event-driven]
  • Data Flow: [e.g., Unidirectional (Your System -> External API), Bidirectional]
  • Target Systems/Applications:

* [Your Internal System Name] (Source/Target)

* [Specific module/service within your system]

  • Error Handling Strategy:

* Robust retry mechanisms for transient errors (e.g., network issues, rate limits).

* Dead-letter queue (DLQ) or equivalent for persistent failures.

* Clear error logging with contextual information.

* Alerting for critical integration failures.

  • Data Mapping:

* Definition of required data transformations from [Your System's Data Model] to [External API's Data Model] and vice versa.

* Identification of unique identifiers for record reconciliation.

  • Scalability & Performance:

* Design for high concurrency and throughput.

* Caching strategies where appropriate (e.g., for static reference data).

* Asynchronous processing for long-running operations.

  • Security Requirements:

* Secure storage and retrieval of API credentials (e.g., environment variables, secret management service).

* Data encryption in transit (HTTPS/TLS).

* Input validation and sanitization.

* Principle of Least Privilege for API access.

  • Monitoring & Observability:

* Key metrics to track (e.g., API call volume, success/failure rates, latency).

* Centralized logging for all integration events.

* Dashboards for real-time visibility.

* Alerts for critical thresholds or errors.


4. Technical Stack & Environment

  • Programming Language: [e.g., Python, Node.js, Java, C#]
  • Frameworks/Libraries: [e.g., Flask/Django, Express.js, Spring Boot, ASP.NET Core]
  • Deployment Environment: [e.g., AWS Lambda, Kubernetes (EKS/AKS/GKE), Docker on EC2, Azure App Service]
  • Version Control: Git ([e.g., GitHub, GitLab, Bitbucket])
  • CI/CD Pipeline: [e.g., Jenkins, GitHub Actions, GitLab CI, Azure DevOps Pipelines]
  • Secret Management: [e.g., AWS Secrets Manager, Azure Key Vault, HashiCorp Vault]
  • Logging: [e.g., ELK Stack, Splunk, CloudWatch Logs, Datadog]
  • Monitoring: [e.g., Prometheus/Grafana, Datadog, New Relic, CloudWatch Metrics]

5. Project Team & Stakeholders

  • Project Manager: [Name/Role] - Oversees project execution, timeline, budget, and communication.
  • Technical Lead: [Name/Role] - Guides technical design, architecture, and code quality.
  • Developers: [Number] - Responsible for coding, testing, and documentation.
  • QA/Testing Lead: [Name/Role] - Defines test strategy, creates test cases, and ensures quality.
  • Business Stakeholders: [Names/Roles] - Define business requirements, provide feedback, and approve deliverables.
  • Operations/DevOps: [Name/Role] - Manages infrastructure, deployment, and monitoring.

6. Estimated Timeline & Key Milestones

This is an initial high-level estimate. A detailed project plan will be developed in Phase 1.

  • Phase 1: Discovery & Design (Week 1-2)

* Detailed requirements gathering and API analysis.

* Architectural design and technical specification.

* Proof of Concept (PoC) for critical integration points.

* Finalization of data mapping and error handling strategies.

Milestone:* Design Document Approval.

  • Phase 2: Development & Unit Testing (Week 3-6)

* Implementation of core integration logic.

* Development of data transformation modules.

* Unit testing and code reviews.

Milestone:* Core Integration Functionality Complete.

  • Phase 3: Integration & System Testing (Week 7-8)

* Integration testing with [Your Internal System Name] and [External API Name].

* End-to-end testing, performance testing, and security testing.

* User Acceptance Testing (UAT) with business stakeholders.

Milestone:* UAT Sign-off.

  • Phase 4: Deployment & Monitoring (Week 9)

* Deployment to staging and production environments.

* Setup of monitoring, alerting, and logging.

* Post-deployment validation and stabilization.

Milestone:* Production Launch & Stabilization.


7. Initial Project Setup Checklist

The following actions should be completed immediately to kick-off the project:

  • Version Control Repository:

* Create a new Git repository on [e.g., GitHub, GitLab] for the integration project.

* Initialize with a README.md, .gitignore, and basic license file.

  • Project Structure:

* Establish initial directory structure (e.g., src, tests, docs, config).

  • Environment Configuration:

* Set up development environment for all developers.

* Provision dedicated development and staging environments for the integration (e.g., cloud resources, container orchestration).

* Configure secure storage for API credentials in all environments.

  • CI/CD Pipeline:

* Set up a basic CI pipeline to run tests and linters on code commits.

* Configure initial deployment pipeline for development/staging environments.

  • Issue Tracking & Project Management:

* Create a new project in [e.g., Jira, Trello, Asana] for tracking tasks, bugs, and progress.

* Populate initial backlog with items from this document.

  • Communication Channels:

* Establish dedicated communication channels (e.g., Slack channel, Teams group) for the project team.

  • API Access:

* Obtain necessary API keys, tokens, or credentials for development and testing environments from [External API Provider].


8. Next Steps

  1. Review and Approval: Please review this project initiation document. Your feedback and approval are required to proceed.
  2. Kick-off Meeting: Schedule a project kick-off meeting with all identified stakeholders to confirm scope, roles, and initial tasks.
  3. Detailed Design Phase: Begin the detailed architectural design and technical specification based on this approved initiation document.
  4. Resource Allocation: Confirm availability and allocation of all team members.
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);}});}