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

Generate code to integrate with external APIs

Project: API Integration Builder

Step 1 of 2: Code Generation for API Integration

Deliverable: Initial Codebase for External API Integration


1. Introduction

This document presents the initial code generation for integrating with external APIs, marking the completion of Step 1 of 2 in the "API Integration Builder" workflow. Our goal in this step is to provide a robust, well-structured, and production-ready code foundation that addresses common challenges in API integration, such as authentication, error handling, retries, and data processing.

This deliverable includes:

  • An overview of key considerations for robust API integration.
  • Assumptions made for the generated code, given no specific API details were initially provided.
  • A comprehensive, commented Python code example demonstrating best practices for interacting with a typical RESTful API.
  • Guidance on code structure, best practices, and next steps.

This output serves as a foundational template that can be readily adapted and extended based on your specific API requirements.

2. Understanding API Integration

API (Application Programming Interface) integration involves enabling two or more applications to communicate and exchange data. This process is crucial for building interconnected systems, automating workflows, and leveraging external services. Effective API integration requires careful consideration of various technical and operational aspects to ensure reliability, security, and maintainability.

Common types of APIs include:

  • RESTful APIs: The most prevalent type, using standard HTTP methods (GET, POST, PUT, DELETE) to interact with resources. Data is often exchanged in JSON or XML format.
  • GraphQL APIs: A query language for APIs, allowing clients to request exactly the data they need, reducing over-fetching or under-fetching.
  • SOAP APIs: An older, more structured protocol often used in enterprise environments, relying on XML.

For this initial generation, we will focus on RESTful API integration due to its widespread adoption.

3. Key Considerations for Robust Integration

Before diving into the code, it's essential to understand the critical aspects that make an API integration robust and reliable:

  • Authentication & Authorization: Securely identifying and verifying the client application. Common methods include API Keys, OAuth 2.0, JWT (JSON Web Tokens), Basic Auth, or client certificates.
  • Error Handling & Retries: Gracefully managing network issues, server errors, or invalid requests. Implementing retry mechanisms (e.g., exponential backoff) can improve resilience for transient errors.
  • Rate Limiting: Adhering to the API provider's limits on the number of requests within a given timeframe to prevent service abuse and ensure fair usage.
  • Data Serialization/Deserialization: Converting data between the application's native format (e.g., Python objects) and the API's exchange format (e.g., JSON strings).
  • Security: Protecting sensitive data (e.g., API keys, user credentials) and ensuring secure communication (e.g., HTTPS).
  • Logging & Monitoring: Recording API interactions, errors, and performance metrics to aid in debugging, auditing, and operational insights.
  • Configuration Management: Separating API endpoints, credentials, and other configurable parameters from the core code, typically using environment variables or configuration files.
  • Timeouts: Setting appropriate timeouts for API requests to prevent applications from hanging indefinitely due to slow or unresponsive external services.

4. Assumptions for Code Generation

Since specific API details were not provided, the following assumptions have been made to generate a foundational, illustrative code example:

  • API Type: The target is a RESTful API.
  • Data Format: The API primarily communicates using JSON for both request bodies and responses.
  • Authentication Method: A simple API Key passed in the request headers is assumed for demonstration. This can be easily adapted to OAuth 2.0, JWT, or other methods.
  • Programming Language: Python has been chosen due to its readability, rich ecosystem, and popularity for backend and integration tasks.
  • HTTP Client Library: The widely used requests library in Python will be utilized for making HTTP calls.
  • Scope: The example focuses on fetching data (GET requests) and sending data (POST requests), representing common API interactions.
  • Error Handling: Includes basic error checks for HTTP status codes and network issues.
  • Retry Mechanism: A simple exponential backoff retry strategy is included for transient errors.
  • Logging: Basic logging is integrated to provide visibility into API calls and outcomes.

5. Generated Code Example: Fetching Data from a REST API

This section provides a complete, well-commented Python module (api_client.py) for interacting with a hypothetical REST API, followed by a usage example (main.py).

5.1. Overview

This code defines a BaseApiClient class designed to be a reusable and robust foundation for interacting with various RESTful APIs. It encapsulates common functionalities like:

  • Configuring the base URL and API key.
  • Making HTTP GET and POST requests.
  • Implementing retries with exponential backoff for transient errors.
  • Handling different HTTP status codes.
  • Logging API interactions and errors.
  • Setting request timeouts.

