API Documentation Writer
Run ID: 69bca4e077c0421c0bf4962b2026-03-29Development
PantheraHive BOS
BOS Dashboard

API Documentation Generation (Step 1 of 2: Generate)

This document provides a comprehensive, professional API documentation based on your request. Given the test input, we have generated a detailed example for a hypothetical "User Management API" to demonstrate the structure, content, and best practices for robust API documentation. This output is designed to be immediately useful, providing a template and specific examples that can be adapted to any API.


User Management API Documentation

1. Introduction

The User Management API provides a secure and efficient way to programmatically manage user accounts within the PantheraHive ecosystem. This API allows developers to create, retrieve, update, and delete user records, facilitating seamless integration with existing applications and services.

Key Features:

2. Base URL

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

https://api.example.com/v1

3. Authentication

The User Management API uses API Key authentication. Your API Key must be included in the X-API-Key header for every request.

How to obtain your API Key:

  1. Log in to your PantheraHive developer dashboard.
  2. Navigate to the "API Keys" section.
  3. Generate a new API Key or use an existing one.
  4. Ensure your API Key has the necessary permissions for the endpoints you intend to use.

Example Authentication Header:

text • 1,263 chars
*   **`400 Bad Request`**: Invalid input provided.
*   **`409 Conflict`**: A user with the provided email already exists.

#### 7.4. Update a User

`PUT /users/{id}`

Updates an existing user account. All fields in the request body are optional; only provided fields will be updated.

**Path Parameters:**

| Parameter | Type   | Description               |
| :-------- | :----- | :------------------------ |
| `id`      | `string` | The unique ID of the user.|

**Request Body:**

| Field      | Type   | Description                                   | Constraints                                        |
| :--------- | :----- | :-------------------------------------------- | :------------------------------------------------- |
| `email`    | `string` | New email address for the user.               | Optional, unique, valid email format.              |
| `firstName`| `string` | New first name for the user.                  | Optional, max 50 characters.                       |
| `lastName` | `string` | New last name for the user.                   | Optional, max 50 characters.                       |
| `status`   | `string` | New status for the user account.              | Optional, `active`, `inactive`, `pending`.         |

**Example Request:**

Sandboxed live preview

9. SDKs and Libraries

Currently, official SDKs are not available. However, the RESTful nature of the API allows for easy integration using any HTTP client library in your preferred programming language.

10. Support and Feedback

For technical support, bug reports, or feature requests, please contact our developer support team at support@pantherahive.com or visit our developer community forum at https://community.pantherahive.com/developers.

11. Changelog

(This section would typically list version changes, new features, bug fixes, and deprecations. For this generated output, it serves as a placeholder.)

Version 1.0.0 (2023-10-27)

  • Initial release of the User Management API.
  • Endpoints for CRUD operations on user resources.
  • API Key authentication implemented.
  • Basic error handling and rate limiting.

This concludes the "generate" step of the API Documentation Writer workflow. The output provides a structured, detailed, and actionable API documentation example.

Step 2: projectmanager

API Documentation: Example Service API

This document provides comprehensive technical documentation for the Example Service API. It outlines the available endpoints, authentication methods, data models, and error handling to enable developers to integrate seamlessly with the service.


1. Introduction

The Example Service API provides programmatic access to manage and retrieve data related to various resources within the Example Service ecosystem. It is designed to be RESTful, utilizing standard HTTP methods and status codes, and operating over HTTPS.

Purpose of this document: This documentation serves as a guide for developers, detailing how to interact with the API, understand its capabilities, and integrate it into their applications effectively.

2. Base URL

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

https://api.exampleservice.com/v1

3. Authentication

The Example Service API uses API Key authentication. All requests to protected endpoints must include a valid API key.

3.1 Obtaining an API Key

API keys can be generated and managed from your developer dashboard under the "API Settings" section. Treat your API key as a sensitive credential, similar to a password.

3.2 Authenticating Requests

Include your API key in the Authorization header of each request, prefixed with the scheme Bearer.

Header Example:


Authorization: Bearer YOUR_API_KEY

Example Request with Authentication:


