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

Generate code to integrate with external APIs

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

Workflow Description: Generate code to integrate with external APIs

Step: collab → generate_code


1. Introduction

This deliverable provides comprehensive, production-ready code examples for integrating with external APIs. As part of the "API Integration Builder" workflow, this step focuses on generating a foundational codebase that you can adapt and extend for your specific API integration needs.

Given the broad nature of "API Integration Builder" without a specific target API, we have generated flexible and robust code examples for a common RESTful API integration scenario. We will use JSONPlaceholder (a free fake REST API) as our example to demonstrate typical GET and POST operations, robust error handling, and best practices in both Python and JavaScript (Node.js).

This output is designed to be directly actionable, providing you with a solid starting point for your API integration projects.


2. Core Integration Principles

Before diving into the code, it's crucial to understand the principles guiding effective API integration:

  • Modularity: Encapsulate API interaction logic into dedicated functions or classes for reusability and maintainability.
  • Configuration: Externalize sensitive information (API keys, base URLs) and frequently changing parameters for easy management.
  • Error Handling: Implement robust error handling for network issues, HTTP status codes, and unexpected API responses.
  • Retry Mechanisms: Consider implementing retry logic for transient network failures (e.g., using an exponential backoff strategy).
  • Logging: Log requests, responses, and errors for debugging and monitoring.
  • Security: Protect sensitive data (API keys, tokens) and ensure secure communication (HTTPS).
  • Idempotency: Understand if your API calls are idempotent, especially for POST, PUT, and DELETE operations.
  • Rate Limiting: Be aware of and respect API rate limits to avoid being blocked.

3. Example Scenario: JSONPlaceholder Integration

We will demonstrate integration with JSONPlaceholder, a simple REST API that provides dummy data. This allows us to show common operations without needing complex authentication or specific business logic.

API Base URL: https://jsonplaceholder.typicode.com

Example Endpoints:

  • GET /posts: Retrieve a list of posts.
  • GET /posts/{id}: Retrieve a single post by ID.
  • POST /posts: Create a new post.

4. Generated Code

We provide code examples in two popular languages for API integration: Python and JavaScript (Node.js). Each example includes a client class/module, configuration, and demonstration of GET and POST requests with error handling.


4.1 Python API Client

This Python client uses the requests library, which is the de-facto standard for HTTP requests in Python.

Dependencies:

  • requests: pip install requests

api_client.py


import requests
import json
import os
import logging

# Configure logging for better visibility
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class APIIntegrationError(Exception):
    """Custom exception for API integration specific errors."""
    def __init__(self, message, status_code=None, response_data=None):
        super().__init__(message)
        self.status_code = status_code
        self.response_data = response_data

