API Documentation Generator
Run ID: 69cb676661b1021a29a88b832026-03-31Development
PantheraHive BOS
BOS Dashboard

As part of the "API Documentation Generator" workflow, this deliverable outlines the detailed architectural plan for developing a robust, professional, and efficient system. The goal is to create a solution that can ingest various API definitions and generate comprehensive, user-friendly documentation with advanced features.


API Documentation Generator: Architecture Plan

This document details the architectural blueprint for the API Documentation Generator. It covers the core components, data flow, key technologies, and design considerations to ensure a scalable, maintainable, and feature-rich system.

1. Core Objectives

The primary objectives of this architecture are to:

2. High-Level Architecture Overview

The API Documentation Generator will follow a modular architecture, separating concerns into distinct components for input processing, data modeling, rendering, and output generation.

mermaid • 1,272 chars
graph TD
    subgraph Input Sources
        A[OpenAPI/Swagger Spec (YAML/JSON)]
        B[Code Annotations (e.g., JSDoc, PHPDoc, GoDoc)]
        C[Postman Collections]
        D[Manual Markdown/Asciidoc Files]
    end

    subgraph Core Processing Engine
        E[API Spec Parser & Validator]
        F[Internal API Data Model]
        G[Templating & Rendering Engine]
        H[Syntax Highlighter & Code Example Generator]
        I[Authentication & Security Guide Generator]
        J[SDK Usage Example Integrator]
    end

    subgraph Output Formats
        K[Static HTML (Web)]
        L[Markdown (GitHub Wiki)]
        M[PDF (Offline)]
        N[Interactive UI (e.g., Swagger UI, Redoc)]
    end

    subgraph Deployment & Hosting
        O[CI/CD Integration]
        P[Static Site Hosting (S3, Netlify, Vercel)]
        Q[Containerization (Docker)]
    end

    A --> E
    B --> E
    C --> E
    D --> E
    E --> F
    F --> G
    F --> H
    F --> I
    F --> J
    G --> K
    G --> L
    G --> M
    G --> N
    K --> O
    L --> O
    M --> O
    N --> O
    O --> P
    subgraph User Interface (Optional, for Managed Service)
        U[Web UI for Configuration & Preview]
        V[Version Control & Publishing]
    end
    U --> E
    U --> G
    U --> V
Sandboxed live preview

3. Detailed Architectural Components

3.1. Input Sources

The system will be designed to accept API definitions from various sources, with a strong emphasis on standardized formats.

  • OpenAPI/Swagger Specification (YAML/JSON):

* Primary Input: This will be the most robust and feature-rich input method, allowing for comprehensive API descriptions.

* Versioning: Support for OpenAPI 3.0.x and 3.1.x.

  • Code Annotations:

* Secondary Input: Integration with tools that extract API definitions directly from code comments (e.g., using swagger-jsdoc for Node.js, drf-yasg for Django REST Framework, springdoc-openapi for Spring Boot). This requires language-specific parsers.

  • Postman Collections:

* Utility Input: Ability to import Postman collections and convert them into a compatible internal format, providing a pathway for teams already using Postman for API definition.

  • Manual Markdown/Asciidoc Files:

* Supplemental Content: Allows for adding custom sections, tutorials, or conceptual documentation that is not part of the API specification itself (e.g., "Getting Started" guides, "Glossary").

3.2. Core Processing Engine

This is the heart of the generator, responsible for parsing, validating, transforming, and enriching the API data.

  • API Spec Parser & Validator:

* Functionality: Reads the input (OAS, Postman, etc.), validates its schema, and converts it into a standardized internal data model.

* Error Handling: Provides clear error messages for invalid specifications.

* Technology Choice: Dedicated OpenAPI parsers (e.g., swagger-parser for JS, pyyaml with custom logic for Python) or existing libraries for other formats.

  • Internal API Data Model:

* Structure: A language-agnostic, normalized representation of the API, containing all necessary information: endpoints, parameters (path, query, header, body), request/response schemas, security schemes, tags, examples, servers, etc.