5.2. Prerequisites

To run this code, you will need:

  • Python 3.6+
  • The requests library: Install via pip: pip install requests
  • The tenacity library (for robust retries): Install via pip: pip install tenacity

5.3. Core Integration Module (api_client.py)


# api_client.py

import os
import requests
import json
import logging
from typing import Dict, Any, Optional
from requests.exceptions import RequestException, HTTPError, Timeout
from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type

# --- Configuration ---
# It's best practice to load sensitive information and configurations from environment variables
# or a secure configuration management system.
# For demonstration, we use os.getenv, with fallback values.
BASE_API_URL = os.getenv("EXTERNAL_API_BASE_URL", "https://jsonplaceholder.typicode.com")
API_KEY = os.getenv("EXTERNAL_API_KEY", "your_secret_api_key") # Replace with your actual API key
DEFAULT_TIMEOUT_SECONDS = int(os.getenv("EXTERNAL_API_TIMEOUT", 10)) # Default request timeout
MAX_RETRIES = int(os.getenv("EXTERNAL_API_MAX_RETRIES", 3)) # Max retry attempts
RETRY_WAIT_INITIAL_SECONDS = int(os.getenv("EXTERNAL_API_RETRY_WAIT_INITIAL", 1)) # Initial wait for retries

# --- Logging Setup ---
# Configure logging to provide insights into API interactions
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# Define specific exceptions for API errors
class ApiClientError(Exception):
    """Base exception for API client errors."""
    pass

class ApiNetworkError(ApiClientError):
    """Raised for network-related issues (e.g., connection refused, DNS error)."""
    pass

class ApiServerError(ApiClientError):
    """Raised for server-side errors (5xx status codes)."""
    def __init__(self, message, status_code, response_text=None):
        super().__init__(message)
        self.status_code = status_code
        self.response_text = response_text

class ApiClientBadRequest(ApiClientError):
    """Raised for client-side errors (4xx status codes, excluding 401/403)."""
    def __init__(self, message, status_code, response_text=None):
        super().__init__(message)
        self.status_code = status_code
        self.response_text = response_text

class ApiAuthError(ApiClientError):
    """Raised for authentication or authorization failures (401/403 status codes)."""
    def __init__(self, message, status_code, response_text=None):
        super().__init__(message)
        self.status_code = status_code
        self.response_text = response_text

class ApiTimeoutError(ApiClientError):
    """Raised when an API request times out."""
    pass

class ApiDataParsingError(ApiClientError):
    """Raised when response data cannot be parsed (e.g., invalid JSON)."""
    pass

