API Integration Builder
Run ID: 69cc28a1fdffe128046c50e12026-03-31Development
PantheraHive BOS
BOS Dashboard

Generate code to integrate with external APIs

API Integration Builder: Code Generation Deliverable

This document provides a comprehensive, detailed, and production-ready code example for integrating with an external API, designed as a foundational deliverable for your "API Integration Builder" workflow. This output will serve as a robust starting point, demonstrating best practices in API interaction, error handling, and code structure.


1. Introduction to API Integration

API (Application Programming Interface) integration is the process of connecting two or more applications so that they can exchange data. This enables your systems to leverage external services, data sources, or functionalities without needing to build them from scratch.

This deliverable focuses on generating Python code to interact with a RESTful API. Python, with its requests library, is widely used for its simplicity, readability, and powerful capabilities in handling HTTP requests. The provided code is modular, includes robust error handling, and follows security best practices, making it suitable for immediate use and easy adaptation to your specific API requirements.

2. Core Concepts of API Integration

Before diving into the code, it's essential to understand the fundamental concepts governing API interactions:

  • HTTP Methods: These define the type of action you want to perform.

* GET: Retrieve data from the server.

* POST: Send new data to the server to create a resource.

* PUT: Update an existing resource on the server (replaces the entire resource).

* PATCH: Partially update an existing resource on the server.

* DELETE: Remove a resource from the server.

  • Endpoints: Specific URLs that define the resources you can interact with. For example, /products might represent a collection of products, and /products/{id} might represent a single product.
  • Request Headers: Key-value pairs sent with a request to provide metadata, such as:

* Content-Type: Specifies the format of the request body (e.g., application/json).

* Authorization: Carries authentication credentials (e.g., API keys, OAuth tokens).

* Accept: Specifies the preferred format of the response.

  • Request Body: Data sent with POST, PUT, or PATCH requests, typically in JSON or XML format.
  • Response Status Codes: Three-digit numbers indicating the outcome of a request:

* 2xx (Success): E.g., 200 OK, 201 Created.

* 4xx (Client Error): E.g., 400 Bad Request, 401 Unauthorized, 404 Not Found.

* 5xx (Server Error): E.g., 500 Internal Server Error, 503 Service Unavailable.

  • Response Body: The data returned by the server, typically in JSON or XML format, containing the requested resource or an error message.
  • Authentication: Verifying the identity of the client making the request. Common methods include:

* API Keys: A unique token sent in a header or query parameter.

* OAuth 2.0: A more complex token-based authentication standard often used for user authorization.

* JWT (JSON Web Tokens): Self-contained tokens used for securely transmitting information between parties.

3. Example API Integration: Product Catalog Service

To provide a concrete example, we will simulate integration with a hypothetical "Product Catalog API". This API allows us to fetch product information.

Scenario: We want to build a Python client that can:

  1. Retrieve a list of all products.
  2. Retrieve details for a specific product by its ID.

Hypothetical API Details:

  • Base URL: https://api.example.com/v1 (You will replace this with your actual API's base URL).
  • Authentication: An API Key, passed in the X-API-KEY header.
  • Endpoints:

* GET /products: Fetches a list of all products.

* Response: An array of product objects (e.g., [{"id": "P001", "name": "Laptop", ...}]).

* GET /products/{product_id}: Fetches details for a specific product.

* Response: A single product object (e.g., {"id": "P001", "name": "Laptop", ...}).

4. Production-Ready Python Code

The following code is structured into two main files:

  • product_api_client.py: Contains the ProductCatalogClient class, which encapsulates all logic for interacting with the API. This promotes reusability and maintainability.
  • main.py: Demonstrates how to use the ProductCatalogClient to make requests and handle responses.

File 1: product_api_client.py


import os
import requests
import json
import logging