class JSONPlaceholderClient:
    """
    A robust client for interacting with the JSONPlaceholder API.
    Handles configuration, HTTP requests (GET, POST), and error handling.
    """

    def __init__(self, base_url=None, default_headers=None, timeout=30):
        """
        Initializes the API client.

        Args:
            base_url (str, optional): The base URL for the API.
                                      Defaults to JSONPlaceholder if not provided.
                                      Can also be set via JPH_BASE_URL environment variable.
            default_headers (dict, optional): Default headers to send with each request.
            timeout (int): Default timeout for requests in seconds.
        """
        # Prioritize explicit base_url, then environment variable, then default
        self.base_url = base_url or os.getenv('JPH_BASE_URL', 'https://jsonplaceholder.typicode.com')
        self.default_headers = {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            **(default_headers or {}) # Merge any custom default headers
        }
        self.timeout = timeout
        logging.info(f"Initialized JSONPlaceholderClient with base URL: {self.base_url}")

    def _request(self, method, endpoint, params=None, data=None, headers=None):
        """
        Internal method to handle all HTTP requests.

        Args:
            method (str): HTTP method (e.g., 'GET', 'POST').
            endpoint (str): The API endpoint (e.g., '/posts').
            params (dict, optional): Dictionary of URL query parameters.
            data (dict or str, optional): Request body data. Will be JSON-encoded if dict.
            headers (dict, optional): Additional headers for this specific request.

        Returns:
            dict: Parsed JSON response from the API.

        Raises:
            APIIntegrationError: If the request fails or returns a non-2xx status code.
        """
        url = f"{self.base_url}{endpoint}"
        request_headers = {**self.default_headers, **(headers or {})} # Merge default and specific headers

        try:
            logging.debug(f"Making {method} request to: {url}")
            logging.debug(f"Params: {params}, Data: {data}, Headers: {request_headers}")

            response = requests.request(
                method,
                url,
                params=params,
                json=data if isinstance(data, dict) else None, # Use json parameter for dicts
                data=data if isinstance(data, str) else None, # Use data parameter for strings
                headers=request_headers,
                timeout=self.timeout
            )
            response.raise_for_status()  # Raises HTTPError for bad responses (4xx or 5xx)

            logging.info(f"Successful {method} request to {endpoint}. Status: {response.status_code}")
            return response.json()

        except requests.exceptions.Timeout:
            logging.error(f"Request timed out after {self.timeout} seconds for {url}")
            raise APIIntegrationError(f"Request timed out for {url}", status_code=408)
        except requests.exceptions.ConnectionError as e:
            logging.error(f"Network connection error for {url}: {e}")
            raise APIIntegrationError(f"Network connection error: {e}", status_code=503)
        except requests.exceptions.HTTPError as e:
            status_code = e.response.status_code
            try:
                error_data = e.response.json()
            except json.JSONDecodeError:
                error_data = e.response.text # Fallback to raw text if not JSON
            logging.error(f"HTTP error {status_code} for {url}: {error_data}")
            raise APIIntegrationError(f"API returned error: {error_data}",
                                      status_code=status_code,
                                      response_data=error_data)
        except json.JSONDecodeError:
            logging.error(f"Failed to decode JSON response from {url}. Response text: {response.text}")
            raise APIIntegrationError(f"Invalid JSON response from {url}", status_code=500, response_data=response.text)
        except Exception as e:
            logging.error(f"An unexpected error occurred during request to {url}: {e}")
            raise APIIntegrationError(f"An unexpected error occurred: {e}", status_code=500)

    def get(self, endpoint, params=None, headers=None):
        """Performs a GET request."""
        return self._request('GET', endpoint, params=params, headers=headers)

    def post(self, endpoint, data, headers=None):
        """Performs a POST request."""
        return self._request('POST', endpoint, data=data, headers=headers)

    def put(self, endpoint, data, headers=None):
        """Performs a PUT request."""
        return self._request('PUT', endpoint, data=data, headers=headers)

    def delete(self, endpoint, headers=None):
        """Performs a DELETE request."""
        return self._request('DELETE', endpoint, headers=headers)

