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

This document provides the detailed, professional output for the generate_code step of the "API Documentation Generator" workflow. The goal is to produce comprehensive, actionable code examples and structural elements necessary for professional API documentation, encompassing endpoint interactions, authentication methods, and SDK usage.


API Documentation Generator: Code Generation Output

This section delivers the core code artifacts and structural templates that an API Documentation Generator would produce. These examples are designed to be clean, well-commented, and production-ready, facilitating easy integration into your API documentation.

1. Introduction to Generated Code

The output below represents the kind of code snippets and documentation structures that would be dynamically generated based on an API specification (e.g., OpenAPI/Swagger). It covers various aspects essential for a developer to understand and interact with your API effectively.

We provide examples for:

These examples are presented in a format suitable for direct inclusion in Markdown-based documentation, which can then be rendered into professional HTML.

2. Core API Documentation Structure (Markdown Template)

A robust documentation generator would create structured Markdown files for each endpoint or section. Below is a template demonstrating how the generated code examples fit within a typical endpoint documentation page.

text • 432 chars
### Request Parameters

| Name      | Type    | Description                                             | Default  |
| :-------- | :------ | :------------------------------------------------------ | :------- |
| `limit`   | `integer` | Maximum number of users to return (max 1000).           | `100`    |
| `offset`  | `integer` | The number of users to skip before starting to collect. | `0`      |

### Code Examples

#### cURL

Sandboxed live preview

API Documentation Generator: Architecture Plan

This document outlines a comprehensive architecture plan for the "API Documentation Generator," focusing on generating professional documentation with endpoint descriptions, request/response examples, authentication guides, and SDK usage examples. The plan emphasizes modularity, extensibility, and a robust data flow to support various input sources and output formats.

Please note: The prompt included an instruction to "Create a detailed study plan." Given the context of "plan_architecture" for a software system, this instruction appears to be a templating error. This deliverable focuses exclusively on the software architecture plan, which is appropriate for this step of the workflow.


1. Project Goal & Scope

The primary goal of the API Documentation Generator is to automate the creation of high-quality, professional API documentation. This includes:

  • Endpoint Descriptions: Clear and concise explanations for each API endpoint.
  • Request/Response Examples: Illustrative examples for various request types and corresponding API responses.
  • Authentication Guides: Detailed instructions on how to authenticate with the API using different security schemes.
  • SDK Usage Examples: Code snippets demonstrating how to interact with the API using various SDKs or programming languages (e.g., Python, JavaScript, cURL).
  • General API Information: Introduction, error handling, rate limiting, and other crucial guides.
  • Support for Multiple Formats: Ability to generate documentation in static HTML, Markdown, and potentially PDF.
  • Version Management: Capability to generate and manage documentation for different API versions.

2. High-Level Architecture Overview

The API Documentation Generator will follow a layered, modular architecture, enabling clear separation of concerns and promoting extensibility. It comprises an Input Layer for ingesting API definitions, a Core Engine for processing and generating content, a Templating & Rendering Layer for formatting the output, and an Output & Publishing Layer for delivery. An optional User Interface will facilitate management and configuration.


+---------------------+     +---------------------+     +--------------------------+     +---------------------+
|
gemini Output

PantheraHive Core API Documentation

Welcome to the PantheraHive Core API Documentation! This guide provides comprehensive information on how to integrate with and leverage the PantheraHive Core API to manage your resources programmatically. Whether you're building a custom application, automating workflows, or extending PantheraHive's capabilities, this documentation will serve as your primary resource.


