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

PantheraHive API Integration Builder - Step 1 of 2: Code Generation

Deliverable: API Integration Code Framework (Python)

This document provides a comprehensive, production-ready Python framework for integrating with external RESTful APIs. This deliverable addresses the core requirements for generating robust, scalable, and maintainable API integration code, designed to be easily adaptable to various API specifications and authentication methods.


1. Introduction

This initial step of the "API Integration Builder" workflow focuses on generating the foundational code for interacting with an external API. Given the general nature of the request, we've developed a flexible Python-based framework that emphasizes best practices in API client design, including:

This framework provides a solid starting point that can be customized to the specific external API you wish to integrate with.

2. Core Concepts for API Integration

Before diving into the code, it's important to understand the underlying principles guiding this framework:

3. Proposed API Integration Framework (Python)

Our framework is structured into several components to ensure clarity and maintainability:

3.1. Prerequisites

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

text • 283 chars
#### 3.2. Configuration Management (`.env` file)

Sensitive information like API keys, client IDs, and secrets should never be hardcoded or committed to version control. We use `python-dotenv` to load these from a `.env` file.

**Create a file named `.env` in your project root:**

Sandboxed live preview

python

auth_strategies.py

import abc

import time

import requests

import logging

from typing import Dict, Any, Optional

from exceptions import APIAuthError, APIRequestError, APIResponseError

from config import Config

logger = logging.getLogger(__name__)

class AuthStrategy(abc.ABC):

"""Abstract Base Class for API authentication strategies."""

@abc.abstractmethod

def get_auth_headers(self) -> Dict[str, str]:

"""

Returns a dictionary of headers required for authentication.

"""

pass

class APIKeyAuthStrategy(AuthStrategy):

"""Authentication strategy using an API Key, typically sent in a header."""

def __init__(self, api_key: str, header_name: str = "X-API-Key"):

if not api_key:

raise APIAuthError("API Key cannot be empty.")

self.api_key = api_key

self.header_name = header_name

logger.debug(f"Initialized APIKeyAuthStrategy with header: {header_name}")

def get_auth_headers(self) -> Dict[str, str]:

"""

Returns the API Key as a header.

Example: {'X-API-Key': 'your_api_key'}

"""

return {self.header_name: self.api_key}

class OAuth2ClientCredentialsAuthStrategy(AuthStrategy):

"""

Authentication strategy for OAuth2 Client Credentials flow.

Obtains and caches an access token.

"""

def __init__(self, token_url: str, client_id: str, client_secret: str):

if not all([token_url, client_id, client_secret]):

raise APIAuthError("OAuth2 client credentials (token_url, client_id, client_secret) cannot be empty.")

self.token_url = token_url

self.client_id = client_id

self.client_secret = client_secret

self._access_token: Optional[str] = None

self._token_expiry_time: float = 0 # Unix timestamp

logger.debug(f"Initialized OAuth2ClientCredentialsAuthStrategy for {token_url}")

def _refresh_access_token(self):

"""

Requests a new access token using client credentials.

"""

logger.info("Refreshing OAuth2 access token...")

try:

response = requests.post(

self.token_url,

data={

"grant_type": "client_credentials",

"client_id": self.client_id,

"client_secret": self.client_secret,

},

timeout=Config.REQUEST_TIMEOUT

)

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

token_data = response.json()

self._access_token = token_data["access_token"]

expires_in = token_data.get("expires_in", 3600) # Default to 1 hour if not provided

self._token_expiry_time = time.time() + expires_in - 60 # Refresh 60 seconds before actual expiry

logger.info("OAuth2 access token refreshed successfully.")

except requests.exceptions.Timeout as e:

raise APIRequestError(f"OAuth2 token request timed out after {Config.REQUEST_TIMEOUT}s.", e)

except requests.exceptions.ConnectionError as e:

raise APIRequestError(f"Failed to connect to OAuth2 token endpoint: {self.token_url}", e)

except requests.exceptions.RequestException as e:

try:

error_details = e.response.json()

except (AttributeError, ValueError):

error_details = str(e)

raise APIAuthError(f"Failed to obtain OAuth2 access token: {error_details}", e)

except KeyError:

raise APIAuthError("OAuth2 token response missing 'access_token'.")