# Configure logging for better visibility into API interactions
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# --- Custom Exception Classes for Robust Error Handling ---
class APIError(Exception):
    """Base exception for API-related errors."""
    def __init__(self, message, status_code=None, details=None):
        super().__init__(message)
        self.status_code = status_code
        self.details = details

    def __str__(self):
        detail_str = f" Details: {json.dumps(self.details)}" if self.details else ""
        return f"API Error: {self.args[0]} (Status: {self.status_code}){detail_str}"

class APIAuthenticationError(APIError):
    """Raised when authentication fails (e.g., 401 Unauthorized)."""
    pass

class APINotFoundError(APIError):
    """Raised when a requested resource is not found (e.g., 404 Not Found)."""
    pass

class APIServerError(APIError):
    """Raised for server-side errors (e.g., 5xx status codes)."""
    pass

class APIRequestError(APIError):
    """Raised for client-side errors (e.g., 4xx status codes other than 401/404)."""
    pass

# --- ProductCatalogClient Class ---
class ProductCatalogClient:
    """
    A client for interacting with the hypothetical Product Catalog API.

    Handles API requests, authentication, and basic error parsing.
    """
    def __init__(self, base_url, api_key, timeout=10):
        """
        Initializes the ProductCatalogClient.

        Args:
            base_url (str): The base URL of the Product Catalog API (e.g., 'https://api.example.com/v1').
            api_key (str): The API key for authentication.
            timeout (int): Default timeout for API requests in seconds.
        """
        if not base_url or not api_key:
            raise ValueError("Base URL and API Key cannot be empty.")

        self.base_url = base_url.rstrip('/') # Ensure no trailing slash for consistent URL joining
        self.headers = {
            "Content-Type": "application/json",
            "Accept": "application/json",
            "X-API-KEY": api_key # Example API key header
        }
        self.timeout = timeout
        logger.info(f"ProductCatalogClient initialized for {self.base_url}")

    def _make_request(self, method, endpoint, params=None, data=None):
        """
        Internal helper method to make HTTP requests to the API.

        Args:
            method (str): HTTP method (e.g., 'GET', 'POST').
            endpoint (str): The API endpoint relative to the base URL.
            params (dict, optional): Dictionary of URL query parameters.
            data (dict, optional): Dictionary of data to send in the request body (for POST/PUT).

        Returns:
            dict: The JSON response from the API.

        Raises:
            APIError: For any API-related errors.
            requests.exceptions.RequestException: For network-related errors.
        """
        url = f"{self.base_url}{endpoint}"
        logger.debug(f"Making {method} request to: {url} with params: {params}, data: {json.dumps(data) if data else 'None'}")

        try:
            response = requests.request(
                method,
                url,
                headers=self.headers,
                params=params,
                json=data, # Use 'json' parameter for automatic JSON serialization
                timeout=self.timeout
            )
            response.raise_for_status() # Raises HTTPError for bad responses (4xx or 5xx)

            # Attempt to parse JSON response. Some successful responses might not have a body.
            if response.text:
                return response.json()
            else:
                return {} # Return empty dict for successful responses with no content

        except requests.exceptions.HTTPError as e:
            status_code = e.response.status_code
            error_details = None
            try:
                error_details = e.response.json()
            except json.JSONDecodeError:
                error_details = {"message": e.response.text}

            error_message = error_details.get("message", f"API request failed with status {status_code}")
            logger.error(f"HTTP Error {status_code} for {url}: {error_message}")

            if status_code == 401:
                raise APIAuthenticationError(error_message, status_code, error_details) from e
            elif status_code == 404:
                raise APINotFoundError(error_message, status_code, error_details) from e
            elif 400 <= status_code < 500:
                raise APIRequestError(error_message, status_code, error_details) from e
            elif 500 <= status_code < 600:
                raise APIServerError(error_message, status_code, error_details) from e
            else:
                raise APIError(error_message, status_code, error_details) from e

        except requests.exceptions.Timeout as e:
            logger.error(f"Request timed out for {url}: {e}")
            raise APIError(f"Request to {url} timed out.", details={"error": str(e)}) from e
        except requests.exceptions.ConnectionError as e:
            logger.error(f"Connection error for {url}: {e}")
            raise APIError(f"Failed to connect to {url}. Check network connectivity.", details={"error": str(e)}) from e
        except requests.exceptions.RequestException as e:
            logger.error(f"An unexpected request error occurred for {url}: {e}")
            raise APIError(f"An unexpected error occurred during the request to {url}.", details={"error": str(e)}) from e
        except json.JSONDecodeError as e:
            logger.error(f"Failed to decode JSON response from {url}: {e}. Response text: {response.text}")
            raise APIError(f"Invalid JSON response from {url}.", details={"error": str(e), "response": response.text}) from e

    def get_all_products(self):
        """
        Retrieves a list of all products from the API.

        Returns:
            list: A list of product dictionaries.
        """
        logger.info("Attempting to retrieve all products.")
        return self._make_request("GET", "/products")

    def get_product_by_id(self, product_id):
        """
        Retrieves details for a specific product by its ID.

        Args:
            product_id (str): The ID of the product to retrieve.

        Returns:
            dict: A dictionary containing the product details.
        """
        if not product_id:
            raise ValueError("Product ID cannot be empty.")
        logger.info(f"Attempting to retrieve product with ID: {product_id}")
        return self._make_request("GET", f"/products/{product_id}")

    # Example for other HTTP methods (uncomment and modify as needed)
    # def create_product(self, product_data):
    #     """
    #     Creates a new product.
    #     Args:
    #         product_data (dict): Dictionary containing new product details.
    #     Returns:
    #         dict: The created product object.
    #     """
    #     logger.info(f"Attempting to create product with data: {product_data}")
    #     return self._make_request("POST", "/products", data=product_data)

    # def update_product(self, product_id, product_data):
    #     """
