API Documentation Generator
Run ID: 69ccea243e7fb09ff16a63fe2026-04-01Development
PantheraHive BOS
BOS Dashboard

API Documentation Generator: Architecture Plan

This document outlines a comprehensive architectural plan for the API Documentation Generator. The goal is to create a robust, flexible, and automated system capable of generating professional, interactive, and maintainable API documentation from various sources.


1. Executive Summary

The API Documentation Generator aims to streamline the process of creating high-quality API documentation. By automating the generation of endpoint descriptions, request/response examples, authentication guides, and SDK usage examples, the system will ensure consistency, accuracy, and accessibility for developers consuming the APIs. This architecture plan details the core components, data flow, technology recommendations, and deployment strategies required to build such a system.


2. System Goals & Vision


3. High-Level Architecture Overview

The API Documentation Generator will adopt a modular, pipeline-based architecture, comprising three main stages: Input Processing, Content Generation & Enrichment, and Output Rendering & Publishing. This design ensures clear separation of concerns, facilitating maintainability and scalability.

mermaid • 806 chars
graph TD
    A[API Definition Sources] --> B{Input Processor};
    B --> C[Internal Data Model];
    C --> D{Content Generator & Enricher};
    D --> E[Enriched Data Model];
    E --> F{Output Renderer & Publisher};
    F --> G[Generated Documentation];

    subgraph Input Sources
        A1[OpenAPI/Swagger Specs] --- A;
        A2[Postman Collections] --- A;
        A3[Custom Markdown/Guides] --- A;
        A4[Code Annotations (Future)] --- A;
    end

    subgraph Output Formats
        G1[Interactive HTML Site] --- G;
        G2[Markdown Files] --- G;
        G3[PDF (Optional)] --- G;
        G4[Integration with Dev Portals] --- G;
    end

    subgraph Key Modules
        B(Input Processor)
        D(Content Generator & Enricher)
        F(Output Renderer & Publisher)
    end
Sandboxed live preview

4. Detailed Component Breakdown

4.1. Input Processor Module

This module is the entry point, responsible for ingesting API definitions and supplementary content, parsing them, validating their structure, and transforming them into a unified internal data model.

  • Key Responsibilities:

* Schema Parsing:

* OpenAPI/Swagger Parser: Support OpenAPI Specification (OAS) versions 2.0, 3.0, and 3.1. Parse YAML/JSON files.

* Postman Collection Parser: Ingest Postman Collection v2.1 format to extract endpoints, requests, responses, and examples.

* Supplementary Content Parser: Read and parse standard Markdown files

gemini Output

The following detailed output provides a Python script designed to act as an "API Documentation Generator". This script takes an OpenAPI (Swagger) specification file (YAML or JSON) as input and generates comprehensive, human-readable API documentation in Markdown format.

This deliverable includes:

  • A ready-to-use Python script (api_doc_generator.py).
  • An example OpenAPI specification (openapi.yaml) to demonstrate its functionality.
  • Instructions on how to set up and run the generator.
  • A detailed explanation of the code and its components.
  • Suggestions for further enhancements.

1. Introduction: API Documentation Generator

This deliverable provides a robust and extensible Python script that serves as an "API Documentation Generator". Its primary function is

gemini Output

PantheraHive API Documentation

Welcome to the official documentation for the PantheraHive API! This guide provides comprehensive information on how to integrate with our services, access your data, and leverage the full power of the PantheraHive platform.

Our API is designed to be RESTful, predictable, and easy to use, allowing developers to build powerful applications and integrations. This documentation covers everything from authentication to detailed endpoint specifications, request/response examples, and SDK usage.