* Purpose: Decouples the input format from the rendering process, allowing for flexible output generation.

  • Templating & Rendering Engine:

* Functionality: Takes the internal API Data Model and renders it into various output formats using predefined or custom templates.

* Flexibility: Supports multiple templating languages (e.g., Jinja2 for Python, Handlebars for JavaScript, Go Templates) to allow for diverse output styles.

* Customization: Users can supply their own templates to control the look and feel, and content structure.

  • Syntax Highlighter & Code Example Generator:

* Functionality: Automatically generates code examples for API requests and responses in multiple programming languages (e.g., cURL, Python, JavaScript, Java, Go, Ruby) based on the API specification.

* Technology Choice: Libraries like highlight.js, Pygments, or custom code generation logic.

  • Authentication & Security Guide Generator:

* Functionality: Interprets the security schemes defined in the API specification (e.g., API Key, OAuth2, Bearer Token) and generates clear, actionable instructions and examples on how to authenticate requests.

  • SDK Usage Example Integrator (Optional/Advanced):

* Functionality: If an SDK exists or can be generated, this component provides examples of how to use the SDK to interact with the API's endpoints. This might involve integration with tools like OpenAPI Generator.

3.3. Output Formats

The generator will support diverse output formats to cater to different deployment and consumption needs.

  • Static HTML (Web-based Documentation):

* Primary Output: Generates a set of static HTML, CSS, and JavaScript files, suitable for deployment on any web server or static site host.

* Features: Search functionality, interactive elements ("Try it out"), responsive design, customizable themes.

* Technology Choice: Integration with static site generators (e.g., Docusaurus, Next.js with MDX, Hugo, Jekyll, Sphinx) or custom rendering.

  • Markdown (for GitHub Wikis, Internal Docs):

* Utility Output: Produces .md files, ideal for embedding within internal documentation systems, GitHub wikis, or other Markdown-based platforms.

  • PDF (for Offline Consumption):

* Printable Output: Generates a printable PDF version of the documentation, suitable for offline viewing or distribution.

* Technology Choice: Libraries like wkhtmltopdf or browser-based PDF generation.

  • Interactive UI (e.g., Swagger UI, Redoc):

* Direct Rendering: The ability to directly render the OpenAPI specification using popular open-source tools like Swagger UI or Redoc, offering a highly interactive and standardized view. This might be a standalone deployment option.

3.4. User Interface (Optional, for Managed Service/Desktop Application)

For a more user-friendly experience, a graphical interface can be developed.

  • Web UI for Configuration & Preview:

* Functionality: Allows users to upload/select API specifications, choose templates, configure generation options, and preview the documentation before publishing.

* Technology Choice: React, Vue, Angular for front-end; RESTful API for back-end.

  • Version Control & Publishing:

* Functionality: Manages different versions of API documentation, allows for staging and production deployments, and integrates with publishing workflows.

3.5. Deployment & Hosting

The generated documentation is designed for easy deployment.

  • CI/CD Integration:

* Automation: Seamless integration with Continuous Integration/Continuous Deployment pipelines (e.g., GitHub Actions, GitLab CI/CD, Jenkins) to automatically generate and deploy documentation upon API definition changes.

  • Static Site Hosting:

* Scalability: Generated static HTML can be hosted on cost-effective, high-performance static site hosting platforms (e.g., AWS S3, Azure Static Web Apps, Netlify, Vercel, GitHub Pages).

  • Containerization (Docker):

* Portability: The entire generator application can be containerized using Docker, ensuring consistent execution across different environments and simplifying deployment.

4. Key Technology Considerations (Examples)

  • Primary Programming Language: Python or Node.js (for rich ecosystem of parsing and templating libraries).
  • OpenAPI Parsing: PyYAML + pydantic (Python), swagger-parser (Node.js).
  • Templating: Jinja2 (Python), Handlebars (Node.js).
  • Static Site Generation: Docusaurus (React-based, excellent for documentation), Hugo (Go, very fast), Sphinx (Python, for technical docs).
  • Syntax Highlighting: Pygments (Python), highlight.js (JavaScript).
  • PDF Generation: WeasyPrint (Python), wkhtmltopdf.
  • Containerization: Docker.