# --- Example Usage ---
if __name__ == "__main__":
    # Optional: Set base URL via environment variable
    # os.environ['JPH_BASE_URL'] = 'https://jsonplaceholder.typicode.com'

    client = JSONPlaceholderClient()

    print("\n--- Fetching all posts ---")
    try:
        posts = client.get('/posts')
        print(f"Fetched {len(posts)} posts. First post title: {posts[0]['title']}")
    except APIIntegrationError as e:
        print(f"Error fetching posts: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

    print("\n--- Fetching a single post (ID 1) ---")
    try:
        post_id = 1
        single_post = client.get(f'/posts/{post_id}')
        print(f"Fetched post {post_id}: {single_post['title']}")
    except APIIntegrationError as e:
        print(f"Error fetching post {post_id}: {e}")

    print("\n--- Creating a new post ---")
    new_post_data = {
        'title': 'My New API Post',
        'body': 'This is the body of my new post created via the API client.',
        'userId': 1
    }
    try:
        created_post = client.post('/posts', data=new_post_data)
        print(f"Successfully created post with ID: {created_post['id']}")
        print(f"Created post title: {created_post['title']}")
    except APIIntegrationError as e:
        print(f"Error creating post: {e}")

    print("\n--- Demonstrating error handling (non-existent endpoint) ---")
    try:
        client.get('/nonexistent-endpoint')
    except APIIntegrationError as e:
        print(f"Caught expected error: {e.status_code} - {e.response_data}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

    print("\n--- Demonstrating error handling (invalid post ID) ---")
    try:
        client.get('/posts/999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
projectmanager Output

API Integration Project Creation Confirmation

Project Status: Initiated

We are pleased to confirm the successful creation of your new API Integration Project within the PantheraHive platform. This marks the official commencement of our engagement to build robust and efficient integrations for your specified systems.


1. Project Overview

Project Name: API Integration Initiative

Project ID: [Auto-Generated Project ID - e.g., PH-API-20231027-001]

Creation Date: October 27, 2023

Current Status: Project Created - Awaiting Detailed Requirements

This project is dedicated to leveraging the "API Integration Builder" to establish seamless, secure, and performant connections between your internal systems and external APIs. Our primary objective is to automate data exchange, streamline workflows, enhance system interoperability, and unlock new capabilities for your business.


2. Initial Scope & Objectives

Based on the initial input provided to the API Integration Builder, the high-level objectives for this project include:

  • Connecting Key Systems: Establishing integration points between [Placeholder: System A] and [Placeholder: External API/System B].
  • Data Flow: Facilitating [Placeholder: e.g., one-way synchronization, bi-directional data exchange, event-driven triggers] for [Placeholder: e.g., customer data, order status, inventory updates, financial transactions].
  • Automation: Reducing manual effort and improving data accuracy through automated API calls.
  • Scalability & Reliability: Designing an integration solution that is scalable to future needs and resilient to potential API downtime or errors.

Note: A detailed scope will be collaboratively defined in the upcoming "Requirements Gathering" phase.


3. Key Project Phases & Next Steps

This API integration project will proceed through the following structured phases to ensure a high-quality and successful deployment:

3.1. Phase 1: Detailed Requirements Gathering & Technical Design (Next Step)

This crucial phase focuses on a deep dive into your specific needs and the technical intricacies of the APIs involved.

  • Activities:

* Stakeholder Workshops: Conduct sessions with your business and technical teams to capture precise integration requirements, use cases, and business logic.

* API Documentation Review: Thorough analysis of all relevant API documentation (source and target systems) to understand endpoints, data models, authentication mechanisms, rate limits, and error handling.

* Data Mapping: Define exact field-to-field mappings and any required data transformations.

* Integration Flow Design: Architect the complete integration workflow, including triggers, sequence of operations, error handling, retry mechanisms, and logging strategies.

* Security Assessment: Review and design secure authentication, authorization, and data encryption practices.

  • Deliverables:

* Integration Design Document (IDD): A comprehensive document outlining the technical architecture, data flows, API specifications, error handling, security considerations, and deployment strategy.

* Detailed Data Mapping Specification.

  • Your Action: Please prepare to provide access to relevant API documentation, internal system experts, and business stakeholders for these workshops.

3.2. Phase 2: Development & Code Generation

Leveraging the insights from the design phase, our team will proceed with the development of the integration solution.

  • Activities:

* Code Scaffolding: Utilize the API Integration Builder to generate foundational code based on the IDD.

* Custom Logic Implementation: Develop and integrate any custom business logic, data transformation routines, and complex orchestration required.

* API Client Development: Create robust and efficient API clients/connectors for all involved APIs.

* Secure Credential Management: Implement best practices for handling API keys and sensitive credentials.

  • Deliverables:

* Production-Ready Integration Codebase: Fully commented and structured code.

* Deployment Scripts & Instructions.

3.3. Phase 3: Testing & Quality Assurance

Rigorous testing is performed to ensure the integration is functional, reliable, and performs as expected under various conditions.

  • Activities:

* Unit Testing: Verify individual components and functions.

* Integration Testing: Test the interaction between different integrated systems.

* End-to-End Testing: Simulate real-world scenarios across the entire workflow.

* Performance & Load Testing: Assess the integration's behavior under expected and peak loads.

* User Acceptance Testing (UAT): Collaborate with your team to validate the solution against business requirements in a staging environment.

  • Deliverables:

* Comprehensive Test Reports.

* UAT Sign-off.

3.4. Phase 4: Deployment & Monitoring

The final phase involves deploying the integration to your production environment and establishing ongoing operational support.

  • Activities:

* Production Deployment: Execute the deployment plan in your live environment.

* Post-Deployment Verification: Confirm successful deployment and initial operational status.

* Monitoring & Alerting Setup: Configure dashboards and alerts to proactively track integration health, performance, and error rates.

* Documentation Handover: Provide complete operational documentation.

  • Deliverables:

* Live API Integration Solution.

* Monitoring Dashboards & Alerts.

* Operational Runbook.


4. Customer Collaboration & Required Inputs

Your active participation and timely provision of information are critical to the success of this project. During the upcoming phases, we will require:

  • API Access & Documentation:

* Full API documentation for all systems to be integrated.

* Access to developer portals and sandbox/staging environments.

* Secure provision of API keys, tokens, or credentials (we will provide secure channels for this).

  • Business & Technical Expertise:

* Availability of subject matter experts (SMEs) from both business and IT departments.

* Clear articulation of business rules, data transformation logic, and specific use cases.

  • Testing Environments:

* Provision of dedicated development, staging, and UAT environments.

* Sample data for comprehensive testing.

  • Review & Approvals:

* Timely review and approval of design documents, test plans, and UAT sign-offs.


5. Estimated Timeline & Resources

A detailed project timeline, resource allocation, and cost estimates will be provided upon the completion of the "Detailed Requirements Gathering & Technical Design" phase. This ensures accuracy based on a thorough understanding of the integration scope.


6. Points of Contact

Your dedicated Project Manager will be your primary point of contact for all project-related communications.

  • Project Manager: [Project Manager Name]

* Email: [Project Manager Email]

* Phone: [Project Manager Phone]

Our team is excited to embark on this integration journey with you. We look forward to a successful collaboration.

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);}});}