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

API Integration Builder: Code Generation for External APIs

This document provides a comprehensive and professional output for the "API Integration Builder" workflow, specifically focusing on the generate_code step. The goal is to deliver production-ready, well-commented code along with detailed explanations and best practices for integrating with external APIs.

Given the broad nature of "API Integration Builder," we will provide a robust, generic Python client structure for interacting with a RESTful API. This client will demonstrate common operations (GET, POST, PUT, DELETE), error handling, configuration management, and authentication considerations.


1. Introduction to the API Integration Client

This deliverable provides a foundational Python client designed to streamline interactions with a RESTful API. It encapsulates common HTTP methods, handles configuration, and incorporates essential error handling. The example uses a hypothetical "Todo Management API" (mimicking a common public API like JSONPlaceholder) to illustrate practical usage, but the structure is highly adaptable to any RESTful service.

Key Features:

2. Core Integration Logic: Python API Client

This section provides the Python code for a generic API client.

2.1. Project Setup and Dependencies

Before running the code, you'll need to set up your Python environment and install the necessary libraries.

  1. Create a Project Directory:
text • 273 chars
    *Note: For the JSONPlaceholder example, `API_KEY` is not strictly required, but it's included as a placeholder for real-world scenarios.*

5.  **Create `api_client.py`:**
    This will contain the main client logic.

#### 2.2. The `APIManager` Class (`api_client.py`)

Sandboxed live preview

python

main.py

import os

from api_client import APIManager

from dotenv import load_dotenv

import logging

Load environment variables (again, for good measure in main script)

load_dotenv()

Configure logging for main script

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

if __name__ == "__main__":

# Retrieve API configuration from environment variables

api_base_url = os.getenv("API_BASE_URL")

api_key = os.getenv("API_KEY") # This might be None if not set in .env or not needed

if not api_base_url:

logging.error("API_BASE_URL environment variable not set. Please check your .env file.")

exit(1)

try:

# Initialize the API client

api_client = APIManager(base_url=api_base_url, api_key=api_key)

logging.info("API Client initialized successfully.")

projectmanager Output

Project Creation: API Integration Builder

This document outlines the initial project setup phase for your API integration. Our "API Integration Builder" workflow is designed to streamline the process of connecting your systems with external APIs, enabling seamless data exchange and automated workflows. This step focuses on defining the project scope, gathering essential requirements, and establishing a clear roadmap for success.


1. Project Overview: API Integration Foundation

The goal of this "Project Creation" step is to establish a robust foundation for your API integration. By thoroughly understanding your objectives, the APIs involved, and your specific requirements, we can accurately scope the project, allocate resources, and ensure the resulting integration perfectly aligns with your business needs. This foundational work is critical for generating efficient, reliable, and maintainable integration code in subsequent steps.


2. Defining Project Scope and Objectives

To ensure a successful integration, we need to clearly define what the integration will achieve and how its success will be measured.

  • Integration Purpose:

* What specific business problem or opportunity will this integration address? (e.g., automate order fulfillment, synchronize customer data, enable real-time inventory updates, integrate payment gateway).

* What are the primary benefits you expect to gain? (e.g., reduced manual effort, improved data accuracy, faster processes, enhanced customer experience).

  • Target API(s):

* Which external API(s) are we integrating with? (e.g., Salesforce API, Stripe API, Shopify API, custom third-party API, internal legacy system API).

* Are there specific versions of these APIs that must be used?

  • Key Functionality & Use Cases:

* What specific operations will the integration perform? (e.g., Create new users, Retrieve orders, Update product inventory, Process payments, Send notifications).

* Can you describe the primary user stories or system interactions that this integration will enable?

  • Data Flow & Entities:

* Which data entities are involved? (e.g., Customers, Orders, Products, Payments, Shipments).

* Is the data flow unidirectional (e.g., System A to API B) or bidirectional (e.g., System A to API B and API B to System A)?

* What are the source and destination systems for each data entity?

  • Expected Outcomes & Key Performance Indicators (KPIs):

* How will we measure the success of this integration? (e.g., % reduction in manual data entry, latency of data synchronization, error rate, transaction volume).


3. Required Information for Project Setup

To initiate the project and begin the design phase, we require the following detailed information. Please provide as much detail as possible for each point.

3.1. General Project Details

  • Project Name: A concise and descriptive name for this integration project.
  • Primary Business Contact: Name, Title, Email, Phone number of the key business stakeholder.
  • Primary Technical Contact: Name, Title, Email, Phone number of the key technical resource.
  • Desired Go-Live Date: (If applicable)

