API Documentation Writer
Run ID: 69cbe35961b1021a29a8d3212026-03-31Development
PantheraHive BOS
BOS Dashboard

PantheraHive Product Catalog API Documentation

Welcome to the comprehensive documentation for the PantheraHive Product Catalog API. This guide provides developers with all the necessary information to seamlessly integrate and interact with our product catalog data. Our API is designed to be intuitive, robust, and scalable, allowing you to manage product listings, retrieve product details, and maintain your catalog with ease.


1. API Overview

The PantheraHive Product Catalog API enables programmatic access to product data, allowing you to fetch, create, update, and delete product records. This API is built using RESTful principles, utilizing standard HTTP methods and JSON for data exchange, ensuring a familiar and efficient development experience.

Key Features:


2. Getting Started

To begin using the PantheraHive Product Catalog API, follow these simple steps:

  1. Obtain Your API Key: Register for a developer account on the PantheraHive Developer Portal to receive your unique API key. This key is essential for authenticating your requests.
  2. Understand Authentication: Familiarize yourself with our API authentication method (see Section 3).
  3. Explore Endpoints: Review the available API endpoints and their functionalities (see Section 6).
  4. Start Developing: Use the provided examples and your preferred HTTP client or programming language to make your first API call.

3. Authentication

All requests to the PantheraHive Product Catalog API must be authenticated. We use an API Key-based authentication mechanism.

How to Authenticate:

Include your API Key in the Authorization header of every request, prefixed with Bearer.

Header Example:

text • 1,569 chars
---

### **6. Rate Limiting**

To ensure fair usage and maintain API stability, requests are subject to rate limiting.
*   **Limit:** 100 requests per minute per API key.
*   **Headers:**
    *   `X-RateLimit-Limit`: The maximum number of requests allowed 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, you will receive a `429 Too Many Requests` status code. Please implement exponential backoff in your client to handle rate limit errors gracefully.

---

### **7. Endpoint Reference**

This section details all available endpoints for the PantheraHive Product Catalog API.

#### **7.1. Products**

The `/products` endpoint allows you to manage your product listings.

---

##### **7.1.1. List All Products**

*   **Endpoint:** `GET /products`
*   **Description:** Retrieves a list of all products in the catalog. Supports pagination and filtering.
*   **Authentication:** Required
*   **Query Parameters:**
    *   `limit` (optional, integer): Maximum number of products to return per page. Default is 10, max is 100.
    *   `offset` (optional, integer): Number of products to skip before starting to collect the result set. Default is 0.
    *   `category` (optional, string): Filter products by category name.
    *   `search` (optional, string): Search products by name or description.
*   **Response (200 OK):** An array of product objects.

**Example Request (cURL):**

Sandboxed live preview

Step 1 of 3: Research Topic - API Documentation Writer

This deliverable provides a comprehensive overview and detailed research into the role and function of an "API Documentation Writer." This foundational understanding is crucial for effectively generating high-quality API documentation.


1. Definition and Core Purpose

An API Documentation Writer is a specialized technical writer focused on creating clear, accurate, and user-friendly documentation for Application Programming Interfaces (APIs). Their primary goal is to empower developers (both internal and external) to understand, integrate, and utilize an API effectively and efficiently, minimizing friction and support requests.

2. Key Responsibilities and Scope

The responsibilities of an API Documentation Writer are multifaceted and span the entire API lifecycle:

  • Understanding the API: Deeply comprehending the API's functionality, architecture, endpoints, parameters, data models, authentication methods, and use cases. This often involves collaborating directly with API developers, product managers, and testers.
  • Audience Analysis: Identifying and understanding the target audience (e.g., frontend developers, backend developers, mobile developers, data scientists) and tailoring content to their specific needs, technical proficiency, and use cases.
  • Content Creation: Writing, editing, and maintaining various forms of API documentation, including:

* API Reference (endpoints, methods, parameters, request/response examples).

* Getting Started Guides/Tutorials.

* Authentication and Authorization Guides.

* Error Handling Guides.

* SDK Documentation.

* Release Notes and Changelogs.

* Use Case Examples and Code Samples.

* Conceptual Overviews.

  • Technical Accuracy and Clarity: Ensuring all documentation is technically correct, unambiguous, and easy to understand. This involves rigorous testing and validation of examples.
  • Tooling and Standards: Utilizing documentation tools (e.g., Swagger/OpenAPI, Postman, Markdown, static site generators) and adhering to established documentation standards and style guides.
  • Collaboration and Feedback: Working closely with engineering teams, product management, quality assurance, and support teams to gather information, validate content, and incorporate feedback.
  • Maintenance and Updates: Regularly reviewing and updating existing documentation to reflect API changes, new features, or improved understanding based on user feedback.
  • Information Architecture: Structuring documentation logically for easy navigation and discoverability.
  • Advocacy: Acting as a bridge between the API development team and the API consumers, advocating for developer experience improvements based on documentation gaps or user feedback.