class BaseApiClient:
    """
    A base client for interacting with RESTful APIs.
    Provides common functionality like authentication, error handling, and retries.
    """
    def __init__(self, base_url: str = BASE_API_URL, api_key: str = API_KEY,
                 timeout: int = DEFAULT_TIMEOUT_SECONDS):
        """
        Initializes the API client.
        :param base_url: The base URL for the API endpoints.
        :param api_key: The API key for authentication.
        :param timeout: Default timeout for requests in seconds.
        """
        self.base_url = base_url
        self.api_key = api_key
        self.timeout = timeout
        self.session = requests.Session() # Use a session for connection pooling and efficiency
        self._setup_auth_headers()

    def _setup_auth_headers(self):
        """Sets up default headers, including authentication."""
        # Common headers for JSON APIs
        self.session.headers.update({
            "Content-Type": "application/json",
            "Accept": "application/json",
            # Example API Key authentication (e.g., in a custom header)
            # Adapt this based on your API's specific authentication method (Bearer, Basic, etc.)
            "X-API-KEY": self.api_key,
            # For Bearer Token: "Authorization": f"Bearer {self.api_key}"
        })
        logger.debug("API Client headers initialized.")

    @retry(
        wait=wait_exponential(multiplier=RETRY_WAIT_INITIAL_SECONDS, min=1, max=60), # Exponential backoff
        stop=stop_after_attempt(MAX_RETRIES), # Stop after N attempts
        retry=retry_if_exception_type((ApiNetworkError, ApiServerError, ApiTimeoutError)), # Retry specific exceptions
        reraise=True # Re-raise the last exception if all retries fail
    )
    def _make_request(self, method: str, endpoint: str, params: Optional[Dict[str, Any]] = None,
                      data: Optional[Dict[str, Any]] = None, headers: Optional[Dict[str, str]] = None) -> Any:
        """
        Internal method to make an HTTP request with retry logic.
        :param method: HTTP method (e.g., 'GET', 'POST').
        :param endpoint: The API endpoint (e.g., '/posts').
        :param params: Dictionary of query parameters.
        :param data: Dictionary of JSON payload for POST/PUT requests.
        :param headers: Additional headers for this specific request.
        :return: JSON response from the API.
        :raises ApiClientError: Custom exceptions for various API errors.
        """
        url = f"{self.base_url}{endpoint}"
        logger.info(f"Making {method} request to: {url}")
        logger.debug(f"Params: {params}, Data: {data}, Headers: {headers}")

        try:
            response = self.session.request(
                method,
                url,
                params=params,
                json=data, # Use 'json' parameter for automatic JSON serialization
                headers=headers,
                timeout=self.timeout
            )
            response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)

            # Attempt to parse JSON response. Some APIs might return empty responses or non-JSON.
            if response.text:
                try:
                    return response.json()
                except json.JSONDecodeError as e:
                    logger.error(f"Failed to parse JSON response from {url}: {e}. Response text: {response.text}")
                    raise ApiDataParsingError(f"Invalid JSON response: {e}") from e
            else:
                logger.info(f"Empty response body for {url}")
                return None # Or an empty dict, depending on expected behavior

        except Timeout as e:
            logger.error(f"Request timed out for {url}: {e}")
            raise ApiTimeoutError(f"API request timed out after {self.timeout} seconds.") from e
        except HTTPError as e:
            status_code = e.response.status_code
            response_text = e.response.text
            log_msg = f"API returned error {status_code} for {url}: {response_text}"
            logger.error(log_msg)

            if 401 <= status_code <= 403:
                raise ApiAuthError(log_msg, status_code, response_text) from e
            elif 400 <= status_code < 500:
                raise ApiClientBadRequest(log_msg, status_code, response_text) from e
            elif 500 <= status_code < 600:
                raise ApiServerError(log_msg, status_code, response_text) from e
            else:
                # Catch any other unhandled HTTP errors
                raise ApiClientError(f"Unexpected HTTP error {status_code} for {url}: {response_text}") from e
        except RequestException as e:
            #
projectmanager Output

This document outlines the successful completion of Step 2 of 2 in the "API Integration Builder" workflow, focusing on the crucial "projectmanager → create_project" action. This deliverable guides you through the process of establishing a new project, which serves as the foundational container for your API integrations.


Deliverable: API Integration Project Creation

1. Introduction to API Integration Projects

The creation of a dedicated project is the essential first step in managing and developing your API integrations effectively. A project acts as a logical organizational unit, centralizing all components related to a specific integration effort, application, or business function. This structured approach ensures clarity, security, and maintainability throughout the integration lifecycle.

This step ensures that all subsequent API integration code generation, credential management, and configuration will be securely scoped and managed within a well-defined environment.

2. Purpose of an API Integration Project

A well-defined project structure provides numerous benefits for your API integration initiatives:

  • Logical Grouping: Consolidates related API integrations, configurations, and resources under a single umbrella, making management intuitive.
  • Environment Management: Allows for distinct separation of development, staging, and production environments, preventing accidental changes and facilitating safe testing.
  • Credential Management: Provides a secure context for storing and managing API keys, tokens, and other sensitive credentials specific to the project.
  • Version Control & Collaboration: Establishes a clear boundary for code repositories, enabling collaborative development and version tracking.
  • Access Control: Facilitates granular permission management, ensuring only authorized team members can access or modify project resources.
  • Monitoring & Logging: Creates a scope for tracking integration performance, errors, and operational metrics.
  • Cost Management (if applicable): Allows for tracking resource consumption related to specific integration efforts.

3. Key Information Required for Project Creation

To successfully create your new API integration project, please be prepared to provide the following details. These inputs are critical for establishing a robust and well-organized project foundation:

  • Project Name:

* Description: A unique and descriptive name for your project. This should clearly indicate the purpose or the primary application/service it supports.

* Example: CRM_Salesforce_Integration, PaymentGateway_Stripe, Internal_ERP_Sync

