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

API Documentation: Product Management API v1

This document provides a comprehensive guide to integrating with the Product Management API. It covers essential topics such as authentication, available endpoints, request/response formats, error handling, and SDK usage examples.


1. Introduction

The Product Management API allows developers to programmatically manage products, including creating, retrieving, updating, and deleting product information. This API is designed to be RESTful, using standard HTTP methods and JSON for data transfer.

2. Authentication

All requests to the Product Management API, except for the login endpoint, must be authenticated using a Bearer Token.

2.1. Obtaining an Access Token

To obtain an access token, send a POST request to the /auth/login endpoint with your user credentials.

Endpoint:

POST https://api.example.com/v1/auth/login

Request Body:

text • 1,379 chars
### **3. Endpoints**

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

#### **3.1. Product Object Structure**

All product-related endpoints will return or expect a product object with the following structure:

| Field       | Type     | Description                                     | Required (Create) |
| :---------- | :------- | :---------------------------------------------- | :---------------- |
| `id`        | `string` | Unique identifier for the product. (Read-only)  | No                |
| `name`      | `string` | Name of the product.                            | Yes               |
| `description` | `string` | Detailed description of the product.            | No                |
| `price`     | `number` | Price of the product.                           | Yes               |
| `currency`  | `string` | Currency of the product price (e.g., "USD").    | Yes               |
| `stock`     | `integer`| Available stock quantity.                       | Yes               |
| `category`  | `string` | Product category (e.g., "Electronics", "Books").| No                |
| `createdAt` | `string` | Timestamp of product creation (ISO 8601). (Read-only) | No                |
| `updatedAt` | `string` | Timestamp of last update (ISO 8601). (Read-only) | No                |

**Example Product Object:**

Sandboxed live preview

This document outlines the architecture plan for the "API Documentation Generator" and provides a study plan for understanding and developing such a system.


API Documentation Generator: Architecture Plan

1. Introduction

The "API Documentation Generator" is designed to automate the creation of high-quality, professional API documentation. Its primary goal is to transform raw API definitions into comprehensive, user-friendly documentation that includes detailed endpoint descriptions, accurate request/response examples, clear authentication guides, and practical SDK usage examples across multiple programming languages. This automation streamlines the documentation process, ensures consistency, and reduces manual effort, thereby accelerating developer onboarding and improving API adoption.

2. High-Level System Architecture

The generator follows a modular architecture, enabling flexibility in input sources, processing logic, and output formats.

bash

curl -X POST \

https://api.example.com/v1/products \

-H 'Authorization: Bearer your_access_token_here' \

-H 'Content-Type: application/json'

gemini Output

This document provides comprehensive, detailed, and professional API documentation for the Order Management System (OMS) API. It covers everything from authentication and base URLs to specific endpoint descriptions, request/response examples, data models, error handling, and SDK usage.


Order Management System (OMS) API Documentation

Welcome to the Order Management System (OMS) API documentation. This API allows developers to programmatically manage customer orders, products, and inventory within an e-commerce or retail system. Utilize this API to integrate order creation, retrieval, updates, and deletions into your applications, manage product catalogs, and query inventory levels.