projectmanager Output

As a professional deliverable for the "API Integration Builder" workflow, this output details the crucial steps and considerations for initiating and managing an API integration project. This guide is designed to help you, as the project manager or key stakeholder, establish a robust framework for successful integration.


API Integration Project Initiation Guide

This document outlines the essential elements for successfully creating and managing an API integration project. By following these guidelines, you can ensure a structured approach, mitigate risks, and achieve your integration objectives efficiently.


1. Project Overview and Objectives

A clear understanding of why an integration is being pursued is foundational. This section helps define the project's purpose and expected outcomes.

  • Project Title: Clearly name your integration project (e.g., "CRM-ERP Data Synchronization API," "Payment Gateway Integration for E-commerce").
  • Primary Business Goal: Articulate the overarching business problem this integration aims to solve.

Examples:* Streamline data flow, automate manual processes, enhance user experience, enable new functionalities, improve data accuracy, reduce operational costs.

  • Key Objectives (SMART Goals): Define specific, measurable, achievable, relevant, and time-bound goals.

Example 1:* "Automate customer data synchronization between Salesforce (CRM) and SAP (ERP), reducing manual data entry by 80% within 3 months of deployment."

Example 2:* "Integrate Stripe payment gateway into the e-commerce platform to support secure online transactions and increase payment options by Q4."

Example 3:* "Enable real-time inventory updates from the warehouse management system to the online store, ensuring 99% inventory accuracy for customers."

  • Initial Scope Definition: Clearly delineate what functionalities, data entities, and API endpoints will be included in this initial phase. Equally important is defining what is explicitly out of scope to prevent creep.

Example:* "Phase 1 will focus on creating new customer records and updating existing customer details from CRM to ERP. Bidirectional sync or historical data migration is out of scope for this phase."


2. Key Project Phases for API Integration

A typical API integration project follows distinct phases, each with specific activities and deliverables.

2.1. Discovery & Planning

This initial phase is critical for laying the groundwork and defining the project's direction.

  • Detailed Requirements Gathering:

Functional Requirements: What should the integration do*? (e.g., "Synchronize customer email addresses," "Process order status updates").

Non-functional Requirements: How should the integration perform*? (e.g., performance, scalability, security, reliability, latency, error handling).

  • External API Documentation Review: Thoroughly analyze the external API's documentation (endpoints, authentication, rate limits, data models, error codes, versioning). Identify any limitations or specific requirements.
  • High-Level Architecture Design: Sketch out the overall integration flow, including data sources, target systems, middleware (if any), and interaction patterns.
  • Technology Stack Evaluation: Determine the appropriate programming languages, frameworks, integration platforms (e.g., iPaaS), and tools for development.
  • Preliminary Project Plan: Develop an initial timeline, identify key milestones, estimate resource needs, and draft a high-level budget.

2.2. Design & Architecture

This phase translates requirements into a detailed technical blueprint.

  • Detailed Integration Design:

* Data Mapping: Define precise transformations between source and target data models.

* Authentication & Authorization: Design secure mechanisms for API access.

* Error Handling & Retry Mechanisms: Plan for robust error detection, logging, notification, and automated retry strategies.

* Idempotency: Ensure operations can be repeated without unintended side effects.

* Scalability & Performance: Design for expected transaction volumes and response times.

* Security Architecture: Implement measures for data encryption, access control, and vulnerability prevention.

  • API Wrapper/SDK Design (if applicable): If an internal abstraction layer is being built, design its interface and functionalities.

2.3. Development & Implementation

This is where the integration code is written and built.

  • Coding Integration Logic: Develop the connectors, data transformers, business logic, and error handling routines.
  • Unit Testing: Write automated tests for individual components of the integration.
  • Version Control: Utilize a version control system (e.g., Git) for code management and collaboration.
  • Code Reviews: Conduct regular peer code reviews to ensure quality, adherence to standards, and identify potential issues.

2.4. Testing & Quality Assurance

Rigorous testing is essential to ensure the integration functions correctly and reliably.

  • Integration Testing: Verify the end-to-end data flow and interaction between systems.
  • Performance Testing: Assess the integration's speed, responsiveness, and stability under various load conditions.
  • Security Testing: Conduct vulnerability assessments and penetration testing.
  • User Acceptance Testing (UAT): Involve business stakeholders to validate that the integration meets their functional requirements.
  • Regression Testing: Ensure new changes don't break existing functionalities.

2.5. Deployment & Monitoring

Bringing the integration to a production environment and ensuring its ongoing health.

  • Deployment Strategy: Plan for phased deployment (e.g., staging to production), rollback procedures, and minimal downtime.
  • Monitoring & Alerting Setup: Implement tools and dashboards to track integration health, performance metrics, error rates, and data volumes. Set up alerts for critical issues.
  • Logging: Ensure comprehensive logging of integration activities for debugging and auditing.

2.6. Maintenance & Support

Ongoing activities to keep the integration running smoothly.

  • Ongoing Monitoring: Continuously observe the integration for performance degradation or errors.
  • Bug Fixing & Enhancements: Address issues and implement new features as required.
  • API Change Management: Plan for handling updates, deprecations, or breaking changes in the external API.
  • Documentation Updates: Keep all project documentation current.

3. Core Project Management Considerations

Effective project management is paramount for navigating the complexities of API integrations.

3.1. Stakeholder Identification & Communication Plan

  • Key Stakeholders: Identify all individuals or groups impacted by or contributing to the integration (e.g., Business Owners, Technical Leads, Development Team, QA Team, DevOps, Security Team, Legal, External API Provider representatives).
  • Communication Matrix: Define communication frequency, channels (e.g., weekly status meetings, email updates, dedicated chat channels), and reporting formats for different stakeholder groups.