5. Non-Functional Requirements & Cross-Cutting Concerns

  • Performance: Efficient parsing and rendering to quickly generate documentation, especially for large APIs.
  • Scalability: For a hosted solution, the ability to handle multiple documentation generation requests concurrently. For a local tool, efficient resource usage.
  • Security: Input validation, sanitization of user-provided content (if applicable), and secure handling of any configuration data.
  • Maintainability: Modular code, clear documentation, adherence to coding standards, and comprehensive testing.
  • Extensibility: A well-defined plugin architecture or clear extension points for adding new input formats, output templates, or custom processing steps.
  • Usability: If a UI is developed, it must be intuitive and user-friendly. The generated documentation must also be easy to navigate and read.
  • Version Control: The ability to track changes in API definitions and generated documentation over time.
  • Accessibility: Generated documentation should adhere to WCAG standards where possible.

6. Future Enhancements

  • Multi-language Support: Ability to generate documentation in multiple human languages.
  • Change Log Generation: Automatically generate a changelog based on differences between API specification versions.
  • Advanced Analytics: Integration with analytics tools to track documentation usage.
  • Authentication Integration: For a hosted solution, robust user authentication and authorization.
  • AI-Powered Content Generation: Potentially use AI to enrich descriptions, generate examples, or summarize complex sections.

This architectural plan provides a solid foundation for developing a powerful and versatile API Documentation Generator. The modular design ensures flexibility, maintainability, and the ability to evolve with future requirements and technologies.

gemini Output

The following output provides comprehensive, detailed, and professional code examples designed to be directly integrated into your API documentation. These examples cover common API operations (CRUD) and authentication patterns across popular programming languages and tools, serving as practical SDK usage guides. Each code block is production-ready, well-commented, and includes explanations for clarity.


API Documentation Code Examples

This section provides production-ready code examples demonstrating how to interact with a hypothetical RESTful API. These examples are designed to be directly integrated into your API documentation, serving as practical SDK usage guides for various programming languages and tools. Each example includes clear explanations, showcasing common API operations and authentication patterns.

API Base URL and Authentication