Table of Contents

  1. [API Overview](#1-api-overview)
  2. [Authentication](#2-authentication)

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

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

  1. [Base URL](#3-base-url)
  2. [Endpoints](#4-endpoints)

* [Orders](#orders)

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

* [GET /orders/{orderId}](#get-ordersorderid)

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

* [PUT /orders/{orderId}](#put-ordersorderid)

* [DELETE /orders/{orderId}](#delete-ordersorderid)

* [Products](#products)

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

* [GET /products/{productId}](#get-productsproductid)

* [Inventory](#inventory)

* [GET /inventory/{productId}](#get-inventoryproductid)

  1. [Data Models](#5-data-models)

* [Order Object](#order-object)

* [OrderItem Object](#orderitem-object)

* [Product Object](#product-object)

* [Inventory Object](#inventory-object)

* [Error Object](#error-object)

  1. [Error Handling](#6-error-handling)
  2. [Rate Limiting](#7-rate-limiting)
  3. [SDK Usage Examples](#8-sdk-usage-examples)

* [Python SDK](#python-sdk)

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

  1. [Changelog](#9-changelog)

1. API Overview

The OMS API is a RESTful API designed to provide robust control over your order management workflows. It supports standard HTTP methods (GET, POST, PUT, DELETE) and uses JSON for all request and response bodies.

Key Features:

  • Order Management: Create, retrieve, update, and delete customer orders.
  • Product Catalog: Access detailed information about products.
  • Inventory Tracking: Query current stock levels for products.

2. Authentication

The OMS API uses API Key Authentication to secure access. Your API key must be included in the X-API-Key HTTP header for every request.

API Key Authentication

To authenticate your requests, include your secret API key in the X-API-Key header.

Example Header:


X-API-Key: YOUR_SECRET_API_KEY

Important: Keep your API key confidential. Do not expose it in client-side code, public repositories, or unsecured environments. If your API key is compromised, revoke it immediately and generate a new one.

Obtaining Your API Key

  1. Log in to your OMS Developer Dashboard.
  2. Navigate to the "API Keys" section.
  3. Generate a new API key. You will typically be able to assign a name or description to it for better organization.
  4. Copy your API key. It will only be shown once upon generation.

3. Base URL

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

https://api.oms.example.com/v1

4. Endpoints

This section details all available API endpoints, their methods, paths, parameters, and provides request/response examples.

Orders

Manage customer orders.

GET /orders

  • Description: Retrieves a list of all orders, optionally filtered or paginated.
  • Method: GET
  • Path: /orders
  • Query Parameters:

* status (optional, string): Filter orders by status (e.g., pending, shipped, delivered).

* customer_id (optional, string): Filter orders by a specific customer ID.

* limit (optional, integer): Maximum number of orders to return per page (default: 20, max: 100).

* offset (optional, integer): Number of orders to skip for pagination (default: 0).

  • Responses:

* 200 OK: A list of order objects.

Request Example (cURL):


curl -X GET \
  'https://api.oms.example.com/v1/orders?status=pending&limit=10' \
  -H 'X-API-Key: YOUR_SECRET_API_KEY'

Response Example (200 OK):


[
  {
    "orderId": "ord_abc123",
    "customerId": "cust_xyz789",
    "orderDate": "2023-10-26T10:00:00Z",
    "status": "pending",
    "totalAmount": 120.50,
    "items": [
      {
        "productId": "prod_a1b2",
        "quantity": 1,
        "price": 75.00
      },
      {
        "productId": "prod_c3d4",
        "quantity": 2,
        "price": 22.75
      }
    ]
  },
  {
    "orderId": "ord_def456",
    "customerId": "cust_pqr012",
    "orderDate": "2023-10-25T14:30:00Z",
    "status": "shipped",
    "totalAmount": 49.99,
    "items": [
      {
        "productId": "prod_e5f6",
        "quantity": 1,
        "price": 49.99
      }
    ]
  }
]

GET /orders/{orderId}

  • Description: Retrieves a specific order by its ID.
  • Method: GET
  • Path: /orders/{orderId}
  • Path Parameters:

* orderId (required, string): The unique identifier of the order.

  • Responses:

* 200 OK: The requested order object.

* 404 Not Found: If no order with the specified orderId exists.

Request Example (cURL):


curl -X GET \
  'https://api.oms.example.com/v1/orders/ord_abc123' \
  -H 'X-API-Key: YOUR_SECRET_API_KEY'

Response Example (200 OK):


{
  "orderId": "ord_abc123",
  "customerId": "cust_xyz789",
  "orderDate": "2023-10-26T10:00:00Z",
  "status": "pending",
  "totalAmount": 120.50,
  "items": [
    {
      "productId": "prod_a1b2",
      "quantity": 1,
      "price": 75.00
    },
    {
      "productId": "prod_c3d4",
      "quantity": 2,
      "price": 22.75
    }
  ],
  "shippingAddress": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "CA",
    "zipCode": "90210",
    "country": "USA"
  }
}

POST /orders

  • Description: Creates a new order.
  • Method: POST
  • Path: /orders
  • Request Body: A JSON object representing the new order.

* customerId (required, string): The ID of the customer placing the order.

* items (required, array of OrderItem objects): The list of products and quantities in the order.

* shippingAddress (required, object): The shipping address details.

  • Responses:

* 201 Created: The newly created order object.

* 400 Bad Request: If the request body is invalid or missing required fields.

Request Example (cURL):


curl -X POST \
  'https://api.oms.example.com/v1/orders' \
  -H 'X-API-Key: YOUR_SECRET_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
        "customerId": "cust_new001",
        "items": [
          {
            "productId": "prod_g7h8",
            "quantity": 3,
            "price": 15.00
          },
          {
            "productId": "prod_i9j0",
            "quantity": 1,
            "price": 99.99
          }
        ],
        "shippingAddress": {
          "street": "456 Oak Ave",
          "city": "Otherville",
          "state": "NY",
          "zipCode": "10001",
          "country": "USA"
        }
      }'

Response Example (201 Created):


{
  "orderId": "ord_new789",
  "customerId": "cust_new001",
  "orderDate": "2023-10-26T15:30:00Z",
  "status": "pending",
  "totalAmount": 144.99,
  "items": [
    {
      "productId": "prod_g7h8",
      "quantity": 3,
      "price": 15.00
    },
    {
      "productId": "prod_i9j0",
      "quantity": 1,
      "price": 99.99
    }
  ],
  "shippingAddress": {
    "street": "456 Oak Ave",
    "city": "Otherville",
    "state": "NY",
    "zipCode": "10001",
    "country": "USA"
  }
}

PUT /orders/{orderId}

  • Description: Updates an existing order. Only fields provided in the request body will be updated.
  • Method: PUT
  • Path: /orders/{orderId}
  • Path Parameters:

* orderId (required, string): The unique identifier of the order to update.

  • Request Body: A JSON object containing the fields to update.

* status (optional, string): New status for the order.

* shippingAddress (optional, object): New shipping address details.

items (optional, array of OrderItem objects): New list of items (this will replace* existing items).

  • Responses:

* 200 OK: The updated order object.

* 400 Bad Request: If the request body is invalid.

* 404 Not Found: If no order with the specified orderId exists.

Request Example (cURL):


curl -X PUT \
  'https://api.oms.example.com/v1/orders/ord_abc123' \
  -H 'X-API-Key: YOUR_SECRET_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
        "status": "shipped",
        "shippingAddress": {
          "street": "789 Pine Ln",
          "city": "Newtown",
          "state": "TX",
          "zipCode": "73301",
          "country": "USA"
        }
      }'

Response Example (200 OK):


{
  "orderId": "ord_abc123",
  "customerId": "cust_xyz789",
  "orderDate": "2023-10-26T10:00:00Z",
  "status": "shipped",
  "totalAmount": 120.50,
  "items": [
    {
      "productId": "prod_a1b2",
      "quantity": 1,
      "price": 75.00
    },
    {
      "productId": "prod_c3d4",
      "quantity": 2,
      "price": 22.75
    }
  ],
  "shippingAddress": {
    "street": "789 Pine Ln",
    "city": "Newtown",
    "state": "TX",
    "zipCode": "73301",
    "country": "USA"
  }
}

DELETE /orders/{orderId}

  • Description: Deletes a specific order by its ID.
  • Method: DELETE
  • Path: /orders/{orderId}
  • Path Parameters:

* orderId (required, string): The unique identifier of the order to delete.

  • Responses:

*

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