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

API Documentation: Product Catalog Management API

Welcome to the comprehensive documentation for the Product Catalog Management API. This guide provides detailed information on how to integrate with our API, manage your product data, and leverage its full potential. Our API is designed for ease of use, providing robust functionality for creating, retrieving, updating, and deleting product information, categories, and inventory.


Table of Contents

  1. [Introduction](#1-introduction)

* [API Overview](#api-overview)

* [Base URL](#base-url)

* [Data Formats](#data-formats)

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

* [Prerequisites](#prerequisites)

* [Authentication](#authentication)

* [Making Your First Request](#making-your-first-request)

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

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

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

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

  1. [Endpoints Reference](#4-endpoints-reference)

* [Products](#products)

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

* [Get Product by ID](#get-product-by-id)

* [Create New Product](#create-new-product)

* [Update Product](#update-product)

* [Delete Product](#delete-product)

* [Categories](#categories)

* [List All Categories](#list-all-categories)

* [Get Category by ID](#get-category-by-id)

* [Create New Category](#create-new-category)

* [Inventory](#inventory)

* [Get Inventory by Product ID](#get-inventory-by-product-id)

* [Update Inventory](#update-inventory)

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

* [Python SDK](#python-sdk)

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

  1. [Error Handling](#6-error-handling)

* [Standard Error Response Structure](#standard-error-response-structure)

* [Common Error Codes](#common-error-codes)

  1. [Rate Limiting](#7-rate-limiting)
  2. [Support & Feedback](#8-support--feedback)
  3. [Changelog](#9-changelog)

1. Introduction

API Overview

The Product Catalog Management API provides programmatic access to your product catalog data. This includes managing product details, categorizing products, and tracking inventory levels. It's built on RESTful principles, using standard HTTP methods and JSON for data exchange.

Base URL

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

https://api.yourcompany.com/v1

Data Formats

All requests and responses use JSON (JavaScript Object Notation) format. Ensure your Content-Type header for POST and PUT requests is set to application/json.


2. Getting Started

Prerequisites

Before you begin, ensure you have:

Authentication

All requests to the Product Catalog Management API must be authenticated using an API Key. Please refer to the [Authentication Guide](#3-authentication-guide) for detailed instructions.

Making Your First Request

Let's try to fetch a list of products.

Request (cURL):

text • 1,171 chars
**Security Best Practices:**
*   Never hardcode API keys directly into your application code. Use environment variables or a secure configuration management system.
*   Do not expose your API keys in client-side code (e.g., JavaScript in a browser). All API calls requiring authentication should be made from a secure backend server.
*   Rotate your API keys regularly.

---

### 4. Endpoints Reference

This section details all available API endpoints, including their methods, paths, parameters, and examples.

#### Products

##### List All Products
Retrieves a list of all products in your catalog. Supports pagination and filtering.

*   **HTTP Method:** `GET`
*   **Path:** `/products`
*   **Description:** Returns an array of product objects.
*   **Query Parameters:**
    *   `limit` (Optional, Integer): Maximum number of products to return. Default is 20, max is 100.
    *   `offset` (Optional, Integer): Number of products to skip for pagination. Default is 0.
    *   `category_id` (Optional, String): Filter products by a specific category ID.
    *   `search` (Optional, String): Search products by name or description.
*   **Request Example (cURL):**
    
Sandboxed live preview

This document outlines a detailed study plan for understanding, evaluating, and ultimately planning the architecture of a robust API Documentation Generator. This plan is designed for developers, architects, and technical writers who aim to build or significantly enhance their organization's API documentation capabilities, moving beyond manual processes to an automated, scalable, and high-quality generation system.

The goal is to equip you with the knowledge and skills to architect a solution that generates professional API documentation, encompassing endpoint descriptions, request/response examples, authentication guides, and SDK usage examples, efficiently and effectively.

Study Plan: API Documentation Generator Architecture

1. Introduction & Goal

This study plan focuses on the foundational knowledge and practical skills required to architect an API Documentation Generator. By the end of this plan, participants will be able to:

  • Understand the full lifecycle and best practices of API documentation.
  • Master core specifications like OpenAPI/Swagger.
  • Evaluate existing tools and identify their architectural components.
  • Design a scalable and maintainable architecture for an automated API documentation generation system.
  • Propose integration strategies with development workflows (e.g., CI/CD).

2. Learning Objectives

Upon completion of this study plan, you will be able to:

  • Define API Documentation Best Practices: Articulate the key elements of professional, user-friendly API documentation, including structure, content, and accessibility.
  • Master OpenAPI/Swagger Specification: Fluently read, write, and validate API specifications using OpenAPI (formerly Swagger) for RESTful APIs.
  • Evaluate Existing Documentation Tools: Conduct a comprehensive analysis of popular API documentation tools (e.g., Swagger UI, Postman, Stoplight, ReadMe.io, Docusaurus, Slate) based on features, extensibility, and architectural patterns.
  • Design a Modular Generator Architecture: Propose a high-level, modular architecture for an API documentation generator, identifying key components such as source parsers, spec generators, content renderers, and deployment modules.
  • Understand Automation & Integration: Identify strategies for integrating documentation generation into CI/CD pipelines, version control systems, and SDK generation workflows.
  • Address Advanced Topics: Consider aspects like multi-version documentation, internationalization, customizability, and security in the context of documentation generation.

3. Weekly Schedule (4 Weeks)

This schedule assumes approximately 10-15 hours of dedicated study per week, including reading, hands-on exercises, and project work.


Week 1: Fundamentals of API Documentation & User Experience

  • Focus: Understanding the "why" and "what" of excellent API documentation. Laying the groundwork for architectural decisions by understanding user needs and best practices.
  • Learning Activities:

* Read articles/books on API documentation best practices.

* Analyze successful API documentation portals (e.g., Stripe, Twilio, GitHub).

* Identify different user personas for API docs (developers, product managers, support).

* Research common documentation sections: Getting Started, Authentication, Endpoints, SDKs, Error Handling, Changelog.

  • Deliverables:

* Summary report on "Key Characteristics of Professional API Documentation."

* User persona descriptions for an example API.


Week 2: Deep Dive into OpenAPI/Swagger Specification

  • Focus: Mastering the industry standard for describing RESTful APIs. This is crucial for any automated generation system.
  • Learning Activities:

* Study the official OpenAPI Specification documentation (versions 3.0.x and 3.1.x).

* Hands-on: Write an OpenAPI specification from scratch for a simple API (e.g., a "Todo List" API).

* Use OpenAPI linters and validators (e.g., Spectral, Swagger Editor) to ensure correctness.

* Explore advanced OpenAPI features: components (schemas, responses, security schemes), examples, external documentation, tags.

  • Deliverables:

* A complete, valid OpenAPI 3.x specification for a chosen sample API.

* A short presentation on "Advanced OpenAPI Features and Their Impact on Documentation."


Week 3: Existing Tools & Architectural Components

  • Focus: Surveying the landscape of existing API documentation tools, understanding their strengths, weaknesses, and underlying architectural approaches.
  • Learning Activities:

* Research and experiment with various categories of tools:

* Spec-driven renderers: Swagger UI, Redoc, Stoplight Elements.

* Content-driven platforms: ReadMe.io, Postman (collections).

* Static site generators: Docusaurus, MkDocs, Slate (with OpenAPI plugins).

* Identify common architectural components within these tools (e.g., parsers, templating engines, data models, rendering pipelines).

* Analyze how different tools handle dynamic content (e.g., SDK examples, interactive consoles).

  • Deliverables:

* Comparative analysis report of at least 3-5 API documentation tools, highlighting their architectural patterns, extensibility, and suitability for different use cases.

* Initial brainstorm of desired features for a custom generator.


Week 4: Designing the API Documentation Generator Architecture & Integration

  • Focus: Synthesizing knowledge to propose a high-level architecture for a custom API documentation generator, considering automation and integration.
  • Learning Activities:

* Architectural Design:

* Define the core modules: Source Input (code annotations, OpenAPI files), Data Model/Processing, Rendering Engine, Output Formats (HTML, PDF, Markdown).

* Consider extensibility points (plugins, custom templates).

* Plan for versioning and localization.

* Automation & Integration:

* Design how the generator would integrate into a CI/CD pipeline (e.g., triggering on code changes, deploying to a hosting service).

* Explore how to generate SDK examples automatically (e.g., using OpenAPI generators like OpenAPI Generator).

* Discuss authentication and security for the generated documentation portal.

* Prototyping (Optional but Recommended): Implement a very small proof-of-concept for one architectural component (e.g., a simple OpenAPI parser or a custom rendering module).

  • Deliverables:

* High-Level Architectural Diagram: A visual representation of your proposed API Documentation Generator, detailing its main components and data flow.

* Architectural Design Document: A written proposal outlining the key decisions, technologies, integration points, and future considerations for the generator.

* Presentation of the proposed architecture and its benefits.

4. Recommended Resources

  • Official Specifications:

* [OpenAPI Specification (OAS)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md)

* [JSON Schema](https://json-schema.org/learn/getting-started-step-by-step.html) (fundamental for OpenAPI schemas)

  • Books:

* "API Design Patterns" by JJ Geewax (focus on good API design which informs documentation)

* "Designing Web APIs" by Arvind Narayanan, Joshua Thijssen, and Mike Amundsen

* "The Good Docs Project" (not a book, but a valuable resource for technical writing best practices)

  • Online Courses:

* Udemy/Coursera courses on "API Design and Development" or "Technical Writing for Developers."

* Specific courses on OpenAPI/Swagger if available.

  • Tools & Platforms:

* OpenAPI Editors/Validators: Swagger Editor, Stoplight Studio, Spectral linter.

* Documentation Tools: Swagger UI, Redoc, Stoplight Elements, ReadMe.io, Postman, Docusaurus, MkDocs, Slate.

* Code Generators: OpenAPI Generator (for SDKs and server stubs).

  • Blogs & Articles:

* [Nordic APIs Blog](https://nordicapis.com/blog/)

* [APIs You Won't Hate](https://apisyouwonthate.com/)

* Specific blogs from tool vendors (e.g., Stoplight, Postman).

* Medium articles on API documentation best practices.

5. Milestones

  • End of Week 1: Comprehensive understanding of API documentation best practices and user needs.
  • End of Week 2: Proficiency in writing and validating OpenAPI 3.x specifications.
  • End of Week 3: Clear understanding of the API documentation tool landscape and their underlying architectural components.
  • End of Week 4: A well-defined, high-level architectural plan for a custom API Documentation Generator, complete with integration strategies.

6. Assessment Strategies

  • Self-Assessment Quizzes: Regular checks on OpenAPI syntax, documentation best practices, and tool features.
  • Peer Review: Exchange and review OpenAPI specifications and documentation examples with peers.
  • Design Review: Present the proposed architectural design to a small group for feedback and critical evaluation.
  • Practical Application: For the architectural design, consider a small Proof-of-Concept (PoC) implementation of a critical component to validate feasibility.
  • Final Presentation: Deliver a comprehensive presentation of the proposed API Documentation Generator architecture, detailing its components, benefits, and implementation roadmap.
gemini Output

This output represents Step 2 of 3: gemini → generate_code for the "API Documentation Generator" workflow. This step focuses on providing a detailed, professional, and production-ready code solution that facilitates the generation of comprehensive API documentation.

The generated code is a Python script designed to take a structured definition of your API endpoints and render them into a human-readable Markdown documentation file. This approach ensures consistency, reduces manual effort, and provides a clear separation between API definition and documentation presentation.


API Documentation Generator: Core Code Implementation

This section provides the Python code (api_doc_generator.py) that acts as a foundational component for generating API documentation. It includes:

  • A function generate_markdown_doc that processes a list of API endpoint

json

{

"id": "prod_001",

"name": "Wireless Bluetooth Earbuds",

"description": "High-fidelity sound with improved noise cancellation and longer battery life.",

"price": 69.99,

"currency": "USD",

"category_id": "cat_audio",

"sku": "WBT-EBUDS-001",

"created_at": "2023-01-1

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