3.2. Target API Details

  • API Name(s) and Provider: (e.g., "Salesforce REST API," "Stripe Payments API").
  • API Documentation Link(s): Direct URLs to the official API documentation (e.g., developer guides, OpenAPI/Swagger specifications).
  • Authentication Method:

* What authentication mechanism does the API use? (e.g., OAuth 2.0, API Key, Basic Authentication, JWT, Client Credentials Flow).

* If OAuth 2.0, what are the required scopes?

Crucially, please do not* provide credentials at this stage. We will establish secure methods for credential exchange later.

  • API Environment URLs:

* Base URL for Development/Sandbox environment.

* Base URL for Staging/Production environment (if known).

  • Rate Limits & Throttling: Are there any known rate limits or throttling policies for the API?

3.3. Internal System (Source/Destination) Details

  • System Name(s): The name(s) of your internal application(s) or database(s) that will interact with the external API.
  • Integration Method: How will our integration connect to your internal system? (e.g., internal REST API, database connection, message queue, webhooks, file transfer).
  • Access Requirements:

* For internal APIs: Documentation links, authentication details (similar to external API).

* For databases: Database type (e.g., MySQL, PostgreSQL, SQL Server), required tables/schemas, access protocols.

* For webhooks: Endpoint URLs where we can send notifications.

  • Data Model & Mapping:

* For each key data entity (e.g., Customer, Order), provide a list of relevant fields from your internal system that need to be synchronized with the external API.

* Indicate primary keys and unique identifiers.

* Preliminary mapping: How do fields in your system correspond to fields in the target API? (e.g., my_system.customer_id maps to api_name.account_id).

3.4. Integration Logic & Requirements

  • Integration Frequency/Trigger:

* Real-time (e.g., via webhooks, event streaming)?

* Scheduled (e.g., hourly, daily, weekly)? Specify exact timings if possible.

* On-demand (e.g., triggered by a user action)?

  • Data Transformation: Are there any complex data transformations required between your system's data model and the API's data model? (e.g., merging fields, reformatting dates, lookup tables).
  • Error Handling & Retries:

* How should errors be handled? (e.g., automatic retries, notification to specific personnel, logging, specific rollback procedures).

* What are the retry policies? (e.g., number of retries, delay between retries).

  • Conflict Resolution: If both systems can update the same data, how should conflicts be resolved? (e.g., last update wins, specific system takes precedence).
  • Logging & Monitoring:

* What level of logging is required? (e.g., debug, info, warn, error).

* Are there specific monitoring tools or dashboards you use?

* What alerts should be triggered in case of failure or unusual activity?

  • Security & Compliance:

* Are there specific security requirements (e.g., data encryption at rest/in transit, IP whitelisting)?

* Are there any regulatory compliance standards that this integration must adhere to (e.g., GDPR, HIPAA, PCI DSS)?


4. Project Phases & High-Level Deliverables

Our "API Integration Builder" workflow will proceed through the following high-level phases:

  • Phase 1: Discovery & Design (Current Step's Outcome)

* Objective: Gather detailed requirements, define architecture, and create a comprehensive integration design.

* Deliverables:

* Detailed Requirements Specification

* Integration Architecture Diagram

* Data Mapping Document

* Technical Design Document

  • Phase 2: Development & Testing

* Objective: Implement the integration logic, generate code, and thoroughly test its functionality, performance, and reliability.

* Deliverables:

* Clean, well-documented integration codebase

* Unit and Integration Test Reports

* Staging Environment Deployment

  • Phase 3: Deployment & Monitoring

* Objective: Deploy the integration to production, configure monitoring, and ensure operational readiness.

* Deliverables:

* Production Deployment

* Monitoring & Alerting Setup

* Operational Runbook

  • Phase 4: Support & Maintenance (Ongoing)

* Objective: Provide ongoing support, perform necessary updates, and implement enhancements as required.

* Deliverables:

* SLA-backed Support

* Regular Performance Reviews

* Enhancement Releases


5. Next Steps

  1. Review and Provide Information: Please review the "Required Information for Project Setup" section and provide the requested details.
  2. Schedule Deep Dive Call: Once we receive your initial input, we will schedule a dedicated "Discovery & Design" call to discuss your requirements in detail, clarify any ambiguities, and finalize the project scope.
  3. Initiate Phase 1: Upon completion of the deep dive and confirmation of requirements, we will formally initiate Phase 1, leveraging the gathered information to begin the architectural design and data mapping for your custom API integration.

We look forward to partnering with you to build a robust and efficient API integration solution!

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