API Integration Builder
Run ID: 69cc3dc56beabe319cec8c8f2026-03-31Development
PantheraHive BOS
BOS Dashboard

Deliverable: API Integration Code Generation (Step 1 of 2)

Workflow: API Integration Builder

Step: collab → generate_code

This document provides a comprehensive, detailed, and professional output for generating production-ready code to integrate with external APIs. As step 1 of the "API Integration Builder" workflow, this output focuses on establishing a robust, flexible, and maintainable foundation for your API interactions.


1. Introduction

You are receiving the initial code generation for your API integration project. This output delivers a professional, well-structured, and highly adaptable Python API client template. While the specific external API you intend to integrate with has not yet been specified, this foundational code is designed to be easily customized for virtually any RESTful API, incorporating best practices for reliability, security, and maintainability.

This deliverable includes:

Our goal is to provide you with a powerful starting point that minimizes development time and ensures a high-quality integration.


2. Overview of the API Integration Builder

The "API Integration Builder" workflow is designed to streamline the process of connecting your systems with external services.

* Generic API Client: A flexible Python class designed to handle various HTTP methods (GET, POST, PUT, DELETE).

* Robust Error Handling: Mechanisms to gracefully manage API errors, network issues, and unexpected responses.

* Retry Logic with Exponential Backoff: Automatic retries for transient errors to improve reliability.

* Configurable Authentication: Support for API keys, with clear pathways for OAuth2, Bearer tokens, etc.

* Logging Integration: Detailed logging for monitoring and debugging.

* Environment-based Configuration: Separation of sensitive data and settings from the codebase.

* Clear Structure & Comments: Code that is easy to understand, modify, and extend.


3. Core Principles for Robust API Integration

Before diving into the code, understanding the underlying principles is crucial for building reliable integrations:

* Error Handling: Anticipate and handle various error types (network, API-specific, data parsing).

* Retries: Implement intelligent retry mechanisms for transient failures.

* Timeouts: Prevent indefinite waits for unresponsive APIs.

* Secure Authentication: Use appropriate and secure authentication methods (OAuth2, API Keys via environment variables).

* Data Protection: Encrypt sensitive data in transit (HTTPS) and at rest.

* Input Validation: Sanitize and validate all data sent to and received from the API.

* Modularity: Organize code into logical, reusable components (e.g., an ApiClient class).

* Configuration: Externalize settings (base URLs, API keys) from the code.

* Readability: Use clear variable names, comments, and consistent formatting.

* Rate Limiting: Respect API rate limits to avoid being blocked.

* Asynchronous Operations: Consider async clients for high-throughput scenarios (beyond this initial template, but good to keep in mind).

* Efficient Resource Usage: Manage connections and memory effectively.


4. Proposed API Integration Architecture (Python Example)

High-Level Design

The proposed architecture centers around a dedicated ApiClient class that encapsulates all logic for interacting with a specific external API. This class will manage HTTP requests, authentication, error handling, retries, and data parsing, providing a clean interface for your application logic.

text • 996 chars
+---------------------+      +---------------------+      +---------------------+
| Your Application    |      | API Configuration   |      | External API        |
| Logic               |----->| (Environment Vars,  |----->| (e.g., RESTful API) |
| (e.g., `main.py`)   |      | .env file)          |      |                     |
+---------------------+      +---------------------+      +---------------------+
           |                             ^
           |                             |
           v                             |
+---------------------+                  |
| `ApiClient` Class   |                  |
| (`api_client.py`)   |                  |
| - Handles requests  |                  |
| - Authentication    |------------------+
| - Error handling    |
| - Retries           |
| - Logging           |
+---------------------+
           |
           v
+---------------------+
| Logging System      |
| (e.g., Console,     |
| File, Cloudwatch)   |
+---------------------+
Sandboxed live preview

python

import requests

import logging

import time

from typing import Dict, Any, Optional

--- Configuration (loaded from config.py) ---

from config import API_BASE_URL, API_KEY, RETRY_ATTEMPTS, RETRY_DELAY_SECONDS, TIMEOUT_SECONDS

--- Logging Setup ---

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

logger = logging.getLogger(__name__)

--- Custom Exceptions ---

class ApiClientError(Exception):

"""Base exception for API Client errors."""

pass

class ApiRequestError(ApiClientError):

"""Raised for HTTP errors (4xx or 5xx responses)."""

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

super().__init__(message)

self.status_code = status_code

self.response_data = response_data

class ApiConnectionError(ApiClientError):

"""Raised for network or connection-related errors."""

pass

class ApiTimeoutError(ApiClientError):

"""Raised when an API request times out."""

pass

class ApiRetryExhaustedError(ApiClientError):

"""Raised when all retry attempts are exhausted."""

pass

class ApiDeserializationError(ApiClientError):

"""Raised when response content cannot be deserialized."""