For these examples, we assume the following:

  • API Base URL: `https://
gemini Output

API Documentation: E-commerce Product Management API

Welcome to the comprehensive documentation for the E-commerce Product Management API. This guide provides detailed information on how to interact with our API, including authentication, available endpoints, request/response formats, and SDK usage examples.


1. Introduction

The E-commerce Product Management API allows developers to programmatically manage product listings, categories, inventory, and related data within an e-commerce platform. It provides a RESTful interface for creating, retrieving, updating, and deleting product information, facilitating seamless integration with various front-end applications, inventory systems, and third-party services.


2. Base URL

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

https://api.yourcompany.com/v1


3. Authentication

The E-commerce Product Management API uses API Key authentication. You must include your API Key in the Authorization header of every request.

3.1. Obtaining Your API Key

  1. Log in to your developer dashboard at [https://developer.yourcompany.com](https://developer.yourcompany.com).
  2. Navigate to the "API Keys" section.
  3. Generate a new API Key if you don't already have one.
  4. Keep your API Key secure and do not share it publicly.

3.2. Including Your API Key in Requests

Include your API Key in the Authorization header with the Bearer scheme:

Authorization: Bearer YOUR_API_KEY

Example:


GET /v1/products
Authorization: Bearer sk_live_YOUR_API_KEY
Content-Type: application/json

4. Endpoints

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

4.1. Products

##### 4.1.1. List All Products

Retrieve a paginated list of all products.

  • HTTP Method: GET
  • Path: /products
  • Description: Returns an array of product objects, optionally filtered and paginated.

###### Request Parameters

| Parameter | Type | Location | Description | Required |

| :-------- | :----- | :------- | :---------------------------------------- | :------- |

| limit | Integer | Query | Maximum number of products to return (default: 10, max: 100). | Optional |

| offset | Integer | Query | Number of products to skip (for pagination). | Optional |

| category| String | Query | Filter products by category slug. | Optional |

| status | String | Query | Filter products by status (active, draft, archived). | Optional |

###### Request Example

cURL


curl -X GET \
  'https://api.yourcompany.com/v1/products?limit=5&category=electronics' \
  -H 'Authorization: Bearer sk_live_YOUR_API_KEY' \
  -H 'Content-Type: application/json'

Python (using requests library)


import requests

api_key = "sk_live_YOUR_API_KEY"
base_url = "https://api.yourcompany.com/v1"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}
params = {
    "limit": 5,
    "category": "electronics"
}

response = requests.get(f"{base_url}/products", headers=headers, params=params)

if response.status_code == 200:
    print(response.json())
else:
    print(f"Error: {response.status_code} - {response.text}")

Node.js (using axios library)


const axios = require('axios');

const apiKey = "sk_live_YOUR_API_KEY";
const baseUrl = "https://api.yourcompany.com/v1";

const headers = {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json"
};
const params = {
    "limit": 5,
    "category": "electronics"
};

axios.get(`${baseUrl}/products`, { headers, params })
    .then(response => {
        console.log(response.data);
    })
    .catch(error => {
        console.error(`Error: ${error.response.status} - ${error.response.data}`);
    });

###### Response Examples

Success (Status: 200 OK)


{
  "data": [
    {
      "id": "prod_abc123",
      "name": "Wireless Noise-Cancelling Headphones",
      "slug": "wireless-noise-cancelling-headphones",
      "description": "Premium over-ear headphones with active noise cancellation and 30-hour battery life.",
      "price": {
        "amount": 299.99,
        "currency": "USD"
      },
      "category": {
        "id": "cat_def456",
        "name": "Electronics",
        "slug": "electronics"
      },
      "sku": "WH-NC-001",
      "stock": 150,
      "status": "active",
      "images": [
        {
          "id": "img_ghi789",
          "url": "https://cdn.yourcompany.com/prod_abc123/image1.jpg",
          "alt": "Front view of headphones"
        }
      ],
      "created_at": "2023-01-15T10:00:00Z",
      "updated_at": "2023-08-20T14:30:00Z"
    },
    {
      "id": "prod_xyz987",
      "name": "Smartwatch Series 7",
      "slug": "smartwatch-series-7",
      "description": "Advanced smartwatch with health tracking, GPS, and cellular capabilities.",
      "price": {
        "amount": 399.00,
        "currency": "USD"
      },
      "category": {
        "id": "cat_def456",
        "name": "Electronics",
        "slug": "electronics"
      },
      "sku": "SMW-S7-001",
      "stock": 80,
      "status": "active",
      "images": [
        {
          "id": "img_jkl012",
          "url": "https://cdn.yourcompany.com/prod_xyz987/image1.jpg",
          "alt": "Smartwatch on wrist"
        }
      ],
      "created_at": "2023-02-01T09:00:00Z",
      "updated_at": "2023-09-01T11:00:00Z"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 5,
    "offset": 0
  }
}

Error (Status: 401 Unauthorized)


{
  "error": {
    "code": "AUTHENTICATION_FAILED",
    "message": "Invalid or missing API key.",
    "details": "Please ensure your Authorization header contains a valid Bearer token."
  }
}

##### 4.1.2. Retrieve a Specific Product

Retrieve details for a single product by its ID.

  • HTTP Method: GET
  • Path: /products/{productId}
  • Description: Returns a single product object matching the provided productId.

###### Request Parameters

| Parameter | Type | Location | Description | Required |

| :---------- | :----- | :------- | :------------------------------ | :------- |

| productId | String | Path | The unique identifier of the product. | Yes |

###### Request Example

cURL


curl -X GET \
  'https://api.yourcompany.com/v1/products/prod_abc123' \
  -H 'Authorization: Bearer sk_live_YOUR_API_KEY' \
  -H 'Content-Type: application/json'

Python


import requests

api_key = "sk_live_YOUR_API_KEY"
base_url = "https://api.yourcompany.com/v1"
product_id = "prod_abc123"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}

response = requests.get(f"{base_url}/products/{product_id}", headers=headers)

if response.status_code == 200:
    print(response.json())
else:
    print(f"Error: {response.status_code} - {response.text}")

###### Response Examples

Success (Status: 200 OK)


{
  "id": "prod_abc123",
  "name": "Wireless Noise-Cancelling Headphones",
  "slug": "wireless-noise-cancelling-headphones",
  "description": "Premium over-ear headphones with active noise cancellation and 30-hour battery life.",
  "price": {
    "amount": 299.99,
    "currency": "USD"
  },
  "category": {
    "id": "cat_def456",
    "name": "Electronics",
    "slug": "electronics"
  },
  "sku": "WH-NC-001",
  "stock": 150,
  "status": "active",
  "images": [
    {
      "id": "img_ghi789",
      "url": "https://cdn.yourcompany.com/prod_abc123/image1.jpg",
      "alt": "Front view of headphones"
    },
    {
      "id": "img_jkl012",
      "url": "https://cdn.yourcompany.com/prod_abc123/image2.jpg",
      "alt": "Side view of headphones"
    }
  ],
  "created_at": "2023-01-15T10:00:00Z",
  "updated_at": "2023-08-20T14:30:00Z"
}

Error (Status: 404 Not Found)


{
  "error": {
    "code": "PRODUCT_NOT_FOUND",
    "message": "The product with ID 'prod_nonexistent' could not be found.",
    "details": "Please verify the product ID and try again."
  }
}

##### 4.1.3. Create a New Product

Create a new product listing.

  • HTTP Method: POST
  • Path: /products
  • Description: Creates a new product in the system and returns the newly created product object.

###### Request Body

| Parameter | Type | Description | Required |

| :---------- | :------ | :---------------------------------------------------------- | :------- |

| name | String | The name of the product. | Yes |

| description | String | A detailed description of the product. | Yes |

| price | Object | An object containing amount (float) and currency (string, e.g., "USD"). | Yes |

| category_id | String | The ID of the category this product belongs to. | Yes |

| sku | String | Stock Keeping Unit (must be unique). | Yes |

| stock | Integer | The current stock quantity for the product. | Yes |

| status | String | The initial status of the product (active, draft). | Optional (default: draft) |

| images | Array | An array of image URLs for the product. | Optional |

###### Request Example

cURL


curl -X POST \
  'https://api.yourcompany.com/v1/products' \
  -H 'Authorization: Bearer sk_live_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Ergonomic Office Chair",
    "description": "Comfortable and adjustable office chair with lumbar support.",
    "price": {
      "amount": 450.00,
      "currency": "USD"
    },
    "category_id": "cat_offurn001",
    "sku": "EOC-001-BLK",
    "stock": 50,
    "status": "active",
    "images": [
      "https://cdn.yourcompany.com/eoc-001/main.jpg",
      "https://cdn.yourcompany.com/eoc-001/side.jpg"
    ]
  }'

Python


import requests

api_key = "sk_live_YOUR_API_KEY"
base_url = "https://api.yourcompany.com/v1"

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}
payload = {
    "name": "Ergonomic Office Chair",
    "description": "Comfortable and adjustable office chair with lumbar support.",
    "price": {
      "amount": 450.00,
      "currency": "USD"
    },
    "category_id": "cat_offurn001",
    "sku": "EOC-001-BLK",
    "stock": 50,
    "status": "active",
    "images": [
      "https://cdn.yourcompany.com/eoc-001/main.jpg",
      "https://cdn.yourcompany.com/eoc-001/side.jpg"
    ]
}

response = requests.post(f"{base_url}/products", headers=headers, json=payload)

if response.status_code == 201:
    print(response.json())
else:
    print(f"Error: {response.status_code} - {response.text}")

###### Response Examples

Success (Status: 201 Created)


{
  "id": "prod_newprod456",
  "name": "Ergonomic Office Chair",
  "
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
\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);}});}