curl -X GET \
  'https://api.exampleservice.com/v1/users' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY'

4. Rate Limiting

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

  • Requests per minute: 100 requests per minute per API key.

If you exceed the rate limit, the API will return a 429 Too Many Requests HTTP status code. The response headers will include details about the limit and when you can retry:

  • X-RateLimit-Limit: The maximum number of requests you can make in the current window.
  • X-RateLimit-Remaining: The number of requests remaining in the current window.
  • X-RateLimit-Reset: The UTC epoch seconds when the current rate limit window resets.

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 details about the error.

5.1 Common Error Responses

| HTTP Status Code | Description | Error Code | Example Error Message |

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

| 200 OK | Request successful. | N/A | N/A |

| 201 Created | Resource successfully created. | N/A | N/A |

| 204 No Content | Request successful, no content to return. | N/A | N/A |

| 400 Bad Request| Invalid request parameters or body. | invalid_request | The 'name' field is required. |

| 401 Unauthorized| Missing or invalid authentication credentials.| unauthorized | Invalid API key. |

| 403 Forbidden | Authenticated but forbidden from accessing the resource.| forbidden | You do not have permission to perform this action. |

| 404 Not Found | The requested resource does not exist. | not_found | Resource with ID 'xyz123' not found. |

| 405 Method Not Allowed| The HTTP method is not supported for this resource.| method_not_allowed| GET method is not allowed for this endpoint. |

| 409 Conflict | Request could not be completed due to a conflict with the current state of the resource.| conflict | Resource with name 'Example' already exists. |

| 429 Too Many Requests| Rate limit exceeded. | rate_limit_exceeded| Too many requests. Please try again later. |

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

5.2 Error Response Structure


{
  "status": "error",
  "code": "invalid_request",
  "message": "The 'name' field is required.",
  "details": {
    "field": "name",
    "reason": "missing_field"
  }
}

6. Endpoints

The following sections detail the available API endpoints, categorized by resource.

6.1 Users Resource

The Users resource allows you to manage user accounts within the Example Service.

6.1.1 List All Users

Retrieves a list of all user accounts.

  • Method: GET
  • Path: /users
  • Description: Returns a paginated list of user objects.
  • Query Parameters:

* limit (optional, integer): Maximum number of users to return. Default is 20, max is 100.

* offset (optional, integer): Number of users to skip before starting to collect the result set. Default is 0.

* status (optional, string): Filter users by their status (e.g., active, inactive).

  • Request Example:

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

    {
      "status": "success",
      "data": [
        {
          "id": "usr_abc123",
          "name": "John Doe",
          "email": "john.doe@example.com",
          "status": "active",
          "created_at": "2023-01-01T10:00:00Z",
          "updated_at": "2023-01-01T10:00:00Z"
        },
        {
          "id": "usr_def456",
          "name": "Jane Smith",
          "email": "jane.smith@example.com",
          "status": "inactive",
          "created_at": "2023-01-05T11:30:00Z",
          "updated_at": "2023-01-08T14:00:00Z"
        }
      ],
      "meta": {
        "total": 25,
        "limit": 10,
        "offset": 0,
        "next_offset": 10
      }
    }

6.1.2 Create a New User

Creates a new user account.

  • Method: POST
  • Path: /users
  • Description: Adds a new user to the system.
  • Request Body (application/json):

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

* email (required, string): The unique email address for the user.

* password (required, string): The user's password (will be hashed).

* status (optional, string): Initial status of the user (e.g., pending, active). Default is pending.

  • Request Example:

    curl -X POST \
      'https://api.exampleservice.com/v1/users' \
      -H 'Content-Type: application/json' \
      -H 'Accept: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY' \
      -d '{
            "name": "Alice Wonderland",
            "email": "alice@example.com",
            "password": "securepassword123",
            "status": "active"
          }'
  • Response (201 Created):

    {
      "status": "success",
      "data": {
        "id": "usr_ghi789",
        "name": "Alice Wonderland",
        "email": "alice@example.com",
        "status": "active",
        "created_at": "2023-03-15T09:15:00Z",
        "updated_at": "2023-03-15T09:15:00Z"
      }
    }