3. Essential Skills and Competencies

A successful API Documentation Writer possesses a unique blend of technical, writing, and interpersonal skills:

  • Technical Proficiency:

* Understanding of web technologies (HTTP/HTTPS, REST, GraphQL, SOAP).

* Familiarity with data formats (JSON, XML).

* Basic programming knowledge (e.g., Python, JavaScript, cURL) for reading code, writing examples, and testing API calls.

* Ability to read and interpret API specifications (e.g., OpenAPI/Swagger definitions).

* Understanding of authentication mechanisms (OAuth, API Keys, JWT).

  • Exceptional Writing Skills:

* Clarity, conciseness, and precision in language.

* Ability to translate complex technical concepts into easily understandable terms.

* Strong grammar, punctuation, and style.

* Adherence to consistent terminology and style guides.

* Audience-centric writing.

  • Research and Information Gathering:

* Proactive in seeking out information from developers, code, and existing specifications.

* Ability to ask targeted questions and synthesize information from various sources.

  • Attention to Detail:

* Ensuring accuracy in code samples, parameter descriptions, and functional explanations.

* Meticulous proofreading.

  • Collaboration and Communication:

* Strong interpersonal skills for working with diverse technical teams.

* Ability to give and receive constructive feedback.

* Effective communication of documentation needs and priorities.

  • Problem-Solving:

* Identifying gaps in documentation or potential user confusion.

* Developing effective strategies to address documentation challenges.

4. Essential Tools and Technologies

API Documentation Writers leverage a range of tools to create, manage, and publish their content:

  • API Specification Formats:

* OpenAPI Specification (OAS) / Swagger: Industry standard for describing RESTful APIs. Tools like Swagger UI generate interactive documentation directly from an OAS file.

* Postman Collections: Used for documenting, testing, and sharing API requests.

* GraphQL Schema Definition Language (SDL): For GraphQL APIs.

  • Documentation Generators / Static Site Generators:

* Stoplight Studio / Docs: Comprehensive API design and documentation platform.

* Redocly: Generates beautiful, customizable API reference documentation from OpenAPI.

* Docusaurus, MkDocs, Gatsby, Hugo: For creating more extensive developer portals and conceptual documentation.

* ReadMe.io: A popular platform for interactive developer hubs.

  • Version Control Systems:

* Git / GitHub / GitLab / Bitbucket: For collaborative content management, versioning, and review workflows.

  • Text Editors / IDEs:

* VS Code, Sublime Text, Atom: For writing Markdown, YAML, JSON, and code samples.

  • Collaboration and Project Management:

* Jira, Confluence, Slack, Microsoft Teams: For tracking tasks, communicating with teams, and storing internal knowledge.

  • Command-Line Tools:

* cURL for testing API endpoints.

* Package managers (npm, pip) for installing dependencies for documentation tools.

5. Typical Deliverables

The output of an API Documentation Writer typically includes:

  • Interactive API Reference Documentation: Generated from OpenAPI specifications, allowing developers to explore endpoints, parameters, and test API calls directly.
  • Getting Started Guides/Tutorials: Step-by-step instructions for new users to quickly integrate and make their first successful API call.
  • Conceptual Guides: Explanations of core concepts, architecture, and design patterns related to the API.
  • Authentication and Authorization Guides: Detailed instructions on how to secure API access.
  • Error Code Dictionaries/Guides: Comprehensive lists of possible error responses and their meanings, with troubleshooting tips.
  • Code Samples and SDK Documentation: Examples in various programming languages demonstrating API usage.
  • Developer Portal/Website: A centralized hub hosting all API documentation, resources, and community information.
  • Release Notes and Changelogs: Updates detailing new features, bug fixes, and breaking changes.

This comprehensive research serves as the foundation for the subsequent steps in generating detailed and professional API documentation.

json