* Action: Choose a name that is concise, clear, and adheres to your organization's naming conventions.

  • Project Description:

* Description: A brief overview explaining the objective and scope of this integration project. This helps team members quickly understand its purpose.

* Example: "This project manages the bidirectional synchronization of customer data between our internal ERP system and Salesforce CRM."

* Action: Provide a detailed yet succinct description of the project's goals.

  • Project Owner / Team Lead:

* Description: The primary individual or team responsible for the project's oversight and success.

* Action: Identify the main point of contact for this integration initiative.

  • Target External API(s):

* Description: Specify the external APIs that this project primarily intends to integrate with. This helps in initial resource allocation and planning.

* Example: Salesforce API, Stripe API, Twilio API, Custom REST API

* Action: List all relevant external APIs that will be connected through this project.

  • Initial Environment(s):

* Description: Select the initial deployment environments required for this project (e.g., Development, Staging, Production). This allows for environment-specific configurations.

* Action: Indicate which environments need to be provisioned for this project from the outset.

  • Tags/Labels (Optional but Recommended):

* Description: Assign relevant tags or labels for easier categorization, searching, and filtering of projects within your project management system.

* Example: CRM, Payments, DataSync, SaaS, Backend

* Action: Add any relevant tags that help categorize the project.

4. Step-by-Step Guide: Creating Your API Integration Project

Follow these generic steps to create your new project within your designated project management system (e.g., a cloud console, an internal developer portal, or a dedicated API management platform):

  1. Access the Project Management Interface:

* Log in to your organization's project management platform or developer console.

* Navigate to the "Projects" or "Workspaces" section.

  1. Initiate Project Creation:

* Locate and click on the "Create New Project," "New Workspace," or similar button. This typically opens a form or wizard.

  1. Fill in Project Details:

* Project Name: Enter the chosen name for your project.

* Project Description: Provide the detailed description of the project's purpose and scope.

* Project Owner / Team Lead: Select or input the designated project owner/team lead.

* Target External API(s): List or select the external APIs involved.

* Initial Environment(s): Choose the initial environments (e.g., "Development"). You can often add more later.

* Tags/Labels: Add any applicable tags for categorization.

  1. Review and Confirm:

* Carefully review all the entered information for accuracy.

* Confirm that the details align with your project requirements.

  1. Finalize Project Creation:

* Click the "Create Project," "Submit," or "Save" button to finalize the project setup.

* The system will typically confirm the successful creation and redirect you to the new project's dashboard or overview page.

5. Best Practices for Project Setup

To maximize the benefits of your API integration project, consider these best practices:

  • Clear Naming Conventions: Establish and adhere to consistent naming conventions for projects, environments, and resources.
  • Modularity: Design projects to be modular. If an application integrates with many disparate APIs, consider if multiple projects (e.g., App_Payments, App_CRM) might offer better isolation than a single monolithic project.
  • Environment Segregation: Always maintain strict separation between development, staging, and production environments. Never use production credentials or configurations in lower environments unless explicitly designed for specific testing scenarios.
  • Comprehensive Documentation: As soon as the project is created, begin documenting its purpose, architecture, key configurations, and any specific integration flows.
  • Security First: Ensure that any credentials or secrets associated with the project are stored securely within the designated credential management system, not hardcoded into the integration logic.
  • Regular Review: Periodically review active projects to ensure they are still relevant, properly configured, and optimized.

6. Next Steps After Project Creation

With your API integration project successfully created, the next crucial steps in the "API Integration Builder" workflow typically involve:

  1. Configure API Credentials: Securely add and manage the API keys, tokens, or OAuth configurations required for each external API within this project's scope.
  2. Define Integration Flows: Outline the specific data exchange patterns, triggers, and actions that will constitute your API integrations.
  3. Generate Integration Code: Utilize the API Integration Builder to generate the necessary code snippets, SDK configurations, or deployment scripts based on your defined project and integration requirements.
  4. Set Up Monitoring and Alerts: Configure monitoring tools and alerts to track the health and performance of your integrations within this project.
  5. Invite Team Members: Grant appropriate access to team members who will be collaborating on this project.

This comprehensive project creation ensures a solid foundation for all your API integration endeavors. Please proceed with the next steps in your workflow. If you encounter any issues or require assistance, do not hesitate to reach out to our support team.

api_integration_builder.md
Download as Markdown
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);}});}