Table of Contents

  1. [Introduction](#1-introduction)
  2. [Base URL](#2-base-url)
  3. [Authentication](#3-authentication)

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

* [Obtaining Your API Key](#obtaining-your-api-key)

* [Using Your API Key](#using-your-api-key)

  1. [Error Handling](#4-error-handling)
  2. [Rate Limiting](#5-rate-limiting)
  3. [Data Formats](#6-data-formats)
  4. [Endpoints](#7-endpoints)

* [Users](#users)

* [List All Users (GET /users)](#list-all-users-get-users)

* [Retrieve a Specific User (GET /users/{id})](#retrieve-a-specific-user-get-usersid)

* [Create a New User (POST /users)](#create-a-new-user-post-users)

* [Update an Existing User (PUT /users/{id})](#update-an-existing-user-put-usersid)

* [Delete a User (DELETE /users/{id})](#delete-a-user-delete-usersid)

* [Products](#products)

* [List All Products (GET /products)](#list-all-products-get-products)

* [Retrieve a Specific Product (GET /products/{id})](#retrieve-a-specific-product-get-productsid)

* [Create a New Product (POST /products)](#create-a-new-product-post-products)

  1. [SDK Usage Examples](#8-sdk-usage-examples)

* [Python SDK](#python-sdk)

* [JavaScript SDK](#javascript-sdk)

  1. [Support and Feedback](#9-support-and-feedback)
  2. [API Versioning](#10-api-versioning)

1. Introduction

The PantheraHive Core API provides a robust and secure way to interact with your PantheraHive data and services. It allows developers to manage users, products, orders, and other core entities within the PantheraHive ecosystem. All API interactions are performed over HTTPS and secured with API Key authentication. Responses are returned in JSON format.


2. Base URL

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

https://api.pantherahive.com/v1


3. Authentication

The PantheraHive Core API uses API Key Authentication to secure access. Your API key uniquely identifies your application and grants it permission to access specific resources.

API Key Authentication

To authenticate your requests, you must include your API key in the Authorization header of every request.

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 or use an existing one.
  4. Keep your API key secure and do not share it publicly. Treat your API key like a password.

Using Your API Key

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

Example Header:


Authorization: Bearer YOUR_API_KEY

Example cURL Request:


curl -X GET \
  https://api.pantherahive.com/v1/users \
  -H 'Authorization: Bearer YOUR_API_KEY'

4. Error Handling

The API uses standard HTTP status codes to indicate the success or failure of an API request. In case of an error, the response body will contain a JSON object with details about the error.

Common HTTP Status Codes:

| Status Code | Description |

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

| 200 OK | The request was successful. |

| 201 Created | The request was successful and a new resource was created. |

| 204 No Content | The request was successful, but there is no content to return (e.g., successful deletion). |

| 400 Bad Request | The request was malformed or invalid. Check your parameters. |

| 401 Unauthorized | Authentication failed or was not provided. Invalid or missing API Key. |

| 403 Forbidden | You do not have permission to access the requested resource. |

| 404 Not Found | The requested resource could not be found. |

| 405 Method Not Allowed | The HTTP method used is not supported for this endpoint. |

| 409 Conflict | The request could not be completed due to a conflict with the current state of the resource (e.g., duplicate unique identifier). |

| 429 Too Many Requests | You have exceeded the API rate limit. |

| 500 Internal Server Error | An unexpected error occurred on the server. |

Example Error Response:


{
  "status": 400,
  "code": "invalid_parameter",
  "message": "The 'email' field is required and must be a valid email address.",
  "details": [
    {
      "field": "email",
      "issue": "required_field"
    },
    {
      "field": "email",
      "issue": "invalid_format"
    }
  ]
}

5. Rate Limiting

To ensure fair usage and system stability, the PantheraHive Core API enforces rate limits.

  • Limit: 100 requests per minute per API key.
  • Headers:

* X-RateLimit-Limit: The maximum number of requests you can make in the current window.

* X-RateLimit-Remaining: The number of requests remaining in the current window.

* X-RateLimit-Reset: The UTC epoch seconds when the current rate limit window resets.

If you exceed the rate limit, the API will return a 429 Too Many Requests status code.


6. Data Formats

All request bodies (for POST, PUT, PATCH methods) and response bodies are formatted as JSON (JavaScript Object Notation).

Request Header:

When sending data in the request body, set the Content-Type header:

Content-Type: application/json


7. Endpoints

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


Users

The Users API allows you to manage user accounts within PantheraHive.

##### List All Users (GET /users)

Retrieves a paginated list of all user accounts.

  • Method: GET
  • Path: /users
  • Description: Returns an array of user objects.
  • Query Parameters:

* limit (Optional, Integer): Maximum number of users to return per page. Default: 20, Max: 100.

* offset (Optional, Integer): The number of users to skip before starting to collect the result set. Default: 0.

* status (Optional, String): Filter users by their status (e.g., active, inactive, pending).

  • Request Example (cURL):

    curl -X GET \
      'https://api.pantherahive.com/v1/users?limit=10&status=active' \
      -H 'Authorization: Bearer YOUR_API_KEY'
  • Response Example (200 OK):

    {
      "data": [
        {
          "id": "usr_12345",
          "email": "alice.smith@example.com",
          "first_name": "Alice",
          "last_name": "Smith",
          "status": "active",
          "created_at": "2023-01-15T10:00:00Z",
          "updated_at": "2023-01-15T10:00:00Z"
        },
        {
          "id": "usr_67890",
          "email": "bob.johnson@example.com",
          "first_name": "Bob",
          "last_name": "Johnson",
          "status": "active",
          "created_at": "2023-02-01T11:30:00Z",
          "updated_at": "2023-02-01T11:30:00Z"
        }
      ],
      "pagination": {
        "limit": 10,
        "offset": 0,
        "total": 2,
        "has_more": false
      }
    }

##### Retrieve a Specific User (GET /users/{id})

Retrieves details for a single user account by their unique ID.

  • Method: GET
  • Path: /users/{id}
  • Description: Returns a single user object.
  • Path Parameters:

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

  • Request Example (cURL):

    curl -X GET \
      https://api.pantherahive.com/v1/users/usr_12345 \
      -H 'Authorization: Bearer YOUR_API_KEY'
  • Response Example (200 OK):

    {
      "id": "usr_12345",
      "email": "alice.smith@example.com",
      "first_name": "Alice",
      "last_name": "Smith",
      "status": "active",
      "created_at": "2023-01-15T10:00:00Z",
      "updated_at": "2023-01-15T10:00:00Z",
      "last_login": "2024-03-01T14:22:00Z",
      "roles": ["admin", "editor"]
    }
  • Response Example (404 Not Found):

    {
      "status": 404,
      "code": "not_found",
      "message": "User with ID 'usr_nonexistent' not found."
    }

##### Create a New User (POST /users)

Creates a new user account.

  • Method: POST
  • Path: /users
  • Description: Creates a new user and returns the created user object.
  • Request Body (JSON):

* email (Required, String): The user's email address. Must be unique.

* first_name (Required, String): The user's first name.

* last_name (Required, String): The user's last name.

* password (Required, String): The user's password. Must meet complexity requirements (min 8 chars, 1 uppercase, 1 lowercase, 1 number).

* status (Optional, String): Initial status of the user (e.g., pending, active). Default: pending.

  • Request Example (cURL):

    curl -X POST \
      https://api.pantherahive.com/v1/users \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
            "email": "charlie.brown@example.com",
            "first_name": "Charlie",
            "last_name": "Brown",
            "password": "SecurePassword123!",
            "status": "active"
          }'
  • Response Example (201 Created):

    {
      "id": "usr_abcde",
      "email": "charlie.brown@example.com",
      "first_name": "Charlie",
      "last_name": "Brown",
      "status": "active",
      "created_at": "2024-03-08T09:30:00Z",
      "updated_at": "2024-03-08T09:30:00Z"
    }
  • Response Example (409 Conflict - Duplicate Email):

    {
      "status": 409,
      "code": "duplicate_email",
      "message": "A user with this email address already exists."
    }

##### Update an Existing User (PUT /users/{id})

Updates an existing user account. All fields provided in the request body will overwrite the existing values. For partial updates, use PATCH.

  • Method: PUT
  • Path: /users/{id}
  • Description: Updates an existing user's details.
  • Path Parameters:

* id (Required, String): The unique identifier of the user to update.

  • Request Body (JSON):

* email (Optional, String): New email address.

* first_name (Optional, String): New first name.

* last_name (Optional, String): New last name.

* status (Optional, String): New status (e.g., active, inactive).

* password (Optional, String): New password.

  • Request Example (cURL):

    curl -X PUT \
      https://api.pantherahive.com/v1/users/usr_12345 \
      -H 'Content-Type: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
            "first_name": "Alicia",
            "status": "inactive"
          }'
  • Response Example (200 OK):

    {
      "id": "usr_12345",
      "email": "alice.smith@example.com",
      "first_name": "Alicia",
      "last_name": "Smith",
      "status": "inactive",
      "created_at": "2023-01-15T10:00:00Z",
      "updated_at": "2024-03-08T10:15:00Z",
      "last_login": "2024-03-01T14:22:00Z",
      "roles": ["admin", "editor"]
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);}});}