pass

--- API Client Class ---

class ApiClient:

"""

A generic API client for interacting with external RESTful services.

This client handles HTTP requests, authentication, error handling,

retries with exponential backoff, and logging.

"""

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

"""

Initializes the ApiClient.

Args:

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

api_key (str): The API key for authentication.

"""

if not base_url:

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

if not api_key:

logger.warning("API key is empty. Ensure this is intentional for unauthenticated endpoints.")

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

self.api_key = api_key

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

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

def _get_headers(self, custom_headers: Optional[Dict] = None) -> Dict:

"""

Constructs the default request headers, including authentication.

Args:

custom_headers (Optional[Dict]): Additional headers to merge.

Returns:

Dict: A dictionary of headers.

"""

headers = {

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

"Accept": "application/json",

"Authorization": f"Bearer {self.api_key}" # Example: Bearer token. Adapt for other auth types.

}

if custom_headers:

headers.update(custom_headers)

return headers

def _handle_response(self, response: requests.Response) -> Any:

"""

Handles the API response, checking for errors and parsing JSON.

Args:

response (requests.Response): The response object from the requests library.

Returns:

Any: The JSON-parsed response data.

Raises:

ApiRequestError: If the response indicates an HTTP error (4xx or 5xx).

ApiDeserializationError: If the response content cannot be parsed as JSON.

"""

try:

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

return response.json()

except requests.exceptions.HTTPError as e:

status_code = response.status_code

response_data = None

try:

response_data = response.json()

except requests.exceptions.JSONDecodeError:

response_data = {"error": response.text} # Fallback to raw text if not JSON

error_message = f"API request failed with status {status_code}: {response_data}"

logger.error(error_message)

raise ApiRequestError(error_message, status_code, response_data)

except requests.exceptions.JSONDecodeError as e:

error_message = f"Failed to deserialize JSON response from {response.url}: {e}"

logger.error(error_message)

raise ApiDeserializationError(error_message)

except Exception as e:

error_message = f"An unexpected error occurred while handling response: {e}"

logger.error(error_message)

raise ApiClientError(error_message)

def _make_request(

self,

method: str,

path: str,

params: Optional[Dict] = None,

json_data: Optional[Dict] = None,

data: Optional[Any] = None,

custom_headers: Optional[Dict] = None,

stream: bool = False

) -> Any:

"""

Internal method to make an HTTP request with retry logic.

Args:

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

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

params (Optional[Dict]): Dictionary of query parameters.

json_data (Optional[Dict]): Dictionary of JSON data for the request body.

data (Optional[Any]): Data for the request body (e.g., form data, raw text).

custom_headers (Optional[Dict]): Additional headers for this specific request.

stream (bool): Whether to stream the response content.

Returns:

Any: The JSON-parsed response data.

Raises:

ApiConnectionError: For network connectivity issues.

ApiTimeoutError: If the request times out.

ApiRetryExhaustedError: If all retry attempts fail.

ApiClientError: For other unexpected client-side errors.

"""

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

headers = self._get_headers(custom_headers)

current_attempt = 0

while current_attempt < RETRY_ATTEMPTS:

current_attempt += 1

try:

logger.debug(f"Attempt {current_attempt}/{RETRY_ATTEMPTS}: {method} {url}")

response = self.session.request(

method=method,

url=url,

params=params,

json=json_data,

data=data,

headers=headers,

timeout=TIMEOUT_SECONDS,

stream=stream

)

# If a successful response (2xx) or a client error (4

projectmanager Output

API Integration Builder: Project Creation & Initialization

This document outlines the successful execution of Step 2 of 2 in the "API Integration Builder" workflow, focusing on the crucial "Project Creation" phase. This step establishes the foundational structure and initial parameters for your API integration project, paving the way for efficient and tailored code generation.


1. Introduction to the API Integration Builder Workflow

The API Integration Builder workflow is designed to streamline and automate the generation of code necessary to integrate with external APIs. Its primary goal is to accelerate development cycles, reduce manual coding effort, and ensure best practices in API connectivity. This comprehensive process guides you from initial project definition through to actionable, deployable code.

2. Workflow Context: Generating Code for External API Integration

The overarching objective of this workflow is to generate robust, maintainable, and efficient code that facilitates seamless interaction with your chosen external APIs. This includes handling various aspects such as authentication, request/response serialization, error handling, and data mapping, tailored to your specific requirements.

3. Step 2: Project Creation (projectmanager → create_project)

This step marks the official initiation of your API integration project within our system. It involves defining the core characteristics and requirements that will guide the subsequent stages of code generation and integration development.

3.1. Purpose of Project Creation