Table of Contents

  1. [Introduction](#1-introduction)
  2. [Getting Started](#2-getting-started)

* [Base URL](#base-url)

* [Authentication](#authentication)

  1. [API Endpoints](#3-api-endpoints)

* [Resources](#resources)

* [GET /resources](#get-resources)

* [POST /resources](#post-resources)

* [GET /resources/{id}](#get-resourcesid)

* [DELETE /resources/{id}](#delete-resourcesid)

* [Users](#users)

* [GET /users/{id}/profile](#get-usersidprofile)

  1. [Authentication Guide](#4-authentication-guide)

* [API Key Authentication](#api-key-authentication)

* [OAuth 2.0 (Optional)](#oauth-20-optional)

  1. [Error Handling](#5-error-handling)
  2. [SDKs and Libraries](#6-sdks-and-libraries)

* [Python SDK](#python-sdk)

* [Node.js SDK](#nodejs-sdk)

  1. [Rate Limiting](#7-rate-limiting)
  2. [Webhooks (Coming Soon)](#8-webhooks-coming-soon)
  3. [Support and Resources](#9-support-and-resources)

1. Introduction

The PantheraHive API allows programmatic access to your PantheraHive data and functionalities. You can manage resources, user profiles, and integrate PantheraHive features directly into your applications. All API requests are made over HTTPS and responses are returned in JSON format.

2. Getting Started

To begin interacting with the PantheraHive API, you'll need to understand the base URL and how to authenticate your requests.

Base URL

All requests to the PantheraHive API should be made to the following base URL:

https://api.pantherahive.com/v1

Authentication

The PantheraHive API primarily uses API Key Authentication. For certain advanced use cases, OAuth 2.0 may be available. You must include your API Key in the X-API-Key header for every request to authenticated endpoints. Refer to the [Authentication Guide](#4-authentication-guide) for detailed instructions.

3. API Endpoints

This section details all available API endpoints, including their methods, paths, parameters, and example requests/responses.

Resources

Manage your core resources within PantheraHive.

##### GET /resources

Retrieves a list of all available resources.

  • Description: Fetches a paginated list of resources.
  • Method: GET
  • Path: /resources
  • Query Parameters:

* limit (optional, integer): Maximum number of resources to return per page. Default is 10, max is 100.

* offset (optional, integer): The number of resources to skip before starting to collect the result set. Default is 0.

* category (optional, string): Filter resources by a specific category.

  • Headers:

* X-API-Key (required, string): Your PantheraHive API Key.

  • Example Request (cURL):

    curl -X GET \
      'https://api.pantherahive.com/v1/resources?limit=5&category=data' \
      -H 'Accept: application/json' \
      -H 'X-API-Key: YOUR_API_KEY'
  • Example Request (Python):

    import requests

    api_key = "YOUR_API_KEY"
    base_url = "https://api.pantherahive.com/v1"

    headers = {
        "X-API-Key": api_key,
        "Accept": "application/json"
    }
    params = {
        "limit": 5,
        "category": "data"
    }

    try:
        response = requests.get(f"{base_url}/resources", headers=headers, params=params)
        response.raise_for_status() # Raise an exception for HTTP errors
        resources = response.json()
        print(resources)
    except requests.exceptions.RequestException as e:
        print(f"Error: {e}")
  • Example Response (200 OK):

    {
      "data": [
        {
          "id": "res_abc123",
          "name": "Project Alpha Data",
          "category": "data",
          "status": "active",
          "createdAt": "2023-10-26T10:00:00Z",
          "updatedAt": "2023-10-26T10:00:00Z"
        },
        {
          "id": "res_def456",
          "name": "Marketing Campaign Assets",
          "category": "marketing",
          "status": "active",
          "createdAt": "2023-10-25T14:30:00Z",
          "updatedAt": "2023-10-26T09:15:00Z"
        }
      ],
      "pagination": {
        "total": 50,
        "limit": 5,
        "offset": 0,
        "nextOffset": 5
      }
    }

##### POST /resources

Creates a new resource.

  • Description: Adds a new resource to the PantheraHive platform.
  • Method: POST
  • Path: /resources
  • Headers:

* X-API-Key (required, string): Your PantheraHive API Key.

* Content-Type (required, string): application/json

  • Request Body (JSON):

* name (required, string): The name of the new resource. Max length 255 characters.

* category (required, string): The category the resource belongs to (e.g., "data", "marketing", "development").

* description (optional, string): A brief description of the resource.

* status (optional, string): Initial status of the resource. Default is "active".

  • Example Request (cURL):

    curl -X POST \
      https://api.pantherahive.com/v1/resources \
      -H 'Accept: application/json' \
      -H 'Content-Type: application/json' \
      -H 'X-API-Key: YOUR_API_KEY' \
      -d '{
            "name": "New Project Documentation",
            "category": "development",
            "description": "API documentation for the new microservice."
          }'
  • Example Request (Node.js):

    const axios = require('axios'); // npm install axios

    const apiKey = "YOUR_API_KEY";
    const baseUrl = "https://api.pantherahive.com/v1";

    const data = {
        name: "New Project Documentation",
        category: "development",
        description: "API documentation for the new microservice."
    };

    axios.post(`${baseUrl}/resources`, data, {
        headers: {
            "X-API-Key": apiKey,
            "Content-Type": "application/json",
            "Accept": "application/json"
        }
    })
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error("Error creating resource:", error.response ? error.response.data : error.message);
    });
  • Example Response (201 Created):

    {
      "id": "res_xyz789",
      "name": "New Project Documentation",
      "category": "development",
      "description": "API documentation for the new microservice.",
      "status": "active",
      "createdAt": "2023-10-26T15:30:00Z",
      "updatedAt": "2023-10-26T15:30:00Z"
    }

##### GET /resources/{id}

Retrieves a single resource by its ID.

  • Description: Fetches the details of a specific resource.
  • Method: GET
  • Path: /resources/{id}
  • Path Parameters:

* id (required, string): The unique identifier of the resource (e.g., res_abc123).

  • Headers:

* X-API-Key (required, string): Your PantheraHive API Key.

  • Example Request (cURL):

    curl -X GET \
      https://api.pantherahive.com/v1/resources/res_abc123 \
      -H 'Accept: application/json' \
      -H 'X-API-Key: YOUR_API_KEY'
  • Example Response (200 OK):

    {
      "id": "res_abc123",
      "name": "Project Alpha Data",
      "category": "data",
      "description": "Critical data set for Project Alpha.",
      "status": "active",
      "createdAt": "2023-10-26T10:00:00Z",
      "updatedAt": "2023-10-26T10:00:00Z"
    }
  • Example Response (404 Not Found):

    {
      "statusCode": 404,
      "message": "Resource with ID 'res_nonexistent' not found.",
      "errorCode": "RESOURCE_NOT_FOUND"
    }

##### DELETE /resources/{id}

Deletes a resource by its ID.

  • Description: Permanently removes a resource from the PantheraHive platform. This action is irreversible.
  • Method: DELETE
  • Path: /resources/{id}
  • Path Parameters:

* id (required, string): The unique identifier of the resource to delete.

  • Headers:

* X-API-Key (required, string): Your PantheraHive API Key.

  • Example Request (cURL):

    curl -X DELETE \
      https://api.pantherahive.com/v1/resources/res_def456 \
      -H 'Accept: application/json' \
      -H 'X-API-Key: YOUR_API_KEY'
  • Example Response (204 No Content):

(No body content, successful deletion)

  • Example Response (404 Not Found):

    {
      "statusCode": 404,
      "message": "Resource with ID 'res_nonexistent' not found.",
      "errorCode": "RESOURCE_NOT_FOUND"
    }

Users

Manage user-related information.

##### GET /users/{id}/profile

Retrieves a user's profile information.

  • Description: Fetches the public profile details for a specific user.
  • Method: GET
  • Path: /users/{id}/profile
  • Path Parameters:

* id (required, string): The unique identifier of the user (e.g., usr_12345).

  • Headers:

* X-API-Key (required, string): Your PantheraHive API Key.

  • Example Request (cURL):

    curl -X GET \
      https://api.pantherahive.com/v1/users/usr_12345/profile \
      -H 'Accept: application/json' \
      -H 'X-API-Key: YOUR_API_KEY'
  • Example Response (200 OK):

    {
      "id": "usr_12345",
      "firstName": "Jane",
      "lastName": "Doe",
      "email": "jane.doe@example.com",
      "organization": "Example Corp",
      "createdAt": "2023-01-15T08:00:00Z"
    }

4. Authentication Guide

All requests to the PantheraHive API must be authenticated. We support API Key authentication and, for specific applications, OAuth 2.0.

API Key Authentication

This is the primary method for authenticating with the PantheraHive API.

  1. Obtain your API Key:

* Log in to your PantheraHive Dashboard.

* Navigate to "Settings" -> "API Keys".

* Generate a new API Key if you don't have one, or use an existing one. Treat your API Key like a password; keep it secure and do not expose it in client-side code or public repositories.

  1. Include the API Key in requests:

* For every authenticated request, you must send your API Key in the X-API-Key HTTP header.


    X-API-Key: YOUR_API_KEY_HERE

* Example (cURL):


        curl -X GET \
          https://api.pantherahive.com/v1/resources \
          -H 'X-API-Key: pk_live_yourverysecretkey12345'

OAuth 2.0 (Optional)

For applications requiring user consent or third-party integrations, PantheraHive supports the OAuth 2.0 authorization code flow. This is typically used when your application needs to access a user's data without storing their PantheraHive credentials.

  • Authorization Endpoint: https://auth.pantherahive.com/oauth/authorize
  • Token Endpoint: https://auth.pantherahive.com/oauth/token
  • Scopes:

* read:resources: Allows reading of user's resources.

* write:resources: Allows creation, update, and deletion of user's resources.

* read:profile: Allows reading of user's public profile.

For detailed OAuth 2.0 implementation, please refer to our dedicated

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