3.2. Resource Allocation

  • Project Manager: Dedicated individual to oversee the entire project.
  • Integration Developers: Skilled engineers for building the integration logic.
  • QA Engineers: Testers focused on integration quality and performance.
  • DevOps/Infrastructure Specialists: For deployment, monitoring, and infrastructure management.
  • Subject Matter Experts (SMEs): Business users or technical experts from involved systems (e.g., CRM admin, ERP specialist).

3.3. Risk Management

  • Identify Potential Risks:

* Technical: External API downtime, breaking changes in external API, performance bottlenecks, security vulnerabilities, data integrity issues.

* Project: Scope creep, resource unavailability, budget overruns, timeline delays, lack of clear requirements.

* Operational: Lack of clear ownership post-deployment, insufficient monitoring.

  • Mitigation Strategies: Develop plans to reduce the likelihood or impact of identified risks.
  • Contingency Plans: Prepare fallback options if a risk materializes.

3.4. Documentation

Comprehensive documentation is vital for understanding, maintaining, and troubleshooting the integration.

  • Project Plan: Detailed roadmap, timelines, and resource assignments.
  • Requirements Document: Functional and non-functional specifications.
  • Technical Design Document (TDD): Detailed architecture, data mappings, error handling, security considerations.
  • API Specification (for internal APIs/wrappers): If building an internal API layer.
  • Test Plans & Results: Document all testing activities and outcomes.
  • Deployment & Rollback Guides: Step-by-step instructions for deployment and recovery.
  • Operational Runbooks: Guides for monitoring, incident response, and routine maintenance.
  • User Guides (if applicable): Instructions for end-users interacting with the integrated system.

3.5. Budget & Timeline Management

  • Cost Estimation: Account for personnel (salaries, contractors), tools, licenses, infrastructure, and potential external API usage fees.
  • Detailed Timeline: Break down the project into phases, tasks, and sub-tasks with estimated durations and dependencies. Establish clear milestones.
  • Contingency: Allocate contingency budget and time to account for unforeseen issues.

4. Recommended Tools & Methodologies

Leveraging appropriate tools and methodologies can significantly enhance project efficiency and success.

  • Project Management Methodologies:

* Agile (Scrum/Kanban): Highly recommended for iterative development, flexibility, and continuous feedback, especially given the evolving nature of API integrations.

  • Project Management Tools:

* Jira, Asana, Trello, Azure DevOps, Monday.com (for task tracking, sprint management, and reporting).

  • API Development & Testing Tools:

* Postman, Insomnia (for API testing and development).

* Swagger/OpenAPI (for API specification and documentation).

  • Version Control Systems:

* Git (GitHub, GitLab, Bitbucket) (for code management and collaboration).

  • Monitoring & Logging Platforms:

* Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, Kibana), Datadog, Splunk (for real-time monitoring, alerting, and log analysis).

  • Integration Platforms (iPaaS):

* MuleSoft, Dell Boomi, Zapier, Workato (for complex integrations, reduced coding, and pre-built connectors).


5. Next Steps & Actionable Items

To officially kick off your API integration project, we recommend the following immediate actions:

  1. Designate a Project Lead: Assign an internal Project Manager who will be responsible for overseeing the entire integration lifecycle.
  2. Convene Initial Stakeholder Meeting: Schedule a kick-off meeting with all identified key stakeholders to align on project objectives, scope, and initial expectations.
  3. Initiate Detailed Requirements Gathering: Begin the in-depth process of collecting and documenting functional and non-functional requirements from all relevant business and technical teams.
  4. Review External API Documentation: Ensure your technical team thoroughly reviews the documentation of the external API to understand its capabilities, limitations, and integration requirements.
  5. Establish Communication Channels: Set up preferred communication methods and meeting cadences for internal teams and external stakeholders.
  6. Define Initial Scope Document: Formalize and distribute a document outlining the agreed-upon initial scope for the integration project.

By systematically addressing these areas, you will establish a solid foundation for a successful API integration, ensuring that the project

api_integration_builder.md
Download as Markdown
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);}});}