{

"status": "success",

"data": {

"id": "prod_001",

"name": "Wireless Bluetooth Headphones",

"description": "High-fidelity sound with comfortable earcups, active noise cancellation, and extended battery life.",

"sku": "WHPH-B001",

"price": 84.99,

"stock": 120,

"category": "Electronics",

"imageUrl": "https://cdn.pantherahive.com/products/prod_001.jpg",

"specifications": {

"color": "Black",

"weight_grams": 250,

"battery_hours": 20

},

"createdAt": "2023-01-15T10:00:00Z",

"updatedAt": "2023-11-0

gemini Output

API Documentation: Product Management API v1.0

Document Overview

This document provides comprehensive technical documentation for the Product Management API v1.0. It is designed for developers who wish to integrate their applications with our product management platform, enabling programmatic access to product data, inventory, categories, and more.

This documentation covers authentication, available endpoints, request/response formats, error handling, and provides practical examples to facilitate rapid integration.


Table of Contents

  1. How to Use This Documentation
  2. API Overview

* Purpose

* Key Features

* Core Concepts

  1. Getting Started

* Base URL

* Authentication

* Environments

  1. Data Formats

* Request Body

* Response Body

* Date & Time Formats

  1. Error Handling

* Standard Error Responses

* HTTP Status Codes

  1. Rate Limiting
  2. API Endpoints

* Products

* Categories

* Inventory

* Users (Admin/Internal)

  1. Webhooks (Optional)
  2. SDKs & Client Libraries (Future)
  3. Glossary
  4. Support & Feedback
  5. Change Log

1. How to Use This Documentation

This document is structured to allow developers to quickly find the information they need.

  • Start with "Getting Started" to understand authentication and the API's base URL.
  • Refer to "API Endpoints" for detailed information on each available resource and its operations.
  • Use "Error Handling" to understand how to interpret and respond to API errors.
  • Examples are provided in curl format and JSON for clarity.

2. API Overview

Purpose

The Product Management API provides a robust, RESTful interface for managing product-related data within our platform. It allows external systems to create, retrieve, update, and delete product information, synchronize inventory, manage product categories, and more.

Key Features

  • Product Lifecycle Management: Create, read, update, delete products.
  • Category Management: Organize products into hierarchical categories.
  • Inventory Synchronization: Update stock levels and availability.
  • Search & Filtering: Powerful query capabilities for product retrieval.
  • Secure Access: OAuth 2.0 for authentication and authorization.

Core Concepts

  • Product: The central entity, representing an item available for sale or management.
  • Category: A classification for products (e.g., "Electronics", "Clothing").
  • SKU (Stock Keeping Unit): A unique identifier for a specific product variant.
  • Inventory: The current stock level and availability status of a product/SKU.

3. Getting Started

Base URL

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

https://api.yourcompany.com/v1

Authentication

The Product Management API uses OAuth 2.0 with Bearer Tokens for authentication.

  1. Obtain an Access Token:

* Your application must first obtain an access token by authenticating with our OAuth 2.0 authorization server. This typically involves an authorization code grant flow or client credentials grant flow, depending on your application type.

* Example authorization server endpoint: https://auth.yourcompany.com/oauth/token

* Required Scopes:

* products:read: Access to retrieve product data.

* products:write: Access to create, update, delete product data.

* categories:read: Access to retrieve category data.

* inventory:write: Access to update inventory levels.

  1. Include Token in Requests:

* Once you have an access token, include it in the Authorization header of every API request as a Bearer token.


    Authorization: Bearer YOUR_ACCESS_TOKEN

Example Request Header:


    GET /v1/products HTTP/1.1
    Host: api.yourcompany.com
    Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    Content-Type: application/json

Environments

The API is available in the following environments:

  • Production: https://api.yourcompany.com/v1 (Use for live applications)
  • Sandbox: https://sandbox.api.yourcompany.com/v1 (Use for testing and development, data is not persistent)

4. Data Formats

Request Body

All request bodies must be sent as application/json and include the Content-Type: application/json header.

Response Body

All successful responses will return data in application/json format.

Date & Time Formats

All dates and times are represented in ISO 8601 format (e.g., YYYY-MM-DDTHH:MM:SSZ) and are in UTC.


5. 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 additional details.

Standard Error Responses


{
  "code": "ERROR_CODE",
  "message": "A human-readable explanation of the error.",
  "details": [
    {
      "field": "parameterName",
      "issue": "Specific validation error or problem."
    }
  ]
}

HTTP Status Codes

  • 200 OK: The request was successful.
  • 201 Created: A new resource was successfully created.
  • 204 No Content: The request was successful, but there is no content to return (e.g., a successful deletion).
  • 400 Bad Request: The request was malformed or invalid (e.g., missing required parameters, invalid JSON).
  • 401 Unauthorized: Authentication is required or has failed (e.g., missing or invalid access token).
  • 403 Forbidden: The authenticated user does not have permission to access the resource or perform the action.
  • 404 Not Found: The requested resource could not be found.
  • 405 Method Not Allowed: The HTTP method used is not supported for the requested resource.
  • 409 Conflict: The request could not be completed due to a conflict with the current state of the resource (e.g., trying to create a resource with a duplicate unique identifier).
  • 429 Too Many Requests: The client has sent too many requests in a given amount of time (rate limiting).
  • 500 Internal Server Error: An unexpected error occurred on the server.

6. Rate Limiting

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

  • Limit: 100 requests per minute per IP address/API Key.
  • Headers:

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

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

* X-RateLimit-Reset: The time at which the current rate limit window resets (UTC epoch seconds).

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


7. API Endpoints

This section details all available API endpoints.

7.1. Products

##### GET /v1/products - Retrieve a list of products

  • Description: Returns a paginated list of products. Supports filtering and sorting.
  • Authentication: products:read scope required.
  • Query Parameters:

* page (integer, optional): Page number for pagination. Default: 1.

* limit (integer, optional): Number of items per page. Max: 100. Default: 20.

* category_id (string, optional): Filter products by a specific category ID.

* status (string, optional): Filter products by status (e.g., active, draft, archived).

* sort_by (string, optional): Field to sort by (e.g., name, price, created_at). Default: created_at.

* sort_order (string, optional): Sort order (asc or desc). Default: desc.

  • Response 200 OK:

    {
      "data": [
        {
          "id": "prod_abc123",
          "name": "Wireless Bluetooth Headphones",
          "description": "Premium over-ear headphones with noise cancellation.",
          "sku": "WH-BT-001",
          "price": 99.99,
          "currency": "USD",
          "status": "active",
          "category_id": "cat_xyz789",
          "inventory_count": 500,
          "created_at": "2023-01-15T10:00:00Z",
          "updated_at": "2023-10-26T14:30:00Z"
        },
        {
          "id": "prod_def456",
          "name": "Smartwatch Series 5",
          "description": "Feature-rich smartwatch with health tracking.",
          "sku": "SW-S5-BLK",
          "price": 249.00,
          "currency": "USD",
          "status": "active",
          "category_id": "cat_xyz789",
          "inventory_count": 120,
          "created_at": "2023-02-01T11:00:00Z",
          "updated_at": "2023-10-25T09:15:00Z"
        }
      ],
      "meta": {
        "total_count": 250,
        "page": 1,
        "limit": 20,
        "total_pages": 13,
        "next_page": "https://api.yourcompany.com/v1/products?page=2&limit=20"
      }
    }
  • Example curl:

    curl -X GET "https://api.yourcompany.com/v1/products?limit=2&status=active&sort_by=price&sort_order=asc" \
      -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
      -H "Content-Type: application/json"

##### GET /v1/products/{product_id} - Retrieve a single product by ID

  • Description: Returns the details of a specific product.
  • Authentication: products:read scope required.
  • Path Parameters:

* product_id (string, required): The unique identifier of the product.

  • Response 200 OK:

    {
      "id": "prod_abc123",
      "name": "Wireless Bluetooth Headphones",
      "description": "Premium over-ear headphones with noise cancellation.",
      "sku": "WH-BT-001",
      "price": 99.99,
      "currency": "USD",
      "status": "active",
      "category_id": "cat_xyz789",
      "inventory_count": 500,
      "created_at": "2023-01-15T10:00:00Z",
      "updated_at": "2023-10-26T14:30:00Z"
    }
  • Response 404 Not Found: If product_id does not exist.
  • Example curl:

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

##### POST /v1/products - Create a new product

  • Description: Creates a new product in the system.
  • Authentication: products:write scope required.
  • Request Body:

* name (string, required): The name of the product.

* description (string, optional): A detailed description of the product.

* sku (string, required): The Stock Keeping Unit, must be unique.

* price (number, required): The price of the product.

* currency (string, required): The currency code (e.g., USD, EUR).

* category_id (string, optional): The ID of the category this product belongs to.

* initial_inventory (integer, optional): Initial stock count. Default: 0.

  • Response 201 Created:

    {
      "id": "prod_new789",
      "name": "New Product Name",
      "description": "A brand new product.",
      "sku": "NP-001",
      "price": 19.99,
      "currency": "USD",
      "status": "draft",
      "category_id": null,
      "inventory_count": 100,
      "created_at": "2023-10-27T09:00:00Z",
      "updated_at": "2023-10-27T09:00:00Z"
    }
  • Response 400 Bad Request: If required fields are missing or sku is not unique.
  • Example curl:

    curl -X POST "https://api.yourcompany.com/v1/products" \
      -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
            "name": "Ergonomic Office Chair",
            "description": "High-back mesh chair with lumbar support.",
            "sku": "OC-ERG-001",
            "price": 299.99,
            "currency": "USD",
            "category_id": "cat_furn001",
            "initial_inventory": 50
          }'

##### PUT /v1/products/{product_id} - Update an existing product

  • Description: Updates all fields of an existing product. All fields in the request body are required for a full update. For partial updates, use PATCH.
  • Authentication: products:write scope required.
  • **Path
api_documentation_writer.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);}});}