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

API Integration Builder: Step 1 of 2 - Code Generation

This document outlines the comprehensive code generated for your API integration needs, serving as the first deliverable in the "API Integration Builder" workflow. Our goal in this step is to provide you with robust, clean, and production-ready code that forms the foundation for interacting with an external API.


1. Introduction: Building Your API Integration Foundation

Welcome to the code generation phase of your API integration project! In this crucial step, we've translated your requirements into a structured, executable codebase. This output is designed to be highly adaptable, well-documented, and ready for further customization and deployment within your existing systems.

The generated code focuses on establishing a reliable communication channel with an external API, handling common patterns like data retrieval (GET), data submission (POST), error management, and secure configuration. We've prioritized clarity, maintainability, and adherence to best practices to ensure a smooth integration experience.

2. Core Concepts of API Integration

Before diving into the code, let's briefly review the fundamental concepts underpinning this integration:

3. Code Generation Strategy

For this deliverable, we've adopted the following strategy:

4. Example Scenario: Interacting with JSONPlaceholder Posts

Our generated code demonstrates how to interact with the /posts endpoint of the JSONPlaceholder API. This includes:

5. Generated Code

Below is the Python code, structured into a client class, configuration, and an example usage script.

config.py

text • 81 chars
#### `.env` (Example - create this file in the same directory as your scripts)

Sandboxed live preview

python

from api_client import APIClient

import logging

Configure logging for the main script

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

logger = logging.getLogger(__name__)

def run_api_examples():