The "create_project" phase is critical for:

  • Establishing a dedicated workspace: A unique environment for your specific integration, ensuring organization and isolation from other projects.
  • Defining the scope and objectives: Clearly outlining what the integration aims to achieve and which API(s) it will interact with.
  • Gathering essential parameters: Collecting foundational information required by the code generation engine to produce accurate and functional code.
  • Resource allocation and tracking: Enabling effective management of the integration development lifecycle.

3.2. Key Information Captured During Project Creation

Based on your input and our system's capabilities, the following critical details are established during this step:

  • Project Name: A unique identifier for your integration project (e.g., CRM-Salesforce-Integration, PaymentGateway-Stripe-Webhook).
  • Project Description: A concise overview of the integration's purpose and primary functionalities.
  • Target External API(s): Identification of the specific API(s) you intend to integrate with (e.g., Salesforce API, Stripe API, Google Maps API). This includes:

* Base URL(s): The root endpoint(s) for the API(s).

* Primary API Documentation Link(s): References to official API documentation for detailed specifications.

  • Integration Type(s): The nature of the interaction with the external API(s) (e.g., data synchronization, webhook listener, CRUD operations, event-driven, batch processing). This dictates the architectural patterns of the generated code.
  • Preferred Programming Language/Framework: The desired technology stack for the generated code (e.g., Python (Flask/Django), Node.js (Express), Java (Spring Boot), C# (.NET Core), Go). This directly influences syntax, libraries, and project structure.
  • Authentication Method (Initial Type): The planned method for securing communication with the external API (e.g., OAuth 2.0, API Key, Basic Auth, JWT). While specific credentials are not stored at this stage, the type is crucial for generating appropriate security boilerplate.
  • Initial Data Models/Schemas: A high-level understanding of the data structures involved in the integration (e.g., "Customer" object, "Order" object, "Product" object). This helps in defining initial data mapping requirements.
  • Environment Configuration: Specification of the initial deployment environment (e.g., Development, Staging, Production) for environment-specific configurations.
  • Team & Ownership (Optional): Assignment of project owners or team members responsible for the integration.

3.3. Output and Deliverables of this Step

Upon completion of the "Project Creation" step, the following outputs are generated and stored:

  • New Project Record: A dedicated entry in our project management system, uniquely identifying your API integration initiative.
  • Initial Project Configuration File: A structured configuration file (e.g., JSON, YAML) containing all the details captured above, serving as the blueprint for subsequent code generation.
  • Project Workspace Initialization: Creation of a foundational directory structure or repository placeholder for the upcoming generated code.
  • Defined Scope Document: A clear, internal definition of the integration's boundaries and key objectives, ready for review.

4. Next Steps in the API Integration Builder Workflow

With the project successfully created, the workflow will now proceed to the detailed design and code generation phases:

  1. Detailed API Endpoint Configuration: Defining specific endpoints, HTTP methods, request/response payloads, and query parameters for each required API interaction.
  2. Authentication & Security Setup: Providing and securely configuring the actual credentials and tokens for the chosen authentication method.
  3. Data Mapping & Transformation Rules: Specifying how data from your system maps to the external API's schema and vice-versa, including any necessary transformations.
  4. Error Handling & Logging Strategy: Defining how the generated code should manage API errors, retries, and log critical events.
  5. Code Generation: Leveraging the gathered information to automatically generate the integration code in your preferred language/framework.
  6. Testing & Validation: Providing tools or frameworks for unit and integration testing of the generated code.
  7. Deployment & Monitoring Guidance: Instructions and best practices for deploying and monitoring your new API integration.

5. Benefits of this Structured Approach

This meticulous project creation process ensures:

  • Clarity and Organization: All integration details are centralized and easily accessible.
  • Reduced Errors: By capturing precise requirements upfront, the likelihood of misconfigurations during code generation is significantly minimized.
  • Accelerated Development: A well-defined foundation allows for rapid and accurate code generation, saving considerable development time.
  • Consistency and Maintainability: Generated code adheres to best practices and a consistent structure, making it easier to maintain and extend in the future.
  • Tailored Solutions: The output code is highly customized to your specific API, language, and integration type.

6. Actionable Items for the Customer

To proceed with the next steps in the API Integration Builder workflow, we kindly request you to:

  • Review and Confirm: Verify that the project details captured during this "Project Creation" phase accurately reflect your integration requirements.
  • Provide Detailed API Specifications: If not already provided, please furnish comprehensive API documentation, including specific endpoints, request/response samples, and error codes for the functionalities you wish to integrate.
  • Specify Authentication Details: Be prepared to provide the necessary authentication credentials (e.g., API keys, client IDs, client secrets) securely for the next phase.

We are confident that this structured approach will lead to a highly efficient and successful API integration. Please do not hesitate to reach out if you have any questions or require further clarification.

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
\n\n\n"); 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'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); 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'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- 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",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); 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'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); 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}\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- 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",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "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"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); 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';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); 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}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/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("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/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)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- 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:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== 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(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } 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);}});}