def get_auth_headers(self) -> Dict[str, str]:

"""

Returns the Authorization header with the access token. Refreshes if expired.

projectmanager Output

As a professional AI assistant within PantheraHive, I am pleased to present the detailed project initiation output for the "API Integration Builder" workflow. This document formally defines the project to integrate your system with an external API, outlining its scope, objectives, deliverables, and high-level plan.


Project Initiation: API Integration Builder - [Customer System Name] with [External API Name]

Date: October 26, 2023

Prepared For: [Customer Name/Organization]

Prepared By: PantheraHive Project Management Team


1. Project Overview

This document serves as the formal initiation of the API Integration project between your designated system, [Customer System Name], and the [External API Name]. The primary goal of this project is to establish a robust, secure, and efficient communication channel, enabling seamless data exchange and enhancing operational capabilities.

  • Project Title: Integration of [Customer System Name] with [External API Name]
  • Project Goal: To successfully integrate [Customer System Name] with [External API Name] to facilitate automated data synchronization and/or specific functional interactions, thereby streamlining business processes and improving data consistency.
  • Customer: [Customer Name/Organization]
  • PantheraHive Service: API Integration Builder

2. Project Scope & Objectives

2.1. In-Scope Activities

The following activities and components are within the scope of this initial project phase:

  • API Authentication & Authorization: Implementation of secure authentication mechanisms (e.g., OAuth2, API Keys, JWT) as required by [External API Name].
  • Core Endpoint Integration: Development of code to interact with specified key endpoints of the [External API Name] to perform defined operations (e.g., GET, POST, PUT, DELETE for specific resources).
  • Data Mapping & Transformation: Logic to map data structures between [Customer System Name] and [External API Name] formats, including necessary data transformations.
  • Request & Response Handling: Robust handling of API requests and parsing of responses, including pagination, filtering, and sorting where applicable.
  • Error Handling & Logging: Implementation of comprehensive error detection, reporting, and logging mechanisms for integration failures or API-specific errors.
  • Retries & Idempotency: Design and implementation of retry logic for transient errors and ensuring idempotent operations where critical.
  • Basic Unit & Integration Testing: Development of automated tests to ensure the reliability and correctness of the integrated components.
  • Deployment Script/Instructions: Provision of clear instructions or scripts for deploying the integration module into the target environment.
  • Basic Documentation: Creation of essential documentation for the integrated module, including setup, configuration, and usage guidelines.

2.2. Out-of-Scope Activities (Initial Phase)

The following activities are explicitly out of scope for this initial project phase and would require separate agreements or subsequent project phases:

  • Advanced UI/UX Development: Significant changes or redesign of existing user interfaces within [Customer System Name] to accommodate the integration.
  • Complex Business Process Re-engineering: Extensive overhaul of existing business processes within [Customer Name]'s operations beyond the direct scope of API interaction.
  • Long-Term Maintenance & Support Agreement: Ongoing maintenance, feature enhancements, or dedicated support beyond the initial warranty period (typically 30 days post-deployment).
  • Third-Party System Modifications: Any modifications required in other third-party systems not directly involved in the specified API integration.
  • Performance Optimization (Beyond Baseline): Extensive performance tuning or stress testing beyond ensuring the integration meets baseline operational requirements.
  • Advanced Analytics & Reporting: Development of complex dashboards or reporting tools based on integrated data.

2.3. Key Project Objectives

Upon successful completion, this project will achieve the following SMART (Specific, Measurable, Achievable, Relevant, Time-bound) objectives:

  • Objective 1: Establish Secure Connectivity: Successfully establish a secure, authenticated, and authorized connection between [Customer System Name] and [External API Name] within [X weeks] of project kickoff.
  • Objective 2: Implement Core Data Operations: Enable the creation, retrieval, update, and/or deletion of at least [Number] key resource types (e.g., customers, orders, products) via the [External API Name] within [Y weeks].
  • Objective 3: Ensure Data Integrity: Achieve a data mapping accuracy rate of at least 98% for all integrated data fields, as verified by unit and integration tests.
  • Objective 4: Provide Robust Error Handling: Implement error handling mechanisms that capture and log 100% of API-related errors, providing clear diagnostic information.
  • Objective 5: Deliver Production-Ready Module: Deploy a fully functional, tested, and documented integration module into a designated UAT/Staging environment within [Z weeks], ready for customer acceptance testing.

3. Key Deliverables

Upon project completion, [Customer Name] will receive the following:

  • Technical Design Document (TDD): Detailing the architecture, data flows, API specifications, authentication methods, and error handling strategies.
  • Integrated Code Module/Library: The actual source code for the API integration, written in the agreed-upon language/framework (e.g., Python, Node.js, Java).
  • Automated Test Suite: A collection of unit and integration tests covering the implemented API interactions.
  • Deployment Instructions/Scripts: Comprehensive guide on how to deploy and configure the integration module within your environment.
  • API Integration Usage Documentation: A guide for developers or administrators on how to interact with and manage the integrated module.
  • Project Status Reports: Regular updates on project progress, risks, and milestones.

4. High-Level Project Phases & Milestones

The project will proceed through the following high-level phases:

Phase 1: Discovery & Design ([Estimated Duration: X weeks])

  • Activities: Detailed requirements gathering, API endpoint analysis, data model alignment, authentication strategy finalization, environment setup, and technical design documentation.
  • Milestone: Technical Design Document Approval by [Customer Name].

Phase 2: Development & Implementation ([Estimated Duration: Y weeks])

  • Activities: Coding of API integration logic, data mapping, error handling, logging, and initial unit testing.
  • Milestone: Core Integration Module Completion & Internal Code Review.

Phase 3: Testing & Quality Assurance ([Estimated Duration: Z weeks])

  • Activities: Comprehensive unit testing, integration testing, system testing, and preparation for User Acceptance Testing (UAT).
  • Milestone: Successful completion of PantheraHive internal testing; Release Candidate for UAT.

Phase 4: Deployment & Handover ([Estimated Duration: A weeks])

  • Activities: Deployment to [Customer Name]'s UAT/Staging environment, User Acceptance Testing (UAT) by [Customer Name], bug fixing based on UAT feedback, final deployment to production, and handover of documentation.
  • Milestone: Successful UAT Completion & Production Go-Live.

5. Roles & Responsibilities

To ensure efficient project execution, clear roles and responsibilities are defined:

5.1. [Customer Name] Responsibilities

  • Project Sponsor: Overall project oversight, strategic guidance, and decision-making.
  • Subject Matter Experts (SMEs): Provide detailed insights into [Customer System Name]'s architecture, data structures, and business logic.
  • Technical Contacts: Grant necessary access to systems, APIs, and environments; provide technical support and clarification.
  • UAT Team: Conduct thorough User Acceptance Testing and provide timely feedback.
  • Approvals: Timely review and approval of deliverables (e.g., TDD, UAT sign-off).

5.2. PantheraHive Responsibilities

  • Project Manager: Overall project planning, execution, monitoring, control, and communication.
  • API Integration Developer(s): Design, develop, test, and document the integration module.
  • QA Engineer(s): Develop and execute test plans, ensuring quality and adherence to specifications.
  • Technical Lead: Provide technical guidance, architectural oversight, and ensure best practices.

6. Estimated Timeline

The estimated total duration for this project is [Total X+Y+Z+A weeks] from the project kickoff date, subject to timely approvals, resource availability, and prompt feedback from [Customer Name]. A detailed project schedule with specific dates will be provided during the Project Kick-off Meeting.

7. Next Steps

To formally commence this project and ensure a smooth start, we propose the following immediate next steps:

  1. Schedule Project Kick-off Meeting: A formal meeting will be scheduled with key stakeholders from both PantheraHive and [Customer Name] to introduce the team, review this project definition, and align on communication protocols.
  2. Finalize Detailed Requirements: During the kick-off, we will confirm and elaborate on the specific API endpoints, data fields, and business logic required for the integration.
  3. Resource Assignment: PantheraHive will formally assign dedicated project management and technical resources to your project.
  4. Review and Approval: Please review this Project Initiation document. Your formal approval will signify agreement on the project's scope, objectives, and deliverables, allowing us to proceed to detailed planning.

We are excited to partner with you on this API integration project and look forward to delivering a high-quality, efficient solution that enhances your operational capabilities. Please do not hesitate to reach out to your PantheraHive Project Manager with any questions or for 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);}});}