"""

Demonstrates various API interactions

projectmanager Output

Deliverable: API Integration Builder - Project Creation

This document provides a comprehensive and professional guide for integrating with external APIs, specifically focusing on the "create_project" action within a Project Management system. This output is designed to be a direct, actionable deliverable for our customers, enabling them to build robust and efficient API integrations.


1. Introduction & Objective

The "API Integration Builder" workflow is designed to empower you with the tools and knowledge to seamlessly connect your systems with various external APIs. This particular step focuses on a critical business operation: creating a new project programmatically via an API call to a Project Management system.

Our objective is to provide you with a detailed framework, conceptual code examples, and best practices to successfully implement an integration that can:

  • Authenticate securely with a Project Management API.
  • Construct and send a request to create a new project.
  • Process the API response, including success and error scenarios.
  • Adhere to industry best practices for reliable and secure integrations.

2. Core Principles of API Integration

Before diving into the specifics of project creation, let's review the fundamental principles applicable to any API integration:

  • API Documentation Review: This is the absolute first step. Thoroughly understand the target API's documentation, including available endpoints, required parameters, authentication methods, rate limits, and error codes.
  • Authentication & Authorization: Securely identify your application to the API. Common methods include API Keys, OAuth 2.0, and Bearer Tokens. Ensure your application has the necessary permissions (authorization) to perform the desired actions.
  • HTTP Methods & Endpoints: Understand which HTTP method (GET, POST, PUT, DELETE) corresponds to which action, and the specific URL (endpoint) to target for that action. For creating resources, POST is typically used.
  • Request & Response Structures: APIs communicate using structured data, often JSON or XML. You'll need to know how to construct the request body (payload) and how to parse the response data.
  • Error Handling Strategies: Plan for failures. APIs will return error codes (e.g., 4xx for client errors, 5xx for server errors). Your integration must gracefully handle these, providing informative feedback and potentially retry mechanisms.

3. Detailed Guide: Integrating to Create a Project

This section provides a step-by-step guide specific to integrating with a Project Management API to create a project.

Step 1: Select Your Project Management API

Choose the specific Project Management platform you intend to integrate with. Popular choices include:

  • Jira: Widely used for software development and project tracking.
  • Asana: Known for its task management and project organization features.
  • Monday.com: A highly visual workflow management platform.
  • ClickUp: An all-in-one productivity platform.
  • Trello: Simple, flexible, and visual project management with boards.

For the purpose of this guide, we will use a generic ProjectManagementAPI concept, but the principles apply universally. Always refer to your chosen API's official documentation.

Step 2: Understand the Create Project Endpoint

Locate the specific endpoint in the API documentation for creating a new project.

  • HTTP Method: This will almost always be POST.
  • Endpoint URL Pattern: Typically looks like /projects, /workspaces/{workspace_id}/projects, or /api/v2/createProject.

Example:* https://api.projectmanagementtool.com/v1/projects

  • Required Headers:

* Content-Type: application/json (most common for JSON payloads)

* Authorization: Bearer YOUR_ACCESS_TOKEN (or similar for API Keys)

  • Request Body Payload: This is a JSON object containing the details of the project you want to create. Common fields include:

* name (string, required): The name of the new project.

* description (string, optional): A detailed description of the project.

* owner_id (string/integer, optional): The ID of the user who will own the project.

* start_date (date string, optional): The project's start date (e.g., "YYYY-MM-DD").

* end_date (date string, optional): The project's planned end date.

* status (string, optional): Initial status (e.g., "Active", "Planning").

* template_id (string, optional): If the API supports creating projects from templates.

* workspace_id (string/integer, required if applicable): The ID of the workspace/organization the project belongs to.

Step 3: Implement Authentication

Before making any requests, you must authenticate.

  • API Key: Often passed as a header (e.g., X-API-Key) or a query parameter.
  • OAuth 2.0: Involves obtaining an access token (typically a Bearer Token) through an authorization flow. This token is then sent in the Authorization header.
  • Basic Authentication: Less common for modern APIs, but involves encoding username/password.

Example (using Bearer Token):


Authorization: Bearer YOUR_GENERATED_ACCESS_TOKEN

Important: Never hardcode sensitive credentials directly in your code. Use environment variables or a secure configuration management system.

Step 4: Construct and Send the Request (Conceptual Code Example - Python)

This example demonstrates how to make a POST request using Python's requests library. The principles are transferable to other languages (Node.js with axios, Java with HttpClient, etc.).


import requests
import os
import json

# --- Configuration ---
# It's best practice to load sensitive information from environment variables
API_BASE_URL = os.getenv("PROJECT_MANAGEMENT_API_BASE_URL", "https://api.projectmanagementtool.com/v1")
ACCESS_TOKEN = os.getenv("PROJECT_MANAGEMENT_API_TOKEN", "YOUR_SECURE_ACCESS_TOKEN_HERE") # Replace with actual token or env var

# --- Endpoint for creating a project ---
CREATE_PROJECT_ENDPOINT = f"{API_BASE_URL}/projects"

# --- Project Data Payload ---
# Customize this dictionary with the actual fields required by your chosen API
project_data = {
    "name": "New Marketing Campaign Launch",
    "description": "Plan and execute the launch of our Q3 marketing campaign.",
    "owner_id": "user_12345", # Example user ID
    "start_date": "2023-09-01",
    "end_date": "2023-11-30",
    "status": "Planning",
    "priority": "High",
    "tags": ["marketing", "launch", "Q3"],
    "workspace_id": "workspace_abc" # Required by some APIs
}

# --- Request Headers ---
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {ACCESS_TOKEN}"
}

print(f"Attempting to create project at: {CREATE_PROJECT_ENDPOINT}")
print(f"Request Payload: {json.dumps(project_data, indent=2)}")

try:
    # Send the POST request
    response = requests.post(CREATE_PROJECT_ENDPOINT, headers=headers, json=project_data)

    # --- Step 5: Process the API Response ---
    if response.status_code == 201: # 201 Created is common for successful resource creation
        print("\nProject created successfully!")
        project_details = response.json()
        print(f"New Project ID: {project_details.get('id')}")
        print(f"Project Name: {project_details.get('name')}")
        print(f"Full Response: {json.dumps(project_details, indent=2)}")
    elif response.status_code == 200: # Some APIs might return 200 OK even for creation
        print("\nProject creation request successful (HTTP 200 OK).")
        project_details = response.json()
        print(f"New Project ID: {project_details.get('id')}")
        print(f"Project Name: {project_details.get('name')}")
        print(f"Full Response: {json.dumps(project_details, indent=2)}")
    else:
        # --- Step 6: Implement Robust Error Handling ---
        print(f"\nFailed to create project. HTTP Status Code: {response.status_code}")
        try:
            error_response = response.json()
            print(f"Error Details: {json.dumps(error_response, indent=2)}")
            # Specific error handling based on common API error codes/messages
            if response.status_code == 400:
                print("Bad Request: Check your project data payload for missing/invalid fields.")
            elif response.status_code == 401:
                print("Unauthorized: Check your access token or authentication method.")
            elif response.status_code == 403:
                print("Forbidden: Your token might not have permissions to create projects.")
            elif response.status_code == 409:
                print("Conflict: A project with this name or ID might already exist (if unique name is enforced).")
            elif response.status_code == 429:
                print("Rate Limit Exceeded: You are sending too many requests too quickly.")
            elif response.status_code >= 500:
                print("Server Error: The API server encountered an issue. Try again later.")
        except json.JSONDecodeError:
            print(f"Error: Could not parse JSON response. Raw response: {response.text}")

except requests.exceptions.ConnectionError as e:
    print(f"\nConnection Error: Could not connect to the API. Check URL and network. Error: {e}")
except requests.exceptions.Timeout as e:
    print(f"\nTimeout Error: The request timed out. Error: {e}")
except requests.exceptions.RequestException as e:
    print(f"\nAn unexpected request error occurred: {e}")

Step 5: Process the API Response

Upon receiving a response, your application needs to interpret it:

  • Success (2xx Status Codes):

* 201 Created: The most common success code for resource creation. The response body usually contains the details of the newly created project, including its unique ID.

* 200 OK: Some APIs might return 200 even for creation, especially if it's an upsert operation or part of a larger workflow.

* Parse the JSON response body to extract the new project's ID and any other relevant information.

  • Failure (4xx and 5xx Status Codes):

* 400 Bad Request: Your request payload was malformed or contained invalid data. The response body often provides specific validation errors.

* 401 Unauthorized: Your authentication credentials are missing or invalid.

* 403 Forbidden: Your authenticated user/application does not have the necessary permissions to perform this action.

* 404 Not Found: The endpoint URL might be incorrect, or a referenced resource (e.g., workspace_id) does not exist.

* 409 Conflict: The resource you are trying to create already exists (e.g., project name must be unique).

* 429 Too Many Requests: You have exceeded the API's rate limits.

* 5xx Server Error: An issue on the API provider's side. These are typically transient, and a retry strategy might be appropriate.

Step 6: Implement Robust Error Handling

As demonstrated in the code example, comprehensive error handling is crucial for production-ready integrations:

  • HTTP Status Codes: Always check response.status_code.
  • Parse Error Details: If the API returns a JSON error body, parse it to get specific error messages or codes.
  • Specific Handlers: Implement logic for common errors (e.g., retry on 429 or 5xx with exponential backoff, notify administrators on 403).
  • Connection Errors: Handle network-related issues (timeouts, connection refused).
  • Logging: Log all successful and failed API calls, including request and response details (masking sensitive information).

4. Best Practices for Production Integrations

To ensure your integration is reliable, secure, and maintainable:

  • Security Considerations:

* Credential Management: Never hardcode API keys or tokens. Use environment variables, secret management services (e.g., AWS Secrets Manager, Azure Key Vault), or secure configuration files.

* HTTPS: Always use HTTPS

api_integration_builder.txt
Download source file
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' ReactDOM.createRoot(document.getElementById('root')!).render( ) "); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react' import './App.css' function App(){ return(

"+slugTitle(pn)+"

Built with PantheraHive BOS

) } export default App "); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e} .app{min-height:100vh;display:flex;flex-direction:column} .app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px} h1{font-size:2.5rem;font-weight:700} "); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` ## Open in IDE Open the project folder in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.5.13", "vue-router": "^4.4.5", "pinia": "^2.3.0", "axios": "^1.7.9" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.3", "vite": "^6.0.5", "vue-tsc": "^2.2.0" } } '); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname,'src') } } }) "); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]} '); zip.file(folder+"tsconfig.app.json",'{ "compilerOptions":{ "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"], "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true, "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue", "strict":true,"paths":{"@/*":["./src/*"]} }, "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"] } '); zip.file(folder+"env.d.ts","/// "); zip.file(folder+"index.html"," "+slugTitle(pn)+"
"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import './assets/main.css' const app = createApp(App) app.use(createPinia()) app.mount('#app') "); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue"," "); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547} "); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` Open in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test" }, "dependencies": { "@angular/animations": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "typescript": "~5.6.0" } } '); zip.file(folder+"angular.json",'{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "'+pn+'": { "projectType": "application", "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/'+pn+'", "index": "src/index.html", "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "styles": ["src/styles.css"], "scripts": [] } }, "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"} } } } } '); zip.file(folder+"tsconfig.json",'{ "compileOnSave": false, "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]}, "references":[{"path":"./tsconfig.app.json"}] } '); zip.file(folder+"tsconfig.app.json",'{ "extends":"./tsconfig.json", "compilerOptions":{"outDir":"./dist/out-tsc","types":[]}, "files":["src/main.ts"], "include":["src/**/*.d.ts"] } '); zip.file(folder+"src/index.html"," "+slugTitle(pn)+" "); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch(err => console.error(err)); "); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; } "); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet], templateUrl: './app.component.html', styleUrl: './app.component.css' }) export class AppComponent { title = '"+pn+"'; } "); zip.file(folder+"src/app/app.component.html","

"+slugTitle(pn)+"

Built with PantheraHive BOS

"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1} "); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes) ] }; "); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router'; export const routes: Routes = []; "); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install ng serve # or: npm start ``` ## Build ```bash ng build ``` Open in VS Code with Angular Language Service extension. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local .angular/ "); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join(" "):"# add dependencies here "; zip.file(folder+"main.py",src||"# "+title+" # Generated by PantheraHive BOS print(title+" loaded") "); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## Run ```bash python main.py ``` "); zip.file(folder+".gitignore",".venv/ __pycache__/ *.pyc .env .DS_Store "); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+" "; zip.file(folder+"package.json",pkgJson); var fallback="const express=require("express"); const app=express(); app.use(express.json()); app.get("/",(req,res)=>{ res.json({message:""+title+" API"}); }); const PORT=process.env.PORT||3000; app.listen(PORT,()=>console.log("Server on port "+PORT)); "; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000 "); zip.file(folder+".gitignore","node_modules/ .env .DS_Store "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash npm install ``` ## Run ```bash npm run dev ``` "); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:" "+title+" "+code+" "; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */ *{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e} "); zip.file(folder+"script.js","/* "+title+" — scripts */ "); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Open Double-click `index.html` in your browser. Or serve locally: ```bash npx serve . # or python3 -m http.server 3000 ``` "); zip.file(folder+".gitignore",".DS_Store node_modules/ .env "); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/**(.+?)**/g,"$1"); hc=hc.replace(/ {2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. Files: - "+app+".md (Markdown) - "+app+".html (styled HTML) "); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); }function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}