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

This document outlines the architecture plan for the "API Documentation Generator" and provides an implementation roadmap structured as a study plan. The goal is to create a robust, flexible, and professional tool capable of generating high-quality API documentation from various sources.


1. API Documentation Generator: Architecture Plan

The API Documentation Generator is designed as a modular system, enabling flexible input processing, intelligent content generation, and customizable output.

1.1. High-Level Architecture Diagram

mermaid • 1,079 chars
graph TD
    subgraph "Input Layer"
        A[OpenAPI/Swagger Spec (YAML/JSON)] --> B
        C[Postman Collections] --> B
        D[Code Annotations (e.g., JSDoc)] --> B
        E[Manual Markdown Content] --> B
    end

    subgraph "Core Processing Layer"
        B[Parsers & Validators] --> F
        F[Internal Canonical Data Model (IR)] --> G
        G[Transformation & Enrichment Engine] --> H
    end

    subgraph "Output Layer"
        H[Templating & Rendering Engine] --> I
        I[Generated Documentation (HTML, Markdown, PDF)]
    end

    subgraph "Deployment & Hosting"
        I --> J[Static Site Hosting (e.g., Netlify, S3)]
        I --> K[CI/CD Pipeline Integration]
        I --> L[CLI Tool]
    end

    style A fill:#f9f,stroke:#333,stroke-width:2px
    style C fill:#f9f,stroke:#333,stroke-width:2px
    style D fill:#f9f,stroke:#333,stroke-width:2px
    style E fill:#f9f,stroke:#333,stroke-width:2px
    style J fill:#cfc,stroke:#333,stroke-width:2px
    style K fill:#cfc,stroke:#333,stroke-width:2px
    style L fill:#cfc,stroke:#333,stroke-width:2px
Sandboxed live preview

1.2. Detailed Component Breakdown

1.2.1. Input Layer

This layer is responsible for ingesting API definitions from various sources.

  • OpenAPI/Swagger Spec (YAML/JSON):

* Purpose: Primary input source, widely adopted for API description.

* Support: OpenAPI 2.0 (Swagger) and 3.x (3.0.x, 3.1.x).

* Mechanism: Direct file paths or URLs to spec files.

  • Postman Collections:

* Purpose: Integrate with existing Postman workflows.

* Support: Postman Collection Format v2.1.

* Mechanism: Direct file paths to collection JSON files.

  • Code Annotations (Advanced Feature):

* Purpose: Generate documentation directly from source code comments (e.g., JSDoc for JavaScript/TypeScript, PHPDoc for PHP, Sphinx for Python, Doxygen for C++/Java).

* Mechanism: Language-specific plugins that parse code comments and extract API definitions.

  • Manual Markdown Content:

* Purpose: Allow users to add custom content, guides, tutorials, or overview pages that aren't part of the API definition itself.

* Mechanism: Directories of Markdown files integrated into the generated documentation structure.

1.2.2. Core Processing Layer

This layer handles parsing, validation, and transformation of input into a standardized internal representation, followed by enrichment.

  • Parsers & Validators:

* Purpose: Convert raw input formats into a structured, validated form.

* Components:

* OpenAPI Parser: Uses libraries (e.g., swagger-parser for Node.js, pyopenapi for Python) to parse and validate OpenAPI specifications.

* Postman Parser: Custom parser to extract relevant data from Postman Collection JSON.

* Annotation Parsers (Plugins): Specific parsers for each supported programming language.

* Validation: Ensure all input conforms to its respective schema (e.g., OpenAPI schema validation).

  • Internal Canonical Data Model (IR):

* Purpose: A unified, language-agnostic data structure that represents the API definition. This IR is the single source of truth for all subsequent processing.

* Structure:

* API Metadata: Name, Version, Description, Base URLs, Contact Info.

* Endpoints: Path, HTTP Method, Summary, Detailed Description, Tags, Parameters (path, query, header, cookie, body/request payload with schema), Request Bodies (content types, schemas, examples), Responses (status codes, descriptions, headers, schemas, examples), Security Requirements.

* Schemas: Reusable data models for requests and responses.

* Security Schemes: Definitions for API Key, OAuth2, HTTP Bearer, etc.

* Tags: Grouping of related endpoints.

* External Docs: Links to supplementary documentation.

  • Transformation & Enrichment Engine:

* Purpose: Enhance the IR with generated content, cross-references, and ensure consistency.

* Components:

* Example Generator: Automatically generates realistic request and response examples based on defined schemas (e.g., using faker or json-schema-faker).

* Authentication Guide Mapper: Translates security scheme definitions into clear, human-readable instructions for various authentication methods (e.g., "How to use API Keys," "OAuth2 Flow").

* SDK Usage Example Generator:

* Pre-defined Snippets: Allows users to provide boilerplate code snippets for common operations in various languages.