6.1.3 Retrieve a Specific User

Retrieves details for a single user by their ID.

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

* user_id (required, string): The unique identifier of the user (e.g., usr_abc123).

  • Request Example:

    curl -X GET \
      'https://api.exampleservice.com/v1/users/usr_abc123' \
      -H 'Accept: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY'
  • Response (200 OK):

    {
      "status": "success",
      "data": {
        "id": "usr_abc123",
        "name": "John Doe",
        "email": "john.doe@example.com",
        "status": "active",
        "created_at": "2023-01-01T10:00:00Z",
        "updated_at": "2023-01-01T10:00:00Z"
      }
    }
  • Response (404 Not Found):

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

6.2 Products Resource

The Products resource allows you to manage product listings in the Example Service catalog.

6.2.1 List All Products

Retrieves a list of all product listings.

  • Method: GET
  • Path: /products
  • Description: Returns a paginated list of product objects.
  • Query Parameters:

* category (optional, string): Filter products by category.

* available (optional, boolean): Filter products by availability.

  • Request Example:

    curl -X GET \
      'https://api.exampleservice.com/v1/products?category=electronics&available=true' \
      -H 'Accept: application/json' \
      -H 'Authorization: Bearer YOUR_API_KEY'
  • Response (200 OK):

    {
      "status": "success",
      "data": [
        {
          "id": "prd_101",
          "name": "Wireless Headphones",
          "description": "Premium noise-cancelling headphones.",
          "price": 199.99,
          "currency": "USD",
          "category": "electronics",
          "available": true,
          "created_at": "2023-02-10T08:00:00Z"
        }
      ],
      "meta": {
        "total": 50,
        "limit": 20,
        "offset": 0
      }
    }

7. Data Models

This section defines the common data structures used in API requests and responses.

7.1 User Object

Represents a user account in the system.

| Field | Type | Description |

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

| id | string | Unique identifier for the user. |

| name | string | The full name of the user. |

| email | string | The unique email address of the user. |

| status | string | Current status of the user (active, inactive, pending). |

| created_at | string | ISO 8601 timestamp of when the user was created. |

| updated_at | string | ISO 8601 timestamp of when the user was last updated. |

Example:


{
  "id": "usr_abc123",
  "name": "John Doe",
  "email": "john.doe@example.com",
  "status": "active",
  "created_at": "2023-01-01T10:00:00Z",
  "updated_at": "2023-01-01T10:00:00Z"
}

7.2 Product Object

Represents a product listing in the catalog.

| Field | Type | Description |

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

| id | string | Unique identifier for the product. |

| name | string | Name of the product. |

| description| string | Detailed description of the product. |

| price | number | Price of the product. |

| currency | string | ISO 4217 currency code (e.g., USD, EUR). |

| category | string | Category of the product. |

| available | boolean | Indicates if the product is currently available. |

| created_at | string | ISO 8601 timestamp of when the product was added. |

| updated_at | string | ISO 8601 timestamp of when the product was last updated. |

Example:


{
  "id": "prd_101",
  "name": "Wireless Headphones",
  "description": "Premium noise-cancelling headphones with active noise cancellation.",
  "price": 199.99,
  "currency": "USD",
  "category": "electronics",
  "available": true,
  "created_at": "2023-02-10T08:00:00Z",
  "updated_at": "2023-02-15T12:00:00Z"
}

8. Versioning

The Example Service API uses URL-based versioning. The current version is v1. All new features and breaking changes will be introduced in new versions (e.g., v2), which will be announced with ample notice.

9. Support and Feedback

If you encounter any issues, have questions, or would like to provide feedback, please contact our developer support team:

  • Email: dev-support@exampleservice.com
  • Documentation Feedback: Use the "Suggest an Edit" link on our developer portal.

Note to User: This comprehensive output provides a structured template for API documentation based on your test input. For a real API, you would replace the placeholder details (e.g., "Example Service API", "Users Resource", example data) with your actual API's information. Ensure all endpoints, request/response parameters, data models, and error codes are accurately described for your specific implementation.

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