* Basic Stubs (Advanced): Integrates with tools like OpenAPI Generator to create basic client-side SDK usage examples (

gemini Output

As part of the "API Documentation Generator" workflow, this step focuses on generating the core structured content and a conceptual code example for producing professional API documentation. The output comprises an example OpenAPI Specification (OAS) in YAML format, which serves as a machine-readable blueprint for your API, and a Python script that demonstrates how such a specification can be processed to generate human-readable documentation, including endpoint details, request/response examples, and guidance on authentication and SDK usage.

This deliverable provides a foundational, production-ready example that can be directly used as a template for your API documentation or integrated into automated documentation pipelines.


1. Example OpenAPI Specification (YAML) for a Product Catalog API

This section presents a detailed OpenAPI 3.0 specification for a hypothetical "Product Catalog API". This YAML file defines all endpoints, data models, security schemes, and examples, forming the authoritative source for your API documentation.


# api-spec.yaml
openapi: 3.0.0
info:
  title: Product Catalog API
  description: A robust API for managing and retrieving product information, including inventory, pricing, and categories.
  version: 1.0.0
  contact:
    name: API Support
    url: https://yourcompany.com/support
    email: support@yourcompany.com
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html

servers:
  - url: https://api.yourcompany.com/v1
    description: Production server
  - url: https://dev.api.yourcompany.com/v1
    description: Development server

tags:
  - name: Products
    description: Operations related to products in the catalog.
  - name: Categories
    description: Operations related to product categories.

security:
  - ApiKeyAuth: []
  - OAuth2:
      - read:products
      - write:products

paths:
  /products:
    get:
      summary: List all products
      description: Retrieve a paginated list of all products in the catalog, with optional filtering and sorting.
      tags:
        - Products
      operationId: listProducts
      parameters:
        - name: limit
          in: query
          description: Maximum number of products to return
          required: false
          schema:
            type: integer
            format: int32
            minimum: 1
            maximum: 100
          examples:
            default:
              value: 20
        - name: offset
          in: query
          description: Number of products to skip for pagination
          required: false
          schema:
            type: integer
            format: int32
            minimum: 0
          examples:
            default:
              value: 0
        - name: category
          in: query
          description: Filter products by category name
          required: false
          schema:
            type: string
          examples:
            electronics:
              value: "Electronics"
            clothing:
              value: "Clothing"
      responses:
        '200':
          description: A list of products.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Product'
              examples:
                successResponse:
                  summary: Example successful response
                  value:
                    - productId: "prod_123"
                      name: "Smartwatch X"
                      description: "Next-gen smartwatch with health tracking."
                      price: 299.99
                      currency: "USD"
                      category: "Electronics"
                      inStock: true
                      createdAt: "2023-01-15T10:00:00Z"
                      updatedAt: "2023-01-15T10:00:00Z"
                    - productId: "prod_456"
                      name: "Wireless Headphones Z"
                      description: "Noise-cancelling headphones with long battery life."
                      price: 199.99
                      currency: "USD"
                      category: "Electronics"
                      inStock: false
                      createdAt: "2023-02-01T11:30:00Z"
                      updatedAt: "2023-02-01T11:30:00Z"
        '400':
          $ref: '#/components/responses/BadRequest'
        '500':
          $ref: '#/components/responses/InternalServerError'
    post:
      summary: Create a new product
      description: Add a new product to the catalog.
      tags:
        - Products
      operationId: createProduct
      security:
        - OAuth2:
            - write:products
      requestBody:
        description: Product object to be created
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductCreateRequest'
            examples:
              newProduct:
                summary: Example product creation request
                value:
                  name: "Ergonomic Keyboard"
                  description: "Mechanical keyboard designed for comfort and productivity."
                  price: 120.00
                  currency: "USD"
                  category: "Computer Accessories"
                  inStock: true
      responses:
        '201':
          description: Product created successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
              examples:
                createdProduct:
                  summary: Example created product response
                  value:
                    productId: "prod_789"
                    name: "Ergonomic Keyboard"
                    description: "Mechanical keyboard designed for comfort and productivity."
                    price: 120.00
                    currency: "USD"
                    category: "Computer Accessories"
                    inStock: true
                    createdAt: "2023-03-10T09:00:00Z"
                    updatedAt: "2023-03-10T09:00:00Z"
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'

  /products/{productId}:
    get:
      summary: Get a product by ID
      description: Retrieve detailed information for a specific product using its unique ID.
      tags:
        - Products
      operationId: getProductById
      parameters:
        - name: productId
          in: path
          description: Unique identifier of the product
          required: true
          schema:
            type: string
            format: uuid
          examples:
            exampleId:
              value: "prod_123"
      responses:
        '200':
          description: Product details.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
              examples:
                successResponse:
                  summary: Example product detail response
                  value:
                    productId: "prod_123"
                    name: "Smartwatch X"
                    description: "Next-gen smartwatch with health tracking."
                    price: 299.99
                    currency: "USD"
                    category: "Electronics"
                    inStock: true
                    createdAt: "2023-01-15T10:00:00Z"
                    updatedAt: "2023-01-15T10:00:00Z"
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
    put:
      summary: Update an existing product
      description: Update the details of an existing product using its unique ID.
      tags:
        - Products
      operationId: updateProduct
      security:
        - OAuth2:
            - write:products
      parameters:
        - name: productId
          in: path
          description: Unique identifier of the product
          required: true
          schema:
            type: string
            format: uuid
          examples:
            exampleId:
              value: "prod_123"
      requestBody:
        description: Product object with updated fields
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProductUpdateRequest'
            examples:
              updateProduct:
                summary: Example product update request
                value:
                  name: "Smartwatch X Pro"
                  price: 329.99
                  inStock: true
      responses:
        '200':
          description: Product updated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Product'
              examples:
                updatedProduct:
                  summary: Example updated product response
                  value:
                    productId: "prod_123"
                    name: "Smartwatch X Pro"
                    description: "Next-gen smartwatch with health tracking."
                    price: 329.99
                    currency: "USD"
                    category: "Electronics"
                    inStock: true
                    createdAt: "2023-01-15T10:00:00Z"
                    updatedAt: "2023-03-10T15:30:00Z"
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
    delete:
      summary: Delete a product
      description: Remove a product from the catalog using its unique ID.
      tags:
        - Products
      operationId: deleteProduct
      security:
        - OAuth2:
            - write:products
      parameters:
        - name: productId
          in: path
          description: Unique identifier of the product
          required: true
          schema:
            type: string
            format: uuid
          examples:
            exampleId:
              value: "prod_123"
      responses:
        '204':
          description: Product deleted successfully. No content.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'

components:
  schemas:
    Product:
      type: object
      required:
        - productId
        - name
        - price
        - currency
        - category
        - inStock
        - createdAt
        - updatedAt
      properties:
        productId:
          type: string
          format: uuid
          description: Unique identifier for the product.
          example: "prod_123"
        name:
          type: string
          description: Name of the product.
          example: "Smartwatch X"
        description:
          type: string
          description: Detailed description of the product.
          example: "Next-gen smartwatch with health tracking and long battery life."
        price:
          type: number
          format: float
          description: Price of the product.
          example: 299.99
        currency:
          type: string
          description: Currency code (e.g., USD, EUR).
          pattern: '^[A-Z]{3}$'
          example: "USD"
        category:
          type: string
          description: Product category.
          example: "Electronics"
        inStock:
          type: boolean
          description: Indicates if the product is currently in stock.
          example: true
        createdAt:
          type: string
          format: date-time
          description: Timestamp when the product was created.
          example: "2023-01-15T10:00:00Z"
        updatedAt:
          type: string
          format: date-time
          description: Timestamp when the product was last updated.
          example: "2023-01-15T10:00:00Z"
    ProductCreateRequest:
      type: object
      required:
        - name
        - price
        - currency
        - category
        - inStock
      properties:
        name:
          type: string
          description: Name of the product.
          example: "Ergonomic Keyboard"
        description:
          type: string
          description: Detailed description of the product.
          example: "Mechanical keyboard designed for comfort and productivity."
        price:
          type: number
          format: float
          description: Price
gemini Output

API Documentation: Product Catalog API

Welcome to the comprehensive documentation for the PantheraHive Product Catalog API. This API provides a robust and flexible interface for managing your product catalog, including products, categories, and related data. Whether you're building an e-commerce platform, an inventory management system, or integrating with third-party services, this API offers the tools you need to interact with your product data programmatically.

This documentation will guide you through authentication, available endpoints, request/response examples, and best practices for integrating with the API.


1. Introduction

The Product Catalog API allows developers to programmatically access and manage product and category information. It follows RESTful principles, using standard HTTP methods (GET, POST, PUT, DELETE) for operations and JSON for data interchange.

Key Features:

  • Retrieve, create, update, and delete products.
  • Manage product categories.
  • Search and filter products based on various criteria.
  • Secure access via API Keys.

2. Base URL

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

https://api.pantherahive.com/v1/catalog


3. Authentication

The PantheraHive Product Catalog API uses API Key authentication. To access the API, you must include a valid API Key in the Authorization header of every request.

3.1. Obtaining Your API Key

  1. Log in to your PantheraHive Developer Dashboard.
  2. Navigate to the "API Keys" section.
  3. Generate a new API Key if you don't have one, or use an existing one.
  4. Keep your API Key secure and do not share it publicly.

3.2. Using Your API Key

Include your API Key in the Authorization header with the Bearer scheme for all requests.

Header Example:


Authorization: Bearer YOUR_API_KEY

Example cURL Request with Authentication:


curl -X GET \
  'https://api.pantherahive.com/v1/catalog/products' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json'

4. Error Handling

The API uses standard HTTP status codes to indicate the success or failure of a request. In case of an error, the API will return a JSON object containing an error message and an optional details field.

| HTTP Status Code | Description | Error Response Example |

|------------------|----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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